diff options
-rw-r--r-- | drivers/acpi/device_pm.c | 54 | ||||
-rw-r--r-- | drivers/acpi/sleep.c | 63 | ||||
-rw-r--r-- | include/acpi/acpi_bus.h | 2 |
3 files changed, 62 insertions, 57 deletions
diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c index b4f03f91b0b0..7ddd93463a2e 100644 --- a/drivers/acpi/device_pm.c +++ b/drivers/acpi/device_pm.c | |||
@@ -198,6 +198,31 @@ int acpi_device_power_state(struct device *dev, struct acpi_device *adev, | |||
198 | } | 198 | } |
199 | EXPORT_SYMBOL_GPL(acpi_device_power_state); | 199 | EXPORT_SYMBOL_GPL(acpi_device_power_state); |
200 | 200 | ||
201 | /** | ||
202 | * acpi_pm_device_sleep_state - Get preferred power state of ACPI device. | ||
203 | * @dev: Device whose preferred target power state to return. | ||
204 | * @d_min_p: Location to store the upper limit of the allowed states range. | ||
205 | * @d_max_in: Deepest low-power state to take into consideration. | ||
206 | * Return value: Preferred power state of the device on success, -ENODEV | ||
207 | * (if there's no 'struct acpi_device' for @dev) or -EINVAL on failure | ||
208 | * | ||
209 | * The caller must ensure that @dev is valid before using this function. | ||
210 | */ | ||
211 | int acpi_pm_device_sleep_state(struct device *dev, int *d_min_p, int d_max_in) | ||
212 | { | ||
213 | acpi_handle handle = DEVICE_ACPI_HANDLE(dev); | ||
214 | struct acpi_device *adev; | ||
215 | |||
216 | if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &adev))) { | ||
217 | dev_dbg(dev, "ACPI handle without context in %s!\n", __func__); | ||
218 | return -ENODEV; | ||
219 | } | ||
220 | |||
221 | return acpi_device_power_state(dev, adev, acpi_target_system_state(), | ||
222 | d_max_in, d_min_p); | ||
223 | } | ||
224 | EXPORT_SYMBOL(acpi_pm_device_sleep_state); | ||
225 | |||
201 | #ifdef CONFIG_PM_RUNTIME | 226 | #ifdef CONFIG_PM_RUNTIME |
202 | /** | 227 | /** |
203 | * __acpi_device_run_wake - Enable/disable runtime remote wakeup for device. | 228 | * __acpi_device_run_wake - Enable/disable runtime remote wakeup for device. |
@@ -274,4 +299,33 @@ int __acpi_device_sleep_wake(struct acpi_device *adev, u32 target_state, | |||
274 | acpi_enable_wakeup_device_power(adev, target_state) : | 299 | acpi_enable_wakeup_device_power(adev, target_state) : |
275 | acpi_disable_wakeup_device_power(adev); | 300 | acpi_disable_wakeup_device_power(adev); |
276 | } | 301 | } |
302 | |||
303 | /** | ||
304 | * acpi_pm_device_sleep_wake - Enable or disable device to wake up the system. | ||
305 | * @dev: Device to enable/desible to wake up the system from sleep states. | ||
306 | * @enable: Whether to enable or disable @dev to wake up the system. | ||
307 | */ | ||
308 | int acpi_pm_device_sleep_wake(struct device *dev, bool enable) | ||
309 | { | ||
310 | acpi_handle handle; | ||
311 | struct acpi_device *adev; | ||
312 | int error; | ||
313 | |||
314 | if (!device_can_wakeup(dev)) | ||
315 | return -EINVAL; | ||
316 | |||
317 | handle = DEVICE_ACPI_HANDLE(dev); | ||
318 | if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &adev))) { | ||
319 | dev_dbg(dev, "ACPI handle without context in %s!\n", __func__); | ||
320 | return -ENODEV; | ||
321 | } | ||
322 | |||
323 | error = __acpi_device_sleep_wake(adev, acpi_target_system_state(), | ||
324 | enable); | ||
325 | if (!error) | ||
326 | dev_info(dev, "System wakeup %s by ACPI\n", | ||
327 | enable ? "enabled" : "disabled"); | ||
328 | |||
329 | return error; | ||
330 | } | ||
277 | #endif /* CONFIG_PM_SLEEP */ | 331 | #endif /* CONFIG_PM_SLEEP */ |
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c index 77c517f6f6d0..13a285dffaca 100644 --- a/drivers/acpi/sleep.c +++ b/drivers/acpi/sleep.c | |||
@@ -80,6 +80,12 @@ static int acpi_sleep_prepare(u32 acpi_state) | |||
80 | 80 | ||
81 | #ifdef CONFIG_ACPI_SLEEP | 81 | #ifdef CONFIG_ACPI_SLEEP |
82 | static u32 acpi_target_sleep_state = ACPI_STATE_S0; | 82 | static u32 acpi_target_sleep_state = ACPI_STATE_S0; |
83 | |||
84 | u32 acpi_target_system_state(void) | ||
85 | { | ||
86 | return acpi_target_sleep_state; | ||
87 | } | ||
88 | |||
83 | static bool pwr_btn_event_pending; | 89 | static bool pwr_btn_event_pending; |
84 | 90 | ||
85 | /* | 91 | /* |
@@ -680,63 +686,6 @@ int acpi_suspend(u32 acpi_state) | |||
680 | return -EINVAL; | 686 | return -EINVAL; |
681 | } | 687 | } |
682 | 688 | ||
683 | #ifdef CONFIG_PM | ||
684 | /** | ||
685 | * acpi_pm_device_sleep_state - Get preferred power state of ACPI device. | ||
686 | * @dev: Device whose preferred target power state to return. | ||
687 | * @d_min_p: Location to store the upper limit of the allowed states range. | ||
688 | * @d_max_in: Deepest low-power state to take into consideration. | ||
689 | * Return value: Preferred power state of the device on success, -ENODEV | ||
690 | * (if there's no 'struct acpi_device' for @dev) or -EINVAL on failure | ||
691 | * | ||
692 | * The caller must ensure that @dev is valid before using this function. | ||
693 | */ | ||
694 | int acpi_pm_device_sleep_state(struct device *dev, int *d_min_p, int d_max_in) | ||
695 | { | ||
696 | acpi_handle handle = DEVICE_ACPI_HANDLE(dev); | ||
697 | struct acpi_device *adev; | ||
698 | |||
699 | if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &adev))) { | ||
700 | dev_dbg(dev, "ACPI handle without context in %s!\n", __func__); | ||
701 | return -ENODEV; | ||
702 | } | ||
703 | |||
704 | return acpi_device_power_state(dev, adev, acpi_target_sleep_state, | ||
705 | d_max_in, d_min_p); | ||
706 | } | ||
707 | EXPORT_SYMBOL(acpi_pm_device_sleep_state); | ||
708 | #endif /* CONFIG_PM */ | ||
709 | |||
710 | #ifdef CONFIG_PM_SLEEP | ||
711 | /** | ||
712 | * acpi_pm_device_sleep_wake - Enable or disable device to wake up the system. | ||
713 | * @dev: Device to enable/desible to wake up the system from sleep states. | ||
714 | * @enable: Whether to enable or disable @dev to wake up the system. | ||
715 | */ | ||
716 | int acpi_pm_device_sleep_wake(struct device *dev, bool enable) | ||
717 | { | ||
718 | acpi_handle handle; | ||
719 | struct acpi_device *adev; | ||
720 | int error; | ||
721 | |||
722 | if (!device_can_wakeup(dev)) | ||
723 | return -EINVAL; | ||
724 | |||
725 | handle = DEVICE_ACPI_HANDLE(dev); | ||
726 | if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &adev))) { | ||
727 | dev_dbg(dev, "ACPI handle without context in %s!\n", __func__); | ||
728 | return -ENODEV; | ||
729 | } | ||
730 | |||
731 | error = __acpi_device_sleep_wake(adev, acpi_target_sleep_state, enable); | ||
732 | if (!error) | ||
733 | dev_info(dev, "System wakeup %s by ACPI\n", | ||
734 | enable ? "enabled" : "disabled"); | ||
735 | |||
736 | return error; | ||
737 | } | ||
738 | #endif /* CONFIG_PM_SLEEP */ | ||
739 | |||
740 | static void acpi_power_off_prepare(void) | 689 | static void acpi_power_off_prepare(void) |
741 | { | 690 | { |
742 | /* Prepare to power off the system */ | 691 | /* Prepare to power off the system */ |
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h index 35812b6e0427..bf8709a1844d 100644 --- a/include/acpi/acpi_bus.h +++ b/include/acpi/acpi_bus.h | |||
@@ -470,9 +470,11 @@ static inline int acpi_pm_device_run_wake(struct device *dev, bool enable) | |||
470 | #endif | 470 | #endif |
471 | 471 | ||
472 | #ifdef CONFIG_PM_SLEEP | 472 | #ifdef CONFIG_PM_SLEEP |
473 | u32 acpi_target_system_state(void); | ||
473 | int __acpi_device_sleep_wake(struct acpi_device *, u32, bool); | 474 | int __acpi_device_sleep_wake(struct acpi_device *, u32, bool); |
474 | int acpi_pm_device_sleep_wake(struct device *, bool); | 475 | int acpi_pm_device_sleep_wake(struct device *, bool); |
475 | #else | 476 | #else |
477 | static inline u32 acpi_target_system_state(void) { return ACPI_STATE_S0; } | ||
476 | static inline int __acpi_device_sleep_wake(struct acpi_device *adev, | 478 | static inline int __acpi_device_sleep_wake(struct acpi_device *adev, |
477 | u32 target_state, bool enable) | 479 | u32 target_state, bool enable) |
478 | { | 480 | { |