msm_fb : Add option to enable/disable mixer commit
Adds support to enable or disable mixer commit during pipe
staging operations. Depending on the current activity, this
selection can be made.
Change-Id: Ia2f5dbab58f73ef4de90abf7f278332d8d73df46
Signed-off-by: Pradeep Jilagam <pjilagam@codeaurora.org>
diff --git a/drivers/video/msm/mdp4.h b/drivers/video/msm/mdp4.h
index 70e78f4..6fc83df 100644
--- a/drivers/video/msm/mdp4.h
+++ b/drivers/video/msm/mdp4.h
@@ -570,8 +570,8 @@
void mdp4_mixer_blend_setup(int mixer);
void mdp4_mixer_blend_cfg(int);
struct mdp4_overlay_pipe *mdp4_overlay_stage_pipe(int mixer, int stage);
-void mdp4_mixer_stage_up(struct mdp4_overlay_pipe *pipe);
-void mdp4_mixer_stage_down(struct mdp4_overlay_pipe *pipe);
+void mdp4_mixer_stage_up(struct mdp4_overlay_pipe *pipe, int commit);
+void mdp4_mixer_stage_down(struct mdp4_overlay_pipe *pipe, int commit);
void mdp4_mixer_pipe_cleanup(int mixer);
int mdp4_mixer_stage_can_run(struct mdp4_overlay_pipe *pipe);
void mdp4_overlayproc_cfg(struct mdp4_overlay_pipe *pipe);
diff --git a/drivers/video/msm/mdp4_overlay.c b/drivers/video/msm/mdp4_overlay.c
index 2b27562..63f0aa1 100644
--- a/drivers/video/msm/mdp4_overlay.c
+++ b/drivers/video/msm/mdp4_overlay.c
@@ -1652,7 +1652,7 @@
}
-void mdp4_mixer_stage_up(struct mdp4_overlay_pipe *pipe)
+void mdp4_mixer_stage_up(struct mdp4_overlay_pipe *pipe, int commit)
{
struct mdp4_overlay_pipe *pp;
int i, mixer;
@@ -1668,9 +1668,12 @@
}
ctrl->stage[mixer][pipe->mixer_stage] = pipe; /* keep it */
+
+ if (commit)
+ mdp4_mixer_stage_commit(mixer);
}
-void mdp4_mixer_stage_down(struct mdp4_overlay_pipe *pipe)
+void mdp4_mixer_stage_down(struct mdp4_overlay_pipe *pipe, int commit)
{
struct mdp4_overlay_pipe *pp;
int i, mixer;
@@ -1683,7 +1686,8 @@
ctrl->stage[mixer][i] = NULL; /* clear it */
}
- mdp4_mixer_stage_commit(mixer);
+ if (commit || (mixer > 0 && !hdmi_prim_display))
+ mdp4_mixer_stage_commit(mixer);
}
/*
* mixer0: rgb3: border color at register 0x15004, 0x15008
@@ -1744,7 +1748,7 @@
mdp4_overlay_reg_flush(bspipe, 1);
/* borderfill pipe as base layer */
- mdp4_mixer_stage_up(pipe);
+ mdp4_mixer_stage_up(pipe, 0);
}
void mdp4_overlay_borderfill_stage_down(struct mdp4_overlay_pipe *pipe)
@@ -1798,13 +1802,13 @@
/* free borderfill pipe */
mdp4_overlay_reg_flush(pipe, 1);
- mdp4_mixer_stage_down(pipe);
+ mdp4_mixer_stage_down(pipe, 0); /* commit will happen for bspipe up */
mdp4_overlay_pipe_free(pipe);
/* stage up base layer */
mdp4_overlay_reg_flush(bspipe, 1);
/* restore original base layer */
- mdp4_mixer_stage_up(bspipe);
+ mdp4_mixer_stage_up(bspipe, 1);
}
@@ -3097,7 +3101,7 @@
continue;
pipe->flags &= ~MDP_OV_PLAY_NOWAIT;
mdp4_overlay_reg_flush(pipe, 1);
- mdp4_mixer_stage_down(pipe);
+ mdp4_mixer_stage_down(pipe, 1);
mdp4_overlay_pipe_free(pipe);
cnt++;
}
@@ -3143,7 +3147,7 @@
}
mdp4_overlay_reg_flush(pipe, 1);
- mdp4_mixer_stage_down(pipe);
+ mdp4_mixer_stage_down(pipe, 0);
if (pipe->mixer_num == MDP4_MIXER0) {
if (ctrl->panel_mode & MDP4_PANEL_MDDI) {
@@ -3270,7 +3274,7 @@
pr_debug("%s: pipe=%x ndx=%d num=%d used=%d\n", __func__,
(int) pipe, pipe->pipe_ndx, pipe->pipe_num, pipe->pipe_used);
mdp4_overlay_reg_flush(pipe, 1);
- mdp4_mixer_stage_up(pipe);
+ mdp4_mixer_stage_up(pipe, 0);
}
int mdp4_overlay_play(struct fb_info *info, struct msmfb_overlay_data *req)
@@ -3447,7 +3451,7 @@
mdp4_overlay_rgb_setup(pipe); /* rgb pipe */
}
- mdp4_mixer_stage_up(pipe);
+ mdp4_mixer_stage_up(pipe, 0);
if (pipe->mixer_num == MDP4_MIXER2) {
ctrl->mixer2_played++;
@@ -3606,7 +3610,7 @@
void mdp4_v4l2_overlay_clear(struct mdp4_overlay_pipe *pipe)
{
mdp4_overlay_reg_flush(pipe, 1);
- mdp4_mixer_stage_down(pipe);
+ mdp4_mixer_stage_down(pipe, 1);
mdp4_overlay_pipe_free(pipe);
}
@@ -3669,8 +3673,9 @@
if (ctrl->panel_mode & MDP4_PANEL_LCDC)
mdp4_overlay_reg_flush(pipe, 1);
- mdp4_mixer_stage_up(pipe);
+ mdp4_mixer_stage_up(pipe, 0); /* mixer stage commit commits this */
mdp4_mixer_stage_commit(pipe->mixer_num);
+
#ifdef V4L2_VSYNC
/*
* TODO: incorporate v4l2 into vsycn driven mechanism
diff --git a/drivers/video/msm/mdp4_overlay_atv.c b/drivers/video/msm/mdp4_overlay_atv.c
index c133831..e67b244 100644
--- a/drivers/video/msm/mdp4_overlay_atv.c
+++ b/drivers/video/msm/mdp4_overlay_atv.c
@@ -115,8 +115,10 @@
mdp4_overlayproc_cfg(pipe);
mdp4_overlay_reg_flush(pipe, 1);
- mdp4_mixer_stage_up(pipe);
+
+ mdp4_mixer_stage_up(pipe, 0);
mdp4_mixer_stage_commit(pipe->mixer_num);
+
if (ret == 0)
mdp_pipe_ctrl(MDP_OVERLAY1_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
@@ -139,7 +141,7 @@
/* dis-engage rgb2 from mixer1 */
if (atv_pipe) {
- mdp4_mixer_stage_down(atv_pipe);
+ mdp4_mixer_stage_down(atv_pipe, 1);
mdp4_iommu_unmap(atv_pipe);
}
@@ -185,8 +187,9 @@
mdp4_overlay_mdp_perf_req(pipe, mfd);
mdp4_overlay_mdp_perf_upd(mfd, 1);
mdp4_overlay_rgb_setup(pipe);
+
mdp4_overlay_reg_flush(pipe, 0);
- mdp4_mixer_stage_up(pipe);
+ mdp4_mixer_stage_up(pipe, 0);
mdp4_mixer_stage_commit(pipe->mixer_num);
printk(KERN_INFO "mdp4_atv_overlay: pipe=%x ndx=%d\n",
(int)pipe, pipe->pipe_ndx);
diff --git a/drivers/video/msm/mdp4_overlay_dsi_cmd.c b/drivers/video/msm/mdp4_overlay_dsi_cmd.c
index 6232de0..3320d11 100644
--- a/drivers/video/msm/mdp4_overlay_dsi_cmd.c
+++ b/drivers/video/msm/mdp4_overlay_dsi_cmd.c
@@ -847,7 +847,7 @@
mdp4_overlay_reg_flush(pipe, 1);
- mdp4_mixer_stage_up(pipe);
+ mdp4_mixer_stage_up(pipe, 0);
mdp4_overlayproc_cfg(pipe);
@@ -923,7 +923,7 @@
mdp4_overlay_reg_flush(pipe, 1);
- mdp4_mixer_stage_up(pipe);
+ mdp4_mixer_stage_up(pipe, 0);
mdp4_overlayproc_cfg(pipe);
@@ -1003,7 +1003,7 @@
/* sanity check, free pipes besides base layer */
mdp4_overlay_unset_mixer(pipe->mixer_num);
- mdp4_mixer_stage_down(pipe);
+ mdp4_mixer_stage_down(pipe, 1);
mdp4_overlay_pipe_free(pipe);
vctrl->base_pipe = NULL;
@@ -1056,7 +1056,7 @@
mdp4_overlay_unset_mixer(pipe->mixer_num);
vctrl->base_pipe = NULL;
} else {
- mdp4_mixer_stage_down(pipe);
+ mdp4_mixer_stage_down(pipe, 1);
mdp4_overlay_iommu_pipe_free(pipe->pipe_ndx, 1);
}
}
diff --git a/drivers/video/msm/mdp4_overlay_dsi_video.c b/drivers/video/msm/mdp4_overlay_dsi_video.c
index 04da0a3..79dcee1 100644
--- a/drivers/video/msm/mdp4_overlay_dsi_video.c
+++ b/drivers/video/msm/mdp4_overlay_dsi_video.c
@@ -553,8 +553,10 @@
mdp4_overlayproc_cfg(pipe);
mdp4_overlay_reg_flush(pipe, 1);
- mdp4_mixer_stage_up(pipe);
+
+ mdp4_mixer_stage_up(pipe, 0);
mdp4_mixer_stage_commit(pipe->mixer_num);
+
/*
* DSI timing setting
*/
@@ -668,7 +670,7 @@
vctrl->base_pipe = NULL;
} else {
/* system suspending */
- mdp4_mixer_stage_down(vctrl->base_pipe);
+ mdp4_mixer_stage_down(vctrl->base_pipe, 1);
mdp4_overlay_iommu_pipe_free(
vctrl->base_pipe->pipe_ndx, 1);
}
@@ -772,7 +774,7 @@
mdp4_overlay_reg_flush(pipe, 1);
- mdp4_mixer_stage_up(pipe);
+ mdp4_mixer_stage_up(pipe, 0);
mdp4_mixer_stage_commit(pipe->mixer_num);
diff --git a/drivers/video/msm/mdp4_overlay_dtv.c b/drivers/video/msm/mdp4_overlay_dtv.c
index 8a0b092..f3bd775 100644
--- a/drivers/video/msm/mdp4_overlay_dtv.c
+++ b/drivers/video/msm/mdp4_overlay_dtv.c
@@ -582,7 +582,7 @@
/* pipe == rgb2 */
vctrl->base_pipe = NULL;
} else {
- mdp4_mixer_stage_down(pipe);
+ mdp4_mixer_stage_down(pipe, 1);
mdp4_overlay_pipe_free(pipe);
vctrl->base_pipe = NULL;
}
@@ -726,8 +726,9 @@
}
mdp4_overlay_reg_flush(pipe, 1);
- mdp4_mixer_stage_up(pipe);
+ mdp4_mixer_stage_up(pipe, 0);
mdp4_mixer_stage_commit(pipe->mixer_num);
+
vctrl->base_pipe = pipe; /* keep it */
}
@@ -897,7 +898,8 @@
temp_src_format = inpdw(rgb_base + 0x0050);
MDP_OUTP(rgb_base + 0x0050, temp_src_format | BIT(22));
mdp4_overlay_reg_flush(vctrl->base_pipe, 1);
- mdp4_mixer_stage_up(vctrl->base_pipe);
+
+ mdp4_mixer_stage_up(vctrl->base_pipe, 0);
mdp4_mixer_stage_commit(vctrl->base_pipe->mixer_num);
mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
}
diff --git a/drivers/video/msm/mdp4_overlay_lcdc.c b/drivers/video/msm/mdp4_overlay_lcdc.c
index aa2de32..34f30f7 100644
--- a/drivers/video/msm/mdp4_overlay_lcdc.c
+++ b/drivers/video/msm/mdp4_overlay_lcdc.c
@@ -526,7 +526,7 @@
mdp4_overlayproc_cfg(pipe);
mdp4_overlay_reg_flush(pipe, 1);
- mdp4_mixer_stage_up(pipe);
+ mdp4_mixer_stage_up(pipe, 0);
/*
@@ -657,7 +657,7 @@
vctrl->base_pipe = NULL;
} else {
/* system suspending */
- mdp4_mixer_stage_down(vctrl->base_pipe);
+ mdp4_mixer_stage_down(vctrl->base_pipe, 1);
mdp4_overlay_iommu_pipe_free(
vctrl->base_pipe->pipe_ndx, 1);
}
diff --git a/drivers/video/msm/mdp4_overlay_mddi.c b/drivers/video/msm/mdp4_overlay_mddi.c
index e6ff9ef..be4a89a 100644
--- a/drivers/video/msm/mdp4_overlay_mddi.c
+++ b/drivers/video/msm/mdp4_overlay_mddi.c
@@ -236,7 +236,7 @@
mdp4_overlay_rgb_setup(pipe);
- mdp4_mixer_stage_up(pipe);
+ mdp4_mixer_stage_up(pipe, 1);
mdp4_overlayproc_cfg(pipe);
diff --git a/drivers/video/msm/mdp4_overlay_writeback.c b/drivers/video/msm/mdp4_overlay_writeback.c
index 2a44dda..487e5d5 100644
--- a/drivers/video/msm/mdp4_overlay_writeback.c
+++ b/drivers/video/msm/mdp4_overlay_writeback.c
@@ -181,7 +181,7 @@
else
pipe->srcp0_addr = (uint32)(buf + buf_offset);
- mdp4_mixer_stage_up(pipe);
+ mdp4_mixer_stage_up(pipe, 0);
mdp4_overlayproc_cfg(pipe);
mdp4_mixer_stage_commit(pipe->mixer_num);