Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/base/power/sysfs.c
26428 views
1
// SPDX-License-Identifier: GPL-2.0
2
/* sysfs entries for device PM */
3
#include <linux/device.h>
4
#include <linux/kobject.h>
5
#include <linux/string.h>
6
#include <linux/export.h>
7
#include <linux/pm_qos.h>
8
#include <linux/pm_runtime.h>
9
#include <linux/atomic.h>
10
#include <linux/jiffies.h>
11
#include "power.h"
12
13
/*
14
* control - Report/change current runtime PM setting of the device
15
*
16
* Runtime power management of a device can be blocked with the help of
17
* this attribute. All devices have one of the following two values for
18
* the power/control file:
19
*
20
* + "auto\n" to allow the device to be power managed at run time;
21
* + "on\n" to prevent the device from being power managed at run time;
22
*
23
* The default for all devices is "auto", which means that devices may be
24
* subject to automatic power management, depending on their drivers.
25
* Changing this attribute to "on" prevents the driver from power managing
26
* the device at run time. Doing that while the device is suspended causes
27
* it to be woken up.
28
*
29
* wakeup - Report/change current wakeup option for device
30
*
31
* Some devices support "wakeup" events, which are hardware signals
32
* used to activate devices from suspended or low power states. Such
33
* devices have one of three values for the sysfs power/wakeup file:
34
*
35
* + "enabled\n" to issue the events;
36
* + "disabled\n" not to do so; or
37
* + "\n" for temporary or permanent inability to issue wakeup.
38
*
39
* (For example, unconfigured USB devices can't issue wakeups.)
40
*
41
* Familiar examples of devices that can issue wakeup events include
42
* keyboards and mice (both PS2 and USB styles), power buttons, modems,
43
* "Wake-On-LAN" Ethernet links, GPIO lines, and more. Some events
44
* will wake the entire system from a suspend state; others may just
45
* wake up the device (if the system as a whole is already active).
46
* Some wakeup events use normal IRQ lines; other use special out
47
* of band signaling.
48
*
49
* It is the responsibility of device drivers to enable (or disable)
50
* wakeup signaling as part of changing device power states, respecting
51
* the policy choices provided through the driver model.
52
*
53
* Devices may not be able to generate wakeup events from all power
54
* states. Also, the events may be ignored in some configurations;
55
* for example, they might need help from other devices that aren't
56
* active, or which may have wakeup disabled. Some drivers rely on
57
* wakeup events internally (unless they are disabled), keeping
58
* their hardware in low power modes whenever they're unused. This
59
* saves runtime power, without requiring system-wide sleep states.
60
*
61
* async - Report/change current async suspend setting for the device
62
*
63
* Asynchronous suspend and resume of the device during system-wide power
64
* state transitions can be enabled by writing "enabled" to this file.
65
* Analogously, if "disabled" is written to this file, the device will be
66
* suspended and resumed synchronously.
67
*
68
* All devices have one of the following two values for power/async:
69
*
70
* + "enabled\n" to permit the asynchronous suspend/resume of the device;
71
* + "disabled\n" to forbid it;
72
*
73
* NOTE: It generally is unsafe to permit the asynchronous suspend/resume
74
* of a device unless it is certain that all of the PM dependencies of the
75
* device are known to the PM core. However, for some devices this
76
* attribute is set to "enabled" by bus type code or device drivers and in
77
* that cases it should be safe to leave the default value.
78
*
79
* autosuspend_delay_ms - Report/change a device's autosuspend_delay value
80
*
81
* Some drivers don't want to carry out a runtime suspend as soon as a
82
* device becomes idle; they want it always to remain idle for some period
83
* of time before suspending it. This period is the autosuspend_delay
84
* value (expressed in milliseconds) and it can be controlled by the user.
85
* If the value is negative then the device will never be runtime
86
* suspended.
87
*
88
* NOTE: The autosuspend_delay_ms attribute and the autosuspend_delay
89
* value are used only if the driver calls pm_runtime_use_autosuspend().
90
*
91
* wakeup_count - Report the number of wakeup events related to the device
92
*/
93
94
const char power_group_name[] = "power";
95
EXPORT_SYMBOL_GPL(power_group_name);
96
97
static const char ctrl_auto[] = "auto";
98
static const char ctrl_on[] = "on";
99
100
static ssize_t control_show(struct device *dev, struct device_attribute *attr,
101
char *buf)
102
{
103
return sysfs_emit(buf, "%s\n",
104
dev->power.runtime_auto ? ctrl_auto : ctrl_on);
105
}
106
107
static ssize_t control_store(struct device * dev, struct device_attribute *attr,
108
const char * buf, size_t n)
109
{
110
device_lock(dev);
111
if (sysfs_streq(buf, ctrl_auto))
112
pm_runtime_allow(dev);
113
else if (sysfs_streq(buf, ctrl_on))
114
pm_runtime_forbid(dev);
115
else
116
n = -EINVAL;
117
device_unlock(dev);
118
return n;
119
}
120
121
static DEVICE_ATTR_RW(control);
122
123
static ssize_t runtime_active_time_show(struct device *dev,
124
struct device_attribute *attr,
125
char *buf)
126
{
127
u64 tmp = pm_runtime_active_time(dev);
128
129
do_div(tmp, NSEC_PER_MSEC);
130
131
return sysfs_emit(buf, "%llu\n", tmp);
132
}
133
134
static DEVICE_ATTR_RO(runtime_active_time);
135
136
static ssize_t runtime_suspended_time_show(struct device *dev,
137
struct device_attribute *attr,
138
char *buf)
139
{
140
u64 tmp = pm_runtime_suspended_time(dev);
141
142
do_div(tmp, NSEC_PER_MSEC);
143
144
return sysfs_emit(buf, "%llu\n", tmp);
145
}
146
147
static DEVICE_ATTR_RO(runtime_suspended_time);
148
149
static ssize_t runtime_status_show(struct device *dev,
150
struct device_attribute *attr, char *buf)
151
{
152
const char *output;
153
154
if (dev->power.runtime_error) {
155
output = "error";
156
} else if (dev->power.disable_depth) {
157
output = "unsupported";
158
} else {
159
switch (dev->power.runtime_status) {
160
case RPM_SUSPENDED:
161
output = "suspended";
162
break;
163
case RPM_SUSPENDING:
164
output = "suspending";
165
break;
166
case RPM_RESUMING:
167
output = "resuming";
168
break;
169
case RPM_ACTIVE:
170
output = "active";
171
break;
172
default:
173
return -EIO;
174
}
175
}
176
return sysfs_emit(buf, "%s\n", output);
177
}
178
179
static DEVICE_ATTR_RO(runtime_status);
180
181
static ssize_t autosuspend_delay_ms_show(struct device *dev,
182
struct device_attribute *attr,
183
char *buf)
184
{
185
if (!dev->power.use_autosuspend)
186
return -EIO;
187
188
return sysfs_emit(buf, "%d\n", dev->power.autosuspend_delay);
189
}
190
191
static ssize_t autosuspend_delay_ms_store(struct device *dev,
192
struct device_attribute *attr, const char *buf, size_t n)
193
{
194
long delay;
195
196
if (!dev->power.use_autosuspend)
197
return -EIO;
198
199
if (kstrtol(buf, 10, &delay) != 0 || delay != (int) delay)
200
return -EINVAL;
201
202
device_lock(dev);
203
pm_runtime_set_autosuspend_delay(dev, delay);
204
device_unlock(dev);
205
return n;
206
}
207
208
static DEVICE_ATTR_RW(autosuspend_delay_ms);
209
210
static ssize_t pm_qos_resume_latency_us_show(struct device *dev,
211
struct device_attribute *attr,
212
char *buf)
213
{
214
s32 value = dev_pm_qos_requested_resume_latency(dev);
215
216
if (value == 0)
217
return sysfs_emit(buf, "n/a\n");
218
if (value == PM_QOS_RESUME_LATENCY_NO_CONSTRAINT)
219
value = 0;
220
221
return sysfs_emit(buf, "%d\n", value);
222
}
223
224
static ssize_t pm_qos_resume_latency_us_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
/*
233
* Prevent users from writing negative or "no constraint" values
234
* directly.
235
*/
236
if (value < 0 || value == PM_QOS_RESUME_LATENCY_NO_CONSTRAINT)
237
return -EINVAL;
238
239
if (value == 0)
240
value = PM_QOS_RESUME_LATENCY_NO_CONSTRAINT;
241
} else if (sysfs_streq(buf, "n/a")) {
242
value = 0;
243
} else {
244
return -EINVAL;
245
}
246
247
ret = dev_pm_qos_update_request(dev->power.qos->resume_latency_req,
248
value);
249
return ret < 0 ? ret : n;
250
}
251
252
static DEVICE_ATTR_RW(pm_qos_resume_latency_us);
253
254
static ssize_t pm_qos_latency_tolerance_us_show(struct device *dev,
255
struct device_attribute *attr,
256
char *buf)
257
{
258
s32 value = dev_pm_qos_get_user_latency_tolerance(dev);
259
260
if (value < 0)
261
return sysfs_emit(buf, "%s\n", "auto");
262
if (value == PM_QOS_LATENCY_ANY)
263
return sysfs_emit(buf, "%s\n", "any");
264
265
return sysfs_emit(buf, "%d\n", value);
266
}
267
268
static ssize_t pm_qos_latency_tolerance_us_store(struct device *dev,
269
struct device_attribute *attr,
270
const char *buf, size_t n)
271
{
272
s32 value;
273
int ret;
274
275
if (kstrtos32(buf, 0, &value) == 0) {
276
/* Users can't write negative values directly */
277
if (value < 0)
278
return -EINVAL;
279
} else {
280
if (sysfs_streq(buf, "auto"))
281
value = PM_QOS_LATENCY_TOLERANCE_NO_CONSTRAINT;
282
else if (sysfs_streq(buf, "any"))
283
value = PM_QOS_LATENCY_ANY;
284
else
285
return -EINVAL;
286
}
287
ret = dev_pm_qos_update_user_latency_tolerance(dev, value);
288
return ret < 0 ? ret : n;
289
}
290
291
static DEVICE_ATTR_RW(pm_qos_latency_tolerance_us);
292
293
static ssize_t pm_qos_no_power_off_show(struct device *dev,
294
struct device_attribute *attr,
295
char *buf)
296
{
297
return sysfs_emit(buf, "%d\n", !!(dev_pm_qos_requested_flags(dev)
298
& PM_QOS_FLAG_NO_POWER_OFF));
299
}
300
301
static ssize_t pm_qos_no_power_off_store(struct device *dev,
302
struct device_attribute *attr,
303
const char *buf, size_t n)
304
{
305
int ret;
306
307
if (kstrtoint(buf, 0, &ret))
308
return -EINVAL;
309
310
if (ret != 0 && ret != 1)
311
return -EINVAL;
312
313
ret = dev_pm_qos_update_flags(dev, PM_QOS_FLAG_NO_POWER_OFF, ret);
314
return ret < 0 ? ret : n;
315
}
316
317
static DEVICE_ATTR_RW(pm_qos_no_power_off);
318
319
#ifdef CONFIG_PM_SLEEP
320
static const char _enabled[] = "enabled";
321
static const char _disabled[] = "disabled";
322
323
static ssize_t wakeup_show(struct device *dev, struct device_attribute *attr,
324
char *buf)
325
{
326
return sysfs_emit(buf, "%s\n", device_can_wakeup(dev)
327
? (device_may_wakeup(dev) ? _enabled : _disabled)
328
: "");
329
}
330
331
static ssize_t wakeup_store(struct device *dev, struct device_attribute *attr,
332
const char *buf, size_t n)
333
{
334
if (!device_can_wakeup(dev))
335
return -EINVAL;
336
337
if (sysfs_streq(buf, _enabled))
338
device_set_wakeup_enable(dev, 1);
339
else if (sysfs_streq(buf, _disabled))
340
device_set_wakeup_enable(dev, 0);
341
else
342
return -EINVAL;
343
return n;
344
}
345
346
static DEVICE_ATTR_RW(wakeup);
347
348
static ssize_t wakeup_count_show(struct device *dev,
349
struct device_attribute *attr, char *buf)
350
{
351
unsigned long count;
352
bool enabled = false;
353
354
spin_lock_irq(&dev->power.lock);
355
if (dev->power.wakeup) {
356
count = dev->power.wakeup->wakeup_count;
357
enabled = true;
358
}
359
spin_unlock_irq(&dev->power.lock);
360
361
if (!enabled)
362
return sysfs_emit(buf, "\n");
363
return sysfs_emit(buf, "%lu\n", count);
364
}
365
366
static DEVICE_ATTR_RO(wakeup_count);
367
368
static ssize_t wakeup_active_count_show(struct device *dev,
369
struct device_attribute *attr,
370
char *buf)
371
{
372
unsigned long count;
373
bool enabled = false;
374
375
spin_lock_irq(&dev->power.lock);
376
if (dev->power.wakeup) {
377
count = dev->power.wakeup->active_count;
378
enabled = true;
379
}
380
spin_unlock_irq(&dev->power.lock);
381
382
if (!enabled)
383
return sysfs_emit(buf, "\n");
384
return sysfs_emit(buf, "%lu\n", count);
385
}
386
387
static DEVICE_ATTR_RO(wakeup_active_count);
388
389
static ssize_t wakeup_abort_count_show(struct device *dev,
390
struct device_attribute *attr,
391
char *buf)
392
{
393
unsigned long count;
394
bool enabled = false;
395
396
spin_lock_irq(&dev->power.lock);
397
if (dev->power.wakeup) {
398
count = dev->power.wakeup->wakeup_count;
399
enabled = true;
400
}
401
spin_unlock_irq(&dev->power.lock);
402
403
if (!enabled)
404
return sysfs_emit(buf, "\n");
405
return sysfs_emit(buf, "%lu\n", count);
406
}
407
408
static DEVICE_ATTR_RO(wakeup_abort_count);
409
410
static ssize_t wakeup_expire_count_show(struct device *dev,
411
struct device_attribute *attr,
412
char *buf)
413
{
414
unsigned long count;
415
bool enabled = false;
416
417
spin_lock_irq(&dev->power.lock);
418
if (dev->power.wakeup) {
419
count = dev->power.wakeup->expire_count;
420
enabled = true;
421
}
422
spin_unlock_irq(&dev->power.lock);
423
424
if (!enabled)
425
return sysfs_emit(buf, "\n");
426
return sysfs_emit(buf, "%lu\n", count);
427
}
428
429
static DEVICE_ATTR_RO(wakeup_expire_count);
430
431
static ssize_t wakeup_active_show(struct device *dev,
432
struct device_attribute *attr, char *buf)
433
{
434
unsigned int active;
435
bool enabled = false;
436
437
spin_lock_irq(&dev->power.lock);
438
if (dev->power.wakeup) {
439
active = dev->power.wakeup->active;
440
enabled = true;
441
}
442
spin_unlock_irq(&dev->power.lock);
443
444
if (!enabled)
445
return sysfs_emit(buf, "\n");
446
return sysfs_emit(buf, "%u\n", active);
447
}
448
449
static DEVICE_ATTR_RO(wakeup_active);
450
451
static ssize_t wakeup_total_time_ms_show(struct device *dev,
452
struct device_attribute *attr,
453
char *buf)
454
{
455
s64 msec;
456
bool enabled = false;
457
458
spin_lock_irq(&dev->power.lock);
459
if (dev->power.wakeup) {
460
msec = ktime_to_ms(dev->power.wakeup->total_time);
461
enabled = true;
462
}
463
spin_unlock_irq(&dev->power.lock);
464
465
if (!enabled)
466
return sysfs_emit(buf, "\n");
467
return sysfs_emit(buf, "%lld\n", msec);
468
}
469
470
static DEVICE_ATTR_RO(wakeup_total_time_ms);
471
472
static ssize_t wakeup_max_time_ms_show(struct device *dev,
473
struct device_attribute *attr, char *buf)
474
{
475
s64 msec;
476
bool enabled = false;
477
478
spin_lock_irq(&dev->power.lock);
479
if (dev->power.wakeup) {
480
msec = ktime_to_ms(dev->power.wakeup->max_time);
481
enabled = true;
482
}
483
spin_unlock_irq(&dev->power.lock);
484
485
if (!enabled)
486
return sysfs_emit(buf, "\n");
487
return sysfs_emit(buf, "%lld\n", msec);
488
}
489
490
static DEVICE_ATTR_RO(wakeup_max_time_ms);
491
492
static ssize_t wakeup_last_time_ms_show(struct device *dev,
493
struct device_attribute *attr,
494
char *buf)
495
{
496
s64 msec;
497
bool enabled = false;
498
499
spin_lock_irq(&dev->power.lock);
500
if (dev->power.wakeup) {
501
msec = ktime_to_ms(dev->power.wakeup->last_time);
502
enabled = true;
503
}
504
spin_unlock_irq(&dev->power.lock);
505
506
if (!enabled)
507
return sysfs_emit(buf, "\n");
508
return sysfs_emit(buf, "%lld\n", msec);
509
}
510
511
static DEVICE_ATTR_RO(wakeup_last_time_ms);
512
513
#ifdef CONFIG_PM_AUTOSLEEP
514
static ssize_t wakeup_prevent_sleep_time_ms_show(struct device *dev,
515
struct device_attribute *attr,
516
char *buf)
517
{
518
s64 msec;
519
bool enabled = false;
520
521
spin_lock_irq(&dev->power.lock);
522
if (dev->power.wakeup) {
523
msec = ktime_to_ms(dev->power.wakeup->prevent_sleep_time);
524
enabled = true;
525
}
526
spin_unlock_irq(&dev->power.lock);
527
528
if (!enabled)
529
return sysfs_emit(buf, "\n");
530
return sysfs_emit(buf, "%lld\n", msec);
531
}
532
533
static DEVICE_ATTR_RO(wakeup_prevent_sleep_time_ms);
534
#endif /* CONFIG_PM_AUTOSLEEP */
535
536
static inline int dpm_sysfs_wakeup_change_owner(struct device *dev, kuid_t kuid,
537
kgid_t kgid)
538
{
539
if (dev->power.wakeup && dev->power.wakeup->dev)
540
return device_change_owner(dev->power.wakeup->dev, kuid, kgid);
541
return 0;
542
}
543
544
#else /* CONFIG_PM_SLEEP */
545
static inline int dpm_sysfs_wakeup_change_owner(struct device *dev, kuid_t kuid,
546
kgid_t kgid)
547
{
548
return 0;
549
}
550
#endif
551
552
#ifdef CONFIG_PM_ADVANCED_DEBUG
553
static ssize_t runtime_usage_show(struct device *dev,
554
struct device_attribute *attr, char *buf)
555
{
556
return sysfs_emit(buf, "%d\n", atomic_read(&dev->power.usage_count));
557
}
558
static DEVICE_ATTR_RO(runtime_usage);
559
560
static ssize_t runtime_active_kids_show(struct device *dev,
561
struct device_attribute *attr,
562
char *buf)
563
{
564
return sysfs_emit(buf, "%d\n", dev->power.ignore_children ?
565
0 : atomic_read(&dev->power.child_count));
566
}
567
static DEVICE_ATTR_RO(runtime_active_kids);
568
569
static ssize_t runtime_enabled_show(struct device *dev,
570
struct device_attribute *attr, char *buf)
571
{
572
const char *output;
573
574
if (dev->power.disable_depth && !dev->power.runtime_auto)
575
output = "disabled & forbidden";
576
else if (dev->power.disable_depth)
577
output = "disabled";
578
else if (!dev->power.runtime_auto)
579
output = "forbidden";
580
else
581
output = "enabled";
582
583
return sysfs_emit(buf, "%s\n", output);
584
}
585
static DEVICE_ATTR_RO(runtime_enabled);
586
587
#ifdef CONFIG_PM_SLEEP
588
static ssize_t async_show(struct device *dev, struct device_attribute *attr,
589
char *buf)
590
{
591
return sysfs_emit(buf, "%s\n",
592
device_async_suspend_enabled(dev) ?
593
_enabled : _disabled);
594
}
595
596
static ssize_t async_store(struct device *dev, struct device_attribute *attr,
597
const char *buf, size_t n)
598
{
599
if (sysfs_streq(buf, _enabled))
600
device_enable_async_suspend(dev);
601
else if (sysfs_streq(buf, _disabled))
602
device_disable_async_suspend(dev);
603
else
604
return -EINVAL;
605
return n;
606
}
607
608
static DEVICE_ATTR_RW(async);
609
610
#endif /* CONFIG_PM_SLEEP */
611
#endif /* CONFIG_PM_ADVANCED_DEBUG */
612
613
static struct attribute *power_attrs[] = {
614
#if defined(CONFIG_PM_ADVANCED_DEBUG) && defined(CONFIG_PM_SLEEP)
615
&dev_attr_async.attr,
616
#endif
617
NULL,
618
};
619
static const struct attribute_group pm_attr_group = {
620
.name = power_group_name,
621
.attrs = power_attrs,
622
};
623
624
static struct attribute *wakeup_attrs[] = {
625
#ifdef CONFIG_PM_SLEEP
626
&dev_attr_wakeup.attr,
627
&dev_attr_wakeup_count.attr,
628
&dev_attr_wakeup_active_count.attr,
629
&dev_attr_wakeup_abort_count.attr,
630
&dev_attr_wakeup_expire_count.attr,
631
&dev_attr_wakeup_active.attr,
632
&dev_attr_wakeup_total_time_ms.attr,
633
&dev_attr_wakeup_max_time_ms.attr,
634
&dev_attr_wakeup_last_time_ms.attr,
635
#ifdef CONFIG_PM_AUTOSLEEP
636
&dev_attr_wakeup_prevent_sleep_time_ms.attr,
637
#endif
638
#endif
639
NULL,
640
};
641
static const struct attribute_group pm_wakeup_attr_group = {
642
.name = power_group_name,
643
.attrs = wakeup_attrs,
644
};
645
646
static struct attribute *runtime_attrs[] = {
647
&dev_attr_runtime_status.attr,
648
&dev_attr_control.attr,
649
&dev_attr_runtime_suspended_time.attr,
650
&dev_attr_runtime_active_time.attr,
651
&dev_attr_autosuspend_delay_ms.attr,
652
#ifdef CONFIG_PM_ADVANCED_DEBUG
653
&dev_attr_runtime_usage.attr,
654
&dev_attr_runtime_active_kids.attr,
655
&dev_attr_runtime_enabled.attr,
656
#endif
657
NULL,
658
};
659
static const struct attribute_group pm_runtime_attr_group = {
660
.name = power_group_name,
661
.attrs = runtime_attrs,
662
};
663
664
static struct attribute *pm_qos_resume_latency_attrs[] = {
665
&dev_attr_pm_qos_resume_latency_us.attr,
666
NULL,
667
};
668
static const struct attribute_group pm_qos_resume_latency_attr_group = {
669
.name = power_group_name,
670
.attrs = pm_qos_resume_latency_attrs,
671
};
672
673
static struct attribute *pm_qos_latency_tolerance_attrs[] = {
674
&dev_attr_pm_qos_latency_tolerance_us.attr,
675
NULL,
676
};
677
static const struct attribute_group pm_qos_latency_tolerance_attr_group = {
678
.name = power_group_name,
679
.attrs = pm_qos_latency_tolerance_attrs,
680
};
681
682
static struct attribute *pm_qos_flags_attrs[] = {
683
&dev_attr_pm_qos_no_power_off.attr,
684
NULL,
685
};
686
static const struct attribute_group pm_qos_flags_attr_group = {
687
.name = power_group_name,
688
.attrs = pm_qos_flags_attrs,
689
};
690
691
int dpm_sysfs_add(struct device *dev)
692
{
693
int rc;
694
695
/* No need to create PM sysfs if explicitly disabled. */
696
if (device_pm_not_required(dev))
697
return 0;
698
699
rc = sysfs_create_group(&dev->kobj, &pm_attr_group);
700
if (rc)
701
return rc;
702
703
if (!pm_runtime_has_no_callbacks(dev)) {
704
rc = sysfs_merge_group(&dev->kobj, &pm_runtime_attr_group);
705
if (rc)
706
goto err_out;
707
}
708
if (device_can_wakeup(dev)) {
709
rc = sysfs_merge_group(&dev->kobj, &pm_wakeup_attr_group);
710
if (rc)
711
goto err_runtime;
712
}
713
if (dev->power.set_latency_tolerance) {
714
rc = sysfs_merge_group(&dev->kobj,
715
&pm_qos_latency_tolerance_attr_group);
716
if (rc)
717
goto err_wakeup;
718
}
719
rc = pm_wakeup_source_sysfs_add(dev);
720
if (rc)
721
goto err_latency;
722
return 0;
723
724
err_latency:
725
sysfs_unmerge_group(&dev->kobj, &pm_qos_latency_tolerance_attr_group);
726
err_wakeup:
727
sysfs_unmerge_group(&dev->kobj, &pm_wakeup_attr_group);
728
err_runtime:
729
sysfs_unmerge_group(&dev->kobj, &pm_runtime_attr_group);
730
err_out:
731
sysfs_remove_group(&dev->kobj, &pm_attr_group);
732
return rc;
733
}
734
735
int dpm_sysfs_change_owner(struct device *dev, kuid_t kuid, kgid_t kgid)
736
{
737
int rc;
738
739
if (device_pm_not_required(dev))
740
return 0;
741
742
rc = sysfs_group_change_owner(&dev->kobj, &pm_attr_group, kuid, kgid);
743
if (rc)
744
return rc;
745
746
if (!pm_runtime_has_no_callbacks(dev)) {
747
rc = sysfs_group_change_owner(
748
&dev->kobj, &pm_runtime_attr_group, kuid, kgid);
749
if (rc)
750
return rc;
751
}
752
753
if (device_can_wakeup(dev)) {
754
rc = sysfs_group_change_owner(&dev->kobj, &pm_wakeup_attr_group,
755
kuid, kgid);
756
if (rc)
757
return rc;
758
759
rc = dpm_sysfs_wakeup_change_owner(dev, kuid, kgid);
760
if (rc)
761
return rc;
762
}
763
764
if (dev->power.set_latency_tolerance) {
765
rc = sysfs_group_change_owner(
766
&dev->kobj, &pm_qos_latency_tolerance_attr_group, kuid,
767
kgid);
768
if (rc)
769
return rc;
770
}
771
return 0;
772
}
773
774
int wakeup_sysfs_add(struct device *dev)
775
{
776
int ret = sysfs_merge_group(&dev->kobj, &pm_wakeup_attr_group);
777
778
if (!ret)
779
kobject_uevent(&dev->kobj, KOBJ_CHANGE);
780
781
return ret;
782
}
783
784
void wakeup_sysfs_remove(struct device *dev)
785
{
786
sysfs_unmerge_group(&dev->kobj, &pm_wakeup_attr_group);
787
kobject_uevent(&dev->kobj, KOBJ_CHANGE);
788
}
789
790
int pm_qos_sysfs_add_resume_latency(struct device *dev)
791
{
792
return sysfs_merge_group(&dev->kobj, &pm_qos_resume_latency_attr_group);
793
}
794
795
void pm_qos_sysfs_remove_resume_latency(struct device *dev)
796
{
797
sysfs_unmerge_group(&dev->kobj, &pm_qos_resume_latency_attr_group);
798
}
799
800
int pm_qos_sysfs_add_flags(struct device *dev)
801
{
802
return sysfs_merge_group(&dev->kobj, &pm_qos_flags_attr_group);
803
}
804
805
void pm_qos_sysfs_remove_flags(struct device *dev)
806
{
807
sysfs_unmerge_group(&dev->kobj, &pm_qos_flags_attr_group);
808
}
809
810
int pm_qos_sysfs_add_latency_tolerance(struct device *dev)
811
{
812
return sysfs_merge_group(&dev->kobj,
813
&pm_qos_latency_tolerance_attr_group);
814
}
815
816
void pm_qos_sysfs_remove_latency_tolerance(struct device *dev)
817
{
818
sysfs_unmerge_group(&dev->kobj, &pm_qos_latency_tolerance_attr_group);
819
}
820
821
void rpm_sysfs_remove(struct device *dev)
822
{
823
sysfs_unmerge_group(&dev->kobj, &pm_runtime_attr_group);
824
}
825
826
void dpm_sysfs_remove(struct device *dev)
827
{
828
if (device_pm_not_required(dev))
829
return;
830
sysfs_unmerge_group(&dev->kobj, &pm_qos_latency_tolerance_attr_group);
831
dev_pm_qos_constraints_destroy(dev);
832
rpm_sysfs_remove(dev);
833
sysfs_unmerge_group(&dev->kobj, &pm_wakeup_attr_group);
834
sysfs_remove_group(&dev->kobj, &pm_attr_group);
835
}
836
837