diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index f81c4b612656..7e09b080edf6 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -2620,27 +2620,35 @@ int mdss_mdp_overlay_vsync_ctrl(struct msm_fb_data_type *mfd, int en) if (!ctl) return -ENODEV; - if (!ctl->ops.add_vsync_handler || !ctl->ops.remove_vsync_handler) - return -EOPNOTSUPP; + + mutex_lock(&mdp5_data->ov_lock); + if (!ctl->ops.add_vsync_handler || !ctl->ops.remove_vsync_handler) { + rc = -EOPNOTSUPP; + pr_err_once("fb%d vsync handlers are not registered\n", + mfd->index); + goto end; + } + if (!ctl->panel_data->panel_info.cont_splash_enabled && (!mdss_mdp_ctl_is_power_on(ctl) || mdss_panel_is_power_on_ulp(ctl->power_state))) { - pr_debug("fb%d vsync pending first update en=%d\n", - mfd->index, en); - return -EPERM; + pr_debug("fb%d vsync pending first update en=%d, ctl power state:%d\n", + mfd->index, en, ctl->power_state); + rc = -EPERM; + goto end; } pr_debug("fb%d vsync en=%d\n", mfd->index, en); - mutex_lock(&mdp5_data->ov_lock); mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON); if (en) rc = ctl->ops.add_vsync_handler(ctl, &ctl->vsync_handler); else rc = ctl->ops.remove_vsync_handler(ctl, &ctl->vsync_handler); mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_OFF); - mutex_unlock(&mdp5_data->ov_lock); +end: + mutex_unlock(&mdp5_data->ov_lock); return rc; }