[RFC] sdhci: suspend code correct ?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


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
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux