diff options
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_layer.c | 1 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_overlay.c | 18 |
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; |
