aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Hansson <ulf.hansson@linaro.org>2014-01-22 19:11:33 -0500
committerUlf Hansson <ulf.hansson@linaro.org>2014-05-12 06:52:35 -0400
commitf3737fa388388bc864bc63b1c70e3679fe839a52 (patch)
treec3bb114e3ceb93da5145452d1961d1f73a6bbf19
parent571dce4f105cf2b8e57ec4330da71bd0cb6d38bb (diff)
mmc: mmci: Put the device into low power state at system suspend
For CONFIG_PM_SLEEP, the device were always left in full power state after system suspend. We solely relied on a power domain to put it into low power state, which is an unreasonable requirement to put on SOCs to implement. Especially for those SOCs not supporting power domains at all. Use pm_runtime_force_suspend|resume() as the system suspend callbacks, to resolve the issue. Cc: Russell King <linux@arm.linux.org.uk> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
-rw-r--r--drivers/mmc/host/mmci.c33
1 files changed, 2 insertions, 31 deletions
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c
index eb23c89b2717..a40bf70170fd 100644
--- a/drivers/mmc/host/mmci.c
+++ b/drivers/mmc/host/mmci.c
@@ -1759,36 +1759,6 @@ static int mmci_remove(struct amba_device *dev)
1759 return 0; 1759 return 0;
1760} 1760}
1761 1761
1762#ifdef CONFIG_SUSPEND
1763static int mmci_suspend(struct device *dev)
1764{
1765 struct amba_device *adev = to_amba_device(dev);
1766 struct mmc_host *mmc = amba_get_drvdata(adev);
1767
1768 if (mmc) {
1769 struct mmci_host *host = mmc_priv(mmc);
1770 pm_runtime_get_sync(dev);
1771 writel(0, host->base + MMCIMASK0);
1772 }
1773
1774 return 0;
1775}
1776
1777static int mmci_resume(struct device *dev)
1778{
1779 struct amba_device *adev = to_amba_device(dev);
1780 struct mmc_host *mmc = amba_get_drvdata(adev);
1781
1782 if (mmc) {
1783 struct mmci_host *host = mmc_priv(mmc);
1784 writel(MCI_IRQENABLE, host->base + MMCIMASK0);
1785 pm_runtime_put(dev);
1786 }
1787
1788 return 0;
1789}
1790#endif
1791
1792#ifdef CONFIG_PM 1762#ifdef CONFIG_PM
1793static void mmci_save(struct mmci_host *host) 1763static void mmci_save(struct mmci_host *host)
1794{ 1764{
@@ -1856,7 +1826,8 @@ static int mmci_runtime_resume(struct device *dev)
1856#endif 1826#endif
1857 1827
1858static const struct dev_pm_ops mmci_dev_pm_ops = { 1828static const struct dev_pm_ops mmci_dev_pm_ops = {
1859 SET_SYSTEM_SLEEP_PM_OPS(mmci_suspend, mmci_resume) 1829 SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
1830 pm_runtime_force_resume)
1860 SET_PM_RUNTIME_PM_OPS(mmci_runtime_suspend, mmci_runtime_resume, NULL) 1831 SET_PM_RUNTIME_PM_OPS(mmci_runtime_suspend, mmci_runtime_resume, NULL)
1861}; 1832};
1862 1833