Loading drivers/video/msm/mdss/mdss_mdp_trace.h +15 −1 Original line number Diff line number Diff line /* * Copyright (c) 2014, The Linux Foundation. All rights reserved. * Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -341,6 +341,20 @@ TRACE_EVENT(mdp_trace_counter, __get_str(counter_name), __entry->value) ); TRACE_EVENT(rotator_bw_ao_as_context, TP_PROTO(u32 state), TP_ARGS(state), TP_STRUCT__entry( __field(u32, state) ), TP_fast_assign( __entry->state = state; ), TP_printk("Rotator bw context %s", __entry->state ? "Active Only" : "Active+Sleep") ); #endif /* if !defined(TRACE_MDSS_MDP_H) || defined(TRACE_HEADER_MULTI_READ) */ /* This part must be outside protection */ Loading drivers/video/msm/mdss/mdss_rotator.c +44 −38 Original line number Diff line number Diff line Loading @@ -64,6 +64,7 @@ static struct msm_bus_scale_pdata rot_reg_bus_scale_table = { .usecase = rot_reg_bus_usecases, .num_usecases = ARRAY_SIZE(rot_reg_bus_usecases), .name = "mdss_rot_reg", .active_only = 1, }; static struct mdss_rot_mgr *rot_mgr; Loading Loading @@ -264,52 +265,60 @@ static int mdss_rotator_clk_ctrl(struct mdss_rot_mgr *mgr, int enable) { struct clk *clk; int ret = 0; int i; int i, changed = 0; /* Ref counting done by clock driver */ for (i = 0; i < MDSS_CLK_ROTATOR_END_IDX; i++) { clk = mgr->rot_clk[i]; mutex_lock(&mgr->clk_lock); if (enable) { ret = clk_enable(clk); if (ret) { pr_err("enable failed clk_idx %d\n", i); goto error; } if (mgr->rot_enable_clk_cnt == 0) changed++; mgr->rot_enable_clk_cnt++; } else { clk_disable(clk); } if (mgr->rot_enable_clk_cnt) { mgr->rot_enable_clk_cnt--; if (mgr->rot_enable_clk_cnt == 0) changed++; } else { pr_err("Can not be turned off\n"); } return ret; error: for (i--; i >= 0; i--) clk_disable(mgr->rot_clk[i]); return ret; } static int __mdss_rotator_clk_prepare(struct mdss_rot_mgr *mgr, int prepare) { struct clk *clk; int ret = 0; int i; if (changed) { pr_debug("Rotator clk %s\n", enable ? "enable" : "disable"); for (i = 0; i < MDSS_CLK_ROTATOR_END_IDX; i++) { clk = mgr->rot_clk[i]; if (prepare) { ret = clk_prepare(clk); if (enable) { ret = clk_prepare_enable(clk); if (ret) { pr_err("prepare_enable failed clk_idx %d\n", i); pr_err("enable failed clk_idx %d\n", i); goto error; } } else { clk_unprepare(clk); clk_disable_unprepare(clk); } } mutex_lock(&mgr->bus_lock); if (enable) { /* Active+Sleep */ msm_bus_scale_client_update_context( mgr->data_bus.bus_hdl, false, mgr->data_bus.curr_bw_uc_idx); trace_rotator_bw_ao_as_context(0); } else { /* Active Only */ msm_bus_scale_client_update_context( mgr->data_bus.bus_hdl, true, mgr->data_bus.curr_bw_uc_idx); trace_rotator_bw_ao_as_context(1); } mutex_unlock(&mgr->bus_lock); } mutex_unlock(&mgr->clk_lock); return ret; error: for (i--; i >= 0; i--) clk_unprepare(mgr->rot_clk[i]); clk_disable_unprepare(mgr->rot_clk[i]); mutex_unlock(&mgr->clk_lock); return ret; } Loading Loading @@ -338,14 +347,11 @@ int mdss_rotator_resource_ctrl(struct mdss_rot_mgr *mgr, int enable) MDSS_XLOG(mgr->res_ref_cnt, changed, enable); if (changed) { if (enable) { if (enable) mdss_rotator_footswitch_ctrl(mgr, true); ret = __mdss_rotator_clk_prepare(mgr, enable); } else { __mdss_rotator_clk_prepare(mgr, enable); else mdss_rotator_footswitch_ctrl(mgr, false); } } mutex_unlock(&mgr->clk_lock); return ret; } Loading drivers/video/msm/mdss/mdss_rotator_internal.h +1 −0 Original line number Diff line number Diff line Loading @@ -174,6 +174,7 @@ struct mdss_rot_mgr { struct mutex clk_lock; int res_ref_cnt; struct clk *rot_clk[MDSS_CLK_ROTATOR_END_IDX]; int rot_enable_clk_cnt; bool has_downscale; bool has_ubwc; Loading Loading
drivers/video/msm/mdss/mdss_mdp_trace.h +15 −1 Original line number Diff line number Diff line /* * Copyright (c) 2014, The Linux Foundation. All rights reserved. * Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -341,6 +341,20 @@ TRACE_EVENT(mdp_trace_counter, __get_str(counter_name), __entry->value) ); TRACE_EVENT(rotator_bw_ao_as_context, TP_PROTO(u32 state), TP_ARGS(state), TP_STRUCT__entry( __field(u32, state) ), TP_fast_assign( __entry->state = state; ), TP_printk("Rotator bw context %s", __entry->state ? "Active Only" : "Active+Sleep") ); #endif /* if !defined(TRACE_MDSS_MDP_H) || defined(TRACE_HEADER_MULTI_READ) */ /* This part must be outside protection */ Loading
drivers/video/msm/mdss/mdss_rotator.c +44 −38 Original line number Diff line number Diff line Loading @@ -64,6 +64,7 @@ static struct msm_bus_scale_pdata rot_reg_bus_scale_table = { .usecase = rot_reg_bus_usecases, .num_usecases = ARRAY_SIZE(rot_reg_bus_usecases), .name = "mdss_rot_reg", .active_only = 1, }; static struct mdss_rot_mgr *rot_mgr; Loading Loading @@ -264,52 +265,60 @@ static int mdss_rotator_clk_ctrl(struct mdss_rot_mgr *mgr, int enable) { struct clk *clk; int ret = 0; int i; int i, changed = 0; /* Ref counting done by clock driver */ for (i = 0; i < MDSS_CLK_ROTATOR_END_IDX; i++) { clk = mgr->rot_clk[i]; mutex_lock(&mgr->clk_lock); if (enable) { ret = clk_enable(clk); if (ret) { pr_err("enable failed clk_idx %d\n", i); goto error; } if (mgr->rot_enable_clk_cnt == 0) changed++; mgr->rot_enable_clk_cnt++; } else { clk_disable(clk); } if (mgr->rot_enable_clk_cnt) { mgr->rot_enable_clk_cnt--; if (mgr->rot_enable_clk_cnt == 0) changed++; } else { pr_err("Can not be turned off\n"); } return ret; error: for (i--; i >= 0; i--) clk_disable(mgr->rot_clk[i]); return ret; } static int __mdss_rotator_clk_prepare(struct mdss_rot_mgr *mgr, int prepare) { struct clk *clk; int ret = 0; int i; if (changed) { pr_debug("Rotator clk %s\n", enable ? "enable" : "disable"); for (i = 0; i < MDSS_CLK_ROTATOR_END_IDX; i++) { clk = mgr->rot_clk[i]; if (prepare) { ret = clk_prepare(clk); if (enable) { ret = clk_prepare_enable(clk); if (ret) { pr_err("prepare_enable failed clk_idx %d\n", i); pr_err("enable failed clk_idx %d\n", i); goto error; } } else { clk_unprepare(clk); clk_disable_unprepare(clk); } } mutex_lock(&mgr->bus_lock); if (enable) { /* Active+Sleep */ msm_bus_scale_client_update_context( mgr->data_bus.bus_hdl, false, mgr->data_bus.curr_bw_uc_idx); trace_rotator_bw_ao_as_context(0); } else { /* Active Only */ msm_bus_scale_client_update_context( mgr->data_bus.bus_hdl, true, mgr->data_bus.curr_bw_uc_idx); trace_rotator_bw_ao_as_context(1); } mutex_unlock(&mgr->bus_lock); } mutex_unlock(&mgr->clk_lock); return ret; error: for (i--; i >= 0; i--) clk_unprepare(mgr->rot_clk[i]); clk_disable_unprepare(mgr->rot_clk[i]); mutex_unlock(&mgr->clk_lock); return ret; } Loading Loading @@ -338,14 +347,11 @@ int mdss_rotator_resource_ctrl(struct mdss_rot_mgr *mgr, int enable) MDSS_XLOG(mgr->res_ref_cnt, changed, enable); if (changed) { if (enable) { if (enable) mdss_rotator_footswitch_ctrl(mgr, true); ret = __mdss_rotator_clk_prepare(mgr, enable); } else { __mdss_rotator_clk_prepare(mgr, enable); else mdss_rotator_footswitch_ctrl(mgr, false); } } mutex_unlock(&mgr->clk_lock); return ret; } Loading
drivers/video/msm/mdss/mdss_rotator_internal.h +1 −0 Original line number Diff line number Diff line Loading @@ -174,6 +174,7 @@ struct mdss_rot_mgr { struct mutex clk_lock; int res_ref_cnt; struct clk *rot_clk[MDSS_CLK_ROTATOR_END_IDX]; int rot_enable_clk_cnt; bool has_downscale; bool has_ubwc; Loading