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,