aboutsummaryrefslogtreecommitdiff
path: root/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
diff options
context:
space:
mode:
authorHolger Freyther <zecke@openmoko.org>2008-11-19 17:09:36 +0000
committerAndy Green <agreen@pads.home.warmcat.com>2008-11-19 17:09:36 +0000
commit7fd982136032dea42d8d570a9d434a67e1283647 (patch)
tree5425e1913d8984e3cb8013065da47d8cca2c8bbf /arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
parent53f202cb6797676a33d94f8c72423cc39911eb14 (diff)
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>
Diffstat (limited to 'arch/arm/plat-s3c24xx/neo1973_pm_gsm.c')
-rw-r--r--arch/arm/plat-s3c24xx/neo1973_pm_gsm.c35
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 1123d7dda8f..b4ea8ba73ca 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);
}