diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 37ce6e85a1352ca6f6e93cd1cd4aadcf7060a19d..21665ecc5b9288356becf9f0269494b1748374f3 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -1190,7 +1190,7 @@ block_dev_desc_t *mmc_get_dev(int dev)
 
 int mmc_init(struct mmc *mmc)
 {
-	int err, retry = 3;
+	int err;
 
 	if (mmc->has_init)
 		return 0;
@@ -1213,19 +1213,7 @@ int mmc_init(struct mmc *mmc)
 	mmc->part_num = 0;
 
 	/* Test for SD version 2 */
-	/*
-	 * retry here for 3 times, as for some controller it has dynamic
-	 * clock gating, and only toggle out clk when the first cmd0 send
-	 * out, while some card strictly obey the 74 clocks rule, the interval
-	 * may not be sufficient between the cmd0 and this cmd8, retry to
-	 * fulfil the clock requirement
-	 */
-	do {
-		err = mmc_send_if_cond(mmc);
-	} while (--retry > 0 && err);
-
-	if (err)
-		return err;
+	err = mmc_send_if_cond(mmc);
 
 	/* Now try to get the SD card's operating condition */
 	err = sd_send_op_cond(mmc);
diff --git a/drivers/mmc/mv_sdhci.c b/drivers/mmc/mv_sdhci.c
index f92caeb8fd5f43884e720f311fc9e3f58b03f6d2..1501974e2f575eb2784dec176335e4b84db2c2bc 100644
--- a/drivers/mmc/mv_sdhci.c
+++ b/drivers/mmc/mv_sdhci.c
@@ -48,7 +48,10 @@ int mv_sdh_init(u32 regbase, u32 max_clk, u32 min_clk, u32 quirks)
 		mv_ops.write_b = mv_sdhci_writeb;
 	host->ops = &mv_ops;
 #endif
-	host->version = sdhci_readw(host, SDHCI_HOST_VERSION);
+	if (quirks & SDHCI_QUIRK_REG32_RW)
+		host->version = sdhci_readl(host, SDHCI_HOST_VERSION - 2) >> 16;
+	else
+		host->version = sdhci_readw(host, SDHCI_HOST_VERSION);
 	add_sdhci(host, max_clk, min_clk);
 	return 0;
 }
diff --git a/include/sdhci.h b/include/sdhci.h
index 0690938046844a769ee340ad4e175b8a9d08c2ed..800f9d9c0733b9af0deaf45c3bd03c7ffbc8dac4 100644
--- a/include/sdhci.h
+++ b/include/sdhci.h
@@ -215,6 +215,7 @@
  * quirks
  */
 #define SDHCI_QUIRK_32BIT_DMA_ADDR	(1 << 0)
+#define SDHCI_QUIRK_REG32_RW		(1 << 1)
 
 /* to make gcc happy */
 struct sdhci_host;