Keep power management callbacks in place to optionally notify drivers
who register them.

Signed-off-by: Parav Pandit <pa...@mellanox.com>
---
 drivers/subdev/subdev_main.c | 59 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 59 insertions(+)

diff --git a/drivers/subdev/subdev_main.c b/drivers/subdev/subdev_main.c
index 4aabcaa..e213331 100644
--- a/drivers/subdev/subdev_main.c
+++ b/drivers/subdev/subdev_main.c
@@ -23,10 +23,69 @@ static int subdev_bus_match(struct device *dev, struct 
device_driver *drv)
        return 0;
 }
 
+static int subdev_pm_prepare(struct device *dev)
+{
+       if (dev->driver->pm && dev->driver->pm->prepare)
+               return dev->driver->pm->prepare(dev);
+       return 0;
+}
+
+static void subdev_pm_complete(struct device *dev)
+{
+       if (dev->driver->pm && dev->driver->pm->complete)
+               dev->driver->pm->complete(dev);
+}
+
+static int subdev_pm_suspend(struct device *dev)
+{
+       if (dev->driver->pm && dev->driver->pm->suspend)
+               return dev->driver->pm->suspend(dev);
+       return 0;
+}
+
+static int subdev_pm_suspend_late(struct device *dev)
+{
+       if (dev->driver->pm && dev->driver->pm->suspend_late)
+               return dev->driver->pm->suspend_late(dev);
+       return 0;
+}
+
+static int subdev_pm_resume(struct device *dev)
+{
+       if (dev->driver->pm && dev->driver->pm->resume)
+               return dev->driver->pm->resume(dev);
+       return 0;
+}
+
+static int subdev_pm_freeze(struct device *dev)
+{
+       if (dev->driver->pm && dev->driver->pm->freeze)
+               return dev->driver->pm->freeze(dev);
+       return 0;
+}
+
+static int subdev_pm_freeze_late(struct device *dev)
+{
+       if (dev->driver->pm && dev->driver->pm->freeze_late)
+               return dev->driver->pm->freeze_late(dev);
+       return 0;
+}
+
+static const struct dev_pm_ops subdev_dev_pm_ops = {
+       .prepare = subdev_pm_prepare,
+       .complete = subdev_pm_complete,
+       .suspend = subdev_pm_suspend,
+       .suspend_late = subdev_pm_suspend_late,
+       .resume = subdev_pm_resume,
+       .freeze = subdev_pm_freeze,
+       .freeze_late = subdev_pm_freeze_late,
+};
+
 static struct bus_type subdev_bus_type = {
        .dev_name = "subdev",
        .name = "subdev",
        .match = subdev_bus_match,
+       .pm = &subdev_dev_pm_ops,
 };
 
 int __subdev_register_driver(struct subdev_driver *drv, struct module *owner,
-- 
1.8.3.1

Reply via email to