[PATCH] Power on the GPS module only if it was on before

Holger Freyther zecke at openmoko.org
Tue Apr 8 22:35:27 CEST 2008


From 72f852e1f2d9275fd33c2b21a33a0d9c0bedfe1a Mon Sep 17 00:00:00 2001
From: Holger Freyther <zecke at openmoko.org>
Date: Sat, 29 Mar 2008 22:35:16 +0100
Subject: [PATCH] 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 at openmoko.org>
---
 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 1436890..a0d9f11 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;
-- 
1.5.4.rc3.24.gb53139





More information about the openmoko-kernel mailing list