]> www.infradead.org Git - users/hch/misc.git/commitdiff
ACPI / PM: Split code validating need for runtime resume in ->prepare()
authorUlf Hansson <ulf.hansson@linaro.org>
Tue, 3 Oct 2017 07:11:08 +0000 (09:11 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 11 Oct 2017 13:35:50 +0000 (15:35 +0200)
Move the code dealing with validation of whether runtime resuming the
device is needed during system suspend.

In this way it becomes more clear for what circumstances ACPI is prevented
from trying the direct_complete path.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/device_pm.c

index d17fac453a30b1abd6266ca1dc2304ec3794765d..764b8dfa04aa59b0f915bbec464fbca753acb2a5 100644 (file)
@@ -966,6 +966,27 @@ int acpi_dev_suspend_late(struct device *dev)
 }
 EXPORT_SYMBOL_GPL(acpi_dev_suspend_late);
 
+static bool acpi_dev_needs_resume(struct device *dev, struct acpi_device *adev)
+{
+       u32 sys_target = acpi_target_system_state();
+       int ret, state;
+
+       if (device_may_wakeup(dev) != !!adev->wakeup.prepare_count)
+               return true;
+
+       if (sys_target == ACPI_STATE_S0)
+               return false;
+
+       if (adev->power.flags.dsw_present)
+               return true;
+
+       ret = acpi_dev_pm_get_state(dev, adev, sys_target, NULL, &state);
+       if (ret)
+               return true;
+
+       return state != adev->power.state;
+}
+
 /**
  * acpi_subsys_prepare - Prepare device for system transition to a sleep state.
  * @dev: Device to prepare.
@@ -973,26 +994,16 @@ EXPORT_SYMBOL_GPL(acpi_dev_suspend_late);
 int acpi_subsys_prepare(struct device *dev)
 {
        struct acpi_device *adev = ACPI_COMPANION(dev);
-       u32 sys_target;
-       int ret, state;
+       int ret;
 
        ret = pm_generic_prepare(dev);
        if (ret < 0)
                return ret;
 
-       if (!adev || !pm_runtime_suspended(dev)
-           || device_may_wakeup(dev) != !!adev->wakeup.prepare_count)
-               return 0;
-
-       sys_target = acpi_target_system_state();
-       if (sys_target == ACPI_STATE_S0)
-               return 1;
-
-       if (adev->power.flags.dsw_present)
+       if (!adev || !pm_runtime_suspended(dev))
                return 0;
 
-       ret = acpi_dev_pm_get_state(dev, adev, sys_target, NULL, &state);
-       return !ret && state == adev->power.state;
+       return !acpi_dev_needs_resume(dev, adev);
 }
 EXPORT_SYMBOL_GPL(acpi_subsys_prepare);