|
@@ -2070,6 +2070,25 @@ static int __devexit omap_hsmmc_remove(struct platform_device *pdev)
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_PM
|
|
|
+static int omap_hsmmc_prepare(struct device *dev)
|
|
|
+{
|
|
|
+ struct omap_hsmmc_host *host = dev_get_drvdata(dev);
|
|
|
+
|
|
|
+ if (host->pdata->suspend)
|
|
|
+ return host->pdata->suspend(dev, host->slot_id);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static void omap_hsmmc_complete(struct device *dev)
|
|
|
+{
|
|
|
+ struct omap_hsmmc_host *host = dev_get_drvdata(dev);
|
|
|
+
|
|
|
+ if (host->pdata->resume)
|
|
|
+ host->pdata->resume(dev, host->slot_id);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
static int omap_hsmmc_suspend(struct device *dev)
|
|
|
{
|
|
|
int ret = 0;
|
|
@@ -2083,23 +2102,10 @@ static int omap_hsmmc_suspend(struct device *dev)
|
|
|
|
|
|
pm_runtime_get_sync(host->dev);
|
|
|
host->suspended = 1;
|
|
|
- if (host->pdata->suspend) {
|
|
|
- ret = host->pdata->suspend(dev, host->slot_id);
|
|
|
- if (ret) {
|
|
|
- dev_dbg(dev, "Unable to handle MMC board"
|
|
|
- " level suspend\n");
|
|
|
- host->suspended = 0;
|
|
|
- return ret;
|
|
|
- }
|
|
|
- }
|
|
|
ret = mmc_suspend_host(host->mmc);
|
|
|
|
|
|
if (ret) {
|
|
|
host->suspended = 0;
|
|
|
- if (host->pdata->resume) {
|
|
|
- if (host->pdata->resume(dev, host->slot_id))
|
|
|
- dev_dbg(dev, "Unmask interrupt failed\n");
|
|
|
- }
|
|
|
goto err;
|
|
|
}
|
|
|
|
|
@@ -2136,12 +2142,6 @@ static int omap_hsmmc_resume(struct device *dev)
|
|
|
if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER))
|
|
|
omap_hsmmc_conf_bus_power(host);
|
|
|
|
|
|
- if (host->pdata->resume) {
|
|
|
- ret = host->pdata->resume(dev, host->slot_id);
|
|
|
- if (ret)
|
|
|
- dev_dbg(dev, "Unmask interrupt failed\n");
|
|
|
- }
|
|
|
-
|
|
|
omap_hsmmc_protect_card(host);
|
|
|
|
|
|
/* Notify the core to resume the host */
|
|
@@ -2157,8 +2157,10 @@ static int omap_hsmmc_resume(struct device *dev)
|
|
|
}
|
|
|
|
|
|
#else
|
|
|
+#define omap_hsmmc_prepare NULL
|
|
|
+#define omap_hsmmc_complete NULL
|
|
|
#define omap_hsmmc_suspend NULL
|
|
|
-#define omap_hsmmc_resume NULL
|
|
|
+#define omap_hsmmc_resume NULL
|
|
|
#endif
|
|
|
|
|
|
static int omap_hsmmc_runtime_suspend(struct device *dev)
|
|
@@ -2186,6 +2188,8 @@ static int omap_hsmmc_runtime_resume(struct device *dev)
|
|
|
static struct dev_pm_ops omap_hsmmc_dev_pm_ops = {
|
|
|
.suspend = omap_hsmmc_suspend,
|
|
|
.resume = omap_hsmmc_resume,
|
|
|
+ .prepare = omap_hsmmc_prepare,
|
|
|
+ .complete = omap_hsmmc_complete,
|
|
|
.runtime_suspend = omap_hsmmc_runtime_suspend,
|
|
|
.runtime_resume = omap_hsmmc_runtime_resume,
|
|
|
};
|