[msm]: Dynamic detection of eMMC for 7x30
Dynamically detecting eMMC slot and initialization for 7x30 SURF/FFA.
Change-Id: Id05cdbaaa831a53f0980e29e66bb93324eee8ed7
diff --git a/platform/msm7k/include/platform/iomap.h b/platform/msm7k/include/platform/iomap.h
index f2f1e35..9d58c30 100644
--- a/platform/msm7k/include/platform/iomap.h
+++ b/platform/msm7k/include/platform/iomap.h
@@ -47,6 +47,5 @@
#define MSM_SHARED_BASE 0x00100000
#define MSM_SDC1_BASE 0xA0400000
-#define MMC_BOOT_MCI_BASE MSM_SDC1_BASE
#endif
diff --git a/platform/msm7x30/include/platform/iomap.h b/platform/msm7x30/include/platform/iomap.h
index 5aec07c..789d5d7 100644
--- a/platform/msm7x30/include/platform/iomap.h
+++ b/platform/msm7x30/include/platform/iomap.h
@@ -43,8 +43,10 @@
#define MSM_CSR_BASE 0xC0100000
#define MSM_GCC_BASE 0xC0182000
+#define MSM_SDC1_BASE 0xA0400000
#define MSM_SDC2_BASE 0xA0500000
-#define MMC_BOOT_MCI_BASE MSM_SDC2_BASE
+#define MSM_SDC3_BASE 0xA3000000
+#define MSM_SDC4_BASE 0xA3100000
#define MSM_SHARED_BASE 0x00100000
diff --git a/platform/msm8x60/include/platform/iomap.h b/platform/msm8x60/include/platform/iomap.h
index 82d5eb2..ed64bd1 100755
--- a/platform/msm8x60/include/platform/iomap.h
+++ b/platform/msm8x60/include/platform/iomap.h
@@ -48,7 +48,6 @@
#define MSM_GIC_DIST_BASE 0x02080000
#define MSM_SDC1_BASE 0x12400000
-#define MMC_BOOT_MCI_BASE MSM_SDC1_BASE
#define MSM_SHARED_BASE 0x40000000
diff --git a/platform/msm_shared/include/mmc.h b/platform/msm_shared/include/mmc.h
index 0c5e7cc..9b49a34 100755
--- a/platform/msm_shared/include/mmc.h
+++ b/platform/msm_shared/include/mmc.h
@@ -29,15 +29,11 @@
#ifndef __MMC_H__
#define __MMC_H__
-#ifndef MMC_BOOT_MCI_BASE
-#define MMC_BOOT_MCI_BASE 0
-#endif
-
#ifndef MMC_SLOT
#define MMC_SLOT 0
#endif
-#define MMC_BOOT_MCI_REG(offset) (MMC_BOOT_MCI_BASE + offset)
+#define MMC_BOOT_MCI_REG(offset) ((mmc_boot_mci_base) + offset)
/*
* Define Macros for SDCC Registers
diff --git a/platform/msm_shared/mmc.c b/platform/msm_shared/mmc.c
index d19eca5..a7d7c38 100644
--- a/platform/msm_shared/mmc.c
+++ b/platform/msm_shared/mmc.c
@@ -59,6 +59,9 @@
static unsigned mmc_sdc_clk[] = { SDC1_CLK, SDC2_CLK, SDC3_CLK, SDC4_CLK};
static unsigned mmc_sdc_pclk[] = { SDC1_PCLK, SDC2_PCLK, SDC3_PCLK, SDC4_PCLK};
+unsigned char mmc_slot = 0;
+unsigned int mmc_boot_mci_base = 0;
+
int mmc_clock_enable_disable(unsigned id, unsigned enable);
int mmc_clock_get_rate(unsigned id);
int mmc_clock_set_rate(unsigned id, unsigned rate);
@@ -91,8 +94,8 @@
#ifndef PLATFORM_MSM8X60
int mmc_signed_ret = 0;
- unsigned SDC_CLK = mmc_sdc_clk[MMC_SLOT - 1];
- unsigned SDC_PCLK = mmc_sdc_pclk[MMC_SLOT - 1];
+ unsigned SDC_CLK = mmc_sdc_clk[mmc_slot - 1];
+ unsigned SDC_PCLK = mmc_sdc_pclk[mmc_slot - 1];
if( host == NULL )
{
@@ -2009,13 +2012,16 @@
/*
* Entry point to MMC boot process
*/
-unsigned int mmc_boot_main(void)
+unsigned int mmc_boot_main(unsigned char slot, unsigned int base)
{
unsigned int mmc_ret = MMC_BOOT_E_SUCCESS;
memset( (struct mmc_boot_host*)&mmc_host, 0, sizeof( struct mmc_boot_host ) );
memset( (struct mmc_boot_card*)&mmc_card, 0, sizeof(struct mmc_boot_card) );
+ mmc_slot = slot;
+ mmc_boot_mci_base = base;
+
#ifndef PLATFORM_MSM8X60
/* Waiting for modem to come up */
while (readl(MSM_SHARED_BASE + 0x14) != 1);
diff --git a/target/msm7627_surf/init.c b/target/msm7627_surf/init.c
index 4b058b6..b3738a2 100644
--- a/target/msm7627_surf/init.c
+++ b/target/msm7627_surf/init.c
@@ -36,6 +36,7 @@
#include <lib/ptable.h>
#include <dev/flash.h>
#include <smem.h>
+#include <platform/iomap.h>
#define LINUX_MACHTYPE 1007014
@@ -117,7 +118,11 @@
if (target_is_emmc_boot())
{
- mmc_boot_main();
+ if(mmc_boot_main(MMC_SLOT, MSM_SDC1_BASE))
+ {
+ dprintf(CRITICAL, "mmc init failed!");
+ ASSERT(0);
+ }
return;
}
diff --git a/target/msm7630_surf/init.c b/target/msm7630_surf/init.c
index b7efb5b..16d8981 100644
--- a/target/msm7630_surf/init.c
+++ b/target/msm7630_surf/init.c
@@ -38,6 +38,7 @@
#include <dev/flash.h>
#include <smem.h>
#include <reg.h>
+#include <platform/iomap.h>
#define LINUX_MACHTYPE_7x30_SURF 1007016
#define LINUX_MACHTYPE_7x30_FFA 1007017
@@ -66,6 +67,8 @@
#define DIFF_START_ADDR 0xF0F0F0F0
#define NUM_PAGES_PER_BLOCK 0x40
+static unsigned mmc_sdc_base[] = { MSM_SDC1_BASE, MSM_SDC2_BASE, MSM_SDC3_BASE, MSM_SDC4_BASE};
+
static struct ptable flash_ptable;
static int hw_platform_type = -1;
@@ -179,6 +182,8 @@
unsigned total_num_of_blocks;
unsigned next_ptr_start_adr = 0;
unsigned blocks_per_1MB = 8; /* Default value of 2k page size on 256MB flash drive*/
+ unsigned base_addr;
+ unsigned char slot;
int i;
dprintf(INFO, "target_init()\n");
@@ -190,7 +195,20 @@
if (target_is_emmc_boot())
{
- mmc_boot_main();
+ /* Trying Slot 2 first */
+ slot = 2;
+ base_addr = mmc_sdc_base[slot-1];
+ if(mmc_boot_main(slot, base_addr))
+ {
+ /* Trying Slot 4 next */
+ slot = 4;
+ base_addr = mmc_sdc_base[slot-1];
+ if(mmc_boot_main(slot, base_addr))
+ {
+ dprintf(CRITICAL, "mmc init failed!");
+ ASSERT(0);
+ }
+ }
return;
}
diff --git a/target/msm8660_surf/init.c b/target/msm8660_surf/init.c
index edebdfd..e91f125 100755
--- a/target/msm8660_surf/init.c
+++ b/target/msm8660_surf/init.c
@@ -63,7 +63,7 @@
keys_init();
keypad_init();
#endif
- if(mmc_boot_main())
+ if(mmc_boot_main(MMC_SLOT,MSM_SDC1_BASE))
{
dprintf(CRITICAL, "mmc init failed!");
ASSERT(0);