summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorDavide Garberi <dade.garberi@gmail.com>2020-02-15 12:12:42 +0100
committerMichael Bestas <mkbestas@lineageos.org>2020-05-01 18:21:40 +0300
commit57cf1e5883a34631d0d964cf04ca14b726211b87 (patch)
tree90bc41fbd62c6c750a2eb177ab40395b7398602c /drivers
parent27f2c888f35ec05e090033f345eadf4645de2318 (diff)
msm: mdss: Import longcheer mdss changes
Change-Id: I0a55c5980934897d5ad8bbb3091804ff2febf896
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/fbdev/core/fbmem.c6
-rw-r--r--drivers/video/fbdev/msm/mdss_dsi.c49
-rw-r--r--drivers/video/fbdev/msm/mdss_dsi_host.c8
-rw-r--r--drivers/video/fbdev/msm/mdss_dsi_panel.c199
-rw-r--r--drivers/video/fbdev/msm/mdss_dsi_status.c4
-rw-r--r--drivers/video/fbdev/msm/mdss_fb.c20
-rw-r--r--drivers/video/fbdev/msm/mdss_fb.h2
-rw-r--r--drivers/video/fbdev/msm/mdss_io_util.c61
8 files changed, 336 insertions, 13 deletions
diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c
index c3533cea07ec..3b7d7535d01e 100644
--- a/drivers/video/fbdev/core/fbmem.c
+++ b/drivers/video/fbdev/core/fbmem.c
@@ -1069,7 +1069,7 @@ fb_blank(struct fb_info *info, int blank)
if (blank > FB_BLANK_POWERDOWN)
blank = FB_BLANK_POWERDOWN;
-#ifdef CONFIG_MACH_MI
+#ifdef CONFIG_MACH_XIAOMI_SDM660
if (info->blank == blank) {
if (info->fbops->fb_blank)
ret = info->fbops->fb_blank(blank, info);
@@ -1096,7 +1096,7 @@ fb_blank(struct fb_info *info, int blank)
fb_notifier_call_chain(FB_R_EARLY_EVENT_BLANK, &event);
}
-#ifdef CONFIG_MACH_MI
+#ifdef CONFIG_MACH_XIAOMI_SDM660
if (!ret)
info->blank = blank;
#endif
@@ -1662,7 +1662,7 @@ static int do_register_framebuffer(struct fb_info *fb_info)
if (!registered_fb[i])
break;
fb_info->node = i;
-#ifdef CONFIG_MACH_MI
+#ifdef CONFIG_MACH_XIAOMI_SDM660
fb_info->blank = -1;
#endif
atomic_set(&fb_info->count, 1);
diff --git a/drivers/video/fbdev/msm/mdss_dsi.c b/drivers/video/fbdev/msm/mdss_dsi.c
index 0092d4596ac9..bbb280b41777 100644
--- a/drivers/video/fbdev/msm/mdss_dsi.c
+++ b/drivers/video/fbdev/msm/mdss_dsi.c
@@ -447,11 +447,18 @@ static int mdss_dsi_panel_power_lp(struct mdss_panel_data *pdata, int enable)
return 0;
}
+#ifdef CONFIG_MACH_LONGCHEER
+extern bool ESD_TE_status;
+#endif
+
static int mdss_dsi_panel_power_ctrl(struct mdss_panel_data *pdata,
int power_state)
{
int ret = 0;
struct mdss_panel_info *pinfo;
+#ifdef CONFIG_MACH_LONGCHEER
+ struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
+#endif
if (pdata == NULL) {
pr_err("%s: Invalid input data\n", __func__);
@@ -486,7 +493,49 @@ static int mdss_dsi_panel_power_ctrl(struct mdss_panel_data *pdata,
if (mdss_dsi_is_panel_on_lp(pdata))
ret = mdss_dsi_panel_power_lp(pdata, false);
else
+#ifdef CONFIG_MACH_LONGCHEER
+ {
+ if (ESD_TE_status) {
+ ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
+ panel_data);
+
+ ret = mdss_dsi_panel_reset(pdata, 0);
+ if (ret) {
+ pr_warn("%s: Panel reset failed. rc=%d\n", __func__, ret);
+ ret = 0;
+ }
+ if (mdss_dsi_pinctrl_set_state(ctrl_pdata, false))
+ pr_debug("reset disable:pinctrl not enable \n");
+
+ ret = msm_dss_enable_vreg(ctrl_pdata->panel_power_data.vreg_config,
+ ctrl_pdata->panel_power_data.num_vreg, 0);
+ if (ret)
+ pr_err("%s:failed to disable vreg for %s\n", __func__, __mdss_dsi_pm_name(DSI_PANEL_PM));
+ msleep(10);
+ mdss_dsi_panel_reset(pdata, 1);
+ msleep(10);
+ mdss_dsi_panel_reset(pdata, 0);
+ msleep(1);
+ mdss_dsi_panel_reset(pdata, 1);
+ msleep(10);
+ mdss_dsi_panel_reset(pdata, 0);
+ msleep(300);
+ mdss_dsi_panel_reset(pdata, 1);
+ msleep(20);
+ mdss_dsi_panel_reset(pdata, 0);
+ msleep(20);
+ mdss_dsi_panel_reset(pdata, 1);
+ msleep(20);
+ mdss_dsi_panel_reset(pdata, 0);
+ printk("nova panel reset\n");
+
+ ESD_TE_status = false;
+ }
+#endif
ret = mdss_dsi_panel_power_on(pdata);
+#ifdef CONFIG_MACH_LONGCHEER
+ }
+#endif
break;
case MDSS_PANEL_POWER_LP1:
case MDSS_PANEL_POWER_LP2:
diff --git a/drivers/video/fbdev/msm/mdss_dsi_host.c b/drivers/video/fbdev/msm/mdss_dsi_host.c
index 34cedaaa5864..40f7b64afeed 100644
--- a/drivers/video/fbdev/msm/mdss_dsi_host.c
+++ b/drivers/video/fbdev/msm/mdss_dsi_host.c
@@ -1175,6 +1175,10 @@ static int mdss_dsi_read_status(struct mdss_dsi_ctrl_pdata *ctrl)
return rc;
}
+#ifdef CONFIG_MACH_LONGCHEER
+extern char g_lcd_id[128];
+extern bool ESD_TE_status;
+#endif
/**
* mdss_dsi_reg_status_check() - Check dsi panel status through reg read
@@ -1237,6 +1241,10 @@ int mdss_dsi_reg_status_check(struct mdss_dsi_ctrl_pdata *ctrl_pdata)
ret = ctrl_pdata->check_read_status(sctrl_pdata);
} else {
pr_err("%s: Read status register returned error\n", __func__);
+#ifdef CONFIG_MACH_LONGCHEER
+ if ((strstr(g_lcd_id, "nt36672") != NULL) || (strstr(g_lcd_id, "nt36672a") != NULL) || (strstr(g_lcd_id, "td4320") != NULL))
+ ESD_TE_status = true;
+#endif
}
mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle,
diff --git a/drivers/video/fbdev/msm/mdss_dsi_panel.c b/drivers/video/fbdev/msm/mdss_dsi_panel.c
index cbb45777cade..ae45c1c9a327 100644
--- a/drivers/video/fbdev/msm/mdss_dsi_panel.c
+++ b/drivers/video/fbdev/msm/mdss_dsi_panel.c
@@ -34,6 +34,25 @@
#define VSYNC_DELAY msecs_to_jiffies(17)
+#ifdef CONFIG_MACH_LONGCHEER
+bool tianma_jdi_flag=0;
+char g_lcd_id[128];
+struct mdss_dsi_ctrl_pdata *ctrl_pdata_whitepoint;
+EXPORT_SYMBOL(g_lcd_id);
+extern bool enable_gesture_mode;
+
+#ifdef CONFIG_MACH_XIAOMI_LAVENDER
+#define TP_RESET_GPIO 66
+extern bool synaptics_gesture_enable_flag;
+#elif defined(CONFIG_MACH_XIAOMI_TULIP)
+extern bool focal_gesture_mode;
+#elif defined(CONFIG_MACH_XIAOMI_WHYRED)
+extern bool synaptics_gesture_func_on;
+#endif
+
+bool ESD_TE_status = false;
+#endif
+
DEFINE_LED_TRIGGER(bl_led_trigger);
#ifdef CONFIG_MACH_MI
@@ -198,6 +217,66 @@ int mdss_dsi_panel_cmd_read(struct mdss_dsi_ctrl_pdata *ctrl, char cmd0,
return mdss_dsi_cmdlist_put(ctrl, &cmdreq);
}
+#ifdef CONFIG_MACH_LONGCHEER
+static char dcs_reg[2] = {0x00, 0x00}; /* DTYPE_DCS_READ */
+static struct dsi_cmd_desc dcs_read_reg = {
+ {DTYPE_DCS_READ, 1, 0, 1, 5, sizeof(dcs_reg)},
+ dcs_reg
+};
+
+int mdss_dsi_read_reg(struct mdss_dsi_ctrl_pdata *ctrl, char cmd0, int *val0, int *val1)
+{
+ struct dcs_cmd_req cmdreq;
+ struct mdss_panel_info *pinfo;
+ char rbuf[8];
+ int len = sizeof(rbuf);
+ printk("guorui:%s,reg 0x%x\n", __func__, cmd0);
+ if(ctrl == NULL)
+ ctrl = ctrl_pdata_whitepoint;
+ pinfo = &(ctrl->panel_data.panel_info);
+ if (pinfo->dcs_cmd_by_left) {
+ if (ctrl->ndx != DSI_CTRL_LEFT)
+ return -EINVAL;
+ }
+
+ dcs_reg[0] = cmd0;
+ memset(&cmdreq, 0, sizeof(cmdreq));
+ cmdreq.cmds = &dcs_read_reg;
+ cmdreq.cmds_cnt = 1;
+ cmdreq.flags = CMD_REQ_RX | CMD_REQ_COMMIT | CMD_REQ_HS_MODE;
+ cmdreq.rlen = len;
+ cmdreq.rbuf = rbuf;
+ cmdreq.cb = NULL; /* call back */
+ /*
+ * blocked here, until call back called
+ */
+
+
+ mdss_dsi_cmdlist_put(ctrl, &cmdreq);
+ *val0 = rbuf[0];
+#if defined(CONFIG_MACH_XIAOMI_LAVENDER) || defined(CONFIG_MACH_XIAOMI_TULIP)
+ /* policy for e7t tianma nt36672a D0:x D2:y */
+ if (strstr(g_lcd_id,"tianma") != NULL)
+ *val1 = rbuf[2];
+ else {
+ /* policy for f7a ebbg nt36672a D0:x D1:y */
+ if(0 != rbuf[1])
+ *val1 = rbuf[1];
+ else
+ *val1 = rbuf[2];
+ }
+#else
+ /* policy for nt36672 */
+ if(0 != rbuf[1])
+ *val1 = rbuf[1];
+ else
+ *val1 = rbuf[2];
+#endif
+ printk("guorui:%x %x %x %x %x %x %x %x\n",rbuf[0],rbuf[1],rbuf[2],rbuf[3],rbuf[4],rbuf[5],rbuf[6],rbuf[7]);
+ return 0;
+}
+#endif
+
static void mdss_dsi_panel_apply_settings(struct mdss_dsi_ctrl_pdata *ctrl,
struct dsi_panel_cmds *pcmds)
{
@@ -490,6 +569,16 @@ int mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable)
}
}
+#ifdef CONFIG_MACH_LONGCHEER
+ usleep_range(12 * 1000, 12 * 1000);
+#ifdef CONFIG_MACH_XIAOMI_LAVENDER
+ if(!enable_gesture_mode && !synaptics_gesture_enable_flag) {
+ if (gpio_direction_output(TP_RESET_GPIO, 1)) {
+ pr_err("%s: unable to set dir for touch reset gpio\n", __func__);
+ }
+ }
+#endif
+#endif
if (pdata->panel_info.rst_seq_len) {
rc = gpio_direction_output(ctrl_pdata->rst_gpio,
pdata->panel_info.rst_seq[0]);
@@ -561,7 +650,30 @@ int mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable)
gpio_set_value((ctrl_pdata->disp_en_gpio), 0);
gpio_free(ctrl_pdata->disp_en_gpio);
}
+
+#ifdef CONFIG_MACH_XIAOMI_LAVENDER
+ if(enable_gesture_mode || synaptics_gesture_enable_flag) {
+ printk(KERN_ERR "[lcd][tp][gesture] keep lcd_reset and tp_reset gpio to high.\n");
+ goto keep_lcd_and_tp_reset;
+ }
+ if (gpio_direction_output(TP_RESET_GPIO, 0)) {
+ pr_err("%s: unable to set dir for touch reset gpio\n", __func__);
+ }
+ gpio_set_value((ctrl_pdata->rst_gpio), 0);
+keep_lcd_and_tp_reset:
+#elif defined(CONFIG_MACH_XIAOMI_TULIP)
+ printk(KERN_ERR "[lcd][tp][gesture] keep lcd_reset and tp_reset gpio to high.\n");
+#elif defined(CONFIG_MACH_XIAOMI_WAYNE)
+ if(enable_gesture_mode)
+ printk("gesture mode keep reset gpio to high.\n");
+#elif defined(CONFIG_MACH_XIAOMI_WHYRED)
+ if(enable_gesture_mode || synaptics_gesture_func_on)
+ printk("gesture mode keep reset gpio to high.\n");
+ else
+ gpio_set_value((ctrl_pdata->rst_gpio), 0);
+#else
gpio_set_value((ctrl_pdata->rst_gpio), 0);
+#endif
gpio_free(ctrl_pdata->rst_gpio);
if (gpio_is_valid(ctrl_pdata->lcd_mode_sel_gpio)) {
gpio_set_value(ctrl_pdata->lcd_mode_sel_gpio, 0);
@@ -1220,6 +1332,12 @@ static int mdss_dsi_panel_off(struct mdss_panel_data *pdata)
goto end;
}
+#ifdef CONFIG_MACH_LONGCHEER
+ if (ESD_TE_status)
+ printk("%s: esd check skip lcd suspend \n", __func__);
+ else
+#endif
+
if (ctrl->off_cmds.cmd_cnt)
mdss_dsi_panel_cmds_send(ctrl, &ctrl->off_cmds, CMD_REQ_COMMIT);
@@ -2024,6 +2142,10 @@ static int mdss_dsi_gen_read_status(struct mdss_dsi_ctrl_pdata *ctrl_pdata)
if (!mdss_dsi_cmp_panel_reg_v2(ctrl_pdata)) {
pr_err("%s: Read back value from panel is incorrect\n",
__func__);
+#ifdef CONFIG_MACH_LONGCHEER
+ if ((strstr(g_lcd_id,"nt36672") != NULL)||(strstr(g_lcd_id,"nt36672a") != NULL)||(strstr(g_lcd_id,"td4320") != NULL))
+ ESD_TE_status = true;
+#endif
return -EINVAL;
} else {
return 1;
@@ -3233,6 +3355,70 @@ error:
return -EINVAL;
}
+#ifdef CONFIG_MACH_LONGCHEER
+static ssize_t msm_fb_lcd_name(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ ssize_t ret = 0;
+ sprintf(buf, "%s\n", g_lcd_id);
+ ret = strlen(buf) + 1;
+ return ret;
+}
+
+static DEVICE_ATTR(lcd_name,0664,msm_fb_lcd_name,NULL);
+static struct kobject *msm_lcd_name;
+static int msm_lcd_name_create_sysfs(void)
+{
+ int ret;
+ msm_lcd_name=kobject_create_and_add("android_lcd",NULL);
+ if (msm_lcd_name == NULL) {
+ pr_info("msm_lcd_name_create_sysfs_ failed\n");
+ ret=-ENOMEM;
+ return ret;
+ }
+ ret=sysfs_create_file(msm_lcd_name,&dev_attr_lcd_name.attr);
+ if(ret){
+ pr_info("%s failed \n",__func__);
+ kobject_del(msm_lcd_name);
+ }
+ return 0;
+}
+
+
+static ssize_t mdss_fb_get_whitepoint(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct mdss_dsi_ctrl_pdata *ctrl = NULL;
+ int val0 =0;
+ int val1 = 0;
+ ssize_t ret = 0;
+
+ mdss_dsi_read_reg(ctrl,0xa1,&val0,&val1);
+ ret = snprintf(buf, PAGE_SIZE, "val0=%d,val1=%d\n",val0,val1);
+
+ return ret;
+}
+
+static DEVICE_ATTR(whitepoint, 0644, mdss_fb_get_whitepoint,NULL );
+static struct kobject *msm_whitepoint;
+static int msm_whitepoint_create_sysfs(void)
+{
+ int ret;
+ msm_whitepoint=kobject_create_and_add("android_whitepoint",NULL);
+ if (msm_whitepoint == NULL) {
+ pr_info("msm_whitepoint_create_sysfs_ failed\n");
+ ret=-ENOMEM;
+ return ret;
+ }
+ ret=sysfs_create_file(msm_whitepoint,&dev_attr_whitepoint.attr);
+ if (ret) {
+ pr_info("%s failed \n",__func__);
+ kobject_del(msm_whitepoint);
+ }
+ return 0;
+}
+#endif
+
int mdss_dsi_panel_init(struct device_node *node,
struct mdss_dsi_ctrl_pdata *ctrl_pdata,
int ndx)
@@ -3261,6 +3447,14 @@ int mdss_dsi_panel_init(struct device_node *node,
pr_info("%s: Panel Name = %s\n", __func__, panel_name);
strlcpy(&pinfo->panel_name[0], panel_name, MDSS_MAX_PANEL_LEN);
}
+#ifdef CONFIG_MACH_LONGCHEER
+ if (strstr(panel_name,"tianma") == NULL)
+ tianma_jdi_flag = 1;
+ else
+ tianma_jdi_flag = 0;
+ /*add for device name node */
+ strcpy(g_lcd_id,panel_name);
+#endif
rc = mdss_panel_parse_dt(node, ctrl_pdata);
if (rc) {
pr_err("%s:%d panel dt parse failed\n", __func__, __LINE__);
@@ -3293,5 +3487,10 @@ int mdss_dsi_panel_init(struct device_node *node,
mdss_dsi_panel_apply_display_setting;
ctrl_pdata->switch_mode = mdss_dsi_panel_switch_mode;
+#ifdef CONFIG_MACH_LONGCHEER
+ ctrl_pdata_whitepoint = ctrl_pdata;
+ msm_lcd_name_create_sysfs();
+ msm_whitepoint_create_sysfs();
+#endif
return 0;
}
diff --git a/drivers/video/fbdev/msm/mdss_dsi_status.c b/drivers/video/fbdev/msm/mdss_dsi_status.c
index 0f24f66dbcc6..0b0b730cacb5 100644
--- a/drivers/video/fbdev/msm/mdss_dsi_status.c
+++ b/drivers/video/fbdev/msm/mdss_dsi_status.c
@@ -30,7 +30,11 @@
#include "mdss_panel.h"
#include "mdss_mdp.h"
+#ifdef CONFIG_MACH_LONGCHEER
+#define STATUS_CHECK_INTERVAL_MS 1000
+#else
#define STATUS_CHECK_INTERVAL_MS 5000
+#endif
#define STATUS_CHECK_INTERVAL_MIN_MS 50
#define DSI_STATUS_CHECK_INIT -1
#define DSI_STATUS_CHECK_DISABLE 1
diff --git a/drivers/video/fbdev/msm/mdss_fb.c b/drivers/video/fbdev/msm/mdss_fb.c
index 4091e1ed4fba..d615ec417c15 100644
--- a/drivers/video/fbdev/msm/mdss_fb.c
+++ b/drivers/video/fbdev/msm/mdss_fb.c
@@ -50,6 +50,8 @@
#include <sw_sync.h>
#ifdef CONFIG_MACH_MI
#include <linux/interrupt.h>
+#endif
+#ifdef CONFIG_MACH_XIAOMI_SDM660
#include <linux/wakelock.h>
#endif
@@ -132,7 +134,7 @@ static int mdss_fb_send_panel_event(struct msm_fb_data_type *mfd,
static void mdss_fb_set_mdp_sync_pt_threshold(struct msm_fb_data_type *mfd,
int type);
-#ifdef CONFIG_MACH_MI
+#ifdef CONFIG_MACH_XIAOMI_SDM660
#define WAIT_RESUME_TIMEOUT 200
static struct fb_info *prim_fbi;
static struct delayed_work prim_panel_work;
@@ -1530,7 +1532,7 @@ static int mdss_fb_remove(struct platform_device *pdev)
if (!mfd)
return -ENODEV;
-#ifdef CONFIG_MACH_MI
+#ifdef CONFIG_MACH_XIAOMI_SDM660
if (mfd->panel_info && mfd->panel_info->is_prim_panel) {
atomic_set(&prim_panel_is_on, false);
cancel_delayed_work_sync(&prim_panel_work);
@@ -1712,7 +1714,7 @@ static int mdss_fb_resume(struct platform_device *pdev)
#endif
#ifdef CONFIG_PM_SLEEP
-#ifdef CONFIG_MACH_MI
+#ifdef CONFIG_MACH_XIAOMI_SDM660
static int mdss_fb_pm_prepare(struct device *dev)
{
struct msm_fb_data_type *mfd = dev_get_drvdata(dev);
@@ -1792,7 +1794,7 @@ static int mdss_fb_pm_resume(struct device *dev)
#endif
static const struct dev_pm_ops mdss_fb_pm_ops = {
-#ifdef CONFIG_MACH_MI
+#ifdef CONFIG_MACH_XIAOMI_SDM660
.prepare = mdss_fb_pm_prepare,
.complete = mdss_fb_pm_complete,
#endif
@@ -2232,7 +2234,7 @@ static int mdss_fb_blank(int blank_mode, struct fb_info *info)
struct mdss_panel_data *pdata;
struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)info->par;
-#ifdef CONFIG_MACH_MI
+#ifdef CONFIG_MACH_XIAOMI_SDM660
if ((info == prim_fbi) && (blank_mode == FB_BLANK_UNBLANK) &&
atomic_read(&prim_panel_is_on)) {
atomic_set(&prim_panel_is_on, false);
@@ -2878,7 +2880,7 @@ static int mdss_fb_register(struct msm_fb_data_type *mfd)
atomic_set(&mfd->commits_pending, 0);
atomic_set(&mfd->ioctl_ref_cnt, 0);
atomic_set(&mfd->kickoff_pending, 0);
-#ifdef CONFIG_MACH_MI
+#ifdef CONFIG_MACH_XIAOMI_SDM660
atomic_set(&mfd->resume_pending, 0);
#endif
@@ -2896,7 +2898,7 @@ static int mdss_fb_register(struct msm_fb_data_type *mfd)
init_waitqueue_head(&mfd->idle_wait_q);
init_waitqueue_head(&mfd->ioctl_q);
init_waitqueue_head(&mfd->kickoff_wait_q);
-#ifdef CONFIG_MACH_MI
+#ifdef CONFIG_MACH_XIAOMI_SDM660
init_waitqueue_head(&mfd->resume_wait_q);
#endif
@@ -2916,7 +2918,7 @@ static int mdss_fb_register(struct msm_fb_data_type *mfd)
mdss_panel_debugfs_init(panel_info, panel_name);
pr_info("FrameBuffer[%d] %dx%d registered successfully!\n", mfd->index,
fbi->var.xres, fbi->var.yres);
-#ifdef CONFIG_MACH_MI
+#ifdef CONFIG_MACH_XIAOMI_SDM660
if (panel_info->is_prim_panel) {
prim_fbi = fbi;
atomic_set(&prim_panel_is_on, false);
@@ -5509,7 +5511,7 @@ void mdss_fb_idle_pc(struct msm_fb_data_type *mfd)
}
}
-#ifdef CONFIG_MACH_MI
+#ifdef CONFIG_MACH_XIAOMI_SDM660
/*
* mdss_prim_panel_fb_unblank() - Unblank primary panel FB
* @timeout : >0 blank primary panel FB after timeout (ms)
diff --git a/drivers/video/fbdev/msm/mdss_fb.h b/drivers/video/fbdev/msm/mdss_fb.h
index f3ac33dfa664..33eadbdcde53 100644
--- a/drivers/video/fbdev/msm/mdss_fb.h
+++ b/drivers/video/fbdev/msm/mdss_fb.h
@@ -340,7 +340,7 @@ struct msm_fb_data_type {
struct task_struct *disp_thread;
atomic_t commits_pending;
atomic_t kickoff_pending;
-#ifdef CONFIG_MACH_MI
+#ifdef CONFIG_MACH_XIAOMI_SDM660
atomic_t resume_pending;
wait_queue_head_t resume_wait_q;
#endif
diff --git a/drivers/video/fbdev/msm/mdss_io_util.c b/drivers/video/fbdev/msm/mdss_io_util.c
index 889145f608e3..58122648d736 100644
--- a/drivers/video/fbdev/msm/mdss_io_util.c
+++ b/drivers/video/fbdev/msm/mdss_io_util.c
@@ -17,6 +17,18 @@
#include <linux/delay.h>
#include <linux/mdss_io_util.h>
+#ifdef CONFIG_MACH_LONGCHEER
+extern bool enable_gesture_mode;
+#endif
+
+#ifdef CONFIG_MACH_XIAOMI_LAVENDER
+extern bool synaptics_gesture_enable_flag;
+#elif defined(CONFIG_MACH_XIAOMI_TULIP)
+extern bool focal_gesture_mode;
+#elif defined(CONFIG_MACH_XIAOMI_WHYRED)
+extern bool synaptics_gesture_func_on;
+#endif
+
#define MAX_I2C_CMDS 16
void dss_reg_w(struct dss_io_data *io, u32 offset, u32 value, u32 debug)
{
@@ -212,12 +224,35 @@ vreg_get_fail:
} /* msm_dss_config_vreg */
EXPORT_SYMBOL(msm_dss_config_vreg);
+#ifdef CONFIG_MACH_LONGCHEER
+extern bool ESD_TE_status;
+#endif
+
int msm_dss_enable_vreg(struct dss_vreg *in_vreg, int num_vreg, int enable)
{
int i = 0, rc = 0;
bool need_sleep;
if (enable) {
for (i = 0; i < num_vreg; i++) {
+#ifdef CONFIG_MACH_LONGCHEER
+ /* vddio lab ibb continus supply */
+#ifdef CONFIG_MACH_XIAOMI_LAVENDER
+ if(enable_gesture_mode || synaptics_gesture_enable_flag) {
+#elif defined(CONFIG_MACH_XIAOMI_TULIP)
+ if(enable_gesture_mode || focal_gesture_mode) {
+#elif defined(CONFIG_MACH_XIAOMI_WAYNE)
+ if(enable_gesture_mode) {
+#elif defined(CONFIG_MACH_XIAOMI_WHYRED)
+ if(enable_gesture_mode || synaptics_gesture_func_on) {
+#endif
+ if( (strcmp(in_vreg[i].vreg_name,"lab")==0) ||
+ (strcmp(in_vreg[i].vreg_name,"ibb")==0) ||
+ (strcmp(in_vreg[i].vreg_name,"wqhd-vddio")==0) ) {
+ printk(KERN_ERR "[LCD][TP][Gesture][resume] '%s' power continus supply\n",in_vreg[i].vreg_name);
+ continue;
+ }
+ }
+#endif
rc = PTR_RET(in_vreg[i].vreg);
if (rc) {
DEV_ERR("%pS->%s: %s regulator error. rc=%d\n",
@@ -250,6 +285,32 @@ int msm_dss_enable_vreg(struct dss_vreg *in_vreg, int num_vreg, int enable)
}
} else {
for (i = num_vreg-1; i >= 0; i--) {
+#ifdef CONFIG_MACH_LONGCHEER
+ if(ESD_TE_status){
+ printk(KERN_ERR "panel esd check recovery \n");
+ if((strcmp(in_vreg[i].vreg_name,"wqhd-vddio")==0) ) {
+ printk(KERN_ERR "panel '%s' power continus supply\n",in_vreg[i].vreg_name);
+ continue;
+ }
+ }
+ /* vddio lab ibb continus supply */
+#ifdef CONFIG_MACH_XIAOMI_LAVENDER
+ if (enable_gesture_mode || synaptics_gesture_enable_flag) {
+#elif defined(CONFIG_MACH_XIAOMI_TULIP)
+ if (enable_gesture_mode || focal_gesture_mode) {
+#elif defined(CONFIG_MACH_XIAOMI_WAYNE)
+ if(enable_gesture_mode) {
+#elif defined(CONFIG_MACH_XIAOMI_WHYRED)
+ if (enable_gesture_mode || synaptics_gesture_func_on) {
+#endif
+ if( (strcmp(in_vreg[i].vreg_name,"lab")==0) ||
+ (strcmp(in_vreg[i].vreg_name,"ibb")==0) ||
+ (strcmp(in_vreg[i].vreg_name,"wqhd-vddio")==0) ) {
+ printk(KERN_ERR "[LCD][TP][Gesture][suspend] '%s' power continus supply\n",in_vreg[i].vreg_name);
+ continue;
+ }
+ }
+#endif
if (in_vreg[i].pre_off_sleep)
usleep_range(in_vreg[i].pre_off_sleep * 1000,
in_vreg[i].pre_off_sleep * 1000);