summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-12-09 19:59:40 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2016-12-09 19:59:40 -0800
commit08a4cbeb4db6e3978bbfbf365377bcea428ba841 (patch)
tree70429e144921e921734ca550a09e8e53c76942f3
parentb6b2f0da26e124c82d6f6340b0aff0749bebfc6b (diff)
parent254699d0266fe6cf4c5b03e16c2435535d20327a (diff)
Merge "msm: vidc: Disable clocks in reverse order"
-rw-r--r--drivers/media/platform/msm/vidc/venus_boot.c4
-rw-r--r--drivers/media/platform/msm/vidc/venus_hfi.c11
-rw-r--r--drivers/media/platform/msm/vidc/venus_hfi.h5
-rw-r--r--drivers/media/platform/msm/vidc/vmem/vmem.c4
4 files changed, 14 insertions, 10 deletions
diff --git a/drivers/media/platform/msm/vidc/venus_boot.c b/drivers/media/platform/msm/vidc/venus_boot.c
index 85c3e15edded..ea53c09ce9a1 100644
--- a/drivers/media/platform/msm/vidc/venus_boot.c
+++ b/drivers/media/platform/msm/vidc/venus_boot.c
@@ -137,11 +137,11 @@ static int venus_clock_prepare_enable(void)
static void venus_clock_disable_unprepare(void)
{
- int i;
struct msm_vidc_platform_resources *res = venus_data->resources;
struct clock_info *cl;
+ int i = res->clock_set.count;
- for (i = 0; i < res->clock_set.count; i++) {
+ for (i--; i >= 0; i--) {
cl = &res->clock_set.clock_tbl[i];
clk_disable_unprepare(cl->clk);
}
diff --git a/drivers/media/platform/msm/vidc/venus_hfi.c b/drivers/media/platform/msm/vidc/venus_hfi.c
index 520e71fdc272..eceb86b01a7c 100644
--- a/drivers/media/platform/msm/vidc/venus_hfi.c
+++ b/drivers/media/platform/msm/vidc/venus_hfi.c
@@ -3767,8 +3767,8 @@ static inline void __disable_unprepare_clks(struct venus_hfi_device *device)
return;
}
- venus_hfi_for_each_clock(device, cl) {
- usleep_range(100, 500);
+ venus_hfi_for_each_clock_reverse(device, cl) {
+ usleep_range(100, 500);
dprintk(VIDC_DBG, "Clock: %s disable and unprepare\n",
cl->name);
clk_disable_unprepare(cl->clk);
@@ -3778,7 +3778,7 @@ static inline void __disable_unprepare_clks(struct venus_hfi_device *device)
static inline int __prepare_enable_clks(struct venus_hfi_device *device)
{
struct clock_info *cl = NULL, *cl_fail = NULL;
- int rc = 0;
+ int rc = 0, c = 0;
if (!device) {
dprintk(VIDC_ERR, "Invalid params: %pK\n", device);
return -EINVAL;
@@ -3816,6 +3816,7 @@ static inline int __prepare_enable_clks(struct venus_hfi_device *device)
goto fail_clk_enable;
}
+ c++;
dprintk(VIDC_DBG, "Clock: %s prepared and enabled\n", cl->name);
}
@@ -3824,9 +3825,7 @@ static inline int __prepare_enable_clks(struct venus_hfi_device *device)
return rc;
fail_clk_enable:
- venus_hfi_for_each_clock(device, cl) {
- if (cl_fail == cl)
- break;
+ venus_hfi_for_each_clock_reverse_continue(device, cl, c) {
usleep_range(100, 500);
dprintk(VIDC_ERR, "Clock: %s disable and unprepare\n",
cl->name);
diff --git a/drivers/media/platform/msm/vidc/venus_hfi.h b/drivers/media/platform/msm/vidc/venus_hfi.h
index 8ba763a3b61a..048f247fb0a4 100644
--- a/drivers/media/platform/msm/vidc/venus_hfi.h
+++ b/drivers/media/platform/msm/vidc/venus_hfi.h
@@ -187,6 +187,11 @@ struct vidc_iface_q_info {
#define venus_hfi_for_each_clock_reverse(__device, __cinfo) \
venus_hfi_for_each_thing_reverse(__device, __cinfo, clock)
+#define venus_hfi_for_each_clock_reverse_continue(__device, __rinfo, \
+ __from) \
+ venus_hfi_for_each_thing_reverse_continue(__device, __rinfo, \
+ clock, __from)
+
/* Bus set helpers */
#define venus_hfi_for_each_bus(__device, __binfo) \
venus_hfi_for_each_thing(__device, __binfo, bus)
diff --git a/drivers/media/platform/msm/vidc/vmem/vmem.c b/drivers/media/platform/msm/vidc/vmem/vmem.c
index 0809256a2896..428524661695 100644
--- a/drivers/media/platform/msm/vidc/vmem/vmem.c
+++ b/drivers/media/platform/msm/vidc/vmem/vmem.c
@@ -226,9 +226,9 @@ exit:
static inline int __power_off(struct vmem *v)
{
- int c = 0;
+ int c = v->num_clocks;
- for (c = 0; c < v->num_clocks; ++c) {
+ for (c--; c >= 0; --c) {
clk_disable_unprepare(v->clocks[c].clk);
pr_debug("Disabled clock %s\n", v->clocks[c].name);
}