Skip to content

Commit

Permalink
ACPI / PM: Split code validating need for runtime resume in ->prepare()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Ulf Hansson authored and Rafael J. Wysocki committed Oct 11, 2017
1 parent e4da817 commit c2ebf78
Showing 1 changed file with 24 additions and 13 deletions.
37 changes: 24 additions & 13 deletions drivers/acpi/device_pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -966,33 +966,44 @@ 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.
*/
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);

Expand Down

0 comments on commit c2ebf78

Please sign in to comment.