aboutsummaryrefslogtreecommitdiff
path: root/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
diff options
context:
space:
mode:
authorAndy Green <andy@openmoko.com>2008-11-19 17:09:37 +0000
committerAndy Green <agreen@pads.home.warmcat.com>2008-11-19 17:09:37 +0000
commit52f68385741c9c4458b10b0fd30d9955f3ee88be (patch)
treeca53cf19d2e62d7ce210db5fa5874590fc63d28a /arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
parentfaa50640d7ff4ddfabd1a4417227418e33ac4c43 (diff)
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>
Diffstat (limited to 'arch/arm/plat-s3c24xx/neo1973_pm_gsm.c')
-rw-r--r--arch/arm/plat-s3c24xx/neo1973_pm_gsm.c28
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 b4ea8ba73ca..c3292b88433 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);
}