Commit 966d696a authored by Adrian Hunter's avatar Adrian Hunter Committed by Ulf Hansson

mmc: sdhci-pci: Add runtime suspend/resume callbacks

Add runtime suspend/resume callbacks to match suspend/resume callbacks.
Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
Tested-by: default avatarLudovic Desroches <ludovic.desroches@microchip.com>
parent 30cf2803
...@@ -119,6 +119,56 @@ int sdhci_pci_resume_host(struct sdhci_pci_chip *chip) ...@@ -119,6 +119,56 @@ int sdhci_pci_resume_host(struct sdhci_pci_chip *chip)
} }
#endif #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 * * Hardware specific quirk handling *
...@@ -1796,61 +1846,29 @@ static int sdhci_pci_resume(struct device *dev) ...@@ -1796,61 +1846,29 @@ static int sdhci_pci_resume(struct device *dev)
static int sdhci_pci_runtime_suspend(struct device *dev) static int sdhci_pci_runtime_suspend(struct device *dev)
{ {
struct pci_dev *pdev = to_pci_dev(dev); struct pci_dev *pdev = to_pci_dev(dev);
struct sdhci_pci_chip *chip; struct sdhci_pci_chip *chip = pci_get_drvdata(pdev);
struct sdhci_pci_slot *slot;
struct sdhci_host *host;
int i, ret;
chip = pci_get_drvdata(pdev);
if (!chip) if (!chip)
return 0; return 0;
for (i = 0; i < chip->num_slots; i++) { if (chip->fixes && chip->fixes->runtime_suspend)
slot = chip->slots[i]; return chip->fixes->runtime_suspend(chip);
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: return sdhci_pci_runtime_suspend_host(chip);
while (--i >= 0)
sdhci_runtime_resume_host(chip->slots[i]->host);
return ret;
} }
static int sdhci_pci_runtime_resume(struct device *dev) static int sdhci_pci_runtime_resume(struct device *dev)
{ {
struct pci_dev *pdev = to_pci_dev(dev); struct pci_dev *pdev = to_pci_dev(dev);
struct sdhci_pci_chip *chip; struct sdhci_pci_chip *chip = pci_get_drvdata(pdev);
struct sdhci_pci_slot *slot;
int i, ret;
chip = pci_get_drvdata(pdev);
if (!chip) if (!chip)
return 0; return 0;
for (i = 0; i < chip->num_slots; i++) { if (chip->fixes && chip->fixes->runtime_resume)
slot = chip->slots[i]; return chip->fixes->runtime_resume(chip);
if (!slot)
continue;
ret = sdhci_runtime_resume_host(slot->host); return sdhci_pci_runtime_resume_host(chip);
if (ret)
return ret;
}
return 0;
} }
#endif #endif
......
...@@ -71,6 +71,10 @@ struct sdhci_pci_fixes { ...@@ -71,6 +71,10 @@ struct sdhci_pci_fixes {
int (*suspend) (struct sdhci_pci_chip *); int (*suspend) (struct sdhci_pci_chip *);
int (*resume) (struct sdhci_pci_chip *); int (*resume) (struct sdhci_pci_chip *);
#endif #endif
#ifdef CONFIG_PM
int (*runtime_suspend) (struct sdhci_pci_chip *);
int (*runtime_resume) (struct sdhci_pci_chip *);
#endif
const struct sdhci_ops *ops; const struct sdhci_ops *ops;
size_t priv_size; size_t priv_size;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment