summaryrefslogtreecommitdiff
path: root/target/linux/s3c24xx/patches-2.6.24/1118-fix-gsm-download-irq-balance-issue.patch.patch
blob: 8b3f3766e1b83c584342c5c41159743c4ef27952 (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
From 129f349dc3ee75dfb0580436d82fd0d6633ba2c4 Mon Sep 17 00:00:00 2001
From: warmcat <andy@warmcat.com>
Date: Sun, 13 Apr 2008 07:25:55 +0100
Subject: [PATCH] fix-gsm-download-irq-balance-issue.patch

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.5