From f4fe9943a05d2ab4c03081a0dec14caf40c733e2 Mon Sep 17 00:00:00 2001
From: Devin Kim <dojip.kim@lge.com>
Date: Tue, 18 Nov 2014 15:29:54 -0800
Subject: [PATCH] msm: mdss: set the idle only if userspace sets it

If userspace doesn't control the idle, driver will not control the idle.
And it avoids an unintended flash before blank

Bug: 18337866
Change-Id: If66d87f3e6d7fd0485fb5a34f623df37e12c74ff
Signed-off-by: Devin Kim <dojip.kim@lge.com>
---
 drivers/video/msm/mdss/mdss_dsi.h       |  1 +
 drivers/video/msm/mdss/mdss_dsi_panel.c | 15 ++++++++++++---
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/drivers/video/msm/mdss/mdss_dsi.h b/drivers/video/msm/mdss/mdss_dsi.h
index 5b0959c49628..5516c6aa9edd 100644
--- a/drivers/video/msm/mdss/mdss_dsi.h
+++ b/drivers/video/msm/mdss/mdss_dsi.h
@@ -281,6 +281,7 @@ struct mdss_dsi_ctrl_pdata {
 	int new_fps;
 	int pwm_enabled;
 	int idle;
+	int idle_requested;
 	bool bklt_off;
 	bool blanked;
 	struct pwm_device *pwm_bl;
diff --git a/drivers/video/msm/mdss/mdss_dsi_panel.c b/drivers/video/msm/mdss/mdss_dsi_panel.c
index 5a8d963ad0a2..a928f3b3dee3 100644
--- a/drivers/video/msm/mdss/mdss_dsi_panel.c
+++ b/drivers/video/msm/mdss/mdss_dsi_panel.c
@@ -270,15 +270,19 @@ static void idle_on_work(struct work_struct *work)
 static void __mdss_dsi_panel_set_idle_mode(struct mdss_dsi_ctrl_pdata *ctrl,
 		int enable)
 {
-	/* don't need to set idle mode if display is blanked */
+	if (!ctrl->idle_requested && enable) {
+		pr_debug("%s: idle: no control from userspace\n", __func__);
+		return;
+	}
+
 	if (ctrl->blanked) {
 		pr_debug("%s: idle: already blanked\n", __func__);
-		return;
+		goto done;
 	}
 
 	if (ctrl->idle == enable) {
 		pr_debug("%s: idle: no change(%d)\n", __func__, enable);
-		return;
+		goto done;
 	}
 
 	pr_debug("%s: idle %d->%d\n", __func__, ctrl->idle, enable);
@@ -294,6 +298,9 @@ static void __mdss_dsi_panel_set_idle_mode(struct mdss_dsi_ctrl_pdata *ctrl,
 			mdss_dsi_panel_cmds_send(ctrl, &ctrl->idle_off_cmds);
 		}
 	}
+
+done:
+	ctrl->idle_requested = 0;
 }
 
 static void mdss_dsi_panel_set_idle_mode(struct mdss_panel_data *pdata,
@@ -309,6 +316,8 @@ static void mdss_dsi_panel_set_idle_mode(struct mdss_panel_data *pdata,
 	ctrl = container_of(pdata, struct mdss_dsi_ctrl_pdata,
 				panel_data);
 
+	ctrl->idle_requested = 1;
+
 	if (enable && !ctrl->bklt_off)
 		return; // will enable idle later when blkt is off
 
-- 
GitLab