diff options
author | Terje Bergstrom <tbergstrom@nvidia.com> | 2011-09-01 08:19:50 +0300 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:48:55 -0800 |
commit | 594005171c28bb8367a780ce818bd3d544aa5445 (patch) | |
tree | bfe453a77e8696e8c237b4a680cc63aa1c96248c /drivers/video/tegra/host/nvhost_acm.c | |
parent | be4407a28cf8732b201fdcec9fc617dfb8ec3e2f (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.c | 14 |
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, |