Index: linux-2.6.24/arch/arm/plat-s3c24xx/neo1973_pm_bt.c
===================================================================
--- linux-2.6.24.orig/arch/arm/plat-s3c24xx/neo1973_pm_bt.c
+++ linux-2.6.24/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 @@
 		       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 @@
 	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 @@
 {
 	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);
Index: linux-2.6.24/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
===================================================================
--- linux-2.6.24.orig/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
+++ linux-2.6.24/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 @@
 		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 @@
 
 	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 @@
 	/* 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 @@
 	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 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 @@
 		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 @@
 		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);
 }
Index: linux-2.6.24/arch/arm/plat-s3c24xx/neo1973_pm_gps.c
===================================================================
--- linux-2.6.24.orig/arch/arm/plat-s3c24xx/neo1973_pm_gps.c
+++ linux-2.6.24/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 @@
 /* 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 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 @@
 	.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);
 	}
+#endif /* CONFIG_MACH_NEO1973_GTA01 */
 
-	return sysfs_create_group(&pdev->dev.kobj, &gta01_gps_attr_group);
+#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;
 }
 
