Skip to contentSkip to conversation

mmc: core: try 1.8v signaling in ddr mode if host and device

PATCH Superseded Chuanxiao Dong 2 participants 2 messages Aug 14, 2014 MMC, SD and SDIO

v2 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 mmc: core: try 1.8v signaling in ddr mode if host and device

Even (e)MMC card can support 3.3v to 1.2v vccq in DDR, but not all host controller can support this, like some of the SDHCI host which connect to an eMMC device. Some of these host controller still needs to use 1.8v vccq for supporting DDR mode.

So the sequence will be:
if (host and device can both support 1.2v IO)

	use 1.2v IO;
else if (host and device can both support 1.8v IO)
	use 1.8v IO;

so if host and device can only support 3.3v IO, this is the last choice.

---
Changelog V2:
- For (e)MMC device switching to DDR mode, try 1.2v singaling first. Then try 1.8v. If 1.2v and 1.8v are both not supported, use the default 3.3v

 drivers/mmc/core/mmc.c |   20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)
drivers/mmc/core/mmc.c +18 -2
index 793c6f7..aa5180b 100644
@@ -988,8 +988,19 @@ static int mmc_select_hs_ddr(struct mmc_card *card)
 	 * 1.8V vccq at 3.3V core voltage (vcc) is not required
 	 * in the JEDEC spec for DDR.
 	 *
-	 * Do not force change in vccq since we are obviously
-	 * working and no change to vccq is needed.
+	 * Even (e)MMC card can support 3.3v to 1.2v vccq, but not all
+	 * host controller can support this, like some of the SDHCI
+	 * controller which connect to an eMMC device. Some of these
+	 * host controller still needs to use 1.8v vccq for supporting
+	 * DDR mode.
+	 *
+	 * So the sequence will be:
+	 * if (host and device can both support 1.2v IO)
+	 *	use 1.2v IO;
+	 * else if (host and device can both support 1.8v IO)
+	 * 	use 1.8v IO;
+	 * so if host and device can only support 3.3v IO, this is the
+	 * last choice.
 	 *
 	 * WARNING: eMMC rules are NOT the same as SD DDR
 	 */
@@ -998,6 +1009,11 @@ static int mmc_select_hs_ddr(struct mmc_card *card)
 				MMC_SIGNAL_VOLTAGE_120);
 		if (err)
 			return err;
+	} else if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_8V) {
+		err = __mmc_set_signal_voltage(host,
+				MMC_SIGNAL_VOLTAGE_180);
+		if (err)
+			return err;
 	}
 
 	mmc_set_timing(host, MMC_TIMING_MMC_DDR52);
Signature · 1 line
1.7.10.4
#1 lore raw
Quoted 49 lines · Chuanxiao Dong

Even (e)MMC card can support 3.3v to 1.2v vccq in DDR, but not all host controller can support this, like some of the SDHCI host which connect to an eMMC device. Some of these host controller still needs to use 1.8v vccq for supporting DDR mode.

So the sequence will be:
if (host and device can both support 1.2v IO)

        use 1.2v IO;
else if (host and device can both support 1.8v IO)
        use 1.8v IO;

so if host and device can only support 3.3v IO, this is the last choice.

---
Changelog V2:
- For (e)MMC device switching to DDR mode, try 1.2v singaling first. Then try 1.8v. If 1.2v and 1.8v are both not supported, use the default 3.3v

 drivers/mmc/core/mmc.c |   20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)
drivers/mmc/core/mmc.c +13 -2
index 793c6f7..aa5180b 100644
@@ -988,8 +988,19 @@ static int mmc_select_hs_ddr(struct mmc_card *card)
         * 1.8V vccq at 3.3V core voltage (vcc) is not required
         * in the JEDEC spec for DDR.
         *
-        * Do not force change in vccq since we are obviously
-        * working and no change to vccq is needed.
+        * Even (e)MMC card can support 3.3v to 1.2v vccq, but not all
+        * host controller can support this, like some of the SDHCI
+        * controller which connect to an eMMC device. Some of these
+        * host controller still needs to use 1.8v vccq for supporting
+        * DDR mode.
+        *
+        * So the sequence will be:
+        * if (host and device can both support 1.2v IO)
+        *      use 1.2v IO;
+        * else if (host and device can both support 1.8v IO)
+        *      use 1.8v IO;
+        * so if host and device can only support 3.3v IO, this is the
+        * last choice.
         *
         * WARNING: eMMC rules are NOT the same as SD DDR
         */

drivers/mmc/core/mmc.c static int mmc_select_hs_ddr(struct mmc_card *card) · line 1012

Quoted 4 lines
drivers/mmc/core/mmc.c +1 -0
@@ -998,6 +1009,11 @@ static int mmc_select_hs_ddr(struct mmc_card *card)
                                MMC_SIGNAL_VOLTAGE_120);
                if (err)
                        return err;
+       } else if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_8V) {

If we encounter errors switching to 1.2V, it would be nice to fall back and to test with 1.8V.

You may get influenced by the code in mmc_select_hs200(), where a similar approach is taken.

Quoted 10 lines
drivers/mmc/core/mmc.c +4 -1
+               err = __mmc_set_signal_voltage(host,
+                               MMC_SIGNAL_VOLTAGE_180);
+               if (err)
+                       return err;
        }
 
        mmc_set_timing(host, MMC_TIMING_MMC_DDR52);
--

1.7.10.4

Kind regards
Uffe