aboutsummaryrefslogtreecommitdiff
path: root/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
diff options
context:
space:
mode:
authorMike Westerhof <mwester@dls.net>2008-11-19 17:10:47 +0000
committerAndy Green <agreen@pads.home.warmcat.com>2008-11-19 17:10:47 +0000
commitf691ba1e0500f02240e5a35009020344f8bef943 (patch)
treeb77a353fd0b25bd7b3384b7cada9413dc06b75f6 /arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
parentddf5f57e577cebd2672e244b19069748271bec2e (diff)
gta0x-add-minimal-GSM-flowcontrol.patch
Add the basic GSM flowcontrol code. Signed-off-by: Mike Westerhof <mwester@dls.net>
Diffstat (limited to 'arch/arm/plat-s3c24xx/neo1973_pm_gsm.c')
-rw-r--r--arch/arm/plat-s3c24xx/neo1973_pm_gsm.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c b/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
index 69729c40174..ab314b405c7 100644
--- a/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
+++ b/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
@@ -31,6 +31,9 @@
#endif
+int gta_gsm_interrupts;
+EXPORT_SYMBOL(gta_gsm_interrupts);
+
struct gta01pm_priv {
int gpio_ngsm_en;
int gpio_ndl_gsm;
@@ -75,6 +78,9 @@ static ssize_t gsm_read(struct device *dev, struct device_attribute *attr,
if (!s3c2410_gpio_getpin(GTA02_GPIO_nDL_GSM))
goto out_1;
}
+ } else if (!strcmp(attr->attr.name, "flowcontrolled")) {
+ if (s3c2410_gpio_getcfg(S3C2410_GPH1) == S3C2410_GPIO_OUTPUT)
+ goto out_1;
}
return strlcpy(buf, "0\n", 3);
@@ -171,6 +177,13 @@ static ssize_t gsm_write(struct device *dev, struct device_attribute *attr,
gta01_gsm.gpio_ndl_gsm = !on;
s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, !on);
}
+ } else if (!strcmp(attr->attr.name, "flowcontrolled")) {
+ if (on) {
+ gta_gsm_interrupts = 0;
+ s3c2410_gpio_setpin(S3C2410_GPH1, 1);
+ s3c2410_gpio_cfgpin(S3C2410_GPH1, S3C2410_GPH1_OUTP);
+ } else
+ s3c2410_gpio_cfgpin(S3C2410_GPH1, S3C2410_GPH1_nRTS0);
}
return count;
@@ -179,6 +192,7 @@ static ssize_t gsm_write(struct device *dev, struct device_attribute *attr,
static DEVICE_ATTR(power_on, 0644, gsm_read, gsm_write);
static DEVICE_ATTR(reset, 0644, gsm_read, gsm_write);
static DEVICE_ATTR(download, 0644, gsm_read, gsm_write);
+static DEVICE_ATTR(flowcontrolled, 0644, gsm_read, gsm_write);
#ifdef CONFIG_PM
@@ -188,12 +202,31 @@ 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 much here. */
+ /* If flowcontrol asserted, abort if GSM already interrupted */
+ if (s3c2410_gpio_getcfg(S3C2410_GPH1) == S3C2410_GPIO_OUTPUT) {
+ if (gta_gsm_interrupts)
+ goto busy;
+ }
/* disable DL GSM to prevent jack_insert becoming 'floating' */
if (machine_is_neo1973_gta02())
s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, 1);
return 0;
+
+busy:
+ return -EBUSY;
+}
+
+static int
+gta01_gsm_suspend_late(struct platform_device *pdev, pm_message_t state)
+{
+ /* Last chance: abort if GSM already interrupted */
+ if (s3c2410_gpio_getcfg(S3C2410_GPH1) == S3C2410_GPIO_OUTPUT) {
+ if (gta_gsm_interrupts)
+ return -EBUSY;
+ }
+ return 0;
}
static int gta01_gsm_resume(struct platform_device *pdev)
@@ -213,6 +246,7 @@ static int gta01_gsm_resume(struct platform_device *pdev)
}
#else
#define gta01_gsm_suspend NULL
+#define gta01_gsm_suspend_late NULL
#define gta01_gsm_resume NULL
#endif
@@ -220,6 +254,7 @@ static struct attribute *gta01_gsm_sysfs_entries[] = {
&dev_attr_power_on.attr,
&dev_attr_reset.attr,
&dev_attr_download.attr,
+ &dev_attr_flowcontrolled.attr,
NULL
};
@@ -297,6 +332,7 @@ static struct platform_driver gta01_gsm_driver = {
.probe = gta01_gsm_probe,
.remove = gta01_gsm_remove,
.suspend = gta01_gsm_suspend,
+ .suspend_late = gta01_gsm_suspend_late,
.resume = gta01_gsm_resume,
.driver = {
.name = "neo1973-pm-gsm",