|
@@ -988,19 +988,35 @@ 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
|
|
|
*/
|
|
|
- if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_2V) {
|
|
|
- err = __mmc_set_signal_voltage(host,
|
|
|
- MMC_SIGNAL_VOLTAGE_120);
|
|
|
- if (err)
|
|
|
- return err;
|
|
|
- }
|
|
|
+ err = -EINVAL;
|
|
|
+ if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_2V)
|
|
|
+ err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120);
|
|
|
|
|
|
- mmc_set_timing(host, MMC_TIMING_MMC_DDR52);
|
|
|
+ if (err && (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_8V))
|
|
|
+ err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180);
|
|
|
+
|
|
|
+ /* make sure vccq is 3.3v after switching disaster */
|
|
|
+ if (err)
|
|
|
+ err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330);
|
|
|
+
|
|
|
+ if (!err)
|
|
|
+ mmc_set_timing(host, MMC_TIMING_MMC_DDR52);
|
|
|
|
|
|
return err;
|
|
|
}
|