diff options
Diffstat (limited to 'drivers/video/fbdev')
-rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_overlay.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index 5a5c9946c3f9..45069b54a6e3 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -4943,6 +4943,7 @@ static int mdss_mdp_overlay_off(struct msm_fb_data_type *mfd) struct mdss_mdp_mixer *mixer; int need_cleanup; int retire_cnt; + bool destroy_ctl = false; if (!mfd) return -ENODEV; @@ -4999,6 +5000,18 @@ static int mdss_mdp_overlay_off(struct msm_fb_data_type *mfd) mutex_unlock(&mdp5_data->list_lock); mutex_unlock(&mdp5_data->ov_lock); + destroy_ctl = !mfd->ref_cnt || mfd->panel_reconfig; + + mutex_lock(&mfd->switch_lock); + if (mfd->switch_state != MDSS_MDP_NO_UPDATE_REQUESTED) { + destroy_ctl = true; + need_cleanup = false; + pr_warn("fb%d blank while mode switch (%d) in progress\n", + mfd->index, mfd->switch_state); + mfd->switch_state = MDSS_MDP_NO_UPDATE_REQUESTED; + } + mutex_unlock(&mfd->switch_lock); + if (need_cleanup) { pr_debug("cleaning up pipes on fb%d\n", mfd->index); mdss_mdp_overlay_kickoff(mfd, NULL); @@ -5052,7 +5065,7 @@ ctl_stop: mdss_mdp_ctl_notifier_unregister(mdp5_data->ctl, &mfd->mdp_sync_pt_data.notifier); - if (!mfd->ref_cnt || mfd->panel_reconfig) { + if (destroy_ctl) { mdp5_data->borderfill_enable = false; mdss_mdp_ctl_destroy(mdp5_data->ctl); mdp5_data->ctl = NULL; |