]> git.karo-electronics.de Git - linux-beck.git/commitdiff
mmc: sdhci: Deal with failure case in sdhci_suspend_host
authorAaron Lu <aaron.lu@amd.com>
Wed, 4 Jan 2012 02:07:43 +0000 (10:07 +0800)
committerChris Ball <cjb@laptop.org>
Thu, 12 Jan 2012 20:17:08 +0000 (15:17 -0500)
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>
drivers/mmc/host/sdhci.c

index 3d338b4b416af47ebcdfc3c9e59bfbe6a0a42ef7..0636e9a587b1283ed6c673cae2133c82f1398348 100644 (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);