|
@@ -566,11 +566,47 @@ static int _od_runtime_resume(struct device *dev)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+#ifdef CONFIG_SUSPEND
|
|
|
+static int _od_suspend_noirq(struct device *dev)
|
|
|
+{
|
|
|
+ struct platform_device *pdev = to_platform_device(dev);
|
|
|
+ struct omap_device *od = to_omap_device(pdev);
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = pm_generic_suspend_noirq(dev);
|
|
|
+
|
|
|
+ if (!ret && !pm_runtime_status_suspended(dev)) {
|
|
|
+ if (pm_generic_runtime_suspend(dev) == 0) {
|
|
|
+ omap_device_idle(pdev);
|
|
|
+ od->flags |= OMAP_DEVICE_SUSPENDED;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+static int _od_resume_noirq(struct device *dev)
|
|
|
+{
|
|
|
+ struct platform_device *pdev = to_platform_device(dev);
|
|
|
+ struct omap_device *od = to_omap_device(pdev);
|
|
|
+
|
|
|
+ if ((od->flags & OMAP_DEVICE_SUSPENDED) &&
|
|
|
+ !pm_runtime_status_suspended(dev)) {
|
|
|
+ od->flags &= ~OMAP_DEVICE_SUSPENDED;
|
|
|
+ omap_device_enable(pdev);
|
|
|
+ pm_generic_runtime_resume(dev);
|
|
|
+ }
|
|
|
+
|
|
|
+ return pm_generic_resume_noirq(dev);
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
static struct dev_pm_domain omap_device_pm_domain = {
|
|
|
.ops = {
|
|
|
SET_RUNTIME_PM_OPS(_od_runtime_suspend, _od_runtime_resume,
|
|
|
_od_runtime_idle)
|
|
|
USE_PLATFORM_PM_SLEEP_OPS
|
|
|
+ SET_SYSTEM_SLEEP_PM_OPS(_od_suspend_noirq, _od_resume_noirq)
|
|
|
}
|
|
|
};
|
|
|
|