display: HBM must be off before panel state transition

AUO suggests that it's necessary for panel to exit high brightness mode
before the panel enters idle/sleep mode.

BUG: 130840859

Change-Id: I70fec677b9ec3faf39eb15472c0979c3457269a8
Signed-off-by: chester_sun <Chester_Sun@compal.com>
diff --git a/drivers/video/fbdev/msm/mdss_dsi.h b/drivers/video/fbdev/msm/mdss_dsi.h
index 48a752a..0c75407 100644
--- a/drivers/video/fbdev/msm/mdss_dsi.h
+++ b/drivers/video/fbdev/msm/mdss_dsi.h
@@ -577,6 +577,7 @@
 	/* in-cell touch panel display state params */
 	char read_back_param[1];
 	char id3_code[1]; //for Module/Driver ID
+	bool boost_mode_state;
 };
 
 struct dsi_status_data {
diff --git a/drivers/video/fbdev/msm/mdss_dsi_cmd.c b/drivers/video/fbdev/msm/mdss_dsi_cmd.c
index 59e2f76..c6dc2d8 100644
--- a/drivers/video/fbdev/msm/mdss_dsi_cmd.c
+++ b/drivers/video/fbdev/msm/mdss_dsi_cmd.c
@@ -25,6 +25,8 @@
 #include "mdss_dsi.h"
 #include "mdss_smmu.h"
 
+static DEFINE_MUTEX(boost_mode_lock);
+
 /*
  * mipi dsi buf mechanism
  */
@@ -945,3 +947,18 @@
 		pr_info("%s: boost off!\n", __func__);
 	}
 }
+
+void mdss_dsi_boost_mode_enable(struct mdss_dsi_ctrl_pdata *ctrl, u32 enabled)
+{
+	mutex_lock(&boost_mode_lock);
+	if (ctrl->boost_mode_state != enabled) {
+		if (enabled != 0) {
+			mdss_dsi_brightness_boost_on(ctrl);
+			ctrl->boost_mode_state = 1;
+		} else {
+			mdss_dsi_brightness_boost_off(ctrl);
+			ctrl->boost_mode_state = 0;
+		}
+	}
+	mutex_unlock(&boost_mode_lock);
+}
diff --git a/drivers/video/fbdev/msm/mdss_dsi_cmd.h b/drivers/video/fbdev/msm/mdss_dsi_cmd.h
index 16d09f2..be8fc98 100644
--- a/drivers/video/fbdev/msm/mdss_dsi_cmd.h
+++ b/drivers/video/fbdev/msm/mdss_dsi_cmd.h
@@ -136,6 +136,7 @@
 void mdss_dsi_switch_page(struct mdss_dsi_ctrl_pdata *ctrl, char page);
 void mdss_dsi_brightness_boost_on(struct mdss_dsi_ctrl_pdata *ctrl);
 void mdss_dsi_brightness_boost_off(struct mdss_dsi_ctrl_pdata *ctrl);
+void mdss_dsi_boost_mode_enable(struct mdss_dsi_ctrl_pdata *ctrl, u32 enabled);
 
 struct dcs_cmd_req *mdss_dsi_cmdlist_get(struct mdss_dsi_ctrl_pdata *ctrl,
 				int from_mdp);
diff --git a/drivers/video/fbdev/msm/mdss_dsi_panel.c b/drivers/video/fbdev/msm/mdss_dsi_panel.c
index 3c367f7..c94cac4 100644
--- a/drivers/video/fbdev/msm/mdss_dsi_panel.c
+++ b/drivers/video/fbdev/msm/mdss_dsi_panel.c
@@ -268,6 +268,11 @@
 	if (ctrl->idle == enable)
 		return;
 
+	if (ctrl->hbm_off_cmds.blen > 0) {
+		if (enable)
+			mdss_dsi_boost_mode_enable(ctrl, 0);
+	}
+
 	MDSS_XLOG(ctrl->idle, enable);
 	if (enable) {
 		if (ctrl->idle_on_cmds.cmd_cnt) {
@@ -1044,6 +1049,9 @@
 			goto end;
 	}
 
+	if (ctrl->hbm_off_cmds.blen > 0)
+		mdss_dsi_boost_mode_enable(ctrl, 0);
+
 	if (ctrl->off_cmds.cmd_cnt)
 		mdss_dsi_panel_cmds_send(ctrl, &ctrl->off_cmds, CMD_REQ_COMMIT);
 
diff --git a/drivers/video/fbdev/msm/mdss_fb.c b/drivers/video/fbdev/msm/mdss_fb.c
index 72cd663..9d9d7eb0 100644
--- a/drivers/video/fbdev/msm/mdss_fb.c
+++ b/drivers/video/fbdev/msm/mdss_fb.c
@@ -94,8 +94,6 @@
 
 static struct msm_mdp_interface *mdp_instance;
 
-static bool g_boost_mode;
-
 static int mdss_fb_register(struct msm_fb_data_type *mfd);
 static int mdss_fb_open(struct fb_info *info, int user);
 static int mdss_fb_release(struct fb_info *info, int user);
@@ -554,13 +552,7 @@
 		return;
 	}
 
-	if (!mfd->activate_boost) {
-		mdss_dsi_brightness_boost_off(ctrl);
-		g_boost_mode = 0;
-	} else {
-		mdss_dsi_brightness_boost_on(ctrl);
-		g_boost_mode = 1;
-	}
+	mdss_dsi_boost_mode_enable(ctrl, mfd->activate_boost);
 }
 
 static ssize_t mdss_fb_get_fps_info(struct device *dev,
@@ -948,7 +940,18 @@
 {
 	int ret;
 
-	ret = scnprintf(buf, PAGE_SIZE, "%d\n", g_boost_mode);
+	struct fb_info *fbi = dev_get_drvdata(dev);
+	struct msm_fb_data_type *mfd = fbi->par;
+	struct mdss_dsi_ctrl_pdata *ctrl = NULL;
+
+	ctrl = container_of(dev_get_platdata(&mfd->pdev->dev),
+				struct mdss_dsi_ctrl_pdata, panel_data);
+	if (!ctrl) {
+		pr_err("%s: DSI ctrl not available\n", __func__);
+		return -EINVAL;
+	}
+
+	ret = scnprintf(buf, PAGE_SIZE, "%d\n", ctrl->boost_mode_state);
 
 	return ret;
 }