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