diff options
author | Terje Bergstrom <tbergstrom@nvidia.com> | 2013-10-09 15:21:42 +0300 |
---|---|---|
committer | Terje Bergstrom <tbergstrom@nvidia.com> | 2013-10-21 02:10:45 -0700 |
commit | c92b96f94cdc26e33ea490a9a0e02c16988a6dd6 (patch) | |
tree | ecae312027e956aed3237a6064ae860f33831ac1 /drivers/base | |
parent | 307096b07c117296318d601cb113522372f7a3d1 (diff) |
PM / QoS: Add notifier for flags
dev_pm_qos has a notifier for DEV_PM_QOS_LATENCY. Add a similar
notifier for DEV_PM_QOS_FLAGS.
Bug 1364240
Change-Id: Ica4c58708855938818a1e75896503b9023b96573
Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com>
Reviewed-on: http://git-master/r/288810
Diffstat (limited to 'drivers/base')
-rw-r--r-- | drivers/base/power/qos.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/drivers/base/power/qos.c b/drivers/base/power/qos.c index 102da70948c1..a7126bda7c76 100644 --- a/drivers/base/power/qos.c +++ b/drivers/base/power/qos.c @@ -154,6 +154,9 @@ static int apply_constraint(struct dev_pm_qos_request *req, case DEV_PM_QOS_FLAGS: ret = pm_qos_update_flags(&qos->flags, &req->data.flr, action, value); + blocking_notifier_call_chain(&dev_pm_notifiers, + (unsigned long)value, + req); break; default: ret = -EINVAL; @@ -173,7 +176,7 @@ static int dev_pm_qos_constraints_allocate(struct device *dev) { struct dev_pm_qos *qos; struct pm_qos_constraints *c; - struct blocking_notifier_head *n; + struct blocking_notifier_head *n, *fn; qos = kzalloc(sizeof(*qos), GFP_KERNEL); if (!qos) @@ -186,6 +189,14 @@ static int dev_pm_qos_constraints_allocate(struct device *dev) } BLOCKING_INIT_NOTIFIER_HEAD(n); + fn = kzalloc(sizeof(*fn), GFP_KERNEL); + if (!fn) { + kfree(n); + kfree(qos); + return -ENOMEM; + } + BLOCKING_INIT_NOTIFIER_HEAD(fn); + c = &qos->latency; plist_head_init(&c->list); c->target_value = PM_QOS_DEV_LAT_DEFAULT_VALUE; @@ -194,6 +205,7 @@ static int dev_pm_qos_constraints_allocate(struct device *dev) c->notifiers = n; INIT_LIST_HEAD(&qos->flags.list); + qos->flags.notifiers = fn; spin_lock_irq(&dev->power.lock); dev->power.qos = qos; @@ -503,6 +515,10 @@ int dev_pm_qos_add_notifier(struct device *dev, struct notifier_block *notifier) ret = blocking_notifier_chain_register( dev->power.qos->latency.notifiers, notifier); + if (!ret) + ret = blocking_notifier_chain_register( + dev->power.qos->flags.notifiers, notifier); + mutex_unlock(&dev_pm_qos_mtx); return ret; } |