summaryrefslogtreecommitdiff
path: root/target/linux/s3c24xx/patches-2.6.26/0107-fix-gsm-download-irq-balance-issue.patch.patch
blob: eb7492959ffa32cb8bfd72b90270c3126d7795ba (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
From 95f161a3dc8b50ee354f5d9cd3785d3522bc1bb5 Mon Sep 17 00:00:00 2001
From: Andy Green <andy@openmoko.com>
Date: Fri, 25 Jul 2008 23:06:04 +0100
Subject: [PATCH] fix-gsm-download-irq-balance-issue.patch

Only enable or disable the interrupt if we see we are in the opposing state.
Also force that damn GSM download signal deasserted on probe at the time we
set the logical state for it to deasserted.

Signed-off-by: Andy Green <andy@openmoko.com>
---
 arch/arm/plat-s3c24xx/neo1973_pm_gsm.c |   28 +++++++++++++++++++++-------
 1 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c b/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
index b4ea8ba..c3292b8 100644
--- a/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
+++ b/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
@@ -146,13 +146,24 @@ static ssize_t gsm_write(struct device *dev, struct device_attribute *attr,
 #endif
 #ifdef CONFIG_MACH_NEO1973_GTA02
 		if (machine_is_neo1973_gta02()) {
-			/* FIXME: Layering violation, we know how this relates to
-			 * the Jack-IRQ. And we assume the keyboard driver to be
-			 * around. */
-			if (on)
-			    disable_irq(gpio_to_irq(GTA02_GPIO_JACK_INSERT));
-			else
-			    enable_irq(gpio_to_irq(GTA02_GPIO_JACK_INSERT));
+			/*
+			 * the keyboard / buttons driver requests and enables
+			 * the JACK_INSERT IRQ.  We have to take care about
+			 * not enabling and disabling the IRQ when it was
+			 * already in that state or we get "unblanaced IRQ"
+			 * kernel warnings and stack dumps.  So we use the
+			 * copy of the ndl_gsm state to figure out if we should
+			 * enable or disable the jack interrupt
+			 */
+			if (on) {
+				if (gta01_gsm.gpio_ndl_gsm)
+					disable_irq(gpio_to_irq(
+						       GTA02_GPIO_JACK_INSERT));
+			} else {
+				if (!gta01_gsm.gpio_ndl_gsm)
+					enable_irq(gpio_to_irq(
+						       GTA02_GPIO_JACK_INSERT));
+			}
 
 			gta01_gsm.gpio_ndl_gsm = !on;
 			s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, !on);
@@ -263,7 +274,10 @@ static int __init gta01_gsm_probe(struct platform_device *pdev)
 	} else
 		gta01_gsm.con = NULL;
 
+	/* note that download initially disabled, and enforce that */
 	gta01_gsm.gpio_ndl_gsm = 1;
+	if (machine_is_neo1973_gta02())
+		s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, 1);
 
 	return sysfs_create_group(&pdev->dev.kobj, &gta01_gsm_attr_group);
 }
-- 
1.5.6.3