aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMiguel Vadillo <vadillo@ti.com>2011-06-30 18:40:19 -0500
committerIliyan Malchev <malchev@google.com>2011-07-20 17:34:33 -0700
commitdbf3f62c5761f298cce9991b30a60dd08f76656f (patch)
treee04b5ee1b359493eee0f869727b9c8b18db462d8 /drivers
parent5efcea64f6ec141bad475535572765678a9b2631 (diff)
downloadkernel_samsung_tuna-dbf3f62c5761f298cce9991b30a60dd08f76656f.zip
kernel_samsung_tuna-dbf3f62c5761f298cce9991b30a60dd08f76656f.tar.gz
kernel_samsung_tuna-dbf3f62c5761f298cce9991b30a60dd08f76656f.tar.bz2
remoteproc: add constraints framework
Add constraints api to remoteproc framework supporting: - Latency (Using pm_qos framework) - Frequency - Bandwidth Each of them should be provided by the specific architecture if supported. Change-Id: Icddd9a8ee3c6c781e1a30817a2db8716428089ad Signed-off-by: Miguel Vadillo <vadillo@ti.com> Signed-off-by: Fernando Guzman Lugo <fernando.lugo@ti.com> Signed-off-by: Suman Anna <s-anna@ti.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/remoteproc/remoteproc.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/drivers/remoteproc/remoteproc.c b/drivers/remoteproc/remoteproc.c
index 7753c92..cd03896 100644
--- a/drivers/remoteproc/remoteproc.c
+++ b/drivers/remoteproc/remoteproc.c
@@ -828,6 +828,50 @@ const struct dev_pm_ops rproc_gen_pm_ops = {
SET_RUNTIME_PM_OPS(rproc_runtime_suspend, rproc_runtime_resume, NULL)
};
#endif
+int
+rproc_set_constraints(struct rproc *rproc, enum rproc_constraint type, long v)
+{
+ int ret;
+ char *cname[] = {"scale", "latency", "bandwidth"};
+ int (*func)(struct rproc *, long);
+
+ switch (type) {
+ case RPROC_CONSTRAINT_SCALE:
+ func = rproc->ops->scale;
+ break;
+ case RPROC_CONSTRAINT_LATENCY:
+ func = rproc->ops->set_lat;
+ break;
+ case RPROC_CONSTRAINT_BANDWIDTH:
+ func = rproc->ops->set_bw;
+ break;
+ default:
+ dev_err(rproc->dev, "invalid constraint\n");
+ return -EINVAL;
+ }
+
+ if (!func) {
+ dev_err(rproc->dev, "%s: no %s constraint\n",
+ __func__, cname[type]);
+ return -EINVAL;
+ }
+
+ mutex_lock(&rproc->lock);
+ if (rproc->state == RPROC_OFFLINE) {
+ pr_err("%s: rproc inactive\n", __func__);
+ mutex_unlock(&rproc->lock);
+ return -EPERM;
+ }
+
+ dev_dbg(rproc->dev, "set %s constraint %ld\n", cname[type], v);
+ ret = func(rproc, v);
+ if (ret)
+ dev_err(rproc->dev, "error %s constraint\n", cname[type]);
+ mutex_unlock(&rproc->lock);
+
+ return ret;
+}
+EXPORT_SYMBOL(rproc_set_constraints);
int rproc_register(struct device *dev, const char *name,
const struct rproc_ops *ops,
@@ -864,6 +908,16 @@ int rproc_register(struct device *dev, const char *name,
rproc->state = RPROC_OFFLINE;
+ rproc->qos_request = kzalloc(sizeof(*rproc->qos_request),
+ GFP_KERNEL);
+ if (!rproc->qos_request) {
+ kfree(rproc);
+ return -ENOMEM;
+ }
+
+ pm_qos_add_request(rproc->qos_request, PM_QOS_CPU_DMA_LATENCY,
+ PM_QOS_DEFAULT_VALUE);
+
spin_lock(&rprocs_lock);
list_add_tail(&rproc->next, &rprocs);
spin_unlock(&rprocs_lock);
@@ -914,6 +968,8 @@ int rproc_unregister(const char *name)
list_del(&rproc->next);
spin_unlock(&rprocs_lock);
+ pm_qos_remove_request(rproc->qos_request);
+ kfree(rproc->qos_request);
kfree(rproc);
return 0;