summaryrefslogtreecommitdiff
path: root/drivers/video/fbdev
diff options
context:
space:
mode:
authorDhaval Patel <pdhaval@codeaurora.org>2015-10-07 18:40:42 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 21:13:47 -0700
commitd6a51f8080a05866d970f5cdee21ec942616ded1 (patch)
tree8dc00c48ee7344ff7026086652397ec0a9d9ee34 /drivers/video/fbdev
parent8f029e767b603dc13eb235c9ae0e223451c113ce (diff)
msm: mdss: move handoff pipes to used list
MDSS client may want to reuse the pipe during boot up which are currently in use. The pipe allocation fails when these pipes are in handoff state and atomic API tries to reallocate them. Moving them to used list allows client to reuse them at early stage without waiting for first valid kickoff. Change-Id: Ia6f1282ea192e3a0e948488ba833c2580bebb9bf Signed-off-by: Dhaval Patel <pdhaval@codeaurora.org>
Diffstat (limited to 'drivers/video/fbdev')
-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;