aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/s3c24xx/patches/0103-Fix-the-firing-of-Jack-Interrupts-after-resume-whe.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/s3c24xx/patches/0103-Fix-the-firing-of-Jack-Interrupts-after-resume-whe.patch')
-rwxr-xr-xtarget/linux/s3c24xx/patches/0103-Fix-the-firing-of-Jack-Interrupts-after-resume-whe.patch121
1 files changed, 121 insertions, 0 deletions
diff --git a/target/linux/s3c24xx/patches/0103-Fix-the-firing-of-Jack-Interrupts-after-resume-whe.patch b/target/linux/s3c24xx/patches/0103-Fix-the-firing-of-Jack-Interrupts-after-resume-whe.patch
new file mode 100755
index 0000000000..8c474b81ac
--- /dev/null
+++ b/target/linux/s3c24xx/patches/0103-Fix-the-firing-of-Jack-Interrupts-after-resume-whe.patch
@@ -0,0 +1,121 @@
+From 081f2aa16800b186e0cfde52f41afa805a3d53c2 Mon Sep 17 00:00:00 2001
+From: Holger Freyther <zecke@openmoko.org>
+Date: Fri, 25 Jul 2008 23:06:04 +0100
+Subject: [PATCH] Fix the firing of "Jack"-Interrupts after resume when the modem is powered on.
+
+GTA02_GPIO_nDL_GSM defaults to high/1. On resume do not enable the DL_GSM if
+it was not enabled before. This is stopping the storm of interrupts.
+
+Fix the logic in the download file handling. Downloads are disabled (0) when
+the GTA02_GPIO_nDL_GSM is high (1). To enable downloading set
+GTA02_GPIO_nDL_GSM to low (0, !on). Disable the jack interrupt while download
+the is active. When disabling download we will get a couple of jack interrupts
+but this is hardly avoidable.
+
+Avoid reading the GPIO value if we do not even have a console set.
+
+Signed-Off-by: Holger Freyther <zecke@openmoko.org>
+---
+ arch/arm/plat-s3c24xx/neo1973_pm_gsm.c | 35 +++++++++++++++++++++++--------
+ 1 files changed, 26 insertions(+), 9 deletions(-)
+
+diff --git a/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c b/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
+index 1123d7d..b4ea8ba 100644
+--- a/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
++++ b/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
+@@ -17,8 +17,9 @@
+ #include <linux/platform_device.h>
+ #include <linux/console.h>
+ #include <linux/errno.h>
++#include <linux/interrupt.h>
+
+-#include <asm/hardware.h>
++#include <asm/gpio.h>
+ #include <asm/mach-types.h>
+ #include <asm/arch/gta01.h>
+
+@@ -30,6 +31,7 @@
+
+ struct gta01pm_priv {
+ int gpio_ngsm_en;
++ int gpio_ndl_gsm;
+ struct console *con;
+ };
+
+@@ -68,7 +70,7 @@ static ssize_t gsm_read(struct device *dev, struct device_attribute *attr,
+ #endif
+ #ifdef CONFIG_MACH_NEO1973_GTA02
+ if (machine_is_neo1973_gta02())
+- if (s3c2410_gpio_getpin(GTA02_GPIO_nDL_GSM))
++ if (!s3c2410_gpio_getpin(GTA02_GPIO_nDL_GSM))
+ goto out_1;
+ #endif
+ }
+@@ -143,8 +145,18 @@ static ssize_t gsm_write(struct device *dev, struct device_attribute *attr,
+ s3c2410_gpio_setpin(GTA01_GPIO_MODEM_DNLOAD, on);
+ #endif
+ #ifdef CONFIG_MACH_NEO1973_GTA02
+- if (machine_is_neo1973_gta02())
+- s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, on);
++ 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));
++
++ gta01_gsm.gpio_ndl_gsm = !on;
++ s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, !on);
++ }
+ #endif
+ }
+
+@@ -159,26 +171,29 @@ static DEVICE_ATTR(download, 0644, gsm_read, gsm_write);
+ static int gta01_gsm_suspend(struct platform_device *pdev, pm_message_t state)
+ {
+ /* GPIO state is saved/restored by S3C2410 core GPIO driver, so we
+- * don't need to do anything here */
++ * don't need to do much here. */
++
+
+- /* disable DL GSM to prevent jack_insert becoming floating */
++ /* disable DL GSM to prevent jack_insert becoming 'floating' */
+ if (machine_is_neo1973_gta02())
+ s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, 1);
++
+ return 0;
+ }
+
+ static int gta01_gsm_resume(struct platform_device *pdev)
+ {
+ /* GPIO state is saved/restored by S3C2410 core GPIO driver, so we
+- * don't need to do anything here */
++ * don't need to do much here. */
+
+ /* Make sure that the kernel console on the serial port is still
+ * disabled. FIXME: resume ordering race with serial driver! */
+- if (s3c2410_gpio_getpin(GTA01_GPIO_MODEM_ON) && gta01_gsm.con)
++ if (gta01_gsm.con && s3c2410_gpio_getpin(GTA01_GPIO_MODEM_ON))
+ console_stop(gta01_gsm.con);
+
+ if (machine_is_neo1973_gta02())
+- s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, 0);
++ s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, gta01_gsm.gpio_ndl_gsm);
++
+ return 0;
+ }
+ #else
+@@ -248,6 +263,8 @@ static int __init gta01_gsm_probe(struct platform_device *pdev)
+ } else
+ gta01_gsm.con = NULL;
+
++ gta01_gsm.gpio_ndl_gsm = 1;
++
+ return sysfs_create_group(&pdev->dev.kobj, &gta01_gsm_attr_group);
+ }
+
+--
+1.5.6.3
+