diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2016-12-09 19:59:40 -0800 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-12-09 19:59:40 -0800 |
| commit | 08a4cbeb4db6e3978bbfbf365377bcea428ba841 (patch) | |
| tree | 70429e144921e921734ca550a09e8e53c76942f3 | |
| parent | b6b2f0da26e124c82d6f6340b0aff0749bebfc6b (diff) | |
| parent | 254699d0266fe6cf4c5b03e16c2435535d20327a (diff) | |
Merge "msm: vidc: Disable clocks in reverse order"
| -rw-r--r-- | drivers/media/platform/msm/vidc/venus_boot.c | 4 | ||||
| -rw-r--r-- | drivers/media/platform/msm/vidc/venus_hfi.c | 11 | ||||
| -rw-r--r-- | drivers/media/platform/msm/vidc/venus_hfi.h | 5 | ||||
| -rw-r--r-- | drivers/media/platform/msm/vidc/vmem/vmem.c | 4 |
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); } |
