summaryrefslogtreecommitdiff
path: root/drivers/video/fbdev
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video/fbdev')
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_overlay.c15
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;