1
2
3
4
5#include <linux/device.h>
6#include <linux/string.h>
7#include <linux/export.h>
8#include <linux/pm_qos.h>
9#include <linux/pm_runtime.h>
10#include <linux/atomic.h>
11#include <linux/jiffies.h>
12#include "power.h"
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95const char power_group_name[] = "power";
96EXPORT_SYMBOL_GPL(power_group_name);
97
98static const char ctrl_auto[] = "auto";
99static const char ctrl_on[] = "on";
100
101static ssize_t control_show(struct device *dev, struct device_attribute *attr,
102 char *buf)
103{
104 return sprintf(buf, "%s\n",
105 dev->power.runtime_auto ? ctrl_auto : ctrl_on);
106}
107
108static ssize_t control_store(struct device * dev, struct device_attribute *attr,
109 const char * buf, size_t n)
110{
111 char *cp;
112 int len = n;
113
114 cp = memchr(buf, '\n', n);
115 if (cp)
116 len = cp - buf;
117 device_lock(dev);
118 if (len == sizeof ctrl_auto - 1 && strncmp(buf, ctrl_auto, len) == 0)
119 pm_runtime_allow(dev);
120 else if (len == sizeof ctrl_on - 1 && strncmp(buf, ctrl_on, len) == 0)
121 pm_runtime_forbid(dev);
122 else
123 n = -EINVAL;
124 device_unlock(dev);
125 return n;
126}
127
128static DEVICE_ATTR(control, 0644, control_show, control_store);
129
130static ssize_t rtpm_active_time_show(struct device *dev,
131 struct device_attribute *attr, char *buf)
132{
133 int ret;
134 spin_lock_irq(&dev->power.lock);
135 update_pm_runtime_accounting(dev);
136 ret = sprintf(buf, "%i\n", jiffies_to_msecs(dev->power.active_jiffies));
137 spin_unlock_irq(&dev->power.lock);
138 return ret;
139}
140
141static DEVICE_ATTR(runtime_active_time, 0444, rtpm_active_time_show, NULL);
142
143static ssize_t rtpm_suspended_time_show(struct device *dev,
144 struct device_attribute *attr, char *buf)
145{
146 int ret;
147 spin_lock_irq(&dev->power.lock);
148 update_pm_runtime_accounting(dev);
149 ret = sprintf(buf, "%i\n",
150 jiffies_to_msecs(dev->power.suspended_jiffies));
151 spin_unlock_irq(&dev->power.lock);
152 return ret;
153}
154
155static DEVICE_ATTR(runtime_suspended_time, 0444, rtpm_suspended_time_show, NULL);
156
157static ssize_t rtpm_status_show(struct device *dev,
158 struct device_attribute *attr, char *buf)
159{
160 const char *p;
161
162 if (dev->power.runtime_error) {
163 p = "error\n";
164 } else if (dev->power.disable_depth) {
165 p = "unsupported\n";
166 } else {
167 switch (dev->power.runtime_status) {
168 case RPM_SUSPENDED:
169 p = "suspended\n";
170 break;
171 case RPM_SUSPENDING:
172 p = "suspending\n";
173 break;
174 case RPM_RESUMING:
175 p = "resuming\n";
176 break;
177 case RPM_ACTIVE:
178 p = "active\n";
179 break;
180 default:
181 return -EIO;
182 }
183 }
184 return sprintf(buf, p);
185}
186
187static DEVICE_ATTR(runtime_status, 0444, rtpm_status_show, NULL);
188
189static ssize_t autosuspend_delay_ms_show(struct device *dev,
190 struct device_attribute *attr, char *buf)
191{
192 if (!dev->power.use_autosuspend)
193 return -EIO;
194 return sprintf(buf, "%d\n", dev->power.autosuspend_delay);
195}
196
197static ssize_t autosuspend_delay_ms_store(struct device *dev,
198 struct device_attribute *attr, const char *buf, size_t n)
199{
200 long delay;
201
202 if (!dev->power.use_autosuspend)
203 return -EIO;
204
205 if (kstrtol(buf, 10, &delay) != 0 || delay != (int) delay)
206 return -EINVAL;
207
208 device_lock(dev);
209 pm_runtime_set_autosuspend_delay(dev, delay);
210 device_unlock(dev);
211 return n;
212}
213
214static DEVICE_ATTR(autosuspend_delay_ms, 0644, autosuspend_delay_ms_show,
215 autosuspend_delay_ms_store);
216
217static ssize_t pm_qos_resume_latency_show(struct device *dev,
218 struct device_attribute *attr,
219 char *buf)
220{
221 return sprintf(buf, "%d\n", dev_pm_qos_requested_resume_latency(dev));
222}
223
224static ssize_t pm_qos_resume_latency_store(struct device *dev,
225 struct device_attribute *attr,
226 const char *buf, size_t n)
227{
228 s32 value;
229 int ret;
230
231 if (kstrtos32(buf, 0, &value))
232 return -EINVAL;
233
234 if (value < 0)
235 return -EINVAL;
236
237 ret = dev_pm_qos_update_request(dev->power.qos->resume_latency_req,
238 value);
239 return ret < 0 ? ret : n;
240}
241
242static DEVICE_ATTR(pm_qos_resume_latency_us, 0644,
243 pm_qos_resume_latency_show, pm_qos_resume_latency_store);
244
245static ssize_t pm_qos_latency_tolerance_show(struct device *dev,
246 struct device_attribute *attr,
247 char *buf)
248{
249 s32 value = dev_pm_qos_get_user_latency_tolerance(dev);
250
251 if (value < 0)
252 return sprintf(buf, "auto\n");
253 else if (value == PM_QOS_LATENCY_ANY)
254 return sprintf(buf, "any\n");
255
256 return sprintf(buf, "%d\n", value);
257}
258
259static ssize_t pm_qos_latency_tolerance_store(struct device *dev,
260 struct device_attribute *attr,
261 const char *buf, size_t n)
262{
263 s32 value;
264 int ret;
265
266 if (kstrtos32(buf, 0, &value)) {
267 if (!strcmp(buf, "auto") || !strcmp(buf, "auto\n"))
268 value = PM_QOS_LATENCY_TOLERANCE_NO_CONSTRAINT;
269 else if (!strcmp(buf, "any") || !strcmp(buf, "any\n"))
270 value = PM_QOS_LATENCY_ANY;
271 }
272 ret = dev_pm_qos_update_user_latency_tolerance(dev, value);
273 return ret < 0 ? ret : n;
274}
275
276static DEVICE_ATTR(pm_qos_latency_tolerance_us, 0644,
277 pm_qos_latency_tolerance_show, pm_qos_latency_tolerance_store);
278
279static ssize_t pm_qos_no_power_off_show(struct device *dev,
280 struct device_attribute *attr,
281 char *buf)
282{
283 return sprintf(buf, "%d\n", !!(dev_pm_qos_requested_flags(dev)
284 & PM_QOS_FLAG_NO_POWER_OFF));
285}
286
287static ssize_t pm_qos_no_power_off_store(struct device *dev,
288 struct device_attribute *attr,
289 const char *buf, size_t n)
290{
291 int ret;
292
293 if (kstrtoint(buf, 0, &ret))
294 return -EINVAL;
295
296 if (ret != 0 && ret != 1)
297 return -EINVAL;
298
299 ret = dev_pm_qos_update_flags(dev, PM_QOS_FLAG_NO_POWER_OFF, ret);
300 return ret < 0 ? ret : n;
301}
302
303static DEVICE_ATTR(pm_qos_no_power_off, 0644,
304 pm_qos_no_power_off_show, pm_qos_no_power_off_store);
305
306static ssize_t pm_qos_remote_wakeup_show(struct device *dev,
307 struct device_attribute *attr,
308 char *buf)
309{
310 return sprintf(buf, "%d\n", !!(dev_pm_qos_requested_flags(dev)
311 & PM_QOS_FLAG_REMOTE_WAKEUP));
312}
313
314static ssize_t pm_qos_remote_wakeup_store(struct device *dev,
315 struct device_attribute *attr,
316 const char *buf, size_t n)
317{
318 int ret;
319
320 if (kstrtoint(buf, 0, &ret))
321 return -EINVAL;
322
323 if (ret != 0 && ret != 1)
324 return -EINVAL;
325
326 ret = dev_pm_qos_update_flags(dev, PM_QOS_FLAG_REMOTE_WAKEUP, ret);
327 return ret < 0 ? ret : n;
328}
329
330static DEVICE_ATTR(pm_qos_remote_wakeup, 0644,
331 pm_qos_remote_wakeup_show, pm_qos_remote_wakeup_store);
332
333#ifdef CONFIG_PM_SLEEP
334static const char _enabled[] = "enabled";
335static const char _disabled[] = "disabled";
336
337static ssize_t
338wake_show(struct device * dev, struct device_attribute *attr, char * buf)
339{
340 return sprintf(buf, "%s\n", device_can_wakeup(dev)
341 ? (device_may_wakeup(dev) ? _enabled : _disabled)
342 : "");
343}
344
345static ssize_t
346wake_store(struct device * dev, struct device_attribute *attr,
347 const char * buf, size_t n)
348{
349 char *cp;
350 int len = n;
351
352 if (!device_can_wakeup(dev))
353 return -EINVAL;
354
355 cp = memchr(buf, '\n', n);
356 if (cp)
357 len = cp - buf;
358 if (len == sizeof _enabled - 1
359 && strncmp(buf, _enabled, sizeof _enabled - 1) == 0)
360 device_set_wakeup_enable(dev, 1);
361 else if (len == sizeof _disabled - 1
362 && strncmp(buf, _disabled, sizeof _disabled - 1) == 0)
363 device_set_wakeup_enable(dev, 0);
364 else
365 return -EINVAL;
366 return n;
367}
368
369static DEVICE_ATTR(wakeup, 0644, wake_show, wake_store);
370
371static ssize_t wakeup_count_show(struct device *dev,
372 struct device_attribute *attr, char *buf)
373{
374 unsigned long count = 0;
375 bool enabled = false;
376
377 spin_lock_irq(&dev->power.lock);
378 if (dev->power.wakeup) {
379 count = dev->power.wakeup->event_count;
380 enabled = true;
381 }
382 spin_unlock_irq(&dev->power.lock);
383 return enabled ? sprintf(buf, "%lu\n", count) : sprintf(buf, "\n");
384}
385
386static DEVICE_ATTR(wakeup_count, 0444, wakeup_count_show, NULL);
387
388static ssize_t wakeup_active_count_show(struct device *dev,
389 struct device_attribute *attr, char *buf)
390{
391 unsigned long count = 0;
392 bool enabled = false;
393
394 spin_lock_irq(&dev->power.lock);
395 if (dev->power.wakeup) {
396 count = dev->power.wakeup->active_count;
397 enabled = true;
398 }
399 spin_unlock_irq(&dev->power.lock);
400 return enabled ? sprintf(buf, "%lu\n", count) : sprintf(buf, "\n");
401}
402
403static DEVICE_ATTR(wakeup_active_count, 0444, wakeup_active_count_show, NULL);
404
405static ssize_t wakeup_abort_count_show(struct device *dev,
406 struct device_attribute *attr,
407 char *buf)
408{
409 unsigned long count = 0;
410 bool enabled = false;
411
412 spin_lock_irq(&dev->power.lock);
413 if (dev->power.wakeup) {
414 count = dev->power.wakeup->wakeup_count;
415 enabled = true;
416 }
417 spin_unlock_irq(&dev->power.lock);
418 return enabled ? sprintf(buf, "%lu\n", count) : sprintf(buf, "\n");
419}
420
421static DEVICE_ATTR(wakeup_abort_count, 0444, wakeup_abort_count_show, NULL);
422
423static ssize_t wakeup_expire_count_show(struct device *dev,
424 struct device_attribute *attr,
425 char *buf)
426{
427 unsigned long count = 0;
428 bool enabled = false;
429
430 spin_lock_irq(&dev->power.lock);
431 if (dev->power.wakeup) {
432 count = dev->power.wakeup->expire_count;
433 enabled = true;
434 }
435 spin_unlock_irq(&dev->power.lock);
436 return enabled ? sprintf(buf, "%lu\n", count) : sprintf(buf, "\n");
437}
438
439static DEVICE_ATTR(wakeup_expire_count, 0444, wakeup_expire_count_show, NULL);
440
441static ssize_t wakeup_active_show(struct device *dev,
442 struct device_attribute *attr, char *buf)
443{
444 unsigned int active = 0;
445 bool enabled = false;
446
447 spin_lock_irq(&dev->power.lock);
448 if (dev->power.wakeup) {
449 active = dev->power.wakeup->active;
450 enabled = true;
451 }
452 spin_unlock_irq(&dev->power.lock);
453 return enabled ? sprintf(buf, "%u\n", active) : sprintf(buf, "\n");
454}
455
456static DEVICE_ATTR(wakeup_active, 0444, wakeup_active_show, NULL);
457
458static ssize_t wakeup_total_time_show(struct device *dev,
459 struct device_attribute *attr, char *buf)
460{
461 s64 msec = 0;
462 bool enabled = false;
463
464 spin_lock_irq(&dev->power.lock);
465 if (dev->power.wakeup) {
466 msec = ktime_to_ms(dev->power.wakeup->total_time);
467 enabled = true;
468 }
469 spin_unlock_irq(&dev->power.lock);
470 return enabled ? sprintf(buf, "%lld\n", msec) : sprintf(buf, "\n");
471}
472
473static DEVICE_ATTR(wakeup_total_time_ms, 0444, wakeup_total_time_show, NULL);
474
475static ssize_t wakeup_max_time_show(struct device *dev,
476 struct device_attribute *attr, char *buf)
477{
478 s64 msec = 0;
479 bool enabled = false;
480
481 spin_lock_irq(&dev->power.lock);
482 if (dev->power.wakeup) {
483 msec = ktime_to_ms(dev->power.wakeup->max_time);
484 enabled = true;
485 }
486 spin_unlock_irq(&dev->power.lock);
487 return enabled ? sprintf(buf, "%lld\n", msec) : sprintf(buf, "\n");
488}
489
490static DEVICE_ATTR(wakeup_max_time_ms, 0444, wakeup_max_time_show, NULL);
491
492static ssize_t wakeup_last_time_show(struct device *dev,
493 struct device_attribute *attr, char *buf)
494{
495 s64 msec = 0;
496 bool enabled = false;
497
498 spin_lock_irq(&dev->power.lock);
499 if (dev->power.wakeup) {
500 msec = ktime_to_ms(dev->power.wakeup->last_time);
501 enabled = true;
502 }
503 spin_unlock_irq(&dev->power.lock);
504 return enabled ? sprintf(buf, "%lld\n", msec) : sprintf(buf, "\n");
505}
506
507static DEVICE_ATTR(wakeup_last_time_ms, 0444, wakeup_last_time_show, NULL);
508
509#ifdef CONFIG_PM_AUTOSLEEP
510static ssize_t wakeup_prevent_sleep_time_show(struct device *dev,
511 struct device_attribute *attr,
512 char *buf)
513{
514 s64 msec = 0;
515 bool enabled = false;
516
517 spin_lock_irq(&dev->power.lock);
518 if (dev->power.wakeup) {
519 msec = ktime_to_ms(dev->power.wakeup->prevent_sleep_time);
520 enabled = true;
521 }
522 spin_unlock_irq(&dev->power.lock);
523 return enabled ? sprintf(buf, "%lld\n", msec) : sprintf(buf, "\n");
524}
525
526static DEVICE_ATTR(wakeup_prevent_sleep_time_ms, 0444,
527 wakeup_prevent_sleep_time_show, NULL);
528#endif
529#endif
530
531#ifdef CONFIG_PM_ADVANCED_DEBUG
532static ssize_t rtpm_usagecount_show(struct device *dev,
533 struct device_attribute *attr, char *buf)
534{
535 return sprintf(buf, "%d\n", atomic_read(&dev->power.usage_count));
536}
537
538static ssize_t rtpm_children_show(struct device *dev,
539 struct device_attribute *attr, char *buf)
540{
541 return sprintf(buf, "%d\n", dev->power.ignore_children ?
542 0 : atomic_read(&dev->power.child_count));
543}
544
545static ssize_t rtpm_enabled_show(struct device *dev,
546 struct device_attribute *attr, char *buf)
547{
548 if ((dev->power.disable_depth) && (dev->power.runtime_auto == false))
549 return sprintf(buf, "disabled & forbidden\n");
550 else if (dev->power.disable_depth)
551 return sprintf(buf, "disabled\n");
552 else if (dev->power.runtime_auto == false)
553 return sprintf(buf, "forbidden\n");
554 return sprintf(buf, "enabled\n");
555}
556
557static DEVICE_ATTR(runtime_usage, 0444, rtpm_usagecount_show, NULL);
558static DEVICE_ATTR(runtime_active_kids, 0444, rtpm_children_show, NULL);
559static DEVICE_ATTR(runtime_enabled, 0444, rtpm_enabled_show, NULL);
560
561#ifdef CONFIG_PM_SLEEP
562static ssize_t async_show(struct device *dev, struct device_attribute *attr,
563 char *buf)
564{
565 return sprintf(buf, "%s\n",
566 device_async_suspend_enabled(dev) ?
567 _enabled : _disabled);
568}
569
570static ssize_t async_store(struct device *dev, struct device_attribute *attr,
571 const char *buf, size_t n)
572{
573 char *cp;
574 int len = n;
575
576 cp = memchr(buf, '\n', n);
577 if (cp)
578 len = cp - buf;
579 if (len == sizeof _enabled - 1 && strncmp(buf, _enabled, len) == 0)
580 device_enable_async_suspend(dev);
581 else if (len == sizeof _disabled - 1 &&
582 strncmp(buf, _disabled, len) == 0)
583 device_disable_async_suspend(dev);
584 else
585 return -EINVAL;
586 return n;
587}
588
589static DEVICE_ATTR(async, 0644, async_show, async_store);
590
591#endif
592#endif
593
594static struct attribute *power_attrs[] = {
595#ifdef CONFIG_PM_ADVANCED_DEBUG
596#ifdef CONFIG_PM_SLEEP
597 &dev_attr_async.attr,
598#endif
599 &dev_attr_runtime_status.attr,
600 &dev_attr_runtime_usage.attr,
601 &dev_attr_runtime_active_kids.attr,
602 &dev_attr_runtime_enabled.attr,
603#endif
604 NULL,
605};
606static struct attribute_group pm_attr_group = {
607 .name = power_group_name,
608 .attrs = power_attrs,
609};
610
611static struct attribute *wakeup_attrs[] = {
612#ifdef CONFIG_PM_SLEEP
613 &dev_attr_wakeup.attr,
614 &dev_attr_wakeup_count.attr,
615 &dev_attr_wakeup_active_count.attr,
616 &dev_attr_wakeup_abort_count.attr,
617 &dev_attr_wakeup_expire_count.attr,
618 &dev_attr_wakeup_active.attr,
619 &dev_attr_wakeup_total_time_ms.attr,
620 &dev_attr_wakeup_max_time_ms.attr,
621 &dev_attr_wakeup_last_time_ms.attr,
622#ifdef CONFIG_PM_AUTOSLEEP
623 &dev_attr_wakeup_prevent_sleep_time_ms.attr,
624#endif
625#endif
626 NULL,
627};
628static struct attribute_group pm_wakeup_attr_group = {
629 .name = power_group_name,
630 .attrs = wakeup_attrs,
631};
632
633static struct attribute *runtime_attrs[] = {
634#ifndef CONFIG_PM_ADVANCED_DEBUG
635 &dev_attr_runtime_status.attr,
636#endif
637 &dev_attr_control.attr,
638 &dev_attr_runtime_suspended_time.attr,
639 &dev_attr_runtime_active_time.attr,
640 &dev_attr_autosuspend_delay_ms.attr,
641 NULL,
642};
643static struct attribute_group pm_runtime_attr_group = {
644 .name = power_group_name,
645 .attrs = runtime_attrs,
646};
647
648static struct attribute *pm_qos_resume_latency_attrs[] = {
649 &dev_attr_pm_qos_resume_latency_us.attr,
650 NULL,
651};
652static struct attribute_group pm_qos_resume_latency_attr_group = {
653 .name = power_group_name,
654 .attrs = pm_qos_resume_latency_attrs,
655};
656
657static struct attribute *pm_qos_latency_tolerance_attrs[] = {
658 &dev_attr_pm_qos_latency_tolerance_us.attr,
659 NULL,
660};
661static struct attribute_group pm_qos_latency_tolerance_attr_group = {
662 .name = power_group_name,
663 .attrs = pm_qos_latency_tolerance_attrs,
664};
665
666static struct attribute *pm_qos_flags_attrs[] = {
667 &dev_attr_pm_qos_no_power_off.attr,
668 &dev_attr_pm_qos_remote_wakeup.attr,
669 NULL,
670};
671static struct attribute_group pm_qos_flags_attr_group = {
672 .name = power_group_name,
673 .attrs = pm_qos_flags_attrs,
674};
675
676int dpm_sysfs_add(struct device *dev)
677{
678 int rc;
679
680 rc = sysfs_create_group(&dev->kobj, &pm_attr_group);
681 if (rc)
682 return rc;
683
684 if (pm_runtime_callbacks_present(dev)) {
685 rc = sysfs_merge_group(&dev->kobj, &pm_runtime_attr_group);
686 if (rc)
687 goto err_out;
688 }
689 if (device_can_wakeup(dev)) {
690 rc = sysfs_merge_group(&dev->kobj, &pm_wakeup_attr_group);
691 if (rc)
692 goto err_runtime;
693 }
694 if (dev->power.set_latency_tolerance) {
695 rc = sysfs_merge_group(&dev->kobj,
696 &pm_qos_latency_tolerance_attr_group);
697 if (rc)
698 goto err_wakeup;
699 }
700 return 0;
701
702 err_wakeup:
703 sysfs_unmerge_group(&dev->kobj, &pm_wakeup_attr_group);
704 err_runtime:
705 sysfs_unmerge_group(&dev->kobj, &pm_runtime_attr_group);
706 err_out:
707 sysfs_remove_group(&dev->kobj, &pm_attr_group);
708 return rc;
709}
710
711int wakeup_sysfs_add(struct device *dev)
712{
713 return sysfs_merge_group(&dev->kobj, &pm_wakeup_attr_group);
714}
715
716void wakeup_sysfs_remove(struct device *dev)
717{
718 sysfs_unmerge_group(&dev->kobj, &pm_wakeup_attr_group);
719}
720
721int pm_qos_sysfs_add_resume_latency(struct device *dev)
722{
723 return sysfs_merge_group(&dev->kobj, &pm_qos_resume_latency_attr_group);
724}
725
726void pm_qos_sysfs_remove_resume_latency(struct device *dev)
727{
728 sysfs_unmerge_group(&dev->kobj, &pm_qos_resume_latency_attr_group);
729}
730
731int pm_qos_sysfs_add_flags(struct device *dev)
732{
733 return sysfs_merge_group(&dev->kobj, &pm_qos_flags_attr_group);
734}
735
736void pm_qos_sysfs_remove_flags(struct device *dev)
737{
738 sysfs_unmerge_group(&dev->kobj, &pm_qos_flags_attr_group);
739}
740
741int pm_qos_sysfs_add_latency_tolerance(struct device *dev)
742{
743 return sysfs_merge_group(&dev->kobj,
744 &pm_qos_latency_tolerance_attr_group);
745}
746
747void pm_qos_sysfs_remove_latency_tolerance(struct device *dev)
748{
749 sysfs_unmerge_group(&dev->kobj, &pm_qos_latency_tolerance_attr_group);
750}
751
752void rpm_sysfs_remove(struct device *dev)
753{
754 sysfs_unmerge_group(&dev->kobj, &pm_runtime_attr_group);
755}
756
757void dpm_sysfs_remove(struct device *dev)
758{
759 sysfs_unmerge_group(&dev->kobj, &pm_qos_latency_tolerance_attr_group);
760 dev_pm_qos_constraints_destroy(dev);
761 rpm_sysfs_remove(dev);
762 sysfs_unmerge_group(&dev->kobj, &pm_wakeup_attr_group);
763 sysfs_remove_group(&dev->kobj, &pm_attr_group);
764}
765