mmc: core: support DDR52 bus-speed during eMMC clock scaling

Add support for DDR52 bus-speed mode during clock scaling.
The reason for this change is DDR52 can be supported at SVS
mode.

Change-Id: I68e5fca57ae5cbc154f5dd7001df368900cb3f57
Signed-off-by: Asutosh Das <asutoshd@codeaurora.org>
This commit is contained in:
Asutosh Das 2015-12-09 10:48:18 +05:30 committed by Subhash Jadavani
parent bad8692dfc
commit f47dba1b31
2 changed files with 32 additions and 2 deletions

View file

@ -1550,6 +1550,24 @@ out:
return ret;
}
static int mmc_select_hs_ddr52(struct mmc_host *host)
{
int err;
mmc_select_hs(host->card);
mmc_set_clock(host, MMC_HIGH_52_MAX_DTR);
err = mmc_select_bus_width(host->card);
if (err < 0) {
pr_err("%s: %s: select_bus_width failed(%d)\n",
mmc_hostname(host), __func__, err);
return err;
}
err = mmc_select_hs_ddr(host->card);
return err;
}
/*
* Scale down from HS400 to HS in order to allow frequency change.
* This is needed for cards that doesn't support changing frequency in HS400
@ -1561,10 +1579,20 @@ static int mmc_scale_low(struct mmc_host *host, unsigned long freq)
mmc_set_timing(host, MMC_TIMING_LEGACY);
mmc_set_clock(host, MMC_HIGH_26_MAX_DTR);
if (host->clk_scaling.lower_bus_speed_mode &
MMC_SCALING_LOWER_DDR52_MODE) {
err = mmc_select_hs_ddr52(host);
if (err)
pr_err("%s: %s: failed to switch to DDR52: err: %d\n",
mmc_hostname(host), __func__, err);
else
return err;
}
err = mmc_select_hs(host->card);
if (err) {
pr_err("%s: %s: selecting HS (52Mhz) failed (%d)\n",
mmc_hostname(host), __func__, err);
pr_err("%s: %s: scaling low: failed (%d)\n",
mmc_hostname(host), __func__, err);
return err;
}

View file

@ -335,6 +335,8 @@ struct mmc_devfeq_clk_scaling {
unsigned long polling_delay_ms;
unsigned int upthreshold;
unsigned int downthreshold;
unsigned int lower_bus_speed_mode;
#define MMC_SCALING_LOWER_DDR52_MODE 1
bool need_freq_change;
bool clk_scaling_in_progress;
bool is_busy_started;