From 95f161a3dc8b50ee354f5d9cd3785d3522bc1bb5 Mon Sep 17 00:00:00 2001 From: Andy Green 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 --- 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, >a01_gsm_attr_group); } -- 1.5.6.3