-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Somebody in the thread at some point said:
| + if (on)
| + disable_irq(gpio_to_irq(GTA02_GPIO_JACK_INSERT));
| + else
| + enable_irq(gpio_to_irq(GTA02_GPIO_JACK_INSERT));
Holger, great patches you have sent.
This bit above made troubles though -- it can cause "Unbalanced IRQ"
errors depending on what userspace sends down the /sys node, since it
will just go ahead and enable or disable the IRQ without considering the
existing state.
I added a patch on top of this which re-uses the gta01_gsm.gpio_ndl_gsm
state to figure out if it needs to do anything and it stops the warning
and kernel stack trace from the "unbalanced IRQ".
- -Andy
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org
iEYEARECAAYFAkf79LAACgkQOjLpvpq7dMpgpwCeO3sc+Js/xutPEZe2lGazi1OO
ZScAoJVXdNEykW3bmCEo17IqCpm4erWq
=OXp1
-----END PGP SIGNATURE-----
fix-gsm-download-irq-balance-issue.patch
From: Andy Green <[EMAIL PROTECTED]>
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 <[EMAIL PROTECTED]>
---
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);
}