diff --git a/drivers/video/fbdev/msm/mdss_fb.c b/drivers/video/fbdev/msm/mdss_fb.c index 6655da7ca5a5..893c07379e20 100644 --- a/drivers/video/fbdev/msm/mdss_fb.c +++ b/drivers/video/fbdev/msm/mdss_fb.c @@ -3453,6 +3453,11 @@ static int __mdss_fb_perform_commit(struct msm_fb_data_type *mfd) if (mfd->switch_state == MDSS_MDP_WAIT_FOR_COMMIT) { dynamic_dsi_switch = 1; new_dsi_mode = mfd->switch_new_mode; + } else if (mfd->switch_state != MDSS_MDP_NO_UPDATE_REQUESTED) { + pr_err("invalid commit on fb%d with state = %d\n", + mfd->index, mfd->switch_state); + mutex_unlock(&mfd->switch_lock); + goto skip_commit; } mutex_unlock(&mfd->switch_lock); @@ -3486,6 +3491,8 @@ static int __mdss_fb_perform_commit(struct msm_fb_data_type *mfd) pr_err("pan display failed %x on fb%d\n", ret, mfd->index); } + +skip_commit: if (!ret) mdss_fb_update_backlight(mfd); diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index 45069b54a6e3..388e0057d746 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -4294,6 +4294,22 @@ static int mdss_mdp_overlay_precommit(struct msm_fb_data_type *mfd) mfd->index, ret); ret = -EPIPE; } + + /* + * If we are in process of mode switch we may have an invalid state. + * We can allow commit to happen if there are no pipes attached as only + * border color will be seen regardless of resolution or mode. + */ + if ((mfd->switch_state != MDSS_MDP_NO_UPDATE_REQUESTED) && + (mfd->switch_state != MDSS_MDP_WAIT_FOR_COMMIT)) { + if (list_empty(&mdp5_data->pipes_used)) { + mfd->switch_state = MDSS_MDP_WAIT_FOR_COMMIT; + } else { + pr_warn("Invalid commit on fb%d with state=%d\n", + mfd->index, mfd->switch_state); + ret = -EINVAL; + } + } mutex_unlock(&mdp5_data->ov_lock); return ret;