summaryrefslogtreecommitdiff
path: root/drivers/base
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2013-10-09 15:21:42 +0300
committerTerje Bergstrom <tbergstrom@nvidia.com>2013-10-21 02:10:45 -0700
commitc92b96f94cdc26e33ea490a9a0e02c16988a6dd6 (patch)
treeecae312027e956aed3237a6064ae860f33831ac1 /drivers/base
parent307096b07c117296318d601cb113522372f7a3d1 (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.c18
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;
}