mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-26 16:41:25 +00:00
ACPI / PM: Combine device suspend routines
On top of a previous change getting rid of the PM QoS flag PM_QOS_FLAG_REMOTE_WAKEUP, combine two ACPI device suspend routines, acpi_dev_runtime_suspend() and acpi_dev_suspend_late(), into one, acpi_dev_suspend(), to eliminate some code duplication. It also avoids enabling wakeup for devices handled by the ACPI LPSS middle layer on driver removal. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
parent
048f35ff26
commit
cbe25ce37d
3 changed files with 18 additions and 52 deletions
|
@ -713,7 +713,7 @@ static int acpi_lpss_activate(struct device *dev)
|
||||||
|
|
||||||
static void acpi_lpss_dismiss(struct device *dev)
|
static void acpi_lpss_dismiss(struct device *dev)
|
||||||
{
|
{
|
||||||
acpi_dev_runtime_suspend(dev);
|
acpi_dev_suspend(dev, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PM_SLEEP
|
#ifdef CONFIG_PM_SLEEP
|
||||||
|
@ -729,7 +729,7 @@ static int acpi_lpss_suspend_late(struct device *dev)
|
||||||
if (pdata->dev_desc->flags & LPSS_SAVE_CTX)
|
if (pdata->dev_desc->flags & LPSS_SAVE_CTX)
|
||||||
acpi_lpss_save_ctx(dev, pdata);
|
acpi_lpss_save_ctx(dev, pdata);
|
||||||
|
|
||||||
return acpi_dev_suspend_late(dev);
|
return acpi_dev_suspend(dev, device_may_wakeup(dev));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int acpi_lpss_resume_early(struct device *dev)
|
static int acpi_lpss_resume_early(struct device *dev)
|
||||||
|
@ -847,7 +847,7 @@ static int acpi_lpss_runtime_suspend(struct device *dev)
|
||||||
if (pdata->dev_desc->flags & LPSS_SAVE_CTX)
|
if (pdata->dev_desc->flags & LPSS_SAVE_CTX)
|
||||||
acpi_lpss_save_ctx(dev, pdata);
|
acpi_lpss_save_ctx(dev, pdata);
|
||||||
|
|
||||||
ret = acpi_dev_runtime_suspend(dev);
|
ret = acpi_dev_suspend(dev, true);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This call must be last in the sequence, otherwise PMC will return
|
* This call must be last in the sequence, otherwise PMC will return
|
||||||
|
|
|
@ -847,37 +847,39 @@ static int acpi_dev_pm_full_power(struct acpi_device *adev)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* acpi_dev_runtime_suspend - Put device into a low-power state using ACPI.
|
* acpi_dev_suspend - Put device into a low-power state using ACPI.
|
||||||
* @dev: Device to put into a low-power state.
|
* @dev: Device to put into a low-power state.
|
||||||
|
* @wakeup: Whether or not to enable wakeup for the device.
|
||||||
*
|
*
|
||||||
* Put the given device into a runtime low-power state using the standard ACPI
|
* Put the given device into a low-power state using the standard ACPI
|
||||||
* mechanism. Set up remote wakeup if desired, choose the state to put the
|
* mechanism. Set up remote wakeup if desired, choose the state to put the
|
||||||
* device into (this checks if remote wakeup is expected to work too), and set
|
* device into (this checks if remote wakeup is expected to work too), and set
|
||||||
* the power state of the device.
|
* the power state of the device.
|
||||||
*/
|
*/
|
||||||
int acpi_dev_runtime_suspend(struct device *dev)
|
int acpi_dev_suspend(struct device *dev, bool wakeup)
|
||||||
{
|
{
|
||||||
struct acpi_device *adev = ACPI_COMPANION(dev);
|
struct acpi_device *adev = ACPI_COMPANION(dev);
|
||||||
bool remote_wakeup;
|
u32 target_state = acpi_target_system_state();
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
if (!adev)
|
if (!adev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
remote_wakeup = acpi_device_can_wakeup(adev);
|
if (wakeup && acpi_device_can_wakeup(adev)) {
|
||||||
if (remote_wakeup) {
|
error = acpi_device_wakeup_enable(adev, target_state);
|
||||||
error = acpi_device_wakeup_enable(adev, ACPI_STATE_S0);
|
|
||||||
if (error)
|
if (error)
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
|
} else {
|
||||||
|
wakeup = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
error = acpi_dev_pm_low_power(dev, adev, ACPI_STATE_S0);
|
error = acpi_dev_pm_low_power(dev, adev, target_state);
|
||||||
if (error && remote_wakeup)
|
if (error && wakeup)
|
||||||
acpi_device_wakeup_disable(adev);
|
acpi_device_wakeup_disable(adev);
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(acpi_dev_runtime_suspend);
|
EXPORT_SYMBOL_GPL(acpi_dev_suspend);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* acpi_dev_resume - Put device into the full-power state using ACPI.
|
* acpi_dev_resume - Put device into the full-power state using ACPI.
|
||||||
|
@ -910,7 +912,7 @@ EXPORT_SYMBOL_GPL(acpi_dev_resume);
|
||||||
int acpi_subsys_runtime_suspend(struct device *dev)
|
int acpi_subsys_runtime_suspend(struct device *dev)
|
||||||
{
|
{
|
||||||
int ret = pm_generic_runtime_suspend(dev);
|
int ret = pm_generic_runtime_suspend(dev);
|
||||||
return ret ? ret : acpi_dev_runtime_suspend(dev);
|
return ret ? ret : acpi_dev_suspend(dev, true);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(acpi_subsys_runtime_suspend);
|
EXPORT_SYMBOL_GPL(acpi_subsys_runtime_suspend);
|
||||||
|
|
||||||
|
@ -929,41 +931,6 @@ int acpi_subsys_runtime_resume(struct device *dev)
|
||||||
EXPORT_SYMBOL_GPL(acpi_subsys_runtime_resume);
|
EXPORT_SYMBOL_GPL(acpi_subsys_runtime_resume);
|
||||||
|
|
||||||
#ifdef CONFIG_PM_SLEEP
|
#ifdef CONFIG_PM_SLEEP
|
||||||
/**
|
|
||||||
* acpi_dev_suspend_late - Put device into a low-power state using ACPI.
|
|
||||||
* @dev: Device to put into a low-power state.
|
|
||||||
*
|
|
||||||
* Put the given device into a low-power state during system transition to a
|
|
||||||
* sleep state using the standard ACPI mechanism. Set up system wakeup if
|
|
||||||
* desired, choose the state to put the device into (this checks if system
|
|
||||||
* wakeup is expected to work too), and set the power state of the device.
|
|
||||||
*/
|
|
||||||
int acpi_dev_suspend_late(struct device *dev)
|
|
||||||
{
|
|
||||||
struct acpi_device *adev = ACPI_COMPANION(dev);
|
|
||||||
u32 target_state;
|
|
||||||
bool wakeup;
|
|
||||||
int error;
|
|
||||||
|
|
||||||
if (!adev)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
target_state = acpi_target_system_state();
|
|
||||||
wakeup = device_may_wakeup(dev) && acpi_device_can_wakeup(adev);
|
|
||||||
if (wakeup) {
|
|
||||||
error = acpi_device_wakeup_enable(adev, target_state);
|
|
||||||
if (error)
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
error = acpi_dev_pm_low_power(dev, adev, target_state);
|
|
||||||
if (error && wakeup)
|
|
||||||
acpi_device_wakeup_disable(adev);
|
|
||||||
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(acpi_dev_suspend_late);
|
|
||||||
|
|
||||||
static bool acpi_dev_needs_resume(struct device *dev, struct acpi_device *adev)
|
static bool acpi_dev_needs_resume(struct device *dev, struct acpi_device *adev)
|
||||||
{
|
{
|
||||||
u32 sys_target = acpi_target_system_state();
|
u32 sys_target = acpi_target_system_state();
|
||||||
|
@ -1046,7 +1013,7 @@ EXPORT_SYMBOL_GPL(acpi_subsys_suspend);
|
||||||
int acpi_subsys_suspend_late(struct device *dev)
|
int acpi_subsys_suspend_late(struct device *dev)
|
||||||
{
|
{
|
||||||
int ret = pm_generic_suspend_late(dev);
|
int ret = pm_generic_suspend_late(dev);
|
||||||
return ret ? ret : acpi_dev_suspend_late(dev);
|
return ret ? ret : acpi_dev_suspend(dev, device_may_wakeup(dev));
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(acpi_subsys_suspend_late);
|
EXPORT_SYMBOL_GPL(acpi_subsys_suspend_late);
|
||||||
|
|
||||||
|
|
|
@ -864,7 +864,7 @@ static inline void arch_reserve_mem_area(acpi_physical_address addr,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_ACPI) && defined(CONFIG_PM)
|
#if defined(CONFIG_ACPI) && defined(CONFIG_PM)
|
||||||
int acpi_dev_runtime_suspend(struct device *dev);
|
int acpi_dev_suspend(struct device *dev, bool wakeup);
|
||||||
int acpi_dev_resume(struct device *dev);
|
int acpi_dev_resume(struct device *dev);
|
||||||
int acpi_subsys_runtime_suspend(struct device *dev);
|
int acpi_subsys_runtime_suspend(struct device *dev);
|
||||||
int acpi_subsys_runtime_resume(struct device *dev);
|
int acpi_subsys_runtime_resume(struct device *dev);
|
||||||
|
@ -889,7 +889,6 @@ int acpi_subsys_resume_early(struct device *dev);
|
||||||
int acpi_subsys_suspend(struct device *dev);
|
int acpi_subsys_suspend(struct device *dev);
|
||||||
int acpi_subsys_freeze(struct device *dev);
|
int acpi_subsys_freeze(struct device *dev);
|
||||||
#else
|
#else
|
||||||
static inline int acpi_dev_suspend_late(struct device *dev) { return 0; }
|
|
||||||
static inline int acpi_dev_resume_early(struct device *dev) { return 0; }
|
static inline int acpi_dev_resume_early(struct device *dev) { return 0; }
|
||||||
static inline int acpi_subsys_prepare(struct device *dev) { return 0; }
|
static inline int acpi_subsys_prepare(struct device *dev) { return 0; }
|
||||||
static inline void acpi_subsys_complete(struct device *dev) {}
|
static inline void acpi_subsys_complete(struct device *dev) {}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue