summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_layer.c1
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_overlay.c18
2 files changed, 14 insertions, 5 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_layer.c b/drivers/video/fbdev/msm/mdss_mdp_layer.c
index 5e9322800980..bdd0416598c5 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_layer.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_layer.c
@@ -491,6 +491,7 @@ static int __configure_pipe_params(struct msm_fb_data_type *mfd,
pipe->alpha = layer->alpha;
pipe->transp = layer->transp_mask;
pipe->blend_op = layer->blend_op;
+ pipe->is_handed_off = false;
pipe->async_update = (layer->flags & MDP_LAYER_ASYNC) ? true : false;
if (mixer->ctl) {
diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c
index ccc2786e66fd..3a95fa9053e6 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c
@@ -1291,7 +1291,7 @@ void mdss_mdp_handoff_cleanup_pipes(struct msm_fb_data_type *mfd,
pipe = &pipes[i];
if (pipe->is_handed_off) {
pr_debug("Unmapping handed off pipe %d\n", pipe->num);
- list_add(&pipe->list, &mdp5_data->pipes_cleanup);
+ list_move(&pipe->list, &mdp5_data->pipes_cleanup);
mdss_mdp_mixer_pipe_unstage(pipe, pipe->mixer_left);
pipe->is_handed_off = false;
}
@@ -4751,17 +4751,20 @@ ctl_stop:
return rc;
}
-static int __mdss_mdp_ctl_handoff(struct mdss_mdp_ctl *ctl,
- struct mdss_data_type *mdata)
+static int __mdss_mdp_ctl_handoff(struct msm_fb_data_type *mfd,
+ struct mdss_mdp_ctl *ctl, struct mdss_data_type *mdata)
{
int rc = 0;
int i, j;
u32 mixercfg;
struct mdss_mdp_pipe *pipe = NULL;
+ struct mdss_overlay_private *mdp5_data;
if (!ctl || !mdata)
return -EINVAL;
+ mdp5_data = mfd_to_mdp5_data(mfd);
+
for (i = 0; i < mdata->nmixers_intf; i++) {
mixercfg = mdss_mdp_ctl_read(ctl, MDSS_MDP_REG_CTL_LAYER(i));
pr_debug("for lm%d mixercfg = 0x%09x\n", i, mixercfg);
@@ -4789,6 +4792,11 @@ static int __mdss_mdp_ctl_handoff(struct mdss_mdp_ctl *ctl,
goto exit;
}
+ pipe->mfd = mfd;
+ mutex_lock(&mdp5_data->list_lock);
+ list_add(&pipe->list, &mdp5_data->pipes_used);
+ mutex_unlock(&mdp5_data->list_lock);
+
rc = mdss_mdp_mixer_handoff(ctl, i, pipe);
if (rc) {
pr_err("failed to handoff mix%d\n", i);
@@ -4842,7 +4850,7 @@ static int mdss_mdp_overlay_handoff(struct msm_fb_data_type *mfd)
ctl->clk_rate = mdss_mdp_get_clk_rate(MDSS_CLK_MDP_CORE, false);
pr_debug("Set the ctl clock rate to %d Hz\n", ctl->clk_rate);
- rc = __mdss_mdp_ctl_handoff(ctl, mdata);
+ rc = __mdss_mdp_ctl_handoff(mfd, ctl, mdata);
if (rc) {
pr_err("primary ctl handoff failed. rc=%d\n", rc);
goto error;
@@ -4855,7 +4863,7 @@ static int mdss_mdp_overlay_handoff(struct msm_fb_data_type *mfd)
rc = -EPERM;
goto error;
}
- rc = __mdss_mdp_ctl_handoff(sctl, mdata);
+ rc = __mdss_mdp_ctl_handoff(mfd, sctl, mdata);
if (rc) {
pr_err("secondary ctl handoff failed. rc=%d\n", rc);
goto error;