Commit 312449ef authored by Chuanxiao.Dong's avatar Chuanxiao.Dong Committed by Ulf Hansson

mmc: core: Fix sequence for I/O voltage in DDR mode for eMMC

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.
Signed-off-by: default avatarChuanxiao Dong <chuanxiao.dong@intel.com>
Signed-off-by: default avatarYunpeng Gao <yunpeng.gao@intel.com>
Tested-by: default avatarJean-Michel Hautbois <jhautbois@gmail.com>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent e7370819
...@@ -988,18 +988,34 @@ static int mmc_select_hs_ddr(struct mmc_card *card) ...@@ -988,18 +988,34 @@ static int mmc_select_hs_ddr(struct mmc_card *card)
* 1.8V vccq at 3.3V core voltage (vcc) is not required * 1.8V vccq at 3.3V core voltage (vcc) is not required
* in the JEDEC spec for DDR. * in the JEDEC spec for DDR.
* *
* Do not force change in vccq since we are obviously * Even (e)MMC card can support 3.3v to 1.2v vccq, but not all
* working and no change to vccq is needed. * 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 * WARNING: eMMC rules are NOT the same as SD DDR
*/ */
if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_2V) { err = -EINVAL;
err = __mmc_set_signal_voltage(host, if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_2V)
MMC_SIGNAL_VOLTAGE_120); err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120);
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) if (err)
return err; err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330);
}
if (!err)
mmc_set_timing(host, MMC_TIMING_MMC_DDR52); mmc_set_timing(host, MMC_TIMING_MMC_DDR52);
return err; return err;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment