[msm_shared/mmc]: Check MMC/SD card status before setting bus width
Check MMC/SD card status before setting bus width which otherwise cause
command timeout and apps boot fails in MMC/SD initialization.
Change-Id: I5067f9d110bb9fbf8887add68f7c9335e14a0978
diff --git a/platform/msm_shared/include/mmc.h b/platform/msm_shared/include/mmc.h
index e840cb4..6c9f1a2 100755
--- a/platform/msm_shared/include/mmc.h
+++ b/platform/msm_shared/include/mmc.h
@@ -253,6 +253,7 @@
/* Card status */
#define MMC_BOOT_CARD_STATUS(x) ((x>>9) & 0x0F)
#define MMC_BOOT_TRAN_STATE 4
+#define MMC_BOOT_PROG_STATE 7
/* SD Memory Card bus commands */
#define CMD0_GO_IDLE_STATE 0
diff --git a/platform/msm_shared/mmc.c b/platform/msm_shared/mmc.c
index c7c6fc3..9628562 100644
--- a/platform/msm_shared/mmc.c
+++ b/platform/msm_shared/mmc.c
@@ -1123,6 +1123,7 @@
unsigned int mmc_ret = MMC_BOOT_E_SUCCESS;
unsigned int mmc_reg = 0;
unsigned int mmc_width = 0;
+ unsigned int status;
if( width != MMC_BOOT_BUS_WIDTH_1_BIT)
{
@@ -1131,6 +1132,19 @@
mmc_boot_send_ext_cmd (card);
+ do
+ {
+ mmc_ret = mmc_boot_get_card_status(card, 1, &status);
+ if(mmc_ret != MMC_BOOT_E_SUCCESS)
+ {
+ return mmc_ret;
+ }
+ }while( (mmc_ret == MMC_BOOT_E_SUCCESS) &&
+ (MMC_BOOT_CARD_STATUS(status) == MMC_BOOT_PROG_STATE));
+
+ if(MMC_BOOT_CARD_STATUS(status) != MMC_BOOT_TRAN_STATE)
+ return MMC_BOOT_E_FAILURE;
+
mmc_ret = mmc_boot_switch_cmd(card, MMC_BOOT_ACCESS_WRITE, MMC_BOOT_EXT_CMMC_BUS_WIDTH, mmc_width);
if( mmc_ret != MMC_BOOT_E_SUCCESS )