Merge remote-tracking branch 'remotes/tegra/android-tegra-2.6.36-honeycomb-mr1' into...
[firefly-linux-kernel-4.4.55.git] / drivers / input / touchscreen / ft5406_ts.c
1 /* 
2  * drivers/input/touchscreen/ft5x0x_ts.c
3  *
4  * FocalTech ft5x0x TouchScreen driver. 
5  *
6  * Copyright (c) 2010  Focal tech Ltd.
7  *
8  * This software is licensed under the terms of the GNU General Public
9  * License version 2, as published by the Free Software Foundation, and
10  * may be copied, distributed, and modified under those terms.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  *
18  *      note: only support mulititouch  Wenfs 2010-10-01
19  */
20
21 #include <linux/input.h>
22 #include <linux/module.h>
23 #include <linux/init.h>
24 #include <linux/interrupt.h>
25 #include <linux/kernel.h>
26 #include <linux/platform_device.h>
27 #include <linux/spi/spi.h>
28 #include <linux/slab.h>
29 #include <linux/fcntl.h>
30 #include <linux/delay.h>
31 #include <linux/device.h>
32 #include <linux/timer.h>
33 #include <linux/jiffies.h>
34 #include <linux/miscdevice.h>
35 #include <linux/types.h>
36 #include <linux/io.h>
37 #include <linux/delay.h>
38 #include <linux/ioport.h>
39 #include <linux/input-polldev.h>
40 #include <linux/i2c.h>
41 #include <linux/workqueue.h>
42 #ifdef CONFIG_ANDROID_POWER
43 #include <linux/android_power.h>
44 #endif
45 #include <mach/hardware.h>
46 #include <asm/setup.h>
47 #include <asm/mach-types.h>
48 #include <asm/mach/arch.h>
49 #include <asm/mach/map.h>
50 #include <asm/mach/flash.h>
51 #include <asm/hardware/gic.h>
52 #include <mach/iomux.h>
53 #include <mach/gpio.h>
54 #include <mach/irqs.h>
55 #include <mach/rk29_iomap.h>
56 #include <mach/board.h>
57 #include <mach/rk29_nand.h>
58 #include <mach/rk29_camera.h>                          /* ddl@rock-chips.com : camera support */
59 #include <media/soc_camera.h>                               /* ddl@rock-chips.com : camera support */
60 #include <mach/vpu_mem.h>
61 #include <mach/sram.h>
62 #ifdef CONFIG_HAS_EARLYSUSPEND
63 #include <linux/earlysuspend.h>
64 static struct early_suspend ft5406_early_suspend;
65 #endif
66
67
68
69
70 #define CONFIG_FT5X0X_MULTITOUCH  1
71 #define MAX_POINT                 5
72 #define FT5406_IIC_SPEED          400*1000    //300*1000
73 #define TOUCH_RESET_PIN           RK29_PIN6_PC3
74 #define FT5X0X_REG_THRES          0x80         /* Thresshold, the threshold be low, the sensitivy will be high */
75 #define FT5X0X_REG_REPORT_RATE    0x88         /* **************report rate, in unit of 10Hz **************/
76 #define FT5X0X_REG_PMODE          0xA5         /* Power Consume Mode 0 -- active, 1 -- monitor, 3 -- sleep */    
77 #define FT5X0X_REG_FIRMID         0xA6         /* ***************firmware version **********************/
78 #define FT5X0X_REG_NOISE_MODE     0xb2         /* to enable or disable power noise, 1 -- enable, 0 -- disable */
79 #define SCREEN_MAX_X              800
80 #define SCREEN_MAX_Y              480
81 #define PRESS_MAX                 255
82 #define FT5X0X_NAME                   "ft5x0x_ts"//"synaptics_i2c_rmi"//"synaptics-rmi-ts"// 
83 #define TOUCH_MAJOR_MAX           200
84 #define WIDTH_MAJOR_MAX           200
85 //FT5X0X_REG_PMODE
86 #define PMODE_ACTIVE              0x00
87 #define PMODE_MONITOR             0x01
88 #define PMODE_STANDBY             0x02
89 #define PMODE_HIBERNATE           0x03
90
91
92 struct ts_event {
93         u16     x1;
94         u16     y1;
95         u16     x2;
96         u16     y2;
97         u16     x3;
98         u16     y3;
99         u16     x4;
100         u16     y4;
101         u16     x5;
102         u16     y5;
103         u16     pressure;
104     s16  touch_ID1;
105         s16  touch_ID2;
106     s16  touch_ID3;
107     s16  touch_ID4;
108         s16  touch_ID5;
109         u8   touch_point;
110         u8   status;
111 };
112
113 struct tp_event {
114         u16     x;
115         u16     y;
116     s16 id;
117         u16     pressure;
118         u8  touch_point;
119         u8  flag;
120 };
121
122 struct ft5x0x_ts_data {
123         struct i2c_client *client;
124         struct input_dev        *input_dev;
125         int    irq;
126         struct ts_event         event;
127         struct work_struct      pen_event_work;
128         struct workqueue_struct *ts_workqueue;
129 };
130 static struct i2c_client *this_client;
131
132 /***********************************************************************/
133
134 #define    FTS_PACKET_LENGTH        128
135
136
137 static u8 CTPM_FW[]=
138 {
139 #include "ft_app.i"
140 };
141
142 typedef enum
143 {
144     ERR_OK,
145     ERR_MODE,
146     ERR_READID,
147     ERR_ERASE,
148     ERR_STATUS,
149     ERR_ECC,
150     ERR_DL_ERASE_FAIL,
151     ERR_DL_PROGRAM_FAIL,
152     ERR_DL_VERIFY_FAIL
153 }E_UPGRADE_ERR_TYPE;
154
155 /***********************************************************************/
156
157 /***********************************************************************
158     [function]: 
159                            callback:                send data to ctpm by i2c interface;
160     [parameters]:
161                             txdata[in]:              data buffer which is used to send data;
162                             length[in]:              the length of the data buffer;
163     [return]:
164                             FTS_TRUE:              success;
165                             FTS_FALSE:             fail;
166 ************************************************************************/
167 static int fts_i2c_txdata(u8 *txdata, int length)
168 {
169         int ret;
170
171         struct i2c_msg msg;
172
173       msg.addr = this_client->addr;
174       msg.flags = 0;
175       msg.len = length;
176       msg.buf = txdata;
177         ret = i2c_transfer(this_client->adapter, &msg, 1);
178         if (ret < 0)
179                 pr_err("%s i2c write error: %d\n", __func__, ret);
180
181         return ret;
182 }
183
184 /***********************************************************************
185     [function]: 
186                            callback:               write data to ctpm by i2c interface;
187     [parameters]:
188                             buffer[in]:             data buffer;
189                             length[in]:            the length of the data buffer;
190     [return]:
191                             FTS_TRUE:            success;
192                             FTS_FALSE:           fail;
193 ************************************************************************/
194 static bool  i2c_write_interface(u8* pbt_buf, int dw_lenth)
195 {
196     int ret;
197     ret=i2c_master_send(this_client, pbt_buf, dw_lenth);
198     if(ret<=0)
199     {
200         printk("[TSP]i2c_write_interface error line = %d, ret = %d\n", __LINE__, ret);
201         return false;
202     }
203
204     return true;
205 }
206
207 /***********************************************************************
208     [function]: 
209                            callback:                read register value ftom ctpm by i2c interface;
210     [parameters]:
211                         reg_name[in]:         the register which you want to write;
212                             tx_buf[in]:              buffer which is contained of the writing value;
213     [return]:
214                             FTS_TRUE:              success;
215                             FTS_FALSE:             fail;
216 ************************************************************************/
217 static bool fts_register_write(u8 reg_name, u8* tx_buf)
218 {
219         u8 write_cmd[2] = {0};
220
221         write_cmd[0] = reg_name;
222         write_cmd[1] = *tx_buf;
223
224         /*call the write callback function*/
225         return i2c_write_interface(write_cmd, 2);
226 }
227
228 /***********************************************************************
229 [function]: 
230                       callback:         send a command to ctpm.
231 [parameters]:
232                           btcmd[in]:       command code;
233                           btPara1[in]:     parameter 1;    
234                           btPara2[in]:     parameter 2;    
235                           btPara3[in]:     parameter 3;    
236                       num[in]:         the valid input parameter numbers, 
237                                            if only command code needed and no 
238                                            parameters followed,then the num is 1;    
239 [return]:
240                           FTS_TRUE:      success;
241                           FTS_FALSE:     io fail;
242 ************************************************************************/
243 static bool cmd_write(u8 btcmd,u8 btPara1,u8 btPara2,u8 btPara3,u8 num)
244 {
245     u8 write_cmd[4] = {0};
246
247     write_cmd[0] = btcmd;
248     write_cmd[1] = btPara1;
249     write_cmd[2] = btPara2;
250     write_cmd[3] = btPara3;
251     return i2c_write_interface(write_cmd, num);
252 }
253
254 /***********************************************************************
255     [function]: 
256                            callback:              read data from ctpm by i2c interface;
257     [parameters]:
258                             buffer[in]:            data buffer;
259                             length[in]:           the length of the data buffer;
260     [return]:
261                             FTS_TRUE:            success;
262                             FTS_FALSE:           fail;
263 ************************************************************************/
264 static bool i2c_read_interface(u8* pbt_buf, int dw_lenth)
265 {
266     int ret;
267     
268     ret=i2c_master_recv(this_client, pbt_buf, dw_lenth);
269
270     if(ret<=0)
271     {
272         printk("[TSP]i2c_read_interface error\n");
273         return false;
274     }
275   
276     return true;
277 }
278
279
280 /***********************************************************************
281 [function]: 
282                       callback:         read a byte data  from ctpm;
283 [parameters]:
284                           buffer[in]:       read buffer;
285                           length[in]:      the size of read data;    
286 [return]:
287                           FTS_TRUE:      success;
288                           FTS_FALSE:     io fail;
289 ************************************************************************/
290 static bool byte_read(u8* buffer, int length)
291 {
292     return i2c_read_interface(buffer, length);
293 }
294
295 /***********************************************************************
296 [function]: 
297                       callback:         write a byte data  to ctpm;
298 [parameters]:
299                           buffer[in]:       write buffer;
300                           length[in]:      the size of write data;    
301 [return]:
302                           FTS_TRUE:      success;
303                           FTS_FALSE:     io fail;
304 ************************************************************************/
305 static bool byte_write(u8* buffer, int length)
306 {
307     
308     return i2c_write_interface(buffer, length);
309 }
310
311 /***********************************************************************
312     [function]: 
313                            callback:                 read register value ftom ctpm by i2c interface;
314     [parameters]:
315                         reg_name[in]:         the register which you want to read;
316                             rx_buf[in]:              data buffer which is used to store register value;
317                             rx_length[in]:          the length of the data buffer;
318     [return]:
319                             FTS_TRUE:              success;
320                             FTS_FALSE:             fail;
321 ************************************************************************/
322 static bool fts_register_read(u8 reg_name, u8* rx_buf, int rx_length)
323 {
324         u8 read_cmd[2]= {0};
325         u8 cmd_len      = 0;
326
327         read_cmd[0] = reg_name;
328         cmd_len = 1;    
329
330         /*send register addr*/
331         if(!i2c_write_interface(&read_cmd[0], cmd_len))
332         {
333                 return false;
334         }
335
336         /*call the read callback function to get the register value*/           
337         if(!i2c_read_interface(rx_buf, rx_length))
338         {
339                 return false;
340         }
341         return true;
342 }
343
344
345
346 /***********************************************************************
347 [function]: 
348                         callback:          burn the FW to ctpm.
349 [parameters]:
350                             pbt_buf[in]:     point to Head+FW ;
351                             dw_lenth[in]:   the length of the FW + 6(the Head length);    
352 [return]:
353                             ERR_OK:          no error;
354                             ERR_MODE:      fail to switch to UPDATE mode;
355                             ERR_READID:   read id fail;
356                             ERR_ERASE:     erase chip fail;
357                             ERR_STATUS:   status error;
358                             ERR_ECC:        ecc error.
359 ************************************************************************/
360 E_UPGRADE_ERR_TYPE  fts_ctpm_fw_upgrade(u8* pbt_buf, int dw_lenth)
361 {
362     u8  cmd,reg_val[2] = {0};
363     u8  packet_buf[FTS_PACKET_LENGTH + 6];
364     u8  auc_i2c_write_buf[10];
365     u8  bt_ecc;
366         
367     int  j,temp,lenght,i_ret,packet_number, i = 0;
368     int  i_is_new_protocol = 0;
369         
370
371     /******write 0xaa to register 0xfc******/
372     cmd=0xaa;
373     fts_register_write(0xfc,&cmd);
374     mdelay(50);
375         
376      /******write 0x55 to register 0xfc******/
377     cmd=0x55;
378     fts_register_write(0xfc,&cmd);
379     printk("[TSP] Step 1: Reset CTPM test\n");
380    
381     mdelay(10);   
382
383
384     /*******Step 2:Enter upgrade mode ****/
385     printk("\n[TSP] Step 2:enter new update mode\n");
386     auc_i2c_write_buf[0] = 0x55;
387     auc_i2c_write_buf[1] = 0xaa;
388     do
389     {
390         i ++;
391         i_ret = fts_i2c_txdata(auc_i2c_write_buf, 2);
392         mdelay(5);
393     }while(i_ret <= 0 && i < 10 );
394
395     if (i > 1)
396     {
397         i_is_new_protocol = 1;
398     }
399
400     /********Step 3:check READ-ID********/        
401     cmd_write(0x90,0x00,0x00,0x00,4);
402     byte_read(reg_val,2);
403     if (reg_val[0] == 0x79 && reg_val[1] == 0x3)
404     {
405         printk("[TSP] Step 3: CTPM ID,ID1 = 0x%x,ID2 = 0x%x\n",reg_val[0],reg_val[1]);
406     }
407     else
408     {
409         return ERR_READID;
410         //i_is_new_protocol = 1;
411     }
412     
413
414      /*********Step 4:erase app**********/
415     if (i_is_new_protocol)
416     {
417         cmd_write(0x61,0x00,0x00,0x00,1);
418     }
419     else
420     {
421         cmd_write(0x60,0x00,0x00,0x00,1);
422     }
423     mdelay(1500);
424     printk("[TSP] Step 4: erase. \n");
425
426
427
428     /*Step 5:write firmware(FW) to ctpm flash*/
429     bt_ecc = 0;
430     printk("[TSP] Step 5: start upgrade. \n");
431     dw_lenth = dw_lenth - 8;
432     packet_number = (dw_lenth) / FTS_PACKET_LENGTH;
433     packet_buf[0] = 0xbf;
434     packet_buf[1] = 0x00;
435     for (j=0;j<packet_number;j++)
436     {
437         temp = j * FTS_PACKET_LENGTH;
438         packet_buf[2] = (u8)(temp>>8);
439         packet_buf[3] = (u8)temp;
440         lenght = FTS_PACKET_LENGTH;
441         packet_buf[4] = (u8)(lenght>>8);
442         packet_buf[5] = (u8)lenght;
443
444         for (i=0;i<FTS_PACKET_LENGTH;i++)
445         {
446             packet_buf[6+i] = pbt_buf[j*FTS_PACKET_LENGTH + i]; 
447             bt_ecc ^= packet_buf[6+i];
448         }
449         
450         byte_write(&packet_buf[0],FTS_PACKET_LENGTH + 6);
451         mdelay(FTS_PACKET_LENGTH/6 + 1);
452         if ((j * FTS_PACKET_LENGTH % 1024) == 0)
453         {
454               printk("[TSP] upgrade the 0x%x th byte.\n", ((unsigned int)j) * FTS_PACKET_LENGTH);
455         }
456     }
457
458     if ((dw_lenth) % FTS_PACKET_LENGTH > 0)
459     {
460         temp = packet_number * FTS_PACKET_LENGTH;
461         packet_buf[2] = (u8)(temp>>8);
462         packet_buf[3] = (u8)temp;
463
464         temp = (dw_lenth) % FTS_PACKET_LENGTH;
465         packet_buf[4] = (u8)(temp>>8);
466         packet_buf[5] = (u8)temp;
467
468         for (i=0;i<temp;i++)
469         {
470             packet_buf[6+i] = pbt_buf[ packet_number*FTS_PACKET_LENGTH + i]; 
471             bt_ecc ^= packet_buf[6+i];
472         }
473
474         byte_write(&packet_buf[0],temp+6);    
475         mdelay(20);
476     }
477
478     /***********send the last six byte**********/
479     for (i = 0; i<6; i++)
480     {
481         temp = 0x6ffa + i;
482         packet_buf[2] = (u8)(temp>>8);
483         packet_buf[3] = (u8)temp;
484         temp =1;
485         packet_buf[4] = (u8)(temp>>8);
486         packet_buf[5] = (u8)temp;
487         packet_buf[6] = pbt_buf[ dw_lenth + i]; 
488         bt_ecc ^= packet_buf[6];
489
490         byte_write(&packet_buf[0],7);  
491         mdelay(20);
492     }
493
494     /********send the opration head************/
495     cmd_write(0xcc,0x00,0x00,0x00,1);
496     byte_read(reg_val,1);
497     printk("[TSP] Step 6:  ecc read 0x%x, new firmware 0x%x. \n", reg_val[0], bt_ecc);
498     if(reg_val[0] != bt_ecc)
499     {
500         return ERR_ECC;
501     }
502
503     /*******Step 7: reset the new FW**********/
504     cmd_write(0x07,0x00,0x00,0x00,1);
505
506     return ERR_OK;
507 }
508
509
510 /***********************************************************************/
511
512 int fts_ctpm_fw_upgrade_with_i_file(void)
513 {
514    u8*     pbt_buf = 0;
515    int i_ret;
516     
517    pbt_buf = CTPM_FW;
518    i_ret =  fts_ctpm_fw_upgrade(pbt_buf,sizeof(CTPM_FW));
519    
520    return i_ret;
521 }
522
523 /***********************************************************************/
524
525 unsigned char fts_ctpm_get_upg_ver(void)
526 {
527     unsigned int ui_sz;
528         
529     ui_sz = sizeof(CTPM_FW);
530     if (ui_sz > 2)
531     {
532         return CTPM_FW[ui_sz - 2];
533     }
534     else
535         return 0xff; 
536  
537 }
538
539 /*read the it7260 register ,used i2c bus*/
540 static int ft5406_read_regs(struct i2c_client *client, u8 reg, u8 buf[], unsigned len)
541 {
542         int ret; 
543         ret = i2c_master_reg8_recv(client, reg, buf, len, FT5406_IIC_SPEED);
544         return ret; 
545 }
546
547
548 /* set the it7260 registe,used i2c bus*/
549 static int ft5406_set_regs(struct i2c_client *client, u8 reg, u8 const buf[], unsigned short len)
550 {
551         int ret; 
552         ret = i2c_master_reg8_send(client, reg, buf, (int)len, FT5406_IIC_SPEED);
553         return ret;
554 }
555
556 static void ft5406_queue_work(struct work_struct *work)
557 {
558         struct ft5x0x_ts_data *data = container_of(work, struct ft5x0x_ts_data, pen_event_work);
559         struct tp_event event;
560         u8 start_reg=0x0;
561         u8 buf[32] = {0};
562         int ret,i,offset,points;
563                 
564 #if CONFIG_FT5X0X_MULTITOUCH
565         ret = ft5406_read_regs(data->client,start_reg, buf, 6*MAX_POINT+1);
566 #else
567         ret = ft5406_read_regs(data->client,start_reg, buf, 7);
568 #endif
569         if (ret < 0) {
570                 dev_err(&data->client->dev, "ft5406_read_regs fail:%d!\n",ret);
571                 return;
572         }
573 #if 0
574         for (i=0; i<32; i++) {
575                 printk("buf[%d] = 0x%x \n", i, buf[i]);
576         }
577 #endif
578         
579         points = buf[2] & 0x07;
580         //dev_info(&data->client->dev, "ft5406_read_and_report_data points = %d\n",points);
581         if (points == 0) {
582 #if   CONFIG_FT5X0X_MULTITOUCH
583                 input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, 0);
584                 input_report_abs(data->input_dev, ABS_MT_WIDTH_MAJOR, 0);
585                 //input_mt_sync(data->input_dev);
586 #else
587                 input_report_abs(data->input_dev, ABS_PRESSURE, 0);
588                 input_report_key(data->input_dev, BTN_TOUCH, 0);
589 #endif
590                 input_sync(data->input_dev);
591                 enable_irq(data->irq);
592                 dev_info(&data->client->dev, "ft5406 touch release\n");
593                 return; 
594         }
595         memset(&event, 0, sizeof(struct tp_event));
596 #if CONFIG_FT5X0X_MULTITOUCH
597         for(i=0;i<points;i++){
598                 offset = i*6+3;
599                 event.x = (((s16)(buf[offset+0] & 0x0F))<<8) | ((s16)buf[offset+1]);
600                 event.y = (((s16)(buf[offset+2] & 0x0F))<<8) | ((s16)buf[offset+3]);
601                 event.id = (s16)(buf[offset+2] & 0xF0)>>4;
602                 event.flag = ((buf[offset+0] & 0xc0) >> 6);
603                 event.pressure = 200;
604                 if(event.x<=SCREEN_MAX_X && event.y<=SCREEN_MAX_Y){
605                         //dev_info(&data->client->dev, 
606                         //      "ft5406 multiple report event[%d]:x = %d,y = %d,id = %d,flag = %d,pressure = %d\n",
607                         //      i,event.x,event.y,event.id,event.flag,event.pressure);
608                         input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, 200);
609                         input_report_abs(data->input_dev, ABS_MT_POSITION_X,  event.x);
610                         input_report_abs(data->input_dev, ABS_MT_POSITION_Y,  event.y);
611                         input_report_abs(data->input_dev, ABS_MT_TRACKING_ID, event.id);
612                         input_report_abs(data->input_dev, ABS_MT_WIDTH_MAJOR, 1);
613                         input_mt_sync(data->input_dev);
614                 }
615         }
616 #else
617         event.x = (s16)(buf[3] & 0x0F)<<8 | (s16)buf[4];
618         event.y = (s16)(buf[5] & 0x0F)<<8 | (s16)buf[6];
619         event.pressure =200;
620         input_report_abs(data->input_dev, ABS_X, event.x);
621         input_report_abs(data->input_dev, ABS_Y, event.y);
622         input_report_abs(data->input_dev, ABS_PRESSURE, event.pressure);
623         input_report_key(data->input_dev, BTN_TOUCH, 1);
624         //dev_info(&data->client->dev, "ft5406 single report event:x = %d,y = %d\n",event.x,event.y);
625 #endif
626         //dev_info(&data->client->dev, "ft5406 sync\n",event.x,event.y);
627         input_sync(data->input_dev);
628         enable_irq(data->irq);
629         return;
630 }
631
632 static irqreturn_t ft5406_interrupt(int irq, void *dev_id)
633 {
634         struct ft5x0x_ts_data *ft5x0x_ts = dev_id;
635
636         disable_irq_nosync(ft5x0x_ts->irq);
637         if (!work_pending(&ft5x0x_ts->pen_event_work)) 
638                 queue_work(ft5x0x_ts->ts_workqueue, &ft5x0x_ts->pen_event_work);
639         return IRQ_HANDLED;
640 }
641
642 static int ft5406_suspend(struct i2c_client *client, pm_message_t mesg)
643 {
644         struct ft5x0x_ts_data *ft5x0x_ts = i2c_get_clientdata(client);
645         struct ft5406_platform_data *pdata = client->dev.platform_data;
646         
647         if (pdata->platform_sleep)                              
648                 pdata->platform_sleep();
649         disable_irq(ft5x0x_ts->irq);
650         return 0;
651 }
652
653
654 static int ft5406_resume(struct i2c_client *client)
655 {
656         struct ft5x0x_ts_data *ft5x0x_ts = i2c_get_clientdata(client);
657         struct ft5406_platform_data *pdata = client->dev.platform_data;
658         
659         enable_irq(ft5x0x_ts->irq);
660         if (pdata->platform_wakeup)                              
661                 pdata->platform_wakeup();
662         return 0;
663 }
664
665 static int __devexit ft5406_remove(struct i2c_client *client)
666 {
667         struct ft5x0x_ts_data *ft5x0x_ts = i2c_get_clientdata(client);
668
669         free_irq(ft5x0x_ts->irq, ft5x0x_ts);
670         input_unregister_device(ft5x0x_ts->input_dev);
671         kfree(ft5x0x_ts);
672         cancel_work_sync(&ft5x0x_ts->pen_event_work);
673         destroy_workqueue(ft5x0x_ts->ts_workqueue);
674         i2c_set_clientdata(client, NULL);
675 #ifdef CONFIG_HAS_EARLYSUSPEND
676     unregister_early_suspend(&ft5406_early_suspend);
677 #endif 
678     this_client = NULL;
679         return 0;
680 }
681
682 static int  ft5406_probe(struct i2c_client *client ,const struct i2c_device_id *id)
683 {
684         struct ft5x0x_ts_data *ft5x0x_ts;
685         struct input_dev *input_dev;
686         struct ft5406_platform_data *pdata = client->dev.platform_data;
687         int err = 0;
688         int ret = 0;
689         int retry = 0;
690         u8 buf_w[1];
691         u8 buf_r[1];
692         const u8 buf_test[1] = {0};
693     unsigned char reg_value;
694     unsigned char reg_version;
695
696         dev_info(&client->dev, "ft5x0x_ts_probe!\n");
697         if (!pdata) {
698                 dev_err(&client->dev, "platform data is required!\n");
699                 return -EINVAL;
700         }
701
702         if (pdata->init_platform_hw)                              
703                 pdata->init_platform_hw();
704
705         if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)){
706                 dev_err(&client->dev, "Must have I2C_FUNC_I2C.\n");
707                 return -ENODEV;
708         }
709         
710         ft5x0x_ts = kzalloc(sizeof(*ft5x0x_ts), GFP_KERNEL);
711         if (!ft5x0x_ts) {
712                 return -ENOMEM;
713         }
714
715         while(retry < 5)
716         {
717                 ret=ft5406_set_regs(client,FT5X0X_REG_PMODE, buf_test,1);
718                 if(ret > 0)break;
719                 retry++;
720         }
721         if(ret <= 0)
722         {
723                 printk("FT5406 I2C TEST ERROR!\n");
724                 err = -ENODEV;
725                 goto exit_i2c_test_fail;
726         }
727         
728         input_dev = input_allocate_device();
729         if (!input_dev) {
730                 err = -ENOMEM;
731                 printk("failed to allocate input device\n");
732                 goto exit_input_dev_alloc_failed;
733         }
734         ft5x0x_ts->client = this_client = client;
735         ft5x0x_ts->irq = client->irq;
736         ft5x0x_ts->input_dev = input_dev;
737
738   #if   CONFIG_FT5X0X_MULTITOUCH
739         set_bit(ABS_MT_POSITION_X, input_dev->absbit);
740         set_bit(ABS_MT_POSITION_Y, input_dev->absbit);
741         set_bit(ABS_MT_TOUCH_MAJOR, input_dev->absbit);
742         set_bit(ABS_MT_TRACKING_ID, input_dev->absbit);
743         set_bit(ABS_MT_WIDTH_MAJOR, input_dev->absbit);
744         input_set_abs_params(input_dev,ABS_MT_POSITION_X, 0, SCREEN_MAX_X, 0, 0);
745         input_set_abs_params(input_dev,ABS_MT_POSITION_Y, 0, SCREEN_MAX_Y, 0, 0);
746         input_set_abs_params(input_dev,ABS_MT_TOUCH_MAJOR, 0, TOUCH_MAJOR_MAX, 0, 0);
747         input_set_abs_params(input_dev,ABS_MT_TRACKING_ID, 0, MAX_POINT, 0, 0);
748         input_set_abs_params(input_dev,ABS_MT_WIDTH_MAJOR, 0, WIDTH_MAJOR_MAX, 0, 0);
749 #else
750         set_bit(ABS_X, input_dev->absbit);
751         set_bit(ABS_Y, input_dev->absbit);
752         set_bit(ABS_PRESSURE, input_dev->absbit);
753         set_bit(BTN_TOUCH, input_dev->keybit);
754         input_set_abs_params(input_dev, ABS_X, 0, SCREEN_MAX_X, 0, 0);
755         input_set_abs_params(input_dev, ABS_Y, 0, SCREEN_MAX_Y, 0, 0);
756         input_set_abs_params(input_dev, ABS_PRESSURE, 0, PRESS_MAX, 0 , 0);
757 #endif
758
759
760         set_bit(EV_ABS, input_dev->evbit);
761         set_bit(EV_KEY, input_dev->evbit);
762         
763         input_dev->name         = FT5X0X_NAME;          //dev_name(&client->dev)
764         err = input_register_device(input_dev);
765         if (err) {
766                 printk("ft5x0x_ts_probe: failed to register input device: \n");
767                 goto exit_input_register_device_failed;
768         }
769
770         if (!ft5x0x_ts->irq) {
771                 err = -ENODEV;
772                 dev_err(&ft5x0x_ts->client->dev, "no IRQ?\n");
773                 goto exit_no_irq_fail;
774         }else{
775                 ft5x0x_ts->irq = gpio_to_irq(ft5x0x_ts->irq);
776         }
777
778         //INIT_WORK(&ft5x0x_ts->pen_event_work, ft5406_ts_pen_irq_work);
779         INIT_WORK(&ft5x0x_ts->pen_event_work, ft5406_queue_work);
780         ft5x0x_ts->ts_workqueue = create_singlethread_workqueue("ft5x0x_ts");
781         if (!ft5x0x_ts->ts_workqueue) {
782                 err = -ESRCH;
783                 goto exit_create_singlethread;
784         }
785
786         /***wait CTP to bootup normally***/
787          msleep(200); 
788          
789          fts_register_read(FT5X0X_REG_FIRMID, &reg_version,1);
790          printk("[TSP] firmware version = 0x%2x\n", reg_version);
791          fts_register_read(FT5X0X_REG_REPORT_RATE, &reg_value,1);
792          printk("[TSP]firmware report rate = %dHz\n", reg_value*10);
793          fts_register_read(FT5X0X_REG_THRES, &reg_value,1);
794          printk("[TSP]firmware threshold = %d\n", reg_value * 4);
795          fts_register_read(FT5X0X_REG_NOISE_MODE, &reg_value,1);
796          printk("[TSP]nosie mode = 0x%2x\n", reg_value);
797
798           if (fts_ctpm_get_upg_ver() != reg_version)  
799           {
800                   printk("[TSP] start upgrade new verison 0x%2x\n", fts_ctpm_get_upg_ver());
801                   msleep(200);
802                   err =  fts_ctpm_fw_upgrade_with_i_file();
803                   if (err == 0)
804                   {
805                           printk("[TSP] ugrade successfuly.\n");
806                           msleep(300);
807                           fts_register_read(FT5X0X_REG_FIRMID, &reg_value,1);
808                           printk("FTS_DBG from old version 0x%2x to new version = 0x%2x\n", reg_version, reg_value);
809                   }
810                   else
811                   {
812                           printk("[TSP]  ugrade fail err=%d, line = %d.\n",err, __LINE__);
813                   }
814                   msleep(4000);
815           }
816
817         //printk("client->dev.driver->name %s  ,%d \n",client->dev.driver->name,ft5x0x_ts->irq);
818         ret = request_irq(ft5x0x_ts->irq, ft5406_interrupt, IRQF_TRIGGER_FALLING, client->dev.driver->name, ft5x0x_ts);
819         if (ret < 0) {
820                 dev_err(&client->dev, "irq %d busy?\n", ft5x0x_ts->irq);
821                 goto exit_irq_request_fail;
822         }
823         
824         i2c_set_clientdata(client, ft5x0x_ts);
825 #if 0//def CONFIG_HAS_EARLYSUSPEND
826         ft5406_early_suspend.suspend =ft5406_ts_suspend;
827         ft5406_early_suspend.resume =ft5406_ts_resume;
828         ft5406_early_suspend.level = 0x2;
829         register_early_suspend(&ft5406_early_suspend);
830 #endif
831
832         buf_w[0] = 6;
833         err = ft5406_set_regs(client,0x88,buf_w,1);
834         buf_r[0] = 0;
835         err = ft5406_read_regs(client,0x88,buf_r,1);
836 //      printk("read buf[0x88] = %d\n", buf_r[0]);
837     return 0;
838
839         i2c_set_clientdata(client, NULL);
840         free_irq(ft5x0x_ts->irq,ft5x0x_ts);
841 exit_irq_request_fail:
842         cancel_work_sync(&ft5x0x_ts->pen_event_work);
843         destroy_workqueue(ft5x0x_ts->ts_workqueue);
844 exit_create_singlethread:
845 exit_no_irq_fail:
846         input_unregister_device(input_dev);
847 exit_input_register_device_failed:
848         input_free_device(input_dev);
849 exit_input_dev_alloc_failed:
850 exit_i2c_test_fail:
851         if (pdata->exit_platform_hw)                              
852                 pdata->exit_platform_hw();
853         kfree(ft5x0x_ts);
854         return err;
855 }
856
857
858
859 static struct i2c_device_id ft5406_idtable[] = {
860         { FT5X0X_NAME, 0 },
861         { }
862 };
863
864 MODULE_DEVICE_TABLE(i2c, ft5406_idtable);
865
866 static struct i2c_driver ft5406_driver  = {
867         .driver = {
868                 .owner  = THIS_MODULE,
869                 .name   = FT5X0X_NAME
870         },
871         .id_table       = ft5406_idtable,
872         .probe      = ft5406_probe,
873     .suspend    = ft5406_suspend,
874         .resume     = ft5406_resume,
875         .remove         = __devexit_p(ft5406_remove),
876 };
877
878 static int __init ft5406_ts_init(void)
879 {
880         return i2c_add_driver(&ft5406_driver);
881 }
882
883 static void __exit ft5406_ts_exit(void)
884 {
885         printk("Touchscreen driver of ft5406 exited.\n");
886         i2c_del_driver(&ft5406_driver);
887 }
888
889
890 /***********************************************************************/
891
892 module_init(ft5406_ts_init);
893 module_exit(ft5406_ts_exit);
894
895 MODULE_AUTHOR("<wenfs@Focaltech-systems.com>");
896 MODULE_DESCRIPTION("FocalTech ft5x0x TouchScreen driver");
897