Merge branch 'lsk-v4.4-eas-v5.2' of git://git.linaro.org/arm/eas/kernel.git
[firefly-linux-kernel-4.4.55.git] / drivers / input / touchscreen / rk29_i2c_goodix.c
1 /* drivers/input/touchscreen/goodix_touch.c\r
2  *\r
3  * Copyright (C) 2010 - 2011 Goodix, Inc.\r
4  * \r
5  * This program is free software; you can redistribute it and/or modify\r
6  * it under the terms of the GNU General Public License as published by\r
7  * the Free Software Foundation; either version 2 of the License, or\r
8  * (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful, but WITHOUT\r
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\r
13  * more details.\r
14  *\r
15  */\r
16 #include <linux/kernel.h>\r
17 #include <linux/module.h>\r
18 #include <linux/time.h>\r
19 #include <linux/delay.h>\r
20 #include <linux/device.h>\r
21 #include <linux/hrtimer.h>\r
22 #include <linux/i2c.h>\r
23 #include <linux/input.h>\r
24 #include <linux/input/mt.h>\r
25 \r
26 #include <linux/interrupt.h>\r
27 #include <linux/io.h>\r
28 #include <linux/platform_device.h>\r
29 #include <linux/gpio.h>\r
30 #include <linux/version.h>\r
31 #include <linux/slab.h>\r
32 #include <linux/of_gpio.h>\r
33 \r
34 #include <linux/irq.h>\r
35 #include <linux/syscalls.h>\r
36 #include <linux/reboot.h>\r
37 #include <linux/proc_fs.h>\r
38 #include <linux/async.h>\r
39 #include <linux/vmalloc.h>\r
40 #include <linux/fs.h>\r
41 #include <linux/string.h>\r
42 #include <linux/completion.h>\r
43 #include <asm/uaccess.h>\r
44 \r
45 #include "rk29_i2c_goodix.h"\r
46 \r
47 #define PEN_DOWN 1\r
48 #define PEN_RELEASE 0\r
49 #define PEN_DOWN_UP 2 //fjp\r
50 \r
51 static int dbg_thresd = 0;\r
52 #define DBG(x...) do { if(unlikely(dbg_thresd)) printk(KERN_INFO x); } while (0)\r
53 \r
54 \r
55 /*******************************************************        \r
56 Description:\r
57         Read data from the i2c slave device;\r
58         This operation consisted of 2 i2c_msgs,the first msg used\r
59         to write the operate address,the second msg used to read data.\r
60 \r
61 Parameter:\r
62         client: i2c device.\r
63         buf[0]:operate address.\r
64         buf[1]~buf[len]:read data buffer.\r
65         len:operate length.\r
66         \r
67 return:\r
68         numbers of i2c_msgs to transfer\r
69 *********************************************************/\r
70 static int goodix_i2c_read_bytes(struct i2c_client *client, uint8_t *buf, int len)\r
71 {\r
72         struct i2c_msg msgs[2];\r
73         int ret=-1;\r
74         int retries = 0;\r
75 \r
76         msgs[0].flags = client->flags;\r
77         msgs[0].addr=client->addr;\r
78         msgs[0].len=1;\r
79         msgs[0].buf=&buf[0];\r
80         msgs[0].scl_rate=200 * 1000;\r
81 \r
82         msgs[1].flags = client->flags | I2C_M_RD;\r
83         msgs[1].addr=client->addr;\r
84         msgs[1].len=len-1;\r
85         msgs[1].buf=&buf[1];\r
86         msgs[1].scl_rate=200 * 1000;\r
87 \r
88         //disable_irq(client->irq);\r
89         while(retries<5)\r
90         {\r
91                 ret=i2c_transfer(client->adapter,msgs, 2);\r
92                 if(ret == 2)break;\r
93                 retries++;\r
94         }\r
95         //enable_irq(client->irq);\r
96         return ret;\r
97 }\r
98 \r
99 /*******************************************************        \r
100 Description:\r
101         write data to the i2c slave device.\r
102 \r
103 Parameter:\r
104         client: i2c device.\r
105         buf[0]:operate address.\r
106         buf[1]~buf[len]:write data buffer.\r
107         len:operate length.\r
108         \r
109 return:\r
110         numbers of i2c_msgs to transfer.\r
111 *********************************************************/\r
112 static int goodix_i2c_write_bytes(struct i2c_client *client,uint8_t *data,int len)\r
113 {\r
114         struct i2c_msg msg;\r
115         int ret=-1;\r
116         int retries = 0;\r
117 \r
118         msg.flags=!I2C_M_RD;\r
119         msg.addr=client->addr;\r
120         msg.len=len;\r
121         msg.buf=data;           \r
122         msg.scl_rate=200 * 1000;\r
123         \r
124         //disable_irq(client->irq);\r
125         while(retries<5)\r
126         {\r
127                 ret=i2c_transfer(client->adapter,&msg, 1);\r
128                 if(ret == 1)break;\r
129                 retries++;\r
130         }\r
131         //enable_irq(client->irq);\r
132         return ret;\r
133 }\r
134 \r
135 static int goodix_config_ok(struct rk_ts_data *ts)\r
136 {\r
137         int ret = 0;\r
138         unsigned int w,h, n;\r
139         uint8_t rd_cfg_buf[7] = {0x66,};\r
140         \r
141         ret = goodix_i2c_read_bytes(ts->client, rd_cfg_buf, 7);\r
142 \r
143         w = (rd_cfg_buf[1]<<8) + rd_cfg_buf[2];\r
144         h = (rd_cfg_buf[3]<<8) + rd_cfg_buf[4];\r
145         n = rd_cfg_buf[5];\r
146 \r
147 #ifdef CONFIG_ARCH_RK29\r
148         if((ret < 0) || (w != TS_MAX_X) || (h != TS_MAX_Y) || (n != 10))\r
149 #else\r
150         if((ret < 0) || (w != ts->abs_x_max) || (h != ts->abs_y_max) || (n != 170))\r
151 #endif\r
152                 return -1;\r
153 \r
154         ts->abs_x_max = w;\r
155         ts->abs_y_max = h;\r
156         ts->max_touch_num = n;\r
157         \r
158         printk("goodix_ts_init: X_MAX = %d,Y_MAX = %d,MAX_TOUCH_NUM = %d\n",ts->abs_x_max,ts->abs_y_max,ts->max_touch_num);\r
159 \r
160         return 0;\r
161 }\r
162 /*******************************************************\r
163 Description:\r
164         Goodix touchscreen initialize function.\r
165 \r
166 Parameter:\r
167         ts:     i2c client private struct.\r
168         \r
169 return:\r
170         Executive outcomes.0---succeed.\r
171 *******************************************************/\r
172 static int goodix_init_panel(struct rk_ts_data *ts)\r
173 {\r
174         int ret=-1, retry = 10;\r
175         uint8_t rd_cfg_buf[7] = {0x66,};\r
176         uint8_t *config_info;\r
177         int config_len;\r
178 \r
179         //for malata 10.1\r
180         uint8_t config_info_1024_768[] = {\r
181                 0x65,0x02,0x04,0x00,0x03,0x00,0x0A,0x22,0x1E,0xE7,0x32,0x05,0x08,0x10,0x4C,\r
182                 0x41,0x41,0x20,0x09,0x00,0xA0,0xA0,0x3C,0x64,0x0E,0x0D,0x0C,0x0B,0x0A,0x09,\r
183                 0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00,0x1D,0x1C,0x1B,0x1A,0x19,0x18,\r
184                 0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,\r
185                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
186                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\r
187         };\r
188              \r
189 #ifdef CONFIG_ARCH_RK29\r
190         uint8_t config_info_1280_800[] = {\r
191                 0x65,0x02,0x05,0x00,0x03,0x20,0x0A,0x22,0x1E,0xE7,0x32,0x05,0x08,0x10,0x4C,\r
192                 0x41,0x41,0x20,0x07,0x00,0xA0,0xA0,0x46,0x64,0x0E,0x0D,0x0C,0x0B,0x0A,0x09,\r
193                 0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00,0x1D,0x1C,0x1B,0x1A,0x19,0x18,\r
194                 0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,\r
195                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
196                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\r
197         };\r
198 #else\r
199         uint8_t config_info_1280_800[] = {\r
200                 0x65,0xA2,0x05,0x00,0x03,0x20,0xAA,0x22,0x1E,0xE7,0x32,0x05,0x08,0x10,0x4C,\r
201                 0x42,0x42,0x20,0x00,0x09,0x80,0x80,0x32,0x46,0x0E,0x0D,0x0C,0x0B,0x0A,0x09,\r
202                 0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00,0x1D,0x1C,0x1B,0x1A,0x19,0x18,\r
203                 0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,\r
204                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
205                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\r
206         };\r
207 #endif\r
208         uint8_t config_info_default[] = {\r
209                 0x65,0x02,0x05,0x00,0x03,0x20,0x0A,0x22,0x1E,0xE7,0x32,0x05,0x08,0x10,0x4C,\r
210                 0x42,0x42,0x20,0x00,0x00,0x89,0x89,0x3C,0x64,0x0E,0x0D,0x0C,0x0B,\r
211                 0x0A,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00,0x1D,0x1C,\r
212                 0x1B,0x1A,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0F,\r
213                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
214                 0x2B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
215                 0x00,0x00,0x00,0x00\r
216         };\r
217 \r
218         if (ts->abs_x_max == 1280 && ts->abs_y_max == 800) {\r
219                 config_info = config_info_1280_800;\r
220                 config_len = ARRAY_SIZE(config_info_1280_800);\r
221         } else if (ts->abs_x_max == 1024 && ts->abs_y_max == 786) {\r
222                 config_info = config_info_1024_768;\r
223                 config_len = ARRAY_SIZE(config_info_1024_768);\r
224         } else {\r
225                 config_info = config_info_default;\r
226                 config_len = ARRAY_SIZE(config_info_default);\r
227         }\r
228         while(--retry && (goodix_config_ok(ts) < 0)){\r
229                 ret = goodix_i2c_write_bytes(ts->client, config_info, config_len);\r
230                 if (ret < 0) {\r
231                         printk("goodix write cfg info err, retry %d\n", retry);\r
232                         msleep(100);\r
233                 }\r
234         }\r
235 \r
236         if(retry <= 0){\r
237                 printk("goodix write cfg info err\n");\r
238                 return -1;\r
239         }\r
240 \r
241         \r
242         rd_cfg_buf[0] = 0x6e;\r
243         rd_cfg_buf[1] = 0x00;\r
244         goodix_i2c_read_bytes(ts->client, rd_cfg_buf, 2);\r
245         if((rd_cfg_buf[1]&0x0f)==0x0f)\r
246         {\r
247                 dev_info(&ts->client->dev, "Need int wake up from green mode!\n");\r
248         }\r
249 \r
250         return 0;\r
251 \r
252 }\r
253 \r
254 //fjp add ===============================\r
255 static bool goodix_get_status(char *p1,int*p2)\r
256 {\r
257         bool status = PEN_DOWN;\r
258         if((*p2==PEN_DOWN) && (*p1==PEN_RELEASE))\r
259                 {\r
260                         *p2 = PEN_DOWN_UP; //¸Õ¸Õµ¯Æð\r
261                          status = PEN_RELEASE; \r
262                 }\r
263         else if((*p2==PEN_RELEASE) && (*p1==PEN_RELEASE))\r
264                 {\r
265                    *p2 = PEN_RELEASE;\r
266                         status = PEN_RELEASE; \r
267                 }\r
268         else\r
269                 {\r
270                         *p2 = PEN_DOWN;\r
271                 }\r
272         return status;\r
273 }\r
274 \r
275 //===================================\r
276 /*******************************************************\r
277 Description:\r
278         Read goodix touchscreen version function.\r
279 \r
280 Parameter:\r
281         ts:     i2c client private struct.\r
282         \r
283 return:\r
284         Executive outcomes.0---succeed.\r
285 *******************************************************/\r
286 static int  goodix_read_version(struct rk_ts_data *ts, char **version)\r
287 {\r
288         int ret = -1, count = 0;\r
289         char *version_data;\r
290         char *p;\r
291 \r
292         *version = (char *)vzalloc(18);\r
293         version_data = *version;\r
294         if(!version_data)\r
295                 return -ENOMEM;\r
296         p = version_data;\r
297         version_data[0]=240;    \r
298         ret=goodix_i2c_read_bytes(ts->client,version_data, 17);\r
299         if (ret < 0) \r
300                 return ret;\r
301         version_data[17]='\0';\r
302         \r
303         if(*p == '\0')\r
304                 return 0;       \r
305         do                                      \r
306         {\r
307                 if((*p > 122) || (*p < 48 && *p != 32) || (*p >57 && *p  < 65) \r
308                         ||(*p > 90 && *p < 97 && *p  != '_'))           //check illeqal character\r
309                         count++;\r
310         }while(*++p != '\0' );\r
311         if(count > 2)\r
312                 return 0;\r
313         else \r
314                 return 1;       \r
315 }\r
316 \r
317 static int last_touch_num = -1;\r
318 static void goodix_get_touch_info(struct rk_ts_data *ts,char *point_num,struct rk_touch_info* info_buf)\r
319 {\r
320         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
321         uint8_t  check_sum = 0;\r
322         int ret ;\r
323         uint16_t  finger_current = 0;\r
324         uint16_t  finger_bit = 0;\r
325         unsigned int  count = 0, point_count = 0;\r
326         unsigned char touch_num = 0;\r
327         uint8_t chksum_err = 0;\r
328         unsigned int position = 0;      \r
329         uint8_t track_id[MAX_FINGER_NUM] = {0};\r
330         u8 index;\r
331         u8 temp =0;\r
332         point_data[0] = READ_COOR_ADDR;         //read coor address\r
333         \r
334         if(!ts||!info_buf)\r
335         {\r
336                 printk("goodix ts or info_buf is null\n");\r
337                 return;\r
338         }\r
339 \r
340         ret=goodix_i2c_read_bytes(ts->client, point_data, sizeof(point_data)/sizeof(point_data[0]));\r
341         if(ret != 2)    \r
342         {\r
343             printk("goodix read error\n");\r
344         }       \r
345         finger_current =  (point_data[3 - READ_COOR_ADDR]<<8) + point_data[2 - READ_COOR_ADDR];\r
346         \r
347         DBG("finger_current:%d ==== max_touch_num:%d\n", finger_current,ts->max_touch_num);//add by fjp 2010-9-28\r
348         \r
349 \r
350         if(finger_current)\r
351         {       \r
352                 point_count = 0;\r
353                 finger_bit = finger_current;\r
354                 for(count = 0; (finger_bit != 0) && (count < ts->max_touch_num); count++)//cal how many point touch currntly\r
355                 {\r
356                         if(finger_bit & 0x01)\r
357                         {\r
358                                 track_id[count] = PEN_DOWN;\r
359                                 point_count++;\r
360                         }\r
361                         finger_bit >>= 1;\r
362                 }\r
363                 touch_num = point_count;\r
364 \r
365                 check_sum = point_data[2 - READ_COOR_ADDR] + point_data[3 - READ_COOR_ADDR];                    //cal coor checksum\r
366                 count = 4 - READ_COOR_ADDR;\r
367                 for(point_count *= 5; point_count > 0; point_count--)\r
368                         check_sum += point_data[count++];\r
369                 check_sum += point_data[count];\r
370                 if(check_sum  != 0)                     //checksum verify error\r
371                 {\r
372                         printk("coor checksum error!\n");\r
373                 }\r
374                 else\r
375                 {\r
376                         chksum_err = 0;\r
377                 }\r
378         }\r
379 \r
380         //printk("current point num:%d\n",touch_num);\r
381         *point_num = touch_num;\r
382         if(touch_num < last_touch_num)  //some flinger release\r
383         {\r
384                 //printk("%d flinger release\n",last_touch_num-touch_num);\r
385                 /*for(index = touch_num; index < last_touch_num; index++)\r
386                         info_buf[index].status = 0;*/\r
387                 *point_num = last_touch_num;\r
388                  touch_num = last_touch_num;\r
389         }\r
390         last_touch_num = touch_num;\r
391         for(index = 0; index < touch_num; index++)\r
392         {\r
393              if(goodix_get_status(&track_id[index],&info_buf[index].status))\r
394                 {\r
395                 position = 4 - READ_COOR_ADDR + 5*(temp++);\r
396                 info_buf[index].x = (unsigned int) (point_data[position]<<8) + (unsigned int)( point_data[position+1]);\r
397                 info_buf[index].y  = (unsigned int)(point_data[position+2]<<8) + (unsigned int) (point_data[position+3]);\r
398                 info_buf[index].press = (unsigned int) (point_data[position+4]);        \r
399                 }\r
400         }\r
401         \r
402 }\r
403 \r
404 /*******************************************************\r
405 Description:\r
406         External interrupt service routine.\r
407 \r
408 Parameter:\r
409         irq:    interrupt number.\r
410         dev_id: private data pointer.\r
411         \r
412 return:\r
413         irq execute status.\r
414 *******************************************************/\r
415 static irqreturn_t rk_ts_irq_handler(int irq, void *dev_id)\r
416 {\r
417         struct rk_ts_data *ts = (struct rk_ts_data*)dev_id;\r
418         int i =0;\r
419         char point_num;\r
420         bool touch_down;\r
421 \r
422         do {\r
423                 if(ts->get_touch_info)\r
424                 {\r
425                         ts->get_touch_info(ts,&point_num,ts->info_buf);\r
426                 }\r
427                 for(i=0; i< point_num; i++)\r
428                 {\r
429                         DBG("info_buf[i].status =====%d\n",ts->info_buf[i].status);\r
430                         if (ts->info_buf[i].status==PEN_DOWN_UP)\r
431                         {\r
432                                 ts->info_buf[i].status=PEN_RELEASE;\r
433                                 DBG("the key %d is up------\n",i);\r
434                                 input_mt_slot(ts->input_dev, i);\r
435                                 input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, false);\r
436                                 continue;\r
437                         }\r
438                         if (ts->info_buf[i].status==PEN_DOWN)\r
439                         {\r
440                                 input_mt_slot(ts->input_dev, i);\r
441                                 input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, true);\r
442                                 input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, ts->info_buf[i].press);\r
443                                 input_report_abs(ts->input_dev, ABS_MT_POSITION_X, ts->info_buf[i].x);\r
444                                 input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, ts->info_buf[i].y);\r
445                                 DBG("touch point %d %d >>x:%d>>y:%d\n",i,ts->info_buf[i].status,ts->info_buf[i].x,ts->info_buf[i].y);//add by fjp 2010-9-28\r
446                         }\r
447                 }\r
448                 input_sync(ts->input_dev);\r
449                 touch_down = gpio_get_value(ts->irq_pin) == 0;\r
450                 if (touch_down)\r
451                 {\r
452                         DBG("touch down .............\n");//add by fjp 2010-9-28\r
453                         usleep_range(10000, 10000);\r
454                 }\r
455         } while (touch_down);\r
456 \r
457         DBG("touch up>>x:%d>>y:%d\n",ts->info_buf[0].x,ts->info_buf[0].y);//add by fjp 2010-9-28\r
458         /*input_mt_slot(ts->input_dev, 0);\r
459           input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, true);\r
460           input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0);\r
461 \r
462           input_mt_slot(ts->input_dev, 0);\r
463           input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, false);*/\r
464 \r
465         DBG("point_num+++++++++++ = %d\n", point_num);//add by fjp 2010-9-28\r
466         for(i=0; i< point_num; i++)\r
467         {\r
468                 //        printk("info_buf[i].status +++++++%d\n",ts->info_buf[i].status);\r
469                 if(ts->info_buf[i].status)\r
470                 {\r
471                         input_mt_slot(ts->input_dev, i);//°´ÐòºÅÉϱ¨\r
472                         input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, false);               \r
473                         //input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0);\r
474                         ts->info_buf[i].status= PEN_RELEASE;\r
475 \r
476                         DBG("release+++++++++++ = %d\n", i);//add by fjp 2010-9-28\r
477                 }\r
478         }\r
479         input_sync(ts->input_dev);\r
480         ts->pendown =PEN_RELEASE;\r
481         last_touch_num = 0;\r
482 \r
483         return IRQ_HANDLED;\r
484 }\r
485 \r
486 static int rk_ts_suspend(struct i2c_client *client, pm_message_t mesg)\r
487 {\r
488         int ret;\r
489         struct rk_ts_data *ts = i2c_get_clientdata(client);       \r
490 \r
491         disable_irq(ts->irq);   \r
492 \r
493         if (ts->power) {\r
494                 DBG("%s.....line=%d\n",__func__,__LINE__);\r
495                 ret = ts->power(ts, 0);\r
496                 if (ret < 0)\r
497                         printk(KERN_ERR "goodix_ts_resume power off failed\n");\r
498         }\r
499 \r
500         return 0;\r
501 }\r
502 \r
503 static int rk_ts_resume(struct i2c_client *client)\r
504 {\r
505         int ret;\r
506         struct rk_ts_data *ts = i2c_get_clientdata(client);\r
507 \r
508         if (ts->power) {\r
509                 DBG("%s.....line=%d\n",__func__,__LINE__);\r
510                 ret = ts->power(ts, 1);\r
511                 if (ret < 0)\r
512                         printk(KERN_ERR "goodix_ts_resume power on failed\n");\r
513         }\r
514 \r
515         enable_irq(ts->irq);\r
516         return 0;\r
517 }\r
518 \r
519 \r
520 \r
521 static int rk_ts_early_suspend(struct tp_device *tp_d)\r
522 {\r
523         struct rk_ts_data *ts;\r
524         ts = container_of(tp_d, struct rk_ts_data, tp);\r
525         rk_ts_suspend(ts->client, PMSG_SUSPEND);\r
526         return 0;\r
527 }\r
528 \r
529 static int rk_ts_early_resume(struct tp_device *tp_d)\r
530 {\r
531         struct rk_ts_data *ts;\r
532         ts = container_of(tp_d, struct rk_ts_data, tp);\r
533         rk_ts_resume(ts->client);\r
534         return 0;\r
535 }\r
536 \r
537 \r
538 /*******************************************************\r
539 Description:\r
540         Goodix touchscreen power manage function.\r
541 \r
542 Parameter:\r
543         on:     power status.0---suspend;1---resume.\r
544         \r
545 return:\r
546         Executive outcomes.-1---i2c transfer error;0---succeed.\r
547 *******************************************************/\r
548 static int goodix_ts_power(struct rk_ts_data * ts, int on)\r
549 {\r
550         int ret = -1;\r
551         unsigned char i2c_control_buf[2] = {80,  1};            //suspend cmd\r
552         int retry = 0;\r
553 \r
554         if(on != 0 && on !=1)\r
555         {\r
556                 printk("%s: Cant't support this command.", rk_ts_name);\r
557                 return -EINVAL;\r
558         }\r
559                 \r
560         if(on == 0)//suspend\r
561         { \r
562         while(retry<5)\r
563                 {\r
564                         ret = goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);\r
565                         if(ret == 1)\r
566                         {\r
567                                 printk("touch goodix Send suspend cmd successed \n");\r
568                                 break;\r
569                         }\r
570                        retry++;\r
571                         msleep(10);\r
572                 }\r
573                 if(ret > 0)\r
574                   ret = 0;\r
575         }\r
576         else if(on == 1)//resume\r
577         {\r
578                 printk("touch goodix int resume\n");\r
579                 gpio_set_value(ts->rst_pin, ts->rst_val);\r
580                 msleep(20);\r
581                 gpio_set_value(ts->rst_pin, !ts->rst_val);\r
582                 ret = 0;\r
583         }        \r
584         return ret;\r
585 }\r
586 \r
587 \r
588 static int goodix_input_params_init(struct rk_ts_data *ts)\r
589 {\r
590         int ret ;\r
591         ts->input_dev = devm_input_allocate_device(&ts->client->dev);\r
592         if (ts->input_dev == NULL) {\r
593                 ret = -ENOMEM;\r
594                 printk(KERN_ALERT "Failed to allocate input device\n");\r
595                 return ret;\r
596         }\r
597 \r
598 \r
599         __set_bit(INPUT_PROP_DIRECT, ts->input_dev->propbit);\r
600         __set_bit(EV_ABS, ts->input_dev->evbit);\r
601 \r
602         input_mt_init_slots(ts->input_dev, ts->max_touch_num, 0);\r
603         input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);\r
604         input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, ts->abs_x_max, 0, 0);\r
605         input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, ts->abs_y_max, 0, 0);\r
606         sprintf(ts->phys, "input/rkts");\r
607         ts->input_dev->name = rk_ts_name;\r
608         ts->input_dev->phys = ts->phys;\r
609         ts->input_dev->id.bustype = BUS_I2C;\r
610         ts->input_dev->id.vendor = 0xDEAD;\r
611         ts->input_dev->id.product = 0xBEEF;\r
612         ts->input_dev->id.version = 10427;      //screen firmware version\r
613         \r
614         ret = input_register_device(ts->input_dev);\r
615         if (ret) {\r
616                 printk(KERN_ALERT "Probe: Unable to register %s input device\n", ts->input_dev->name);\r
617                 return -1;\r
618         }\r
619 \r
620         return 0 ;\r
621         \r
622 }\r
623 \r
624 #ifdef CONFIG_TOUCHSCREEN_GOODIX_IAP\r
625 static const struct file_operations goodix_proc_fops = {\r
626         .read   = goodix_update_read,\r
627         .write  = goodix_update_write,\r
628 };\r
629 #endif\r
630 \r
631 static int goodix_ts_init(struct rk_ts_data *ts)\r
632 {\r
633         char ret ;\r
634         char *version_info = NULL;\r
635 #if 0\r
636         char test_data = 1;\r
637         char retry;\r
638         for(retry=0;retry < 30; retry++)    //test goodix\r
639         {\r
640                 ret =goodix_i2c_write_bytes(ts->client, &test_data, 1);\r
641                 if (ret > 0)\r
642                         break;\r
643         }\r
644         if(ret <= 0)\r
645         {\r
646                 printk(KERN_INFO "I2C communication ERROR!Goodix touchscreen driver become invalid\n");\r
647                 return -1;\r
648         }       \r
649 #endif  \r
650         \r
651         ret=goodix_init_panel(ts);\r
652         if(ret != 0) {\r
653                 printk("goodix panel init fail\n");\r
654                 return -1;\r
655         }\r
656         ret = goodix_read_version(ts, &version_info);\r
657         if(ret <= 0)\r
658         {\r
659                 printk(KERN_INFO"Read version data failed!\n");\r
660         }\r
661         else\r
662         {\r
663                 printk("goodix_ts_init: version %s\n", (version_info+1));\r
664         }\r
665         vfree(version_info);\r
666         #ifdef CONFIG_TOUCHSCREEN_GOODIX_IAP\r
667         goodix_proc_entry = proc_create("goodix-update", 0666, NULL, &goodix_proc_fops);\r
668         if(goodix_proc_entry == NULL)\r
669         {\r
670                 printk("Couldn't create proc entry!\n");\r
671                 ret = -ENOMEM;\r
672                 return ret ;\r
673         }\r
674         else\r
675         {\r
676                 printk("goodix_ts_init: create proc entry success!\n");\r
677                 goodix_proc_entry->write_proc = goodix_update_write;\r
678                 goodix_proc_entry->read_proc = goodix_update_read;\r
679                 //goodix_proc_entry->owner = THIS_MODULE;\r
680         }\r
681 #endif\r
682 \r
683         return 0;\r
684 }\r
685 /*******************************************************\r
686 Description:\r
687         Goodix touchscreen probe function.\r
688 \r
689 Parameter:\r
690         client: i2c device struct.\r
691         id:device id.\r
692         \r
693 return:\r
694         Executive outcomes. 0---succeed.\r
695 *******************************************************/\r
696 static int rk_ts_probe(struct i2c_client *client, const struct i2c_device_id *id)\r
697 {\r
698         int ret = 0;\r
699         struct rk_ts_data *ts;\r
700         struct device_node *np = client->dev.of_node;\r
701         enum of_gpio_flags rst_flags, pwr_flags;\r
702         unsigned long irq_flags;\r
703         u32 val;\r
704         \r
705         printk(KERN_INFO "Install touch driver.\n");\r
706         if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) \r
707         {\r
708                 dev_err(&client->dev, "Must have I2C_FUNC_I2C.\n");\r
709                 return -ENODEV;\r
710         }\r
711 \r
712         ts = devm_kzalloc(&client->dev, sizeof(struct rk_ts_data), GFP_KERNEL);\r
713         if (ts == NULL) {\r
714                 dev_err(&client->dev, "alloc for struct rk_ts_data fail\n");\r
715                 return -ENOMEM;\r
716         }\r
717 \r
718         if (!np) {\r
719                 dev_err(&client->dev, "no device tree\n");\r
720                 return -EINVAL;\r
721         }\r
722         ts->irq_pin = of_get_named_gpio_flags(np, "touch-gpio", 0, (enum of_gpio_flags *)&irq_flags);\r
723         ts->rst_pin = of_get_named_gpio_flags(np, "reset-gpio", 0, &rst_flags);\r
724         ts->pwr_pin = of_get_named_gpio_flags(np, "power-gpio", 0, &pwr_flags);\r
725         if (of_property_read_u32(np, "max-x", &val)) {\r
726                 dev_err(&client->dev, "no max-x defined\n");\r
727                 return -EINVAL;\r
728         }\r
729         ts->abs_x_max = val;\r
730         if (of_property_read_u32(np, "max-y", &val)) {\r
731                 dev_err(&client->dev, "no max-y defined\n");\r
732                 return -EINVAL;\r
733         }\r
734         ts->abs_y_max = val;\r
735         ts->pendown =PEN_RELEASE;\r
736         ts->client = client;\r
737         ts->ts_init = goodix_ts_init;   \r
738         ts->power = goodix_ts_power;\r
739         ts->get_touch_info = goodix_get_touch_info;\r
740         ts->input_parms_init = goodix_input_params_init;\r
741         \r
742         if (gpio_is_valid(ts->pwr_pin)) {\r
743                 ret = devm_gpio_request_one(&client->dev, ts->pwr_pin, (pwr_flags & OF_GPIO_ACTIVE_LOW) ? GPIOF_OUT_INIT_LOW : GPIOF_OUT_INIT_HIGH, "goodix power pin");\r
744                 if (ret != 0) {\r
745                         dev_err(&client->dev, "goodix power error\n");\r
746                         return -EIO;\r
747                 }\r
748                 //msleep(100);\r
749         } else {\r
750                 dev_info(&client->dev, "power pin invalid\n");\r
751         }\r
752 \r
753         if (gpio_is_valid(ts->rst_pin)) {\r
754                 ts->rst_val = (rst_flags & OF_GPIO_ACTIVE_LOW) ? 0 : 1;\r
755                 ret = devm_gpio_request_one(&client->dev, ts->rst_pin, (rst_flags & OF_GPIO_ACTIVE_LOW) ? GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW, "goodix reset pin");\r
756                 if (ret != 0) {\r
757                         dev_err(&client->dev, "goodix gpio_request error\n");\r
758                         return -EIO;\r
759                 }\r
760              //  msleep(100);\r
761         } else {\r
762                 dev_info(&client->dev, "reset pin invalid\n");\r
763         }\r
764 \r
765         if(ts->ts_init)\r
766         {\r
767                 ret = ts->ts_init(ts);\r
768                 if(ret < 0)\r
769                 {\r
770                         printk(KERN_ALERT "rk ts init fail\n");\r
771                         return ret;\r
772                 }\r
773         }\r
774 \r
775         ts->info_buf= devm_kzalloc(&client->dev, ts->max_touch_num*sizeof(struct rk_touch_info), GFP_KERNEL);\r
776         if(!ts->info_buf)\r
777         {\r
778                 dev_err(&client->dev, "alloc for rk_touch_info fail\n");\r
779                 return -ENOMEM;\r
780         }\r
781 \r
782         if(ts->input_parms_init)\r
783         {\r
784                 ts->input_parms_init(ts);\r
785         }\r
786 \r
787         i2c_connect_client = client;\r
788 \r
789         ts->tp.tp_resume = rk_ts_early_resume;\r
790         ts->tp.tp_suspend = rk_ts_early_suspend;\r
791         tp_register_fb(&ts->tp);\r
792 \r
793         i2c_set_clientdata(client, ts);\r
794 \r
795         ts->irq=gpio_to_irq(ts->irq_pin);               //If not defined in client\r
796         if (ts->irq)\r
797         {\r
798                 ret = devm_request_threaded_irq(&client->dev, ts->irq, NULL, rk_ts_irq_handler, irq_flags | IRQF_ONESHOT, client->name, ts);\r
799                 if (ret != 0) {\r
800                         printk(KERN_ALERT "Cannot allocate ts INT!ERRNO:%d\n", ret);\r
801                         goto err;\r
802                 }\r
803                 //disable_irq(ts->irq);\r
804         }\r
805         printk("goodix_ts_init: probe successfully!\n");\r
806         return 0;\r
807 \r
808         \r
809 err:\r
810         tp_unregister_fb(&ts->tp);\r
811         i2c_set_clientdata(client, NULL);       \r
812         return ret;\r
813 }\r
814 \r
815 \r
816 /*******************************************************\r
817 Description:\r
818         Goodix touchscreen driver release function.\r
819 \r
820 Parameter:\r
821         client: i2c device struct.\r
822         \r
823 return:\r
824         Executive outcomes. 0---succeed.\r
825 *******************************************************/\r
826 static int rk_ts_remove(struct i2c_client *client)\r
827 {\r
828         struct rk_ts_data *ts = i2c_get_clientdata(client);\r
829         tp_unregister_fb(&ts->tp);\r
830 \r
831 #ifdef CONFIG_TOUCHSCREEN_GOODIX_IAP\r
832         remove_proc_entry("goodix-update", NULL);\r
833 #endif\r
834         \r
835         dev_notice(&client->dev,"The driver is removing...\n");\r
836         i2c_set_clientdata(client, NULL);\r
837         return 0;\r
838 }\r
839 \r
840 static void rk_ts_shutdown(struct i2c_client *client)\r
841 {\r
842         struct rk_ts_data *ts = i2c_get_clientdata(client);\r
843         if (ts)\r
844                 tp_unregister_fb(&ts->tp);\r
845 \r
846 }\r
847 \r
848 //******************************Begin of firmware update surpport*******************************\r
849 #ifdef CONFIG_TOUCHSCREEN_GOODIX_IAP\r
850 /**\r
851 @brief CRC cal proc,include : Reflect,init_crc32_table,GenerateCRC32\r
852 @param global var oldcrc32\r
853 @return states\r
854 */\r
855 static unsigned int Reflect(unsigned long int ref, char ch)\r
856 {\r
857         unsigned int value=0;\r
858         int i;\r
859         for(i = 1; i < (ch + 1); i++)\r
860         {\r
861                 if(ref & 1)\r
862                         value |= 1 << (ch - i);\r
863                 ref >>= 1;\r
864         }\r
865         return value;\r
866 }\r
867 /*---------------------------------------------------------------------------------------------------------*/\r
868 /*  CRC Check Program INIT                                                                                                                         */\r
869 /*---------------------------------------------------------------------------------------------------------*/\r
870 static void init_crc32_table(void)\r
871 {\r
872         unsigned int temp;\r
873         unsigned int t1,t2;\r
874         unsigned int flag;\r
875         int i,j;\r
876         for(i = 0; i <= 0xFF; i++)\r
877         {\r
878                 temp=Reflect(i, 8);\r
879                 crc32_table[i]= temp<< 24;\r
880                 for (j = 0; j < 8; j++)\r
881                 {\r
882 \r
883                         flag=crc32_table[i]&0x80000000;\r
884                         t1=(crc32_table[i] << 1);\r
885                         if(flag==0)\r
886                                 t2=0;\r
887                         else\r
888                                 t2=ulPolynomial;\r
889                         crc32_table[i] =t1^t2 ;\r
890 \r
891                 }\r
892                 crc32_table[i] = Reflect(crc32_table[i], 32);\r
893         }\r
894 }\r
895 /*---------------------------------------------------------------------------------------------------------*/\r
896 /*  CRC main Program                                                                                                                               */\r
897 /*---------------------------------------------------------------------------------------------------------*/\r
898 static void GenerateCRC32(unsigned char * buf, unsigned int len)\r
899 {\r
900         unsigned int i;\r
901         unsigned int t;\r
902 \r
903         for (i = 0; i != len; ++i)\r
904         {\r
905                 t = (oldcrc32 ^ buf[i]) & 0xFF;\r
906                 oldcrc32 = ((oldcrc32 >> 8) & 0xFFFFFF) ^ crc32_table[t];\r
907         }\r
908 }\r
909 \r
910 static struct file * update_file_open(char * path, mm_segment_t * old_fs_p)\r
911 {\r
912         struct file * filp = NULL;\r
913         int errno = -1;\r
914                 \r
915         filp = filp_open(path, O_RDONLY, 0644);\r
916         \r
917         if(!filp || IS_ERR(filp))\r
918         {\r
919                 if(!filp)\r
920                         errno = -ENOENT;\r
921                 else \r
922                         errno = PTR_ERR(filp);                                  \r
923                 printk(KERN_ERR "The update file for Guitar open error.\n");\r
924                 return NULL;\r
925         }\r
926         *old_fs_p = get_fs();\r
927         set_fs(get_ds());\r
928 \r
929         filp->f_op->llseek(filp,0,0);\r
930         return filp ;\r
931 }\r
932 \r
933 static void update_file_close(struct file * filp, mm_segment_t old_fs)\r
934 {\r
935         set_fs(old_fs);\r
936         if(filp)\r
937                 filp_close(filp, NULL);\r
938 }\r
939 static int update_get_flen(char * path)\r
940 {\r
941         struct file * file_ck = NULL;\r
942         mm_segment_t old_fs;\r
943         int length ;\r
944         \r
945         file_ck = update_file_open(path, &old_fs);\r
946         if(file_ck == NULL)\r
947                 return 0;\r
948 \r
949         length = file_ck->f_op->llseek(file_ck, 0, SEEK_END);\r
950         //printk("File length: %d\n", length);\r
951         if(length < 0)\r
952                 length = 0;\r
953         update_file_close(file_ck, old_fs);\r
954         return length;  \r
955 }\r
956 static int update_file_check(char * path)\r
957 {\r
958         unsigned char buffer[64] = { 0 } ;\r
959         struct file * file_ck = NULL;\r
960         mm_segment_t old_fs;\r
961         int count, ret, length ;\r
962         \r
963         file_ck = update_file_open(path, &old_fs);\r
964         \r
965         if(path != NULL)\r
966                 printk("File Path:%s\n", path);\r
967         \r
968         if(file_ck == NULL)\r
969                 return -ERROR_NO_FILE;\r
970 \r
971         length = file_ck->f_op->llseek(file_ck, 0, SEEK_END);\r
972 #ifdef GUITAR_MESSAGE\r
973         printk(KERN_INFO "gt801 update: File length: %d\n",length);\r
974 #endif  \r
975         if(length <= 0 || (length%4) != 0)\r
976         {\r
977                 update_file_close(file_ck, old_fs);\r
978                 return -ERROR_FILE_TYPE;\r
979         }\r
980         \r
981         //set file point to the begining of the file\r
982         file_ck->f_op->llseek(file_ck, 0, SEEK_SET);    \r
983         oldcrc32 = 0xFFFFFFFF;\r
984         init_crc32_table();\r
985         while(length > 0)\r
986         {\r
987                 ret = file_ck->f_op->read(file_ck, buffer, sizeof(buffer), &file_ck->f_pos);\r
988                 if(ret > 0)\r
989                 {\r
990                         for(count = 0; count < ret;  count++)   \r
991                                 GenerateCRC32(&buffer[count],1);                        \r
992                 }\r
993                 else \r
994                 {\r
995                         update_file_close(file_ck, old_fs);\r
996                         return -ERROR_FILE_READ;\r
997                 }\r
998                 length -= ret;\r
999         }\r
1000         oldcrc32 = ~oldcrc32;\r
1001 #ifdef GUITAR_MESSAGE   \r
1002         printk("CRC_Check: %u\n", oldcrc32);\r
1003 #endif  \r
1004         update_file_close(file_ck, old_fs);\r
1005         return 1;       \r
1006 }\r
1007 \r
1008 unsigned char wait_slave_ready(struct rk_ts_data *ts, unsigned short *timeout)\r
1009 {\r
1010         unsigned char i2c_state_buf[2] = {ADDR_STA, UNKNOWN_ERROR};\r
1011         int ret;\r
1012         while(*timeout < MAX_TIMEOUT)\r
1013         {\r
1014                 ret = goodix_i2c_read_bytes(ts->client, i2c_state_buf, 2);\r
1015                 if(ret <= 0)\r
1016                         return ERROR_I2C_TRANSFER;\r
1017                 if(i2c_state_buf[1] & SLAVE_READY)\r
1018                 {\r
1019                         return i2c_state_buf[1];\r
1020                         //return 1;\r
1021                 }\r
1022                 msleep(10);\r
1023                 *timeout += 5;\r
1024         }\r
1025         return 0;\r
1026 }\r
1027 \r
1028 static int goodix_update_write(struct file *filp, const char __user *buff, unsigned long len, void *data)\r
1029 {\r
1030         unsigned char cmd[220];\r
1031         int ret = -1;\r
1032 \r
1033         static unsigned char update_path[100];\r
1034         static unsigned short time_count = 0;\r
1035         static unsigned int file_len = 0;\r
1036         \r
1037         unsigned char i2c_control_buf[2] = {ADDR_CMD, 0};\r
1038         unsigned char i2c_states_buf[2] = {ADDR_STA, 0};\r
1039         unsigned char i2c_data_buf[PACK_SIZE+1+8] = {ADDR_DAT,};\r
1040         //unsigned char i2c_rd_buf[1+4+PACK_SIZE+4];\r
1041         unsigned char i2c_rd_buf[160];\r
1042         unsigned char retries = 0;\r
1043         unsigned int rd_len;\r
1044         unsigned char i = 0;\r
1045         static unsigned char update_need_config = 0;\r
1046 \r
1047         unsigned char checksum_error_times = 0;\r
1048 #ifdef UPDATE_NEW_PROTOCOL\r
1049         unsigned int frame_checksum = 0;\r
1050         unsigned int frame_number = 0;\r
1051 #else\r
1052         unsigned char send_crc = 0;\r
1053 #endif\r
1054 \r
1055         struct file * file_data = NULL;\r
1056         mm_segment_t old_fs;\r
1057         struct rk_ts_data *ts;\r
1058         \r
1059         ts = i2c_get_clientdata(i2c_connect_client);\r
1060         if(ts==NULL)\r
1061                 return 0;\r
1062         \r
1063         if(copy_from_user(&cmd, buff, len))\r
1064         {\r
1065                 return -EFAULT;\r
1066         }\r
1067         switch(cmd[0])\r
1068         {\r
1069                 case STEP_SET_PATH:\r
1070                         printk(KERN_INFO"Write cmd is:%d,cmd arg is:%s,write len is:%ld\n",cmd[0], &cmd[1], len);\r
1071                         memset(update_path, 0, 100);\r
1072                         strncpy(update_path, cmd+1, 100);\r
1073                         if(update_path[0] == 0)\r
1074                                 return 0;\r
1075                         else\r
1076                                 return 1;\r
1077                 case STEP_CHECK_FILE:\r
1078                         printk(KERN_INFO"Begin to firmware update ......\n");\r
1079                         ret = update_file_check(update_path);\r
1080                         if(ret <= 0)\r
1081                         {\r
1082                                 printk(KERN_INFO"fialed to check update file!\n");\r
1083                                 return ret;\r
1084                         }\r
1085                         msleep(500);\r
1086                         printk(KERN_INFO"Update check file success!\n");\r
1087                         return 1;\r
1088                 case STEP_WRITE_SYN:\r
1089                         printk(KERN_INFO"STEP1:Write synchronization signal!\n");\r
1090                         i2c_control_buf[1] = UPDATE_START;\r
1091                         ret = goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);\r
1092                         if(ret <= 0)\r
1093                         {\r
1094                                 ret = ERROR_I2C_TRANSFER;\r
1095                                 return ret;\r
1096                         }\r
1097                         //the time include time(APROM -> LDROM) and time(LDROM init)\r
1098                         msleep(1000);\r
1099                         return 1;\r
1100                 case STEP_WAIT_SYN:\r
1101                         printk(KERN_INFO"STEP2:Wait synchronization signal!\n");\r
1102                         while(retries < MAX_I2C_RETRIES)\r
1103                         {\r
1104                                 i2c_states_buf[1] = UNKNOWN_ERROR;\r
1105                                 ret = goodix_i2c_read_bytes(ts->client, i2c_states_buf, 2);\r
1106                                 printk(KERN_INFO"The read byte is:%d\n", i2c_states_buf[1]);\r
1107                                 if(i2c_states_buf[1] & UPDATE_START)\r
1108                                 {\r
1109                                         if(i2c_states_buf[1] & NEW_UPDATE_START)\r
1110                                         {\r
1111                                         #ifdef UPDATE_NEW_PROTOCOL\r
1112                                                 update_need_config = 1;\r
1113                                                 return 2;\r
1114                                         #else\r
1115                                                 return 1;\r
1116                                         #endif\r
1117                                         }\r
1118                                         break;\r
1119                                 }\r
1120                                 msleep(5);\r
1121                                 retries++;\r
1122                                 time_count += 10;\r
1123                         }\r
1124                         if((retries >= MAX_I2C_RETRIES) && (!(i2c_states_buf[1] & UPDATE_START)))\r
1125                         {\r
1126                                 if(ret <= 0)\r
1127                                         return 0;\r
1128                                 else\r
1129                                         return -1;\r
1130                         }\r
1131                         return 1;\r
1132                 case STEP_WRITE_LENGTH:\r
1133                         printk(KERN_INFO"STEP3:Write total update file length!\n");\r
1134                         file_len = update_get_flen(update_path);\r
1135                         if(file_len <= 0)\r
1136                         {\r
1137                                 printk(KERN_INFO"get update file length failed!\n");\r
1138                                 return -1;\r
1139                         }\r
1140                         file_len += 4;\r
1141                         i2c_data_buf[1] = (file_len>>24) & 0xff;\r
1142                         i2c_data_buf[2] = (file_len>>16) & 0xff;\r
1143                         i2c_data_buf[3] = (file_len>>8) & 0xff;\r
1144                         i2c_data_buf[4] = file_len & 0xff;\r
1145                         file_len -= 4;\r
1146                         ret = goodix_i2c_write_bytes(ts->client, i2c_data_buf, 5);\r
1147                         if(ret <= 0)\r
1148                         {\r
1149                                 ret = ERROR_I2C_TRANSFER;\r
1150                                 return 0;\r
1151                         }\r
1152                         return 1;\r
1153                 case STEP_WAIT_READY:\r
1154                         printk(KERN_INFO"STEP4:Wait slave ready!\n");\r
1155                         ret = wait_slave_ready(ts, &time_count);\r
1156                         if(ret == ERROR_I2C_TRANSFER)\r
1157                                 return 0;\r
1158                         if(!ret)\r
1159                         {\r
1160                                 return -1;\r
1161                         }\r
1162                         printk(KERN_INFO"Slave ready!\n");\r
1163                         return 1;\r
1164                 case STEP_WRITE_DATA:\r
1165 #ifdef UPDATE_NEW_PROTOCOL\r
1166                         printk(KERN_INFO"STEP5:Begin to send file data use NEW protocol!\n");\r
1167                         file_data = update_file_open(update_path, &old_fs);\r
1168                         if(file_data == NULL)\r
1169                         {\r
1170                                 return -1;\r
1171                         }\r
1172                         frame_number = 0;\r
1173                         while(file_len >= 0)\r
1174                         {\r
1175                                 i2c_data_buf[0] = ADDR_DAT;\r
1176                                 rd_len = (file_len >= PACK_SIZE) ? PACK_SIZE : file_len;\r
1177                                 frame_checksum = 0;\r
1178                                 if(file_len)\r
1179                                 {\r
1180                                         ret = file_data->f_op->read(file_data, i2c_data_buf+1+4, rd_len, &file_data->f_pos);\r
1181                                         if(ret <= 0)\r
1182                                         {\r
1183                                                 printk("[GOODiX_ISP_NEW]:Read File Data Failed!\n");\r
1184                                                 return -1;\r
1185                                         }\r
1186                                         i2c_data_buf[1] = (frame_number>>24)&0xff;\r
1187                                         i2c_data_buf[2] = (frame_number>>16)&0xff;\r
1188                                         i2c_data_buf[3] = (frame_number>>8)&0xff;\r
1189                                         i2c_data_buf[4] = frame_number&0xff;\r
1190                                         frame_number++;\r
1191                                         frame_checksum = 0;\r
1192                                         for(i=0; i<rd_len; i++)\r
1193                                         {\r
1194                                                 frame_checksum += i2c_data_buf[5+i];\r
1195                                         }\r
1196                                         frame_checksum = 0 - frame_checksum;\r
1197                                         i2c_data_buf[5+rd_len+0] = frame_checksum&0xff;\r
1198                                         i2c_data_buf[5+rd_len+1] = (frame_checksum>>8)&0xff;\r
1199                                         i2c_data_buf[5+rd_len+2] = (frame_checksum>>16)&0xff;\r
1200                                         i2c_data_buf[5+rd_len+3] = (frame_checksum>>24)&0xff;\r
1201                                 }\r
1202 rewrite:\r
1203                                 printk(KERN_INFO"[GOODiX_ISP_NEW]:%d\n", file_len);                             \r
1204                                 ret = goodix_i2c_write_bytes(ts->client, i2c_data_buf, 1+4+rd_len+4);\r
1205                                         //if(ret <= 0)\r
1206                                 if(ret != 1)\r
1207                                 {\r
1208                                         printk("[GOODiX_ISP_NEW]:Write File Data Failed!Return:%d\n", ret);\r
1209                                         return 0;\r
1210                                 }\r
1211 \r
1212                                 memset(i2c_rd_buf, 0x00, 1+4+rd_len+4);\r
1213                                 ret = goodix_i2c_read_bytes(ts->client, i2c_rd_buf, 1+4+rd_len+4);\r
1214                                 if(ret != 2)\r
1215                                 {\r
1216                                         printk("[GOODiX_ISP_NEW]:Read File Data Failed!Return:%d\n", ret);\r
1217                                         return 0;\r
1218                                 }\r
1219                                 for(i=1; i<(1+4+rd_len+4); i++)                                         //check communication\r
1220                                 {\r
1221                                         if(i2c_rd_buf[i] != i2c_data_buf[i])\r
1222                                         {\r
1223                                                 i = 0;\r
1224                                                 break;\r
1225                                         }\r
1226                                 }\r
1227                                 if(!i)\r
1228                                 {\r
1229                                         i2c_control_buf[0] = ADDR_CMD;\r
1230                                         i2c_control_buf[1] = 0x03;\r
1231                                         goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);         //communication error\r
1232                                         printk("[GOODiX_ISP_NEW]:File Data Frame readback check Error!\n");\r
1233                                 }\r
1234                                 else\r
1235                                 {\r
1236                                         i2c_control_buf[1] = 0x04;                                                                                                      //let LDROM write flash\r
1237                                         goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);\r
1238                                 }\r
1239                                 \r
1240                                 //Wait for slave ready signal.and read the checksum\r
1241                                 ret = wait_slave_ready(ts, &time_count);\r
1242                                 if((ret & CHECKSUM_ERROR)||(!i))\r
1243                                 {\r
1244                                         if(i)\r
1245                                         {\r
1246                                                 printk("[GOODiX_ISP_NEW]:File Data Frame checksum Error!\n");\r
1247                                         }\r
1248                                         checksum_error_times++;\r
1249                                         msleep(20);\r
1250                                         if(checksum_error_times > 20)                           //max retry times.\r
1251                                                 return 0;\r
1252                                         goto rewrite;\r
1253                                 }\r
1254                                 checksum_error_times = 0;\r
1255                                 if(ret & (FRAME_ERROR))\r
1256                                 {\r
1257                                         printk("[GOODiX_ISP_NEW]:File Data Frame Miss!\n");\r
1258                                         return 0;\r
1259                                 }\r
1260                                 if(ret == ERROR_I2C_TRANSFER)\r
1261                                         return 0;\r
1262                                 if(!ret)\r
1263                                 {\r
1264                                         return -1;\r
1265                                 }\r
1266                                 if(file_len < PACK_SIZE)\r
1267                                 {\r
1268                                         update_file_close(file_data, old_fs);\r
1269                                         break;\r
1270                                 }\r
1271                                 file_len -= rd_len;\r
1272                         }//end of while((file_len >= 0))\r
1273                         return 1;\r
1274 #else\r
1275                         printk(KERN_INFO"STEP5:Begin to send file data use OLD protocol!\n");\r
1276                         file_data = update_file_open(update_path, &old_fs);\r
1277                         if(file_data == NULL)   //file_data has been opened at the last time\r
1278                         {\r
1279                                 return -1;\r
1280                         }\r
1281                         while((file_len >= 0) && (!send_crc))\r
1282                         {\r
1283                                 printk(KERN_INFO"[GOODiX_ISP_OLD]:%d\n", file_len);\r
1284                                 i2c_data_buf[0] = ADDR_DAT;\r
1285                                 rd_len = (file_len >= PACK_SIZE) ? PACK_SIZE : file_len;\r
1286                                 if(file_len)\r
1287                                 {\r
1288                                         ret = file_data->f_op->read(file_data, i2c_data_buf+1, rd_len, &file_data->f_pos);\r
1289                                         if(ret <= 0)\r
1290                                         {\r
1291                                                 return -1;\r
1292                                         }\r
1293                                 }\r
1294                                 if(file_len < PACK_SIZE)\r
1295                                 {\r
1296                                         send_crc = 1;\r
1297                                         update_file_close(file_data, old_fs);\r
1298                                         i2c_data_buf[file_len+1] = oldcrc32&0xff;\r
1299                                         i2c_data_buf[file_len+2] = (oldcrc32>>8)&0xff;\r
1300                                         i2c_data_buf[file_len+3] = (oldcrc32>>16)&0xff;\r
1301                                         i2c_data_buf[file_len+4] = (oldcrc32>>24)&0xff;\r
1302                                         ret = goodix_i2c_write_bytes(ts->client, i2c_data_buf, (file_len+1+4));\r
1303                                         //if(ret <= 0)\r
1304                                         if(ret != 1)\r
1305                                         {\r
1306                                                 printk("[GOODiX_ISP_OLD]:Write File Data Failed!Return:%d\n", ret);\r
1307                                                 return 0;\r
1308                                         }\r
1309                                         break;\r
1310                                 }\r
1311                                 else\r
1312                                 {\r
1313                                         ret = goodix_i2c_write_bytes(ts->client, i2c_data_buf, PACK_SIZE+1);\r
1314                                         //if(ret <= 0)\r
1315                                         if(ret != 1)\r
1316                                         {\r
1317                                                 printk("[GOODiX_ISP_OLD]:Write File Data Failed!Return:%d\n", ret);\r
1318                                                 return 0;\r
1319                                         }\r
1320                                 }\r
1321                                 file_len -= rd_len;\r
1322                         \r
1323                                 //Wait for slave ready signal.\r
1324                                 ret = wait_slave_ready(ts, &time_count);\r
1325                                 if(ret == ERROR_I2C_TRANSFER)\r
1326                                         return 0;\r
1327                                 if(!ret)\r
1328                                 {\r
1329                                         return -1;\r
1330                                 }\r
1331                                 //Slave is ready.\r
1332                         }//end of while((file_len >= 0) && (!send_crc))\r
1333                         return 1;\r
1334 #endif\r
1335                 case STEP_READ_STATUS:\r
1336                         printk(KERN_INFO"STEP6:Read update status!\n");\r
1337                         while(time_count < MAX_TIMEOUT)\r
1338                         {\r
1339                                 ret = goodix_i2c_read_bytes(ts->client, i2c_states_buf, 2);\r
1340                                 if(ret <= 0)\r
1341                                 {\r
1342                                         return 0;\r
1343                                 }\r
1344                                 if(i2c_states_buf[1] & SLAVE_READY)\r
1345                                 {\r
1346                                         if(!(i2c_states_buf[1] &0xf0))\r
1347                                         {\r
1348                                                 printk(KERN_INFO"The firmware updating succeed!update state:0x%x\n",i2c_states_buf[1]);\r
1349                                                 return 1;\r
1350                                         }\r
1351                                         else\r
1352                                         {\r
1353                                                 printk(KERN_INFO"The firmware updating failed!update state:0x%x\n",i2c_states_buf[1]);\r
1354                                                 return 0;\r
1355 \r
1356                                         }\r
1357                                 }\r
1358                                 msleep(1);\r
1359                                 time_count += 5;\r
1360                         }\r
1361                         return -1;\r
1362                 case FUN_CLR_VAL:                                                               //clear the static val\r
1363                         time_count = 0;\r
1364                         file_len = 0;\r
1365                         update_need_config = 0;\r
1366                         return 1;\r
1367                 case FUN_CMD:                                                   //functional command\r
1368                         if(cmd[1] == CMD_DISABLE_TP)\r
1369                         {\r
1370                                 printk(KERN_INFO"Disable TS int!\n");\r
1371                                 g_enter_isp = 1;\r
1372                                 disable_irq(ts->irq);\r
1373                         }\r
1374                         else if(cmd[1] == CMD_ENABLE_TP)\r
1375                         {\r
1376                                 printk(KERN_INFO"Enable TS int!\n");\r
1377                                 g_enter_isp = 0;\r
1378                                 enable_irq(ts->irq);\r
1379                         }\r
1380                         else if(cmd[1] == CMD_READ_VER)\r
1381                         {\r
1382                                 printk(KERN_INFO"Read version!\n");\r
1383                                 ts->read_mode = MODE_RD_VER;\r
1384                         }\r
1385                         else if(cmd[1] == CMD_READ_RAW)\r
1386                         {\r
1387                                 printk(KERN_INFO"Read raw data!\n");\r
1388                                 ts->read_mode = MODE_RD_RAW;\r
1389                                 i2c_control_buf[1] = 201;\r
1390                                 ret = goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);                   //read raw data cmd\r
1391                                 if(ret <= 0)\r
1392                                 {\r
1393                                         printk(KERN_INFO"Write read raw data cmd failed!\n");\r
1394                                         return 0;\r
1395                                 }\r
1396                                 msleep(200);\r
1397                         }\r
1398                         else if(cmd[1] == CMD_READ_DIF)\r
1399                         {\r
1400                                 printk(KERN_INFO"Read diff data!\n");\r
1401                                 ts->read_mode = MODE_RD_DIF;\r
1402                                 i2c_control_buf[1] = 202;\r
1403                                 ret = goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);                   //read diff data cmd\r
1404                                 if(ret <= 0)\r
1405                                 {\r
1406                                         printk(KERN_INFO"Write read raw data cmd failed!\n");\r
1407                                         return 0;\r
1408                                 }\r
1409                                 msleep(200);\r
1410                         }\r
1411                         else if(cmd[1] == CMD_READ_CFG)\r
1412                         {\r
1413                                 printk(KERN_INFO"Read config info!\n");\r
1414                                 ts->read_mode = MODE_RD_CFG;\r
1415                                 rd_cfg_addr = cmd[2];\r
1416                                 rd_cfg_len = cmd[3];\r
1417                         }\r
1418                         else if(cmd[1] == CMD_SYS_REBOOT)\r
1419                         {\r
1420                                 printk(KERN_INFO"System reboot!\n");\r
1421                                 sys_sync();\r
1422                                 msleep(200);\r
1423                                 kernel_restart(NULL);\r
1424                         }\r
1425                         return 1;\r
1426                 case FUN_WRITE_CONFIG:\r
1427                         \r
1428                         printk(KERN_INFO"Begin write config info!Config length:%d\n",cmd[1]);\r
1429                         for(i=3; i<cmd[1];i++)\r
1430                         {\r
1431                                 //if((i-3)%5 == 0)printk("\n");\r
1432                                 printk("(%d):0x%x ", i-3, cmd[i]);\r
1433                         }\r
1434                         printk("\n");\r
1435 \r
1436                         if((cmd[2]>83)&&(cmd[2]<240)&&cmd[1])\r
1437                         {\r
1438                                 checksum_error_times = 0;\r
1439 reconfig:\r
1440                                 ret = goodix_i2c_write_bytes(ts->client, cmd+2, cmd[1]); \r
1441                                 if(ret != 1)\r
1442                                 {\r
1443                                         printk("Write Config failed!return:%d\n",ret);\r
1444                                         return -1;\r
1445                                 }\r
1446                                 if(!update_need_config)return 1;\r
1447                                 \r
1448                                 i2c_rd_buf[0] = cmd[2];\r
1449                                 ret = goodix_i2c_read_bytes(ts->client, i2c_rd_buf, cmd[1]);\r
1450                                 if(ret != 2)\r
1451                                 {\r
1452                                         printk("Read Config failed!return:%d\n",ret);\r
1453                                         return -1;\r
1454                                 }\r
1455                                 for(i=0; i<cmd[1]; i++)\r
1456                                 {\r
1457                                         if(i2c_rd_buf[i] != cmd[i+2])\r
1458                                         {\r
1459                                                 printk("Config readback check failed!\n");\r
1460                                                 i = 0;\r
1461                                                 break;\r
1462                                         }\r
1463                                 }\r
1464                                 if(!i)\r
1465                                 {\r
1466                                         i2c_control_buf[0] = ADDR_CMD;\r
1467                                         i2c_control_buf[1] = 0x03;\r
1468                                         goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);         //communication error\r
1469                                         checksum_error_times++;\r
1470                                         msleep(20);\r
1471                                         if(checksum_error_times > 20)                           //max retry times.\r
1472                                                 return 0;\r
1473                                         goto reconfig;\r
1474                                 }\r
1475                                 else\r
1476                                 {\r
1477                                         i2c_control_buf[0] = ADDR_CMD;\r
1478                                         i2c_control_buf[1] = 0x04;                                      //let LDROM write flash\r
1479                                         goodix_i2c_write_bytes(ts->client, i2c_control_buf, 2);\r
1480                                         return 1;\r
1481                                 }\r
1482                                 \r
1483                         }\r
1484                         else\r
1485                         {\r
1486                                 printk(KERN_INFO"Invalid config addr!\n");\r
1487                                 return -1;\r
1488                         }\r
1489                 default:\r
1490                         return -ENOSYS;\r
1491         }\r
1492         return 0;\r
1493 }\r
1494 \r
1495 static int goodix_update_read( char *page, char **start, off_t off, int count, int *eof, void *data )\r
1496 {\r
1497         int ret = -1;\r
1498         struct rk_ts_data *ts;\r
1499         int len = 0;\r
1500         char *version_info = NULL;\r
1501         static unsigned char read_data[1201] = {80, };\r
1502 \r
1503         ts = i2c_get_clientdata(i2c_connect_client);\r
1504         if(ts==NULL)\r
1505                 return 0;\r
1506 \r
1507         if(ts->read_mode == MODE_RD_VER)                //read version data\r
1508         {\r
1509                 ret = goodix_read_version(ts, &version_info);\r
1510                 if(ret <= 0)\r
1511                 {\r
1512                         printk(KERN_INFO"Read version data failed!\n");\r
1513                         vfree(version_info);\r
1514                         return 0;\r
1515                 }\r
1516 \r
1517                 for(len=0;len<100;len++)\r
1518                 {\r
1519                         if(*(version_info + len) == '\0')\r
1520                                 break;\r
1521                 }\r
1522                 printk(KERN_INFO"GOODiX Touchscreen Version is:%s\n", (version_info+1));\r
1523                 strncpy(page, version_info+1, len + 1);\r
1524                 vfree(version_info);\r
1525                 *eof = 1;\r
1526                 return len+1;\r
1527         }\r
1528         else if((ts->read_mode == MODE_RD_RAW)||(ts->read_mode == MODE_RD_DIF))         //read raw data or diff\r
1529         {\r
1530                 //printk(KERN_INFO"Read raw data\n");\r
1531                 ret = goodix_i2c_read_bytes(ts->client, read_data, 1201);\r
1532                 if(ret <= 0)\r
1533                 {\r
1534                         if(ts->read_mode == 2)\r
1535                                 printk(KERN_INFO"Read raw data failed!\n");\r
1536                         if(ts->read_mode == 3)\r
1537                                 printk(KERN_INFO"Read diff data failed!\n");\r
1538                         return 0;\r
1539                 }\r
1540                 memcpy(page, read_data+1, 1200);\r
1541                 *eof = 1;\r
1542                 *start = NULL;\r
1543                 return 1200;\r
1544         }\r
1545         else if(ts->read_mode == MODE_RD_CFG)\r
1546         {\r
1547                 if((rd_cfg_addr>83)&&(rd_cfg_addr<240))\r
1548                 {\r
1549                         read_data[0] = rd_cfg_addr;\r
1550                         printk("read config addr is:%d\n", rd_cfg_addr);\r
1551                 }\r
1552                 else\r
1553                 {\r
1554                         read_data[0] = 101;\r
1555                         printk("invalid read config addr,use default!\n");\r
1556                 }\r
1557                 if((rd_cfg_len<0)||(rd_cfg_len>156))\r
1558                 {\r
1559                         printk("invalid read config length,use default!\n");\r
1560                         rd_cfg_len = 239 - read_data[0];\r
1561                 }\r
1562                 printk("read config length is:%d\n", rd_cfg_len);\r
1563                 ret = goodix_i2c_read_bytes(ts->client, read_data, rd_cfg_len);\r
1564                 if(ret <= 0)\r
1565                 {\r
1566                         printk(KERN_INFO"Read config info failed!\n");\r
1567                         return 0;\r
1568                 }\r
1569                 memcpy(page, read_data+1, rd_cfg_len);\r
1570                 return rd_cfg_len;\r
1571         }\r
1572         return len;\r
1573 }\r
1574               \r
1575 #endif\r
1576 //******************************End of firmware update surpport*******************************\r
1577 static const struct i2c_device_id goodix_ts_id[] = {\r
1578         { "Goodix-TS", 0 },\r
1579         { }\r
1580 };\r
1581 \r
1582 static struct of_device_id goodix_ts_dt_ids[] = {\r
1583         { .compatible = "goodix,gt8xx" },\r
1584         { }\r
1585 };\r
1586 \r
1587 static struct i2c_driver rk_ts_driver = {\r
1588         .probe          = rk_ts_probe,\r
1589         .remove         = rk_ts_remove,\r
1590         .shutdown       = rk_ts_shutdown,\r
1591         .id_table       = goodix_ts_id,\r
1592         .driver = {\r
1593                 .name   = "Goodix-TS",\r
1594                 .owner = THIS_MODULE,\r
1595                 .of_match_table = of_match_ptr(goodix_ts_dt_ids),\r
1596         },\r
1597 };\r
1598 \r
1599 \r
1600 static struct class *ts_debug_class = NULL;\r
1601 static ssize_t dbg_mode_show(struct class *cls,struct class_attribute *attr, char *_buf)\r
1602 {\r
1603        printk("%s>>>>>>>>\n",__func__);\r
1604        return 0;\r
1605 }\r
1606 \r
1607 static ssize_t dbg_mode_store(struct class *cls,struct class_attribute *attr, const char *buf, size_t _count)\r
1608 {\r
1609         dbg_thresd = simple_strtol(buf,NULL,10);\r
1610         if(dbg_thresd)\r
1611         {\r
1612                 printk(KERN_INFO "ts debug open\n");\r
1613         }\r
1614         else\r
1615         {\r
1616                 printk(KERN_INFO "ts debug close");\r
1617         }\r
1618       \r
1619     return _count;\r
1620 }\r
1621 static CLASS_ATTR(debug, 0664, dbg_mode_show, dbg_mode_store);\r
1622 \r
1623 static int dbg_sys_init(void)\r
1624 {\r
1625         int ret ;\r
1626         ts_debug_class = class_create(THIS_MODULE, "ts_debug");\r
1627         ret =  class_create_file(ts_debug_class, &class_attr_debug);\r
1628     if (ret)\r
1629     {\r
1630        printk("Fail to creat class hkrkfb.\n");\r
1631     }\r
1632    return 0;\r
1633 }\r
1634 \r
1635 \r
1636 /*******************************************************        \r
1637 Description:\r
1638         Driver Install function.\r
1639 return:\r
1640         Executive Outcomes. 0---succeed.\r
1641 ********************************************************/\r
1642 \r
1643 static void __init rk_ts_init_async(void *unused, async_cookie_t cookie)\r
1644 {\r
1645         i2c_add_driver(&rk_ts_driver);\r
1646         dbg_sys_init();  //for debug\r
1647 }\r
1648 \r
1649 static int __init rk_ts_init(void)\r
1650 {\r
1651         async_schedule(rk_ts_init_async, NULL);\r
1652         return 0;\r
1653 }\r
1654 \r
1655 /*******************************************************        \r
1656 Description:\r
1657         Driver uninstall function.\r
1658 return:\r
1659         Executive Outcomes. 0---succeed.\r
1660 ********************************************************/\r
1661 static void __exit rk_ts_exit(void)\r
1662 {\r
1663         printk(KERN_ALERT "Touchscreen driver of guitar exited.\n");\r
1664         i2c_del_driver(&rk_ts_driver);\r
1665 }\r
1666 \r
1667 module_init(rk_ts_init);\r
1668 module_exit(rk_ts_exit);\r
1669 \r
1670 MODULE_DESCRIPTION("Goodix Touchscreen Driver");\r
1671 MODULE_LICENSE("GPL");\r