1
2
3
4
5
6
7
8
9#include <linux/device.h>
10#include <linux/slab.h>
11#include <linux/sched.h>
12#include <linux/capability.h>
13#include <linux/export.h>
14#include <linux/suspend.h>
15#include <linux/seq_file.h>
16#include <linux/debugfs.h>
17#include <trace/events/power.h>
18
19#include "power.h"
20
21
22
23
24
25bool events_check_enabled __read_mostly;
26
27
28
29
30
31
32static atomic_t combined_event_count = ATOMIC_INIT(0);
33
34#define IN_PROGRESS_BITS (sizeof(int) * 4)
35#define MAX_IN_PROGRESS ((1 << IN_PROGRESS_BITS) - 1)
36
37static void split_counters(unsigned int *cnt, unsigned int *inpr)
38{
39 unsigned int comb = atomic_read(&combined_event_count);
40
41 *cnt = (comb >> IN_PROGRESS_BITS);
42 *inpr = comb & MAX_IN_PROGRESS;
43}
44
45
46static unsigned int saved_count;
47
48static DEFINE_SPINLOCK(events_lock);
49
50static void pm_wakeup_timer_fn(unsigned long data);
51
52static LIST_HEAD(wakeup_sources);
53
54static DECLARE_WAIT_QUEUE_HEAD(wakeup_count_wait_queue);
55
56
57
58
59
60
61
62
63
64void wakeup_source_prepare(struct wakeup_source *ws, const char *name)
65{
66 if (ws) {
67 memset(ws, 0, sizeof(*ws));
68 ws->name = name;
69 }
70}
71EXPORT_SYMBOL_GPL(wakeup_source_prepare);
72
73
74
75
76
77struct wakeup_source *wakeup_source_create(const char *name)
78{
79 struct wakeup_source *ws;
80
81 ws = kmalloc(sizeof(*ws), GFP_KERNEL);
82 if (!ws)
83 return NULL;
84
85 wakeup_source_prepare(ws, name ? kstrdup(name, GFP_KERNEL) : NULL);
86 return ws;
87}
88EXPORT_SYMBOL_GPL(wakeup_source_create);
89
90
91
92
93
94
95
96
97void wakeup_source_drop(struct wakeup_source *ws)
98{
99 if (!ws)
100 return;
101
102 del_timer_sync(&ws->timer);
103 __pm_relax(ws);
104}
105EXPORT_SYMBOL_GPL(wakeup_source_drop);
106
107
108
109
110
111
112
113void wakeup_source_destroy(struct wakeup_source *ws)
114{
115 if (!ws)
116 return;
117
118 wakeup_source_drop(ws);
119 kfree(ws->name);
120 kfree(ws);
121}
122EXPORT_SYMBOL_GPL(wakeup_source_destroy);
123
124
125
126
127
128void wakeup_source_add(struct wakeup_source *ws)
129{
130 unsigned long flags;
131
132 if (WARN_ON(!ws))
133 return;
134
135 spin_lock_init(&ws->lock);
136 setup_timer(&ws->timer, pm_wakeup_timer_fn, (unsigned long)ws);
137 ws->active = false;
138 ws->last_time = ktime_get();
139
140 spin_lock_irqsave(&events_lock, flags);
141 list_add_rcu(&ws->entry, &wakeup_sources);
142 spin_unlock_irqrestore(&events_lock, flags);
143}
144EXPORT_SYMBOL_GPL(wakeup_source_add);
145
146
147
148
149
150void wakeup_source_remove(struct wakeup_source *ws)
151{
152 unsigned long flags;
153
154 if (WARN_ON(!ws))
155 return;
156
157 spin_lock_irqsave(&events_lock, flags);
158 list_del_rcu(&ws->entry);
159 spin_unlock_irqrestore(&events_lock, flags);
160 synchronize_rcu();
161}
162EXPORT_SYMBOL_GPL(wakeup_source_remove);
163
164
165
166
167
168struct wakeup_source *wakeup_source_register(const char *name)
169{
170 struct wakeup_source *ws;
171
172 ws = wakeup_source_create(name);
173 if (ws)
174 wakeup_source_add(ws);
175
176 return ws;
177}
178EXPORT_SYMBOL_GPL(wakeup_source_register);
179
180
181
182
183
184void wakeup_source_unregister(struct wakeup_source *ws)
185{
186 if (ws) {
187 wakeup_source_remove(ws);
188 wakeup_source_destroy(ws);
189 }
190}
191EXPORT_SYMBOL_GPL(wakeup_source_unregister);
192
193
194
195
196
197
198
199
200static int device_wakeup_attach(struct device *dev, struct wakeup_source *ws)
201{
202 spin_lock_irq(&dev->power.lock);
203 if (dev->power.wakeup) {
204 spin_unlock_irq(&dev->power.lock);
205 return -EEXIST;
206 }
207 dev->power.wakeup = ws;
208 spin_unlock_irq(&dev->power.lock);
209 return 0;
210}
211
212
213
214
215
216
217
218int device_wakeup_enable(struct device *dev)
219{
220 struct wakeup_source *ws;
221 int ret;
222
223 if (!dev || !dev->power.can_wakeup)
224 return -EINVAL;
225
226 ws = wakeup_source_register(dev_name(dev));
227 if (!ws)
228 return -ENOMEM;
229
230 ret = device_wakeup_attach(dev, ws);
231 if (ret)
232 wakeup_source_unregister(ws);
233
234 return ret;
235}
236EXPORT_SYMBOL_GPL(device_wakeup_enable);
237
238
239
240
241
242
243
244static struct wakeup_source *device_wakeup_detach(struct device *dev)
245{
246 struct wakeup_source *ws;
247
248 spin_lock_irq(&dev->power.lock);
249 ws = dev->power.wakeup;
250 dev->power.wakeup = NULL;
251 spin_unlock_irq(&dev->power.lock);
252 return ws;
253}
254
255
256
257
258
259
260
261
262int device_wakeup_disable(struct device *dev)
263{
264 struct wakeup_source *ws;
265
266 if (!dev || !dev->power.can_wakeup)
267 return -EINVAL;
268
269 ws = device_wakeup_detach(dev);
270 if (ws)
271 wakeup_source_unregister(ws);
272
273 return 0;
274}
275EXPORT_SYMBOL_GPL(device_wakeup_disable);
276
277
278
279
280
281
282
283
284
285
286
287
288
289void device_set_wakeup_capable(struct device *dev, bool capable)
290{
291 if (!!dev->power.can_wakeup == !!capable)
292 return;
293
294 if (device_is_registered(dev) && !list_empty(&dev->power.entry)) {
295 if (capable) {
296 if (wakeup_sysfs_add(dev))
297 return;
298 } else {
299 wakeup_sysfs_remove(dev);
300 }
301 }
302 dev->power.can_wakeup = capable;
303}
304EXPORT_SYMBOL_GPL(device_set_wakeup_capable);
305
306
307
308
309
310
311
312
313
314
315
316
317int device_init_wakeup(struct device *dev, bool enable)
318{
319 int ret = 0;
320
321 if (!dev)
322 return -EINVAL;
323
324 if (enable) {
325 device_set_wakeup_capable(dev, true);
326 ret = device_wakeup_enable(dev);
327 } else {
328 if (dev->power.can_wakeup)
329 device_wakeup_disable(dev);
330
331 device_set_wakeup_capable(dev, false);
332 }
333
334 return ret;
335}
336EXPORT_SYMBOL_GPL(device_init_wakeup);
337
338
339
340
341
342int device_set_wakeup_enable(struct device *dev, bool enable)
343{
344 if (!dev || !dev->power.can_wakeup)
345 return -EINVAL;
346
347 return enable ? device_wakeup_enable(dev) : device_wakeup_disable(dev);
348}
349EXPORT_SYMBOL_GPL(device_set_wakeup_enable);
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387static void wakeup_source_activate(struct wakeup_source *ws)
388{
389 unsigned int cec;
390
391
392
393
394
395 freeze_wake();
396
397 ws->active = true;
398 ws->active_count++;
399 ws->last_time = ktime_get();
400 if (ws->autosleep_enabled)
401 ws->start_prevent_time = ws->last_time;
402
403
404 cec = atomic_inc_return(&combined_event_count);
405
406 trace_wakeup_source_activate(ws->name, cec);
407}
408
409
410
411
412
413static void wakeup_source_report_event(struct wakeup_source *ws)
414{
415 ws->event_count++;
416
417 if (events_check_enabled)
418 ws->wakeup_count++;
419
420 if (!ws->active)
421 wakeup_source_activate(ws);
422}
423
424
425
426
427
428
429
430void __pm_stay_awake(struct wakeup_source *ws)
431{
432 unsigned long flags;
433
434 if (!ws)
435 return;
436
437 spin_lock_irqsave(&ws->lock, flags);
438
439 wakeup_source_report_event(ws);
440 del_timer(&ws->timer);
441 ws->timer_expires = 0;
442
443 spin_unlock_irqrestore(&ws->lock, flags);
444}
445EXPORT_SYMBOL_GPL(__pm_stay_awake);
446
447
448
449
450
451
452
453
454
455
456
457
458void pm_stay_awake(struct device *dev)
459{
460 unsigned long flags;
461
462 if (!dev)
463 return;
464
465 spin_lock_irqsave(&dev->power.lock, flags);
466 __pm_stay_awake(dev->power.wakeup);
467 spin_unlock_irqrestore(&dev->power.lock, flags);
468}
469EXPORT_SYMBOL_GPL(pm_stay_awake);
470
471#ifdef CONFIG_PM_AUTOSLEEP
472static void update_prevent_sleep_time(struct wakeup_source *ws, ktime_t now)
473{
474 ktime_t delta = ktime_sub(now, ws->start_prevent_time);
475 ws->prevent_sleep_time = ktime_add(ws->prevent_sleep_time, delta);
476}
477#else
478static inline void update_prevent_sleep_time(struct wakeup_source *ws,
479 ktime_t now) {}
480#endif
481
482
483
484
485
486
487
488
489
490static void wakeup_source_deactivate(struct wakeup_source *ws)
491{
492 unsigned int cnt, inpr, cec;
493 ktime_t duration;
494 ktime_t now;
495
496 ws->relax_count++;
497
498
499
500
501
502
503
504
505
506 if (ws->relax_count != ws->active_count) {
507 ws->relax_count--;
508 return;
509 }
510
511 ws->active = false;
512
513 now = ktime_get();
514 duration = ktime_sub(now, ws->last_time);
515 ws->total_time = ktime_add(ws->total_time, duration);
516 if (ktime_to_ns(duration) > ktime_to_ns(ws->max_time))
517 ws->max_time = duration;
518
519 ws->last_time = now;
520 del_timer(&ws->timer);
521 ws->timer_expires = 0;
522
523 if (ws->autosleep_enabled)
524 update_prevent_sleep_time(ws, now);
525
526
527
528
529
530 cec = atomic_add_return(MAX_IN_PROGRESS, &combined_event_count);
531 trace_wakeup_source_deactivate(ws->name, cec);
532
533 split_counters(&cnt, &inpr);
534 if (!inpr && waitqueue_active(&wakeup_count_wait_queue))
535 wake_up(&wakeup_count_wait_queue);
536}
537
538
539
540
541
542
543
544
545
546
547void __pm_relax(struct wakeup_source *ws)
548{
549 unsigned long flags;
550
551 if (!ws)
552 return;
553
554 spin_lock_irqsave(&ws->lock, flags);
555 if (ws->active)
556 wakeup_source_deactivate(ws);
557 spin_unlock_irqrestore(&ws->lock, flags);
558}
559EXPORT_SYMBOL_GPL(__pm_relax);
560
561
562
563
564
565
566
567void pm_relax(struct device *dev)
568{
569 unsigned long flags;
570
571 if (!dev)
572 return;
573
574 spin_lock_irqsave(&dev->power.lock, flags);
575 __pm_relax(dev->power.wakeup);
576 spin_unlock_irqrestore(&dev->power.lock, flags);
577}
578EXPORT_SYMBOL_GPL(pm_relax);
579
580
581
582
583
584
585
586
587
588static void pm_wakeup_timer_fn(unsigned long data)
589{
590 struct wakeup_source *ws = (struct wakeup_source *)data;
591 unsigned long flags;
592
593 spin_lock_irqsave(&ws->lock, flags);
594
595 if (ws->active && ws->timer_expires
596 && time_after_eq(jiffies, ws->timer_expires)) {
597 wakeup_source_deactivate(ws);
598 ws->expire_count++;
599 }
600
601 spin_unlock_irqrestore(&ws->lock, flags);
602}
603
604
605
606
607
608
609
610
611
612
613
614
615
616void __pm_wakeup_event(struct wakeup_source *ws, unsigned int msec)
617{
618 unsigned long flags;
619 unsigned long expires;
620
621 if (!ws)
622 return;
623
624 spin_lock_irqsave(&ws->lock, flags);
625
626 wakeup_source_report_event(ws);
627
628 if (!msec) {
629 wakeup_source_deactivate(ws);
630 goto unlock;
631 }
632
633 expires = jiffies + msecs_to_jiffies(msec);
634 if (!expires)
635 expires = 1;
636
637 if (!ws->timer_expires || time_after(expires, ws->timer_expires)) {
638 mod_timer(&ws->timer, expires);
639 ws->timer_expires = expires;
640 }
641
642 unlock:
643 spin_unlock_irqrestore(&ws->lock, flags);
644}
645EXPORT_SYMBOL_GPL(__pm_wakeup_event);
646
647
648
649
650
651
652
653
654
655void pm_wakeup_event(struct device *dev, unsigned int msec)
656{
657 unsigned long flags;
658
659 if (!dev)
660 return;
661
662 spin_lock_irqsave(&dev->power.lock, flags);
663 __pm_wakeup_event(dev->power.wakeup, msec);
664 spin_unlock_irqrestore(&dev->power.lock, flags);
665}
666EXPORT_SYMBOL_GPL(pm_wakeup_event);
667
668void pm_print_active_wakeup_sources(void)
669{
670 struct wakeup_source *ws;
671 int active = 0;
672 struct wakeup_source *last_activity_ws = NULL;
673
674 rcu_read_lock();
675 list_for_each_entry_rcu(ws, &wakeup_sources, entry) {
676 if (ws->active) {
677 pr_info("active wakeup source: %s\n", ws->name);
678 active = 1;
679 } else if (!active &&
680 (!last_activity_ws ||
681 ktime_to_ns(ws->last_time) >
682 ktime_to_ns(last_activity_ws->last_time))) {
683 last_activity_ws = ws;
684 }
685 }
686
687 if (!active && last_activity_ws)
688 pr_info("last active wakeup source: %s\n",
689 last_activity_ws->name);
690 rcu_read_unlock();
691}
692EXPORT_SYMBOL_GPL(pm_print_active_wakeup_sources);
693
694
695
696
697
698
699
700
701
702bool pm_wakeup_pending(void)
703{
704 unsigned long flags;
705 bool ret = false;
706
707 spin_lock_irqsave(&events_lock, flags);
708 if (events_check_enabled) {
709 unsigned int cnt, inpr;
710
711 split_counters(&cnt, &inpr);
712 ret = (cnt != saved_count || inpr > 0);
713 events_check_enabled = !ret;
714 }
715 spin_unlock_irqrestore(&events_lock, flags);
716
717 if (ret) {
718 pr_info("PM: Wakeup pending, aborting suspend\n");
719 pm_print_active_wakeup_sources();
720 }
721
722 return ret;
723}
724
725
726
727
728
729
730
731
732
733
734
735
736
737bool pm_get_wakeup_count(unsigned int *count, bool block)
738{
739 unsigned int cnt, inpr;
740
741 if (block) {
742 DEFINE_WAIT(wait);
743
744 for (;;) {
745 prepare_to_wait(&wakeup_count_wait_queue, &wait,
746 TASK_INTERRUPTIBLE);
747 split_counters(&cnt, &inpr);
748 if (inpr == 0 || signal_pending(current))
749 break;
750
751 schedule();
752 }
753 finish_wait(&wakeup_count_wait_queue, &wait);
754 }
755
756 split_counters(&cnt, &inpr);
757 *count = cnt;
758 return !inpr;
759}
760
761
762
763
764
765
766
767
768
769
770
771bool pm_save_wakeup_count(unsigned int count)
772{
773 unsigned int cnt, inpr;
774 unsigned long flags;
775
776 events_check_enabled = false;
777 spin_lock_irqsave(&events_lock, flags);
778 split_counters(&cnt, &inpr);
779 if (cnt == count && inpr == 0) {
780 saved_count = count;
781 events_check_enabled = true;
782 }
783 spin_unlock_irqrestore(&events_lock, flags);
784 return events_check_enabled;
785}
786
787#ifdef CONFIG_PM_AUTOSLEEP
788
789
790
791
792void pm_wakep_autosleep_enabled(bool set)
793{
794 struct wakeup_source *ws;
795 ktime_t now = ktime_get();
796
797 rcu_read_lock();
798 list_for_each_entry_rcu(ws, &wakeup_sources, entry) {
799 spin_lock_irq(&ws->lock);
800 if (ws->autosleep_enabled != set) {
801 ws->autosleep_enabled = set;
802 if (ws->active) {
803 if (set)
804 ws->start_prevent_time = now;
805 else
806 update_prevent_sleep_time(ws, now);
807 }
808 }
809 spin_unlock_irq(&ws->lock);
810 }
811 rcu_read_unlock();
812}
813#endif
814
815static struct dentry *wakeup_sources_stats_dentry;
816
817
818
819
820
821
822static int print_wakeup_source_stats(struct seq_file *m,
823 struct wakeup_source *ws)
824{
825 unsigned long flags;
826 ktime_t total_time;
827 ktime_t max_time;
828 unsigned long active_count;
829 ktime_t active_time;
830 ktime_t prevent_sleep_time;
831 int ret;
832
833 spin_lock_irqsave(&ws->lock, flags);
834
835 total_time = ws->total_time;
836 max_time = ws->max_time;
837 prevent_sleep_time = ws->prevent_sleep_time;
838 active_count = ws->active_count;
839 if (ws->active) {
840 ktime_t now = ktime_get();
841
842 active_time = ktime_sub(now, ws->last_time);
843 total_time = ktime_add(total_time, active_time);
844 if (active_time.tv64 > max_time.tv64)
845 max_time = active_time;
846
847 if (ws->autosleep_enabled)
848 prevent_sleep_time = ktime_add(prevent_sleep_time,
849 ktime_sub(now, ws->start_prevent_time));
850 } else {
851 active_time = ktime_set(0, 0);
852 }
853
854 ret = seq_printf(m, "%-12s\t%lu\t\t%lu\t\t%lu\t\t%lu\t\t"
855 "%lld\t\t%lld\t\t%lld\t\t%lld\t\t%lld\n",
856 ws->name, active_count, ws->event_count,
857 ws->wakeup_count, ws->expire_count,
858 ktime_to_ms(active_time), ktime_to_ms(total_time),
859 ktime_to_ms(max_time), ktime_to_ms(ws->last_time),
860 ktime_to_ms(prevent_sleep_time));
861
862 spin_unlock_irqrestore(&ws->lock, flags);
863
864 return ret;
865}
866
867
868
869
870
871static int wakeup_sources_stats_show(struct seq_file *m, void *unused)
872{
873 struct wakeup_source *ws;
874
875 seq_puts(m, "name\t\tactive_count\tevent_count\twakeup_count\t"
876 "expire_count\tactive_since\ttotal_time\tmax_time\t"
877 "last_change\tprevent_suspend_time\n");
878
879 rcu_read_lock();
880 list_for_each_entry_rcu(ws, &wakeup_sources, entry)
881 print_wakeup_source_stats(m, ws);
882 rcu_read_unlock();
883
884 return 0;
885}
886
887static int wakeup_sources_stats_open(struct inode *inode, struct file *file)
888{
889 return single_open(file, wakeup_sources_stats_show, NULL);
890}
891
892static const struct file_operations wakeup_sources_stats_fops = {
893 .owner = THIS_MODULE,
894 .open = wakeup_sources_stats_open,
895 .read = seq_read,
896 .llseek = seq_lseek,
897 .release = single_release,
898};
899
900static int __init wakeup_sources_debugfs_init(void)
901{
902 wakeup_sources_stats_dentry = debugfs_create_file("wakeup_sources",
903 S_IRUGO, NULL, NULL, &wakeup_sources_stats_fops);
904 return 0;
905}
906
907postcore_initcall(wakeup_sources_debugfs_init);
908