Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 336606
b: refs/heads/master
c: a6ae759
h: refs/heads/master
v: v3
  • Loading branch information
Rafael J. Wysocki committed Nov 14, 2012
1 parent 1a0c48b commit 3cbb580
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 58 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: 078eb12648c2f8bba48921f60ec2cec3e1bbc051
refs/heads/master: a6ae7594b1b157e0e7976ed105a7be27d69a5361
54 changes: 54 additions & 0 deletions trunk/drivers/acpi/device_pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,31 @@ int acpi_device_power_state(struct device *dev, struct acpi_device *adev,
}
EXPORT_SYMBOL_GPL(acpi_device_power_state);

/**
* acpi_pm_device_sleep_state - Get preferred power state of ACPI device.
* @dev: Device whose preferred target power state to return.
* @d_min_p: Location to store the upper limit of the allowed states range.
* @d_max_in: Deepest low-power state to take into consideration.
* Return value: Preferred power state of the device on success, -ENODEV
* (if there's no 'struct acpi_device' for @dev) or -EINVAL on failure
*
* The caller must ensure that @dev is valid before using this function.
*/
int acpi_pm_device_sleep_state(struct device *dev, int *d_min_p, int d_max_in)
{
acpi_handle handle = DEVICE_ACPI_HANDLE(dev);
struct acpi_device *adev;

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

return acpi_device_power_state(dev, adev, acpi_target_system_state(),
d_max_in, d_min_p);
}
EXPORT_SYMBOL(acpi_pm_device_sleep_state);

#ifdef CONFIG_PM_RUNTIME
/**
* __acpi_device_run_wake - Enable/disable runtime remote wakeup for device.
Expand Down Expand Up @@ -274,4 +299,33 @@ int __acpi_device_sleep_wake(struct acpi_device *adev, u32 target_state,
acpi_enable_wakeup_device_power(adev, target_state) :
acpi_disable_wakeup_device_power(adev);
}

/**
* acpi_pm_device_sleep_wake - Enable or disable device to wake up the system.
* @dev: Device to enable/desible to wake up the system from sleep states.
* @enable: Whether to enable or disable @dev to wake up the system.
*/
int acpi_pm_device_sleep_wake(struct device *dev, bool enable)
{
acpi_handle handle;
struct acpi_device *adev;
int error;

if (!device_can_wakeup(dev))
return -EINVAL;

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

error = __acpi_device_sleep_wake(adev, acpi_target_system_state(),
enable);
if (!error)
dev_info(dev, "System wakeup %s by ACPI\n",
enable ? "enabled" : "disabled");

return error;
}
#endif /* CONFIG_PM_SLEEP */
63 changes: 6 additions & 57 deletions trunk/drivers/acpi/sleep.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,12 @@ static int acpi_sleep_prepare(u32 acpi_state)

#ifdef CONFIG_ACPI_SLEEP
static u32 acpi_target_sleep_state = ACPI_STATE_S0;

u32 acpi_target_system_state(void)
{
return acpi_target_sleep_state;
}

static bool pwr_btn_event_pending;

/*
Expand Down Expand Up @@ -680,63 +686,6 @@ int acpi_suspend(u32 acpi_state)
return -EINVAL;
}

#ifdef CONFIG_PM
/**
* acpi_pm_device_sleep_state - Get preferred power state of ACPI device.
* @dev: Device whose preferred target power state to return.
* @d_min_p: Location to store the upper limit of the allowed states range.
* @d_max_in: Deepest low-power state to take into consideration.
* Return value: Preferred power state of the device on success, -ENODEV
* (if there's no 'struct acpi_device' for @dev) or -EINVAL on failure
*
* The caller must ensure that @dev is valid before using this function.
*/
int acpi_pm_device_sleep_state(struct device *dev, int *d_min_p, int d_max_in)
{
acpi_handle handle = DEVICE_ACPI_HANDLE(dev);
struct acpi_device *adev;

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

return acpi_device_power_state(dev, adev, acpi_target_sleep_state,
d_max_in, d_min_p);
}
EXPORT_SYMBOL(acpi_pm_device_sleep_state);
#endif /* CONFIG_PM */

#ifdef CONFIG_PM_SLEEP
/**
* acpi_pm_device_sleep_wake - Enable or disable device to wake up the system.
* @dev: Device to enable/desible to wake up the system from sleep states.
* @enable: Whether to enable or disable @dev to wake up the system.
*/
int acpi_pm_device_sleep_wake(struct device *dev, bool enable)
{
acpi_handle handle;
struct acpi_device *adev;
int error;

if (!device_can_wakeup(dev))
return -EINVAL;

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

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

return error;
}
#endif /* CONFIG_PM_SLEEP */

static void acpi_power_off_prepare(void)
{
/* Prepare to power off the system */
Expand Down
2 changes: 2 additions & 0 deletions trunk/include/acpi/acpi_bus.h
Original file line number Diff line number Diff line change
Expand Up @@ -470,9 +470,11 @@ static inline int acpi_pm_device_run_wake(struct device *dev, bool enable)
#endif

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

0 comments on commit 3cbb580

Please sign in to comment.