[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);
+}