mmc: sdhci-pci: Add runtime suspend/resume callbacks
authorAdrian Hunter <adrian.hunter@intel.com>
Mon, 20 Mar 2017 17:50:52 +0000 (19:50 +0200)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 24 Apr 2017 19:41:39 +0000 (21:41 +0200)
Add runtime suspend/resume callbacks to match suspend/resume callbacks.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Ludovic Desroches <ludovic.desroches@microchip.com>
drivers/mmc/host/sdhci-pci-core.c
drivers/mmc/host/sdhci-pci.h

index 5ed8369704fd14e81fb1fc12b625848976e94eb7..d9a38c53e2baedfe517d153bba75bccaa640bdd5 100644 (file)
@@ -119,6 +119,56 @@ int sdhci_pci_resume_host(struct sdhci_pci_chip *chip)
 }
 #endif
 
+#ifdef CONFIG_PM
+static int sdhci_pci_runtime_suspend_host(struct sdhci_pci_chip *chip)
+{
+       struct sdhci_pci_slot *slot;
+       struct sdhci_host *host;
+       int i, ret;
+
+       for (i = 0; i < chip->num_slots; i++) {
+               slot = chip->slots[i];
+               if (!slot)
+                       continue;
+
+               host = slot->host;
+
+               ret = sdhci_runtime_suspend_host(host);
+               if (ret)
+                       goto err_pci_runtime_suspend;
+
+               if (chip->rpm_retune &&
+                   host->tuning_mode != SDHCI_TUNING_MODE_3)
+                       mmc_retune_needed(host->mmc);
+       }
+
+       return 0;
+
+err_pci_runtime_suspend:
+       while (--i >= 0)
+               sdhci_runtime_resume_host(chip->slots[i]->host);
+       return ret;
+}
+
+static int sdhci_pci_runtime_resume_host(struct sdhci_pci_chip *chip)
+{
+       struct sdhci_pci_slot *slot;
+       int i, ret;
+
+       for (i = 0; i < chip->num_slots; i++) {
+               slot = chip->slots[i];
+               if (!slot)
+                       continue;
+
+               ret = sdhci_runtime_resume_host(slot->host);
+               if (ret)
+                       return ret;
+       }
+
+       return 0;
+}
+#endif
+
 /*****************************************************************************\
  *                                                                           *
  * Hardware specific quirk handling                                          *
@@ -1796,61 +1846,29 @@ static int sdhci_pci_resume(struct device *dev)
 static int sdhci_pci_runtime_suspend(struct device *dev)
 {
        struct pci_dev *pdev = to_pci_dev(dev);
-       struct sdhci_pci_chip *chip;
-       struct sdhci_pci_slot *slot;
-       struct sdhci_host *host;
-       int i, ret;
+       struct sdhci_pci_chip *chip = pci_get_drvdata(pdev);
 
-       chip = pci_get_drvdata(pdev);
        if (!chip)
                return 0;
 
-       for (i = 0; i < chip->num_slots; i++) {
-               slot = chip->slots[i];
-               if (!slot)
-                       continue;
-
-               host = slot->host;
-
-               ret = sdhci_runtime_suspend_host(host);
-               if (ret)
-                       goto err_pci_runtime_suspend;
-
-               if (chip->rpm_retune &&
-                   host->tuning_mode != SDHCI_TUNING_MODE_3)
-                       mmc_retune_needed(host->mmc);
-       }
-
-       return 0;
+       if (chip->fixes && chip->fixes->runtime_suspend)
+               return chip->fixes->runtime_suspend(chip);
 
-err_pci_runtime_suspend:
-       while (--i >= 0)
-               sdhci_runtime_resume_host(chip->slots[i]->host);
-       return ret;
+       return sdhci_pci_runtime_suspend_host(chip);
 }
 
 static int sdhci_pci_runtime_resume(struct device *dev)
 {
        struct pci_dev *pdev = to_pci_dev(dev);
-       struct sdhci_pci_chip *chip;
-       struct sdhci_pci_slot *slot;
-       int i, ret;
+       struct sdhci_pci_chip *chip = pci_get_drvdata(pdev);
 
-       chip = pci_get_drvdata(pdev);
        if (!chip)
                return 0;
 
-       for (i = 0; i < chip->num_slots; i++) {
-               slot = chip->slots[i];
-               if (!slot)
-                       continue;
+       if (chip->fixes && chip->fixes->runtime_resume)
+               return chip->fixes->runtime_resume(chip);
 
-               ret = sdhci_runtime_resume_host(slot->host);
-               if (ret)
-                       return ret;
-       }
-
-       return 0;
+       return sdhci_pci_runtime_resume_host(chip);
 }
 #endif
 
index ec8f91c403d630ccd4a16e128a443ee982c29826..37766d20a600a3b78f03f735acf631e3136cbcf9 100644 (file)
@@ -71,6 +71,10 @@ struct sdhci_pci_fixes {
        int                     (*suspend) (struct sdhci_pci_chip *);
        int                     (*resume) (struct sdhci_pci_chip *);
 #endif
+#ifdef CONFIG_PM
+       int                     (*runtime_suspend) (struct sdhci_pci_chip *);
+       int                     (*runtime_resume) (struct sdhci_pci_chip *);
+#endif
 
        const struct sdhci_ops  *ops;
        size_t                  priv_size;