diff --git a/arch/arm/mach-s3c2440/gta02-pm-gsm.c b/arch/arm/mach-s3c2440/gta02-pm-gsm.c
index d1831b5..0fb5d88 100644
--- a/arch/arm/mach-s3c2440/gta02-pm-gsm.c
+++ b/arch/arm/mach-s3c2440/gta02-pm-gsm.c
@@ -1,5 +1,5 @@
 /*
- * GSM Management code for the Openmoko Freerunner GSM Phone
+ * GSM Management code for the FIC Neo1973 GSM Phone
  *
  * (C) 2007 by Openmoko Inc.
  * Author: Harald Welte <laforge@openmoko.org>
@@ -30,18 +30,23 @@
 #include <mach/gta02.h>
 #include <mach/regs-gpio.h>
 #include <mach/regs-gpioj.h>
+#include <linux/mfd/pcf50633/gpio.h>
 
-static int gta02_gsm_interrupts;
+extern struct pcf50633 *gta02_pcf;
+
+int gta_gsm_interrupts;
+EXPORT_SYMBOL(gta_gsm_interrupts);
 
 extern void s3c24xx_serial_console_set_silence(int);
 
-struct gta02pm_priv {
-	int gpio_ndl_gsm;
+struct gta01pm_priv {
+	int gpio_ngsm_en;
+        int gpio_ndl_gsm;
+
 	struct console *con;
-	struct regulator *regulator;
 };
 
-static struct gta02pm_priv gta02_gsm;
+static struct gta01pm_priv gta01_gsm;
 
 static struct console *find_s3c24xx_console(void)
 {
@@ -63,11 +68,17 @@ static ssize_t gsm_read(struct device *dev, struct device_attribute *attr,
 			char *buf)
 {
 	if (!strcmp(attr->attr.name, "power_on")) {
-		if (regulator_is_enabled(gta02_gsm.regulator))
-			goto out_1;
+		if (gta01_gsm.gpio_ngsm_en) {
+			if (!s3c2410_gpio_getpin(gta01_gsm.gpio_ngsm_en))
+				goto out_1;
+		} else if (machine_is_neo1973_gta02())
+			if (pcf50633_gpio_get(gta02_pcf, PCF50633_GPIO2))
+				goto out_1;
 	} else if (!strcmp(attr->attr.name, "download")) {
-		if (!s3c2410_gpio_getpin(GTA02_GPIO_nDL_GSM))
-			goto out_1;
+        if (machine_is_neo1973_gta02()) {
+			if (!s3c2410_gpio_getpin(GTA02_GPIO_nDL_GSM))
+				goto out_1;
+		}
 	} else if (!strcmp(attr->attr.name, "flowcontrolled")) {
 		if (s3c2410_gpio_getcfg(S3C2410_GPH(1)) == S3C2410_GPIO_OUTPUT)
 			goto out_1;
@@ -80,34 +91,38 @@ out_1:
 
 static void gsm_on_off(struct device *dev, int on)
 {
-
-	on = !!on;
-
-	if (on == regulator_is_enabled(gta02_gsm.regulator))
-		return;
-
 	if (!on) {
-		s3c2410_gpio_cfgpin(S3C2410_GPH(1), S3C2410_GPIO_INPUT);
-		s3c2410_gpio_cfgpin(S3C2410_GPH(2), S3C2410_GPIO_INPUT);
+		if (machine_is_neo1973_gta02()) {
+			/*
+			 * Do not drive into powered-down GSM side
+			 * GTA02 only, because on GTA01 maybe serial
+			 * is used otherwise.
+			 */
+			s3c2410_gpio_cfgpin(S3C2410_GPH(1), S3C2410_GPIO_INPUT);
+			s3c2410_gpio_cfgpin(S3C2410_GPH(2), S3C2410_GPIO_INPUT);
+
+			pcf50633_gpio_set(gta02_pcf, PCF50633_GPIO2, 0);
+		}
 
-		regulator_disable(gta02_gsm.regulator);
+		if (gta01_gsm.gpio_ngsm_en)
+			s3c2410_gpio_setpin(gta01_gsm.gpio_ngsm_en, 1);
 
-		if (gta02_gsm.con) {
+		if (gta01_gsm.con) {
 			s3c24xx_serial_console_set_silence(0);
-			console_start(gta02_gsm.con);
+			console_start(gta01_gsm.con);
 
-			dev_dbg(dev, "powered down gta02 GSM, enabling "
+			dev_dbg(dev, "powered down GTA01 GSM, enabling "
 					"serial console\n");
 		}
 
 		return;
 	}
 
-	if (gta02_gsm.con) {
+	if (gta01_gsm.con) {
 		dev_dbg(dev, "powering up GSM, thus "
 				"disconnecting serial console\n");
 
-		console_stop(gta02_gsm.con);
+		console_stop(gta01_gsm.con);
 		s3c24xx_serial_console_set_silence(1);
 	}
 
@@ -115,13 +130,17 @@ static void gsm_on_off(struct device *dev, int on)
 	s3c2410_gpio_cfgpin(S3C2410_GPH(1), S3C2410_GPH1_nRTS0);
 	s3c2410_gpio_cfgpin(S3C2410_GPH(2), S3C2410_GPH2_TXD0);
 
-	regulator_enable(gta02_gsm.regulator);
+	if (gta01_gsm.gpio_ngsm_en)
+		s3c2410_gpio_setpin(gta01_gsm.gpio_ngsm_en, 0);
+
+	if (machine_is_neo1973_gta02())
+		pcf50633_gpio_set(gta02_pcf, PCF50633_GPIO2, 1);
 
 	msleep(100);
 
-	s3c2410_gpio_setpin(GTA02_GPIO_MODEM_ON, 1);
-	msleep(500);
-	s3c2410_gpio_setpin(GTA02_GPIO_MODEM_ON, 0);
+    s3c2410_gpio_setpin(GTA02_GPIO_MODEM_ON, 1);
+    msleep(500);
+    s3c2410_gpio_setpin(GTA02_GPIO_MODEM_ON, 0);
 
 	/*
 	 * workaround for calypso firmware moko10 and earlier,
@@ -146,41 +165,6 @@ static ssize_t gsm_write(struct device *dev, struct device_attribute *attr,
 		return count;
 	}
 
-	if (!strcmp(attr->attr.name, "download")) {
-		/*
-		 * the keyboard / buttons driver requests and enables
-		 * the JACK_INSERT IRQ.  We have to take care about
-		 * not enabling and disabling the IRQ when it was
-		 * already in that state or we get "unblanaced IRQ"
-		 * kernel warnings and stack dumps.  So we use the
-		 * copy of the ndl_gsm state to figure out if we should
-		 * enable or disable the jack interrupt
-		 */
-		if (on) {
-			if (gta02_gsm.gpio_ndl_gsm)
-				disable_irq(gpio_to_irq(
-						   GTA02_GPIO_JACK_INSERT));
-		} else {
-			if (!gta02_gsm.gpio_ndl_gsm)
-				enable_irq(gpio_to_irq(
-						   GTA02_GPIO_JACK_INSERT));
-		}
-
-		gta02_gsm.gpio_ndl_gsm = !on;
-		s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, !on);
-
-		return count;
-	}
-
-	if (!strcmp(attr->attr.name, "flowcontrolled")) {
-		if (on) {
-			gta02_gsm_interrupts = 0;
-			s3c2410_gpio_setpin(S3C2410_GPH(1), 1);
-			s3c2410_gpio_cfgpin(S3C2410_GPH(1), S3C2410_GPIO_OUTPUT);
-		} else
-			s3c2410_gpio_cfgpin(S3C2410_GPH(1), S3C2410_GPH1_nRTS0);
-	}
-
 	return count;
 }
 
@@ -191,71 +175,60 @@ static DEVICE_ATTR(flowcontrolled, 0644, gsm_read, gsm_write);
 
 #ifdef CONFIG_PM
 
-static int gta02_gsm_suspend(struct device *dev)
+static int gta01_gsm_resume(struct platform_device *pdev);
+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_GPH(1)) == S3C2410_GPIO_OUTPUT) {
-		if (gta02_gsm_interrupts)
+		if (gta_gsm_interrupts)
 			goto busy;
 	}
 
 	/* disable DL GSM to prevent jack_insert becoming 'floating' */
-	s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, 1);
-
-	if (device_may_wakeup(dev))
-		enable_irq_wake(GTA02_IRQ_MODEM);
-
+	if (machine_is_neo1973_gta02())
+		s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, 1);
 	return 0;
 
 busy:
 	return -EBUSY;
 }
 
-static int gta02_gsm_suspend_late(struct device *dev)
+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_GPH(1)) == S3C2410_GPIO_OUTPUT) {
-		if (gta02_gsm_interrupts)
+		if (gta_gsm_interrupts)
 			return -EBUSY;
 	}
 	return 0;
 }
 
-static int gta02_gsm_resume(struct device *dev)
+static int gta01_gsm_resume(struct platform_device *pdev)
 {
-	if (device_may_wakeup(dev))
-		disable_irq_wake(GTA02_IRQ_MODEM);
-
 	/* GPIO state is saved/restored by S3C2410 core GPIO driver, so we
 	 * 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 (gta02_gsm.con && s3c2410_gpio_getpin(GTA02_GPIO_MODEM_ON))
-		console_stop(gta02_gsm.con);
+	if (gta01_gsm.con && s3c2410_gpio_getpin(GTA02_GPIO_MODEM_ON))
+		console_stop(gta01_gsm.con);
 
-	s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, gta02_gsm.gpio_ndl_gsm);
+	if (machine_is_neo1973_gta02())
+		s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, gta01_gsm.gpio_ndl_gsm);
 
 	return 0;
 }
-
-static struct dev_pm_ops gta02_gsm_pm_ops = {
-	.suspend	= gta02_gsm_suspend,
-	.suspend_noirq	= gta02_gsm_suspend_late,
-	.resume		= gta02_gsm_resume,
-};
-
-#define GTA02_GSM_PM_OPS (&gta02_gsm_pm_ops)
-
 #else
-#define GTA02_GSM_PM_OPS NULL
+#define gta01_gsm_suspend	NULL
+#define gta01_gsm_suspend_late	NULL
+#define gta01_gsm_resume	NULL
 #endif /* CONFIG_PM */
 
-static struct attribute *gta02_gsm_sysfs_entries[] = {
+static struct attribute *gta01_gsm_sysfs_entries[] = {
 	&dev_attr_power_on.attr,
 	&dev_attr_reset.attr,
 	&dev_attr_download.attr,
@@ -263,99 +236,64 @@ static struct attribute *gta02_gsm_sysfs_entries[] = {
 	NULL
 };
 
-static struct attribute_group gta02_gsm_attr_group = {
+static struct attribute_group gta01_gsm_attr_group = {
 	.name	= NULL,
-	.attrs	= gta02_gsm_sysfs_entries,
+	.attrs	= gta01_gsm_sysfs_entries,
 };
 
-static irqreturn_t gta02_gsm_irq(int irq, void *devid)
-{
-	gta02_gsm_interrupts++;
-	return IRQ_HANDLED;
-}
-
-static int __init gta02_gsm_probe(struct platform_device *pdev)
+static int __init gta01_gsm_probe(struct platform_device *pdev)
 {
-	int ret;
-
-	gta02_gsm.con = find_s3c24xx_console();
-	if (!gta02_gsm.con)
-		dev_warn(&pdev->dev,
-			 "cannot find S3C24xx console driver\n");
-
-	gta02_gsm.regulator = regulator_get_exclusive(&pdev->dev, "GSM");
+		gta01_gsm.gpio_ngsm_en = 0;
 
-	if (IS_ERR(gta02_gsm.regulator)) {
-		ret = PTR_ERR(gta02_gsm.regulator);
-		dev_err(&pdev->dev, "Failed to get regulator: %d\n", ret);
-		return ret;
-	}
-
-	ret = request_irq(GTA02_IRQ_MODEM, gta02_gsm_irq,
-			IRQF_DISABLED | IRQF_TRIGGER_RISING, "modem", NULL);
+	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;
 
-	if (ret) {
-		regulator_put(gta02_gsm.regulator);
-		dev_err(&pdev->dev, "Failed to get modem irq: %d\n", ret);
-		goto err_regulator_put;
-	}
-
-	ret = sysfs_create_group(&pdev->dev.kobj, &gta02_gsm_attr_group);
-	if (ret) {
-		dev_err(&pdev->dev, "Failed to create sysfs entries: %d\n", ret);
-		goto err_free_irq;
-	}
-
-	device_init_wakeup(&pdev->dev, 1);
+	/* note that download initially disabled, and enforce that */
+	gta01_gsm.gpio_ndl_gsm = 1;
+	if (machine_is_neo1973_gta02())
+		s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, 1);
 
 	/* GSM is to be initially off (at boot, or if this module inserted) */
 	gsm_on_off(&pdev->dev, 0);
 
-	/* note that download initially disabled, and enforce that */
-	gta02_gsm.gpio_ndl_gsm = 1;
-	s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, 1);
-
-	return 0;
-err_free_irq:
-	free_irq(GTA02_IRQ_MODEM, NULL);
-err_regulator_put:
-	regulator_put(gta02_gsm.regulator);
-
-	return ret;
+	return sysfs_create_group(&pdev->dev.kobj, &gta01_gsm_attr_group);
 }
 
-static int gta02_gsm_remove(struct platform_device *pdev)
+static int gta01_gsm_remove(struct platform_device *pdev)
 {
-	gsm_on_off(&pdev->dev, 0);
-
-	sysfs_remove_group(&pdev->dev.kobj, &gta02_gsm_attr_group);
-	free_irq(GTA02_IRQ_MODEM, NULL);
-	regulator_put(gta02_gsm.regulator);
+	sysfs_remove_group(&pdev->dev.kobj, &gta01_gsm_attr_group);
 
 	return 0;
 }
 
-static struct platform_driver gta02_gsm_driver = {
-	.probe		= gta02_gsm_probe,
-	.remove		= gta02_gsm_remove,
+static struct platform_driver gta01_gsm_driver = {
+	.probe		= gta01_gsm_probe,
+	.remove		= gta01_gsm_remove,
+	.suspend	= gta01_gsm_suspend,
+	.resume		= gta01_gsm_resume,
 	.driver		= {
-		.name	= "gta02-pm-gsm",
-		.pm	= GTA02_GSM_PM_OPS,
+		.name		= "gta02-pm-gsm",
 	},
 };
 
-static int __devinit gta02_gsm_init(void)
+static int __devinit gta01_gsm_init(void)
 {
-	return platform_driver_register(&gta02_gsm_driver);
+	return platform_driver_register(&gta01_gsm_driver);
 }
-module_init(gta02_gsm_init);
 
-static void gta02_gsm_exit(void)
+static void gta01_gsm_exit(void)
 {
-	platform_driver_unregister(&gta02_gsm_driver);
+	platform_driver_unregister(&gta01_gsm_driver);
 }
-module_exit(gta02_gsm_exit);
+
+module_init(gta01_gsm_init);
+module_exit(gta01_gsm_exit);
 
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
-MODULE_DESCRIPTION("Openmoko Freerunner GSM Power Management");
+MODULE_DESCRIPTION("FIC Neo1973 GSM Power Management");
diff --git a/arch/arm/mach-s3c2440/mach-gta02.c b/arch/arm/mach-s3c2440/mach-gta02.c
index 08e9dcc..cc8185e 100644
--- a/arch/arm/mach-s3c2440/mach-gta02.c
+++ b/arch/arm/mach-s3c2440/mach-gta02.c
@@ -128,7 +128,7 @@
 
 #define S3C_SYSTEM_REV_ATAG GTA02v6_SYSTEM_REV
 
-static struct pcf50633 *gta02_pcf;
+struct pcf50633 *gta02_pcf;
 
 /*
  * This gets called every 1ms when we paniced.
diff --git a/drivers/gpio/pcf50633-gpio.c b/drivers/gpio/pcf50633-gpio.c
index eb044e8..4063ead 100644
--- a/drivers/gpio/pcf50633-gpio.c
+++ b/drivers/gpio/pcf50633-gpio.c
@@ -27,6 +27,8 @@
 #define PCF50633_REG_GPIOCTL	0x13
 #define PCF50633_REG_GPIOCFG(x) (0x14 + (x))
 
+#define PCF50633_REG_GPIO1CFG   0x14
+
 enum pcf50633_regulator_id {
 	PCF50633_REGULATOR_AUTO,
 	PCF50633_REGULATOR_DOWN1,
@@ -72,6 +74,27 @@ struct pcf50633_gpio {
 	struct gpio_chip chip;
 };
 
+int pcf50633_gpio_set(struct pcf50633 *pcf, int gpio, u8 val)
+{
+    u8 reg;
+
+    reg = gpio - PCF50633_GPIO1 + PCF50633_REG_GPIO1CFG;
+
+    return pcf50633_reg_set_bit_mask(pcf, reg, 0x07, val);
+}
+EXPORT_SYMBOL_GPL(pcf50633_gpio_set);
+
+u8 pcf50633_gpio_get(struct pcf50633 *pcf, int gpio)
+{
+    u8 reg, val;
+
+    reg = gpio - PCF50633_GPIO1 + PCF50633_REG_GPIO1CFG;
+    val = pcf50633_reg_read(pcf, reg) & 0x07;
+
+    return val;
+}
+EXPORT_SYMBOL_GPL(pcf50633_gpio_get);
+
 static inline struct pcf50633 *gpio_chip_to_pcf50633(struct gpio_chip *chip)
 {
 	struct pcf50633 *pcf = dev_to_pcf50633(chip->dev->parent);
@@ -88,7 +111,7 @@ static void pcf50633_gpio_set_value(struct gpio_chip *chip, unsigned gpio, int v
 	pcf50633_reg_set_bit_mask(pcf, reg, 0x07, value ? 0x7 : 0x0);
 }
 
-static int pcf50633_gpio_get_value(struct gpio_chip *chip, unsigned gpio)
+int pcf50633_gpio_get_value(struct gpio_chip *chip, unsigned gpio)
 {
 	struct pcf50633 *pcf = gpio_chip_to_pcf50633(chip);
 	return pcf50633_reg_read(pcf, PCF50633_REG_GPIOCFG(gpio)) >> 3;
diff --git a/drivers/input/touchscreen/s3c2410_ts.c b/drivers/input/touchscreen/s3c2410_ts.c
index 8fba8a8..ed5b437 100644
--- a/drivers/input/touchscreen/s3c2410_ts.c
+++ b/drivers/input/touchscreen/s3c2410_ts.c
@@ -144,6 +144,7 @@ static void touch_timer_fire(unsigned long data)
 			input_report_abs(ts.input, ABS_Y, ts.yp);
 
 			input_report_key(ts.input, BTN_TOUCH, 1);
+            input_report_abs(ts.input, ABS_PRESSURE, 1);
 			input_sync(ts.input);
 
 			ts.xp = 0;
@@ -158,6 +159,7 @@ static void touch_timer_fire(unsigned long data)
 		ts.count = 0;
 
 		input_report_key(ts.input, BTN_TOUCH, 0);
+        input_report_abs(ts.input, ABS_PRESSURE, 0);
 		input_sync(ts.input);
 		
 		ts.expectedintr = WAITFORINT_DOWN;
@@ -343,6 +345,7 @@ static int __devinit s3c2410ts_probe(struct platform_device *pdev)
 	ts.input->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
 	input_set_abs_params(ts.input, ABS_X, 0, 0x3FF, 0, 0);
 	input_set_abs_params(ts.input, ABS_Y, 0, 0x3FF, 0, 0);
+    input_set_abs_params(ts.input, ABS_PRESSURE, 0, 1, 0, 0);
 
 	ts.input->name = "S3C24XX TouchScreen";
 	ts.input->id.bustype = BUS_HOST;
diff --git a/include/linux/mfd/pcf50633/gpio.h b/include/linux/mfd/pcf50633/gpio.h
index af2c341..3eb0a39 100644
--- a/include/linux/mfd/pcf50633/gpio.h
+++ b/include/linux/mfd/pcf50633/gpio.h
@@ -50,6 +50,12 @@ int pcf50633_gpio_set_config(struct pcf50633 *pcf, unsigned gpio,
 
 int pcf50633_gpio_power_supply_set(struct pcf50633 *pcf,
 					int gpio, int regulator, int on);
+                    
+int pcf50633_gpio_set(struct pcf50633 *pcf, int gpio, u8 val);
+
+u8 pcf50633_gpio_get(struct pcf50633 *pcf, int gpio);
+
+
 #endif /* __LINUX_MFD_PCF50633_GPIO_H */
 
 

