diff --git a/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c b/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c index 9a41ffaadbcc2a03d1f71e6c75d0698b284eaff8..dd3332e1b020fd7b5a4de6782d8cc325cc00b593 100644 --- a/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c +++ b/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c @@ -590,6 +590,7 @@ int mdss_mdp_cmd_kickoff(struct mdss_mdp_ctl *ctl, void *arg) int mdss_mdp_cmd_off_pan_on(struct mdss_mdp_ctl *ctl) { struct mdss_mdp_cmd_ctx *ctx; + struct mdss_panel_info *pinfo; unsigned long flags; int need_wait = 0; @@ -599,6 +600,8 @@ int mdss_mdp_cmd_off_pan_on(struct mdss_mdp_ctl *ctl) return -ENODEV; } + pinfo = &ctl->panel_data->panel_info; + pr_debug("%s: clk_enabled=%d\n", __func__, ctx->clk_enabled); spin_lock_irqsave(&ctx->clk_lock, flags); @@ -609,7 +612,17 @@ int mdss_mdp_cmd_off_pan_on(struct mdss_mdp_ctl *ctl) spin_unlock_irqrestore(&ctx->clk_lock, flags); if (need_wait) { - if (wait_for_completion_timeout(&ctx->stop_comp, STOP_TIMEOUT) + int idle = 0; + unsigned long timeout = STOP_TIMEOUT; + + if (ctl->panel_data->get_idle) + idle = ctl->panel_data->get_idle(ctl->panel_data); + + if (idle) + timeout = msecs_to_jiffies(pinfo->idle_ms_per_frame * + (VSYNC_EXPIRE_TICK + 2)); + + if (wait_for_completion_timeout(&ctx->stop_comp, timeout) <= 0) { pr_debug("%s: stop cmd time out\n", __func__); mdss_mdp_irq_disable(MDSS_MDP_IRQ_PING_PONG_RD_PTR,