From 129f349dc3ee75dfb0580436d82fd0d6633ba2c4 Mon Sep 17 00:00:00 2001 From: warmcat Date: Sun, 13 Apr 2008 07:25:55 +0100 Subject: [PATCH] fix-gsm-download-irq-balance-issue.patch 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.5