aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base/power/wakeup.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/base/power/wakeup.c')
-rw-r--r--drivers/base/power/wakeup.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c
index 1132799421cd..cf1706df7610 100644
--- a/drivers/base/power/wakeup.c
+++ b/drivers/base/power/wakeup.c
@@ -660,29 +660,33 @@ bool pm_wakeup_pending(void)
660/** 660/**
661 * pm_get_wakeup_count - Read the number of registered wakeup events. 661 * pm_get_wakeup_count - Read the number of registered wakeup events.
662 * @count: Address to store the value at. 662 * @count: Address to store the value at.
663 * @block: Whether or not to block.
663 * 664 *
664 * Store the number of registered wakeup events at the address in @count. Block 665 * Store the number of registered wakeup events at the address in @count. If
665 * if the current number of wakeup events being processed is nonzero. 666 * @block is set, block until the current number of wakeup events being
667 * processed is zero.
666 * 668 *
667 * Return 'false' if the wait for the number of wakeup events being processed to 669 * Return 'false' if the current number of wakeup events being processed is
668 * drop down to zero has been interrupted by a signal (and the current number 670 * nonzero. Otherwise return 'true'.
669 * of wakeup events being processed is still nonzero). Otherwise return 'true'.
670 */ 671 */
671bool pm_get_wakeup_count(unsigned int *count) 672bool pm_get_wakeup_count(unsigned int *count, bool block)
672{ 673{
673 unsigned int cnt, inpr; 674 unsigned int cnt, inpr;
674 DEFINE_WAIT(wait);
675 675
676 for (;;) { 676 if (block) {
677 prepare_to_wait(&wakeup_count_wait_queue, &wait, 677 DEFINE_WAIT(wait);
678 TASK_INTERRUPTIBLE); 678
679 split_counters(&cnt, &inpr); 679 for (;;) {
680 if (inpr == 0 || signal_pending(current)) 680 prepare_to_wait(&wakeup_count_wait_queue, &wait,
681 break; 681 TASK_INTERRUPTIBLE);
682 split_counters(&cnt, &inpr);
683 if (inpr == 0 || signal_pending(current))
684 break;
682 685
683 schedule(); 686 schedule();
687 }
688 finish_wait(&wakeup_count_wait_queue, &wait);
684 } 689 }
685 finish_wait(&wakeup_count_wait_queue, &wait);
686 690
687 split_counters(&cnt, &inpr); 691 split_counters(&cnt, &inpr);
688 *count = cnt; 692 *count = cnt;