From 6a9ad61a324330f2c3db7a89fda429161b7d887e Mon Sep 17 00:00:00 2001
From: ronnie <ronnie@industiosoft.com>
Date: Sun, 23 Oct 2022 10:04:50 +0000
Subject: [PATCH] add gt911 drivers

---
 longan/kernel/linux-4.9/drivers/input/touchscreen/gt9xx/gt9xx.c | 1842 +++++++++++++++++++++++++++++-----------------------------
 1 files changed, 927 insertions(+), 915 deletions(-)

diff --git a/longan/kernel/linux-4.9/drivers/input/touchscreen/gt9xx/gt9xx.c b/longan/kernel/linux-4.9/drivers/input/touchscreen/gt9xx/gt9xx.c
index 9406e47..f555183 100755
--- a/longan/kernel/linux-4.9/drivers/input/touchscreen/gt9xx/gt9xx.c
+++ b/longan/kernel/linux-4.9/drivers/input/touchscreen/gt9xx/gt9xx.c
@@ -28,18 +28,18 @@
 #include <linux/pm.h>
 
 #if GTP_ICS_SLOT_REPORT
-    #include <linux/input/mt.h>
+#include <linux/input/mt.h>
 #endif
 
 static const char *goodix_ts_name = "gt9xx";
 static struct workqueue_struct *goodix_wq;
 struct i2c_client * i2c_connect_client = NULL; 
 static u8 config[GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH]
-                = {GTP_REG_CONFIG_DATA >> 8, GTP_REG_CONFIG_DATA & 0xff};
+= {GTP_REG_CONFIG_DATA >> 8, GTP_REG_CONFIG_DATA & 0xff};
 
 #if GTP_HAVE_TOUCH_KEY
-	static const u16 touch_key_array[] = GTP_KEY_TAB;
-	#define GTP_MAX_KEY_NUM	 (sizeof(touch_key_array)/sizeof(touch_key_array[0]))
+static const u16 touch_key_array[] = GTP_KEY_TAB;
+#define GTP_MAX_KEY_NUM	 (sizeof(touch_key_array)/sizeof(touch_key_array[0]))
 #endif
 
 static s8 gtp_i2c_test(struct i2c_client *client);
@@ -50,7 +50,7 @@
 static void goodix_ts_early_suspend(struct early_suspend *h);
 static void goodix_ts_late_resume(struct early_suspend *h);
 #endif
- 
+
 #if GTP_CREATE_WR_NODE
 
 extern s32 init_wr_node(struct i2c_client*);
@@ -79,11 +79,11 @@
 #define PRESS_MAX		(255)
 
 
-static int screen_max_x = 0;
-static int screen_max_y = 0;
-static int revert_x_flag = 0;
+static int screen_max_x = 1280;
+static int screen_max_y = 800;
+static int revert_x_flag = 1;
 static int revert_y_flag = 0;
-static int exchange_x_y_flag = 0;
+static int exchange_x_y_flag = 1;
 static __u32 twi_id = 0;
 static char irq_pin_name[8];
 
@@ -100,7 +100,7 @@
 };
 
 #define dprintk(level_mask,fmt,arg...)    if(unlikely(debug_mask & level_mask)) \
-        printk("***CTP***"fmt, ## arg)
+	printk("***CTP***"fmt, ## arg)
 module_param_named(debug_mask,debug_mask,int,S_IRUGO | S_IWUSR | S_IWGRP);
 
 static const unsigned short normal_i2c[3] = {0x14, 0x5d, I2C_CLIENT_END};
@@ -129,27 +129,27 @@
 static int ctp_detect(struct i2c_client *client, struct i2c_board_info *info)
 {
 	struct i2c_adapter *adapter = client->adapter;
-    int  ret = -1;
-      
-    if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)){
-        	printk("======return=====\n");
-                return -ENODEV;
-    }
-        
-    if(twi_id == adapter->nr){
-            dprintk(DEBUG_INIT,"%s: addr = %x\n", __func__, client->addr);
-            ret = gtp_i2c_test(client);
-			printk("detect ret %d\n",ret);
-            if(!ret){
-        		printk("%s:I2C connection might be something wrong \n", __func__);
-        		return -ENODEV;
-        	}else{           	    
-            	strlcpy(info->type, CTP_NAME, I2C_NAME_SIZE);
-				printk("======detect ok !=====\n");
-				return 0;	
-	        }
+	int  ret = -1;
+
+	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)){
+		printk("======return=====\n");
+		return -ENODEV;
+	}
+
+	if(twi_id == adapter->nr){
+		dprintk(DEBUG_INIT,"%s: addr = %x\n", __func__, client->addr);
+		ret = gtp_i2c_test(client);
+		printk("detect ret %d\n",ret);
+		if(!ret){
+			printk("%s:I2C connection might be something wrong \n", __func__);
+			return -ENODEV;
+		}else{           	    
+			strlcpy(info->type, CTP_NAME, I2C_NAME_SIZE);
+			printk("======detect ok !=====\n");
+			return 0;	
+		}
 	}else{
-	        return -ENODEV;
+		return -ENODEV;
 	}
 }
 
@@ -208,450 +208,454 @@
 
 void gtp_set_int_value(int status)
 {
-        long unsigned int	config;
-		
-		config = SUNXI_PINCFG_PACK(SUNXI_PINCFG_TYPE_FUNC,0xFFFF);
-	    pin_config_get(SUNXI_PINCTRL,irq_pin_name,&config);
+	long unsigned int	config;
 
-		if (1 != SUNXI_PINCFG_UNPACK_VALUE(config)){
-		      config = SUNXI_PINCFG_PACK(SUNXI_PINCFG_TYPE_FUNC,1);
-			  pin_config_set(SUNXI_PINCTRL,irq_pin_name,config);;
-	    }
+	config = SUNXI_PINCFG_PACK(SUNXI_PINCFG_TYPE_FUNC,0xFFFF);
+	pin_config_get(SUNXI_PINCTRL,irq_pin_name,&config);
 
-        __gpio_set_value(CTP_IRQ_NUMBER, status);   
+	if (1 != SUNXI_PINCFG_UNPACK_VALUE(config)){
+		config = SUNXI_PINCFG_PACK(SUNXI_PINCFG_TYPE_FUNC,1);
+		pin_config_set(SUNXI_PINCTRL,irq_pin_name,config);;
+	}
+
+	__gpio_set_value(CTP_IRQ_NUMBER, status);   
 }
 
 void gtp_set_io_int(void)
 {
-        long unsigned int	config;
-		config = SUNXI_PINCFG_PACK(SUNXI_PINCFG_TYPE_FUNC,0xFFFF);
-	    pin_config_get(SUNXI_PINCTRL,irq_pin_name,&config);
+	long unsigned int	config;
+	config = SUNXI_PINCFG_PACK(SUNXI_PINCFG_TYPE_FUNC,0xFFFF);
+	pin_config_get(SUNXI_PINCTRL,irq_pin_name,&config);
 
-		if (6 != SUNXI_PINCFG_UNPACK_VALUE(config)) {
-		      config = SUNXI_PINCFG_PACK(SUNXI_PINCFG_TYPE_FUNC, 6);
-			  pin_config_set(SUNXI_PINCTRL, irq_pin_name, config);
-	    }
-        
+	if (6 != SUNXI_PINCFG_UNPACK_VALUE(config)) {
+		config = SUNXI_PINCFG_PACK(SUNXI_PINCFG_TYPE_FUNC, 6);
+		pin_config_set(SUNXI_PINCTRL, irq_pin_name, config);
+	}
+
 }
 
 void gtp_io_init(int ms)
 {       
-        ctp_wakeup(0, 0);
-        msleep(ms);
-        
-        gtp_set_int_value(0);
-        msleep(2);
-        
-        ctp_wakeup(1, 0);
-        msleep(6);
+	ctp_wakeup(0, 0);
+	msleep(ms);
 
-        
+	gtp_set_int_value(0);
+	msleep(2);
+
+	ctp_wakeup(1, 0);
+	msleep(6);
+
+
 #if GTP_ESD_PROTECT
-     //   gtp_init_ext_watchdog(client);
+	//   gtp_init_ext_watchdog(client);
 #endif
-        
+
 }
 
 /*******************************************************	
 Function:
-	Read data from the i2c slave device.
+Read data from the i2c slave device.
 
 Input:
-	client:	i2c device.
-	buf[0]:operate address.
-	buf[1]~buf[len]:read data buffer.
-	len:operate length.
-	
+client:	i2c device.
+buf[0]:operate address.
+buf[1]~buf[len]:read data buffer.
+len:operate length.
+
 Output:
-	numbers of i2c_msgs to transfer
-*********************************************************/
+numbers of i2c_msgs to transfer
+ *********************************************************/
 s32 gtp_i2c_read(struct i2c_client *client, u8 *buf, s32 len)
 {
-        struct i2c_msg msgs[2];
-        s32 ret = -1;
-        s32 retries = 0;
-               
-        msgs[0].flags = !I2C_M_RD;
-        msgs[0].addr  = client->addr;
-        msgs[0].len   = GTP_ADDR_LENGTH;
-        msgs[0].buf   = &buf[0];
-        
-        msgs[1].flags = I2C_M_RD;
-        msgs[1].addr  = client->addr;
-        msgs[1].len   = len - GTP_ADDR_LENGTH;
-        msgs[1].buf   = &buf[GTP_ADDR_LENGTH];
+	struct i2c_msg msgs[2];
+	s32 ret = -1;
+	s32 retries = 0;
 
-        while(retries < 2) {
-                ret = i2c_transfer(client->adapter, msgs, 2);
-                if(ret == 2) 
-                        break;
-                retries++;
-        }
+	msgs[0].flags = !I2C_M_RD;
+	msgs[0].addr  = client->addr;
+	msgs[0].len   = GTP_ADDR_LENGTH;
+	msgs[0].buf   = &buf[0];
 
-        if(retries >= 2) {
-                printk("%s:I2C retry timeout, reset chip.", __func__);
-        }
-        return ret;
+	msgs[1].flags = I2C_M_RD;
+	msgs[1].addr  = client->addr;
+	msgs[1].len   = len - GTP_ADDR_LENGTH;
+	msgs[1].buf   = &buf[GTP_ADDR_LENGTH];
+
+	while(retries < 2) {
+		ret = i2c_transfer(client->adapter, msgs, 2);
+		if(ret == 2) 
+			break;
+		retries++;
+	}
+
+	if(retries >= 2) {
+		printk("%s:I2C retry timeout, reset chip.", __func__);
+	}
+	return ret;
 }
 
 /*******************************************************	
 Function:
-	write data to the i2c slave device.
+write data to the i2c slave device.
 
 Input:
-	client:	i2c device.
-	buf[0]:operate address.
-	buf[1]~buf[len]:write data buffer.
-	len:operate length.
-	
+client:	i2c device.
+buf[0]:operate address.
+buf[1]~buf[len]:write data buffer.
+len:operate length.
+
 Output:
-	numbers of i2c_msgs to transfer.
-*********************************************************/
+numbers of i2c_msgs to transfer.
+ *********************************************************/
 s32 gtp_i2c_write(struct i2c_client *client,u8 *buf,s32 len)
 {
-        struct i2c_msg msg;
-        s32 ret = -1;
-        s32 retries = 0;
-        
-        msg.flags = !I2C_M_RD;
-        msg.addr  = client->addr;
-        msg.len   = len;
-        msg.buf   = buf;
-        
-        while(retries < 2) {
-                ret = i2c_transfer(client->adapter, &msg, 1);
-                if (ret == 1) 
-                        break;
-                retries++;
-        }
+	struct i2c_msg msg;
+	s32 ret = -1;
+	s32 retries = 0;
 
-        if(retries >= 2) {
-                printk("%s:I2C retry timeout, reset chip.", __func__);
-        }
-        return ret;
+	msg.flags = !I2C_M_RD;
+	msg.addr  = client->addr;
+	msg.len   = len;
+	msg.buf   = buf;
+
+	while(retries < 2) {
+		ret = i2c_transfer(client->adapter, &msg, 1);
+		if (ret == 1) 
+			break;
+		retries++;
+	}
+
+	if(retries >= 2) {
+		printk("%s:I2C retry timeout, reset chip.", __func__);
+	}
+	return ret;
 }
 
 /*******************************************************
 Function:
-	Send config Function.
+Send config Function.
 
 Input:
-	client:	i2c client.
+client:	i2c client.
 
 Output:
-	Executive outcomes.0--success,non-0--fail.
-*******************************************************/
+Executive outcomes.0--success,non-0--fail.
+ *******************************************************/
 s32 gtp_send_cfg(struct i2c_client *client)
 {
-    s32 ret = 0;
-    
-#if GTP_DRIVER_SEND_CFG
-    s32 retry = 0;
+	s32 ret = 0;
 
-    for (retry = 0; retry < 5; retry++)
-    {
-        //ret = gtp_i2c_write(client, config , GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH);
-        // if (ret > 0)
-        // {
-            // break;
-        // }
-    }
+#if GTP_DRIVER_SEND_CFG
+	s32 retry = 0;
+
+	for (retry = 0; retry < 5; retry++)
+	{
+		//ret = gtp_i2c_write(client, config , GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH);
+		// if (ret > 0)
+		// {
+		// break;
+		// }
+	}
 #endif
 
-    return ret;
+	return ret;
 }
 
 /*******************************************************
 Function:
-	Disable IRQ Function.
+Disable IRQ Function.
 
 Input:
-	ts:	i2c client private struct.
-	
+ts:	i2c client private struct.
+
 Output:
-	None.
-*******************************************************/
+None.
+ *******************************************************/
 void gtp_irq_disable(struct goodix_ts_data *ts)
 {
-        unsigned long irqflags;
-		int ret;
+	unsigned long irqflags;
+	int ret;
 
-        dprintk(DEBUG_INT_INFO, "%s ---start!---\n", __func__);
-        spin_lock_irqsave(&ts->irq_lock, irqflags);
-        if (!ts->irq_is_disable) {
-               ts->irq_is_disable = 1; 
-               ret = input_set_int_enable(&(config_info.input_type), 0);
-			   if (ret < 0)		          
-			   	  dprintk(DEBUG_OTHERS_INFO,"%s irq disable failed\n", goodix_ts_name);
-        }
-        spin_unlock_irqrestore(&ts->irq_lock, irqflags);
+	dprintk(DEBUG_INT_INFO, "%s ---start!---\n", __func__);
+	spin_lock_irqsave(&ts->irq_lock, irqflags);
+	if (!ts->irq_is_disable) {
+		ts->irq_is_disable = 1; 
+		ret = input_set_int_enable(&(config_info.input_type), 0);
+		if (ret < 0)		          
+			dprintk(DEBUG_OTHERS_INFO,"%s irq disable failed\n", goodix_ts_name);
+	}
+	spin_unlock_irqrestore(&ts->irq_lock, irqflags);
 }
 
 /*******************************************************
 Function:
-	Disable IRQ Function.
+Disable IRQ Function.
 
 Input:
-	ts:	i2c client private struct.
-	
+ts:	i2c client private struct.
+
 Output:
-	None.
-*******************************************************/
+None.
+ *******************************************************/
 void gtp_irq_enable(struct goodix_ts_data *ts)
 {
-        unsigned long irqflags = 0;
-		int ret;
+	unsigned long irqflags = 0;
+	int ret;
 
-        dprintk(DEBUG_INT_INFO, "%s ---start!---\n", __func__);
-    
-        spin_lock_irqsave(&ts->irq_lock, irqflags);
-        if (ts->irq_is_disable) {
-                ts->irq_is_disable = 0; 
-                ret = input_set_int_enable(&(config_info.input_type), 1);	
-				if (ret < 0)		            
-					dprintk(DEBUG_OTHERS_INFO,"%s irq enable failed\n", goodix_ts_name);
-        }
-        spin_unlock_irqrestore(&ts->irq_lock, irqflags);
+	dprintk(DEBUG_INT_INFO, "%s ---start!---\n", __func__);
+
+	spin_lock_irqsave(&ts->irq_lock, irqflags);
+	if (ts->irq_is_disable) {
+		ts->irq_is_disable = 0; 
+		ret = input_set_int_enable(&(config_info.input_type), 1);	
+		if (ret < 0)		            
+			dprintk(DEBUG_OTHERS_INFO,"%s irq enable failed\n", goodix_ts_name);
+	}
+	spin_unlock_irqrestore(&ts->irq_lock, irqflags);
 }
 
 /*******************************************************
 Function:
-	Touch down report function.
+Touch down report function.
 
 Input:
-	ts:private data.
-	id:tracking id.
-	x:input x.
-	y:input y.
-	w:input weight.
-	
+ts:private data.
+id:tracking id.
+x:input x.
+y:input y.
+w:input weight.
+
 Output:
-	None.
-*******************************************************/
+None.
+ *******************************************************/
 static void gtp_touch_down(struct goodix_ts_data* ts,s32 id,s32 x,s32 y,s32 w)
 {
-        dprintk(DEBUG_X_Y_INFO, "source data:ID:%d, X:%d, Y:%d, W:%d\n", id, x, y, w);
-        
-        if(1 == exchange_x_y_flag){
-                swap(x, y);
-        }
-        
-        if(1 == revert_x_flag){
-                x = SCREEN_MAX_X - x;
-        }
-        
-        if(1 == revert_y_flag){
-                y = SCREEN_MAX_Y - y;
-        }
-        
-        dprintk(DEBUG_X_Y_INFO,"report data:ID:%d, X:%d, Y:%d, W:%d\n", id, x, y, w);
+	dprintk(DEBUG_X_Y_INFO, "source data:ID:%d, X:%d, Y:%d, W:%d\n", id, x, y, w);
+
+	//printk(KERN_ERR"revert_x_flag=%d, revert_y_flag=%d, GTP_ICS_SLOT_REPORT=%d  V2 SCREEN_MAX_X:SCREEN_MAX_Y=%d:%d\n", revert_x_flag, revert_y_flag, GTP_ICS_SLOT_REPORT, SCREEN_MAX_X, SCREEN_MAX_Y);        
+	printk(KERN_ERR"(%d,%d)--->", x, y);
+
+	if(1 == exchange_x_y_flag){
+		swap(x, y);
+	}
+
+	if(1 == revert_x_flag){
+		x = SCREEN_MAX_X - x;
+	}
+
+	if(1 == revert_y_flag){
+		y = SCREEN_MAX_Y - y;
+	}
+	printk(KERN_ERR"(%d,%d)\n", x, y);
+
+	dprintk(DEBUG_X_Y_INFO,"report data:ID:%d, X:%d, Y:%d, W:%d\n", id, x, y, w);
 
 #if GTP_ICS_SLOT_REPORT
-        input_mt_slot(ts->input_dev, id);
-        input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, id);
-        input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x);
-        input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y);
-        input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, w);
-        input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, w);
+	input_mt_slot(ts->input_dev, id);
+	input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, id);
+	input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x);
+	input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y);
+	input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, w);
+	input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, w);
 #else
 	input_report_key(ts->input_dev, BTN_TOUCH, 1);
 	input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, id);
 	input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x);
-        input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y);
-        input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, w);
-        input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, w);
-        input_mt_sync(ts->input_dev);
+	input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y);
+	input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, w);
+	input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, w);
+	input_mt_sync(ts->input_dev);
 #endif
 
 }
 
 /*******************************************************
 Function:
-	Touch up report function.
+Touch up report function.
 
 Input:
-	ts:private data.
-	
+ts:private data.
+
 Output:
-	None.
-*******************************************************/
+None.
+ *******************************************************/
 static void gtp_touch_up(struct goodix_ts_data* ts, s32 id)
 {
 #if GTP_ICS_SLOT_REPORT
-        input_mt_slot(ts->input_dev, id);
-        input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, -1);
-        dprintk(DEBUG_X_Y_INFO, "Touch id[%2d] release!", id);
+	input_mt_slot(ts->input_dev, id);
+	input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, -1);
+	dprintk(DEBUG_X_Y_INFO, "Touch id[%2d] release!", id);
 #else
 	input_report_key(ts->input_dev, BTN_TOUCH, 0);
-        input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0);
-        input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0);
-        input_mt_sync(ts->input_dev);
+	input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0);
+	input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0);
+	input_mt_sync(ts->input_dev);
 #endif
 }
 
 /*******************************************************
 Function:
-	Goodix touchscreen work function.
+Goodix touchscreen work function.
 
 Input:
-	work:	work_struct of goodix_wq.
-	
+work:	work_struct of goodix_wq.
+
 Output:
-	None.
-*******************************************************/
+None.
+ *******************************************************/
 static void goodix_ts_work_func(struct work_struct *work)
 {
-        u8  end_cmd[3] = {GTP_READ_COOR_ADDR >> 8, GTP_READ_COOR_ADDR & 0xFF, 0};
-        u8  point_data[2 + 1 + 8 * GTP_MAX_TOUCH + 1]={GTP_READ_COOR_ADDR >> 8, GTP_READ_COOR_ADDR & 0xFF};
-        u8  touch_num = 0;
-        u8  finger = 0;
-        static u16 pre_touch = 0;
-        static u8 pre_key = 0;
-        u8  key_value = 0;
-        u8* coor_data = NULL;
-        s32 input_x = 0;
-        s32 input_y = 0;
-        s32 input_w = 0;
-        s32 id = 0;
-        s32 i  = 0;
-		int j = 0;
-        s32 ret = -1;
-        struct goodix_ts_data *ts = NULL;
+	u8  end_cmd[3] = {GTP_READ_COOR_ADDR >> 8, GTP_READ_COOR_ADDR & 0xFF, 0};
+	u8  point_data[2 + 1 + 8 * GTP_MAX_TOUCH + 1]={GTP_READ_COOR_ADDR >> 8, GTP_READ_COOR_ADDR & 0xFF};
+	u8  touch_num = 0;
+	u8  finger = 0;
+	static u16 pre_touch = 0;
+	static u8 pre_key = 0;
+	u8  key_value = 0;
+	u8* coor_data = NULL;
+	s32 input_x = 0;
+	s32 input_y = 0;
+	s32 input_w = 0;
+	s32 id = 0;
+	s32 i  = 0;
+	int j = 0;
+	s32 ret = -1;
+	struct goodix_ts_data *ts = NULL;
 
-        dprintk(DEBUG_X_Y_INFO,"===enter %s===\n",__func__);
+	dprintk(DEBUG_X_Y_INFO,"===enter %s===\n",__func__);
 
-        ts = container_of(work, struct goodix_ts_data, work);
-        if (ts->enter_update){
-                return;
-        }
+	ts = container_of(work, struct goodix_ts_data, work);
+	if (ts->enter_update){
+		return;
+	}
 
-		for(j=0; j<2;j++)
-		{
-        ret = gtp_i2c_read(ts->client, point_data, 12);
-        if (ret < 0){
-                printk("I2C transfer error. errno:%d\n ", ret);
-                goto exit_work_func;
-        }
+	for(j=0; j<2;j++)
+	{
+		ret = gtp_i2c_read(ts->client, point_data, 12);
+		if (ret < 0){
+			printk("I2C transfer error. errno:%d\n ", ret);
+			goto exit_work_func;
 		}
+	}
 
-        finger = point_data[GTP_ADDR_LENGTH];    
-        if((finger & 0x80) == 0) {
-                goto exit_work_func;
-        }
+	finger = point_data[GTP_ADDR_LENGTH];    
+	if((finger & 0x80) == 0) {
+		goto exit_work_func;
+	}
 
-        touch_num = finger & 0x0f;
-        if (touch_num > GTP_MAX_TOUCH) {
-                goto exit_work_func;
-        }
+	touch_num = finger & 0x0f;
+	if (touch_num > GTP_MAX_TOUCH) {
+		goto exit_work_func;
+	}
 
-        if (touch_num > 1) {
-                u8 buf[8 * GTP_MAX_TOUCH] = {(GTP_READ_COOR_ADDR + 10) >> 8, (GTP_READ_COOR_ADDR + 10) & 0xff};
+	if (touch_num > 1) {
+		u8 buf[8 * GTP_MAX_TOUCH] = {(GTP_READ_COOR_ADDR + 10) >> 8, (GTP_READ_COOR_ADDR + 10) & 0xff};
 
-                ret = gtp_i2c_read(ts->client, buf, 2 + 8 * (touch_num - 1)); 
-                memcpy(&point_data[12], &buf[2], 8 * (touch_num - 1));
-        }
+		ret = gtp_i2c_read(ts->client, buf, 2 + 8 * (touch_num - 1)); 
+		memcpy(&point_data[12], &buf[2], 8 * (touch_num - 1));
+	}
 
 #if GTP_HAVE_TOUCH_KEY
-        key_value = point_data[3 + 8 * touch_num];
-    
-        if(key_value || pre_key) {
-                for (i = 0; i < GTP_MAX_KEY_NUM; i++) {
-                        input_report_key(ts->input_dev, touch_key_array[i], key_value & (0x01<<i));   
-                }
-                touch_num = 0;
-                pre_touch = 0;
-        }
-#endif
-        pre_key = key_value;
+	key_value = point_data[3 + 8 * touch_num];
 
-        dprintk(DEBUG_X_Y_INFO, "pre_touch:%02x, finger:%02x.", pre_touch, finger);
+	if(key_value || pre_key) {
+		for (i = 0; i < GTP_MAX_KEY_NUM; i++) {
+			input_report_key(ts->input_dev, touch_key_array[i], key_value & (0x01<<i));   
+		}
+		touch_num = 0;
+		pre_touch = 0;
+	}
+#endif
+	pre_key = key_value;
+
+	dprintk(DEBUG_X_Y_INFO, "pre_touch:%02x, finger:%02x.", pre_touch, finger);
 
 #if GTP_ICS_SLOT_REPORT
-        if (pre_touch || touch_num) {
-                s32 pos = 0;
-                u16 touch_index = 0;
-                coor_data = &point_data[3];
-                
-                if(touch_num) {
-                        id = coor_data[pos] & 0x0F;
-                        touch_index |= (0x01<<id);
-                }
+	if (pre_touch || touch_num) {
+		s32 pos = 0;
+		u16 touch_index = 0;
+		coor_data = &point_data[3];
 
-                dprintk(DEBUG_X_Y_INFO, 
-                       "id=%d, touch_index=0x%x, pre_touch=0x%x\n", id, touch_index, pre_touch);
-                
-                for (i = 0; i < GTP_MAX_TOUCH; i++) {
-                        if (touch_index & (0x01<<i)) {
-                                input_x  = coor_data[pos + 1] | coor_data[pos + 2] << 8;
-                                input_y  = coor_data[pos + 3] | coor_data[pos + 4] << 8;
-                                input_w  = coor_data[pos + 5] | coor_data[pos + 6] << 8;
+		if(touch_num) {
+			id = coor_data[pos] & 0x0F;
+			touch_index |= (0x01<<id);
+		}
 
-                                gtp_touch_down(ts, id, input_x, input_y, input_w);
-                                pre_touch |= 0x01 << i;
+		dprintk(DEBUG_X_Y_INFO, 
+				"id=%d, touch_index=0x%x, pre_touch=0x%x\n", id, touch_index, pre_touch);
 
-                                pos += 8;
-                                id = coor_data[pos] & 0x0F;
-                                touch_index |= (0x01<<id);
-                        }else {// if (pre_touch & (0x01 << i))
-            
-                                gtp_touch_up(ts, i);
-                                pre_touch &= ~(0x01 << i);
-                        }
-                }
-        }
+		for (i = 0; i < GTP_MAX_TOUCH; i++) {
+			if (touch_index & (0x01<<i)) {
+				input_x  = coor_data[pos + 1] | coor_data[pos + 2] << 8;
+				input_y  = coor_data[pos + 3] | coor_data[pos + 4] << 8;
+				input_w  = coor_data[pos + 5] | coor_data[pos + 6] << 8;
+
+				gtp_touch_down(ts, id, input_x, input_y, input_w);
+				pre_touch |= 0x01 << i;
+
+				pos += 8;
+				id = coor_data[pos] & 0x0F;
+				touch_index |= (0x01<<id);
+			}else {// if (pre_touch & (0x01 << i))
+
+				gtp_touch_up(ts, i);
+				pre_touch &= ~(0x01 << i);
+			}
+		}
+	}
 
 #else
-        if (touch_num ) {
-                for (i = 0; i < touch_num; i++) {
-                        coor_data = &point_data[i * 8 + 3];
+	if (touch_num ) {
+		for (i = 0; i < touch_num; i++) {
+			coor_data = &point_data[i * 8 + 3];
 
-                        id = coor_data[0] & 0x0F;
-                        input_x  = coor_data[1] | coor_data[2] << 8;
-                        input_y  = coor_data[3] | coor_data[4] << 8;
-                        input_w  = coor_data[5] | coor_data[6] << 8;
+			id = coor_data[0] & 0x0F;
+			input_x  = coor_data[1] | coor_data[2] << 8;
+			input_y  = coor_data[3] | coor_data[4] << 8;
+			input_w  = coor_data[5] | coor_data[6] << 8;
 
-                        gtp_touch_down(ts, id, input_x, input_y, input_w);
-                }
-        }else if(pre_touch){
-                dprintk(DEBUG_X_Y_INFO, "Touch Release!");
-                gtp_touch_up(ts, 0);
-        }
-        
-        pre_touch = touch_num;
+			gtp_touch_down(ts, id, input_x, input_y, input_w);
+		}
+	}else if(pre_touch){
+		dprintk(DEBUG_X_Y_INFO, "Touch Release!");
+		gtp_touch_up(ts, 0);
+	}
+
+	pre_touch = touch_num;
 
 #endif
 
-        input_sync(ts->input_dev);
+	input_sync(ts->input_dev);
 
 exit_work_func:
-        if(!ts->gtp_rawdiff_mode) {
-                ret = gtp_i2c_write(ts->client, end_cmd, 3);
-                if (ret < 0) {
-                        printk("I2C write end_cmd  error!"); 
-                }
-        }
-        return ;
+	if(!ts->gtp_rawdiff_mode) {
+		ret = gtp_i2c_write(ts->client, end_cmd, 3);
+		if (ret < 0) {
+			printk("I2C write end_cmd  error!"); 
+		}
+	}
+	return ;
 }
 
 /*******************************************************
 Function:
-	External interrupt service routine.
+External interrupt service routine.
 
 Input:
-	irq:	interrupt number.
-	dev_id: private data pointer.
-	
+irq:	interrupt number.
+dev_id: private data pointer.
+
 Output:
-	irq execute status.
-*******************************************************/
+irq execute status.
+ *******************************************************/
 
 irqreturn_t goodix_ts_irq_handler(int irq, void *dev_id)
 {	    
-     struct goodix_ts_data *ts = (struct goodix_ts_data *)dev_id;
-	 dprintk(DEBUG_INT_INFO, "==========------TS Interrupt-----============\n");  
+	struct goodix_ts_data *ts = (struct goodix_ts_data *)dev_id;
+	dprintk(DEBUG_INT_INFO, "==========------TS Interrupt-----============\n");  
 
-	 queue_work(goodix_wq, &ts->work);
-	 return 0;
+	queue_work(goodix_wq, &ts->work);
+	return 0;
 }
 
 
@@ -659,509 +663,509 @@
 
 /*******************************************************
 Function:
-	Eter sleep function.
+Eter sleep function.
 
 Input:
-	ts:private data.
-	
+ts:private data.
+
 Output:
-	Executive outcomes.0--success,non-0--fail.
-*******************************************************/
+Executive outcomes.0--success,non-0--fail.
+ *******************************************************/
 #if defined(CONFIG_HAS_EARLYSUSPEND) | defined(CONFIG_PM)
 static s8 gtp_enter_sleep(struct goodix_ts_data * ts)
 {
-        s8 ret = -1;
-        s8 retry = 0;
-        u8 i2c_control_buf[3] = {(u8)(GTP_REG_SLEEP >> 8), (u8)GTP_REG_SLEEP, 5};
-        
-        dprintk(DEBUG_SUSPEND, "%s start!\n", __func__);
-        
-        gtp_set_int_value(0);
+	s8 ret = -1;
+	s8 retry = 0;
+	u8 i2c_control_buf[3] = {(u8)(GTP_REG_SLEEP >> 8), (u8)GTP_REG_SLEEP, 5};
 
-        while(retry++ < 2) {
-                ret = gtp_i2c_write(ts->client, i2c_control_buf, 3);
-                if (ret > 0) {
-                        dprintk(DEBUG_SUSPEND, "GTP enter sleep!");
-                        return ret;
-                }
-                msleep(10);
-        }
-        dprintk(DEBUG_SUSPEND, "GTP send sleep cmd failed.");
-        
-        return ret;
+	dprintk(DEBUG_SUSPEND, "%s start!\n", __func__);
+
+	gtp_set_int_value(0);
+
+	while(retry++ < 2) {
+		ret = gtp_i2c_write(ts->client, i2c_control_buf, 3);
+		if (ret > 0) {
+			dprintk(DEBUG_SUSPEND, "GTP enter sleep!");
+			return ret;
+		}
+		msleep(10);
+	}
+	dprintk(DEBUG_SUSPEND, "GTP send sleep cmd failed.");
+
+	return ret;
 }
 #endif
 
 /*******************************************************
 Function:
-	Wakeup from sleep mode Function.
+Wakeup from sleep mode Function.
 
 Input:
-	ts:	private data.
-	
+ts:	private data.
+
 Output:
-	Executive outcomes.0--success,non-0--fail.
-*******************************************************/
+Executive outcomes.0--success,non-0--fail.
+ *******************************************************/
 static s8 gtp_wakeup_sleep(struct goodix_ts_data * ts)
 {
-        u8 retry = 0;
-        s8 ret = -1;
-        
-        gtp_io_init(20);
-        gtp_set_io_int();
-       
+	u8 retry = 0;
+	s8 ret = -1;
+
+	gtp_io_init(20);
+	gtp_set_io_int();
+
 #if GTP_POWER_CTRL_SLEEP
-    while(retry++ < 5)
-    {
-        ret = gtp_send_cfg(ts->client);
-        if (ret > 0)
-        {
-            dprintk(DEBUG_SUSPEND, "Wakeup sleep send config success.");
-            return ret;
-        }
-    }
-
-    printk("GTP wakeup sleep failed.");
-    return ret;
-#endif
-
-}
-
-
-/*******************************************************
-Function:
-	GTP initialize function.
-
-Input:
-	ts:	i2c client private struct.
-	
-Output:
-	Executive outcomes.0---succeed.
-*******************************************************/
-static s32 gtp_init_panel(struct goodix_ts_data *ts)
+	while(retry++ < 5)
 	{
-		s32 ret = -1;
-	  
-#if GTP_DRIVER_SEND_CFG
-		s32 i;
-		u8 check_sum = 0;
-		u8 rd_cfg_buf[16];
-		int index =0;
-	
-#if 1
-		 u8 cfg_info_group1[] = CTP_CFG_GROUP1; 
-		 u8 cfg_info_group2[] = CTP_CFG_GROUP2; 
-		 u8 cfg_info_group3[] = CTP_CFG_GROUP3; 
-		 u8 cfg_info_group4[] = CTP_CFG_GROUP4;
-		 u8 cfg_info_group5[] = CTP_CFG_GROUP5;
-		 u8 cfg_info_group6[] = CTP_CFG_GROUP6;
-//		 u8 cfg_info_group7[] = CTP_CFG_GROUP7;
-#else
-		 u8 cfg_info_group1[] = {}; 
-		 u8 cfg_info_group2[] = {}; 
-		 u8 cfg_info_group3[] = {}; 
-		 u8 cfg_info_group4[] = {};
-		 u8 cfg_info_group5[] = {};
-		 u8 cfg_info_group6[] = {};
-//		 u8 cfg_info_group7[] = {};
-#endif
-
-		u8 *send_cfg_buf[] = {cfg_info_group1,cfg_info_group2,cfg_info_group3,cfg_info_group4,cfg_info_group5,cfg_info_group6};
-		u8 cfg_info_len[] = {sizeof(cfg_info_group1)/sizeof(cfg_info_group1[0]),\
-				  sizeof(cfg_info_group2)/sizeof(cfg_info_group2[0]),\
-				  sizeof(cfg_info_group3)/sizeof(cfg_info_group3[0]),\
-				  sizeof(cfg_info_group4)/sizeof(cfg_info_group4[0]),\
-				  sizeof(cfg_info_group5)/sizeof(cfg_info_group5[0]),\
-				  sizeof(cfg_info_group6)/sizeof(cfg_info_group6[0])};
-				  //sizeof(cfg_info_group7)/sizeof(cfg_info_group7[0])};
-#if 0 //gandy
-		for(i=0; i<3; i++)
-		{
-			if(cfg_info_len[i] > ts->gtp_cfg_len)
-			{
-				ts->gtp_cfg_len = cfg_info_len[i];
-			}
-		}
-#endif
-		
-		GTP_DEBUG("len1=%d,len2=%d,len3=%d,send_len:%d",cfg_info_len[0],cfg_info_len[1],cfg_info_len[2],ts->gtp_cfg_len);
-#if 0
-		if ((!cfg_info_len[1]) && (!cfg_info_len[2]))
-		{
-			rd_cfg_buf[GTP_ADDR_LENGTH] = 0; 
-		}
-		else
-#endif
-		printk("gtp_i2c_read GTP_REG_SENSOR_ID \n");
-		{
-			rd_cfg_buf[0] = GTP_REG_SENSOR_ID >> 8;
-			rd_cfg_buf[1] = GTP_REG_SENSOR_ID & 0xff;
-			ret = gtp_i2c_read(ts->client, rd_cfg_buf, 3);
-			if (ret < 0)
-			{
-				GTP_ERROR("Read SENSOR ID failed,default use group1 config!");
-				rd_cfg_buf[GTP_ADDR_LENGTH] = 0;
-			}
-			rd_cfg_buf[GTP_ADDR_LENGTH] &= 0x07;
-		}
-
-#if 0		
-		if(screen_max_x == 800 && screen_max_y == 480)
-		{
-			if(rd_cfg_buf[GTP_ADDR_LENGTH] == 3)
-				index = 0;
-			else if(rd_cfg_buf[GTP_ADDR_LENGTH] == 4)
-				index = 1;
-			else if(rd_cfg_buf[GTP_ADDR_LENGTH] == 5)
-				index = 3;
-			else if(rd_cfg_buf[GTP_ADDR_LENGTH] == 0)
-				index = 6;
-		}
-		else if(screen_max_x == 1024 && screen_max_y == 600)
-		{
-			if(rd_cfg_buf[GTP_ADDR_LENGTH] == 0)
-				index = 5;
-			else if(rd_cfg_buf[GTP_ADDR_LENGTH] == 3)
-				index = 2;
-		}
-#endif  
-        GTP_DEBUG("CTP name : %s\n",config_info.name);
-        if (!strcmp(config_info.name,"gt911_805d5")){
-            index = 0;
-            GTP_DEBUG("gt9xx:index = %d\n",index);
-			
-		} else if (!strcmp(config_info.name,"gt911_g912")){
-            index = 2;
-            GTP_DEBUG("gt9xx:index = %d\n",index);
-			
-		} else if (!strcmp(config_info.name,"gt911_xw785")){
-            index = 3;
-            GTP_DEBUG("gt9xx:index = %d\n",index);
-			
-		} else {//default gt9xx_ts		    
-            index = 1; //default  p4
-            GTP_DEBUG("gt9xx:index = %d\n",index);
-		}
-
-		printk("config send_cfg_buf******** \n");
-        //index = rd_cfg_buf[GTP_ADDR_LENGTH];
-		ts->gtp_cfg_len = cfg_info_len[index];
-		GTP_DEBUG("gandy---SENSOR ID:%d\n", rd_cfg_buf[GTP_ADDR_LENGTH]);
-		memset(&config[GTP_ADDR_LENGTH], 0, GTP_CONFIG_MAX_LENGTH);
-		memcpy(&config[GTP_ADDR_LENGTH], send_cfg_buf[index], ts->gtp_cfg_len);
-	
-#if GTP_CUSTOM_CFG
-		config[RESOLUTION_LOC]	   = (u8)GTP_MAX_WIDTH;
-		config[RESOLUTION_LOC + 1] = (u8)(GTP_MAX_WIDTH>>8);
-		config[RESOLUTION_LOC + 2] = (u8)GTP_MAX_HEIGHT;
-		config[RESOLUTION_LOC + 3] = (u8)(GTP_MAX_HEIGHT>>8);
-		
-		if (GTP_INT_TRIGGER == 0)  //RISING
-		{
-			config[TRIGGER_LOC] &= 0xfe; 
-		}
-		else if (GTP_INT_TRIGGER == 1)	//FALLING
-		{
-			config[TRIGGER_LOC] |= 0x01;
-		}
-#endif  //endif GTP_CUSTOM_CFG
-		
-		check_sum = 0;
-		for (i = GTP_ADDR_LENGTH; i < ts->gtp_cfg_len; i++)
-		{
-			check_sum += config[i];
-		}
-		config[ts->gtp_cfg_len] = (~check_sum) + 1;
-		
-#else //else DRIVER NEED NOT SEND CONFIG
-	
-		if(ts->gtp_cfg_len == 0)
-		{
-			ts->gtp_cfg_len = GTP_CONFIG_MAX_LENGTH;
-		}
-		ret = gtp_i2c_read(ts->client, config, ts->gtp_cfg_len + GTP_ADDR_LENGTH);
-		if (ret < 0)
-		{
-			GTP_ERROR("GTP read resolution & max_touch_num failed, use default value!");
-			ts->abs_x_max = GTP_MAX_WIDTH;
-			ts->abs_y_max = GTP_MAX_HEIGHT;
-			ts->int_trigger_type = GTP_INT_TRIGGER;
-		}
-#endif //endif GTP_DRIVER_SEND_CFG
-	
-		GTP_DEBUG_FUNC();
-	
-		ts->abs_x_max = (config[RESOLUTION_LOC + 1] << 8) + config[RESOLUTION_LOC];
-		ts->abs_y_max = (config[RESOLUTION_LOC + 3] << 8) + config[RESOLUTION_LOC + 2];
-		ts->int_trigger_type = (config[TRIGGER_LOC]) & 0x03;
-		if ((!ts->abs_x_max)||(!ts->abs_y_max))
-		{
-			GTP_ERROR("GTP resolution & max_touch_num invalid, use default value!");
-			ts->abs_x_max = GTP_MAX_WIDTH;
-			ts->abs_y_max = GTP_MAX_HEIGHT;
-		}
-		
-		msleep(100);
 		ret = gtp_send_cfg(ts->client);
-		if (ret < 0)
+		if (ret > 0)
 		{
-			printk("\ngandy-----send config error.ret=%d\n",ret);
-			GTP_ERROR("Send config error.");
+			dprintk(DEBUG_SUSPEND, "Wakeup sleep send config success.");
+			return ret;
 		}
-		printk("X_MAX = %d,Y_MAX = %d,TRIGGER = 0x%02x",
-				 ts->abs_x_max,ts->abs_y_max,ts->int_trigger_type);
-	
-		msleep(10);
-	
-		return 0;
 	}
 
+	printk("GTP wakeup sleep failed.");
+	return ret;
+#endif
+
+}
+
+
 /*******************************************************
 Function:
-	Read goodix touchscreen version function.
+GTP initialize function.
 
 Input:
-	client:	i2c client struct.
-	version:address to store version info
-	
+ts:	i2c client private struct.
+
 Output:
-	Executive outcomes.0---succeed.
-*******************************************************/
+Executive outcomes.0---succeed.
+ *******************************************************/
+static s32 gtp_init_panel(struct goodix_ts_data *ts)
+{
+	s32 ret = -1;
+
+#if GTP_DRIVER_SEND_CFG
+	s32 i;
+	u8 check_sum = 0;
+	u8 rd_cfg_buf[16];
+	int index =0;
+
+#if 1
+	u8 cfg_info_group1[] = CTP_CFG_GROUP1; 
+	u8 cfg_info_group2[] = CTP_CFG_GROUP2; 
+	u8 cfg_info_group3[] = CTP_CFG_GROUP3; 
+	u8 cfg_info_group4[] = CTP_CFG_GROUP4;
+	u8 cfg_info_group5[] = CTP_CFG_GROUP5;
+	u8 cfg_info_group6[] = CTP_CFG_GROUP6;
+	//		 u8 cfg_info_group7[] = CTP_CFG_GROUP7;
+#else
+	u8 cfg_info_group1[] = {}; 
+	u8 cfg_info_group2[] = {}; 
+	u8 cfg_info_group3[] = {}; 
+	u8 cfg_info_group4[] = {};
+	u8 cfg_info_group5[] = {};
+	u8 cfg_info_group6[] = {};
+	//		 u8 cfg_info_group7[] = {};
+#endif
+
+	u8 *send_cfg_buf[] = {cfg_info_group1,cfg_info_group2,cfg_info_group3,cfg_info_group4,cfg_info_group5,cfg_info_group6};
+	u8 cfg_info_len[] = {sizeof(cfg_info_group1)/sizeof(cfg_info_group1[0]),\
+		sizeof(cfg_info_group2)/sizeof(cfg_info_group2[0]),\
+			sizeof(cfg_info_group3)/sizeof(cfg_info_group3[0]),\
+			sizeof(cfg_info_group4)/sizeof(cfg_info_group4[0]),\
+			sizeof(cfg_info_group5)/sizeof(cfg_info_group5[0]),\
+			sizeof(cfg_info_group6)/sizeof(cfg_info_group6[0])};
+	//sizeof(cfg_info_group7)/sizeof(cfg_info_group7[0])};
+#if 0 //gandy
+for(i=0; i<3; i++)
+{
+	if(cfg_info_len[i] > ts->gtp_cfg_len)
+	{
+		ts->gtp_cfg_len = cfg_info_len[i];
+	}
+}
+#endif
+
+GTP_DEBUG("len1=%d,len2=%d,len3=%d,send_len:%d",cfg_info_len[0],cfg_info_len[1],cfg_info_len[2],ts->gtp_cfg_len);
+#if 0
+if ((!cfg_info_len[1]) && (!cfg_info_len[2]))
+{
+	rd_cfg_buf[GTP_ADDR_LENGTH] = 0; 
+}
+else
+#endif
+printk("gtp_i2c_read GTP_REG_SENSOR_ID \n");
+{
+	rd_cfg_buf[0] = GTP_REG_SENSOR_ID >> 8;
+	rd_cfg_buf[1] = GTP_REG_SENSOR_ID & 0xff;
+	ret = gtp_i2c_read(ts->client, rd_cfg_buf, 3);
+	if (ret < 0)
+	{
+		GTP_ERROR("Read SENSOR ID failed,default use group1 config!");
+		rd_cfg_buf[GTP_ADDR_LENGTH] = 0;
+	}
+	rd_cfg_buf[GTP_ADDR_LENGTH] &= 0x07;
+}
+
+#if 0		
+if(screen_max_x == 800 && screen_max_y == 480)
+{
+	if(rd_cfg_buf[GTP_ADDR_LENGTH] == 3)
+		index = 0;
+	else if(rd_cfg_buf[GTP_ADDR_LENGTH] == 4)
+		index = 1;
+	else if(rd_cfg_buf[GTP_ADDR_LENGTH] == 5)
+		index = 3;
+	else if(rd_cfg_buf[GTP_ADDR_LENGTH] == 0)
+		index = 6;
+}
+else if(screen_max_x == 1024 && screen_max_y == 600)
+{
+	if(rd_cfg_buf[GTP_ADDR_LENGTH] == 0)
+		index = 5;
+	else if(rd_cfg_buf[GTP_ADDR_LENGTH] == 3)
+		index = 2;
+}
+#endif  
+GTP_DEBUG("CTP name : %s\n",config_info.name);
+if (!strcmp(config_info.name,"gt911_805d5")){
+	index = 0;
+	GTP_DEBUG("gt9xx:index = %d\n",index);
+
+} else if (!strcmp(config_info.name,"gt911_g912")){
+	index = 2;
+	GTP_DEBUG("gt9xx:index = %d\n",index);
+
+} else if (!strcmp(config_info.name,"gt911_xw785")){
+	index = 3;
+	GTP_DEBUG("gt9xx:index = %d\n",index);
+
+} else {//default gt9xx_ts		    
+	index = 1; //default  p4
+	GTP_DEBUG("gt9xx:index = %d\n",index);
+}
+
+printk("config send_cfg_buf******** \n");
+//index = rd_cfg_buf[GTP_ADDR_LENGTH];
+ts->gtp_cfg_len = cfg_info_len[index];
+GTP_DEBUG("gandy---SENSOR ID:%d\n", rd_cfg_buf[GTP_ADDR_LENGTH]);
+memset(&config[GTP_ADDR_LENGTH], 0, GTP_CONFIG_MAX_LENGTH);
+memcpy(&config[GTP_ADDR_LENGTH], send_cfg_buf[index], ts->gtp_cfg_len);
+
+#if GTP_CUSTOM_CFG
+config[RESOLUTION_LOC]	   = (u8)GTP_MAX_WIDTH;
+config[RESOLUTION_LOC + 1] = (u8)(GTP_MAX_WIDTH>>8);
+config[RESOLUTION_LOC + 2] = (u8)GTP_MAX_HEIGHT;
+config[RESOLUTION_LOC + 3] = (u8)(GTP_MAX_HEIGHT>>8);
+
+if (GTP_INT_TRIGGER == 0)  //RISING
+{
+	config[TRIGGER_LOC] &= 0xfe; 
+}
+else if (GTP_INT_TRIGGER == 1)	//FALLING
+{
+	config[TRIGGER_LOC] |= 0x01;
+}
+#endif  //endif GTP_CUSTOM_CFG
+
+check_sum = 0;
+for (i = GTP_ADDR_LENGTH; i < ts->gtp_cfg_len; i++)
+{
+	check_sum += config[i];
+}
+config[ts->gtp_cfg_len] = (~check_sum) + 1;
+
+#else //else DRIVER NEED NOT SEND CONFIG
+
+if(ts->gtp_cfg_len == 0)
+{
+	ts->gtp_cfg_len = GTP_CONFIG_MAX_LENGTH;
+}
+ret = gtp_i2c_read(ts->client, config, ts->gtp_cfg_len + GTP_ADDR_LENGTH);
+if (ret < 0)
+{
+	GTP_ERROR("GTP read resolution & max_touch_num failed, use default value!");
+	ts->abs_x_max = GTP_MAX_WIDTH;
+	ts->abs_y_max = GTP_MAX_HEIGHT;
+	ts->int_trigger_type = GTP_INT_TRIGGER;
+}
+#endif //endif GTP_DRIVER_SEND_CFG
+
+GTP_DEBUG_FUNC();
+
+ts->abs_x_max = (config[RESOLUTION_LOC + 1] << 8) + config[RESOLUTION_LOC];
+ts->abs_y_max = (config[RESOLUTION_LOC + 3] << 8) + config[RESOLUTION_LOC + 2];
+ts->int_trigger_type = (config[TRIGGER_LOC]) & 0x03;
+if ((!ts->abs_x_max)||(!ts->abs_y_max))
+{
+	GTP_ERROR("GTP resolution & max_touch_num invalid, use default value!");
+	ts->abs_x_max = GTP_MAX_WIDTH;
+	ts->abs_y_max = GTP_MAX_HEIGHT;
+}
+
+msleep(100);
+ret = gtp_send_cfg(ts->client);
+if (ret < 0)
+{
+	printk("\ngandy-----send config error.ret=%d\n",ret);
+	GTP_ERROR("Send config error.");
+}
+printk("X_MAX = %d,Y_MAX = %d,TRIGGER = 0x%02x",
+		ts->abs_x_max,ts->abs_y_max,ts->int_trigger_type);
+
+msleep(10);
+
+return 0;
+}
+
+/*******************************************************
+Function:
+Read goodix touchscreen version function.
+
+Input:
+client:	i2c client struct.
+version:address to store version info
+
+Output:
+Executive outcomes.0---succeed.
+ *******************************************************/
 s32 gtp_read_version(struct i2c_client *client, u16* version)
 {
-        s32 ret = -1;
-        u8 buf[8] = {GTP_REG_VERSION >> 8, GTP_REG_VERSION & 0xff};
+	s32 ret = -1;
+	u8 buf[8] = {GTP_REG_VERSION >> 8, GTP_REG_VERSION & 0xff};
 
-        dprintk(DEBUG_INIT, "%s ---start!.---\n", __func__);
+	dprintk(DEBUG_INIT, "%s ---start!.---\n", __func__);
 
-        ret = gtp_i2c_read(client, buf, sizeof(buf));
-        if (ret < 0) {
-                printk("GTP read version failed");
-                return ret;
-        }
+	ret = gtp_i2c_read(client, buf, sizeof(buf));
+	if (ret < 0) {
+		printk("GTP read version failed");
+		return ret;
+	}
 
-        if (version) {
-                *version = (buf[7] << 8) | buf[6];
-        }
+	if (version) {
+		*version = (buf[7] << 8) | buf[6];
+	}
 
-        if (buf[5] == 0x00) {
-                printk("IC Version: %c%c%c_%02x%02x", buf[2], buf[3], buf[4], buf[7], buf[6]);
-        }
-        else {
-                printk("IC Version: %c%c%c%c_%02x%02x", buf[2], buf[3], buf[4], buf[5], buf[7], buf[6]);
-        }
-        return ret;
+	if (buf[5] == 0x00) {
+		printk("IC Version: %c%c%c_%02x%02x", buf[2], buf[3], buf[4], buf[7], buf[6]);
+	}
+	else {
+		printk("IC Version: %c%c%c%c_%02x%02x", buf[2], buf[3], buf[4], buf[5], buf[7], buf[6]);
+	}
+	return ret;
 }
 
 /*******************************************************
 Function:
-	I2c test Function.
+I2c test Function.
 
 Input:
-	client:i2c client.
-	
+client:i2c client.
+
 Output:
-	Executive outcomes.0--success,non-0--fail.
-*******************************************************/
+Executive outcomes.0--success,non-0--fail.
+ *******************************************************/
 static s8 gtp_i2c_test(struct i2c_client *client)
 {
-        u8 test[3] = {GTP_REG_CONFIG_DATA >> 8, GTP_REG_CONFIG_DATA & 0xff};
-        u8 retry = 0;
-        s8 ret = -1;
-  
-        while(retry++ < 2) {
-                ret = gtp_i2c_read(client, test, 3);
-                if (ret > 0) {
-                        return ret;
-                }
-                printk("GTP i2c test failed time %d.",retry);
-                msleep(10);
-        }
-        return ret;
+	u8 test[3] = {GTP_REG_CONFIG_DATA >> 8, GTP_REG_CONFIG_DATA & 0xff};
+	u8 retry = 0;
+	s8 ret = -1;
+
+	while(retry++ < 2) {
+		ret = gtp_i2c_read(client, test, 3);
+		if (ret > 0) {
+			return ret;
+		}
+		printk("GTP i2c test failed time %d.",retry);
+		msleep(10);
+	}
+	return ret;
 }
 
 
 /*******************************************************
 Function:
-	Request input device Function.
+Request input device Function.
 
 Input:
-	ts:private data.
-	
+ts:private data.
+
 Output:
-	Executive outcomes.0--success,non-0--fail.
-*******************************************************/
+Executive outcomes.0--success,non-0--fail.
+ *******************************************************/
 static s8 gtp_request_input_dev(struct goodix_ts_data *ts)
 {
-        s8 ret = -1;
+	s8 ret = -1;
 #if GTP_HAVE_TOUCH_KEY
-        u8 index = 0;
+	u8 index = 0;
 #endif
-  
-        ts->input_dev = input_allocate_device();
-        if (ts->input_dev == NULL) {
-                GTP_ERROR("Failed to allocate input device.");
-                return -ENOMEM;
-        }
 
-        ts->input_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) ;
+	ts->input_dev = input_allocate_device();
+	if (ts->input_dev == NULL) {
+		GTP_ERROR("Failed to allocate input device.");
+		return -ENOMEM;
+	}
+
+	ts->input_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) ;
 #if GTP_ICS_SLOT_REPORT
-        __set_bit(INPUT_PROP_DIRECT, ts->input_dev->propbit);
-        input_mt_init_slots(ts->input_dev, 255);
+	__set_bit(INPUT_PROP_DIRECT, ts->input_dev->propbit);
+	input_mt_init_slots(ts->input_dev, 255, 1);
 #else
-        ts->input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
+	ts->input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
 #endif
 
 #if GTP_HAVE_TOUCH_KEY
-        for (index = 0; index < GTP_MAX_KEY_NUM; index++) {
-                input_set_capability(ts->input_dev,EV_KEY,touch_key_array[index]);	
-        }
+	for (index = 0; index < GTP_MAX_KEY_NUM; index++) {
+		input_set_capability(ts->input_dev,EV_KEY,touch_key_array[index]);	
+	}
 #endif
 
-//#if GTP_CHANGE_X2Y
-//        GTP_SWAP(ts->abs_x_max, ts->abs_y_max);
-//#endif
+	//#if GTP_CHANGE_X2Y
+	//        GTP_SWAP(ts->abs_x_max, ts->abs_y_max);
+	//#endif
 
 	set_bit(ABS_MT_POSITION_X, ts->input_dev->absbit);
 	set_bit(ABS_MT_POSITION_Y, ts->input_dev->absbit);
 	set_bit(ABS_MT_TOUCH_MAJOR, ts->input_dev->absbit);
 	set_bit(ABS_MT_WIDTH_MAJOR, ts->input_dev->absbit);
-		
-		
-		
-        input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, SCREEN_MAX_X, 0, 0);
-        input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, SCREEN_MAX_Y, 0, 0);
-        input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0);
-        input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);	
-        input_set_abs_params(ts->input_dev, ABS_MT_TRACKING_ID, 0, 255, 0, 0);
+
+
+
+	input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, SCREEN_MAX_X, 0, 0);
+	input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, SCREEN_MAX_Y, 0, 0);
+	input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0);
+	input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);	
+	input_set_abs_params(ts->input_dev, ABS_MT_TRACKING_ID, 0, 255, 0, 0);
 	__set_bit(INPUT_PROP_DIRECT, ts->input_dev->propbit);
-    
-        ts->input_dev->name = CTP_NAME;
-        ts->input_dev->phys = "input/goodix-ts";
-        ts->input_dev->id.bustype = BUS_I2C;
-        ts->input_dev->id.vendor = 0xDEAD;
-        ts->input_dev->id.product = 0xBEEF;
-        ts->input_dev->id.version = 10427;
-        ret = input_register_device(ts->input_dev);
-        if (ret) {
-                printk("Register %s input device failed", ts->input_dev->name);
-                return -ENODEV;
-        }
+
+	ts->input_dev->name = CTP_NAME;
+	ts->input_dev->phys = "input/goodix-ts";
+	ts->input_dev->id.bustype = BUS_I2C;
+	ts->input_dev->id.vendor = 0xDEAD;
+	ts->input_dev->id.product = 0xBEEF;
+	ts->input_dev->id.version = 10427;
+	ret = input_register_device(ts->input_dev);
+	if (ret) {
+		printk("Register %s input device failed", ts->input_dev->name);
+		return -ENODEV;
+	}
 #ifdef CONFIG_HAS_EARLYSUSPEND
-        ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;
-        ts->early_suspend.suspend = goodix_ts_early_suspend;
-        ts->early_suspend.resume = goodix_ts_late_resume;
-        register_early_suspend(&ts->early_suspend);
+	ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;
+	ts->early_suspend.suspend = goodix_ts_early_suspend;
+	ts->early_suspend.resume = goodix_ts_late_resume;
+	register_early_suspend(&ts->early_suspend);
 #endif
-        return 0;
+	return 0;
 }
 
 
 /*******************************************************
 Function:
-	Goodix touchscreen probe function.
+Goodix touchscreen probe function.
 
 Input:
-	client:	i2c device struct.
-	id:device id.
-	
+client:	i2c device struct.
+id:device id.
+
 Output:
-	Executive outcomes. 0---succeed.
-*******************************************************/
+Executive outcomes. 0---succeed.
+ *******************************************************/
 static int goodix_ts_probe(struct i2c_client *client, const struct i2c_device_id *id)
 {
-        s32 ret = -1;
-        struct goodix_ts_data *ts;
-        u16 version_info;   
-    
-        dprintk(DEBUG_INIT, "GTP Driver Version:%s\n",GTP_DRIVER_VERSION);
-        printk("GTP I2C Address:0x%02x\n", client->addr);
+	s32 ret = -1;
+	struct goodix_ts_data *ts;
+	u16 version_info;   
 
-        i2c_connect_client = client;
-        if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
-                printk("I2C check functionality failed.\n");
-                return -ENODEV;
-        }
-        
-        ts = kzalloc(sizeof(*ts), GFP_KERNEL);
-        if (ts == NULL) {
-                printk("Alloc GFP_KERNEL memory failed.\n");
-                return -ENOMEM;
-        }
-   
-        memset(ts, 0, sizeof(*ts));
-        INIT_WORK(&ts->work, goodix_ts_work_func);
-        ts->client = client;
-        i2c_set_clientdata(client, ts);
-        //ts->irq_lock = SPIN_LOCK_UNLOCKED;
-        ts->gtp_rawdiff_mode = 0;
+	dprintk(DEBUG_INIT, "GTP Driver Version:%s\n",GTP_DRIVER_VERSION);
+	printk("GTP I2C Address:0x%02x\n", client->addr);
+
+	i2c_connect_client = client;
+	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
+		printk("I2C check functionality failed.\n");
+		return -ENODEV;
+	}
+
+	ts = kzalloc(sizeof(*ts), GFP_KERNEL);
+	if (ts == NULL) {
+		printk("Alloc GFP_KERNEL memory failed.\n");
+		return -ENOMEM;
+	}
+
+	memset(ts, 0, sizeof(*ts));
+	INIT_WORK(&ts->work, goodix_ts_work_func);
+	ts->client = client;
+	i2c_set_clientdata(client, ts);
+	//ts->irq_lock = SPIN_LOCK_UNLOCKED;
+	ts->gtp_rawdiff_mode = 0;
 
 
-        ret = gtp_i2c_test(client);
-        if (ret < 0){
-                printk("I2C communication ERROR!\n");
-		        goto exit_device_detect;
-        }
+	ret = gtp_i2c_test(client);
+	if (ret < 0){
+		printk("I2C communication ERROR!\n");
+		goto exit_device_detect;
+	}
 
-		printk(KERN_ALERT "create_singlethread_workqueue goodix_resume.\n");
-	    goodix_resume_wq = create_singlethread_workqueue("goodix_resume");
-	    if (goodix_resume_wq == NULL) {
-		        printk("create goodix_resume_wq fail!\n");
-		        return -ENOMEM;
-	    }
+	printk(KERN_ALERT "create_singlethread_workqueue goodix_resume.\n");
+	goodix_resume_wq = create_singlethread_workqueue("goodix_resume");
+	if (goodix_resume_wq == NULL) {
+		printk("create goodix_resume_wq fail!\n");
+		return -ENOMEM;
+	}
 
-		printk(KERN_ALERT "create_singlethread_workqueue goodix_wq.\n");
+	printk(KERN_ALERT "create_singlethread_workqueue goodix_wq.\n");
 
-	    goodix_wq = create_singlethread_workqueue("goodix_wq");
-	    if (!goodix_wq) {
-		        printk(KERN_ALERT "Creat goodix_wq workqueue failed.\n");
-				return -ENOMEM;
-	    }
+	goodix_wq = create_singlethread_workqueue("goodix_wq");
+	if (!goodix_wq) {
+		printk(KERN_ALERT "Creat goodix_wq workqueue failed.\n");
+		return -ENOMEM;
+	}
 
 #if GTP_AUTO_UPDATE
-        //ret = gup_init_update_proc(ts);
-       // if (ret < 0) {
-       //         printk("Create update thread error.");
-       // }
+	//ret = gup_init_update_proc(ts);
+	// if (ret < 0) {
+	//         printk("Create update thread error.");
+	// }
 #endif
-        ret = gtp_init_panel(ts);
-        if (ret < 0) {
-                printk("GTP init panel failed.\n");
-        }
+	ret = gtp_init_panel(ts);
+	if (ret < 0) {
+		printk("GTP init panel failed.\n");
+	}
 
-        
-	    ret = gtp_request_input_dev(ts);
-        if (ret < 0) {
-                printk("GTP request input dev failed\n");
+
+	ret = gtp_request_input_dev(ts);
+	if (ret < 0) {
+		printk("GTP request input dev failed\n");
 		goto exit_device_detect;
-        }
+	}
 
-		ret = gtp_read_version(client, &version_info);
-		if (ret < 0) {
-						printk("Read version failed.");
-		}
-		
-		config_info.dev = &(ts->input_dev->dev);
+	ret = gtp_read_version(client, &version_info);
+	if (ret < 0) {
+		printk("Read version failed.");
+	}
 
-        ret = input_request_int(&(config_info.input_type), goodix_ts_irq_handler,CTP_IRQ_MODE, ts);	   
-        if (ret) {
-                printk("Request irq fail!.\n");
-        }
-        	
-        
-        spin_lock_init(&ts->irq_lock);
+	config_info.dev = &(ts->input_dev->dev);
+
+	ret = input_request_int(&(config_info.input_type), goodix_ts_irq_handler,CTP_IRQ_MODE, ts);	   
+	if (ret) {
+		printk("Request irq fail!.\n");
+	}
+
+
+	spin_lock_init(&ts->irq_lock);
 
 #if GTP_CREATE_WR_NODE
-        init_wr_node(client);
+	init_wr_node(client);
 #endif
 
 #if GTP_ESD_PROTECT
-        INIT_DELAYED_WORK(&gtp_esd_check_work, gtp_esd_check_func);
-        gtp_esd_check_workqueue = create_workqueue("gtp_esd_check");
-        queue_delayed_work(gtp_esd_check_workqueue, &gtp_esd_check_work, GTP_ESD_CHECK_CIRCLE); 
+	INIT_DELAYED_WORK(&gtp_esd_check_work, gtp_esd_check_func);
+	gtp_esd_check_workqueue = create_workqueue("gtp_esd_check");
+	queue_delayed_work(gtp_esd_check_workqueue, &gtp_esd_check_work, GTP_ESD_CHECK_CIRCLE); 
 #endif
 	dprintk(DEBUG_INIT, "gt9xx probe success!\n");
-        return 0;
+	return 0;
 exit_device_detect:
 	i2c_set_clientdata(client, NULL);
 	kfree(ts);
@@ -1171,115 +1175,115 @@
 
 /*******************************************************
 Function:
-	Goodix touchscreen driver release function.
+Goodix touchscreen driver release function.
 
 Input:
-	client:	i2c device struct.
-	
+client:	i2c device struct.
+
 Output:
-	Executive outcomes. 0---succeed.
-*******************************************************/
+Executive outcomes. 0---succeed.
+ *******************************************************/
 static int goodix_ts_remove(struct i2c_client *client)
 {
-    struct goodix_ts_data *ts = i2c_get_clientdata(client);
-	
+	struct goodix_ts_data *ts = i2c_get_clientdata(client);
+
 	dprintk(DEBUG_INIT,"%s start!\n", __func__);
 #ifdef CONFIG_HAS_EARLYSUSPEND
-        unregister_early_suspend(&ts->early_suspend);
+	unregister_early_suspend(&ts->early_suspend);
 #endif
 
 #if GTP_CREATE_WR_NODE
-        uninit_wr_node();
+	uninit_wr_node();
 #endif
 
 #if GTP_ESD_PROTECT
-        flush_workqueue(gtp_esd_check_workqueue);
-    if(gtp_esd_check_workqueue)
-        destroy_workqueue(gtp_esd_check_workqueue);
+	flush_workqueue(gtp_esd_check_workqueue);
+	if(gtp_esd_check_workqueue)
+		destroy_workqueue(gtp_esd_check_workqueue);
 #endif
-    input_free_int(&(config_info.input_type), ts);
+	input_free_int(&(config_info.input_type), ts);
 	flush_workqueue(goodix_wq);
 	//cancel_work_sync(&goodix_init_work);
-  	cancel_work_sync(&goodix_resume_work);
+	cancel_work_sync(&goodix_resume_work);
 	if(goodix_wq)
 		destroy_workqueue(goodix_wq);
-  	//destroy_workqueue(goodix_init_wq);
-  	if(goodix_resume_wq)
-  		destroy_workqueue(goodix_resume_wq);
-  	i2c_set_clientdata(ts->client, NULL);
+	//destroy_workqueue(goodix_init_wq);
+	if(goodix_resume_wq)
+		destroy_workqueue(goodix_resume_wq);
+	i2c_set_clientdata(ts->client, NULL);
 	input_unregister_device(ts->input_dev);
 	kfree(ts);
-	
-    return 0;
+
+	return 0;
 }
 
 static void goodix_resume_events (struct work_struct *work)
 {
 	int ret;
-        struct goodix_ts_data *ts = i2c_get_clientdata(i2c_connect_client);
-        
-		ret = gtp_wakeup_sleep(ts);
-		if (ret < 0)
-			printk("resume power on failed\n");    	
-	   gtp_irq_enable(ts);
+	struct goodix_ts_data *ts = i2c_get_clientdata(i2c_connect_client);
+
+	ret = gtp_wakeup_sleep(ts);
+	if (ret < 0)
+		printk("resume power on failed\n");    	
+	gtp_irq_enable(ts);
 }
 
 /*******************************************************
 Function:
-	Early suspend function.
+Early suspend function.
 
 Input:
-	h:early_suspend struct.
-	
+h:early_suspend struct.
+
 Output:
-	None.
-*******************************************************/
+None.
+ *******************************************************/
 #ifdef CONFIG_HAS_EARLYSUSPEND
 static void goodix_ts_early_suspend(struct early_suspend *h)
 {
-        struct goodix_ts_data *ts;
-        s8 ret = -1;	
-        ts = container_of(h, struct goodix_ts_data, early_suspend);
+	struct goodix_ts_data *ts;
+	s8 ret = -1;	
+	ts = container_of(h, struct goodix_ts_data, early_suspend);
 
 #if GTP_ESD_PROTECT
-        ts->gtp_is_suspend = 1;
-        cancel_delayed_work_sync(&gtp_esd_check_work);
+	ts->gtp_is_suspend = 1;
+	cancel_delayed_work_sync(&gtp_esd_check_work);
 #endif
 
-        gtp_irq_disable(ts);
-        
-       
-        cancel_work_sync(&goodix_resume_work);
-      	flush_workqueue(goodix_resume_wq);
-        ret = cancel_work_sync(&ts->work);
-        flush_workqueue(goodix_wq);
-      
-		   ret = gtp_enter_sleep(ts);
-        if (ret < 0) {
-                printk("GTP early suspend failed.");
-        }
+	gtp_irq_disable(ts);
+
+
+	cancel_work_sync(&goodix_resume_work);
+	flush_workqueue(goodix_resume_wq);
+	ret = cancel_work_sync(&ts->work);
+	flush_workqueue(goodix_wq);
+
+	ret = gtp_enter_sleep(ts);
+	if (ret < 0) {
+		printk("GTP early suspend failed.");
+	}
 }
 
 /*******************************************************
 Function:
-	Late resume function.
+Late resume function.
 
 Input:
-	h:early_suspend struct.
-	
+h:early_suspend struct.
+
 Output:
-	None.
-*******************************************************/
+None.
+ *******************************************************/
 static void goodix_ts_late_resume(struct early_suspend *h)
 {
-        struct goodix_ts_data *ts;
-        ts = container_of(h, struct goodix_ts_data, early_suspend);
-	
-        queue_work(goodix_resume_wq, &goodix_resume_work);//gandy
+	struct goodix_ts_data *ts;
+	ts = container_of(h, struct goodix_ts_data, early_suspend);
+
+	queue_work(goodix_resume_wq, &goodix_resume_work);//gandy
 
 #if GTP_ESD_PROTECT
-        ts->gtp_is_suspend = 0;
-        queue_delayed_work(gtp_esd_check_workqueue, &gtp_esd_check_work, GTP_ESD_CHECK_CIRCLE);
+	ts->gtp_is_suspend = 0;
+	queue_delayed_work(gtp_esd_check_workqueue, &gtp_esd_check_work, GTP_ESD_CHECK_CIRCLE);
 #endif
 }
 #else
@@ -1296,10 +1300,10 @@
 #endif
 
 	/*
-	ret = input_set_int_enable(&(config_info.input_type), 0);
-	if (ret < 0)
-		dprintk(DEBUG_SUSPEND,"%s irq disable failed\n", goodix_ts_name);
-	*/
+	   ret = input_set_int_enable(&(config_info.input_type), 0);
+	   if (ret < 0)
+	   dprintk(DEBUG_SUSPEND,"%s irq disable failed\n", goodix_ts_name);
+	   */
 	gtp_irq_disable(ts);
 	cancel_work_sync(&goodix_resume_work);
 	flush_workqueue(goodix_resume_wq);
@@ -1329,7 +1333,7 @@
 #if GTP_ESD_PROTECT
 	struct goodix_ts_data *ts = dev_get_drvdata(dev);
 	ts->gtp_is_suspend = 0;
-        queue_delayed_work(gtp_esd_check_workqueue, &gtp_esd_check_work, GTP_ESD_CHECK_CIRCLE);
+	queue_delayed_work(gtp_esd_check_workqueue, &gtp_esd_check_work, GTP_ESD_CHECK_CIRCLE);
 #endif
 	return 0;
 }
@@ -1339,80 +1343,80 @@
 #if GTP_ESD_PROTECT
 /*******************************************************
 Function:
-    Initialize external watchdog for esd protect
+Initialize external watchdog for esd protect
 Input:
-    client:  i2c device.
+client:  i2c device.
 Output:
-    result of i2c write operation. 
-        1: succeed, otherwise: failed
-*********************************************************/
+result of i2c write operation. 
+1: succeed, otherwise: failed
+ *********************************************************/
 s32 gtp_init_ext_watchdog(struct i2c_client *client)
 {
-        u8 opr_buffer[4] = {0x80, 0x40, 0xAA, 0xAA};
-        dprintk(DEBUG_INIT, "Init external watchdog...");
-        return gtp_i2c_write(client, opr_buffer, 4);
+	u8 opr_buffer[4] = {0x80, 0x40, 0xAA, 0xAA};
+	dprintk(DEBUG_INIT, "Init external watchdog...");
+	return gtp_i2c_write(client, opr_buffer, 4);
 }
 /*******************************************************
 Function:
-    Esd protect function.
-    Added external watchdog by meta, 2013/03/07
+Esd protect function.
+Added external watchdog by meta, 2013/03/07
 Input:
-    work: delayed work
+work: delayed work
 Output:
-    None.
-*******************************************************/
+None.
+ *******************************************************/
 static void gtp_esd_check_func(struct work_struct *work)
 {
-        s32 i;
-        s32 ret = -1;
-        struct goodix_ts_data *ts = NULL;
-        u8 test[4] = {0x80, 0x40};
-        
-        dprintk(DEBUG_INIT, "enter %s work!\n", __func__);
+	s32 i;
+	s32 ret = -1;
+	struct goodix_ts_data *ts = NULL;
+	u8 test[4] = {0x80, 0x40};
 
-         ts = i2c_get_clientdata(i2c_connect_client);
+	dprintk(DEBUG_INIT, "enter %s work!\n", __func__);
 
-        if (ts->gtp_is_suspend || ts->enter_update) {
-                return;
-        }
-    
-        for (i = 0; i < 3; i++) {
-                ret = gtp_i2c_read(ts->client, test, 4);
-        
-                dprintk(DEBUG_INIT, "0x8040 = 0x%02X, 0x8041 = 0x%02X", test[2], test[3]);
-                if ((ret < 0)) {
-                        // IC works abnormally..
-                        continue;
-                }else { 
-                        if ((test[2] == 0xAA) || (test[3] != 0xAA)) {
-                                // IC works abnormally..
-                                i = 3;
-                                break;  
-                        }else {
-                                // IC works normally, Write 0x8040 0xAA
-                                test[2] = 0xAA; 
-                                gtp_i2c_write(ts->client, test, 3);
-                                break;
-                        }
-                }
-        }
-        
-        if (i >= 3) {
-               GTP_DEBUG("IC Working ABNORMALLY, Resetting Guitar...");
-              //  gtp_reset_guitar(ts->client, 50);
-        }
+	ts = i2c_get_clientdata(i2c_connect_client);
 
-        if(!ts->gtp_is_suspend) {
-                queue_delayed_work(gtp_esd_check_workqueue, &gtp_esd_check_work, GTP_ESD_CHECK_CIRCLE);
-        }
+	if (ts->gtp_is_suspend || ts->enter_update) {
+		return;
+	}
 
-        return;
+	for (i = 0; i < 3; i++) {
+		ret = gtp_i2c_read(ts->client, test, 4);
+
+		dprintk(DEBUG_INIT, "0x8040 = 0x%02X, 0x8041 = 0x%02X", test[2], test[3]);
+		if ((ret < 0)) {
+			// IC works abnormally..
+			continue;
+		}else { 
+			if ((test[2] == 0xAA) || (test[3] != 0xAA)) {
+				// IC works abnormally..
+				i = 3;
+				break;  
+			}else {
+				// IC works normally, Write 0x8040 0xAA
+				test[2] = 0xAA; 
+				gtp_i2c_write(ts->client, test, 3);
+				break;
+			}
+		}
+	}
+
+	if (i >= 3) {
+		GTP_DEBUG("IC Working ABNORMALLY, Resetting Guitar...");
+		//  gtp_reset_guitar(ts->client, 50);
+	}
+
+	if(!ts->gtp_is_suspend) {
+		queue_delayed_work(gtp_esd_check_workqueue, &gtp_esd_check_work, GTP_ESD_CHECK_CIRCLE);
+	}
+
+	return;
 }
 #endif
 
 static const struct i2c_device_id goodix_ts_id[] = {
-        { CTP_NAME, 0 },
-        { }
+	{ CTP_NAME, 0 },
+	{ }
 };
 
 #ifndef CONFIG_HAS_EARLYSUSPEND
@@ -1420,43 +1424,45 @@
 static const struct dev_pm_ops gt9xx_pm_ops = {
 	.suspend = goodix_ts_suspend,
 	.resume = goodix_ts_resume,
-	};
+};
 
 #define GT9XX_PM_OPS (&gt9xx_pm_ops)
 #endif
 #endif
 
 static struct i2c_driver goodix_ts_driver = {
-        .class          = I2C_CLASS_HWMON,
-        .probe          = goodix_ts_probe,
-        .remove         = goodix_ts_remove,
-        .id_table       = goodix_ts_id,
-        .driver = {
-                .name   = CTP_NAME,
-                .owner  = THIS_MODULE,
+	.class          = I2C_CLASS_HWMON,
+	.probe          = goodix_ts_probe,
+	.remove         = goodix_ts_remove,
+	.id_table       = goodix_ts_id,
+	.driver = {
+		.name   = CTP_NAME,
+		.owner  = THIS_MODULE,
 #ifndef CONFIG_HAS_EARLYSUSPEND
 #ifdef CONFIG_PM
 		.pm = GT9XX_PM_OPS,
 #endif
 #endif
-        },
-        .address_list	= normal_i2c,
+	},
+	.address_list	= normal_i2c,
 };
 
 static int ctp_get_system_config(void)
 {   
-        ctp_print_info(config_info,DEBUG_INIT);
-        twi_id = config_info.twi_id;
-        screen_max_x = config_info.screen_max_x;
-        screen_max_y = config_info.screen_max_y;
-        revert_x_flag = config_info.revert_x_flag;
-        revert_y_flag = config_info.revert_y_flag;
-        exchange_x_y_flag = config_info.exchange_x_y_flag; 
-        if((screen_max_x == 0) || (screen_max_y == 0)){
-                printk("%s:read config error!\n",__func__);
-                return 0;
-        }
-        return 1;
+	ctp_print_info(config_info,DEBUG_INIT);
+	twi_id = config_info.twi_id;
+/*
+	screen_max_x = config_info.screen_max_x;
+	screen_max_y = config_info.screen_max_y;
+	revert_x_flag = config_info.revert_x_flag;
+	revert_y_flag = config_info.revert_y_flag;
+	exchange_x_y_flag = config_info.exchange_x_y_flag; 
+*/
+	if((screen_max_x == 0) || (screen_max_y == 0)){
+		printk("%s:read config error!\n",__func__);
+		return 0;
+	}
+	return 1;
 }
 
 /*******************************************************
@@ -1469,76 +1475,82 @@
  *             ********************************************************/
 static int __init goodix_ts_init(void)
 {
-    s32 ret = -1;
+	s32 ret = -1;
 	int val = 0;
-    struct device_node *np = NULL;
+	struct device_node *np = NULL;
 
-    dprintk(DEBUG_INIT,"GTP driver init\n");
+	dprintk(DEBUG_INIT,"GTP driver init\n");
 	if (!input_sensor_startup(&(config_info.input_type))) {
 		ret = input_sensor_init(&(config_info.input_type));
-			if (ret != 0) {
-				pr_err("%s:ctp_ops.input_sensor_init err.\n", __func__);
-				return ret;
-			}
-			input_set_power_enable(&(config_info.input_type), 1);
+		if (ret != 0) {
+			pr_err("%s:ctp_ops.input_sensor_init err.\n", __func__);
+			return ret;
+		}
+		input_set_power_enable(&(config_info.input_type), 1);
 	} else {
 		pr_err("%s: input_ctp_startup err.\n", __func__);
 		return 0;
 	}
-    if(config_info.ctp_used == 0){
-            printk("*** ctp_used set to 0 !\n");
-            printk("*** if use ctp,please put the sys_config.fex ctp_used set to 1. \n");
-            return 0;
+	if(config_info.ctp_used == 0){
+		printk("*** ctp_used set to 0 !\n");
+		printk("*** if use ctp,please put the sys_config.fex ctp_used set to 1. \n");
+		return 0;
 	}
 
 	np = of_find_node_by_name(NULL, "ctp");
 	if (!np) {
-			 pr_err("ERROR! get ctp node failed, func:%s, line:%d\n",__FUNCTION__, __LINE__);
-			 return -1;
-		}
+		pr_err("ERROR! get ctp node failed, func:%s, line:%d\n",__FUNCTION__, __LINE__);
+		return -1;
+	}
 
 	ret = of_property_read_u32(np, "ctp_gesture_wakeup", &val);
 	if (ret) {
-			 pr_err("get ctp_screen_max_x is fail, %d\n", ret);
-		}
-    msleep(10);
+		pr_err("get ctp_screen_max_x is fail, %d\n", ret);
+	}
+	msleep(10);
+#if 0
+	if(!ctp_get_system_config()){
+		printk("%s:read config fail!\n",__func__);
+		return ret;
+	}
+#else
+	//ret = of_property_read_u32(np, "ctp_screen_max_x", &screen_max_x);
+	//of_property_read_u32(np, "ctp_screen_max_y", &screen_max_y);
+	//of_property_read_u32(np, "ctp_revert_x_flag", &revert_x_flag);
+	//of_property_read_u32(np, "ctp_revert_y_flag", &revert_y_flag);
+	//of_property_read_u32(np, "ctp_exchange_x_y_flag", &exchange_x_y_flag);
+#endif
+	sunxi_gpio_to_name(CTP_IRQ_NUMBER,irq_pin_name);
+	gtp_io_init(20);
 
-    if(!ctp_get_system_config()){
-                printk("%s:read config fail!\n",__func__);
-                return ret;
-        }
-
-    sunxi_gpio_to_name(CTP_IRQ_NUMBER,irq_pin_name);
-    gtp_io_init(20);
-
-    goodix_wq = create_singlethread_workqueue("goodix_wq");
-    if (!goodix_wq)
-    {
-            GTP_ERROR("Creat workqueue failed.");
-            return -ENOMEM;
-        }
+	goodix_wq = create_singlethread_workqueue("goodix_wq");
+	if (!goodix_wq)
+	{
+		GTP_ERROR("Creat workqueue failed.");
+		return -ENOMEM;
+	}
 #if GTP_ESD_PROTECT
-    INIT_DELAYED_WORK(&gtp_esd_check_work, gtp_esd_check_func);
-    gtp_esd_check_workqueue = create_workqueue("gtp_esd_check");
+	INIT_DELAYED_WORK(&gtp_esd_check_work, gtp_esd_check_func);
+	gtp_esd_check_workqueue = create_workqueue("gtp_esd_check");
 #endif
 	goodix_ts_driver.detect = ctp_detect;
-    ret = i2c_add_driver(&goodix_ts_driver);
-    return ret;
+	ret = i2c_add_driver(&goodix_ts_driver);
+	return ret;
 }
 
 
 /*******************************************************	
 Function:
-	Driver uninstall function.
+Driver uninstall function.
 Input:
-  None.
+None.
 Output:
-	Executive Outcomes. 0---succeed.
-********************************************************/
+Executive Outcomes. 0---succeed.
+ ********************************************************/
 static void __exit goodix_ts_exit(void)
 {
-        printk("GTP driver exited.\n");
-        i2c_del_driver(&goodix_ts_driver);
+	printk("GTP driver exited.\n");
+	i2c_del_driver(&goodix_ts_driver);
 	input_sensor_free(&(config_info.input_type));
 }
 

--
Gitblit v1.6.2