summaryrefslogtreecommitdiff
path: root/drivers/video/tegra/host/nvhost_acm.c
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2011-09-01 08:19:50 +0300
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:48:55 -0800
commit594005171c28bb8367a780ce818bd3d544aa5445 (patch)
treebfe453a77e8696e8c237b4a680cc63aa1c96248c /drivers/video/tegra/host/nvhost_acm.c
parentbe4407a28cf8732b201fdcec9fc617dfb8ec3e2f (diff)
nvhost: Add locking to module clock code
nvhost_module_add_client(), nvhost_module_remove_client() and nvhost_module_set_rate() need locking when accessing the client list. Bug 870328 (cherry picked from commit a09309d672fd2f96be1b61d58c57dcc659710e92) Change-Id: I4c556df0e9607b3e2effb3b788220b784f858774 Reviewed-on: http://git-master/r/52845 Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com> Tested-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-by: Yu-Huan Hsu <yhsu@nvidia.com> Reviewed-by: Scott Williams <scwilliams@nvidia.com> Rebase-Id: R379d4317b22c1360a4756e28fbf66655e3aded95
Diffstat (limited to 'drivers/video/tegra/host/nvhost_acm.c')
-rw-r--r--drivers/video/tegra/host/nvhost_acm.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/video/tegra/host/nvhost_acm.c b/drivers/video/tegra/host/nvhost_acm.c
index 7b0d73dee1a3..19ebb8fbb47c 100644
--- a/drivers/video/tegra/host/nvhost_acm.c
+++ b/drivers/video/tegra/host/nvhost_acm.c
@@ -511,7 +511,9 @@ int nvhost_module_set_rate(struct nvhost_module *mod, void *priv,
unsigned long rate, int index)
{
struct nvhost_module_client *m;
+ int err;
+ mutex_lock(&mod->lock);
list_for_each_entry(m, &mod->client_list, node) {
if (m->priv == priv) {
rate = clk_round_rate(mod->clk[index].clk, rate);
@@ -519,7 +521,9 @@ int nvhost_module_set_rate(struct nvhost_module *mod, void *priv,
break;
}
}
- return nvhost_module_update_rate(mod, index);
+ err = nvhost_module_update_rate(mod, index);
+ mutex_unlock(&mod->lock);
+ return err;
}
int nvhost_module_add_client(struct nvhost_module *mod, void *priv)
@@ -529,9 +533,9 @@ int nvhost_module_add_client(struct nvhost_module *mod, void *priv)
struct nvhost_module_client *client;
client = kzalloc(sizeof(*client), GFP_KERNEL);
- if (!client) {
+ if (!client)
return -ENOMEM;
- }
+
INIT_LIST_HEAD(&client->node);
client->priv = priv;
@@ -540,7 +544,9 @@ int nvhost_module_add_client(struct nvhost_module *mod, void *priv)
mod->clk[i].default_rate);
client->rate[i] = rate;
}
+ mutex_lock(&mod->lock);
list_add_tail(&client->node, &mod->client_list);
+ mutex_unlock(&mod->lock);
return 0;
}
@@ -549,6 +555,7 @@ void nvhost_module_remove_client(struct nvhost_module *mod, void *priv)
int i;
struct nvhost_module_client *m;
+ mutex_lock(&mod->lock);
list_for_each_entry(m, &mod->client_list, node) {
if (priv == m->priv) {
list_del(&m->node);
@@ -559,6 +566,7 @@ void nvhost_module_remove_client(struct nvhost_module *mod, void *priv)
kfree(m);
for (i = 0; i < mod->num_clks; i++)
nvhost_module_update_rate(mod, i);
+ mutex_unlock(&mod->lock);
}
#else
int nvhost_module_get_rate(struct nvhost_module *mod, unsigned long *rate,