@@ -70,3 +70,64 @@ int platform_pm_runtime_idle(struct device *dev)
};
#endif /* CONFIG_PM_RUNTIME */
+#ifdef CONFIG_SUSPEND
+int platform_pm_suspend_noirq(struct device *dev)
+{
+ struct device_driver *drv = dev->driver;
+ struct platform_device *pdev = to_platform_device(dev);
+ struct omap_device *odev = to_omap_device(pdev);
+ int ret = 0;
+
+ if (!drv)
+ return 0;
+
+ if (drv->pm) {
+ if (drv->pm->suspend_noirq)
+ ret = drv->pm->suspend_noirq(dev);
+ }
+
+ if (omap_device_is_valid(odev)) {
+ if (odev->flags & OMAP_DEVICE_NO_BUS_SUSPEND) {
+ dev_dbg(dev, "no automatic bus-level system resume.\n");
+ return 0;
+ }
+
+ dev_dbg(dev, "%s\n", __func__);
+ omap_device_idle(pdev);
+ } else {
+ dev_dbg(dev, "not an omap_device\n");
+ }
+
+ return ret;
+}
+
+int platform_pm_resume_noirq(struct device *dev)
+{
+ struct device_driver *drv = dev->driver;
+ struct platform_device *pdev = to_platform_device(dev);
+ struct omap_device *odev = to_omap_device(pdev);
+ int ret = 0;
+
+ if (omap_device_is_valid(odev)) {
+ if (odev->flags & OMAP_DEVICE_NO_BUS_SUSPEND) {
+ dev_dbg(dev, "no automatic bus-level system resume.\n");
+ return 0;
+ }
+
+ dev_dbg(dev, "%s\n", __func__);
+ omap_device_enable(pdev);
+ } else {
+ dev_dbg(dev, "not an omap_device\n");
+ }
+
+ if (!drv)
+ return 0;
+
+ if (drv->pm) {
+ if (drv->pm->resume_noirq)
+ ret = drv->pm->resume_noirq(dev);
+ }
+
+ return ret;
+}
+#endif /* CONFIG_SUSPEND */