[PATCH 3/3] ACPI / PM: Avoid resuming devices in ACPI PM domain during system suspend
From: Rafael J. Wysocki <hidden>
Date: 2014-02-16 23:38:41
Also in:
linux-pm, lkml
From: Rafael J. Wysocki <redacted> Rework the ACPI PM domain's PM callbacks to avoid resuming devices during system suspend in order to modify their wakeup settings if that isn't necessary. Signed-off-by: Rafael J. Wysocki <redacted> --- drivers/acpi/device_pm.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) Index: linux-pm/drivers/acpi/device_pm.c ===================================================================
--- linux-pm.orig/drivers/acpi/device_pm.c
+++ linux-pm/drivers/acpi/device_pm.c@@ -900,12 +900,28 @@ EXPORT_SYMBOL_GPL(acpi_dev_resume_early) */ int acpi_subsys_prepare(struct device *dev) { + struct acpi_device *adev = ACPI_COMPANION(dev); + u32 target_state; + int error, state; + + if (!adev || !pm_runtime_enabled_and_suspended(dev)) + return pm_generic_prepare(dev); + + target_state = acpi_target_system_state(); + error = acpi_dev_pm_get_state(dev, adev, target_state, NULL, &state); + if (error || state != adev->power.state + || device_may_wakeup(dev) != !!adev->wakeup.prepare_count) { + pm_runtime_resume(dev); + return pm_generic_prepare(dev); + } /* - * Follow PCI and resume devices suspended at run time before running - * their system suspend callbacks. + * If this is a wakeup device, wakeup power has been enabled already for + * it during the preceding runtime suspend. Caveat: "sleep state" is + * one of the _DSW arguments, but that shouldn't matter for the devices + * using acpi_general_pm_domain. */ - pm_runtime_resume(dev); - return pm_generic_prepare(dev); + error = pm_generic_prepare(dev); + return error ? error : 1; } EXPORT_SYMBOL_GPL(acpi_subsys_prepare);