diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-04 14:14:36 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-04 14:14:36 -0400 |
| commit | f46e9913faeebcb6bd29edf795f12b60acbff171 (patch) | |
| tree | 1ed8871d0ebd638094d27317de1d8a53712ae15a /include/linux | |
| parent | 8d91530c5fd7f0b1e8c4ddfea2905e55a178569b (diff) | |
| parent | 8d4b9d1bfef117862a2889dec4dac227068544c9 (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6:
PM / Runtime: Add runtime PM statistics (v3)
PM / Runtime: Make runtime_status attribute not debug-only (v. 2)
PM: Do not use dynamically allocated objects in pm_wakeup_event()
PM / Suspend: Fix ordering of calls in suspend error paths
PM / Hibernate: Fix snapshot error code path
PM / Hibernate: Fix hibernation_platform_enter()
pm_qos: Get rid of the allocation in pm_qos_add_request()
pm_qos: Reimplement using plists
plist: Add plist_last
PM: Make it possible to avoid races between wakeup and system sleep
PNPACPI: Add support for remote wakeup
PM: describe kernel policy regarding wakeup defaults (v. 2)
PM / Hibernate: Fix typos in comments in kernel/power/swap.c
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/netdevice.h | 2 | ||||
| -rw-r--r-- | include/linux/plist.h | 29 | ||||
| -rw-r--r-- | include/linux/pm.h | 16 | ||||
| -rw-r--r-- | include/linux/pm_qos_params.h | 13 | ||||
| -rw-r--r-- | include/linux/pm_wakeup.h | 10 | ||||
| -rw-r--r-- | include/linux/pnp.h | 1 | ||||
| -rw-r--r-- | include/linux/suspend.h | 17 |
7 files changed, 77 insertions, 11 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index b21e4054c12c..2f22119b4b08 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -779,7 +779,7 @@ struct net_device { | |||
| 779 | */ | 779 | */ |
| 780 | char name[IFNAMSIZ]; | 780 | char name[IFNAMSIZ]; |
| 781 | 781 | ||
| 782 | struct pm_qos_request_list *pm_qos_req; | 782 | struct pm_qos_request_list pm_qos_req; |
| 783 | 783 | ||
| 784 | /* device name hash chain */ | 784 | /* device name hash chain */ |
| 785 | struct hlist_node name_hlist; | 785 | struct hlist_node name_hlist; |
diff --git a/include/linux/plist.h b/include/linux/plist.h index 6898985e7b38..7254eda078e5 100644 --- a/include/linux/plist.h +++ b/include/linux/plist.h | |||
| @@ -260,6 +260,23 @@ static inline int plist_node_empty(const struct plist_node *node) | |||
| 260 | #endif | 260 | #endif |
| 261 | 261 | ||
| 262 | /** | 262 | /** |
| 263 | * plist_last_entry - get the struct for the last entry | ||
| 264 | * @head: the &struct plist_head pointer | ||
| 265 | * @type: the type of the struct this is embedded in | ||
| 266 | * @member: the name of the list_struct within the struct | ||
| 267 | */ | ||
| 268 | #ifdef CONFIG_DEBUG_PI_LIST | ||
| 269 | # define plist_last_entry(head, type, member) \ | ||
| 270 | ({ \ | ||
| 271 | WARN_ON(plist_head_empty(head)); \ | ||
| 272 | container_of(plist_last(head), type, member); \ | ||
| 273 | }) | ||
| 274 | #else | ||
| 275 | # define plist_last_entry(head, type, member) \ | ||
| 276 | container_of(plist_last(head), type, member) | ||
| 277 | #endif | ||
| 278 | |||
| 279 | /** | ||
| 263 | * plist_first - return the first node (and thus, highest priority) | 280 | * plist_first - return the first node (and thus, highest priority) |
| 264 | * @head: the &struct plist_head pointer | 281 | * @head: the &struct plist_head pointer |
| 265 | * | 282 | * |
| @@ -271,4 +288,16 @@ static inline struct plist_node *plist_first(const struct plist_head *head) | |||
| 271 | struct plist_node, plist.node_list); | 288 | struct plist_node, plist.node_list); |
| 272 | } | 289 | } |
| 273 | 290 | ||
| 291 | /** | ||
| 292 | * plist_last - return the last node (and thus, lowest priority) | ||
| 293 | * @head: the &struct plist_head pointer | ||
| 294 | * | ||
| 295 | * Assumes the plist is _not_ empty. | ||
| 296 | */ | ||
| 297 | static inline struct plist_node *plist_last(const struct plist_head *head) | ||
| 298 | { | ||
| 299 | return list_entry(head->node_list.prev, | ||
| 300 | struct plist_node, plist.node_list); | ||
| 301 | } | ||
| 302 | |||
| 274 | #endif | 303 | #endif |
diff --git a/include/linux/pm.h b/include/linux/pm.h index 8e258c727971..52e8c55ff314 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h | |||
| @@ -457,6 +457,7 @@ struct dev_pm_info { | |||
| 457 | #ifdef CONFIG_PM_SLEEP | 457 | #ifdef CONFIG_PM_SLEEP |
| 458 | struct list_head entry; | 458 | struct list_head entry; |
| 459 | struct completion completion; | 459 | struct completion completion; |
| 460 | unsigned long wakeup_count; | ||
| 460 | #endif | 461 | #endif |
| 461 | #ifdef CONFIG_PM_RUNTIME | 462 | #ifdef CONFIG_PM_RUNTIME |
| 462 | struct timer_list suspend_timer; | 463 | struct timer_list suspend_timer; |
| @@ -476,9 +477,15 @@ struct dev_pm_info { | |||
| 476 | enum rpm_request request; | 477 | enum rpm_request request; |
| 477 | enum rpm_status runtime_status; | 478 | enum rpm_status runtime_status; |
| 478 | int runtime_error; | 479 | int runtime_error; |
| 480 | unsigned long active_jiffies; | ||
| 481 | unsigned long suspended_jiffies; | ||
| 482 | unsigned long accounting_timestamp; | ||
| 479 | #endif | 483 | #endif |
| 480 | }; | 484 | }; |
| 481 | 485 | ||
| 486 | extern void update_pm_runtime_accounting(struct device *dev); | ||
| 487 | |||
| 488 | |||
| 482 | /* | 489 | /* |
| 483 | * The PM_EVENT_ messages are also used by drivers implementing the legacy | 490 | * The PM_EVENT_ messages are also used by drivers implementing the legacy |
| 484 | * suspend framework, based on the ->suspend() and ->resume() callbacks common | 491 | * suspend framework, based on the ->suspend() and ->resume() callbacks common |
| @@ -552,6 +559,11 @@ extern void __suspend_report_result(const char *function, void *fn, int ret); | |||
| 552 | } while (0) | 559 | } while (0) |
| 553 | 560 | ||
| 554 | extern void device_pm_wait_for_dev(struct device *sub, struct device *dev); | 561 | extern void device_pm_wait_for_dev(struct device *sub, struct device *dev); |
| 562 | |||
| 563 | /* drivers/base/power/wakeup.c */ | ||
| 564 | extern void pm_wakeup_event(struct device *dev, unsigned int msec); | ||
| 565 | extern void pm_stay_awake(struct device *dev); | ||
| 566 | extern void pm_relax(void); | ||
| 555 | #else /* !CONFIG_PM_SLEEP */ | 567 | #else /* !CONFIG_PM_SLEEP */ |
| 556 | 568 | ||
| 557 | #define device_pm_lock() do {} while (0) | 569 | #define device_pm_lock() do {} while (0) |
| @@ -565,6 +577,10 @@ static inline int dpm_suspend_start(pm_message_t state) | |||
| 565 | #define suspend_report_result(fn, ret) do {} while (0) | 577 | #define suspend_report_result(fn, ret) do {} while (0) |
| 566 | 578 | ||
| 567 | static inline void device_pm_wait_for_dev(struct device *a, struct device *b) {} | 579 | static inline void device_pm_wait_for_dev(struct device *a, struct device *b) {} |
| 580 | |||
| 581 | static inline void pm_wakeup_event(struct device *dev, unsigned int msec) {} | ||
| 582 | static inline void pm_stay_awake(struct device *dev) {} | ||
| 583 | static inline void pm_relax(void) {} | ||
| 568 | #endif /* !CONFIG_PM_SLEEP */ | 584 | #endif /* !CONFIG_PM_SLEEP */ |
| 569 | 585 | ||
| 570 | /* How to reorder dpm_list after device_move() */ | 586 | /* How to reorder dpm_list after device_move() */ |
diff --git a/include/linux/pm_qos_params.h b/include/linux/pm_qos_params.h index 8ba440e5eb7f..77cbddb3784c 100644 --- a/include/linux/pm_qos_params.h +++ b/include/linux/pm_qos_params.h | |||
| @@ -1,8 +1,10 @@ | |||
| 1 | #ifndef _LINUX_PM_QOS_PARAMS_H | ||
| 2 | #define _LINUX_PM_QOS_PARAMS_H | ||
| 1 | /* interface for the pm_qos_power infrastructure of the linux kernel. | 3 | /* interface for the pm_qos_power infrastructure of the linux kernel. |
| 2 | * | 4 | * |
| 3 | * Mark Gross <mgross@linux.intel.com> | 5 | * Mark Gross <mgross@linux.intel.com> |
| 4 | */ | 6 | */ |
| 5 | #include <linux/list.h> | 7 | #include <linux/plist.h> |
| 6 | #include <linux/notifier.h> | 8 | #include <linux/notifier.h> |
| 7 | #include <linux/miscdevice.h> | 9 | #include <linux/miscdevice.h> |
| 8 | 10 | ||
| @@ -14,9 +16,12 @@ | |||
| 14 | #define PM_QOS_NUM_CLASSES 4 | 16 | #define PM_QOS_NUM_CLASSES 4 |
| 15 | #define PM_QOS_DEFAULT_VALUE -1 | 17 | #define PM_QOS_DEFAULT_VALUE -1 |
| 16 | 18 | ||
| 17 | struct pm_qos_request_list; | 19 | struct pm_qos_request_list { |
| 20 | struct plist_node list; | ||
| 21 | int pm_qos_class; | ||
| 22 | }; | ||
| 18 | 23 | ||
| 19 | struct pm_qos_request_list *pm_qos_add_request(int pm_qos_class, s32 value); | 24 | void pm_qos_add_request(struct pm_qos_request_list *l, int pm_qos_class, s32 value); |
| 20 | void pm_qos_update_request(struct pm_qos_request_list *pm_qos_req, | 25 | void pm_qos_update_request(struct pm_qos_request_list *pm_qos_req, |
| 21 | s32 new_value); | 26 | s32 new_value); |
| 22 | void pm_qos_remove_request(struct pm_qos_request_list *pm_qos_req); | 27 | void pm_qos_remove_request(struct pm_qos_request_list *pm_qos_req); |
| @@ -24,4 +29,6 @@ void pm_qos_remove_request(struct pm_qos_request_list *pm_qos_req); | |||
| 24 | int pm_qos_request(int pm_qos_class); | 29 | int pm_qos_request(int pm_qos_class); |
| 25 | int pm_qos_add_notifier(int pm_qos_class, struct notifier_block *notifier); | 30 | int pm_qos_add_notifier(int pm_qos_class, struct notifier_block *notifier); |
| 26 | int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier); | 31 | int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier); |
| 32 | int pm_qos_request_active(struct pm_qos_request_list *req); | ||
| 27 | 33 | ||
| 34 | #endif | ||
diff --git a/include/linux/pm_wakeup.h b/include/linux/pm_wakeup.h index 22d64c18056c..76aca48722ae 100644 --- a/include/linux/pm_wakeup.h +++ b/include/linux/pm_wakeup.h | |||
| @@ -29,8 +29,11 @@ | |||
| 29 | 29 | ||
| 30 | #ifdef CONFIG_PM | 30 | #ifdef CONFIG_PM |
| 31 | 31 | ||
| 32 | /* changes to device_may_wakeup take effect on the next pm state change. | 32 | /* Changes to device_may_wakeup take effect on the next pm state change. |
| 33 | * by default, devices should wakeup if they can. | 33 | * |
| 34 | * By default, most devices should leave wakeup disabled. The exceptions | ||
| 35 | * are devices that everyone expects to be wakeup sources: keyboards, | ||
| 36 | * power buttons, possibly network interfaces, etc. | ||
| 34 | */ | 37 | */ |
| 35 | static inline void device_init_wakeup(struct device *dev, bool val) | 38 | static inline void device_init_wakeup(struct device *dev, bool val) |
| 36 | { | 39 | { |
| @@ -59,7 +62,7 @@ static inline bool device_may_wakeup(struct device *dev) | |||
| 59 | 62 | ||
| 60 | #else /* !CONFIG_PM */ | 63 | #else /* !CONFIG_PM */ |
| 61 | 64 | ||
| 62 | /* For some reason the next two routines work even without CONFIG_PM */ | 65 | /* For some reason the following routines work even without CONFIG_PM */ |
| 63 | static inline void device_init_wakeup(struct device *dev, bool val) | 66 | static inline void device_init_wakeup(struct device *dev, bool val) |
| 64 | { | 67 | { |
| 65 | dev->power.can_wakeup = val; | 68 | dev->power.can_wakeup = val; |
| @@ -67,6 +70,7 @@ static inline void device_init_wakeup(struct device *dev, bool val) | |||
| 67 | 70 | ||
| 68 | static inline void device_set_wakeup_capable(struct device *dev, bool capable) | 71 | static inline void device_set_wakeup_capable(struct device *dev, bool capable) |
| 69 | { | 72 | { |
| 73 | dev->power.can_wakeup = capable; | ||
| 70 | } | 74 | } |
| 71 | 75 | ||
| 72 | static inline bool device_can_wakeup(struct device *dev) | 76 | static inline bool device_can_wakeup(struct device *dev) |
diff --git a/include/linux/pnp.h b/include/linux/pnp.h index 7c4193eb0072..1bc1338b817b 100644 --- a/include/linux/pnp.h +++ b/include/linux/pnp.h | |||
| @@ -414,6 +414,7 @@ struct pnp_protocol { | |||
| 414 | int (*disable) (struct pnp_dev *dev); | 414 | int (*disable) (struct pnp_dev *dev); |
| 415 | 415 | ||
| 416 | /* protocol specific suspend/resume */ | 416 | /* protocol specific suspend/resume */ |
| 417 | bool (*can_wakeup) (struct pnp_dev *dev); | ||
| 417 | int (*suspend) (struct pnp_dev * dev, pm_message_t state); | 418 | int (*suspend) (struct pnp_dev * dev, pm_message_t state); |
| 418 | int (*resume) (struct pnp_dev * dev); | 419 | int (*resume) (struct pnp_dev * dev); |
| 419 | 420 | ||
diff --git a/include/linux/suspend.h b/include/linux/suspend.h index bc7d6bb4cd8e..4af270ec2204 100644 --- a/include/linux/suspend.h +++ b/include/linux/suspend.h | |||
| @@ -61,14 +61,15 @@ typedef int __bitwise suspend_state_t; | |||
| 61 | * before device drivers' late suspend callbacks are executed. It returns | 61 | * before device drivers' late suspend callbacks are executed. It returns |
| 62 | * 0 on success or a negative error code otherwise, in which case the | 62 | * 0 on success or a negative error code otherwise, in which case the |
| 63 | * system cannot enter the desired sleep state (@prepare_late(), @enter(), | 63 | * system cannot enter the desired sleep state (@prepare_late(), @enter(), |
| 64 | * @wake(), and @finish() will not be called in that case). | 64 | * and @wake() will not be called in that case). |
| 65 | * | 65 | * |
| 66 | * @prepare_late: Finish preparing the platform for entering the system sleep | 66 | * @prepare_late: Finish preparing the platform for entering the system sleep |
| 67 | * state indicated by @begin(). | 67 | * state indicated by @begin(). |
| 68 | * @prepare_late is called before disabling nonboot CPUs and after | 68 | * @prepare_late is called before disabling nonboot CPUs and after |
| 69 | * device drivers' late suspend callbacks have been executed. It returns | 69 | * device drivers' late suspend callbacks have been executed. It returns |
| 70 | * 0 on success or a negative error code otherwise, in which case the | 70 | * 0 on success or a negative error code otherwise, in which case the |
| 71 | * system cannot enter the desired sleep state (@enter() and @wake()). | 71 | * system cannot enter the desired sleep state (@enter() will not be |
| 72 | * executed). | ||
| 72 | * | 73 | * |
| 73 | * @enter: Enter the system sleep state indicated by @begin() or represented by | 74 | * @enter: Enter the system sleep state indicated by @begin() or represented by |
| 74 | * the argument if @begin() is not implemented. | 75 | * the argument if @begin() is not implemented. |
| @@ -81,14 +82,15 @@ typedef int __bitwise suspend_state_t; | |||
| 81 | * resume callbacks are executed. | 82 | * resume callbacks are executed. |
| 82 | * This callback is optional, but should be implemented by the platforms | 83 | * This callback is optional, but should be implemented by the platforms |
| 83 | * that implement @prepare_late(). If implemented, it is always called | 84 | * that implement @prepare_late(). If implemented, it is always called |
| 84 | * after @enter(), even if @enter() fails. | 85 | * after @prepare_late and @enter(), even if one of them fails. |
| 85 | * | 86 | * |
| 86 | * @finish: Finish wake-up of the platform. | 87 | * @finish: Finish wake-up of the platform. |
| 87 | * @finish is called right prior to calling device drivers' regular suspend | 88 | * @finish is called right prior to calling device drivers' regular suspend |
| 88 | * callbacks. | 89 | * callbacks. |
| 89 | * This callback is optional, but should be implemented by the platforms | 90 | * This callback is optional, but should be implemented by the platforms |
| 90 | * that implement @prepare(). If implemented, it is always called after | 91 | * that implement @prepare(). If implemented, it is always called after |
| 91 | * @enter() and @wake(), if implemented, even if any of them fails. | 92 | * @enter() and @wake(), even if any of them fails. It is executed after |
| 93 | * a failing @prepare. | ||
| 92 | * | 94 | * |
| 93 | * @end: Called by the PM core right after resuming devices, to indicate to | 95 | * @end: Called by the PM core right after resuming devices, to indicate to |
| 94 | * the platform that the system has returned to the working state or | 96 | * the platform that the system has returned to the working state or |
| @@ -286,6 +288,13 @@ extern int unregister_pm_notifier(struct notifier_block *nb); | |||
| 286 | { .notifier_call = fn, .priority = pri }; \ | 288 | { .notifier_call = fn, .priority = pri }; \ |
| 287 | register_pm_notifier(&fn##_nb); \ | 289 | register_pm_notifier(&fn##_nb); \ |
| 288 | } | 290 | } |
| 291 | |||
| 292 | /* drivers/base/power/wakeup.c */ | ||
| 293 | extern bool events_check_enabled; | ||
| 294 | |||
| 295 | extern bool pm_check_wakeup_events(void); | ||
| 296 | extern bool pm_get_wakeup_count(unsigned long *count); | ||
| 297 | extern bool pm_save_wakeup_count(unsigned long count); | ||
| 289 | #else /* !CONFIG_PM_SLEEP */ | 298 | #else /* !CONFIG_PM_SLEEP */ |
| 290 | 299 | ||
| 291 | static inline int register_pm_notifier(struct notifier_block *nb) | 300 | static inline int register_pm_notifier(struct notifier_block *nb) |
