diff options
author | Holger Freyther <zecke@openmoko.org> | 2008-11-19 17:09:36 +0000 |
---|---|---|
committer | Andy Green <agreen@pads.home.warmcat.com> | 2008-11-19 17:09:36 +0000 |
commit | 9d611bd6594ee4966435c54c26b538156b9a0dd7 (patch) | |
tree | 5f6d35ded89f1282b32bdfc19fb59bfd4e175114 /arch/arm/plat-s3c24xx | |
parent | 7fd982136032dea42d8d570a9d434a67e1283647 (diff) |
Enable GPS only if it was powered on before suspending the device
Similar to the neo1974_pm_gsm.c keep a static struct around. On suspend
we will save the current power state, on resume we will use this
information to enable power of the GPS only when it was powered on before.
This is passing basic tests with screen /dev/ttySAC1 on suspend and resume.
Only do this for the GTA02 as I don't have a gllin setup for the GTA01
I wonder why the suspend and resume code is not using gps_pwron_set and why
for the GTA02 we need to keep the state of the GPIOs, this should be done
by the s3c code.
Signed-Off-by: Holger Frether <zecke@openmoko.org>
Diffstat (limited to 'arch/arm/plat-s3c24xx')
-rw-r--r-- | arch/arm/plat-s3c24xx/neo1973_pm_gps.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/arch/arm/plat-s3c24xx/neo1973_pm_gps.c b/arch/arm/plat-s3c24xx/neo1973_pm_gps.c index e8cfb96e4c9..b12f7bca9dd 100644 --- a/arch/arm/plat-s3c24xx/neo1973_pm_gps.c +++ b/arch/arm/plat-s3c24xx/neo1973_pm_gps.c @@ -30,6 +30,12 @@ #include <linux/pcf50633.h> #endif +struct neo1973_pm_gps_data { + int power_was_on; +}; + +static struct neo1973_pm_gps_data neo1973_gps; + /* This is the 2.8V supply for the RTC crystal, the mail clock crystal and * the input to VDD_RF */ static void gps_power_2v8_set(int on) @@ -266,8 +272,8 @@ static void gps_pwron_set(int on) if (on) pcf50633_voltage_set(pcf50633_global, PCF50633_REGULATOR_LDO5, 3000); - pcf50633_onoff_set(pcf50633_global, - PCF50633_REGULATOR_LDO5, on); + pcf50633_onoff_set(pcf50633_global, + PCF50633_REGULATOR_LDO5, on); } #endif /* CONFIG_MACH_NEO1973_GTA02 */ } @@ -476,6 +482,9 @@ static DEVICE_ATTR(power_sequence, 0644, power_sequence_read, static int gta01_pm_gps_suspend(struct platform_device *pdev, pm_message_t state) { + + neo1973_gps.power_was_on = gps_pwron_get(); + #ifdef CONFIG_MACH_NEO1973_GTA01 if (machine_is_neo1973_gta01()) { /* FIXME */ @@ -491,9 +500,7 @@ static int gta01_pm_gps_suspend(struct platform_device *pdev, /* don't let RX from unpowered GPS float */ s3c2410_gpio_pullup(S3C2410_GPH5, 1); - /* FIXME */ - pcf50633_onoff_set(pcf50633_global, - PCF50633_REGULATOR_LDO5, 0); + gps_pwron_set(0); } #endif /* CONFIG_MACH_NEO1973_GTA02 */ @@ -519,9 +526,8 @@ static int gta01_pm_gps_resume(struct platform_device *pdev) /* remove pulldown now it won't be floating any more */ s3c2410_gpio_pullup(S3C2410_GPH5, 0); - /* FIXME */ - pcf50633_onoff_set(pcf50633_global, - PCF50633_REGULATOR_LDO5, 1); + if (neo1973_gps.power_was_on) + gps_pwron_set(1); #endif /* CONFIG_MACH_NEO1973_GTA02 */ } return 0; |