On 15 August 2014 05:28, Chuanxiao Dong <[email protected]> wrote:
> 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: Chuanxiao Dong <[email protected]>
> Signed-off-by: Yunpeng Gao <[email protected]>
This looks good to me! But before I queue it for 3.18 I would
appreciate if we could get some help in testing this for some various
platforms, that support MMC DDR.
Kind regards
Uffe
> ---
> 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
>
> Changelog V3:
> - continue to try 1.8v/3.3v vccq if there is IO voltage switching failure
>
> drivers/mmc/core/mmc.c | 34 +++++++++++++++++++++++++---------
> 1 file changed, 25 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
> index 793c6f7..8d69671 100644
> --- a/drivers/mmc/core/mmc.c
> +++ b/drivers/mmc/core/mmc.c
> @@ -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;
> }
> --
> 1.7.10.4
>
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html