This source file includes following definitions.
- lock_system_sleep
- unlock_system_sleep
- ksys_sync_helper
- register_pm_notifier
- unregister_pm_notifier
- __pm_notifier_call_chain
- pm_notifier_call_chain
- pm_async_show
- pm_async_store
- mem_sleep_show
- decode_suspend_state
- mem_sleep_store
- pm_test_show
- pm_test_store
- suspend_step_name
- last_failed_dev_show
- last_failed_errno_show
- last_failed_step_show
- suspend_stats_show
- pm_debugfs_init
- pm_print_times_show
- pm_print_times_store
- pm_print_times_init
- pm_wakeup_irq_show
- pm_debug_messages_show
- pm_debug_messages_store
- __pm_pr_dbg
- pm_print_times_init
- state_show
- decode_state
- state_store
- wakeup_count_show
- wakeup_count_store
- autosleep_show
- autosleep_store
- wake_lock_show
- wake_lock_store
- wake_unlock_show
- wake_unlock_store
- pm_trace_show
- pm_trace_store
- pm_trace_dev_match_show
- pm_freeze_timeout_show
- pm_freeze_timeout_store
- pm_start_workqueue
- pm_init
1
2
3
4
5
6
7
8
9 #include <linux/export.h>
10 #include <linux/kobject.h>
11 #include <linux/string.h>
12 #include <linux/pm-trace.h>
13 #include <linux/workqueue.h>
14 #include <linux/debugfs.h>
15 #include <linux/seq_file.h>
16 #include <linux/suspend.h>
17 #include <linux/syscalls.h>
18 #include <linux/pm_runtime.h>
19
20 #include "power.h"
21
22 #ifdef CONFIG_PM_SLEEP
23
24 void lock_system_sleep(void)
25 {
26 current->flags |= PF_FREEZER_SKIP;
27 mutex_lock(&system_transition_mutex);
28 }
29 EXPORT_SYMBOL_GPL(lock_system_sleep);
30
31 void unlock_system_sleep(void)
32 {
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 current->flags &= ~PF_FREEZER_SKIP;
50 mutex_unlock(&system_transition_mutex);
51 }
52 EXPORT_SYMBOL_GPL(unlock_system_sleep);
53
54 void ksys_sync_helper(void)
55 {
56 ktime_t start;
57 long elapsed_msecs;
58
59 start = ktime_get();
60 ksys_sync();
61 elapsed_msecs = ktime_to_ms(ktime_sub(ktime_get(), start));
62 pr_info("Filesystems sync: %ld.%03ld seconds\n",
63 elapsed_msecs / MSEC_PER_SEC, elapsed_msecs % MSEC_PER_SEC);
64 }
65 EXPORT_SYMBOL_GPL(ksys_sync_helper);
66
67
68
69 static BLOCKING_NOTIFIER_HEAD(pm_chain_head);
70
71 int register_pm_notifier(struct notifier_block *nb)
72 {
73 return blocking_notifier_chain_register(&pm_chain_head, nb);
74 }
75 EXPORT_SYMBOL_GPL(register_pm_notifier);
76
77 int unregister_pm_notifier(struct notifier_block *nb)
78 {
79 return blocking_notifier_chain_unregister(&pm_chain_head, nb);
80 }
81 EXPORT_SYMBOL_GPL(unregister_pm_notifier);
82
83 int __pm_notifier_call_chain(unsigned long val, int nr_to_call, int *nr_calls)
84 {
85 int ret;
86
87 ret = __blocking_notifier_call_chain(&pm_chain_head, val, NULL,
88 nr_to_call, nr_calls);
89
90 return notifier_to_errno(ret);
91 }
92 int pm_notifier_call_chain(unsigned long val)
93 {
94 return __pm_notifier_call_chain(val, -1, NULL);
95 }
96
97
98 int pm_async_enabled = 1;
99
100 static ssize_t pm_async_show(struct kobject *kobj, struct kobj_attribute *attr,
101 char *buf)
102 {
103 return sprintf(buf, "%d\n", pm_async_enabled);
104 }
105
106 static ssize_t pm_async_store(struct kobject *kobj, struct kobj_attribute *attr,
107 const char *buf, size_t n)
108 {
109 unsigned long val;
110
111 if (kstrtoul(buf, 10, &val))
112 return -EINVAL;
113
114 if (val > 1)
115 return -EINVAL;
116
117 pm_async_enabled = val;
118 return n;
119 }
120
121 power_attr(pm_async);
122
123 #ifdef CONFIG_SUSPEND
124 static ssize_t mem_sleep_show(struct kobject *kobj, struct kobj_attribute *attr,
125 char *buf)
126 {
127 char *s = buf;
128 suspend_state_t i;
129
130 for (i = PM_SUSPEND_MIN; i < PM_SUSPEND_MAX; i++)
131 if (mem_sleep_states[i]) {
132 const char *label = mem_sleep_states[i];
133
134 if (mem_sleep_current == i)
135 s += sprintf(s, "[%s] ", label);
136 else
137 s += sprintf(s, "%s ", label);
138 }
139
140
141 if (s != buf)
142 *(s-1) = '\n';
143
144 return (s - buf);
145 }
146
147 static suspend_state_t decode_suspend_state(const char *buf, size_t n)
148 {
149 suspend_state_t state;
150 char *p;
151 int len;
152
153 p = memchr(buf, '\n', n);
154 len = p ? p - buf : n;
155
156 for (state = PM_SUSPEND_MIN; state < PM_SUSPEND_MAX; state++) {
157 const char *label = mem_sleep_states[state];
158
159 if (label && len == strlen(label) && !strncmp(buf, label, len))
160 return state;
161 }
162
163 return PM_SUSPEND_ON;
164 }
165
166 static ssize_t mem_sleep_store(struct kobject *kobj, struct kobj_attribute *attr,
167 const char *buf, size_t n)
168 {
169 suspend_state_t state;
170 int error;
171
172 error = pm_autosleep_lock();
173 if (error)
174 return error;
175
176 if (pm_autosleep_state() > PM_SUSPEND_ON) {
177 error = -EBUSY;
178 goto out;
179 }
180
181 state = decode_suspend_state(buf, n);
182 if (state < PM_SUSPEND_MAX && state > PM_SUSPEND_ON)
183 mem_sleep_current = state;
184 else
185 error = -EINVAL;
186
187 out:
188 pm_autosleep_unlock();
189 return error ? error : n;
190 }
191
192 power_attr(mem_sleep);
193 #endif
194
195 #ifdef CONFIG_PM_SLEEP_DEBUG
196 int pm_test_level = TEST_NONE;
197
198 static const char * const pm_tests[__TEST_AFTER_LAST] = {
199 [TEST_NONE] = "none",
200 [TEST_CORE] = "core",
201 [TEST_CPUS] = "processors",
202 [TEST_PLATFORM] = "platform",
203 [TEST_DEVICES] = "devices",
204 [TEST_FREEZER] = "freezer",
205 };
206
207 static ssize_t pm_test_show(struct kobject *kobj, struct kobj_attribute *attr,
208 char *buf)
209 {
210 char *s = buf;
211 int level;
212
213 for (level = TEST_FIRST; level <= TEST_MAX; level++)
214 if (pm_tests[level]) {
215 if (level == pm_test_level)
216 s += sprintf(s, "[%s] ", pm_tests[level]);
217 else
218 s += sprintf(s, "%s ", pm_tests[level]);
219 }
220
221 if (s != buf)
222
223 *(s-1) = '\n';
224
225 return (s - buf);
226 }
227
228 static ssize_t pm_test_store(struct kobject *kobj, struct kobj_attribute *attr,
229 const char *buf, size_t n)
230 {
231 const char * const *s;
232 int level;
233 char *p;
234 int len;
235 int error = -EINVAL;
236
237 p = memchr(buf, '\n', n);
238 len = p ? p - buf : n;
239
240 lock_system_sleep();
241
242 level = TEST_FIRST;
243 for (s = &pm_tests[level]; level <= TEST_MAX; s++, level++)
244 if (*s && len == strlen(*s) && !strncmp(buf, *s, len)) {
245 pm_test_level = level;
246 error = 0;
247 break;
248 }
249
250 unlock_system_sleep();
251
252 return error ? error : n;
253 }
254
255 power_attr(pm_test);
256 #endif
257
258 static char *suspend_step_name(enum suspend_stat_step step)
259 {
260 switch (step) {
261 case SUSPEND_FREEZE:
262 return "freeze";
263 case SUSPEND_PREPARE:
264 return "prepare";
265 case SUSPEND_SUSPEND:
266 return "suspend";
267 case SUSPEND_SUSPEND_NOIRQ:
268 return "suspend_noirq";
269 case SUSPEND_RESUME_NOIRQ:
270 return "resume_noirq";
271 case SUSPEND_RESUME:
272 return "resume";
273 default:
274 return "";
275 }
276 }
277
278 #define suspend_attr(_name) \
279 static ssize_t _name##_show(struct kobject *kobj, \
280 struct kobj_attribute *attr, char *buf) \
281 { \
282 return sprintf(buf, "%d\n", suspend_stats._name); \
283 } \
284 static struct kobj_attribute _name = __ATTR_RO(_name)
285
286 suspend_attr(success);
287 suspend_attr(fail);
288 suspend_attr(failed_freeze);
289 suspend_attr(failed_prepare);
290 suspend_attr(failed_suspend);
291 suspend_attr(failed_suspend_late);
292 suspend_attr(failed_suspend_noirq);
293 suspend_attr(failed_resume);
294 suspend_attr(failed_resume_early);
295 suspend_attr(failed_resume_noirq);
296
297 static ssize_t last_failed_dev_show(struct kobject *kobj,
298 struct kobj_attribute *attr, char *buf)
299 {
300 int index;
301 char *last_failed_dev = NULL;
302
303 index = suspend_stats.last_failed_dev + REC_FAILED_NUM - 1;
304 index %= REC_FAILED_NUM;
305 last_failed_dev = suspend_stats.failed_devs[index];
306
307 return sprintf(buf, "%s\n", last_failed_dev);
308 }
309 static struct kobj_attribute last_failed_dev = __ATTR_RO(last_failed_dev);
310
311 static ssize_t last_failed_errno_show(struct kobject *kobj,
312 struct kobj_attribute *attr, char *buf)
313 {
314 int index;
315 int last_failed_errno;
316
317 index = suspend_stats.last_failed_errno + REC_FAILED_NUM - 1;
318 index %= REC_FAILED_NUM;
319 last_failed_errno = suspend_stats.errno[index];
320
321 return sprintf(buf, "%d\n", last_failed_errno);
322 }
323 static struct kobj_attribute last_failed_errno = __ATTR_RO(last_failed_errno);
324
325 static ssize_t last_failed_step_show(struct kobject *kobj,
326 struct kobj_attribute *attr, char *buf)
327 {
328 int index;
329 enum suspend_stat_step step;
330 char *last_failed_step = NULL;
331
332 index = suspend_stats.last_failed_step + REC_FAILED_NUM - 1;
333 index %= REC_FAILED_NUM;
334 step = suspend_stats.failed_steps[index];
335 last_failed_step = suspend_step_name(step);
336
337 return sprintf(buf, "%s\n", last_failed_step);
338 }
339 static struct kobj_attribute last_failed_step = __ATTR_RO(last_failed_step);
340
341 static struct attribute *suspend_attrs[] = {
342 &success.attr,
343 &fail.attr,
344 &failed_freeze.attr,
345 &failed_prepare.attr,
346 &failed_suspend.attr,
347 &failed_suspend_late.attr,
348 &failed_suspend_noirq.attr,
349 &failed_resume.attr,
350 &failed_resume_early.attr,
351 &failed_resume_noirq.attr,
352 &last_failed_dev.attr,
353 &last_failed_errno.attr,
354 &last_failed_step.attr,
355 NULL,
356 };
357
358 static struct attribute_group suspend_attr_group = {
359 .name = "suspend_stats",
360 .attrs = suspend_attrs,
361 };
362
363 #ifdef CONFIG_DEBUG_FS
364 static int suspend_stats_show(struct seq_file *s, void *unused)
365 {
366 int i, index, last_dev, last_errno, last_step;
367
368 last_dev = suspend_stats.last_failed_dev + REC_FAILED_NUM - 1;
369 last_dev %= REC_FAILED_NUM;
370 last_errno = suspend_stats.last_failed_errno + REC_FAILED_NUM - 1;
371 last_errno %= REC_FAILED_NUM;
372 last_step = suspend_stats.last_failed_step + REC_FAILED_NUM - 1;
373 last_step %= REC_FAILED_NUM;
374 seq_printf(s, "%s: %d\n%s: %d\n%s: %d\n%s: %d\n%s: %d\n"
375 "%s: %d\n%s: %d\n%s: %d\n%s: %d\n%s: %d\n",
376 "success", suspend_stats.success,
377 "fail", suspend_stats.fail,
378 "failed_freeze", suspend_stats.failed_freeze,
379 "failed_prepare", suspend_stats.failed_prepare,
380 "failed_suspend", suspend_stats.failed_suspend,
381 "failed_suspend_late",
382 suspend_stats.failed_suspend_late,
383 "failed_suspend_noirq",
384 suspend_stats.failed_suspend_noirq,
385 "failed_resume", suspend_stats.failed_resume,
386 "failed_resume_early",
387 suspend_stats.failed_resume_early,
388 "failed_resume_noirq",
389 suspend_stats.failed_resume_noirq);
390 seq_printf(s, "failures:\n last_failed_dev:\t%-s\n",
391 suspend_stats.failed_devs[last_dev]);
392 for (i = 1; i < REC_FAILED_NUM; i++) {
393 index = last_dev + REC_FAILED_NUM - i;
394 index %= REC_FAILED_NUM;
395 seq_printf(s, "\t\t\t%-s\n",
396 suspend_stats.failed_devs[index]);
397 }
398 seq_printf(s, " last_failed_errno:\t%-d\n",
399 suspend_stats.errno[last_errno]);
400 for (i = 1; i < REC_FAILED_NUM; i++) {
401 index = last_errno + REC_FAILED_NUM - i;
402 index %= REC_FAILED_NUM;
403 seq_printf(s, "\t\t\t%-d\n",
404 suspend_stats.errno[index]);
405 }
406 seq_printf(s, " last_failed_step:\t%-s\n",
407 suspend_step_name(
408 suspend_stats.failed_steps[last_step]));
409 for (i = 1; i < REC_FAILED_NUM; i++) {
410 index = last_step + REC_FAILED_NUM - i;
411 index %= REC_FAILED_NUM;
412 seq_printf(s, "\t\t\t%-s\n",
413 suspend_step_name(
414 suspend_stats.failed_steps[index]));
415 }
416
417 return 0;
418 }
419 DEFINE_SHOW_ATTRIBUTE(suspend_stats);
420
421 static int __init pm_debugfs_init(void)
422 {
423 debugfs_create_file("suspend_stats", S_IFREG | S_IRUGO,
424 NULL, NULL, &suspend_stats_fops);
425 return 0;
426 }
427
428 late_initcall(pm_debugfs_init);
429 #endif
430
431 #endif
432
433 #ifdef CONFIG_PM_SLEEP_DEBUG
434
435
436
437
438
439
440 bool pm_print_times_enabled;
441
442 static ssize_t pm_print_times_show(struct kobject *kobj,
443 struct kobj_attribute *attr, char *buf)
444 {
445 return sprintf(buf, "%d\n", pm_print_times_enabled);
446 }
447
448 static ssize_t pm_print_times_store(struct kobject *kobj,
449 struct kobj_attribute *attr,
450 const char *buf, size_t n)
451 {
452 unsigned long val;
453
454 if (kstrtoul(buf, 10, &val))
455 return -EINVAL;
456
457 if (val > 1)
458 return -EINVAL;
459
460 pm_print_times_enabled = !!val;
461 return n;
462 }
463
464 power_attr(pm_print_times);
465
466 static inline void pm_print_times_init(void)
467 {
468 pm_print_times_enabled = !!initcall_debug;
469 }
470
471 static ssize_t pm_wakeup_irq_show(struct kobject *kobj,
472 struct kobj_attribute *attr,
473 char *buf)
474 {
475 return pm_wakeup_irq ? sprintf(buf, "%u\n", pm_wakeup_irq) : -ENODATA;
476 }
477
478 power_attr_ro(pm_wakeup_irq);
479
480 bool pm_debug_messages_on __read_mostly;
481
482 static ssize_t pm_debug_messages_show(struct kobject *kobj,
483 struct kobj_attribute *attr, char *buf)
484 {
485 return sprintf(buf, "%d\n", pm_debug_messages_on);
486 }
487
488 static ssize_t pm_debug_messages_store(struct kobject *kobj,
489 struct kobj_attribute *attr,
490 const char *buf, size_t n)
491 {
492 unsigned long val;
493
494 if (kstrtoul(buf, 10, &val))
495 return -EINVAL;
496
497 if (val > 1)
498 return -EINVAL;
499
500 pm_debug_messages_on = !!val;
501 return n;
502 }
503
504 power_attr(pm_debug_messages);
505
506
507
508
509
510
511
512
513
514 void __pm_pr_dbg(bool defer, const char *fmt, ...)
515 {
516 struct va_format vaf;
517 va_list args;
518
519 if (!pm_debug_messages_on)
520 return;
521
522 va_start(args, fmt);
523
524 vaf.fmt = fmt;
525 vaf.va = &args;
526
527 if (defer)
528 printk_deferred(KERN_DEBUG "PM: %pV", &vaf);
529 else
530 printk(KERN_DEBUG "PM: %pV", &vaf);
531
532 va_end(args);
533 }
534
535 #else
536 static inline void pm_print_times_init(void) {}
537 #endif
538
539 struct kobject *power_kobj;
540
541
542
543
544
545
546
547
548
549
550
551
552 static ssize_t state_show(struct kobject *kobj, struct kobj_attribute *attr,
553 char *buf)
554 {
555 char *s = buf;
556 #ifdef CONFIG_SUSPEND
557 suspend_state_t i;
558
559 for (i = PM_SUSPEND_MIN; i < PM_SUSPEND_MAX; i++)
560 if (pm_states[i])
561 s += sprintf(s,"%s ", pm_states[i]);
562
563 #endif
564 if (hibernation_available())
565 s += sprintf(s, "disk ");
566 if (s != buf)
567
568 *(s-1) = '\n';
569 return (s - buf);
570 }
571
572 static suspend_state_t decode_state(const char *buf, size_t n)
573 {
574 #ifdef CONFIG_SUSPEND
575 suspend_state_t state;
576 #endif
577 char *p;
578 int len;
579
580 p = memchr(buf, '\n', n);
581 len = p ? p - buf : n;
582
583
584 if (len == 4 && str_has_prefix(buf, "disk"))
585 return PM_SUSPEND_MAX;
586
587 #ifdef CONFIG_SUSPEND
588 for (state = PM_SUSPEND_MIN; state < PM_SUSPEND_MAX; state++) {
589 const char *label = pm_states[state];
590
591 if (label && len == strlen(label) && !strncmp(buf, label, len))
592 return state;
593 }
594 #endif
595
596 return PM_SUSPEND_ON;
597 }
598
599 static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,
600 const char *buf, size_t n)
601 {
602 suspend_state_t state;
603 int error;
604
605 error = pm_autosleep_lock();
606 if (error)
607 return error;
608
609 if (pm_autosleep_state() > PM_SUSPEND_ON) {
610 error = -EBUSY;
611 goto out;
612 }
613
614 state = decode_state(buf, n);
615 if (state < PM_SUSPEND_MAX) {
616 if (state == PM_SUSPEND_MEM)
617 state = mem_sleep_current;
618
619 error = pm_suspend(state);
620 } else if (state == PM_SUSPEND_MAX) {
621 error = hibernate();
622 } else {
623 error = -EINVAL;
624 }
625
626 out:
627 pm_autosleep_unlock();
628 return error ? error : n;
629 }
630
631 power_attr(state);
632
633 #ifdef CONFIG_PM_SLEEP
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662 static ssize_t wakeup_count_show(struct kobject *kobj,
663 struct kobj_attribute *attr,
664 char *buf)
665 {
666 unsigned int val;
667
668 return pm_get_wakeup_count(&val, true) ?
669 sprintf(buf, "%u\n", val) : -EINTR;
670 }
671
672 static ssize_t wakeup_count_store(struct kobject *kobj,
673 struct kobj_attribute *attr,
674 const char *buf, size_t n)
675 {
676 unsigned int val;
677 int error;
678
679 error = pm_autosleep_lock();
680 if (error)
681 return error;
682
683 if (pm_autosleep_state() > PM_SUSPEND_ON) {
684 error = -EBUSY;
685 goto out;
686 }
687
688 error = -EINVAL;
689 if (sscanf(buf, "%u", &val) == 1) {
690 if (pm_save_wakeup_count(val))
691 error = n;
692 else
693 pm_print_active_wakeup_sources();
694 }
695
696 out:
697 pm_autosleep_unlock();
698 return error;
699 }
700
701 power_attr(wakeup_count);
702
703 #ifdef CONFIG_PM_AUTOSLEEP
704 static ssize_t autosleep_show(struct kobject *kobj,
705 struct kobj_attribute *attr,
706 char *buf)
707 {
708 suspend_state_t state = pm_autosleep_state();
709
710 if (state == PM_SUSPEND_ON)
711 return sprintf(buf, "off\n");
712
713 #ifdef CONFIG_SUSPEND
714 if (state < PM_SUSPEND_MAX)
715 return sprintf(buf, "%s\n", pm_states[state] ?
716 pm_states[state] : "error");
717 #endif
718 #ifdef CONFIG_HIBERNATION
719 return sprintf(buf, "disk\n");
720 #else
721 return sprintf(buf, "error");
722 #endif
723 }
724
725 static ssize_t autosleep_store(struct kobject *kobj,
726 struct kobj_attribute *attr,
727 const char *buf, size_t n)
728 {
729 suspend_state_t state = decode_state(buf, n);
730 int error;
731
732 if (state == PM_SUSPEND_ON
733 && strcmp(buf, "off") && strcmp(buf, "off\n"))
734 return -EINVAL;
735
736 if (state == PM_SUSPEND_MEM)
737 state = mem_sleep_current;
738
739 error = pm_autosleep_set_state(state);
740 return error ? error : n;
741 }
742
743 power_attr(autosleep);
744 #endif
745
746 #ifdef CONFIG_PM_WAKELOCKS
747 static ssize_t wake_lock_show(struct kobject *kobj,
748 struct kobj_attribute *attr,
749 char *buf)
750 {
751 return pm_show_wakelocks(buf, true);
752 }
753
754 static ssize_t wake_lock_store(struct kobject *kobj,
755 struct kobj_attribute *attr,
756 const char *buf, size_t n)
757 {
758 int error = pm_wake_lock(buf);
759 return error ? error : n;
760 }
761
762 power_attr(wake_lock);
763
764 static ssize_t wake_unlock_show(struct kobject *kobj,
765 struct kobj_attribute *attr,
766 char *buf)
767 {
768 return pm_show_wakelocks(buf, false);
769 }
770
771 static ssize_t wake_unlock_store(struct kobject *kobj,
772 struct kobj_attribute *attr,
773 const char *buf, size_t n)
774 {
775 int error = pm_wake_unlock(buf);
776 return error ? error : n;
777 }
778
779 power_attr(wake_unlock);
780
781 #endif
782 #endif
783
784 #ifdef CONFIG_PM_TRACE
785 int pm_trace_enabled;
786
787 static ssize_t pm_trace_show(struct kobject *kobj, struct kobj_attribute *attr,
788 char *buf)
789 {
790 return sprintf(buf, "%d\n", pm_trace_enabled);
791 }
792
793 static ssize_t
794 pm_trace_store(struct kobject *kobj, struct kobj_attribute *attr,
795 const char *buf, size_t n)
796 {
797 int val;
798
799 if (sscanf(buf, "%d", &val) == 1) {
800 pm_trace_enabled = !!val;
801 if (pm_trace_enabled) {
802 pr_warn("PM: Enabling pm_trace changes system date and time during resume.\n"
803 "PM: Correct system time has to be restored manually after resume.\n");
804 }
805 return n;
806 }
807 return -EINVAL;
808 }
809
810 power_attr(pm_trace);
811
812 static ssize_t pm_trace_dev_match_show(struct kobject *kobj,
813 struct kobj_attribute *attr,
814 char *buf)
815 {
816 return show_trace_dev_match(buf, PAGE_SIZE);
817 }
818
819 power_attr_ro(pm_trace_dev_match);
820
821 #endif
822
823 #ifdef CONFIG_FREEZER
824 static ssize_t pm_freeze_timeout_show(struct kobject *kobj,
825 struct kobj_attribute *attr, char *buf)
826 {
827 return sprintf(buf, "%u\n", freeze_timeout_msecs);
828 }
829
830 static ssize_t pm_freeze_timeout_store(struct kobject *kobj,
831 struct kobj_attribute *attr,
832 const char *buf, size_t n)
833 {
834 unsigned long val;
835
836 if (kstrtoul(buf, 10, &val))
837 return -EINVAL;
838
839 freeze_timeout_msecs = val;
840 return n;
841 }
842
843 power_attr(pm_freeze_timeout);
844
845 #endif
846
847 static struct attribute * g[] = {
848 &state_attr.attr,
849 #ifdef CONFIG_PM_TRACE
850 &pm_trace_attr.attr,
851 &pm_trace_dev_match_attr.attr,
852 #endif
853 #ifdef CONFIG_PM_SLEEP
854 &pm_async_attr.attr,
855 &wakeup_count_attr.attr,
856 #ifdef CONFIG_SUSPEND
857 &mem_sleep_attr.attr,
858 #endif
859 #ifdef CONFIG_PM_AUTOSLEEP
860 &autosleep_attr.attr,
861 #endif
862 #ifdef CONFIG_PM_WAKELOCKS
863 &wake_lock_attr.attr,
864 &wake_unlock_attr.attr,
865 #endif
866 #ifdef CONFIG_PM_SLEEP_DEBUG
867 &pm_test_attr.attr,
868 &pm_print_times_attr.attr,
869 &pm_wakeup_irq_attr.attr,
870 &pm_debug_messages_attr.attr,
871 #endif
872 #endif
873 #ifdef CONFIG_FREEZER
874 &pm_freeze_timeout_attr.attr,
875 #endif
876 NULL,
877 };
878
879 static const struct attribute_group attr_group = {
880 .attrs = g,
881 };
882
883 static const struct attribute_group *attr_groups[] = {
884 &attr_group,
885 #ifdef CONFIG_PM_SLEEP
886 &suspend_attr_group,
887 #endif
888 NULL,
889 };
890
891 struct workqueue_struct *pm_wq;
892 EXPORT_SYMBOL_GPL(pm_wq);
893
894 static int __init pm_start_workqueue(void)
895 {
896 pm_wq = alloc_workqueue("pm", WQ_FREEZABLE, 0);
897
898 return pm_wq ? 0 : -ENOMEM;
899 }
900
901 static int __init pm_init(void)
902 {
903 int error = pm_start_workqueue();
904 if (error)
905 return error;
906 hibernate_image_size_init();
907 hibernate_reserved_size_init();
908 pm_states_init();
909 power_kobj = kobject_create_and_add("power", NULL);
910 if (!power_kobj)
911 return -ENOMEM;
912 error = sysfs_create_groups(power_kobj, attr_groups);
913 if (error)
914 return error;
915 pm_print_times_init();
916 return pm_autosleep_init();
917 }
918
919 core_initcall(pm_init);