PM: domains: Consolidate genpd_restore_noirq() and genpd_resume_noirq()
authorShawn Guo <shawn.guo@linaro.org>
Wed, 2 Nov 2022 14:21:03 +0000 (22:21 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 3 Nov 2022 18:40:58 +0000 (19:40 +0100)
Most of the logic between genpd_restore_noirq() and genpd_resume_noirq()
are identical.  The suspended_count decrement for restore should be the
right thing to do anyway, considering there is an increment in
genpd_finish_suspend() for hibernation.  So consolidate these two
functions into genpd_finish_resume().

Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/base/power/domain.c

index f18b8b1bc17a2ff9c0cac679660866a61c6c8fc7..7cee9439fd21d37ce0f78d31c4de8a9210b4a9b6 100644 (file)
@@ -1247,12 +1247,14 @@ static int genpd_suspend_noirq(struct device *dev)
 }
 
 /**
- * genpd_resume_noirq - Start of resume of device in an I/O PM domain.
+ * genpd_finish_resume - Completion of resume of device in an I/O PM domain.
  * @dev: Device to resume.
+ * @resume_noirq: Generic resume_noirq callback.
  *
  * Restore power to the device's PM domain, if necessary, and start the device.
  */
-static int genpd_resume_noirq(struct device *dev)
+static int genpd_finish_resume(struct device *dev,
+                              int (*resume_noirq)(struct device *dev))
 {
        struct generic_pm_domain *genpd;
        int ret;
@@ -1264,7 +1266,7 @@ static int genpd_resume_noirq(struct device *dev)
                return -EINVAL;
 
        if (device_wakeup_path(dev) && genpd_is_active_wakeup(genpd))
-               return pm_generic_resume_noirq(dev);
+               return resume_noirq(dev);
 
        genpd_lock(genpd);
        genpd_sync_power_on(genpd, true, 0);
@@ -1281,6 +1283,19 @@ static int genpd_resume_noirq(struct device *dev)
        return pm_generic_resume_noirq(dev);
 }
 
+/**
+ * genpd_resume_noirq - Start of resume of device in an I/O PM domain.
+ * @dev: Device to resume.
+ *
+ * Restore power to the device's PM domain, if necessary, and start the device.
+ */
+static int genpd_resume_noirq(struct device *dev)
+{
+       dev_dbg(dev, "%s()\n", __func__);
+
+       return genpd_finish_resume(dev, pm_generic_resume_noirq);
+}
+
 /**
  * genpd_freeze_noirq - Completion of freezing a device in an I/O PM domain.
  * @dev: Device to freeze.
@@ -1366,27 +1381,9 @@ static int genpd_poweroff_noirq(struct device *dev)
  */
 static int genpd_restore_noirq(struct device *dev)
 {
-       struct generic_pm_domain *genpd;
-       int ret = 0;
-
        dev_dbg(dev, "%s()\n", __func__);
 
-       genpd = dev_to_genpd(dev);
-       if (IS_ERR(genpd))
-               return -EINVAL;
-
-       genpd_lock(genpd);
-       genpd_sync_power_on(genpd, true, 0);
-       genpd_unlock(genpd);
-
-       if (genpd->dev_ops.stop && genpd->dev_ops.start &&
-           !pm_runtime_status_suspended(dev)) {
-               ret = genpd_start_dev(genpd, dev);
-               if (ret)
-                       return ret;
-       }
-
-       return pm_generic_restore_noirq(dev);
+       return genpd_finish_resume(dev, pm_generic_restore_noirq);
 }
 
 /**