mmc: core: try 1.8v signaling in ddr mode if host and device
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
@@ -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
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.
Signed-off-by Chuanxiao Dong <[email protected]>Signed-off-by Yunpeng Gao <[email protected]>---
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.3vdrivers/mmc/core/mmc.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-)drivers/mmc/core/mmc.c +13
-2@@ -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