[msm8x60]: Autodetect 8660 SURF and FFA

Writing to Debug LED register and reading it back to detect SURF or FFA.
This is a workaround till we get EPROM enabled in the devices.

Change-Id: Id8416cd5330363ad9c89dd4656c62f9c0ce54ba0
diff --git a/include/reg.h b/include/reg.h
index d04d4ea..b5dd528 100644
--- a/include/reg.h
+++ b/include/reg.h
@@ -39,4 +39,6 @@
 #define writel(v, a) (*REG32(a) = (v))
 #define readl(a) (*REG32(a))
 
+#define writeb(v, a) (*REG8(a) = (v))
+#define readb(a) (*REG8(a))
 #endif
diff --git a/platform/msm8x60/include/platform/iomap.h b/platform/msm8x60/include/platform/iomap.h
index fa642c8..2c267e7 100755
--- a/platform/msm8x60/include/platform/iomap.h
+++ b/platform/msm8x60/include/platform/iomap.h
@@ -55,4 +55,35 @@
 #else
 #define MSM_SHARED_BASE      0x01F00000
 #endif
+
+#define SURF_DEBUG_LED_ADDR      0x1D000202
+
+#define GPIO_CFG133_ADDR    0x00801850
+#define GPIO_CFG135_ADDR    0x00801870
+#define GPIO_CFG136_ADDR    0x00801880
+#define GPIO_CFG137_ADDR    0x00801890
+#define GPIO_CFG138_ADDR    0x008018A0
+#define GPIO_CFG139_ADDR    0x008018B0
+#define GPIO_CFG140_ADDR    0x008018C0
+#define GPIO_CFG141_ADDR    0x008018D0
+#define GPIO_CFG142_ADDR    0x008018E0
+#define GPIO_CFG143_ADDR    0x008018F0
+#define GPIO_CFG144_ADDR    0x00801900
+#define GPIO_CFG145_ADDR    0x00801910
+#define GPIO_CFG146_ADDR    0x00801920
+#define GPIO_CFG147_ADDR    0x00801930
+#define GPIO_CFG148_ADDR    0x00801940
+#define GPIO_CFG149_ADDR    0x00801950
+#define GPIO_CFG150_ADDR    0x00801960
+#define GPIO_CFG151_ADDR    0x00801970
+#define GPIO_CFG152_ADDR    0x00801980
+#define GPIO_CFG153_ADDR    0x00801990
+#define GPIO_CFG154_ADDR    0x008019A0
+#define GPIO_CFG155_ADDR    0x008019B0
+#define GPIO_CFG156_ADDR    0x008019C0
+#define GPIO_CFG157_ADDR    0x008019D0
+#define GPIO_CFG158_ADDR    0x008019E0
+
+#define EBI2_CHIP_SELECT_CFG0    0x1A100000
+#define EBI2_XMEM_CS3_CFG1       0x1A110034
 #endif
diff --git a/target/msm8660_surf/init.c b/target/msm8660_surf/init.c
index 3362b60..aba99b5 100755
--- a/target/msm8660_surf/init.c
+++ b/target/msm8660_surf/init.c
@@ -36,20 +36,26 @@
 #include <lib/ptable.h>
 #include <dev/flash.h>
 #include <smem.h>
+#include <platform/iomap.h>
+#include <reg.h>
 
-#define LINUX_MACHTYPE_SURF  0xf656a
+#define LINUX_MACHTYPE_8660_SURF    1009002
+#define LINUX_MACHTYPE_8660_FFA     1009003
 
 
 void keypad_init(void);
 
 static int emmc_boot = -1;  /* set to uninitialized */
 int target_is_emmc_boot(void);
+void debug_led_write(char);
+char debug_led_read();
 
 void target_init(void)
 {
 
     dprintf(INFO, "target_init()\n");
 
+    setup_fpga();
 #if (!ENABLE_NANDWRITE)
 	keys_init();
 	keypad_init();
@@ -63,7 +69,17 @@
 
 unsigned board_machtype(void)
 {
-    return LINUX_MACHTYPE_SURF;
+    /* Writing to Debug LED register and reading back to auto detect
+       SURF and FFA. If we read back, it is SURF */
+    debug_led_write(0xA5);
+
+    if((debug_led_read() & 0xFF) == 0xA5)
+    {
+        debug_led_write(0);
+        return LINUX_MACHTYPE_8660_SURF;
+    }
+    else
+        return LINUX_MACHTYPE_8660_FFA;
 }
 
 void reboot_device(unsigned reboot_reason)
@@ -79,3 +95,45 @@
 void target_battery_charging_enable(unsigned enable, unsigned disconnect)
 {
 }
+
+void setup_fpga()
+{
+    writel(0x147, GPIO_CFG133_ADDR);
+    writel(0x144, GPIO_CFG135_ADDR);
+    writel(0x144, GPIO_CFG136_ADDR);
+    writel(0x144, GPIO_CFG137_ADDR);
+    writel(0x144, GPIO_CFG138_ADDR);
+    writel(0x144, GPIO_CFG139_ADDR);
+    writel(0x144, GPIO_CFG140_ADDR);
+    writel(0x144, GPIO_CFG141_ADDR);
+    writel(0x144, GPIO_CFG142_ADDR);
+    writel(0x144, GPIO_CFG143_ADDR);
+    writel(0x144, GPIO_CFG144_ADDR);
+    writel(0x144, GPIO_CFG145_ADDR);
+    writel(0x144, GPIO_CFG146_ADDR);
+    writel(0x144, GPIO_CFG147_ADDR);
+    writel(0x144, GPIO_CFG148_ADDR);
+    writel(0x144, GPIO_CFG149_ADDR);
+    writel(0x144, GPIO_CFG150_ADDR);
+    writel(0x147, GPIO_CFG151_ADDR);
+    writel(0x147, GPIO_CFG152_ADDR);
+    writel(0x147, GPIO_CFG153_ADDR);
+    writel(0x3,   GPIO_CFG154_ADDR);
+    writel(0x147, GPIO_CFG155_ADDR);
+    writel(0x147, GPIO_CFG156_ADDR);
+    writel(0x147, GPIO_CFG157_ADDR);
+    writel(0x3,   GPIO_CFG158_ADDR);
+
+    writel(0x00000B31, EBI2_CHIP_SELECT_CFG0);
+    writel(0xA3030020, EBI2_XMEM_CS3_CFG1);
+}
+
+void debug_led_write(char val)
+{
+    writeb(val,SURF_DEBUG_LED_ADDR);
+}
+
+char debug_led_read()
+{
+    return readb(SURF_DEBUG_LED_ADDR);
+}