diff options
| author | Sree Sesha Aravind Vadrevu <svadrevu@codeaurora.org> | 2013-05-24 21:53:23 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:17:55 -0700 |
| commit | 9ebd686393001417e35cf8a74b8e779533caeb56 (patch) | |
| tree | 562b14ca0b8d6d2fc81e994fa751069cc4b25c7c | |
| parent | 6d0cb5ed914a76997b4d33788b8ee9524c7f83df (diff) | |
msm: mdss: cleanup unused pipes during kickoff
If the pipe params haven't changed during kickoff
it needs to be unstaged and cleanedup to avoid crashes
due to lack of hardware resources.
CRs-fixed: 491633
Change-Id: I0dfa8d6e2c5f204fc7b1a76b384ec95a59ed6182
Signed-off-by: Sree Sesha Aravind Vadrevu <svadrevu@codeaurora.org>
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.h | 2 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_overlay.c | 12 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_pipe.c | 5 |
3 files changed, 17 insertions, 2 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h index 4a016459ac69..f59cdaa18128 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.h +++ b/drivers/video/fbdev/msm/mdss_mdp.h @@ -546,6 +546,8 @@ int mdss_panel_register_done(struct mdss_panel_data *pdata); int mdss_mdp_limited_lut_igc_config(struct mdss_mdp_ctl *ctl); int mdss_mdp_calib_config(struct mdp_calib_config_data *cfg, u32 *copyback); +int mdss_mdp_pipe_is_staged(struct mdss_mdp_pipe *pipe); + #define mfd_to_mdp5_data(mfd) (mfd->mdp.private1) #define mfd_to_mdata(mfd) (((struct mdss_overlay_private *)\ (mfd->mdp.private1))->mdata) diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index adef3e06d865..fcaa80bdb8c4 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -692,7 +692,7 @@ static void mdss_mdp_overlay_update_pm(struct mdss_overlay_private *mdp5_data) int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd) { struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); - struct mdss_mdp_pipe *pipe; + struct mdss_mdp_pipe *pipe, *next; struct mdss_mdp_ctl *ctl = mfd_to_ctl(mfd); int ret; @@ -706,7 +706,8 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd) return ret; } - list_for_each_entry(pipe, &mdp5_data->pipes_used, used_list) { + list_for_each_entry_safe(pipe, next, &mdp5_data->pipes_used, + used_list) { struct mdss_mdp_data *buf; if (pipe->back_buf.num_planes) { buf = &pipe->back_buf; @@ -714,6 +715,13 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd) pipe->params_changed++; buf = &pipe->front_buf; } else if (!pipe->params_changed) { + if (pipe->mixer) { + if (!mdss_mdp_pipe_is_staged(pipe)) { + list_del(&pipe->used_list); + list_add(&pipe->cleanup_list, + &mdp5_data->pipes_cleanup); + } + } continue; } else if (pipe->front_buf.num_planes) { buf = &pipe->front_buf; diff --git a/drivers/video/fbdev/msm/mdss_mdp_pipe.c b/drivers/video/fbdev/msm/mdss_mdp_pipe.c index 0834823671b0..3b91ced058eb 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_pipe.c +++ b/drivers/video/fbdev/msm/mdss_mdp_pipe.c @@ -725,3 +725,8 @@ done: return ret; } + +int mdss_mdp_pipe_is_staged(struct mdss_mdp_pipe *pipe) +{ + return (pipe == pipe->mixer->stage_pipe[pipe->mixer_stage]); +} |
