msm_fb: display: change mdp clock while mdp is idle at overlay_set()
MDP clock is adjusted base on run time perfomance level.
This patch will change MDP clock while mdp is in idle
state at overlay_set() when performance level changed to
avoid MDP from underrun.
Signed-off-by: Kuogee Hsieh <khsieh@codeaurora.org>
diff --git a/drivers/video/msm/mdp4_overlay.c b/drivers/video/msm/mdp4_overlay.c
index aa34506..e003243 100644
--- a/drivers/video/msm/mdp4_overlay.c
+++ b/drivers/video/msm/mdp4_overlay.c
@@ -98,8 +98,7 @@
};
static struct mdp4_overlay_ctrl *ctrl = &mdp4_overlay_db;
-static uint32 new_perf_level;
-static uint32 mdp4_del_res_rel;
+static int new_perf_level;
/* static array with index 0 for unset status and 1 for set status */
static bool overlay_status[MDP4_OVERLAY_TYPE_MAX];
@@ -1989,6 +1988,7 @@
struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)info->par;
int ret, mixer, perf_level;
struct mdp4_overlay_pipe *pipe;
+ uint32 flags;
if (mfd == NULL) {
pr_err("%s: mfd == NULL, -ENODEV\n", __func__);
@@ -2073,11 +2073,34 @@
mdp4_overlay_status_write(MDP4_OVERLAY_TYPE_SET, true);
}
- mdp4_del_res_rel = 0;
- mutex_unlock(&mfd->dma->ov_mutex);
new_perf_level = perf_level;
+ /* change clck base on perf level */
+ flags = pipe->flags;
+ pipe->flags &= ~MDP_OV_PLAY_NOWAIT;
+ if (pipe->mixer_num == MDP4_MIXER0) {
+ if (ctrl->panel_mode & MDP4_PANEL_DSI_VIDEO) {
+ mdp4_overlay_dsi_video_vsync_push(mfd, pipe);
+ } else if (ctrl->panel_mode & MDP4_PANEL_DSI_CMD) {
+ mdp4_dsi_cmd_dma_busy_wait(mfd);
+ mdp4_dsi_blt_dmap_busy_wait(mfd);
+ mdp4_set_perf_level();
+ } else if (ctrl->panel_mode & MDP4_PANEL_LCDC) {
+ mdp4_overlay_lcdc_vsync_push(mfd, pipe);
+ } else if (ctrl->panel_mode & MDP4_PANEL_MDDI) {
+ mdp4_mddi_dma_busy_wait(mfd);
+ mdp4_set_perf_level();
+ }
+ } else {
+ if (ctrl->panel_mode & MDP4_PANEL_DTV)
+ mdp4_overlay_dtv_vsync_push(mfd, pipe);
+ }
+ pipe->flags = flags;
+
+ mutex_unlock(&mfd->dma->ov_mutex);
+
+
#ifdef CONFIG_MSM_BUS_SCALING
if (pipe->mixer_num == MDP4_MIXER0) {
mdp_bus_scale_update_request(OVERLAY_BUS_SCALE_TABLE_BASE
@@ -2160,10 +2183,12 @@
}
#ifdef CONFIG_FB_MSM_DTV
else { /* mixer1, DTV, ATV */
- flags = pipe->flags;
- pipe->flags &= ~MDP_OV_PLAY_NOWAIT;
- mdp4_overlay_dtv_vsync_push(mfd, pipe);
- pipe->flags = flags;
+ if (ctrl->panel_mode & MDP4_PANEL_DTV) {
+ flags = pipe->flags;
+ pipe->flags &= ~MDP_OV_PLAY_NOWAIT;
+ mdp4_overlay_dtv_vsync_push(mfd, pipe);
+ pipe->flags = flags;
+ }
}
#endif