aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/s3c24xx/patches-2.6.24/1114-Enable-GPS-only-if-it-was-powered-on-before-suspendi.patch
blob: 4ba9ea3120beebdc33e43b6013935679ad3a0ced (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
From d685e208663ffc9bd454af6698cb2945e60a3ba8 Mon Sep 17 00:00:00 2001
From: Holger Freyther <zecke@openmoko.org>
Date: Sun, 13 Apr 2008 07:25:55 +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@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 e8cfb96..b12f7bc 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.6.5