> -----Original Message----- > From: Ulf Hansson [mailto:ulf.hansson@xxxxxxxxxx] > Sent: Friday, August 15, 2014 4:34 PM > To: Dong, Chuanxiao > Cc: linux-mmc; chris@xxxxxxxxxx > Subject: Re: [PATCH v3] mmc: core: try 1.8v signling in ddr mode if host and > device > > On 15 August 2014 05:28, Chuanxiao Dong <chuanxiao.dong@xxxxxxxxx> > 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 <chuanxiao.dong@xxxxxxxxx> > > Signed-off-by: Yunpeng Gao <yunpeng.gao@xxxxxxxxx> > > 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. Thanks a lot. BTW, this patch is already tested on Intel's platform which can support MMC DDR. Thanks Chuanxiao > > 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 > > ��.n��������+%������w��{.n�����{��i��)��jg��������ݢj����G�������j:+v���w�m������w�������h�����٥