mutitouch support for goodix touch screen
authoryxj <yxj@rock-chips.com>
Sat, 19 Nov 2011 09:13:37 +0000 (17:13 +0800)
committeryxj <yxj@rock-chips.com>
Sat, 19 Nov 2011 09:13:37 +0000 (17:13 +0800)
arch/arm/mach-rk29/board-rk29-k97.c
arch/arm/mach-rk29/include/mach/board.h
drivers/input/touchscreen/rk29_i2c_goodix.c
drivers/input/touchscreen/rk29_i2c_goodix.h

index caccc0718a8080260bb2f35359f8d18103bde0a0..6356dd76144deee279b0b93baa5a2470a50b4ec4 100755 (executable)
@@ -743,6 +743,7 @@ int goodix_init_platform_hw(void)
 
 struct goodix_platform_data goodix_info = {
          .model= 8105,
+         .irq_pin = RK29_PIN0_PA2,
          .rest_pin  = TOUCH_RESET_PIN,
          .init_platform_hw = goodix_init_platform_hw,
 };
index 99953b5f61b2fe735777242c6592da4925481f1d..3fdad366bcd7d134367bda7f3e857a64e79bce01 100755 (executable)
@@ -276,6 +276,7 @@ struct ft5406_platform_data {
 struct goodix_platform_data {
        int model ;
        int rest_pin;
+       int irq_pin ;
     int     (*get_pendown_state)(void);
     int     (*init_platform_hw)(void);
     int     (*platform_sleep)(void);
index 329178ca605e10e4b264ed8230c447ac94e8cea6..61440836f141ef5d7b55ed9560170e3f7542f9b8 100755 (executable)
@@ -48,7 +48,7 @@
 #define PEN_DOWN 1\r
 #define PEN_RELEASE 0\r
 #define MAX_SUPPORT_POINT 2\r
-#define fjp_debug 1\r
+//#define fjp_debug 0\r
 \r
 //#define fjp_debug\r
 /*******************************************************       \r
@@ -66,7 +66,7 @@ Parameter:
 return:\r
        numbers of i2c_msgs to transfer\r
 *********************************************************/\r
-static int i2c_read_bytes(struct i2c_client *client, uint8_t *buf, int len)\r
+static int goodix_i2c_read_bytes(struct i2c_client *client, uint8_t *buf, int len)\r
 {\r
        struct i2c_msg msgs[2];\r
        int ret=-1;\r
@@ -86,14 +86,14 @@ static int i2c_read_bytes(struct i2c_client *client, uint8_t *buf, int len)
        msgs[1].udelay = client->udelay;\r
        msgs[1].scl_rate=200 * 1000;\r
 \r
-       disable_irq(client->irq);\r
+       //disable_irq(client->irq);\r
        while(retries<5)\r
        {\r
                ret=i2c_transfer(client->adapter,msgs, 2);\r
                if(ret == 2)break;\r
                retries++;\r
        }\r
-       enable_irq(client->irq);\r
+       //enable_irq(client->irq);\r
        return ret;\r
 }\r
 \r
@@ -110,7 +110,7 @@ Parameter:
 return:\r
        numbers of i2c_msgs to transfer.\r
 *********************************************************/\r
-static int i2c_write_bytes(struct i2c_client *client,uint8_t *data,int len)\r
+static int goodix_i2c_write_bytes(struct i2c_client *client,uint8_t *data,int len)\r
 {\r
        struct i2c_msg msg;\r
        int ret=-1;\r
@@ -123,14 +123,14 @@ static int i2c_write_bytes(struct i2c_client *client,uint8_t *data,int len)
        msg.udelay = client->udelay;\r
        msg.scl_rate=200 * 1000;\r
        \r
-       disable_irq(client->irq);\r
+       //disable_irq(client->irq);\r
        while(retries<5)\r
        {\r
                ret=i2c_transfer(client->adapter,&msg, 1);\r
                if(ret == 1)break;\r
                retries++;\r
        }\r
-       enable_irq(client->irq);\r
+       //enable_irq(client->irq);\r
        return ret;\r
 }\r
 \r
@@ -144,7 +144,7 @@ Parameter:
 return:\r
        Executive outcomes.0---succeed.\r
 *******************************************************/\r
-static int goodix_init_panel(struct goodix_ts_data *ts)\r
+static int goodix_init_panel(struct rk_ts_data *ts)\r
 {\r
        int ret=-1;\r
        uint8_t rd_cfg_buf[7] = {0x66,};\r
@@ -186,17 +186,15 @@ static int goodix_init_panel(struct goodix_ts_data *ts)
                                        0x00,0x00,0x00,0x00\r
                };\r
 #endif\r
-       ret=i2c_write_bytes(ts->client,config_info, (sizeof(config_info)/sizeof(config_info[0])));\r
+       ret=goodix_i2c_write_bytes(ts->client,config_info, (sizeof(config_info)/sizeof(config_info[0])));\r
        if (ret < 0) {\r
                printk("goodix write cfg info err");\r
                return ret;\r
        }\r
-       ret=i2c_read_bytes(ts->client, rd_cfg_buf, 7);\r
+       ret=goodix_i2c_read_bytes(ts->client, rd_cfg_buf, 7);\r
        if(ret != 2)\r
        {\r
                dev_info(&ts->client->dev, "Read resolution & max_touch_num failed, use default value!\n");\r
-               ts->abs_x_max = TOUCH_MAX_HEIGHT;\r
-               ts->abs_y_max = TOUCH_MAX_WIDTH;\r
                ts->max_touch_num = MAX_FINGER_NUM;\r
                ts->int_trigger_type = INT_TRIGGER;\r
                return 0;\r
@@ -207,24 +205,23 @@ static int goodix_init_panel(struct goodix_ts_data *ts)
        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
-               dev_info(&ts->client->dev, "Read invalid resolution & max_touch_num, use default value!\n");\r
-               ts->abs_x_max = TOUCH_MAX_HEIGHT;\r
-               ts->abs_y_max = TOUCH_MAX_WIDTH;\r
+               printk(KERN_INFO "Read invalid resolution & max_touch_num, use default value!\n");\r
                ts->max_touch_num = MAX_FINGER_NUM;\r
        }\r
 \r
-       dev_info(&ts->client->dev,"X_MAX = %d,Y_MAX = %d,MAX_TOUCH_NUM = %d\n",ts->abs_x_max,ts->abs_y_max,ts->max_touch_num);\r
-       dev_info(&ts->client->dev,"int_trigger type is %d\n",rd_cfg_buf[6]);\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
        rd_cfg_buf[0] = 0x6e;\r
        rd_cfg_buf[1] = 0x00;\r
-       i2c_read_bytes(ts->client, rd_cfg_buf, 2);\r
+       goodix_i2c_read_bytes(ts->client, rd_cfg_buf, 2);\r
        if((rd_cfg_buf[1]&0x0f)==0x0f)\r
        {\r
                dev_info(&ts->client->dev, "Need int wake up from green mode!\n");\r
        }\r
 \r
-       msleep(10);\r
+       //msleep(10);\r
+       printk("max_point:%d\n",ts->max_touch_num);\r
        return 0;\r
 \r
 }\r
@@ -239,12 +236,12 @@ Parameter:
 return:\r
        Executive outcomes.0---succeed.\r
 *******************************************************/\r
-static int  goodix_read_version(struct goodix_ts_data *ts, char **version)\r
+static int  goodix_read_version(struct rk_ts_data *ts, char **version)\r
 {\r
        int ret = -1, count = 0;\r
        char *version_data;\r
        char *p;\r
-       \r
+\r
        *version = (char *)vmalloc(18);\r
        version_data = *version;\r
        if(!version_data)\r
@@ -252,7 +249,7 @@ static int  goodix_read_version(struct goodix_ts_data *ts, char **version)
        p = version_data;\r
        memset(version_data, 0, sizeof(version_data));\r
        version_data[0]=240;    \r
-       ret=i2c_read_bytes(ts->client,version_data, 17);\r
+       ret=goodix_i2c_read_bytes(ts->client,version_data, 17);\r
        if (ret < 0) \r
                return ret;\r
        version_data[17]='\0';\r
@@ -270,137 +267,40 @@ static int  goodix_read_version(struct goodix_ts_data *ts, char **version)
        else \r
                return 1;       \r
 }\r
-unsigned int last_x = 0;\r
-unsigned int last_y = 0;\r
-\r
-\r
-/*******************************************************\r
-Description:\r
-       Goodix touchscreen work function.\r
 \r
-Parameter:\r
-       ts:     i2c client private struct.\r
-       \r
-return:\r
-       Executive outcomes.0---succeed.\r
-*******************************************************/\r
-static void goodix_ts_work_func(struct work_struct *pwork)\r
-{      \r
-       int ret=-1;\r
-       int tmp = 0;\r
+static 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
        uint8_t  check_sum = 0;\r
+       int ret ;\r
        uint16_t  finger_current = 0;\r
        uint16_t  finger_bit = 0;\r
        unsigned int  count = 0, point_count = 0;\r
-       unsigned int position = 0;      \r
-       uint8_t track_id[MAX_FINGER_NUM] = {0};\r
-       unsigned int input_x = 0;\r
-       unsigned int input_y = 0;\r
-       unsigned int input_w = 0;\r
-       unsigned int index = 0;\r
        unsigned char touch_num = 0;\r
        uint8_t chksum_err = 0;\r
+       unsigned int position = 0;      \r
+       uint8_t track_id[MAX_FINGER_NUM] = {0};\r
+       u8 index;\r
        \r
+       point_data[0] = READ_COOR_ADDR;         //read coor address\r
 \r
-\r
-       \r
-       struct goodix_ts_data *ts = container_of(pwork, struct goodix_ts_data, work);\r
-\r
-       //printk("enter the goodix_ts_timer_func!\n");\r
-//     if(g_enter_isp)return;\r
-#if defined(INT_PORT)\r
-COORDINATE_POLL:\r
-       if(gpio_get_value(INT_PORT) != GPIO_LOW)\r
-       {\r
-        #ifdef fjp_debug\r
-            printk("NO_ACTION--NO_ACTION--NO_ACTION\n"); //add by fjp 2010-9-28\r
-         #endif\r
-               goto NO_ACTION;\r
-       }       \r
-#endif \r
-\r
-\r
-       if( tmp > 9) {\r
-                printk("XFER_ERROR--XFER_ERROR--XFER_ERROR\n");\r
-               dev_info(&(ts->client->dev), "I2C transfer error,touchscreen stop working.\n");\r
-               goto XFER_ERROR ;\r
-       }\r
        \r
-       if(ts->bad_data)        \r
-               msleep(20);\r
-read_one_more_time:    \r
-       \r
-       //printk("prepare for I2C transfer!\n");\r
-       point_data[0] = READ_COOR_ADDR;         //read coor address\r
-       ret=i2c_read_bytes(ts->client, point_data, sizeof(point_data)/sizeof(point_data[0]));\r
+       ret=goodix_i2c_read_bytes(ts->client, point_data, sizeof(point_data)/sizeof(point_data[0]));\r
        if(ret != 2)    \r
        {\r
-              printk("I2C transfer error--I2C transfer error--I2C transfer error\n");\r
-               dev_err(&(ts->client->dev),"I2C transfer error. Number:%d\n ", ret);\r
+           printk("goodix read error\n");\r
                ts->bad_data = 1;\r
-               tmp ++;\r
-               ts->retry++;\r
-       #if defined(INT_PORT)\r
-               if(ts->int_trigger_type> 2)\r
-                       goto COORDINATE_POLL;\r
-               else\r
-                       goto XFER_ERROR;\r
-       #endif\r
        }       \r
-     /*  \r
-       for( i=0;i<sizeof(point_data)/sizeof(point_data[0]);i++)\r
-               {\r
-               printk("point_data[%d] ===%d\n", i,point_data[i]);\r
-               }*/\r
-       ts->bad_data = 0; \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\n", finger_current);//add by fjp 2010-9-28\r
-       #endif\r
-       //===add by fjp===============\r
-      /*  if(0x200&finger_current)\r
-                current_num =0xa;\r
-       else if(0x100&finger_current)\r
-                current_num =0x9;\r
-       else if (0x80&finger_current)\r
-                current_num =0x8;\r
-       else if (0x40&finger_current)\r
-                current_num =0x7;\r
-       else if (0x20&finger_current)\r
-                current_num =0x6;\r
-       else if (0x10&finger_current)\r
-                current_num =0x5;\r
-       else if (0x8&finger_current)\r
-                current_num =0x4;\r
-       else if (0x4&finger_current)\r
-                current_num =0x3;\r
-       else if (0x2&finger_current)\r
-                current_num =0x2;\r
-       else if (0x1&finger_current)\r
-                current_num =0x1;\r
-       #ifdef fjp_debug\r
-       printk("current_num ====%d\n", current_num);\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
-       point_data[0] = READ_COOR_ADDR;\r
-       ret=i2c_read_bytes(ts->client, point_data,  ((1-READ_COOR_ADDR)+1+2+5*current_num+1));\r
-       if(ret != 2)    \r
-       {\r
-            #ifdef fjp_debug\r
-               printk("I2C transfer error--I2C transfer error--I2C transfer error\n");\r
-            #endif     \r
-               dev_err(&(ts->client->dev),"I2C transfer error. Number:%d\n ", ret);\r
-               ts->bad_data = 1;\r
-               tmp ++;\r
-               ts->retry++;\r
-               goto XFER_ERROR;\r
-       \r
-       }       \r
-       ts->bad_data = 0; */\r
-       //==================================\r
+\r
        if(finger_current)\r
        {       \r
-               point_count = 0, finger_bit = finger_current;\r
+               point_count = 0;\r
+               finger_bit = finger_current;\r
                for(count = 0; (finger_bit != 0) && (count < ts->max_touch_num); count++)//cal how many point touch currntly\r
                {\r
                        if(finger_bit & 0x01)\r
@@ -419,27 +319,7 @@ read_one_more_time:
                check_sum += point_data[count];\r
                if(check_sum  != 0)                     //checksum verify error\r
                {\r
-               #if 0   \r
-                       dev_info(&ts->client->dev, "Check_sum:%d,  Data:%d\n", check_sum, point_data[count]);   \r
-                       printk(KERN_INFO "Finger Bit:%d\n",finger_current);\r
-                       for( ; count > 0; count--)\r
-                               printk(KERN_INFO "count=%d:%d  ",count, point_data[count]);\r
-                       printk(KERN_INFO "\n");\r
-               #endif\r
-               #ifdef fjp_debug\r
                        printk("coor checksum error!\n");\r
-               #endif\r
-               if(!chksum_err)\r
-               {\r
-                       chksum_err = 1;\r
-                       goto read_one_more_time;\r
-               }\r
-               #if defined(INT_PORT)\r
-                       if(ts->int_trigger_type> 2)\r
-                               goto COORDINATE_POLL;\r
-                       else    \r
-                               goto XFER_ERROR;\r
-               #endif\r
                }\r
                else\r
                {\r
@@ -447,113 +327,121 @@ read_one_more_time:
                }\r
        }\r
 \r
-       if(touch_num)\r
+       //printk("current point num:%d\n",touch_num);\r
+       *point_num = touch_num;\r
+       if(touch_num < last_touch_num)  //some flinger release\r
        {\r
-               for(index=0; index<touch_num; index++)\r
-               {\r
-                       position = 4 - READ_COOR_ADDR + 5*index;\r
-                       input_x = (unsigned int) (point_data[position]<<8) + (unsigned int)( point_data[position+1]);\r
-                       input_y = (unsigned int)(point_data[position+2]<<8) + (unsigned int) (point_data[position+3]);\r
-                       input_w =(unsigned int) (point_data[position+4]);       \r
-                       #ifdef fjp_debug\r
-                       printk("input_x = %d,input_y = %d,input_w=%d, index = %d,touch number:%d\n", (input_x), input_y, input_w,index,touch_num);//add by fjp 2010-9-28\r
-                       #endif\r
-                       last_x = input_x;\r
-                       last_y = input_y;\r
-                       if((input_x > ts->abs_x_max)||(input_y > ts->abs_y_max))\r
-                               continue;\r
-\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, 1);\r
-                       //input_report_abs(ts->input_dev, ABS_MT_PRESSURE, 100);\r
-                       input_report_abs(ts->input_dev, ABS_MT_POSITION_X, input_x);\r
-                       input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, input_y);                    \r
-                       \r
-                       //input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, input_w);\r
-                       //input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, track_id[index]);\r
-                       //input_mt_sync(ts->input_dev);\r
-               \r
-               \r
-               }\r
-                ts->pendown =PEN_DOWN;\r
-                input_sync(ts->input_dev);\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
+               *point_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
+               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
        }\r
        \r
+}\r
 \r
-       #ifdef HAVE_TOUCH_KEY\r
-       //printk(KERN_INFO"HAVE KEY DOWN!0x%x\n",point_data[1]);\r
-       for(count = 0; count < MAX_KEY_NUM; count++)\r
+\r
+/*******************************************************\r
+Description:\r
+       Goodix touchscreen work function.\r
+\r
+Parameter:\r
+       ts:     i2c client private struct.\r
+       \r
+return:\r
+       Executive outcomes.0---succeed.\r
+*******************************************************/\r
+static int  rk_ts_work_func(struct work_struct *pwork)\r
+{      \r
+       int i =0;\r
+       struct rk_touch_info *info_buf;\r
+       char point_num;\r
+       \r
+       if(pwork==NULL)\r
        {\r
-               input_report_key(ts->input_dev, touch_key_array[count], !!(point_data[1]&(0x01<<count)));       \r
-       }          \r
-       #endif\r
+               printk(KERN_INFO "%s>>>>>>>>err:null pwork\n",__func__);\r
+               return -1;\r
+       }\r
        \r
-\r
-#if defined(INT_PORT)\r
-       if(ts->int_trigger_type> 2)\r
+       struct rk_ts_data *ts = container_of(pwork, struct rk_ts_data, ts_work);\r
+       if(!ts)\r
        {\r
-               msleep(POLL_TIME);\r
-               goto COORDINATE_POLL;\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
-#endif\r
-       goto END_WORK_FUNC;\r
-\r
-NO_ACTION:     \r
 \r
-#ifdef HAVE_TOUCH_KEY\r
-       //printk(KERN_INFO"HAVE KEY DOWN!0x%x\n",point_data[1]);\r
-       for(count = 0; count < MAX_KEY_NUM; count++)\r
+       if(ts->get_touch_info)\r
        {\r
-               input_report_key(ts->input_dev, touch_key_array[count], !!(point_data[1]&(0x01<<count)));       \r
+                ts->get_touch_info(ts,&point_num,info_buf);\r
        }\r
-       input_sync(ts->input_dev);         \r
-#endif\r
-END_WORK_FUNC:\r
-XFER_ERROR:\r
-       //=========add by fjp send last up touchkey==============\r
-     if(gpio_get_value(INT_PORT) == GPIO_LOW)\r
-     {\r
-          #ifdef fjp_debug\r
-          printk("touch down .............\n");//add by fjp 2010-9-28\r
-          #endif\r
-                  queue_delayed_work(goodix_wq, &ts->work,msecs_to_jiffies(30));\r
-     }\r
-     else\r
-      {\r
-           if((ts->pendown))\r
-           {\r
-                       #if 0\r
-               input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0);\r
-               input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0);\r
-               input_mt_sync(ts->input_dev);\r
-               input_sync(ts->input_dev);\r
-               #ifdef fjp_debug\r
-               printk("touch finish finsih\n");//add by fjp 2010-9-28\r
-               #endif  \r
-                        #else\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_PRESSURE, 100);\r
-                               input_report_abs(ts->input_dev, ABS_MT_POSITION_X, last_x);\r
-                               input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, last_y);\r
-                               input_mt_slot(ts->input_dev, 0);\r
-                               input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, false);\r
-                               input_sync(ts->input_dev);\r
-                               ts->pendown =PEN_RELEASE;\r
-                               #ifdef fjp_debug\r
-                               printk("touch up>>x:%d>>y:%d\n",last_x,last_y);//add by fjp 2010-9-28\r
-                       #endif  \r
-                        #endif\r
-           }\r
-           if(ts->use_irq)\r
-               enable_irq(ts->client->irq);\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
+               {\r
+                       input_mt_slot(ts->input_dev, i);\r
+                       input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, false);\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
+    }\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
+               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
+               input_mt_slot(ts->input_dev, 0);\r
+               input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, false);\r
+               input_sync(ts->input_dev);\r
+               ts->pendown =PEN_RELEASE;\r
+               \r
+                       \r
       }\r
+         \r
+      enable_irq(ts->irq);\r
+exit:\r
+         kfree(info_buf);\r
+         return 0;\r
+  }\r
+       \r
        \r
-       //============================================\r
        \r
-}\r
 \r
 /*******************************************************\r
 Description:\r
@@ -567,9 +455,8 @@ return:
 *******************************************************/\r
 static enum hrtimer_restart goodix_ts_timer_func(struct hrtimer *timer)\r
 {\r
-       struct goodix_ts_data *ts = container_of(timer, struct goodix_ts_data, timer);\r
-       //queue_work(goodix_wq, &ts->work);\r
-       queue_delayed_work(goodix_wq,&ts->work,0);\r
+       struct rk_ts_data *ts = container_of(timer, struct rk_ts_data, timer);\r
+       queue_delayed_work(goodix_wq,&ts->ts_work,0);\r
        hrtimer_start(&ts->timer, ktime_set(0, (POLL_TIME+6)*1000000), HRTIMER_MODE_REL);\r
        return HRTIMER_NORESTART;\r
 }\r
@@ -585,19 +472,78 @@ Parameter:
 return:\r
        irq execute status.\r
 *******************************************************/\r
-static irqreturn_t goodix_ts_irq_handler(int irq, void *dev_id)\r
+static irqreturn_t rk_ts_irq_handler(int irq, void *dev_id)\r
 {\r
 \r
-       struct goodix_ts_data *ts = dev_id;\r
+       struct rk_ts_data *ts = (struct rk_ts_data*)dev_id;\r
 #ifdef fjp_debug\r
-  printk("entry goodix_ts_irq_handler\n");//add by fjp 2010-9-28\r
-  #endif\r
-       disable_irq_nosync(ts->client->irq);\r
-       queue_delayed_work(goodix_wq, &ts->work,0);\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
        return IRQ_HANDLED;\r
 }\r
 \r
+static int rk_ts_suspend(struct i2c_client *client, pm_message_t mesg)\r
+{\r
+       int ret;\r
+       struct rk_ts_data *ts = i2c_get_clientdata(client);\r
+\r
+       \r
+       if (ts->use_irq)\r
+               disable_irq(client->irq);\r
+       else\r
+               hrtimer_cancel(&ts->timer);\r
+#if 1\r
+       if (ts->power) {\r
+               ret = ts->power(ts, 0);\r
+               if (ret < 0)\r
+                       printk(KERN_ERR "goodix_ts_resume power off failed\n");\r
+       }\r
+#endif\r
+       return 0;\r
+}\r
+\r
+static int rk_ts_resume(struct i2c_client *client)\r
+{\r
+       int ret;\r
+       struct rk_ts_data *ts = i2c_get_clientdata(client);\r
+       \r
+#if 1\r
+       if (ts->power) {\r
+               ret = ts->power(ts, 1);\r
+               if (ret < 0)\r
+                       printk(KERN_ERR "goodix_ts_resume power on failed\n");\r
+       }\r
+#endif\r
+       if (ts->use_irq)\r
+               enable_irq(client->irq);\r
+       else\r
+               hrtimer_start(&ts->timer, ktime_set(1, 0), HRTIMER_MODE_REL);\r
+       //gpio_set_value(RK29_PIN6_PC3,GPIO_HIGH);\r
+\r
+       return 0;\r
+}\r
+\r
+\r
+\r
+#ifdef CONFIG_HAS_EARLYSUSPEND\r
+static void rk_ts_early_suspend(struct early_suspend *h)\r
+{\r
+       struct rk_ts_data *ts;\r
+       ts = container_of(h, struct rk_ts_data, early_suspend);\r
+       rk_ts_suspend(ts->client, PMSG_SUSPEND);\r
+}\r
+\r
+static void rk_ts_late_resume(struct early_suspend *h)\r
+{\r
+       struct rk_ts_data *ts;\r
+       ts = container_of(h, struct rk_ts_data, early_suspend);\r
+       rk_ts_resume(ts->client);\r
+}\r
+#endif\r
+\r
 /*******************************************************\r
 Description:\r
        Goodix touchscreen power manage function.\r
@@ -608,14 +554,14 @@ Parameter:
 return:\r
        Executive outcomes.-1---i2c transfer error;0---succeed.\r
 *******************************************************/\r
-static int goodix_ts_power(struct goodix_ts_data * ts, int on)\r
+static int goodix_ts_power(struct rk_ts_data * ts, int on)\r
 {\r
        int ret = -1;\r
        unsigned char i2c_control_buf[2] = {80,  1};            //suspend cmd\r
        int retry = 0;\r
        if(on != 0 && on !=1)\r
        {\r
-               printk(KERN_DEBUG "%s: Cant't support this command.", goodix_ts_name);\r
+               printk(KERN_DEBUG "%s: Cant't support this command.", rk_ts_name);\r
                return -EINVAL;\r
        }\r
        \r
@@ -624,9 +570,9 @@ static int goodix_ts_power(struct goodix_ts_data * ts, int on)
        \r
        if(on == 0)             //suspend\r
        { \r
-              while(retry<5)\r
+        while(retry<5)\r
                {\r
-                       ret = i2c_write_bytes(ts->client, i2c_control_buf, 2);\r
+                       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
@@ -649,229 +595,102 @@ static int goodix_ts_power(struct goodix_ts_data * ts, int on)
        return ret;\r
 }\r
 \r
-#if 0\r
-/*******************************************************\r
-Description:\r
-       Goodix debug sysfs cat version function.\r
 \r
-Parameter:\r
-       standard sysfs show param.\r
-       \r
-return:\r
-       Executive outcomes. 0---failed.\r
-*******************************************************/\r
-static ssize_t goodix_debug_version_show(struct device *dev,\r
-               struct device_attribute *attr, char *buf)\r
+static int goodix_input_params_init(struct rk_ts_data *ts)\r
 {\r
-       int ret = 0;\r
-       char *version_info = NULL;\r
-       struct goodix_ts_data *ts;\r
-       \r
-       ts = i2c_get_clientdata(i2c_connect_client);\r
-       if(ts==NULL)\r
-               return 0;\r
-       \r
-       ret = goodix_read_version(ts, &version_info);\r
-       if(ret <= 0)\r
-       {\r
-               printk(KERN_INFO"Read version data failed!\n");\r
-               vfree(version_info);\r
-               return 0;\r
+       int ret ;\r
+       ts->input_dev = input_allocate_device();\r
+       if (ts->input_dev == NULL) {\r
+               ret = -ENOMEM;\r
+               printk(KERN_ALERT "Failed to allocate input device\n");\r
+               return ret;\r
        }\r
 \r
-       printk(KERN_INFO"Goodix TouchScreen Version:%s\n", (version_info+1));\r
-       sprintf(buf,"Goodix TouchScreen Version:%s\n",(version_info+1));\r
-       vfree(version_info);\r
-       ret = strlen(buf);\r
-       return ret;\r
-}\r
 \r
-/*******************************************************\r
-Description:\r
-       Goodix debug sysfs cat resolution function.\r
+       __set_bit(INPUT_PROP_DIRECT, ts->input_dev->propbit);\r
+       __set_bit(EV_ABS, ts->input_dev->evbit);\r
 \r
-Parameter:\r
-       standard sysfs show param.\r
+       input_mt_init_slots(ts->input_dev, MAX_SUPPORT_POINT);\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
+       ts->input_dev->name = rk_ts_name;\r
+       ts->input_dev->phys = ts->phys;\r
+       ts->input_dev->id.bustype = BUS_I2C;\r
+       ts->input_dev->id.vendor = 0xDEAD;\r
+       ts->input_dev->id.product = 0xBEEF;\r
+       ts->input_dev->id.version = 10427;      //screen firmware version\r
        \r
-return:\r
-       Executive outcomes. 0---failed.\r
-*******************************************************/\r
-static ssize_t goodix_debug_resolution_show(struct device *dev,\r
-               struct device_attribute *attr, char *buf)\r
-{\r
-       struct goodix_ts_data *ts;\r
-       ts = i2c_get_clientdata(i2c_connect_client);\r
-       dev_info(&ts->client->dev,"ABS_X_MAX = %d,ABS_Y_MAX = %d\n",ts->abs_x_max,ts->abs_y_max);\r
-       sprintf(buf,"ABS_X_MAX = %d,ABS_Y_MAX = %d\n",ts->abs_x_max,ts->abs_y_max);\r
+       ret = input_register_device(ts->input_dev);\r
+       if (ret) {\r
+               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 strlen(buf);\r
+       return 0 ;\r
+       \r
 }\r
-/*******************************************************\r
-Description:\r
-       Goodix debug sysfs cat version function.\r
-\r
-Parameter:\r
-       standard sysfs show param.\r
        \r
-return:\r
-       Executive outcomes. 0---failed.\r
-*******************************************************/\r
-static ssize_t goodix_debug_diffdata_show(struct device *dev,\r
-                       struct device_attribute *attr, char *buf)\r
+static int goodix_ts_init(struct rk_ts_data *ts)\r
 {\r
-       //char diff_data[300];\r
-       unsigned char diff_data[2241] = {00,};\r
-       int ret = -1;\r
-       char diff_data_cmd[2] = {80, 202};\r
-       int i;\r
-       int short_tmp;\r
-       struct goodix_ts_data *ts;\r
-\r
-       disable_irq(TS_INT);\r
-       \r
-       ts = i2c_get_clientdata(i2c_connect_client);\r
-       //memset(diff_data, 0, sizeof(diff_data));\r
-       ret = i2c_write_bytes(ts->client, diff_data_cmd, 2);\r
-       if(ret != 1)\r
+       char retry;\r
+       char ret ;\r
+       char test_data = 1;\r
+       char *version_info = NULL;\r
+       for(retry=0;retry < 30; retry++)    //test goodix\r
        {\r
-               dev_info(&ts->client->dev, "Write diff data cmd failed!\n");\r
-               enable_irq(TS_INT);\r
-               return 0;\r
+               ret =goodix_i2c_write_bytes(ts->client, &test_data, 1);\r
+               if (ret > 0)\r
+                       break;\r
        }\r
-\r
-       while(gpio_get_value(INT_PORT));\r
-       ret = i2c_read_bytes(ts->client, diff_data, sizeof(diff_data));\r
-       if(ret != 2)\r
+       if(ret <= 0)\r
        {\r
-               dev_info(&ts->client->dev, "Read diff data failed!\n");\r
-               enable_irq(TS_INT);\r
-               return 0;\r
+               printk(KERN_INFO "I2C communication ERROR!Goodix touchscreen driver become invalid\n");\r
+               return -1;\r
+       }       \r
+       \r
+       \r
+       ret=goodix_init_panel(ts);\r
+       if(ret != 0) {\r
+       printk("goodix panel init fail\n");\r
+               ts->bad_data=1;\r
+               return -1;\r
        }\r
-       for(i=1; i<sizeof(diff_data); i+=2)\r
+       else\r
        {\r
-               short_tmp = diff_data[i] + (diff_data[i+1]<<8);\r
-               if(short_tmp&0x8000)\r
-                       short_tmp -= 65535;\r
-               if(short_tmp == 512)continue;\r
-               sprintf(buf+strlen(buf)," %d",short_tmp);\r
-               //printk(" %d\n", short_tmp);\r
+               printk(KERN_INFO "%s>>>>>>>max_point %d\n",__func__,ts->max_touch_num);\r
        }\r
-       \r
-       diff_data_cmd[1] = 0;\r
-       ret = i2c_write_bytes(ts->client, diff_data_cmd, 2);\r
-       if(ret != 1)\r
+       ret = goodix_read_version(ts, &version_info);\r
+       if(ret <= 0)\r
        {\r
-               dev_info(&ts->client->dev, "Write diff data cmd failed!\n");\r
-               enable_irq(TS_INT);\r
-               return 0;\r
+               printk(KERN_INFO"Read version data failed!\n");\r
        }\r
-       enable_irq(TS_INT);\r
-       /*for (i=0; i<1024; i++)\r
-       {\r
-               sprintf(buf+strlen(buf)," %d",i);\r
-       }*/\r
-       \r
-       return strlen(buf);\r
-}\r
-\r
-\r
-/*******************************************************\r
-Description:\r
-       Goodix debug sysfs echo calibration function.\r
-\r
-Parameter:\r
-       standard sysfs store param.\r
-       \r
-return:\r
-       Executive outcomes..\r
-*******************************************************/\r
-static ssize_t goodix_debug_calibration_store(struct device *dev,\r
-                       struct device_attribute *attr, const char *buf, ssize_t count)\r
-{\r
-       int ret = -1;\r
-       char cal_cmd_buf[] = {110,1};\r
-       struct goodix_ts_data *ts;\r
-\r
-       ts = i2c_get_clientdata(i2c_connect_client);\r
-       dev_info(&ts->client->dev,"Begin calibration......\n");\r
-       if((*buf == 10)||(*buf == 49))\r
+       else\r
        {\r
-               ret = i2c_write_bytes(ts->client,cal_cmd_buf,2);\r
-               if(ret!=1)\r
-               {\r
-                       dev_info(&ts->client->dev,"Calibration failed!\n");\r
-                       return count;\r
-               }\r
-               else\r
-               {\r
-                       dev_info(&ts->client->dev,"Calibration succeed!\n");\r
-               }\r
+               printk(KERN_INFO"Goodix TouchScreen Version:%s>>>max_point:%d\n", (version_info+1),ts->max_touch_num);\r
        }\r
-       return count;\r
-}\r
-\r
-static DEVICE_ATTR(version, S_IRUGO, goodix_debug_version_show, NULL);\r
-static DEVICE_ATTR(resolution, S_IRUGO, goodix_debug_resolution_show, NULL);\r
-static DEVICE_ATTR(diffdata, S_IRUGO, goodix_debug_diffdata_show, NULL);\r
-static DEVICE_ATTR(calibration, S_IWUSR , NULL, goodix_debug_calibration_store); \r
-\r
-\r
-/*******************************************************\r
-Description:\r
-       Goodix debug sysfs init function.\r
-\r
-Parameter:\r
-       none.\r
-       \r
-return:\r
-       Executive outcomes. 0---succeed.\r
-*******************************************************/\r
-static int goodix_debug_sysfs_init(void)\r
-{\r
-       int ret ;\r
-       struct goodix_ts_data *ts;\r
-       ts = i2c_get_clientdata(i2c_connect_client);\r
-\r
-       goodix_debug_kobj = kobject_create_and_add("goodix_debug", NULL) ;\r
-       if (goodix_debug_kobj == NULL) {\r
-               printk(KERN_ERR "%s: subsystem_register failed\n", __func__);\r
+       vfree(version_info);\r
+       #ifdef CONFIG_TOUCHSCREEN_GOODIX_IAP\r
+       goodix_proc_entry = create_proc_entry("goodix-update", 0666, NULL);\r
+       if(goodix_proc_entry == NULL)\r
+       {\r
+               printk("Couldn't create proc entry!\n");\r
                ret = -ENOMEM;\r
-               return ret;\r
-       }\r
-       ret = sysfs_create_file(goodix_debug_kobj, &dev_attr_version.attr);\r
-       if (ret) {\r
-               printk(KERN_ERR "%s: sysfs_create_version_file failed\n", __func__);\r
-               return ret;\r
-       }\r
-       ret = sysfs_create_file(goodix_debug_kobj, &dev_attr_calibration.attr);\r
-       if (ret) {\r
-               printk(KERN_ERR "%s: sysfs_create_calibration_file failed\n", __func__);\r
-               return ret;\r
+               return ret ;\r
        }\r
-       ret = sysfs_create_file(goodix_debug_kobj, &dev_attr_diffdata.attr);\r
-       if (ret) \r
+       else\r
        {\r
-               printk(KERN_ERR "%s: sysfs_create_diffdata_file failed\n", __func__);\r
-               return ret;\r
-       }\r
-       ret = sysfs_create_file(goodix_debug_kobj, &dev_attr_resolution.attr);\r
-       if (ret) {\r
-               printk(KERN_ERR "%s: sysfs_create_resolution_file failed\n", __func__);\r
-               return ret;\r
+               printk("Create proc entry success!\n");\r
+               goodix_proc_entry->write_proc = goodix_update_write;\r
+               goodix_proc_entry->read_proc = goodix_update_read;\r
+               //goodix_proc_entry->owner = THIS_MODULE;\r
        }\r
-       dev_info(&ts->client->dev,"Goodix debug sysfs create success!\n");\r
-       return 0 ;\r
-}\r
+#endif\r
 \r
-static void goodix_debug_sysfs_deinit(void)\r
-{\r
-       sysfs_remove_file(goodix_debug_kobj, &dev_attr_version.attr);\r
-       sysfs_remove_file(goodix_debug_kobj, &dev_attr_resolution.attr);\r
-       sysfs_remove_file(goodix_debug_kobj, &dev_attr_diffdata.attr);\r
-       sysfs_remove_file(goodix_debug_kobj, &dev_attr_calibration.attr);\r
-       kobject_del(goodix_debug_kobj);\r
+       return 0;\r
 }\r
-#endif\r
 /*******************************************************\r
 Description:\r
        Goodix touchscreen probe function.\r
@@ -883,18 +702,13 @@ Parameter:
 return:\r
        Executive outcomes. 0---succeed.\r
 *******************************************************/\r
-static int goodix_ts_probe(struct i2c_client *client, const struct i2c_device_id *id)\r
+static int rk_ts_probe(struct i2c_client *client, const struct i2c_device_id *id)\r
 {\r
        int ret = 0;\r
-       int retry=0;\r
-       struct goodix_ts_data *ts;\r
-       char *version_info = NULL;\r
-       char test_data = 1;\r
+       struct rk_ts_data *ts;\r
+       struct goodix_platform_data *pdata ;\r
        \r
-       struct goodix_platform_data *pdata = pdata = client->dev.platform_data;\r
-       dev_dbg(&client->dev,"Install touch driver.\n");\r
-\r
-\r
+       printk(KERN_INFO "Install touch driver.\n");\r
        if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) \r
        {\r
                dev_err(&client->dev, "Must have I2C_FUNC_I2C.\n");\r
@@ -902,191 +716,96 @@ static int goodix_ts_probe(struct i2c_client *client, const struct i2c_device_id
                goto err_check_functionality_failed;\r
        }\r
 \r
-       ts = kzalloc(sizeof(*ts), GFP_KERNEL);\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
        }\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->pendown =PEN_RELEASE;\r
+       ts->client = client;\r
+       ts->ts_init = goodix_ts_init;   \r
+       ts->power = goodix_ts_power;\r
+       ts->get_touch_info = goodix_get_touch_info;\r
+       ts->input_parms_init = goodix_input_params_init;\r
+       i2c_set_clientdata(client, ts);\r
+       \r
+\r
        if (pdata->init_platform_hw)\r
        {\r
                pdata->init_platform_hw();\r
        }\r
 \r
-       i2c_connect_client = client;\r
-       for(retry=0;retry < 30; retry++)\r
+       if(ts->ts_init)\r
        {\r
-               ret =i2c_write_bytes(client, &test_data, 1);\r
-               if (ret > 0)\r
-                       break;\r
-               printk("GOODiX i2c test failed!\n");\r
+               ret = ts->ts_init(ts);\r
+               if(ret < 0)\r
+               {\r
+                       printk(KERN_ALERT "rk ts init fail\n");\r
+                       //return -1;\r
+               }\r
        }\r
 \r
-       if(ret <= 0)\r
+       if(ts->input_parms_init)\r
        {\r
-               dev_err(&client->dev, "I2C communication ERROR!Goodix touchscreen driver become invalid\n");\r
-               goto err_i2c_failed;\r
-       }       \r
-       \r
-       INIT_DELAYED_WORK(&ts->work, goodix_ts_work_func);\r
-       ts->client = client;\r
-       i2c_set_clientdata(client, ts);\r
-       pdata = client->dev.platform_data;\r
-       \r
-       ts->input_dev = input_allocate_device();\r
-       if (ts->input_dev == NULL) {\r
-               ret = -ENOMEM;\r
-               dev_dbg(&client->dev,"Failed to allocate input device\n");\r
-               goto err_input_dev_alloc_failed;\r
-       }\r
-#if 1  \r
-       for(retry=0; retry<3; retry++)\r
-       {\r
-               ret=goodix_init_panel(ts);\r
-               msleep(2);\r
-               if(ret != 0)\r
-                       continue;\r
-               else\r
-                       break;\r
-       }\r
-       if(ret != 0) {\r
-               ts->bad_data=1;\r
-               goto err_init_godix_ts;\r
+               ts->input_parms_init(ts);\r
        }\r
 \r
-#endif\r
-       __set_bit(INPUT_PROP_DIRECT, ts->input_dev->propbit);\r
-       __set_bit(EV_ABS, ts->input_dev->evbit);\r
-\r
-       //ts->input_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) ;\r
-       //ts->input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);\r
-       //ts->input_dev->absbit[0] = BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE);                                               // absolute coor (x,y)\r
-#if 0\r
-#ifdef HAVE_TOUCH_KEY\r
-       for(retry = 0; retry < MAX_KEY_NUM; retry++)\r
-       {\r
-               input_set_capability(ts->input_dev,EV_KEY,touch_key_array[retry]);      \r
+       i2c_connect_client = client;\r
+       #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,32)\r
+               ts->ts_wq= create_rt_workqueue("rk_ts_wq");             //create a work queue and worker thread\r
+       #else\r
+               ts->ts_wq= create_workqueue("rk_ts_wq"); \r
+       #endif\r
+       if (!ts->ts_wq){\r
+               printk(KERN_ALERT "creat touch screen workqueue failed\n");\r
+           return -ENOMEM;\r
        }\r
-#endif\r
+       \r
+       INIT_DELAYED_WORK(&ts->ts_work, rk_ts_work_func);\r
+#ifdef CONFIG_HAS_EARLYSUSPEND\r
+       ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;\r
+       ts->early_suspend.suspend = rk_ts_early_suspend;\r
+       ts->early_suspend.resume = rk_ts_late_resume;\r
+       register_early_suspend(&ts->early_suspend);\r
 #endif\r
 \r
-       //input_set_abs_params(ts->input_dev, ABS_X, 0, ts->abs_x_max, 0, 0);\r
-       //input_set_abs_params(ts->input_dev, ABS_Y, 0, ts->abs_y_max, 0, 0);\r
-       //input_set_abs_params(ts->input_dev, ABS_PRESSURE, 0, 255, 0, 0);\r
+      \r
 \r
-#ifdef GOODIX_MULTI_TOUCH\r
-       input_mt_init_slots(ts->input_dev, MAX_SUPPORT_POINT);\r
-       //input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0);\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
-       //input_set_abs_params(ts->input_dev, ABS_MT_TRACKING_ID, 0, ts->max_touch_num, 0, 0);\r
-       //input_set_abs_params(ts->input_dev, ABS_MT_PRESSURE, 0, 255, 0, 0);\r
-#endif \r
-\r
-       sprintf(ts->phys, "input/ts");\r
-       ts->input_dev->name = goodix_ts_name;\r
-       ts->input_dev->phys = ts->phys;\r
-       ts->input_dev->id.bustype = BUS_I2C;\r
-       ts->input_dev->id.vendor = 0xDEAD;\r
-       ts->input_dev->id.product = 0xBEEF;\r
-       ts->input_dev->id.version = 10427;      //screen firmware version\r
-       \r
-       ret = input_register_device(ts->input_dev);\r
-       if (ret) {\r
-               dev_err(&client->dev,"Probe: Unable to register %s input device\n", ts->input_dev->name);\r
-               goto err_input_register_device_failed;\r
-       }\r
-       ts->bad_data = 0;\r
        \r
-#ifdef INT_PORT        \r
-       client->irq=TS_INT;             //If not defined in client\r
-       if (client->irq)\r
+       ts->irq=gpio_to_irq(ts->irq_pin)        ;               //If not defined in client\r
+       if (ts->irq)\r
        {\r
-               ret = gpio_request(INT_PORT, "TS_INT"); //Request IO\r
+               ret = gpio_request(pdata->irq_pin, "TS_IRQ_PIN");       //Request IO\r
                if (ret < 0) \r
                {\r
-                       dev_err(&client->dev, "Failed to request GPIO:%d, ERRNO:%d\n",(int)INT_PORT,ret);\r
+                       printk(KERN_ALERT "Failed to request for touch irq\n");\r
                        goto err_gpio_request_failed;\r
                }\r
-       //      s3c_gpio_setpull(INT_PORT, S3C_GPIO_PULL_UP);   //ret > 0 ?\r
-       //      s3c_gpio_cfgpin(INT_PORT, INT_CFG);     //Set IO port function  \r
-             // printk("irq is %d\n",irq_table[ts->int_trigger_type]);//add by fjp 2010-9-28\r
-               ret  = request_irq(client->irq, goodix_ts_irq_handler , /* irq_table[ts->int_trigger_type]*/IRQ_TYPE_LEVEL_LOW,\r
-                       client->name, ts);\r
+               else\r
+               {\r
+                       gpio_direction_input(pdata->irq_pin);\r
+               }\r
+\r
+               ret  = request_irq(ts->irq, rk_ts_irq_handler ,IRQ_TYPE_LEVEL_LOW,client->name, ts);\r
                if (ret != 0) {\r
-                       dev_err(&client->dev,"Cannot allocate ts INT!ERRNO:%d\n", ret);\r
-                       gpio_direction_input(INT_PORT);\r
+                       printk(KERN_ALERT "Cannot allocate ts INT!ERRNO:%d\n", ret);\r
                        gpio_free(INT_PORT);\r
                        goto err_gpio_request_failed;\r
                }\r
                else \r
                {       \r
-                       disable_irq(client->irq);\r
-                       ts->use_irq = 1;\r
-                       dev_dbg(&client->dev,"Reques EIRQ %d succesd on GPIO:%d\n",TS_INT,INT_PORT);\r
+                       enable_irq(ts->irq);\r
+               \r
                }       \r
        }\r
-#endif \r
-       if (!ts->use_irq) \r
-       {\r
-               hrtimer_init(&ts->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);\r
-               ts->timer.function = goodix_ts_timer_func;\r
-               hrtimer_start(&ts->timer, ktime_set(1, 0), HRTIMER_MODE_REL);\r
-       }\r
-\r
-#if defined(INT_PORT)\r
-       if(ts->use_irq)                 \r
-               ts->power = goodix_ts_power;\r
-#endif\r
-\r
-#if 1\r
-       ret = goodix_read_version(ts, &version_info);\r
-       if(ret <= 0)\r
-       {\r
-               printk(KERN_INFO"Read version data failed!\n");\r
-       }\r
-       else\r
-       {\r
-               printk(KERN_INFO"Goodix TouchScreen Version:%s\n", (version_info+1));\r
-       }\r
-       vfree(version_info);\r
-#endif\r
-       \r
-#ifdef CONFIG_HAS_EARLYSUSPEND\r
-       ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;\r
-       ts->early_suspend.suspend = goodix_ts_early_suspend;\r
-       ts->early_suspend.resume = goodix_ts_late_resume;\r
-       register_early_suspend(&ts->early_suspend);\r
-#endif\r
-#ifdef CONFIG_TOUCHSCREEN_GOODIX_IAP\r
-       goodix_proc_entry = create_proc_entry("goodix-update", 0666, NULL);\r
-       if(goodix_proc_entry == NULL)\r
-       {\r
-               dev_info(&client->dev, "Couldn't create proc entry!\n");\r
-               ret = -ENOMEM;\r
-               goto err_create_proc_entry;\r
-       }\r
-       else\r
-       {\r
-               dev_info(&client->dev, "Create proc entry success!\n");\r
-               printk("Create proc entry success!\n");\r
-               goodix_proc_entry->write_proc = goodix_update_write;\r
-               goodix_proc_entry->read_proc = goodix_update_read;\r
-               //goodix_proc_entry->owner = THIS_MODULE;\r
-       }\r
-#endif\r
-       ts->pendown =PEN_RELEASE;\r
-#if 0\r
-       goodix_debug_sysfs_init();\r
-       dev_info(&client->dev,"Start %s in %s mode\n", \r
-               ts->input_dev->name, ts->use_irq ? "interrupt" : "polling");\r
-       dev_info(&client->dev, "Driver Modify Date:2011-06-13\n");\r
-#endif\r
-       \r
-       if(ts->use_irq)\r
-               enable_irq(client->irq);\r
-       printk("Goodix TS probe successfully!\n");\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
@@ -1126,9 +845,9 @@ Parameter:
 return:\r
        Executive outcomes. 0---succeed.\r
 *******************************************************/\r
-static int goodix_ts_remove(struct i2c_client *client)\r
+static int rk_ts_remove(struct i2c_client *client)\r
 {\r
-       struct goodix_ts_data *ts = i2c_get_clientdata(client);\r
+       struct rk_ts_data *ts = i2c_get_clientdata(client);\r
 #ifdef CONFIG_HAS_EARLYSUSPEND\r
        unregister_early_suspend(&ts->early_suspend);\r
 #endif\r
@@ -1154,62 +873,7 @@ static int goodix_ts_remove(struct i2c_client *client)
        return 0;\r
 }\r
 \r
-static int goodix_ts_suspend(struct i2c_client *client, pm_message_t mesg)\r
-{\r
-       int ret;\r
-       struct goodix_ts_data *ts = i2c_get_clientdata(client);\r
 \r
-       \r
-       if (ts->use_irq)\r
-               disable_irq(client->irq);\r
-       else\r
-               hrtimer_cancel(&ts->timer);\r
-#if 1\r
-       if (ts->power) {\r
-               ret = ts->power(ts, 0);\r
-               if (ret < 0)\r
-                       printk(KERN_ERR "goodix_ts_resume power off failed\n");\r
-       }\r
-#endif\r
-       return 0;\r
-}\r
-\r
-static int goodix_ts_resume(struct i2c_client *client)\r
-{\r
-       int ret;\r
-       struct goodix_ts_data *ts = i2c_get_clientdata(client);\r
-       \r
-#if 1\r
-       if (ts->power) {\r
-               ret = ts->power(ts, 1);\r
-               if (ret < 0)\r
-                       printk(KERN_ERR "goodix_ts_resume power on failed\n");\r
-       }\r
-#endif\r
-       if (ts->use_irq)\r
-               enable_irq(client->irq);\r
-       else\r
-               hrtimer_start(&ts->timer, ktime_set(1, 0), HRTIMER_MODE_REL);\r
-       //gpio_set_value(RK29_PIN6_PC3,GPIO_HIGH);\r
-\r
-       return 0;\r
-}\r
-\r
-#ifdef CONFIG_HAS_EARLYSUSPEND\r
-static void goodix_ts_early_suspend(struct early_suspend *h)\r
-{\r
-       struct goodix_ts_data *ts;\r
-       ts = container_of(h, struct goodix_ts_data, early_suspend);\r
-       goodix_ts_suspend(ts->client, PMSG_SUSPEND);\r
-}\r
-\r
-static void goodix_ts_late_resume(struct early_suspend *h)\r
-{\r
-       struct goodix_ts_data *ts;\r
-       ts = container_of(h, struct goodix_ts_data, early_suspend);\r
-       goodix_ts_resume(ts->client);\r
-}\r
-#endif\r
 \r
 //******************************Begin of firmware update surpport*******************************\r
 #ifdef CONFIG_TOUCHSCREEN_GOODIX_IAP\r
@@ -1371,13 +1035,13 @@ static int update_file_check(char * path)
        return 1;       \r
 }\r
 \r
-unsigned char wait_slave_ready(struct goodix_ts_data *ts, unsigned short *timeout)\r
+unsigned char wait_slave_ready(struct rk_ts_data *ts, unsigned short *timeout)\r
 {\r
        unsigned char i2c_state_buf[2] = {ADDR_STA, UNKNOWN_ERROR};\r
        int ret;\r
        while(*timeout < MAX_TIMEOUT)\r
        {\r
-               ret = i2c_read_bytes(ts->client, i2c_state_buf, 2);\r
+               ret = goodix_i2c_read_bytes(ts->client, i2c_state_buf, 2);\r
                if(ret <= 0)\r
                        return ERROR_I2C_TRANSFER;\r
                if(i2c_state_buf[1] & SLAVE_READY)\r
@@ -1420,7 +1084,7 @@ static int goodix_update_write(struct file *filp, const char __user *buff, unsig
 \r
        struct file * file_data = NULL;\r
        mm_segment_t old_fs;\r
-       struct goodix_ts_data *ts;\r
+       struct rk_ts_data *ts;\r
        \r
        ts = i2c_get_clientdata(i2c_connect_client);\r
        if(ts==NULL)\r
@@ -1454,7 +1118,7 @@ static int goodix_update_write(struct file *filp, const char __user *buff, unsig
                case STEP_WRITE_SYN:\r
                        printk(KERN_INFO"STEP1:Write synchronization signal!\n");\r
                        i2c_control_buf[1] = UPDATE_START;\r
-                       ret = i2c_write_bytes(ts->client, i2c_control_buf, 2);\r
+                       ret = goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);\r
                        if(ret <= 0)\r
                        {\r
                                ret = ERROR_I2C_TRANSFER;\r
@@ -1468,7 +1132,7 @@ static int goodix_update_write(struct file *filp, const char __user *buff, unsig
                        while(retries < MAX_I2C_RETRIES)\r
                        {\r
                                i2c_states_buf[1] = UNKNOWN_ERROR;\r
-                               ret = i2c_read_bytes(ts->client, i2c_states_buf, 2);\r
+                               ret = goodix_i2c_read_bytes(ts->client, i2c_states_buf, 2);\r
                                printk(KERN_INFO"The read byte is:%d\n", i2c_states_buf[1]);\r
                                if(i2c_states_buf[1] & UPDATE_START)\r
                                {\r
@@ -1509,7 +1173,7 @@ static int goodix_update_write(struct file *filp, const char __user *buff, unsig
                        i2c_data_buf[3] = (file_len>>8) & 0xff;\r
                        i2c_data_buf[4] = file_len & 0xff;\r
                        file_len -= 4;\r
-                       ret = i2c_write_bytes(ts->client, i2c_data_buf, 5);\r
+                       ret = goodix_i2c_write_bytes(ts->client, i2c_data_buf, 5);\r
                        if(ret <= 0)\r
                        {\r
                                ret = ERROR_I2C_TRANSFER;\r
@@ -1567,7 +1231,7 @@ static int goodix_update_write(struct file *filp, const char __user *buff, unsig
                                }\r
 rewrite:\r
                                printk(KERN_INFO"[GOODiX_ISP_NEW]:%d\n", file_len);                             \r
-                               ret = i2c_write_bytes(ts->client, i2c_data_buf, 1+4+rd_len+4);\r
+                               ret = goodix_i2c_write_bytes(ts->client, i2c_data_buf, 1+4+rd_len+4);\r
                                        //if(ret <= 0)\r
                                if(ret != 1)\r
                                {\r
@@ -1576,7 +1240,7 @@ rewrite:
                                }\r
 \r
                                memset(i2c_rd_buf, 0x00, 1+4+rd_len+4);\r
-                               ret = i2c_read_bytes(ts->client, i2c_rd_buf, 1+4+rd_len+4);\r
+                               ret = goodix_i2c_read_bytes(ts->client, i2c_rd_buf, 1+4+rd_len+4);\r
                                if(ret != 2)\r
                                {\r
                                        printk("[GOODiX_ISP_NEW]:Read File Data Failed!Return:%d\n", ret);\r
@@ -1594,13 +1258,13 @@ rewrite:
                                {\r
                                        i2c_control_buf[0] = ADDR_CMD;\r
                                        i2c_control_buf[1] = 0x03;\r
-                                       i2c_write_bytes(ts->client, i2c_control_buf, 2);                //communication error\r
+                                       goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);         //communication error\r
                                        printk("[GOODiX_ISP_NEW]:File Data Frame readback check Error!\n");\r
                                }\r
                                else\r
                                {\r
                                        i2c_control_buf[1] = 0x04;                                                                                                      //let LDROM write flash\r
-                                       i2c_write_bytes(ts->client, i2c_control_buf, 2);\r
+                                       goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);\r
                                }\r
                                \r
                                //Wait for slave ready signal.and read the checksum\r
@@ -1665,7 +1329,7 @@ rewrite:
                                        i2c_data_buf[file_len+2] = (oldcrc32>>8)&0xff;\r
                                        i2c_data_buf[file_len+3] = (oldcrc32>>16)&0xff;\r
                                        i2c_data_buf[file_len+4] = (oldcrc32>>24)&0xff;\r
-                                       ret = i2c_write_bytes(ts->client, i2c_data_buf, (file_len+1+4));\r
+                                       ret = goodix_i2c_write_bytes(ts->client, i2c_data_buf, (file_len+1+4));\r
                                        //if(ret <= 0)\r
                                        if(ret != 1)\r
                                        {\r
@@ -1676,7 +1340,7 @@ rewrite:
                                }\r
                                else\r
                                {\r
-                                       ret = i2c_write_bytes(ts->client, i2c_data_buf, PACK_SIZE+1);\r
+                                       ret = goodix_i2c_write_bytes(ts->client, i2c_data_buf, PACK_SIZE+1);\r
                                        //if(ret <= 0)\r
                                        if(ret != 1)\r
                                        {\r
@@ -1702,7 +1366,7 @@ rewrite:
                        printk(KERN_INFO"STEP6:Read update status!\n");\r
                        while(time_count < MAX_TIMEOUT)\r
                        {\r
-                               ret = i2c_read_bytes(ts->client, i2c_states_buf, 2);\r
+                               ret = goodix_i2c_read_bytes(ts->client, i2c_states_buf, 2);\r
                                if(ret <= 0)\r
                                {\r
                                        return 0;\r
@@ -1755,7 +1419,7 @@ rewrite:
                                printk(KERN_INFO"Read raw data!\n");\r
                                ts->read_mode = MODE_RD_RAW;\r
                                i2c_control_buf[1] = 201;\r
-                               ret = i2c_write_bytes(ts->client, i2c_control_buf, 2);                  //read raw data cmd\r
+                               ret = goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);                   //read raw data cmd\r
                                if(ret <= 0)\r
                                {\r
                                        printk(KERN_INFO"Write read raw data cmd failed!\n");\r
@@ -1768,7 +1432,7 @@ rewrite:
                                printk(KERN_INFO"Read diff data!\n");\r
                                ts->read_mode = MODE_RD_DIF;\r
                                i2c_control_buf[1] = 202;\r
-                               ret = i2c_write_bytes(ts->client, i2c_control_buf, 2);                  //read diff data cmd\r
+                               ret = goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);                   //read diff data cmd\r
                                if(ret <= 0)\r
                                {\r
                                        printk(KERN_INFO"Write read raw data cmd failed!\n");\r
@@ -1805,7 +1469,7 @@ rewrite:
                        {\r
                                checksum_error_times = 0;\r
 reconfig:\r
-                               ret = i2c_write_bytes(ts->client, cmd+2, cmd[1]); \r
+                               ret = goodix_i2c_write_bytes(ts->client, cmd+2, cmd[1]); \r
                                if(ret != 1)\r
                                {\r
                                        printk("Write Config failed!return:%d\n",ret);\r
@@ -1814,7 +1478,7 @@ reconfig:
                                if(!update_need_config)return 1;\r
                                \r
                                i2c_rd_buf[0] = cmd[2];\r
-                               ret = i2c_read_bytes(ts->client, i2c_rd_buf, cmd[1]);\r
+                               ret = goodix_i2c_read_bytes(ts->client, i2c_rd_buf, cmd[1]);\r
                                if(ret != 2)\r
                                {\r
                                        printk("Read Config failed!return:%d\n",ret);\r
@@ -1833,7 +1497,7 @@ reconfig:
                                {\r
                                        i2c_control_buf[0] = ADDR_CMD;\r
                                        i2c_control_buf[1] = 0x03;\r
-                                       i2c_write_bytes(ts->client, i2c_control_buf, 2);                //communication error\r
+                                       goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);         //communication error\r
                                        checksum_error_times++;\r
                                        msleep(20);\r
                                        if(checksum_error_times > 20)                           //max retry times.\r
@@ -1844,7 +1508,7 @@ reconfig:
                                {\r
                                        i2c_control_buf[0] = ADDR_CMD;\r
                                        i2c_control_buf[1] = 0x04;                                      //let LDROM write flash\r
-                                       i2c_write_bytes(ts->client, i2c_control_buf, 2);\r
+                                       goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);\r
                                        return 1;\r
                                }\r
                                \r
@@ -1863,7 +1527,7 @@ reconfig:
 static int goodix_update_read( char *page, char **start, off_t off, int count, int *eof, void *data )\r
 {\r
        int ret = -1;\r
-       struct goodix_ts_data *ts;\r
+       struct rk_ts_data *ts;\r
        int len = 0;\r
        char *version_info = NULL;\r
        unsigned char read_data[1201] = {80, };\r
@@ -1896,7 +1560,7 @@ static int goodix_update_read( char *page, char **start, off_t off, int count, i
        else if((ts->read_mode == MODE_RD_RAW)||(ts->read_mode == MODE_RD_DIF))         //read raw data or diff\r
        {\r
                //printk(KERN_INFO"Read raw data\n");\r
-               ret = i2c_read_bytes(ts->client, read_data, 1201);\r
+               ret = goodix_i2c_read_bytes(ts->client, read_data, 1201);\r
                if(ret <= 0)\r
                {\r
                        if(ts->read_mode == 2)\r
@@ -1928,7 +1592,7 @@ static int goodix_update_read( char *page, char **start, off_t off, int count, i
                        rd_cfg_len = 239 - read_data[0];\r
                }\r
                printk("read config length is:%d\n", rd_cfg_len);\r
-               ret = i2c_read_bytes(ts->client, read_data, rd_cfg_len);\r
+               ret = goodix_i2c_read_bytes(ts->client, read_data, rd_cfg_len);\r
                if(ret <= 0)\r
                {\r
                        printk(KERN_INFO"Read config info failed!\n");\r
@@ -1947,12 +1611,12 @@ static const struct i2c_device_id goodix_ts_id[] = {
        { }\r
 };\r
 \r
-static struct i2c_driver goodix_ts_driver = {\r
-       .probe          = goodix_ts_probe,\r
-       .remove         = goodix_ts_remove,\r
+static struct i2c_driver rk_ts_driver = {\r
+       .probe          = rk_ts_probe,\r
+       .remove         = rk_ts_remove,\r
 #ifndef CONFIG_HAS_EARLYSUSPEND\r
-       .suspend        = goodix_ts_suspend,\r
-       .resume         = goodix_ts_resume,\r
+       .suspend        = rk_ts_suspend,\r
+       .resume         = rk_ts_resume,\r
 #endif\r
        .id_table       = goodix_ts_id,\r
        .driver = {\r
@@ -1967,20 +1631,10 @@ Description:
 return:\r
        Executive Outcomes. 0---succeed.\r
 ********************************************************/\r
-static int __devinit goodix_ts_init(void)\r
+static int __devinit rk_ts_init(void)\r
 {\r
-       int ret;\r
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)\r
-       goodix_wq = create_rt_workqueue("goodix_wq");           //create a work queue and worker thread\r
-#else\r
-       goodix_wq = create_workqueue("goodix_touch_wq"); \r
-#endif\r
-       if (!goodix_wq) {\r
-               printk(KERN_ALERT "creat workqueue faiked\n");\r
-               return -ENOMEM;\r
-               \r
-       }\r
-       ret=i2c_add_driver(&goodix_ts_driver);\r
+       int ret ;\r
+       ret=i2c_add_driver(&rk_ts_driver);\r
        return ret; \r
 }\r
 \r
@@ -1990,16 +1644,14 @@ Description:
 return:\r
        Executive Outcomes. 0---succeed.\r
 ********************************************************/\r
-static void __exit goodix_ts_exit(void)\r
+static void __exit rk_ts_exit(void)\r
 {\r
        printk(KERN_ALERT "Touchscreen driver of guitar exited.\n");\r
-       i2c_del_driver(&goodix_ts_driver);\r
-       if (goodix_wq)\r
-               destroy_workqueue(goodix_wq);           //release our work queue\r
+       i2c_del_driver(&rk_ts_driver);\r
 }\r
 \r
-module_init(goodix_ts_init);\r
-module_exit(goodix_ts_exit);\r
+module_init(rk_ts_init);\r
+module_exit(rk_ts_exit);\r
 \r
 MODULE_DESCRIPTION("Goodix Touchscreen Driver");\r
 MODULE_LICENSE("GPL");\r
index a5d13f8766233bffaff8b9e723c48dc04588cce7..7edbe7c7da2b014280c0367a0b4fafce72b19953 100755 (executable)
 //*************************TouchScreen Work Part*****************************
 
 #define GOODIX_I2C_NAME "Goodix-TS"
-#define GOODIX_1024X768
-#ifdef  GOODIX_1024X768
-#define TOUCH_MAX_HEIGHT       1024                    
-#define TOUCH_MAX_WIDTH        768
-#else
-//define resolution of the touchscreen
-#define TOUCH_MAX_HEIGHT       1280                    
-#define TOUCH_MAX_WIDTH        800
-#endif
+#define GOODIX_1024X768         1
+
+#define TS_MAX_X       1024                    
+#define TS_MAX_Y               768
+
 #if 1
 #define INT_PORT               RK29_PIN0_PA2                                                   
 #ifdef INT_PORT
 
 //#define swap(x, y) do { typeof(x) z = x; x = y; y = z; } while (0)
 
+struct rk_touch_info
+{
+       u32 status;   // 1:down,0:up
+       u32 x ;
+       u32 y ;
+} ;
+struct rk_ts_data{
+       uint16_t addr;
+       uint8_t bad_data;
+       struct i2c_client *client;
+       struct input_dev *input_dev;
+       int use_reset;                                  //use RESET flag
+       int use_irq;                                    //use EINT flag
+       int irq;
+       int irq_pin;
+       int read_mode;                                  //read moudle mode,20110221 by andrew
+       struct hrtimer timer;
+       struct workqueue_struct *ts_wq;
+       struct delayed_work  ts_work;
+       char phys[32];
+       int retry;
+       struct early_suspend early_suspend;
+       int (*power)(struct rk_ts_data * ts, int on);
+       int (*ts_init)(struct rk_ts_data*ts);
+       int (*input_parms_init)(struct rk_ts_data *ts);
+       void (*get_touch_info)(struct rk_ts_data *ts,char *point_num,struct rk_touch_info *info_buf);  //get touch data info
+       uint16_t abs_x_max;
+       uint16_t abs_y_max;
+       uint8_t max_touch_num;
+       uint8_t int_trigger_type;
+       bool            pendown;
+};
+
+
+
 struct goodix_ts_data {
        uint16_t addr;
        uint8_t bad_data;
@@ -84,7 +115,7 @@ struct goodix_ts_data {
        bool            pendown;
 };
 
-static const char *goodix_ts_name = "Goodix Capacitive TouchScreen";
+static const char *rk_ts_name = "Goodix Capacitive TouchScreen";
 static struct workqueue_struct *goodix_wq;
 struct i2c_client * i2c_connect_client = NULL; 
 static struct proc_dir_entry *goodix_proc_entry;