K97 项目相关修改
[firefly-linux-kernel-4.4.55.git] / drivers / input / touchscreen / rk29_i2c_goodix.c
index e59a413ec8bcf315c737ca1842ff5a851ab5ec23..40f649cde589bca2d96449ef23a50ba09c2f1aed 100755 (executable)
 #include <linux/io.h>\r
 #include <linux/platform_device.h>\r
 #include <mach/gpio.h>\r
-//#include <plat/gpio-cfg.h>\r
-//#include <plat/gpio-bank-l.h>\r
-//#include <plat/gpio-bank-f.h>\r
+\r
 #include <linux/irq.h>\r
 #include <linux/syscalls.h>\r
 #include <linux/reboot.h>\r
 #include <linux/proc_fs.h>\r
 #include "rk29_i2c_goodix.h"\r
-//#include <linux/goodix_queue.h>\r
 \r
 #include <linux/vmalloc.h>\r
 #include <linux/fs.h>\r
 \r
 #define PEN_DOWN 1\r
 #define PEN_RELEASE 0\r
-#define MAX_SUPPORT_POINT 2\r
-//#define fjp_debug 0\r
+#define PEN_DOWN_UP 2 //fjp\r
+\r
+static struct rk_touch_info *info_buf;\r
+\r
+static int dbg_thresd = 0;\r
+#define DBG(x...) do { if(unlikely(dbg_thresd)) printk(KERN_INFO x); } while (0)\r
+\r
 \r
-//#define fjp_debug\r
 /*******************************************************       \r
 Description:\r
        Read data from the i2c slave device;\r
@@ -158,23 +159,8 @@ static int goodix_init_panel(struct rk_ts_data *ts)
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
                  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\r
                };\r
-             /* uint8_t config_info[] = {\r
-                   0x65,0x02,0x04,0x00,0x03,0x00,0x0a,0x22,0x1E,0xE7,0x32,0x05,0x08,0x10,0x4C,\r
-                                       0x40,0x41,0x20,0x00,0x00,0x8B,0x8B,0x3C,0x64,0x0E,0x0D,0x0C,0x0B,\r
-                                       0x0A,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00,0x1D,0x1C,\r
-                                       0x1B,0x1A,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0F,\r
-                                       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
-                                       0x2B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
-                                       0x00,0x00,0x00,0x00\r
-               }; */           \r
+             \r
 #else\r
-         /*uint8_t config_info[] = {\r
-                   0x65,0x02,0x05,0x00,0x03,0x20,0x05,0x20,0x1E,0xE7,0x32,0x05,0x08,0x10,0x4C,\r
-                   0x40,0x41,0x20,0x00,0x00,0x89,0x89,0x5A,0x96,0x0E,0x0D,0x0C,0x0B,0x0A,0x09,\r
-                   0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00,0x1D,0x1C,0x1B,0x1A,0x19,0x18,\r
-                   0x17,0x15,0x15,0x14,0x13,0x12,0x11,0x10,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,\r
-                   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
-                   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0D,0x00\r
                };*/\r
          uint8_t config_info[] = {\r
                   0x65,0x02,0x05,0x00,0x03,0x20,0x0A,0x22,0x1E,0xE7,0x32,0x05,0x08,0x10,0x4C,\r
@@ -196,13 +182,13 @@ static int goodix_init_panel(struct rk_ts_data *ts)
        {\r
                dev_info(&ts->client->dev, "Read resolution & max_touch_num failed, use default value!\n");\r
                ts->max_touch_num = MAX_FINGER_NUM;\r
-               ts->int_trigger_type = INT_TRIGGER;\r
+               //ts->int_trigger_type = INT_TRIGGER;\r
                return 0;\r
        }\r
        ts->abs_x_max = (rd_cfg_buf[1]<<8) + rd_cfg_buf[2];\r
        ts->abs_y_max = (rd_cfg_buf[3]<<8) + rd_cfg_buf[4];\r
        ts->max_touch_num = rd_cfg_buf[5];\r
-       ts->int_trigger_type = rd_cfg_buf[6]&0x03;\r
+       //ts->int_trigger_type = rd_cfg_buf[6]&0x03;\r
        if((!ts->abs_x_max)||(!ts->abs_y_max)||(!ts->max_touch_num))\r
        {\r
                printk(KERN_INFO "Read invalid resolution & max_touch_num, use default value!\n");\r
@@ -210,8 +196,7 @@ static int goodix_init_panel(struct rk_ts_data *ts)
        }\r
 \r
        printk(KERN_INFO "X_MAX = %d,Y_MAX = %d,MAX_TOUCH_NUM = %d\n",ts->abs_x_max,ts->abs_y_max,ts->max_touch_num);\r
-       printk(KERN_INFO "int_trigger type is %d\n",rd_cfg_buf[6]);\r
-       //test\r
+       \r
        rd_cfg_buf[0] = 0x6e;\r
        rd_cfg_buf[1] = 0x00;\r
        goodix_i2c_read_bytes(ts->client, rd_cfg_buf, 2);\r
@@ -220,12 +205,32 @@ static int goodix_init_panel(struct rk_ts_data *ts)
                dev_info(&ts->client->dev, "Need int wake up from green mode!\n");\r
        }\r
 \r
-       //msleep(10);\r
-       printk("max_point:%d\n",ts->max_touch_num);\r
        return 0;\r
 \r
 }\r
 \r
+//fjp add ===============================\r
+static bool goodix_get_status(char *p1,int*p2)\r
+{\r
+       bool status = PEN_DOWN;\r
+       if((*p2==PEN_DOWN) && (*p1==PEN_RELEASE))\r
+               {\r
+                       *p2 = PEN_DOWN_UP; //¸Õ¸Õµ¯Æð\r
+                        status = PEN_RELEASE; \r
+               }\r
+       else if((*p2==PEN_RELEASE) && (*p1==PEN_RELEASE))\r
+               {\r
+                  *p2 = PEN_RELEASE;\r
+                       status = PEN_RELEASE; \r
+               }\r
+       else\r
+               {\r
+                       *p2 = PEN_DOWN;\r
+               }\r
+       return status;\r
+}\r
+\r
+//===================================\r
 /*******************************************************\r
 Description:\r
        Read goodix touchscreen version function.\r
@@ -268,7 +273,7 @@ static int  goodix_read_version(struct rk_ts_data *ts, char **version)
                return 1;       \r
 }\r
 \r
-static last_touch_num = -1;\r
+static int last_touch_num = -1;\r
 static void goodix_get_touch_info(struct rk_ts_data *ts,char *point_num,struct rk_touch_info* info_buf)\r
 {\r
        uint8_t  point_data[(1-READ_COOR_ADDR)+1+2+5*MAX_FINGER_NUM+1]={ 0 };  //read address(1byte)+key index(1byte)+point mask(2bytes)+5bytes*MAX_FINGER_NUM+coor checksum(1byte)\r
@@ -282,7 +287,7 @@ static void goodix_get_touch_info(struct rk_ts_data *ts,char *point_num,struct r
        unsigned int position = 0;      \r
        uint8_t track_id[MAX_FINGER_NUM] = {0};\r
        u8 index;\r
-       \r
+       u8 temp =0;\r
        point_data[0] = READ_COOR_ADDR;         //read coor address\r
 \r
        \r
@@ -290,12 +295,11 @@ static void goodix_get_touch_info(struct rk_ts_data *ts,char *point_num,struct r
        if(ret != 2)    \r
        {\r
            printk("goodix read error\n");\r
-               ts->bad_data = 1;\r
        }       \r
        finger_current =  (point_data[3 - READ_COOR_ADDR]<<8) + point_data[2 - READ_COOR_ADDR];\r
-       #ifdef fjp_debug\r
-       printk("finger_current:%d ==== max_touch_num:%d\n", finger_current,ts->max_touch_num);//add by fjp 2010-9-28\r
-       #endif\r
+       \r
+       DBG("finger_current:%d ==== max_touch_num:%d\n", finger_current,ts->max_touch_num);//add by fjp 2010-9-28\r
+       \r
 \r
        if(finger_current)\r
        {       \r
@@ -305,7 +309,7 @@ static void goodix_get_touch_info(struct rk_ts_data *ts,char *point_num,struct r
                {\r
                        if(finger_bit & 0x01)\r
                        {\r
-                               track_id[point_count] = count;\r
+                               track_id[count] = PEN_DOWN;\r
                                point_count++;\r
                        }\r
                        finger_bit >>= 1;\r
@@ -332,17 +336,21 @@ static void goodix_get_touch_info(struct rk_ts_data *ts,char *point_num,struct r
        if(touch_num < last_touch_num)  //some flinger release\r
        {\r
                //printk("%d flinger release\n",last_touch_num-touch_num);\r
-               for(index = touch_num; index < last_touch_num; index++)\r
-                       info_buf[index].status = 0;\r
+               /*for(index = touch_num; index < last_touch_num; index++)\r
+                       info_buf[index].status = 0;*/\r
                *point_num = last_touch_num;\r
+                touch_num = last_touch_num;\r
        }\r
        last_touch_num = touch_num;\r
        for(index = 0; index < touch_num; index++)\r
        {\r
-               position = 4 - READ_COOR_ADDR + 5*index;\r
+            if(goodix_get_status(&track_id[index],&info_buf[index].status))\r
+               {\r
+               position = 4 - READ_COOR_ADDR + 5*(temp++);\r
                info_buf[index].x = (unsigned int) (point_data[position]<<8) + (unsigned int)( point_data[position+1]);\r
                info_buf[index].y  = (unsigned int)(point_data[position+2]<<8) + (unsigned int) (point_data[position+3]);\r
-               info_buf[index].status = !gpio_get_value(ts->irq_pin);\r
+               info_buf[index].press = (unsigned int) (point_data[position+4]);        \r
+               }\r
        }\r
        \r
 }\r
@@ -358,31 +366,23 @@ Parameter:
 return:\r
        Executive outcomes.0---succeed.\r
 *******************************************************/\r
-static int  rk_ts_work_func(struct work_struct *pwork)\r
+static void  rk_ts_work_func(struct work_struct *pwork)\r
 {      \r
        int i =0;\r
-       struct rk_touch_info *info_buf;\r
+       //struct rk_touch_info *info_buf;\r
        char point_num;\r
-       \r
-       if(pwork==NULL)\r
-       {\r
-               printk(KERN_INFO "%s>>>>>>>>err:null pwork\n",__func__);\r
-               return -1;\r
-       }\r
-       \r
-       struct rk_ts_data *ts = container_of(pwork, struct rk_ts_data, ts_work);\r
+       struct rk_ts_data *ts = container_of(to_delayed_work(pwork), struct rk_ts_data, ts_work);\r
        if(!ts)\r
        {\r
                printk("container of rk_ts_data fail\n");\r
-               return -1;\r
        }\r
        \r
-       info_buf= kzalloc(ts->max_touch_num*sizeof(struct rk_touch_info), GFP_KERNEL);\r
-       if(!info_buf)\r
-       {\r
-               printk(KERN_ALERT "alloc for rk_touch_info fail\n");\r
-               return -1;\r
-       }\r
+//     info_buf= kzalloc(ts->max_touch_num*sizeof(struct rk_touch_info), GFP_KERNEL);\r
+//     if(!info_buf)\r
+       //{\r
+//             printk(KERN_ALERT "alloc for rk_touch_info fail\n");\r
+//             goto exit;\r
+       //}\r
 \r
        if(ts->get_touch_info)\r
        {\r
@@ -390,54 +390,78 @@ static int  rk_ts_work_func(struct work_struct *pwork)
        }\r
        for(i=0; i< point_num; i++)\r
        {\r
-               input_mt_slot(ts->input_dev, i);\r
-               input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, true);\r
-               input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, info_buf[i].status);\r
-               input_report_abs(ts->input_dev, ABS_MT_POSITION_X, info_buf[i].x);\r
-               input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, info_buf[i].y);      \r
-               #ifdef fjp_debug\r
-               printk("touch point %d %s >>x:%d>>y:%d\n",i,info_buf[i].status? "down":"up",info_buf[i].x,info_buf[i].y);//add by fjp 2010-9-28\r
-        #endif  \r
-               if(!info_buf[i].status)\r
+          DBG("info_buf[i].status =====%d\n",info_buf[i].status);\r
+             if(info_buf[i].status==PEN_DOWN_UP)\r
                {\r
+                      info_buf[i].status=PEN_RELEASE;\r
+                          DBG("the key %d is up------\n",i);\r
                        input_mt_slot(ts->input_dev, i);\r
                        input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, false);\r
+                       continue;\r
+               }\r
+               if(info_buf[i].status==PEN_DOWN)\r
+               {\r
+                       input_mt_slot(ts->input_dev, i);\r
+                       input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, true);\r
+                       input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, info_buf[i].press);\r
+                       input_report_abs(ts->input_dev, ABS_MT_POSITION_X, info_buf[i].x);\r
+                       input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, info_buf[i].y);\r
+                        DBG("touch point %d %d >>x:%d>>y:%d\n",i,info_buf[i].status,info_buf[i].x,info_buf[i].y);//add by fjp 2010-9-28        \r
                }\r
                \r
+       \r
+          \r
+               \r
+               \r
        }\r
        input_sync(ts->input_dev);\r
        \r
     if(gpio_get_value(ts->irq_pin) == GPIO_LOW)\r
     {\r
-        #ifdef fjp_debug\r
-               printk("touch down .............\n");//add by fjp 2010-9-28\r
-        #endif\r
-                  queue_delayed_work(ts->ts_wq, &ts->ts_work,msecs_to_jiffies(30));\r
-               goto exit;\r
+       \r
+        DBG("touch down .............\n");//add by fjp 2010-9-28\r
+               queue_delayed_work(ts->ts_wq, &ts->ts_work,msecs_to_jiffies(20));\r
+       //      goto exit;\r
                \r
     }\r
     else\r
     {\r
-               #ifdef fjp_debug\r
-               printk("touch up>>x:%d>>y:%d\n",info_buf[0].x,info_buf[0].y);//add by fjp 2010-9-28\r
-        #endif  \r
-               input_mt_slot(ts->input_dev, 0);\r
+               \r
+        DBG("touch up>>x:%d>>y:%d\n",info_buf[0].x,info_buf[0].y);//add by fjp 2010-9-28\r
+               /*input_mt_slot(ts->input_dev, 0);\r
                input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, true);\r
                input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0);\r
-               //input_report_abs(ts->input_dev, ABS_MT_POSITION_X, info_buf[0].x);\r
-               //input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, info_buf[0].y);\r
+               \r
                input_mt_slot(ts->input_dev, 0);\r
-               input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, false);\r
+               input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, false);*/\r
+\r
+               DBG("point_num+++++++++++ = %d\n", point_num);//add by fjp 2010-9-28\r
+               for(i=0; i< point_num; i++)\r
+               {\r
+       //        printk("info_buf[i].status +++++++%d\n",info_buf[i].status);\r
+                        if(info_buf[i].status)\r
+                       {\r
+                     input_mt_slot(ts->input_dev, i);//°´ÐòºÅÉϱ¨\r
+                       input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, false);               \r
+                       //input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0);\r
+                       info_buf[i].status= PEN_RELEASE;\r
+                       \r
+\r
+                       DBG("release+++++++++++ = %d\n", i);//add by fjp 2010-9-28\r
+\r
+                       }\r
+               }\r
                input_sync(ts->input_dev);\r
                ts->pendown =PEN_RELEASE;\r
+               last_touch_num = 0;\r
                \r
-                       \r
+       enable_irq(ts->irq);            \r
       }\r
          \r
-      enable_irq(ts->irq);\r
-exit:\r
-         kfree(info_buf);\r
-         return 0;\r
+      \r
+//exit:\r
+         //kfree(info_buf);\r
+         \r
   }\r
        \r
        \r
@@ -476,9 +500,6 @@ static irqreturn_t rk_ts_irq_handler(int irq, void *dev_id)
 {\r
 \r
        struct rk_ts_data *ts = (struct rk_ts_data*)dev_id;\r
-#ifdef fjp_debug\r
-       printk("entry goodix_ts_irq_handler irq:%d\n",ts->irq);//add by fjp 2010-9-28\r
-#endif\r
        disable_irq_nosync(ts->irq);\r
        queue_delayed_work(ts->ts_wq, &ts->ts_work,0);\r
        \r
@@ -569,7 +590,7 @@ static int goodix_ts_power(struct rk_ts_data * ts, int on)
                        ret = goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);\r
                        if(ret == 1)\r
                        {\r
-                               printk(KERN_INFO"Send suspend cmd\n");\r
+                               printk(KERN_INFO"touch goodix Send suspend cmd successed \n");\r
                                break;\r
                        }\r
                       retry++;\r
@@ -580,10 +601,10 @@ static int goodix_ts_power(struct rk_ts_data * ts, int on)
        }\r
        else if(on == 1)                //resume\r
        {\r
-               printk(KERN_INFO"Int resume\n");\r
-               gpio_set_value(RK29_PIN6_PC3,GPIO_LOW); \r
+               printk(KERN_INFO"touch goodix int resume\n");\r
+               gpio_set_value(ts->rst_pin,GPIO_LOW);   \r
                msleep(20);\r
-           gpio_set_value(RK29_PIN6_PC3,GPIO_HIGH);\r
+           gpio_set_value(ts->rst_pin,GPIO_HIGH);\r
                ret = 0;\r
        }        \r
        return ret;\r
@@ -604,11 +625,11 @@ static int goodix_input_params_init(struct rk_ts_data *ts)
        __set_bit(INPUT_PROP_DIRECT, ts->input_dev->propbit);\r
        __set_bit(EV_ABS, ts->input_dev->evbit);\r
 \r
-       input_mt_init_slots(ts->input_dev, MAX_SUPPORT_POINT);\r
+       input_mt_init_slots(ts->input_dev, ts->max_touch_num);\r
        input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);\r
        input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, ts->abs_x_max, 0, 0);\r
        input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, ts->abs_y_max, 0, 0);\r
-       sprintf(ts->phys, "input/ts");\r
+       sprintf(ts->phys, "input/rkts");\r
        ts->input_dev->name = rk_ts_name;\r
        ts->input_dev->phys = ts->phys;\r
        ts->input_dev->id.bustype = BUS_I2C;\r
@@ -621,7 +642,6 @@ static int goodix_input_params_init(struct rk_ts_data *ts)
                printk(KERN_ALERT "Probe: Unable to register %s input device\n", ts->input_dev->name);\r
                return -1;\r
        }\r
-       ts->bad_data = 0;\r
 \r
        return 0 ;\r
        \r
@@ -648,8 +668,7 @@ static int goodix_ts_init(struct rk_ts_data *ts)
        \r
        ret=goodix_init_panel(ts);\r
        if(ret != 0) {\r
-       printk("goodix panel init fail\n");\r
-               ts->bad_data=1;\r
+               printk("goodix panel init fail\n");\r
                return -1;\r
        }\r
        else\r
@@ -707,20 +726,19 @@ static int rk_ts_probe(struct i2c_client *client, const struct i2c_device_id *id
        {\r
                dev_err(&client->dev, "Must have I2C_FUNC_I2C.\n");\r
                ret = -ENODEV;\r
-               goto err_check_functionality_failed;\r
+               goto exit;\r
        }\r
 \r
        ts = kzalloc(sizeof(struct rk_ts_data), GFP_KERNEL);\r
        if (ts == NULL) {\r
                printk(KERN_ALERT "alloc for struct rk_ts_data fail\n");\r
                ret = -ENOMEM;\r
-               goto err_alloc_data_failed;\r
+               goto exit;\r
        }\r
 \r
        pdata = client->dev.platform_data;\r
-       ts->abs_x_max = TS_MAX_X;\r
-       ts->abs_y_max = TS_MAX_Y;\r
        ts->irq_pin = pdata->irq_pin;\r
+       ts->rst_pin = pdata->rest_pin;\r
        ts->pendown =PEN_RELEASE;\r
        ts->client = client;\r
        ts->ts_init = goodix_ts_init;   \r
@@ -741,7 +759,7 @@ static int rk_ts_probe(struct i2c_client *client, const struct i2c_device_id *id
                if(ret < 0)\r
                {\r
                        printk(KERN_ALERT "rk ts init fail\n");\r
-                       //return -1;\r
+                       goto exit;\r
                }\r
        }\r
 \r
@@ -768,9 +786,6 @@ static int rk_ts_probe(struct i2c_client *client, const struct i2c_device_id *id
        ts->early_suspend.resume = rk_ts_late_resume;\r
        register_early_suspend(&ts->early_suspend);\r
 #endif\r
-\r
-      \r
-\r
        \r
        ts->irq=gpio_to_irq(ts->irq_pin)        ;               //If not defined in client\r
        if (ts->irq)\r
@@ -779,7 +794,7 @@ static int rk_ts_probe(struct i2c_client *client, const struct i2c_device_id *id
                if (ret < 0) \r
                {\r
                        printk(KERN_ALERT "Failed to request for touch irq\n");\r
-                       goto err_gpio_request_failed;\r
+                       goto err_input_register_device_failed;\r
                }\r
                else\r
                {\r
@@ -790,41 +805,25 @@ static int rk_ts_probe(struct i2c_client *client, const struct i2c_device_id *id
                if (ret != 0) {\r
                        printk(KERN_ALERT "Cannot allocate ts INT!ERRNO:%d\n", ret);\r
                        gpio_free(INT_PORT);\r
-                       goto err_gpio_request_failed;\r
+                       goto err_input_register_device_failed;\r
                }\r
-               else \r
-               {       \r
-                       enable_irq(ts->irq);\r
-               \r
-               }       \r
        }\r
-       printk("Goodix TS probe successfully! max_x:%d>>max_y:%d>>max_support_point:%d\n",\r
-               ts->abs_x_max,ts->abs_y_max,ts->max_touch_num);\r
-       return 0;\r
-err_init_godix_ts:\r
-       if(ts->use_irq)\r
+\r
+       info_buf= kzalloc(ts->max_touch_num*sizeof(struct rk_touch_info), GFP_KERNEL);\r
+       if(!info_buf)\r
        {\r
-               ts->use_irq = 0;\r
-               free_irq(client->irq,ts);\r
-       #ifdef INT_PORT \r
-               gpio_direction_input(INT_PORT);\r
-               gpio_free(INT_PORT);\r
-       #endif  \r
+               printk(KERN_ALERT "alloc for rk_touch_info fail\n");\r
+               goto err_input_register_device_failed;\r
        }\r
-       else \r
-               hrtimer_cancel(&ts->timer);\r
+       printk("Goodix TS probe successfully!\n");\r
+       return 0;\r
 \r
-err_gpio_request_failed:       \r
+       \r
 err_input_register_device_failed:\r
        input_free_device(ts->input_dev);\r
-\r
-err_input_dev_alloc_failed:\r
-       i2c_set_clientdata(client, NULL);\r
-err_i2c_failed:        \r
+       i2c_set_clientdata(client, NULL);       \r
        kfree(ts);\r
-err_alloc_data_failed:\r
-err_check_functionality_failed:\r
-err_create_proc_entry:\r
+exit:\r
        return ret;\r
 }\r
 \r
@@ -848,18 +847,9 @@ static int rk_ts_remove(struct i2c_client *client)
 #ifdef CONFIG_TOUCHSCREEN_GOODIX_IAP\r
        remove_proc_entry("goodix-update", NULL);\r
 #endif\r
-       //goodix_debug_sysfs_deinit();\r
-       if (ts && ts->use_irq) \r
-       {\r
-       #ifdef INT_PORT\r
-               gpio_direction_input(INT_PORT);\r
-               gpio_free(INT_PORT);\r
-       #endif  \r
-               free_irq(client->irq, ts);\r
-       }       \r
-       else if(ts)\r
-               hrtimer_cancel(&ts->timer);\r
        \r
+       gpio_free(ts->irq_pin);\r
+       free_irq(ts->irq, ts);\r
        dev_notice(&client->dev,"The driver is removing...\n");\r
        i2c_set_clientdata(client, NULL);\r
        input_unregister_device(ts->input_dev);\r
@@ -1393,14 +1383,12 @@ rewrite:
                        {\r
                                printk(KERN_INFO"Disable TS int!\n");\r
                                g_enter_isp = 1;\r
-                               if(ts->use_irq)\r
                                        disable_irq(TS_INT);\r
                        }\r
                        else if(cmd[1] == CMD_ENABLE_TP)\r
                        {\r
                                printk(KERN_INFO"Enable TS int!\n");\r
                                g_enter_isp = 0;\r
-                               if(ts->use_irq)\r
                                        enable_irq(TS_INT);\r
                        }\r
                        else if(cmd[1] == CMD_READ_VER)\r
@@ -1619,6 +1607,43 @@ static struct i2c_driver rk_ts_driver = {
        },\r
 };\r
 \r
+\r
+static struct class *ts_debug_class = NULL;\r
+static ssize_t dbg_mode_show(struct class *cls,struct class_attribute *attr, char *_buf)\r
+{\r
+       printk("%s>>>>>>>>\n",__func__);\r
+       return 0;\r
+}\r
+\r
+static ssize_t dbg_mode_store(struct class *cls,struct class_attribute *attr, const char *buf, size_t _count)\r
+{\r
+       dbg_thresd = simple_strtol(buf,NULL,10);\r
+       if(dbg_thresd)\r
+       {\r
+               printk(KERN_INFO "ts debug open\n");\r
+       }\r
+       else\r
+       {\r
+               printk(KERN_INFO "ts debug close");\r
+       }\r
+      \r
+    return _count;\r
+}\r
+static CLASS_ATTR(debug, 0666, dbg_mode_show, dbg_mode_store);\r
+\r
+static int dbg_sys_init(void)\r
+{\r
+       int ret ;\r
+       ts_debug_class = class_create(THIS_MODULE, "ts_debug");\r
+       ret =  class_create_file(ts_debug_class, &class_attr_debug);\r
+    if (ret)\r
+    {\r
+       printk("Fail to creat class hkrkfb.\n");\r
+    }\r
+   return 0;\r
+}\r
+\r
+\r
 /*******************************************************       \r
 Description:\r
        Driver Install function.\r
@@ -1629,6 +1654,7 @@ static int __devinit rk_ts_init(void)
 {\r
        int ret ;\r
        ret=i2c_add_driver(&rk_ts_driver);\r
+       dbg_sys_init();  //for debug\r
        return ret; \r
 }\r
 \r