mmc: sdhci: Deal with failure case in sdhci_suspend_host

If there are errors happened in sdhci_suspend_host, handle it so that
when the function returns with an error, the host's behaviour is the
same before this function call, e.g. card detection is enabled and
tuning timer is active, etc.

Signed-off-by: Philip Rakity <[email protected]>
Signed-off-by: Aaron Lu <[email protected]>
Cc: Adrian Hunter <[email protected]>
Signed-off-by: Chris Ball <[email protected]>
This commit is contained in:
Aaron Lu 2012-01-04 10:07:43 +08:00 • committed by Chris Ball
commit 38a60ea2e7

View file

@ -2349,19 +2349,30 @@ out:
int sdhci_suspend_host(struct sdhci_host *host)
{
int ret;
bool has_tuning_timer;
sdhci_disable_card_detection(host);
/* Disable tuning since we are suspending */
if (host->version >= SDHCI_SPEC_300 && host->tuning_count &&
host->tuning_mode == SDHCI_TUNING_MODE_1) {
has_tuning_timer = host->version >= SDHCI_SPEC_300 &&
host->tuning_count && host->tuning_mode == SDHCI_TUNING_MODE_1;
if (has_tuning_timer) {
del_timer_sync(&host->tuning_timer);
host->flags &= ~SDHCI_NEEDS_RETUNING;
}
ret = mmc_suspend_host(host->mmc);
if (ret)
if (ret) {
if (has_tuning_timer) {
host->flags |= SDHCI_NEEDS_RETUNING;
mod_timer(&host->tuning_timer, jiffies +
host->tuning_count * HZ);
}
sdhci_enable_card_detection(host);
return ret;
}
free_irq(host->irq, host);