From 084e5cd3284d499e3c4eb86f26042e7d72df2266 Mon Sep 17 00:00:00 2001
From: Gennady Kupava <gb@bsdmn.com>
Date: Fri, 7 Jan 2011 16:37:26 +0100
Subject: [PATCH 60/69] Force GPS power up on resume if it were powered up on suspend

This is needed for proper GPS funciton with u-boot.

u-boot needs to be patched with this patch:

http://www.bsdmn.com/openmoko/gpsfix/uboot_do_not_touch_serials.patch

Idea of above patch is to keep u-boot from controlling serial's GPIO
configuration. It turned out that u-boot also touch GSM port
configuration on resume. This turns this off.

Whole thread can be found here:

http://lists.openmoko.org/pipermail/openmoko-kernel/2010-November/011274.html

Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
---
 arch/arm/mach-s3c2440/gta02-pm-gps.c |   12 ++++++------
 1 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/arch/arm/mach-s3c2440/gta02-pm-gps.c b/arch/arm/mach-s3c2440/gta02-pm-gps.c
index 4ca3ac6..7501978 100644
--- a/arch/arm/mach-s3c2440/gta02-pm-gps.c
+++ b/arch/arm/mach-s3c2440/gta02-pm-gps.c
@@ -42,7 +42,7 @@ int gta02_pm_gps_is_on(void)
 EXPORT_SYMBOL_GPL(gta02_pm_gps_is_on);
 
 /* This is the POWERON pin */
-static void gps_pwron_set(int on)
+static void gps_pwron_set(int on, int ignore_state)
 {
 	if (on) {
 		/* return UART pins to being UART pins */
@@ -50,7 +50,7 @@ static void gps_pwron_set(int on)
 		/* remove pulldown now it won't be floating any more */
 		s3c_gpio_setpull(S3C2410_GPH(5), S3C_GPIO_PULL_NONE);
 
-		if (!gta02_gps.power_was_on)
+		if (!gta02_gps.power_was_on || ignore_state)
 			regulator_enable(gta02_gps.regulator);
 	} else {
 		/*
@@ -61,7 +61,7 @@ static void gps_pwron_set(int on)
 		gpio_set_value(S3C2410_GPH(4), 0);
 		/* don't let RX from unpowered GPS float */
 		s3c_gpio_setpull(S3C2410_GPH(5), S3C_GPIO_PULL_DOWN);
-		if (gta02_gps.power_was_on)
+		if (gta02_gps.power_was_on || ignore_state)
 			regulator_disable(gta02_gps.regulator);
 	}
 }
@@ -113,7 +113,7 @@ static ssize_t power_gps_write(struct device *dev,
 		return ret;
 
 	if (!strcmp(attr->attr.name, "power_on")) {
-		gps_pwron_set(on);
+		gps_pwron_set(on, 0);
 		gta02_gps.power_was_on = !!on;
 #ifdef CONFIG_PM
 	} else if (!strcmp(attr->attr.name, "keep_on_in_suspend")) {
@@ -128,7 +128,7 @@ static int gta02_pm_gps_suspend(struct device *dev)
 {
 	if (!gta02_gps.keep_on_in_suspend ||
 		!gta02_gps.power_was_on)
-		gps_pwron_set(0);
+		gps_pwron_set(0, 0);
 	else
 		dev_warn(dev, "GTA02: keeping gps ON "
 			 "during suspend\n");
@@ -138,7 +138,7 @@ static int gta02_pm_gps_suspend(struct device *dev)
 static int gta02_pm_gps_resume(struct device *dev)
 {
 	if (!gta02_gps.keep_on_in_suspend && gta02_gps.power_was_on)
-		gps_pwron_set(1);
+		gps_pwron_set(1, 1);
 
 	return 0;
 }
-- 
1.7.2.5

