[target/msm7630]: Add code to auto detect interleaved mode.

Interleaved mode is identified using the build id provided
in shared memory. Configure the ptable entries for interleaved mode.
Configure GPIOs for the second NAND device. Add code to modify
the page size when operating in interleaved mode.

Change-Id: Ic1bbabc32b15ef0d17b52c89b1dcc639c0fef5ae
diff --git a/platform/init.c b/platform/init.c
index c6982da..488d744 100644
--- a/platform/init.c
+++ b/platform/init.c
@@ -48,3 +48,7 @@
 __WEAK void secondary_core(unsigned sec_entry)
 {
 }
+
+__WEAK void platform_config_interleaved_mode_gpios(void)
+{
+}
diff --git a/platform/msm7x30/gpio.c b/platform/msm7x30/gpio.c
index 0b1272b..c9662f2 100644
--- a/platform/msm7x30/gpio.c
+++ b/platform/msm7x30/gpio.c
@@ -209,4 +209,12 @@
 	return (readl(r->in) & b) ? 1 : 0;
 }
 
-
+void platform_config_interleaved_mode_gpios(void)
+{
+        /* configure EB2_CS1 through GPIO86 */
+	writel (GPIO_ALT_FUNC_PAGE_REG, 0x56);
+	writel (GPIO_ALT_FUNC_CFG_REG, 0x04);
+	/* configure the EBI2_BUSY1_N through GPIO115 */
+	writel (GPIO_ALT_FUNC_PAGE_REG, 0x73);
+	writel (GPIO_ALT_FUNC_CFG_REG, 0x08);
+}
diff --git a/platform/msm7x30/gpio_hw.h b/platform/msm7x30/gpio_hw.h
index 3ef40f6..e9ff8ed 100644
--- a/platform/msm7x30/gpio_hw.h
+++ b/platform/msm7x30/gpio_hw.h
@@ -26,8 +26,8 @@
  * SUCH DAMAGE.
  */
 
-#ifndef __PLATFORM_QSD8K_GPIO_HW_H
-#define __PLATFORM_QSD8K_GPIO_HW_H
+#ifndef __PLATFORM_MSM7X30_GPIO_HW_H
+#define __PLATFORM_MSM7X30_GPIO_HW_H
 
 #define MSM_GPIO1_BASE 0xA9000000
 #define MSM_GPIO2_BASE 0xA9100000
@@ -115,4 +115,9 @@
 #define GPIO_INT_STATUS_6  GPIO1_REG(0x103)
 #define GPIO_INT_STATUS_7  GPIO1_REG(0x108)
 
+
+#define GPIO_OUT_VAL_REG_BASE     0xABC00000
+#define GPIO_ALT_FUNC_PAGE_REG    (GPIO_OUT_VAL_REG_BASE + 0x20)
+#define GPIO_ALT_FUNC_CFG_REG     (GPIO_OUT_VAL_REG_BASE + 0x24)
+
 #endif
diff --git a/platform/msm_shared/nand.c b/platform/msm_shared/nand.c
index a91e85d..0a72902 100755
--- a/platform/msm_shared/nand.c
+++ b/platform/msm_shared/nand.c
@@ -42,6 +42,7 @@
 
 static void *flash_spare;
 static void *flash_data;
+void platform_config_interleaved_mode_gpios(void);
 
 typedef struct dmov_ch dmov_ch;
 struct dmov_ch
@@ -106,6 +107,7 @@
 
 static struct flash_info flash_info;
 static unsigned flash_pagesize = 0;
+static int interleaved_mode = 0;
 
 struct flash_identification {
 	unsigned flash_id;
@@ -3206,6 +3208,9 @@
 	switch(flash_info.type) {
 		case FLASH_8BIT_NAND_DEVICE:
 		case FLASH_16BIT_NAND_DEVICE:
+		  if(interleaved_mode)
+			return flash_nand_read_page_interleave(cmdlist, ptrlist, page, _addr, _spareaddr);
+		  else
 			return _flash_nand_read_page(cmdlist, ptrlist, page, _addr, _spareaddr);
 		case FLASH_ONENAND_DEVICE:
 			return _flash_onenand_read_page(cmdlist, ptrlist, page, _addr, _spareaddr, 0);
@@ -3234,6 +3239,9 @@
 	switch(flash_info.type) {
 		case FLASH_8BIT_NAND_DEVICE:
 		case FLASH_16BIT_NAND_DEVICE:
+		  if(interleaved_mode)
+			return flash_nand_write_page_interleave(cmdlist, ptrlist, page, _addr, _spareaddr, 0);
+		  else
 			return _flash_nand_write_page(cmdlist, ptrlist, page, _addr, _spareaddr, 0);
 		case FLASH_ONENAND_DEVICE:
 			return _flash_onenand_write_page(cmdlist, ptrlist, page, _addr, _spareaddr, 0);
@@ -3447,3 +3455,14 @@
 {
 	return flash_pagesize;
 }
+
+void enable_interleave_mode(int status)
+{
+  interleaved_mode = status;
+  if(status)
+  {
+        flash_pagesize *= 2;
+	platform_config_interleaved_mode_gpios();
+  }
+  return;
+}