Merge "mmc: core: Return error if fallback to lower speed mode fails"
This commit is contained in:
commit
b1281c202f
2 changed files with 12 additions and 7 deletions
|
@ -464,10 +464,11 @@ out:
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(mmc_clk_update_freq);
|
EXPORT_SYMBOL(mmc_clk_update_freq);
|
||||||
|
|
||||||
void mmc_recovery_fallback_lower_speed(struct mmc_host *host)
|
int mmc_recovery_fallback_lower_speed(struct mmc_host *host)
|
||||||
{
|
{
|
||||||
|
int err = 0;
|
||||||
if (!host->card)
|
if (!host->card)
|
||||||
return;
|
return -EINVAL;
|
||||||
|
|
||||||
if (host->sdr104_wa && mmc_card_sd(host->card) &&
|
if (host->sdr104_wa && mmc_card_sd(host->card) &&
|
||||||
(host->ios.timing == MMC_TIMING_UHS_SDR104) &&
|
(host->ios.timing == MMC_TIMING_UHS_SDR104) &&
|
||||||
|
@ -475,9 +476,14 @@ void mmc_recovery_fallback_lower_speed(struct mmc_host *host)
|
||||||
pr_err("%s: %s: blocked SDR104, lower the bus-speed (SDR50 / DDR50)\n",
|
pr_err("%s: %s: blocked SDR104, lower the bus-speed (SDR50 / DDR50)\n",
|
||||||
mmc_hostname(host), __func__);
|
mmc_hostname(host), __func__);
|
||||||
mmc_host_clear_sdr104(host);
|
mmc_host_clear_sdr104(host);
|
||||||
mmc_hw_reset(host);
|
err = mmc_hw_reset(host);
|
||||||
host->card->sdr104_blocked = true;
|
host->card->sdr104_blocked = true;
|
||||||
}
|
}
|
||||||
|
if (err)
|
||||||
|
pr_err("%s: %s: Fallback to lower speed mode failed with err=%d\n",
|
||||||
|
mmc_hostname(host), __func__, err);
|
||||||
|
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mmc_devfreq_set_target(struct device *dev,
|
static int mmc_devfreq_set_target(struct device *dev,
|
||||||
|
@ -545,7 +551,7 @@ static int mmc_devfreq_set_target(struct device *dev,
|
||||||
if (err && err != -EAGAIN) {
|
if (err && err != -EAGAIN) {
|
||||||
pr_err("%s: clock scale to %lu failed with error %d\n",
|
pr_err("%s: clock scale to %lu failed with error %d\n",
|
||||||
mmc_hostname(host), *freq, err);
|
mmc_hostname(host), *freq, err);
|
||||||
mmc_recovery_fallback_lower_speed(host);
|
err = mmc_recovery_fallback_lower_speed(host);
|
||||||
} else {
|
} else {
|
||||||
pr_debug("%s: clock change to %lu finished successfully (%s)\n",
|
pr_debug("%s: clock change to %lu finished successfully (%s)\n",
|
||||||
mmc_hostname(host), *freq, current->comm);
|
mmc_hostname(host), *freq, current->comm);
|
||||||
|
@ -4121,8 +4127,7 @@ int _mmc_detect_card_removed(struct mmc_host *host)
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
if (host->ops->get_cd && host->ops->get_cd(host)) {
|
if (host->ops->get_cd && host->ops->get_cd(host)) {
|
||||||
mmc_recovery_fallback_lower_speed(host);
|
ret = mmc_recovery_fallback_lower_speed(host);
|
||||||
ret = 0;
|
|
||||||
} else {
|
} else {
|
||||||
mmc_card_set_removed(host->card);
|
mmc_card_set_removed(host->card);
|
||||||
if (host->card->sdr104_blocked) {
|
if (host->card->sdr104_blocked) {
|
||||||
|
|
|
@ -224,7 +224,7 @@ extern void mmc_cmdq_clk_scaling_start_busy(struct mmc_host *host,
|
||||||
bool lock_needed);
|
bool lock_needed);
|
||||||
extern void mmc_cmdq_clk_scaling_stop_busy(struct mmc_host *host,
|
extern void mmc_cmdq_clk_scaling_stop_busy(struct mmc_host *host,
|
||||||
bool lock_needed, bool is_cmdq_dcmd);
|
bool lock_needed, bool is_cmdq_dcmd);
|
||||||
extern void mmc_recovery_fallback_lower_speed(struct mmc_host *host);
|
extern int mmc_recovery_fallback_lower_speed(struct mmc_host *host);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* mmc_claim_host - exclusively claim a host
|
* mmc_claim_host - exclusively claim a host
|
||||||
|
|
Loading…
Add table
Reference in a new issue