summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlf Hansson <ulf.hansson@linaro.org>2017-10-03 10:11:08 +0300
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2017-10-11 16:35:50 +0300
commitc2ebf788f927dcca72beead19fab5f5aba79a098 (patch)
tree881d4e72a78ce0a0a50253be633265c3c4c73a15
parente4da817d2acbd05217adc0dc821bc8361e86ee30 (diff)
downloadlinux-c2ebf788f927dcca72beead19fab5f5aba79a098.tar.xz
ACPI / PM: Split code validating need for runtime resume in ->prepare()
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>
-rw-r--r--drivers/acpi/device_pm.c37
1 files changed, 24 insertions, 13 deletions
diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c
index d17fac453a30..764b8dfa04aa 100644
--- a/drivers/acpi/device_pm.c
+++ b/drivers/acpi/device_pm.c
@@ -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);