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