aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVaibhav Bedia <vaibhav.bedia@ti.com>2012-09-13 02:31:03 -0400
committerChris Ball <cjb@laptop.org>2012-10-03 10:05:23 -0400
commitc4c8eeb4df00aabb641553d6fbcd46f458e56cd9 (patch)
treedd84f6f75a64613b6d65e6ad7b2b7941a9a8eab8
parent6bf2af8cd2cb35f6098953a33b9a160a4ca0b626 (diff)
mmc: omap_hsmmc: Pass on the suspend failure to the PM core
In some cases mmc_suspend_host() is not able to claim the host and proceed with the suspend process. The core returns -EBUSY to the host controller driver. Unfortunately, the host controller driver does not pass on this information to the PM core and hence the system suspend process continues. ret = mmc_suspend_host(host->mmc); if (ret) { host->suspended = 0; if (host->pdata->resume) { ret = host->pdata->resume(dev, host->slot_id); The return status from mmc_suspend_host() is overwritten by return status from host->pdata->resume. So the original return status is lost. In these cases the MMC core gets to an unexpected state during resume and multiple issues related to MMC crop up. 1. Host controller driver starts accessing the device registers before the clocks are enabled which leads to a prefetch abort. 2. A file copy thread which was launched before suspend gets stuck due to the host not being reclaimed during resume. To avoid such problems pass on the -EBUSY status to the PM core from the host controller driver. With this change, MMC core suspend might still fail but it does not end up making the system unusable. Suspend gets aborted and the user can try suspending the system again. Signed-off-by: Vaibhav Bedia <vaibhav.bedia@ti.com> Signed-off-by: Hebbar, Gururaja <gururaja.hebbar@ti.com> Acked-by: Venkatraman S <svenkatr@ti.com> Cc: stable <stable@vger.kernel.org> Signed-off-by: Chris Ball <cjb@laptop.org>
-rw-r--r--drivers/mmc/host/omap_hsmmc.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 9afdd202b873..d9af5f1463aa 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -2050,8 +2050,7 @@ static int omap_hsmmc_suspend(struct device *dev)
2050 if (ret) { 2050 if (ret) {
2051 host->suspended = 0; 2051 host->suspended = 0;
2052 if (host->pdata->resume) { 2052 if (host->pdata->resume) {
2053 ret = host->pdata->resume(dev, host->slot_id); 2053 if (host->pdata->resume(dev, host->slot_id))
2054 if (ret)
2055 dev_dbg(dev, "Unmask interrupt failed\n"); 2054 dev_dbg(dev, "Unmask interrupt failed\n");
2056 } 2055 }
2057 goto err; 2056 goto err;