2 * Devices PM QoS constraints management
4 * Copyright (C) 2011 Texas Instruments, Inc.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
11 * This module exposes the interface to kernel space for specifying
12 * per-device PM QoS dependencies. It provides infrastructure for registration
15 * Dependents on a QoS value : register requests
16 * Watchers of QoS value : get notified when target QoS value changes
18 * This QoS design is best effort based. Dependents register their QoS needs.
19 * Watchers register to keep track of the current QoS needs of the system.
20 * Watchers can register different types of notification callbacks:
21 * . a per-device notification callback using the dev_pm_qos_*_notifier API.
22 * The notification chain data is stored in the per-device constraint
24 * . a system-wide notification callback using the dev_pm_qos_*_global_notifier
25 * API. The notification chain data is stored in a static variable.
27 * Note about the per-device constraint data struct allocation:
28 * . The per-device constraints data struct ptr is tored into the device
30 * . To minimize the data usage by the per-device constraints, the data struct
31 * is only allocated at the first call to dev_pm_qos_add_request.
32 * . The data is later free'd when the device is removed from the system.
33 * . A global mutex protects the constraints users from the data being
34 * allocated and free'd.
37 #include <linux/pm_qos.h>
38 #include <linux/spinlock.h>
39 #include <linux/slab.h>
40 #include <linux/device.h>
41 #include <linux/mutex.h>
42 #include <linux/export.h>
43 #include <linux/pm_runtime.h>
44 #include <linux/err.h>
45 #include <trace/events/power.h>
49 static DEFINE_MUTEX(dev_pm_qos_mtx
);
50 static DEFINE_MUTEX(dev_pm_qos_sysfs_mtx
);
52 static BLOCKING_NOTIFIER_HEAD(dev_pm_notifiers
);
55 * __dev_pm_qos_flags - Check PM QoS flags for a given device.
56 * @dev: Device to check the PM QoS flags for.
57 * @mask: Flags to check against.
59 * This routine must be called with dev->power.lock held.
61 enum pm_qos_flags_status
__dev_pm_qos_flags(struct device
*dev
, s32 mask
)
63 struct dev_pm_qos
*qos
= dev
->power
.qos
;
64 struct pm_qos_flags
*pqf
;
67 if (IS_ERR_OR_NULL(qos
))
68 return PM_QOS_FLAGS_UNDEFINED
;
71 if (list_empty(&pqf
->list
))
72 return PM_QOS_FLAGS_UNDEFINED
;
74 val
= pqf
->effective_flags
& mask
;
76 return (val
== mask
) ? PM_QOS_FLAGS_ALL
: PM_QOS_FLAGS_SOME
;
78 return PM_QOS_FLAGS_NONE
;
82 * dev_pm_qos_flags - Check PM QoS flags for a given device (locked).
83 * @dev: Device to check the PM QoS flags for.
84 * @mask: Flags to check against.
86 enum pm_qos_flags_status
dev_pm_qos_flags(struct device
*dev
, s32 mask
)
88 unsigned long irqflags
;
89 enum pm_qos_flags_status ret
;
91 spin_lock_irqsave(&dev
->power
.lock
, irqflags
);
92 ret
= __dev_pm_qos_flags(dev
, mask
);
93 spin_unlock_irqrestore(&dev
->power
.lock
, irqflags
);
97 EXPORT_SYMBOL_GPL(dev_pm_qos_flags
);
100 * __dev_pm_qos_read_value - Get PM QoS constraint for a given device.
101 * @dev: Device to get the PM QoS constraint value for.
103 * This routine must be called with dev->power.lock held.
105 s32
__dev_pm_qos_read_value(struct device
*dev
)
107 return IS_ERR_OR_NULL(dev
->power
.qos
) ?
108 0 : pm_qos_read_value(&dev
->power
.qos
->resume_latency
);
112 * dev_pm_qos_read_value - Get PM QoS constraint for a given device (locked).
113 * @dev: Device to get the PM QoS constraint value for.
115 s32
dev_pm_qos_read_value(struct device
*dev
)
120 spin_lock_irqsave(&dev
->power
.lock
, flags
);
121 ret
= __dev_pm_qos_read_value(dev
);
122 spin_unlock_irqrestore(&dev
->power
.lock
, flags
);
128 * apply_constraint - Add/modify/remove device PM QoS request.
129 * @req: Constraint request to apply
130 * @action: Action to perform (add/update/remove).
131 * @value: Value to assign to the QoS request.
133 * Internal function to update the constraints list using the PM QoS core
134 * code and if needed call the per-device and the global notification
137 static int apply_constraint(struct dev_pm_qos_request
*req
,
138 enum pm_qos_req_action action
, s32 value
)
140 struct dev_pm_qos
*qos
= req
->dev
->power
.qos
;
144 case DEV_PM_QOS_RESUME_LATENCY
:
145 ret
= pm_qos_update_target(&qos
->resume_latency
,
146 &req
->data
.pnode
, action
, value
);
148 value
= pm_qos_read_value(&qos
->resume_latency
);
149 blocking_notifier_call_chain(&dev_pm_notifiers
,
150 (unsigned long)value
,
154 case DEV_PM_QOS_LATENCY_TOLERANCE
:
155 ret
= pm_qos_update_target(&qos
->latency_tolerance
,
156 &req
->data
.pnode
, action
, value
);
158 value
= pm_qos_read_value(&qos
->latency_tolerance
);
159 req
->dev
->power
.set_latency_tolerance(req
->dev
, value
);
162 case DEV_PM_QOS_FLAGS
:
163 ret
= pm_qos_update_flags(&qos
->flags
, &req
->data
.flr
,
174 * dev_pm_qos_constraints_allocate
175 * @dev: device to allocate data for
177 * Called at the first call to add_request, for constraint data allocation
178 * Must be called with the dev_pm_qos_mtx mutex held
180 static int dev_pm_qos_constraints_allocate(struct device
*dev
)
182 struct dev_pm_qos
*qos
;
183 struct pm_qos_constraints
*c
;
184 struct blocking_notifier_head
*n
;
186 qos
= kzalloc(sizeof(*qos
), GFP_KERNEL
);
190 n
= kzalloc(sizeof(*n
), GFP_KERNEL
);
195 BLOCKING_INIT_NOTIFIER_HEAD(n
);
197 c
= &qos
->resume_latency
;
198 plist_head_init(&c
->list
);
199 c
->target_value
= PM_QOS_RESUME_LATENCY_DEFAULT_VALUE
;
200 c
->default_value
= PM_QOS_RESUME_LATENCY_DEFAULT_VALUE
;
201 c
->no_constraint_value
= PM_QOS_RESUME_LATENCY_DEFAULT_VALUE
;
202 c
->type
= PM_QOS_MIN
;
205 c
= &qos
->latency_tolerance
;
206 plist_head_init(&c
->list
);
207 c
->target_value
= PM_QOS_LATENCY_TOLERANCE_DEFAULT_VALUE
;
208 c
->default_value
= PM_QOS_LATENCY_TOLERANCE_DEFAULT_VALUE
;
209 c
->no_constraint_value
= PM_QOS_LATENCY_TOLERANCE_NO_CONSTRAINT
;
210 c
->type
= PM_QOS_MIN
;
212 INIT_LIST_HEAD(&qos
->flags
.list
);
214 spin_lock_irq(&dev
->power
.lock
);
215 dev
->power
.qos
= qos
;
216 spin_unlock_irq(&dev
->power
.lock
);
221 static void __dev_pm_qos_hide_latency_limit(struct device
*dev
);
222 static void __dev_pm_qos_hide_flags(struct device
*dev
);
225 * dev_pm_qos_constraints_destroy
226 * @dev: target device
228 * Called from the device PM subsystem on device removal under device_pm_lock().
230 void dev_pm_qos_constraints_destroy(struct device
*dev
)
232 struct dev_pm_qos
*qos
;
233 struct dev_pm_qos_request
*req
, *tmp
;
234 struct pm_qos_constraints
*c
;
235 struct pm_qos_flags
*f
;
237 mutex_lock(&dev_pm_qos_sysfs_mtx
);
240 * If the device's PM QoS resume latency limit or PM QoS flags have been
241 * exposed to user space, they have to be hidden at this point.
243 pm_qos_sysfs_remove_resume_latency(dev
);
244 pm_qos_sysfs_remove_flags(dev
);
246 mutex_lock(&dev_pm_qos_mtx
);
248 __dev_pm_qos_hide_latency_limit(dev
);
249 __dev_pm_qos_hide_flags(dev
);
251 qos
= dev
->power
.qos
;
255 /* Flush the constraints lists for the device. */
256 c
= &qos
->resume_latency
;
257 plist_for_each_entry_safe(req
, tmp
, &c
->list
, data
.pnode
) {
259 * Update constraints list and call the notification
260 * callbacks if needed
262 apply_constraint(req
, PM_QOS_REMOVE_REQ
, PM_QOS_DEFAULT_VALUE
);
263 memset(req
, 0, sizeof(*req
));
265 c
= &qos
->latency_tolerance
;
266 plist_for_each_entry_safe(req
, tmp
, &c
->list
, data
.pnode
) {
267 apply_constraint(req
, PM_QOS_REMOVE_REQ
, PM_QOS_DEFAULT_VALUE
);
268 memset(req
, 0, sizeof(*req
));
271 list_for_each_entry_safe(req
, tmp
, &f
->list
, data
.flr
.node
) {
272 apply_constraint(req
, PM_QOS_REMOVE_REQ
, PM_QOS_DEFAULT_VALUE
);
273 memset(req
, 0, sizeof(*req
));
276 spin_lock_irq(&dev
->power
.lock
);
277 dev
->power
.qos
= ERR_PTR(-ENODEV
);
278 spin_unlock_irq(&dev
->power
.lock
);
284 mutex_unlock(&dev_pm_qos_mtx
);
286 mutex_unlock(&dev_pm_qos_sysfs_mtx
);
289 static bool dev_pm_qos_invalid_request(struct device
*dev
,
290 struct dev_pm_qos_request
*req
)
292 return !req
|| (req
->type
== DEV_PM_QOS_LATENCY_TOLERANCE
293 && !dev
->power
.set_latency_tolerance
);
296 static int __dev_pm_qos_add_request(struct device
*dev
,
297 struct dev_pm_qos_request
*req
,
298 enum dev_pm_qos_req_type type
, s32 value
)
302 if (!dev
|| dev_pm_qos_invalid_request(dev
, req
))
305 if (WARN(dev_pm_qos_request_active(req
),
306 "%s() called for already added request\n", __func__
))
309 if (IS_ERR(dev
->power
.qos
))
311 else if (!dev
->power
.qos
)
312 ret
= dev_pm_qos_constraints_allocate(dev
);
314 trace_dev_pm_qos_add_request(dev_name(dev
), type
, value
);
318 ret
= apply_constraint(req
, PM_QOS_ADD_REQ
, value
);
324 * dev_pm_qos_add_request - inserts new qos request into the list
325 * @dev: target device for the constraint
326 * @req: pointer to a preallocated handle
327 * @type: type of the request
328 * @value: defines the qos request
330 * This function inserts a new entry in the device constraints list of
331 * requested qos performance characteristics. It recomputes the aggregate
332 * QoS expectations of parameters and initializes the dev_pm_qos_request
333 * handle. Caller needs to save this handle for later use in updates and
336 * Returns 1 if the aggregated constraint value has changed,
337 * 0 if the aggregated constraint value has not changed,
338 * -EINVAL in case of wrong parameters, -ENOMEM if there's not enough memory
339 * to allocate for data structures, -ENODEV if the device has just been removed
342 * Callers should ensure that the target device is not RPM_SUSPENDED before
343 * using this function for requests of type DEV_PM_QOS_FLAGS.
345 int dev_pm_qos_add_request(struct device
*dev
, struct dev_pm_qos_request
*req
,
346 enum dev_pm_qos_req_type type
, s32 value
)
350 mutex_lock(&dev_pm_qos_mtx
);
351 ret
= __dev_pm_qos_add_request(dev
, req
, type
, value
);
352 mutex_unlock(&dev_pm_qos_mtx
);
355 EXPORT_SYMBOL_GPL(dev_pm_qos_add_request
);
358 * __dev_pm_qos_update_request - Modify an existing device PM QoS request.
359 * @req : PM QoS request to modify.
360 * @new_value: New value to request.
362 static int __dev_pm_qos_update_request(struct dev_pm_qos_request
*req
,
368 if (!req
) /*guard against callers passing in null */
371 if (WARN(!dev_pm_qos_request_active(req
),
372 "%s() called for unknown object\n", __func__
))
375 if (IS_ERR_OR_NULL(req
->dev
->power
.qos
))
379 case DEV_PM_QOS_RESUME_LATENCY
:
380 case DEV_PM_QOS_LATENCY_TOLERANCE
:
381 curr_value
= req
->data
.pnode
.prio
;
383 case DEV_PM_QOS_FLAGS
:
384 curr_value
= req
->data
.flr
.flags
;
390 trace_dev_pm_qos_update_request(dev_name(req
->dev
), req
->type
,
392 if (curr_value
!= new_value
)
393 ret
= apply_constraint(req
, PM_QOS_UPDATE_REQ
, new_value
);
399 * dev_pm_qos_update_request - modifies an existing qos request
400 * @req : handle to list element holding a dev_pm_qos request to use
401 * @new_value: defines the qos request
403 * Updates an existing dev PM qos request along with updating the
406 * Attempts are made to make this code callable on hot code paths.
408 * Returns 1 if the aggregated constraint value has changed,
409 * 0 if the aggregated constraint value has not changed,
410 * -EINVAL in case of wrong parameters, -ENODEV if the device has been
411 * removed from the system
413 * Callers should ensure that the target device is not RPM_SUSPENDED before
414 * using this function for requests of type DEV_PM_QOS_FLAGS.
416 int dev_pm_qos_update_request(struct dev_pm_qos_request
*req
, s32 new_value
)
420 mutex_lock(&dev_pm_qos_mtx
);
421 ret
= __dev_pm_qos_update_request(req
, new_value
);
422 mutex_unlock(&dev_pm_qos_mtx
);
425 EXPORT_SYMBOL_GPL(dev_pm_qos_update_request
);
427 static int __dev_pm_qos_remove_request(struct dev_pm_qos_request
*req
)
431 if (!req
) /*guard against callers passing in null */
434 if (WARN(!dev_pm_qos_request_active(req
),
435 "%s() called for unknown object\n", __func__
))
438 if (IS_ERR_OR_NULL(req
->dev
->power
.qos
))
441 trace_dev_pm_qos_remove_request(dev_name(req
->dev
), req
->type
,
442 PM_QOS_DEFAULT_VALUE
);
443 ret
= apply_constraint(req
, PM_QOS_REMOVE_REQ
, PM_QOS_DEFAULT_VALUE
);
444 memset(req
, 0, sizeof(*req
));
449 * dev_pm_qos_remove_request - modifies an existing qos request
450 * @req: handle to request list element
452 * Will remove pm qos request from the list of constraints and
453 * recompute the current target value. Call this on slow code paths.
455 * Returns 1 if the aggregated constraint value has changed,
456 * 0 if the aggregated constraint value has not changed,
457 * -EINVAL in case of wrong parameters, -ENODEV if the device has been
458 * removed from the system
460 * Callers should ensure that the target device is not RPM_SUSPENDED before
461 * using this function for requests of type DEV_PM_QOS_FLAGS.
463 int dev_pm_qos_remove_request(struct dev_pm_qos_request
*req
)
467 mutex_lock(&dev_pm_qos_mtx
);
468 ret
= __dev_pm_qos_remove_request(req
);
469 mutex_unlock(&dev_pm_qos_mtx
);
472 EXPORT_SYMBOL_GPL(dev_pm_qos_remove_request
);
475 * dev_pm_qos_add_notifier - sets notification entry for changes to target value
476 * of per-device PM QoS constraints
478 * @dev: target device for the constraint
479 * @notifier: notifier block managed by caller.
481 * Will register the notifier into a notification chain that gets called
482 * upon changes to the target value for the device.
484 * If the device's constraints object doesn't exist when this routine is called,
485 * it will be created (or error code will be returned if that fails).
487 int dev_pm_qos_add_notifier(struct device
*dev
, struct notifier_block
*notifier
)
491 mutex_lock(&dev_pm_qos_mtx
);
493 if (IS_ERR(dev
->power
.qos
))
495 else if (!dev
->power
.qos
)
496 ret
= dev_pm_qos_constraints_allocate(dev
);
499 ret
= blocking_notifier_chain_register(dev
->power
.qos
->resume_latency
.notifiers
,
502 mutex_unlock(&dev_pm_qos_mtx
);
505 EXPORT_SYMBOL_GPL(dev_pm_qos_add_notifier
);
508 * dev_pm_qos_remove_notifier - deletes notification for changes to target value
509 * of per-device PM QoS constraints
511 * @dev: target device for the constraint
512 * @notifier: notifier block to be removed.
514 * Will remove the notifier from the notification chain that gets called
515 * upon changes to the target value.
517 int dev_pm_qos_remove_notifier(struct device
*dev
,
518 struct notifier_block
*notifier
)
522 mutex_lock(&dev_pm_qos_mtx
);
524 /* Silently return if the constraints object is not present. */
525 if (!IS_ERR_OR_NULL(dev
->power
.qos
))
526 retval
= blocking_notifier_chain_unregister(dev
->power
.qos
->resume_latency
.notifiers
,
529 mutex_unlock(&dev_pm_qos_mtx
);
532 EXPORT_SYMBOL_GPL(dev_pm_qos_remove_notifier
);
535 * dev_pm_qos_add_global_notifier - sets notification entry for changes to
536 * target value of the PM QoS constraints for any device
538 * @notifier: notifier block managed by caller.
540 * Will register the notifier into a notification chain that gets called
541 * upon changes to the target value for any device.
543 int dev_pm_qos_add_global_notifier(struct notifier_block
*notifier
)
545 return blocking_notifier_chain_register(&dev_pm_notifiers
, notifier
);
547 EXPORT_SYMBOL_GPL(dev_pm_qos_add_global_notifier
);
550 * dev_pm_qos_remove_global_notifier - deletes notification for changes to
551 * target value of PM QoS constraints for any device
553 * @notifier: notifier block to be removed.
555 * Will remove the notifier from the notification chain that gets called
556 * upon changes to the target value for any device.
558 int dev_pm_qos_remove_global_notifier(struct notifier_block
*notifier
)
560 return blocking_notifier_chain_unregister(&dev_pm_notifiers
, notifier
);
562 EXPORT_SYMBOL_GPL(dev_pm_qos_remove_global_notifier
);
565 * dev_pm_qos_add_ancestor_request - Add PM QoS request for device's ancestor.
566 * @dev: Device whose ancestor to add the request for.
567 * @req: Pointer to the preallocated handle.
568 * @type: Type of the request.
569 * @value: Constraint latency value.
571 int dev_pm_qos_add_ancestor_request(struct device
*dev
,
572 struct dev_pm_qos_request
*req
,
573 enum dev_pm_qos_req_type type
, s32 value
)
575 struct device
*ancestor
= dev
->parent
;
579 case DEV_PM_QOS_RESUME_LATENCY
:
580 while (ancestor
&& !ancestor
->power
.ignore_children
)
581 ancestor
= ancestor
->parent
;
584 case DEV_PM_QOS_LATENCY_TOLERANCE
:
585 while (ancestor
&& !ancestor
->power
.set_latency_tolerance
)
586 ancestor
= ancestor
->parent
;
593 ret
= dev_pm_qos_add_request(ancestor
, req
, type
, value
);
600 EXPORT_SYMBOL_GPL(dev_pm_qos_add_ancestor_request
);
602 #ifdef CONFIG_PM_RUNTIME
603 static void __dev_pm_qos_drop_user_request(struct device
*dev
,
604 enum dev_pm_qos_req_type type
)
606 struct dev_pm_qos_request
*req
= NULL
;
609 case DEV_PM_QOS_RESUME_LATENCY
:
610 req
= dev
->power
.qos
->resume_latency_req
;
611 dev
->power
.qos
->resume_latency_req
= NULL
;
613 case DEV_PM_QOS_LATENCY_TOLERANCE
:
614 req
= dev
->power
.qos
->latency_tolerance_req
;
615 dev
->power
.qos
->latency_tolerance_req
= NULL
;
617 case DEV_PM_QOS_FLAGS
:
618 req
= dev
->power
.qos
->flags_req
;
619 dev
->power
.qos
->flags_req
= NULL
;
622 __dev_pm_qos_remove_request(req
);
626 static void dev_pm_qos_drop_user_request(struct device
*dev
,
627 enum dev_pm_qos_req_type type
)
629 mutex_lock(&dev_pm_qos_mtx
);
630 __dev_pm_qos_drop_user_request(dev
, type
);
631 mutex_unlock(&dev_pm_qos_mtx
);
635 * dev_pm_qos_expose_latency_limit - Expose PM QoS latency limit to user space.
636 * @dev: Device whose PM QoS latency limit is to be exposed to user space.
637 * @value: Initial value of the latency limit.
639 int dev_pm_qos_expose_latency_limit(struct device
*dev
, s32 value
)
641 struct dev_pm_qos_request
*req
;
644 if (!device_is_registered(dev
) || value
< 0)
647 req
= kzalloc(sizeof(*req
), GFP_KERNEL
);
651 ret
= dev_pm_qos_add_request(dev
, req
, DEV_PM_QOS_RESUME_LATENCY
, value
);
657 mutex_lock(&dev_pm_qos_sysfs_mtx
);
659 mutex_lock(&dev_pm_qos_mtx
);
661 if (IS_ERR_OR_NULL(dev
->power
.qos
))
663 else if (dev
->power
.qos
->resume_latency_req
)
667 __dev_pm_qos_remove_request(req
);
669 mutex_unlock(&dev_pm_qos_mtx
);
672 dev
->power
.qos
->resume_latency_req
= req
;
674 mutex_unlock(&dev_pm_qos_mtx
);
676 ret
= pm_qos_sysfs_add_resume_latency(dev
);
678 dev_pm_qos_drop_user_request(dev
, DEV_PM_QOS_RESUME_LATENCY
);
681 mutex_unlock(&dev_pm_qos_sysfs_mtx
);
684 EXPORT_SYMBOL_GPL(dev_pm_qos_expose_latency_limit
);
686 static void __dev_pm_qos_hide_latency_limit(struct device
*dev
)
688 if (!IS_ERR_OR_NULL(dev
->power
.qos
) && dev
->power
.qos
->resume_latency_req
)
689 __dev_pm_qos_drop_user_request(dev
, DEV_PM_QOS_RESUME_LATENCY
);
693 * dev_pm_qos_hide_latency_limit - Hide PM QoS latency limit from user space.
694 * @dev: Device whose PM QoS latency limit is to be hidden from user space.
696 void dev_pm_qos_hide_latency_limit(struct device
*dev
)
698 mutex_lock(&dev_pm_qos_sysfs_mtx
);
700 pm_qos_sysfs_remove_resume_latency(dev
);
702 mutex_lock(&dev_pm_qos_mtx
);
703 __dev_pm_qos_hide_latency_limit(dev
);
704 mutex_unlock(&dev_pm_qos_mtx
);
706 mutex_unlock(&dev_pm_qos_sysfs_mtx
);
708 EXPORT_SYMBOL_GPL(dev_pm_qos_hide_latency_limit
);
711 * dev_pm_qos_expose_flags - Expose PM QoS flags of a device to user space.
712 * @dev: Device whose PM QoS flags are to be exposed to user space.
713 * @val: Initial values of the flags.
715 int dev_pm_qos_expose_flags(struct device
*dev
, s32 val
)
717 struct dev_pm_qos_request
*req
;
720 if (!device_is_registered(dev
))
723 req
= kzalloc(sizeof(*req
), GFP_KERNEL
);
727 ret
= dev_pm_qos_add_request(dev
, req
, DEV_PM_QOS_FLAGS
, val
);
733 pm_runtime_get_sync(dev
);
734 mutex_lock(&dev_pm_qos_sysfs_mtx
);
736 mutex_lock(&dev_pm_qos_mtx
);
738 if (IS_ERR_OR_NULL(dev
->power
.qos
))
740 else if (dev
->power
.qos
->flags_req
)
744 __dev_pm_qos_remove_request(req
);
746 mutex_unlock(&dev_pm_qos_mtx
);
749 dev
->power
.qos
->flags_req
= req
;
751 mutex_unlock(&dev_pm_qos_mtx
);
753 ret
= pm_qos_sysfs_add_flags(dev
);
755 dev_pm_qos_drop_user_request(dev
, DEV_PM_QOS_FLAGS
);
758 mutex_unlock(&dev_pm_qos_sysfs_mtx
);
762 EXPORT_SYMBOL_GPL(dev_pm_qos_expose_flags
);
764 static void __dev_pm_qos_hide_flags(struct device
*dev
)
766 if (!IS_ERR_OR_NULL(dev
->power
.qos
) && dev
->power
.qos
->flags_req
)
767 __dev_pm_qos_drop_user_request(dev
, DEV_PM_QOS_FLAGS
);
771 * dev_pm_qos_hide_flags - Hide PM QoS flags of a device from user space.
772 * @dev: Device whose PM QoS flags are to be hidden from user space.
774 void dev_pm_qos_hide_flags(struct device
*dev
)
776 pm_runtime_get_sync(dev
);
777 mutex_lock(&dev_pm_qos_sysfs_mtx
);
779 pm_qos_sysfs_remove_flags(dev
);
781 mutex_lock(&dev_pm_qos_mtx
);
782 __dev_pm_qos_hide_flags(dev
);
783 mutex_unlock(&dev_pm_qos_mtx
);
785 mutex_unlock(&dev_pm_qos_sysfs_mtx
);
788 EXPORT_SYMBOL_GPL(dev_pm_qos_hide_flags
);
791 * dev_pm_qos_update_flags - Update PM QoS flags request owned by user space.
792 * @dev: Device to update the PM QoS flags request for.
793 * @mask: Flags to set/clear.
794 * @set: Whether to set or clear the flags (true means set).
796 int dev_pm_qos_update_flags(struct device
*dev
, s32 mask
, bool set
)
801 pm_runtime_get_sync(dev
);
802 mutex_lock(&dev_pm_qos_mtx
);
804 if (IS_ERR_OR_NULL(dev
->power
.qos
) || !dev
->power
.qos
->flags_req
) {
809 value
= dev_pm_qos_requested_flags(dev
);
815 ret
= __dev_pm_qos_update_request(dev
->power
.qos
->flags_req
, value
);
818 mutex_unlock(&dev_pm_qos_mtx
);
824 * dev_pm_qos_get_user_latency_tolerance - Get user space latency tolerance.
825 * @dev: Device to obtain the user space latency tolerance for.
827 s32
dev_pm_qos_get_user_latency_tolerance(struct device
*dev
)
831 mutex_lock(&dev_pm_qos_mtx
);
832 ret
= IS_ERR_OR_NULL(dev
->power
.qos
)
833 || !dev
->power
.qos
->latency_tolerance_req
?
834 PM_QOS_LATENCY_TOLERANCE_NO_CONSTRAINT
:
835 dev
->power
.qos
->latency_tolerance_req
->data
.pnode
.prio
;
836 mutex_unlock(&dev_pm_qos_mtx
);
841 * dev_pm_qos_update_user_latency_tolerance - Update user space latency tolerance.
842 * @dev: Device to update the user space latency tolerance for.
843 * @val: New user space latency tolerance for @dev (negative values disable).
845 int dev_pm_qos_update_user_latency_tolerance(struct device
*dev
, s32 val
)
849 mutex_lock(&dev_pm_qos_mtx
);
851 if (IS_ERR_OR_NULL(dev
->power
.qos
)
852 || !dev
->power
.qos
->latency_tolerance_req
) {
853 struct dev_pm_qos_request
*req
;
859 req
= kzalloc(sizeof(*req
), GFP_KERNEL
);
864 ret
= __dev_pm_qos_add_request(dev
, req
, DEV_PM_QOS_LATENCY_TOLERANCE
, val
);
869 dev
->power
.qos
->latency_tolerance_req
= req
;
872 __dev_pm_qos_drop_user_request(dev
, DEV_PM_QOS_LATENCY_TOLERANCE
);
875 ret
= __dev_pm_qos_update_request(dev
->power
.qos
->latency_tolerance_req
, val
);
880 mutex_unlock(&dev_pm_qos_mtx
);
883 #else /* !CONFIG_PM_RUNTIME */
884 static void __dev_pm_qos_hide_latency_limit(struct device
*dev
) {}
885 static void __dev_pm_qos_hide_flags(struct device
*dev
) {}
886 #endif /* CONFIG_PM_RUNTIME */