summaryrefslogtreecommitdiff
path: root/drivers/video/fbdev
diff options
context:
space:
mode:
authorAdrian Salido-Moreno <adrianm@codeaurora.org>2015-09-22 16:06:09 -0700
committerKyle Yan <kyan@codeaurora.org>2016-07-05 15:30:24 -0700
commit42d8f87406ddf402b7fda1c6bf3877656fbb5937 (patch)
tree36a88085b4535e2a3c982dd43be26ceb2e381289 /drivers/video/fbdev
parent99fc247e1b01a257353fb8bcb99f6bf12637b8dc (diff)
msm: mdss: handle blank while mode switch in progress
When display is getting blanked while mode switch in progress, we cannot have additional kickoff trigger for cleanup as the state hasn't been properly transitioned. Instead we can clear the state and destroy control path to start clean on next update. Change-Id: I34af01550d79e0d7d465f2c7f873508c296160dd [veeras@codeaurora.org: Resolved conflicts in mdss_mdp_overlay.c] Signed-off-by: Adrian Salido-Moreno <adrianm@codeaurora.org> Signed-off-by: Veera Sundaram Sankaran <veeras@codeaurora.org>
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;