@@ -1333,7 +1333,7 @@ static int mmc_select_hs400es(struct mmc_card *card)
return err;
}
-static int mmc_select_hs400(struct mmc_card *card)
+static int mmc_select_hs400(struct mmc_card *card, bool enhancedstrobe)
{
struct mmc_host *host = card->host;
unsigned int max_dtr;
@@ -1409,9 +1409,12 @@ static int mmc_select_hs400(struct mmc_card *card)
host->ops->hs400_prepare_ddr(host);
/* Switch card to DDR */
+ val = EXT_CSD_DDR_BUS_WIDTH_8;
+ if (enhancedstrobe)
+ val |= EXT_CSD_BUS_WIDTH_STROBE;
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
EXT_CSD_BUS_WIDTH,
- EXT_CSD_DDR_BUS_WIDTH_8,
+ val,
card->ext_csd.generic_cmd6_time);
if (err) {
pr_err("%s: switch to bus width for hs400 failed, err:%d\n",
@@ -1451,6 +1454,13 @@ static int mmc_select_hs400(struct mmc_card *card)
if (host->ops->hs400_complete)
host->ops->hs400_complete(host);
+ if (enhancedstrobe) {
+ /* Controller enable enhanced strobe function */
+ host->ios.enhanced_strobe = true;
+ if (host->ops->hs400_enhanced_strobe)
+ host->ops->hs400_enhanced_strobe(host, &host->ios);
+ }
+
err = mmc_switch_status(card, true);
if (err)
goto out_err;
@@ -1465,7 +1475,7 @@ static int mmc_select_hs400(struct mmc_card *card)
int mmc_hs200_to_hs400(struct mmc_card *card)
{
- return mmc_select_hs400(card);
+ return mmc_select_hs400(card, false);
}
/*
@@ -1549,9 +1559,9 @@ static int mmc_select_timing(struct mmc_card *card)
goto bus_speed;
if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400ES)
- err = mmc_select_hs400es(card);
+ err = mmc_select_hs400(card, true);
else if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400)
- err = mmc_select_hs400(card);
+ err = mmc_select_hs400(card, false);
else if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200)
err = mmc_select_hs200(card);
else if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS)
Function mmc_select_hs400() and mmc_select_hs400es have almost identical code it seems okay to merge them. Add the function calls for enhanced strobe to mmc_select_hs400 and add a bool variable to the function call to enable them if HS400ES is selected. mmc_select_hs400es() becomes obsolate and can be removed. Signed-off-by: Chris Ruehl <chris.ruehl@gtsys.com.hk> --- drivers/mmc/core/mmc.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-)