1 From 7e5f528cb1448ac31a4e3a45c7c953ea95869d4d Mon Sep 17 00:00:00 2001
2 From: Mike Westerhof <mwester@dls.net>
3 Date: Fri, 8 Aug 2008 13:08:03 +0100
4 Subject: [PATCH] gta0x-add-minimal-GSM-flowcontrol.patch
6 Add the basic GSM flowcontrol code.
8 Signed-off-by: Mike Westerhof <mwester@dls.net>
10 arch/arm/mach-s3c2410/mach-gta01.c | 3 ++
11 arch/arm/mach-s3c2440/mach-gta02.c | 3 ++
12 arch/arm/plat-s3c24xx/neo1973_pm_gsm.c | 36 ++++++++++++++++++++++++++++++++
13 3 files changed, 42 insertions(+), 0 deletions(-)
15 diff --git a/arch/arm/mach-s3c2410/mach-gta01.c b/arch/arm/mach-s3c2410/mach-gta01.c
16 index e518de7..f3f87cf 100644
17 --- a/arch/arm/mach-s3c2410/mach-gta01.c
18 +++ b/arch/arm/mach-s3c2410/mach-gta01.c
19 @@ -657,9 +657,12 @@ static void __init gta01_map_io(void)
20 s3c24xx_init_uarts(gta01_uartcfgs, ARRAY_SIZE(gta01_uartcfgs));
23 +extern int gta_gsm_interrupts;
25 static irqreturn_t gta01_modem_irq(int irq, void *param)
27 printk(KERN_DEBUG "GSM wakeup interrupt (IRQ %d)\n", irq);
28 + gta_gsm_interrupts++;
32 diff --git a/arch/arm/mach-s3c2440/mach-gta02.c b/arch/arm/mach-s3c2440/mach-gta02.c
33 index 8e43c4a..1d7d262 100644
34 --- a/arch/arm/mach-s3c2440/mach-gta02.c
35 +++ b/arch/arm/mach-s3c2440/mach-gta02.c
36 @@ -1531,9 +1531,12 @@ static void __init gta02_map_io(void)
37 s3c24xx_init_uarts(gta02_uartcfgs, ARRAY_SIZE(gta02_uartcfgs));
40 +extern int gta_gsm_interrupts;
42 static irqreturn_t gta02_modem_irq(int irq, void *param)
44 printk(KERN_DEBUG "modem wakeup interrupt\n");
45 + gta_gsm_interrupts++;
49 diff --git a/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c b/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
50 index dd63506..0543905 100644
51 --- a/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
52 +++ b/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
54 extern void s3c24xx_serial_register_resume_dependency(struct resume_dependency *
55 resume_dependency, int uart_index);
57 +int gta_gsm_interrupts;
58 +EXPORT_SYMBOL(gta_gsm_interrupts);
63 @@ -80,6 +83,9 @@ static ssize_t gsm_read(struct device *dev, struct device_attribute *attr,
64 if (!s3c2410_gpio_getpin(GTA02_GPIO_nDL_GSM))
67 + } else if (!strcmp(attr->attr.name, "flowcontrolled")) {
68 + if (s3c2410_gpio_getcfg(S3C2410_GPH1) == S3C2410_GPIO_OUTPUT)
72 return strlcpy(buf, "0\n", 3);
73 @@ -176,6 +182,13 @@ static ssize_t gsm_write(struct device *dev, struct device_attribute *attr,
74 gta01_gsm.gpio_ndl_gsm = !on;
75 s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, !on);
77 + } else if (!strcmp(attr->attr.name, "flowcontrolled")) {
79 + gta_gsm_interrupts = 0;
80 + s3c2410_gpio_setpin(S3C2410_GPH1, 1);
81 + s3c2410_gpio_cfgpin(S3C2410_GPH1, S3C2410_GPH1_OUTP);
83 + s3c2410_gpio_cfgpin(S3C2410_GPH1, S3C2410_GPH1_nRTS0);
87 @@ -184,6 +197,7 @@ static ssize_t gsm_write(struct device *dev, struct device_attribute *attr,
88 static DEVICE_ATTR(power_on, 0644, gsm_read, gsm_write);
89 static DEVICE_ATTR(reset, 0644, gsm_read, gsm_write);
90 static DEVICE_ATTR(download, 0644, gsm_read, gsm_write);
91 +static DEVICE_ATTR(flowcontrolled, 0644, gsm_read, gsm_write);
94 static int gta01_gsm_resume(struct platform_device *pdev);
95 @@ -192,6 +206,11 @@ static int gta01_gsm_suspend(struct platform_device *pdev, pm_message_t state)
96 /* GPIO state is saved/restored by S3C2410 core GPIO driver, so we
97 * don't need to do much here. */
99 + /* If flowcontrol asserted, abort if GSM already interrupted */
100 + if (s3c2410_gpio_getcfg(S3C2410_GPH1) == S3C2410_GPIO_OUTPUT) {
101 + if (gta_gsm_interrupts)
105 /* disable DL GSM to prevent jack_insert becoming 'floating' */
106 if (machine_is_neo1973_gta02())
107 @@ -204,6 +223,20 @@ static int gta01_gsm_suspend(struct platform_device *pdev, pm_message_t state)
108 s3c24xx_serial_register_resume_dependency(&resume_dep_gsm_uart, 0);
117 +gta01_gsm_suspend_late(struct platform_device *pdev, pm_message_t state)
119 + /* Last chance: abort if GSM already interrupted */
120 + if (s3c2410_gpio_getcfg(S3C2410_GPH1) == S3C2410_GPIO_OUTPUT) {
121 + if (gta_gsm_interrupts)
127 static int gta01_gsm_resume(struct platform_device *pdev)
128 @@ -228,6 +261,7 @@ static int gta01_gsm_resume(struct platform_device *pdev)
131 #define gta01_gsm_suspend NULL
132 +#define gta01_gsm_suspend_late NULL
133 #define gta01_gsm_resume NULL
136 @@ -235,6 +269,7 @@ static struct attribute *gta01_gsm_sysfs_entries[] = {
137 &dev_attr_power_on.attr,
138 &dev_attr_reset.attr,
139 &dev_attr_download.attr,
140 + &dev_attr_flowcontrolled.attr,
144 @@ -314,6 +349,7 @@ static struct platform_driver gta01_gsm_driver = {
145 .probe = gta01_gsm_probe,
146 .remove = gta01_gsm_remove,
147 .suspend = gta01_gsm_suspend,
148 + .suspend_late = gta01_gsm_suspend_late,
149 .resume = gta01_gsm_resume,
151 .name = "neo1973-pm-gsm",