Skip to content

Commit

Permalink
mmc: sdhci: Deal with failure case in sdhci_suspend_host
Browse files Browse the repository at this point in the history
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 <prakity@marvell.com>
Signed-off-by: Aaron Lu <aaron.lu@amd.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Chris Ball <cjb@laptop.org>
  • Loading branch information
Aaron Lu authored and Chris Ball committed Jan 12, 2012
1 parent 3f51429 commit 38a60ea
Showing 1 changed file with 14 additions and 3 deletions.
17 changes: 14 additions & 3 deletions drivers/mmc/host/sdhci.c
Original file line number Diff line number Diff line change
Expand Up @@ -2349,19 +2349,30 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id)
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);

Expand Down

0 comments on commit 38a60ea

Please sign in to comment.