diff mbox

[RFC] sdhci: suspend code correct ?

Message ID 8E5F1A83-6949-4B4C-9482-30D582B7C54C@marvell.com (mailing list archive)
State New, archived
Headers show

Commit Message

Philip Rakity June 23, 2011, 12:09 a.m. UTC
Looking at suspend in sdhci.c, it appears it does not handle errors correctly.

If suspend has an error shouldn't the code put things back to the state they were in before the suspend ?
If we are suspending then it is not clear why we need to run the re-tune timer.  resume will cause a re-tuning.

comments please.

One other issue not addressed in the code below is what error code is supposed to be returned if say sdhci-pxav3.c 
detects that it cannot suspend because it detects say dma active?  -EBUSY ?    Will the suspend code retry or should
the sdhci-pxa code wait for the dma to complete ?

Philip


the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 91d9892..9c85d6d 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -2224,20 +2224,28 @@  out:
 int sdhci_suspend_host(struct sdhci_host *host, pm_message_t state)
 {
       int ret;
+       int cantune = 0;

       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) {
-               host->flags &= ~SDHCI_NEEDS_RETUNING;
-               mod_timer(&host->tuning_timer, jiffies +
-                       host->tuning_count * HZ);
+               host->tuning_mode == SDHCI_TUNING_MODE_1) {
+                       host->flags &= ~SDHCI_NEEDS_RETUNING;
+                       del_timer_sync(&host->tuning_timer);
+                       cantune= 1;
       }

       ret = mmc_suspend_host(host->mmc);
-       if (ret)
+       if (ret) {
+               if (cantune) {
+                       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);--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in