summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_ctl.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_ctl.c b/drivers/video/fbdev/msm/mdss_mdp_ctl.c
index cc0af61d7f96..da4bc4254608 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_ctl.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_ctl.c
@@ -3861,22 +3861,38 @@ static int __mdss_mdp_mixer_handoff_helper(struct mdss_mdp_mixer *mixer,
struct mdss_mdp_pipe *pipe)
{
int rc = 0;
+ struct mdss_data_type *mdata = mdss_mdp_get_mdata();
+ u32 right_blend = 0;
if (!mixer) {
rc = -EINVAL;
goto error;
}
+ /*
+ * It is possible to have more the one pipe staged on a single
+ * layer mixer at same staging level.
+ */
if (mixer->stage_pipe[MDSS_MDP_STAGE_UNUSED] != NULL) {
- pr_err("More than one pipe staged on mixer num %d\n",
- mixer->num);
- rc = -EINVAL;
- goto error;
+ if (mdata->mdp_rev < MDSS_MDP_HW_REV_103) {
+ pr_err("More than one pipe staged on mixer num %d\n",
+ mixer->num);
+ rc = -EINVAL;
+ goto error;
+ } else if (mixer->stage_pipe[MDSS_MDP_STAGE_UNUSED + 1] !=
+ NULL) {
+ pr_err("More than two pipe staged on mixer num %d\n",
+ mixer->num);
+ rc = -EINVAL;
+ goto error;
+ } else {
+ right_blend = 1;
+ }
}
pr_debug("Staging pipe num %d on mixer num %d\n",
pipe->num, mixer->num);
- mixer->stage_pipe[MDSS_MDP_STAGE_UNUSED] = pipe;
+ mixer->stage_pipe[MDSS_MDP_STAGE_UNUSED + right_blend] = pipe;
pipe->mixer_left = mixer;
pipe->mixer_stage = MDSS_MDP_STAGE_UNUSED;