|
@@ -1043,6 +1043,7 @@ static int mmc_select_hs_ddr(struct mmc_card *card)
|
|
|
static int mmc_select_hs400(struct mmc_card *card)
|
|
|
{
|
|
|
struct mmc_host *host = card->host;
|
|
|
+ unsigned int max_dtr;
|
|
|
int err = 0;
|
|
|
u8 val;
|
|
|
|
|
@@ -1053,13 +1054,11 @@ static int mmc_select_hs400(struct mmc_card *card)
|
|
|
host->ios.bus_width == MMC_BUS_WIDTH_8))
|
|
|
return 0;
|
|
|
|
|
|
- /*
|
|
|
- * Before switching to dual data rate operation for HS400,
|
|
|
- * it is required to convert from HS200 mode to HS mode.
|
|
|
- */
|
|
|
- mmc_set_timing(card->host, MMC_TIMING_MMC_HS);
|
|
|
- mmc_set_bus_speed(card);
|
|
|
+ /* Reduce frequency to HS frequency */
|
|
|
+ max_dtr = card->ext_csd.hs_max_dtr;
|
|
|
+ mmc_set_clock(host, max_dtr);
|
|
|
|
|
|
+ /* Switch card to HS mode */
|
|
|
val = EXT_CSD_TIMING_HS |
|
|
|
card->drive_strength << EXT_CSD_DRV_STR_SHIFT;
|
|
|
err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
|
|
@@ -1072,6 +1071,9 @@ static int mmc_select_hs400(struct mmc_card *card)
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+ /* Set host controller to HS timing */
|
|
|
+ mmc_set_timing(card->host, MMC_TIMING_MMC_HS);
|
|
|
+
|
|
|
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
|
|
|
EXT_CSD_BUS_WIDTH,
|
|
|
EXT_CSD_DDR_BUS_WIDTH_8,
|