aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/s3c24xx/patches/0029-gta02-power_control.patch.patch
diff options
context:
space:
mode:
authorMirko Vogt <mirko@openwrt.org>2008-12-12 00:02:36 +0000
committerMirko Vogt <mirko@openwrt.org>2008-12-12 00:02:36 +0000
commitb9dfb81f2aa45be745a8aed9684076210aed4152 (patch)
treeaceadd7f37096911a29c929988cbcf7c964a1c0b /target/linux/s3c24xx/patches/0029-gta02-power_control.patch.patch
parent4571721ec22de116ad9998657e0a3c12da6405fb (diff)
downloadupstream-b9dfb81f2aa45be745a8aed9684076210aed4152.tar.gz
upstream-b9dfb81f2aa45be745a8aed9684076210aed4152.tar.bz2
upstream-b9dfb81f2aa45be745a8aed9684076210aed4152.zip
add support for target 3c24xx (more known as Openmoko GTA02 "Freerunner") and merge it with the openmoko-target and the work Michael Buesch <mb> did
SVN-Revision: 13609
Diffstat (limited to 'target/linux/s3c24xx/patches/0029-gta02-power_control.patch.patch')
-rwxr-xr-xtarget/linux/s3c24xx/patches/0029-gta02-power_control.patch.patch586
1 files changed, 586 insertions, 0 deletions
diff --git a/target/linux/s3c24xx/patches/0029-gta02-power_control.patch.patch b/target/linux/s3c24xx/patches/0029-gta02-power_control.patch.patch
new file mode 100755
index 0000000000..27049690db
--- /dev/null
+++ b/target/linux/s3c24xx/patches/0029-gta02-power_control.patch.patch
@@ -0,0 +1,586 @@
+From 70a0c17968f5151ce4f468785860e04bbc7a9d3c Mon Sep 17 00:00:00 2001
+From: mokopatches <mokopatches@openmoko.org>
+Date: Wed, 16 Jul 2008 14:46:56 +0100
+Subject: [PATCH] gta02-power_control.patch
+
+---
+ arch/arm/plat-s3c24xx/neo1973_pm_bt.c | 84 +++++++++---
+ arch/arm/plat-s3c24xx/neo1973_pm_gps.c | 217 ++++++++++++++++++++++++--------
+ arch/arm/plat-s3c24xx/neo1973_pm_gsm.c | 97 ++++++++++++--
+ 3 files changed, 309 insertions(+), 89 deletions(-)
+
+diff --git a/arch/arm/plat-s3c24xx/neo1973_pm_bt.c b/arch/arm/plat-s3c24xx/neo1973_pm_bt.c
+index b1af441..d685ef7 100644
+--- a/arch/arm/plat-s3c24xx/neo1973_pm_bt.c
++++ b/arch/arm/plat-s3c24xx/neo1973_pm_bt.c
+@@ -19,7 +19,9 @@
+ #include <linux/pcf50606.h>
+
+ #include <asm/hardware.h>
++#include <asm/mach-types.h>
+ #include <asm/arch/gta01.h>
++#include <asm/arch/gta02.h>
+
+ #define DRVMSG "FIC Neo1973 Bluetooth Power Management"
+
+@@ -27,14 +29,30 @@ static ssize_t bt_read(struct device *dev, struct device_attribute *attr,
+ char *buf)
+ {
+ if (!strcmp(attr->attr.name, "power_on")) {
+- if (pcf50606_onoff_get(pcf50606_global,
+- PCF50606_REGULATOR_D1REG) &&
+- pcf50606_voltage_get(pcf50606_global,
+- PCF50606_REGULATOR_D1REG) == 3100)
+- goto out_1;
++ switch (machine_arch_type) {
++ case MACH_TYPE_NEO1973_GTA01:
++ if (pcf50606_onoff_get(pcf50606_global,
++ PCF50606_REGULATOR_D1REG) &&
++ pcf50606_voltage_get(pcf50606_global,
++ PCF50606_REGULATOR_D1REG) == 3100)
++ goto out_1;
++ break;
++ case MACH_TYPE_NEO1973_GTA02:
++ if (s3c2410_gpio_getpin(GTA02_GPIO_BT_EN))
++ goto out_1;
++ break;
++ }
+ } else if (!strcmp(attr->attr.name, "reset")) {
+- if (s3c2410_gpio_getpin(GTA01_GPIO_BT_EN) == 0)
+- goto out_1;
++ switch (machine_arch_type) {
++ case MACH_TYPE_NEO1973_GTA01:
++ if (s3c2410_gpio_getpin(GTA01_GPIO_BT_EN) == 0)
++ goto out_1;
++ break;
++ case MACH_TYPE_NEO1973_GTA02:
++ if (s3c2410_gpio_getpin(GTA02_GPIO_BT_EN) == 0)
++ goto out_1;
++ break;
++ }
+ }
+
+ return strlcpy(buf, "0\n", 3);
+@@ -48,20 +66,37 @@ static ssize_t bt_write(struct device *dev, struct device_attribute *attr,
+ unsigned long on = simple_strtoul(buf, NULL, 10);
+
+ if (!strcmp(attr->attr.name, "power_on")) {
+- /* if we are powering up, assert reset, then power, then
+- * release reset */
+- if (on) {
+- s3c2410_gpio_setpin(GTA01_GPIO_BT_EN, 0);
+- pcf50606_voltage_set(pcf50606_global,
+- PCF50606_REGULATOR_D1REG,
+- 3100);
++ switch (machine_arch_type) {
++ case MACH_TYPE_NEO1973_GTA01:
++ /* if we are powering up, assert reset, then power,
++ * then release reset */
++ if (on) {
++ s3c2410_gpio_setpin(GTA01_GPIO_BT_EN, 0);
++ pcf50606_voltage_set(pcf50606_global,
++ PCF50606_REGULATOR_D1REG,
++ 3100);
++ }
++ pcf50606_onoff_set(pcf50606_global,
++ PCF50606_REGULATOR_D1REG, on);
++ s3c2410_gpio_setpin(GTA01_GPIO_BT_EN, on);
++ break;
++ case MACH_TYPE_NEO1973_GTA02:
++ if (on)
++ s3c2410_gpio_setpin(GTA02_GPIO_BT_EN, 0);
++ else
++ s3c2410_gpio_setpin(GTA02_GPIO_BT_EN, 1);
++ break;
+ }
+- pcf50606_onoff_set(pcf50606_global,
+- PCF50606_REGULATOR_D1REG, on);
+- s3c2410_gpio_setpin(GTA01_GPIO_BT_EN, on);
+ } else if (!strcmp(attr->attr.name, "reset")) {
+ /* reset is low-active, so we need to invert */
+- s3c2410_gpio_setpin(GTA01_GPIO_BT_EN, on ? 0 : 1);
++ switch (machine_arch_type) {
++ case MACH_TYPE_NEO1973_GTA01:
++ s3c2410_gpio_setpin(GTA01_GPIO_BT_EN, on ? 0 : 1);
++ break;
++ case MACH_TYPE_NEO1973_GTA02:
++ s3c2410_gpio_setpin(GTA02_GPIO_BT_EN, on ? 0 : 1);
++ break;
++ }
+ }
+
+ return count;
+@@ -107,9 +142,16 @@ static int __init gta01_bt_probe(struct platform_device *pdev)
+ {
+ dev_info(&pdev->dev, DRVMSG ": starting\n");
+
+- /* we make sure that the voltage is off */
+- pcf50606_onoff_set(pcf50606_global,
+- PCF50606_REGULATOR_D1REG, 0);
++ switch (machine_arch_type) {
++ case MACH_TYPE_NEO1973_GTA01:
++ /* we make sure that the voltage is off */
++ pcf50606_onoff_set(pcf50606_global,
++ PCF50606_REGULATOR_D1REG, 0);
++ break;
++ case MACH_TYPE_NEO1973_GTA02:
++ /* FIXME: implementation */
++ break;
++ }
+ /* we pull reset to low to make sure that the chip doesn't
+ * drain power through the reset line */
+ s3c2410_gpio_setpin(GTA01_GPIO_BT_EN, 0);
+diff --git a/arch/arm/plat-s3c24xx/neo1973_pm_gps.c b/arch/arm/plat-s3c24xx/neo1973_pm_gps.c
+index f8cf719..6bd8054 100644
+--- a/arch/arm/plat-s3c24xx/neo1973_pm_gps.c
++++ b/arch/arm/plat-s3c24xx/neo1973_pm_gps.c
+@@ -17,10 +17,18 @@
+ #include <linux/delay.h>
+ #include <linux/platform_device.h>
+
+-#include <linux/pcf50606.h>
+-
+ #include <asm/hardware.h>
++
++#include <asm/mach-types.h>
++#ifdef CONFIG_MACH_NEO1973_GTA01
+ #include <asm/arch/gta01.h>
++#include <linux/pcf50606.h>
++#endif
++
++#ifdef CONFIG_MACH_NEO1973_GTA02
++#include <asm/arch/gta02.h>
++#include <linux/pcf50633.h>
++#endif
+
+ /* This is the 2.8V supply for the RTC crystal, the mail clock crystal and
+ * the input to VDD_RF */
+@@ -248,15 +256,42 @@ static int gps_power_1v5_get(void)
+ /* This is the POWERON pin */
+ static void gps_pwron_set(int on)
+ {
+- s3c2410_gpio_setpin(GTA01_GPIO_GPS_PWRON, on);
++#ifdef CONFIG_MACH_NEO1973_GTA01
++ if (machine_is_neo1973_gta01())
++ s3c2410_gpio_setpin(GTA01_GPIO_GPS_PWRON, on);
++#endif /* CONFIG_MACH_NEO1973_GTA01 */
++
++#ifdef CONFIG_MACH_NEO1973_GTA02
++ if (machine_is_neo1973_gta02()) {
++ if (on)
++ pcf50633_voltage_set(pcf50633_global,
++ PCF50633_REGULATOR_LDO5, 3000);
++ pcf50633_onoff_set(pcf50633_global,
++ PCF50633_REGULATOR_LDO5, on);
++ }
++#endif /* CONFIG_MACH_NEO1973_GTA02 */
+ }
+
+ static int gps_pwron_get(void)
+ {
+- if (s3c2410_gpio_getpin(GTA01_GPIO_GPS_PWRON))
+- return 1;
+- else
+- return 0;
++#ifdef CONFIG_MACH_NEO1973_GTA01
++ if (machine_is_neo1973_gta01()) {
++ if (s3c2410_gpio_getpin(GTA01_GPIO_GPS_PWRON))
++ return 1;
++ else
++ return 0;
++ }
++#endif /* CONFIG_MACH_NEO1973_GTA01 */
++
++#ifdef CONFIG_MACH_NEO1973_GTA02
++ if (machine_is_neo1973_gta02()) {
++ if (pcf50633_onoff_get(pcf50633_global, PCF50633_REGULATOR_LDO5))
++ return 1;
++ else
++ return 0;
++ }
++#endif /* CONFIG_MACH_NEO1973_GTA02 */
++ return -1;
+ }
+
+ /* This is the nRESET pin */
+@@ -441,17 +476,40 @@ static DEVICE_ATTR(power_sequence, 0644, power_sequence_read,
+ static int gta01_pm_gps_suspend(struct platform_device *pdev,
+ pm_message_t state)
+ {
+- /* FIXME */
+- gps_power_sequence_down();
++#ifdef CONFIG_MACH_NEO1973_GTA01
++ if (machine_is_neo1973_gta01()) {
++ /* FIXME */
++ gps_power_sequence_down();
++ }
++#endif /* CONFIG_MACH_NEO1973_GTA01 */
++
++#ifdef CONFIG_MACH_NEO1973_GTA02
++ if (machine_is_neo1973_gta02()) {
++ /* FIXME */
++ pcf50633_onoff_set(pcf50633_global,
++ PCF50633_REGULATOR_LDO5, 0);
++ }
++#endif /* CONFIG_MACH_NEO1973_GTA02 */
+
+ return 0;
+ }
+
+ static int gta01_pm_gps_resume(struct platform_device *pdev)
+ {
+- /* FIXME */
+- gps_power_sequence_up();
+-
++#ifdef CONFIG_MACH_NEO1973_GTA01
++ if (machine_is_neo1973_gta01()) {
++ /* FIXME */
++ gps_power_sequence_up();
++ }
++#endif /* CONFIG_MACH_NEO1973_GTA01 */
++
++#ifdef CONFIG_MACH_NEO1973_GTA02
++ if (machine_is_neo1973_gta02()) {
++ /* FIXME */
++ pcf50633_onoff_set(pcf50633_global,
++ PCF50633_REGULATOR_LDO5, 1);
++#endif /* CONFIG_MACH_NEO1973_GTA02 */
++ }
+ return 0;
+ }
+ #else
+@@ -476,59 +534,110 @@ static struct attribute_group gta01_gps_attr_group = {
+ .attrs = gta01_gps_sysfs_entries,
+ };
+
++static struct attribute *gta02_gps_sysfs_entries[] = {
++ &dev_attr_pwron.attr,
++ NULL
++};
++
++static struct attribute_group gta02_gps_attr_group = {
++ .name = NULL,
++ .attrs = gta02_gps_sysfs_entries,
++};
++
+ static int __init gta01_pm_gps_probe(struct platform_device *pdev)
+ {
+- s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_PWRON, S3C2410_GPIO_OUTPUT);
++#ifdef CONFIG_MACH_NEO1973_GTA01
++ if (machine_is_neo1973_gta01()) {
++ s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_PWRON, S3C2410_GPIO_OUTPUT);
+
+- switch (system_rev) {
+- case GTA01v3_SYSTEM_REV:
+- break;
+- case GTA01v4_SYSTEM_REV:
+- s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_RESET, S3C2410_GPIO_OUTPUT);
+- break;
+- case GTA01Bv3_SYSTEM_REV:
+- case GTA01Bv4_SYSTEM_REV:
+- s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_EN_3V3, S3C2410_GPIO_OUTPUT);
+- /* fallthrough */
+- case GTA01Bv2_SYSTEM_REV:
+- s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_EN_2V8, S3C2410_GPIO_OUTPUT);
+- s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_EN_3V, S3C2410_GPIO_OUTPUT);
+- s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_RESET, S3C2410_GPIO_OUTPUT);
+- break;
+- default:
+- dev_warn(&pdev->dev, "Unknown GTA01 Revision 0x%x, "
+- "AGPS PM features not available!!!\n",
+- system_rev);
+- return -1;
+- break;
+- }
++ switch (system_rev) {
++ case GTA01v3_SYSTEM_REV:
++ break;
++ case GTA01v4_SYSTEM_REV:
++ s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_RESET, S3C2410_GPIO_OUTPUT);
++ break;
++ case GTA01Bv3_SYSTEM_REV:
++ case GTA01Bv4_SYSTEM_REV:
++ s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_EN_3V3, S3C2410_GPIO_OUTPUT);
++ /* fallthrough */
++ case GTA01Bv2_SYSTEM_REV:
++ s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_EN_2V8, S3C2410_GPIO_OUTPUT);
++ s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_EN_3V, S3C2410_GPIO_OUTPUT);
++ s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_RESET, S3C2410_GPIO_OUTPUT);
++ break;
++ default:
++ dev_warn(&pdev->dev, "Unknown GTA01 Revision 0x%x, "
++ "AGPS PM features not available!!!\n",
++ system_rev);
++ return -1;
++ break;
++ }
+
+- gps_power_sequence_down();
++ gps_power_sequence_down();
+
+- switch (system_rev) {
+- case GTA01v3_SYSTEM_REV:
+- case GTA01v4_SYSTEM_REV:
+- case GTA01Bv2_SYSTEM_REV:
+- gta01_gps_sysfs_entries[ARRAY_SIZE(gta01_gps_sysfs_entries)-3] =
+- &dev_attr_power_tcxo_2v8.attr;
+- break;
+- case GTA01Bv3_SYSTEM_REV:
+- case GTA01Bv4_SYSTEM_REV:
+- gta01_gps_sysfs_entries[ARRAY_SIZE(gta01_gps_sysfs_entries)-3] =
+- &dev_attr_power_core_1v5.attr;
+- gta01_gps_sysfs_entries[ARRAY_SIZE(gta01_gps_sysfs_entries)-2] =
+- &dev_attr_power_vdd_core_1v5.attr;
+- break;
+- }
++ switch (system_rev) {
++ case GTA01v3_SYSTEM_REV:
++ case GTA01v4_SYSTEM_REV:
++ case GTA01Bv2_SYSTEM_REV:
++ gta01_gps_sysfs_entries[ARRAY_SIZE(gta01_gps_sysfs_entries)-3] =
++ &dev_attr_power_tcxo_2v8.attr;
++ break;
++ case GTA01Bv3_SYSTEM_REV:
++ case GTA01Bv4_SYSTEM_REV:
++ gta01_gps_sysfs_entries[ARRAY_SIZE(gta01_gps_sysfs_entries)-3] =
++ &dev_attr_power_core_1v5.attr;
++ gta01_gps_sysfs_entries[ARRAY_SIZE(gta01_gps_sysfs_entries)-2] =
++ &dev_attr_power_vdd_core_1v5.attr;
++ break;
++ }
+
+- return sysfs_create_group(&pdev->dev.kobj, &gta01_gps_attr_group);
++ return sysfs_create_group(&pdev->dev.kobj, &gta01_gps_attr_group);
++ }
++#endif /* CONFIG_MACH_NEO1973_GTA01 */
++
++#ifdef CONFIG_MACH_NEO1973_GTA02
++ if (machine_is_neo1973_gta02()) {
++ switch (system_rev) {
++ case GTA02v2_SYSTEM_REV:
++ case GTA02v3_SYSTEM_REV:
++ case GTA02v4_SYSTEM_REV:
++ case GTA02v5_SYSTEM_REV:
++ case GTA02v6_SYSTEM_REV:
++ pcf50633_voltage_set(pcf50633_global,
++ PCF50633_REGULATOR_LDO5, 3000);
++ pcf50633_onoff_set(pcf50633_global,
++ PCF50633_REGULATOR_LDO5, 0);
++ dev_info(&pdev->dev, "FIC Neo1973 GPS Power Managerment:"
++ "starting\n");
++ break;
++ default:
++ dev_warn(&pdev->dev, "Unknown GTA02 Revision 0x%x, "
++ "AGPS PM features not available!!!\n",
++ system_rev);
++ return -1;
++ break;
++ }
++ return sysfs_create_group(&pdev->dev.kobj, &gta02_gps_attr_group);
++ }
++#endif /* CONFIG_MACH_NEO1973_GTA02 */
++ return -1;
+ }
+
+ static int gta01_pm_gps_remove(struct platform_device *pdev)
+ {
+- gps_power_sequence_down();
+- sysfs_remove_group(&pdev->dev.kobj, &gta01_gps_attr_group);
++#ifdef CONFIG_MACH_NEO1973_GTA01
++ if (machine_is_neo1973_gta01()) {
++ gps_power_sequence_down();
++ sysfs_remove_group(&pdev->dev.kobj, &gta01_gps_attr_group);
++ }
++#endif /* CONFIG_MACH_NEO1973_GTA01 */
+
++#ifdef CONFIG_MACH_NEO1973_GTA02
++ if (machine_is_neo1973_gta02()) {
++ pcf50633_onoff_set(pcf50633_global, PCF50633_REGULATOR_LDO5, 0);
++ sysfs_remove_group(&pdev->dev.kobj, &gta02_gps_attr_group);
++ }
++#endif /* CONFIG_MACH_NEO1973_GTA02 */
+ return 0;
+ }
+
+diff --git a/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c b/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
+index a1615f8..13cb45b 100644
+--- a/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
++++ b/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
+@@ -19,8 +19,15 @@
+ #include <linux/errno.h>
+
+ #include <asm/hardware.h>
++#include <asm/mach-types.h>
+ #include <asm/arch/gta01.h>
+
++#ifdef CONFIG_MACH_NEO1973_GTA02
++#include <asm/arch/gta02.h>
++#include <linux/pcf50633.h>
++#include <asm/arch/regs-gpioj.h>
++#endif
++
+ struct gta01pm_priv {
+ int gpio_ngsm_en;
+ struct console *con;
+@@ -54,8 +61,16 @@ static ssize_t gsm_read(struct device *dev, struct device_attribute *attr,
+ if (s3c2410_gpio_getpin(GTA01_GPIO_MODEM_RST))
+ goto out_1;
+ } else if (!strcmp(attr->attr.name, "download")) {
+- if (s3c2410_gpio_getpin(GTA01_GPIO_MODEM_DNLOAD))
+- goto out_1;
++#ifdef CONFIG_MACH_NEO1973_GTA01
++ if (machine_is_neo1973_gta01())
++ if (s3c2410_gpio_getpin(GTA01_GPIO_MODEM_DNLOAD))
++ goto out_1;
++#endif
++#ifdef CONFIG_MACH_NEO1973_GTA02
++ if (machine_is_neo1973_gta02())
++ if (s3c2410_gpio_getpin(GTA02_GPIO_nDL_GSM))
++ goto out_1;
++#endif
+ }
+
+ return strlcpy(buf, "0\n", 3);
+@@ -70,32 +85,67 @@ static ssize_t gsm_write(struct device *dev, struct device_attribute *attr,
+
+ if (!strcmp(attr->attr.name, "power_on")) {
+ if (on) {
+- dev_info(dev, "powering up GSM, thus disconnecting "
+- "serial console\n");
++ if (gta01_gsm.con) {
++ dev_info(dev, "powering up GSM, thus "
++ "disconnecting serial console\n");
+
+- if (gta01_gsm.con)
+ console_stop(gta01_gsm.con);
++ }
+
+ if (gta01_gsm.gpio_ngsm_en)
+ s3c2410_gpio_setpin(gta01_gsm.gpio_ngsm_en, 0);
+
++ switch (system_rev) {
++#ifdef CONFIG_MACH_NEO1973_GTA02
++ case GTA02v2_SYSTEM_REV:
++ case GTA02v3_SYSTEM_REV:
++ case GTA02v4_SYSTEM_REV:
++ case GTA02v5_SYSTEM_REV:
++ case GTA02v6_SYSTEM_REV:
++ pcf50633_gpio_set(pcf50633_global,
++ PCF50633_GPIO2, 1);
++ break;
++#endif
++ }
++
+ s3c2410_gpio_setpin(GTA01_GPIO_MODEM_ON, 1);
+ } else {
+ s3c2410_gpio_setpin(GTA01_GPIO_MODEM_ON, 0);
+
++ switch (system_rev) {
++#ifdef CONFIG_MACH_NEO1973_GTA02
++ case GTA02v2_SYSTEM_REV:
++ case GTA02v3_SYSTEM_REV:
++ case GTA02v4_SYSTEM_REV:
++ case GTA02v5_SYSTEM_REV:
++ case GTA02v6_SYSTEM_REV:
++ pcf50633_gpio_set(pcf50633_global,
++ PCF50633_GPIO2, 0);
++ break;
++#endif
++ }
++
+ if (gta01_gsm.gpio_ngsm_en)
+ s3c2410_gpio_setpin(gta01_gsm.gpio_ngsm_en, 1);
+
+- if (gta01_gsm.con)
++ if (gta01_gsm.con) {
+ console_start(gta01_gsm.con);
+
+- dev_info(dev, "powered down GSM, thus enabling "
+- "serial console\n");
++ dev_info(dev, "powered down GSM, thus enabling "
++ "serial console\n");
++ }
+ }
+ } else if (!strcmp(attr->attr.name, "reset")) {
+ s3c2410_gpio_setpin(GTA01_GPIO_MODEM_RST, on);
+ } else if (!strcmp(attr->attr.name, "download")) {
+- s3c2410_gpio_setpin(GTA01_GPIO_MODEM_DNLOAD, on);
++#ifdef CONFIG_MACH_NEO1973_GTA01
++ if (machine_is_neo1973_gta01())
++ 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);
++#endif
+ }
+
+ return count;
+@@ -111,6 +161,9 @@ 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 */
+
++ /* disable DL GSM to prevent jack_insert becoming flaoting */
++ if (machine_is_neo1973_gta02())
++ s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, 1);
+ return 0;
+ }
+
+@@ -124,6 +177,8 @@ static int gta01_gsm_resume(struct platform_device *pdev)
+ if (s3c2410_gpio_getpin(GTA01_GPIO_MODEM_ON) && gta01_gsm.con)
+ console_stop(gta01_gsm.con);
+
++ if (machine_is_neo1973_gta02())
++ s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, 0);
+ return 0;
+ }
+ #else
+@@ -134,7 +189,7 @@ static int gta01_gsm_resume(struct platform_device *pdev)
+ static struct attribute *gta01_gsm_sysfs_entries[] = {
+ &dev_attr_power_on.attr,
+ &dev_attr_reset.attr,
+- NULL,
++ &dev_attr_download.attr,
+ NULL
+ };
+
+@@ -158,8 +213,18 @@ static int __init gta01_gsm_probe(struct platform_device *pdev)
+ gta01_gsm.gpio_ngsm_en = GTA01Bv2_GPIO_nGSM_EN;
+ s3c2410_gpio_setpin(GTA01v3_GPIO_nGSM_EN, 0);
+ break;
++#ifdef CONFIG_MACH_NEO1973_GTA02
++ case GTA02v1_SYSTEM_REV:
++ case GTA02v2_SYSTEM_REV:
++ case GTA02v3_SYSTEM_REV:
++ case GTA02v4_SYSTEM_REV:
++ case GTA02v5_SYSTEM_REV:
++ case GTA02v6_SYSTEM_REV:
++ gta01_gsm.gpio_ngsm_en = 0;
++ break;
++#endif
+ default:
+- dev_warn(&pdev->dev, "Unknown GTA01 Revision 0x%x, "
++ dev_warn(&pdev->dev, "Unknown Neo1973 Revision 0x%x, "
+ "some PM features not available!!!\n",
+ system_rev);
+ break;
+@@ -175,9 +240,13 @@ static int __init gta01_gsm_probe(struct platform_device *pdev)
+ break;
+ }
+
+- gta01_gsm.con = find_s3c24xx_console();
+- if (!gta01_gsm.con)
+- dev_warn(&pdev->dev, "cannot find S3C24xx console driver\n");
++ if (machine_is_neo1973_gta01()) {
++ gta01_gsm.con = find_s3c24xx_console();
++ if (!gta01_gsm.con)
++ dev_warn(&pdev->dev,
++ "cannot find S3C24xx console driver\n");
++ } else
++ gta01_gsm.con = NULL;
+
+ return sysfs_create_group(&pdev->dev.kobj, &gta01_gsm_attr_group);
+ }
+--
+1.5.6.3
+