diff options
Diffstat (limited to 'drivers/base/power/qos.c')
| -rw-r--r-- | drivers/base/power/qos.c | 49 |
1 files changed, 41 insertions, 8 deletions
diff --git a/drivers/base/power/qos.c b/drivers/base/power/qos.c index 86de6c50fc41..c5d358837461 100644 --- a/drivers/base/power/qos.c +++ b/drivers/base/power/qos.c | |||
| @@ -47,21 +47,29 @@ static DEFINE_MUTEX(dev_pm_qos_mtx); | |||
| 47 | static BLOCKING_NOTIFIER_HEAD(dev_pm_notifiers); | 47 | static BLOCKING_NOTIFIER_HEAD(dev_pm_notifiers); |
| 48 | 48 | ||
| 49 | /** | 49 | /** |
| 50 | * dev_pm_qos_read_value - Get PM QoS constraint for a given device. | 50 | * __dev_pm_qos_read_value - Get PM QoS constraint for a given device. |
| 51 | * @dev: Device to get the PM QoS constraint value for. | ||
| 52 | * | ||
| 53 | * This routine must be called with dev->power.lock held. | ||
| 54 | */ | ||
| 55 | s32 __dev_pm_qos_read_value(struct device *dev) | ||
| 56 | { | ||
| 57 | struct pm_qos_constraints *c = dev->power.constraints; | ||
| 58 | |||
| 59 | return c ? pm_qos_read_value(c) : 0; | ||
| 60 | } | ||
| 61 | |||
| 62 | /** | ||
| 63 | * dev_pm_qos_read_value - Get PM QoS constraint for a given device (locked). | ||
| 51 | * @dev: Device to get the PM QoS constraint value for. | 64 | * @dev: Device to get the PM QoS constraint value for. |
| 52 | */ | 65 | */ |
| 53 | s32 dev_pm_qos_read_value(struct device *dev) | 66 | s32 dev_pm_qos_read_value(struct device *dev) |
| 54 | { | 67 | { |
| 55 | struct pm_qos_constraints *c; | ||
| 56 | unsigned long flags; | 68 | unsigned long flags; |
| 57 | s32 ret = 0; | 69 | s32 ret; |
| 58 | 70 | ||
| 59 | spin_lock_irqsave(&dev->power.lock, flags); | 71 | spin_lock_irqsave(&dev->power.lock, flags); |
| 60 | 72 | ret = __dev_pm_qos_read_value(dev); | |
| 61 | c = dev->power.constraints; | ||
| 62 | if (c) | ||
| 63 | ret = pm_qos_read_value(c); | ||
| 64 | |||
| 65 | spin_unlock_irqrestore(&dev->power.lock, flags); | 73 | spin_unlock_irqrestore(&dev->power.lock, flags); |
| 66 | 74 | ||
| 67 | return ret; | 75 | return ret; |
| @@ -412,3 +420,28 @@ int dev_pm_qos_remove_global_notifier(struct notifier_block *notifier) | |||
| 412 | return blocking_notifier_chain_unregister(&dev_pm_notifiers, notifier); | 420 | return blocking_notifier_chain_unregister(&dev_pm_notifiers, notifier); |
| 413 | } | 421 | } |
| 414 | EXPORT_SYMBOL_GPL(dev_pm_qos_remove_global_notifier); | 422 | EXPORT_SYMBOL_GPL(dev_pm_qos_remove_global_notifier); |
| 423 | |||
| 424 | /** | ||
| 425 | * dev_pm_qos_add_ancestor_request - Add PM QoS request for device's ancestor. | ||
| 426 | * @dev: Device whose ancestor to add the request for. | ||
| 427 | * @req: Pointer to the preallocated handle. | ||
| 428 | * @value: Constraint latency value. | ||
| 429 | */ | ||
| 430 | int dev_pm_qos_add_ancestor_request(struct device *dev, | ||
| 431 | struct dev_pm_qos_request *req, s32 value) | ||
| 432 | { | ||
| 433 | struct device *ancestor = dev->parent; | ||
| 434 | int error = -ENODEV; | ||
| 435 | |||
| 436 | while (ancestor && !ancestor->power.ignore_children) | ||
| 437 | ancestor = ancestor->parent; | ||
| 438 | |||
| 439 | if (ancestor) | ||
| 440 | error = dev_pm_qos_add_request(ancestor, req, value); | ||
| 441 | |||
| 442 | if (error) | ||
| 443 | req->dev = NULL; | ||
| 444 | |||
| 445 | return error; | ||
| 446 | } | ||
| 447 | EXPORT_SYMBOL_GPL(dev_pm_qos_add_ancestor_request); | ||
