Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 336604
b: refs/heads/master
c: dee8370
h: refs/heads/master
v: v3
  • Loading branch information
Rafael J. Wysocki committed Nov 14, 2012
1 parent b7bf0e5 commit dd3f7ef
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 23 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: cd7bd02d319eb34fa33d1705cf63f64928643708
refs/heads/master: dee8370cc87e505ef39567f0974e73d59e75d76b
74 changes: 57 additions & 17 deletions trunk/drivers/acpi/device_pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -200,38 +200,78 @@ EXPORT_SYMBOL_GPL(acpi_device_power_state);

#ifdef CONFIG_PM_RUNTIME
/**
* acpi_pm_device_run_wake - Enable/disable remote wakeup for given device.
* @phys_dev: Device to enable/disable the platform to wake up.
* __acpi_device_run_wake - Enable/disable runtime remote wakeup for device.
* @adev: ACPI device to enable/disable the remote wakeup for.
* @enable: Whether to enable or disable the wakeup functionality.
*
* Find the ACPI device object corresponding to @phys_dev and try to
* enable/disable the GPE associated with it, so that it can generate
* wakeup signals for the device in response to external (remote) events.
* Enable/disable the GPE associated with @adev so that it can generate
* wakeup signals for the device in response to external (remote) events and
* enable/disable device wakeup power.
*
* Callers must ensure that @adev is a valid ACPI device node before executing
* this function.
*/
int __acpi_device_run_wake(struct acpi_device *adev, bool enable)
{
struct acpi_device_wakeup *wakeup = &adev->wakeup;

if (enable) {
acpi_status res;
int error;

error = acpi_enable_wakeup_device_power(adev, ACPI_STATE_S0);
if (error)
return error;

res = acpi_enable_gpe(wakeup->gpe_device, wakeup->gpe_number);
if (ACPI_FAILURE(res)) {
acpi_disable_wakeup_device_power(adev);
return -EIO;
}
} else {
acpi_disable_gpe(wakeup->gpe_device, wakeup->gpe_number);
acpi_disable_wakeup_device_power(adev);
}
return 0;
}

/**
* acpi_pm_device_run_wake - Enable/disable remote wakeup for given device.
* @dev: Device to enable/disable the platform to wake up.
* @enable: Whether to enable or disable the wakeup functionality.
*/
int acpi_pm_device_run_wake(struct device *phys_dev, bool enable)
{
struct acpi_device *dev;
struct acpi_device *adev;
acpi_handle handle;

if (!device_run_wake(phys_dev))
return -EINVAL;

handle = DEVICE_ACPI_HANDLE(phys_dev);
if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &dev))) {
dev_dbg(phys_dev, "ACPI handle has no context in %s!\n",
if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &adev))) {
dev_dbg(phys_dev, "ACPI handle without context in %s!\n",
__func__);
return -ENODEV;
}

if (enable) {
acpi_enable_wakeup_device_power(dev, ACPI_STATE_S0);
acpi_enable_gpe(dev->wakeup.gpe_device, dev->wakeup.gpe_number);
} else {
acpi_disable_gpe(dev->wakeup.gpe_device, dev->wakeup.gpe_number);
acpi_disable_wakeup_device_power(dev);
}

return 0;
return __acpi_device_run_wake(adev, enable);
}
EXPORT_SYMBOL(acpi_pm_device_run_wake);
#endif /* CONFIG_PM_RUNTIME */

#ifdef CONFIG_PM_SLEEP
/**
* __acpi_device_sleep_wake - Enable or disable device to wake up the system.
* @dev: Device to enable/desible to wake up the system.
* @target_state: System state the device is supposed to wake up from.
* @enable: Whether to enable or disable @dev to wake up the system.
*/
int __acpi_device_sleep_wake(struct acpi_device *adev, u32 target_state,
bool enable)
{
return enable ?
acpi_enable_wakeup_device_power(adev, target_state) :
acpi_disable_wakeup_device_power(adev);
}
#endif /* CONFIG_PM_SLEEP */
8 changes: 3 additions & 5 deletions trunk/drivers/acpi/sleep.c
Original file line number Diff line number Diff line change
Expand Up @@ -724,15 +724,13 @@ int acpi_pm_device_sleep_wake(struct device *dev, bool enable)

handle = DEVICE_ACPI_HANDLE(dev);
if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &adev))) {
dev_dbg(dev, "ACPI handle has no context in %s!\n", __func__);
dev_dbg(dev, "ACPI handle without context in %s!\n", __func__);
return -ENODEV;
}

error = enable ?
acpi_enable_wakeup_device_power(adev, acpi_target_sleep_state) :
acpi_disable_wakeup_device_power(adev);
error = __acpi_device_sleep_wake(adev, acpi_target_sleep_state, enable);
if (!error)
dev_info(dev, "wake-up capability %s by ACPI\n",
dev_info(dev, "System wakeup %s by ACPI\n",
enable ? "enabled" : "disabled");

return error;
Expand Down
11 changes: 11 additions & 0 deletions trunk/include/acpi/acpi_bus.h
Original file line number Diff line number Diff line change
Expand Up @@ -455,17 +455,28 @@ static inline int acpi_pm_device_sleep_state(struct device *d, int *p, int m)
#endif

#ifdef CONFIG_PM_RUNTIME
int __acpi_device_run_wake(struct acpi_device *, bool);
int acpi_pm_device_run_wake(struct device *, bool);
#else
static inline int __acpi_device_run_wake(struct acpi_device *adev, bool en)
{
return -ENODEV;
}
static inline int acpi_pm_device_run_wake(struct device *dev, bool enable)
{
return -ENODEV;
}
#endif

#ifdef CONFIG_PM_SLEEP
int __acpi_device_sleep_wake(struct acpi_device *, u32, bool);
int acpi_pm_device_sleep_wake(struct device *, bool);
#else
static inline int __acpi_device_sleep_wake(struct acpi_device *adev,
u32 target_state, bool enable)
{
return -ENODEV;
}
static inline int acpi_pm_device_sleep_wake(struct device *dev, bool enable)
{
return -ENODEV;
Expand Down

0 comments on commit dd3f7ef

Please sign in to comment.