]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/input/touchscreen/edt-ft5x06.c
Input: edt-ft5x06 - adjust delays to conform datasheet
[karo-tx-linux.git] / drivers / input / touchscreen / edt-ft5x06.c
1 /*
2  * Copyright (C) 2012 Simon Budig, <simon.budig@kernelconcepts.de>
3  * Lothar Waßmann <LW@KARO-electronics.de> (DT support)
4  *
5  * This software is licensed under the terms of the GNU General Public
6  * License version 2, as published by the Free Software Foundation, and
7  * may be copied, distributed, and modified under those terms.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18
19 /*
20  * This is a driver for the EDT "Polytouch" family of touch controllers
21  * based on the FocalTech FT5x06 line of chips.
22  *
23  * Development of this driver has been sponsored by Glyn:
24  *    http://www.glyn.com/Products/Displays
25  */
26
27 #include <linux/module.h>
28 #include <linux/ratelimit.h>
29 #include <linux/interrupt.h>
30 #include <linux/input.h>
31 #include <linux/i2c.h>
32 #include <linux/uaccess.h>
33 #include <linux/delay.h>
34 #include <linux/debugfs.h>
35 #include <linux/slab.h>
36 #include <linux/gpio.h>
37 #include <linux/of_gpio.h>
38 #include <linux/input/mt.h>
39 #include <linux/input/edt-ft5x06.h>
40
41 #define MAX_SUPPORT_POINTS              5
42
43 #define WORK_REGISTER_THRESHOLD         0x00
44 #define WORK_REGISTER_REPORT_RATE       0x08
45 #define WORK_REGISTER_GAIN              0x30
46 #define WORK_REGISTER_OFFSET            0x31
47 #define WORK_REGISTER_NUM_X             0x33
48 #define WORK_REGISTER_NUM_Y             0x34
49
50 #define WORK_REGISTER_OPMODE            0x3c
51 #define FACTORY_REGISTER_OPMODE         0x01
52
53 #define TOUCH_EVENT_DOWN                0x00
54 #define TOUCH_EVENT_UP                  0x01
55 #define TOUCH_EVENT_ON                  0x02
56 #define TOUCH_EVENT_RESERVED            0x03
57
58 #define EDT_NAME_LEN                    23
59 #define EDT_SWITCH_MODE_RETRIES         10
60 #define EDT_SWITCH_MODE_DELAY           5 /* msec */
61 #define EDT_RAW_DATA_RETRIES            100
62 #define EDT_RAW_DATA_DELAY              1 /* msec */
63
64 struct edt_ft5x06_ts_data {
65         struct i2c_client *client;
66         struct input_dev *input;
67         u16 num_x;
68         u16 num_y;
69
70         int reset_pin;
71         int irq_pin;
72         int wake_pin;
73
74 #if defined(CONFIG_DEBUG_FS)
75         struct dentry *debug_dir;
76         u8 *raw_buffer;
77         size_t raw_bufsize;
78 #endif
79
80         struct mutex mutex;
81         bool factory_mode;
82         int threshold;
83         int gain;
84         int offset;
85         int report_rate;
86
87         char name[EDT_NAME_LEN];
88 };
89
90 static int edt_ft5x06_ts_readwrite(struct i2c_client *client,
91                                    u16 wr_len, u8 *wr_buf,
92                                    u16 rd_len, u8 *rd_buf)
93 {
94         struct i2c_msg wrmsg[2];
95         int i = 0;
96         int ret;
97
98         if (wr_len) {
99                 wrmsg[i].addr  = client->addr;
100                 wrmsg[i].flags = 0;
101                 wrmsg[i].len = wr_len;
102                 wrmsg[i].buf = wr_buf;
103                 i++;
104         }
105         if (rd_len) {
106                 wrmsg[i].addr  = client->addr;
107                 wrmsg[i].flags = I2C_M_RD;
108                 wrmsg[i].len = rd_len;
109                 wrmsg[i].buf = rd_buf;
110                 i++;
111         }
112
113         ret = i2c_transfer(client->adapter, wrmsg, i);
114         if (ret < 0)
115                 return ret;
116         if (ret != i)
117                 return -EIO;
118
119         return 0;
120 }
121
122 static bool edt_ft5x06_ts_check_crc(struct edt_ft5x06_ts_data *tsdata,
123                                     u8 *buf, int buflen)
124 {
125         int i;
126         u8 crc = 0;
127
128         for (i = 0; i < buflen - 1; i++)
129                 crc ^= buf[i];
130
131         if (crc != buf[buflen-1]) {
132                 dev_err_ratelimited(&tsdata->client->dev,
133                                     "crc error: 0x%02x expected, got 0x%02x\n",
134                                     crc, buf[buflen-1]);
135                 return false;
136         }
137
138         return true;
139 }
140
141 static irqreturn_t edt_ft5x06_ts_isr(int irq, void *dev_id)
142 {
143         struct edt_ft5x06_ts_data *tsdata = dev_id;
144         struct device *dev = &tsdata->client->dev;
145         u8 cmd = 0xf9;
146         u8 rdbuf[26];
147         int i, type, x, y, id;
148         int error;
149
150         memset(rdbuf, 0, sizeof(rdbuf));
151
152         error = edt_ft5x06_ts_readwrite(tsdata->client,
153                                         sizeof(cmd), &cmd,
154                                         sizeof(rdbuf), rdbuf);
155         if (error) {
156                 dev_err_ratelimited(dev, "Unable to fetch data, error: %d\n",
157                                     error);
158                 goto out;
159         }
160
161         if (rdbuf[0] != 0xaa || rdbuf[1] != 0xaa || rdbuf[2] != 26) {
162                 dev_err_ratelimited(dev, "Unexpected header: %02x%02x%02x!\n",
163                                     rdbuf[0], rdbuf[1], rdbuf[2]);
164                 goto out;
165         }
166
167         if (!edt_ft5x06_ts_check_crc(tsdata, rdbuf, 26))
168                 goto out;
169
170         for (i = 0; i < MAX_SUPPORT_POINTS; i++) {
171                 u8 *buf = &rdbuf[i * 4 + 5];
172                 bool down;
173
174                 type = buf[0] >> 6;
175                 /* ignore Reserved events */
176                 if (type == TOUCH_EVENT_RESERVED)
177                         continue;
178
179                 x = ((buf[0] << 8) | buf[1]) & 0x0fff;
180                 y = ((buf[2] << 8) | buf[3]) & 0x0fff;
181                 id = (buf[2] >> 4) & 0x0f;
182                 down = type != TOUCH_EVENT_UP;
183
184                 input_mt_slot(tsdata->input, id);
185                 input_mt_report_slot_state(tsdata->input, MT_TOOL_FINGER, down);
186
187                 if (!down)
188                         continue;
189
190                 input_report_abs(tsdata->input, ABS_MT_POSITION_X, x);
191                 input_report_abs(tsdata->input, ABS_MT_POSITION_Y, y);
192         }
193
194         input_mt_report_pointer_emulation(tsdata->input, true);
195         input_sync(tsdata->input);
196
197 out:
198         return IRQ_HANDLED;
199 }
200
201 static int edt_ft5x06_register_write(struct edt_ft5x06_ts_data *tsdata,
202                                      u8 addr, u8 value)
203 {
204         u8 wrbuf[4];
205
206         wrbuf[0] = tsdata->factory_mode ? 0xf3 : 0xfc;
207         wrbuf[1] = tsdata->factory_mode ? addr & 0x7f : addr & 0x3f;
208         wrbuf[2] = value;
209         wrbuf[3] = wrbuf[0] ^ wrbuf[1] ^ wrbuf[2];
210
211         return edt_ft5x06_ts_readwrite(tsdata->client, 4, wrbuf, 0, NULL);
212 }
213
214 static int edt_ft5x06_register_read(struct edt_ft5x06_ts_data *tsdata,
215                                     u8 addr)
216 {
217         u8 wrbuf[2], rdbuf[2];
218         int error;
219
220         wrbuf[0] = tsdata->factory_mode ? 0xf3 : 0xfc;
221         wrbuf[1] = tsdata->factory_mode ? addr & 0x7f : addr & 0x3f;
222         wrbuf[1] |= tsdata->factory_mode ? 0x80 : 0x40;
223
224         error = edt_ft5x06_ts_readwrite(tsdata->client, 2, wrbuf, 2, rdbuf);
225         if (error)
226                 return error;
227
228         if ((wrbuf[0] ^ wrbuf[1] ^ rdbuf[0]) != rdbuf[1]) {
229                 dev_err(&tsdata->client->dev,
230                         "crc error: 0x%02x expected, got 0x%02x\n",
231                         wrbuf[0] ^ wrbuf[1] ^ rdbuf[0], rdbuf[1]);
232                 return -EIO;
233         }
234
235         return rdbuf[0];
236 }
237
238 struct edt_ft5x06_attribute {
239         struct device_attribute dattr;
240         size_t field_offset;
241         u8 limit_low;
242         u8 limit_high;
243         u8 addr;
244 };
245
246 #define EDT_ATTR(_field, _mode, _addr, _limit_low, _limit_high)         \
247         struct edt_ft5x06_attribute edt_ft5x06_attr_##_field = {        \
248                 .dattr = __ATTR(_field, _mode,                          \
249                                 edt_ft5x06_setting_show,                \
250                                 edt_ft5x06_setting_store),              \
251                 .field_offset =                                         \
252                         offsetof(struct edt_ft5x06_ts_data, _field),    \
253                 .limit_low = _limit_low,                                \
254                 .limit_high = _limit_high,                              \
255                 .addr = _addr,                                          \
256         }
257
258 static ssize_t edt_ft5x06_setting_show(struct device *dev,
259                                        struct device_attribute *dattr,
260                                        char *buf)
261 {
262         struct i2c_client *client = to_i2c_client(dev);
263         struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client);
264         struct edt_ft5x06_attribute *attr =
265                         container_of(dattr, struct edt_ft5x06_attribute, dattr);
266         u8 *field = (u8 *)tsdata + attr->field_offset;
267         int val;
268         size_t count = 0;
269         int error = 0;
270
271         mutex_lock(&tsdata->mutex);
272
273         if (tsdata->factory_mode) {
274                 error = -EIO;
275                 goto out;
276         }
277
278         val = edt_ft5x06_register_read(tsdata, attr->addr);
279         if (val < 0) {
280                 error = val;
281                 dev_err(&tsdata->client->dev,
282                         "Failed to fetch attribute %s, error %d\n",
283                         dattr->attr.name, error);
284                 goto out;
285         }
286
287         if (val != *field) {
288                 dev_warn(&tsdata->client->dev,
289                          "%s: read (%d) and stored value (%d) differ\n",
290                          dattr->attr.name, val, *field);
291                 *field = val;
292         }
293
294         count = scnprintf(buf, PAGE_SIZE, "%d\n", val);
295 out:
296         mutex_unlock(&tsdata->mutex);
297         return error ?: count;
298 }
299
300 static ssize_t edt_ft5x06_setting_store(struct device *dev,
301                                         struct device_attribute *dattr,
302                                         const char *buf, size_t count)
303 {
304         struct i2c_client *client = to_i2c_client(dev);
305         struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client);
306         struct edt_ft5x06_attribute *attr =
307                         container_of(dattr, struct edt_ft5x06_attribute, dattr);
308         u8 *field = (u8 *)tsdata + attr->field_offset;
309         unsigned int val;
310         int error;
311
312         mutex_lock(&tsdata->mutex);
313
314         if (tsdata->factory_mode) {
315                 error = -EIO;
316                 goto out;
317         }
318
319         error = kstrtouint(buf, 0, &val);
320         if (error)
321                 goto out;
322
323         if (val < attr->limit_low || val > attr->limit_high) {
324                 error = -ERANGE;
325                 goto out;
326         }
327
328         error = edt_ft5x06_register_write(tsdata, attr->addr, val);
329         if (error) {
330                 dev_err(&tsdata->client->dev,
331                         "Failed to update attribute %s, error: %d\n",
332                         dattr->attr.name, error);
333                 goto out;
334         }
335
336         *field = val;
337
338 out:
339         mutex_unlock(&tsdata->mutex);
340         return error ?: count;
341 }
342
343 static EDT_ATTR(gain, S_IWUSR | S_IRUGO, WORK_REGISTER_GAIN, 0, 31);
344 static EDT_ATTR(offset, S_IWUSR | S_IRUGO, WORK_REGISTER_OFFSET, 0, 31);
345 static EDT_ATTR(threshold, S_IWUSR | S_IRUGO,
346                 WORK_REGISTER_THRESHOLD, 20, 80);
347 static EDT_ATTR(report_rate, S_IWUSR | S_IRUGO,
348                 WORK_REGISTER_REPORT_RATE, 3, 14);
349
350 static struct attribute *edt_ft5x06_attrs[] = {
351         &edt_ft5x06_attr_gain.dattr.attr,
352         &edt_ft5x06_attr_offset.dattr.attr,
353         &edt_ft5x06_attr_threshold.dattr.attr,
354         &edt_ft5x06_attr_report_rate.dattr.attr,
355         NULL
356 };
357
358 static const struct attribute_group edt_ft5x06_attr_group = {
359         .attrs = edt_ft5x06_attrs,
360 };
361
362 #ifdef CONFIG_DEBUG_FS
363 static int edt_ft5x06_factory_mode(struct edt_ft5x06_ts_data *tsdata)
364 {
365         struct i2c_client *client = tsdata->client;
366         int retries = EDT_SWITCH_MODE_RETRIES;
367         int ret;
368         int error;
369
370         disable_irq(client->irq);
371
372         if (!tsdata->raw_buffer) {
373                 tsdata->raw_bufsize = tsdata->num_x * tsdata->num_y *
374                                       sizeof(u16);
375                 tsdata->raw_buffer = kzalloc(tsdata->raw_bufsize, GFP_KERNEL);
376                 if (!tsdata->raw_buffer) {
377                         error = -ENOMEM;
378                         goto err_out;
379                 }
380         }
381
382         /* mode register is 0x3c when in the work mode */
383         error = edt_ft5x06_register_write(tsdata, WORK_REGISTER_OPMODE, 0x03);
384         if (error) {
385                 dev_err(&client->dev,
386                         "failed to switch to factory mode, error %d\n", error);
387                 goto err_out;
388         }
389
390         tsdata->factory_mode = true;
391         do {
392                 mdelay(EDT_SWITCH_MODE_DELAY);
393                 /* mode register is 0x01 when in factory mode */
394                 ret = edt_ft5x06_register_read(tsdata, FACTORY_REGISTER_OPMODE);
395                 if (ret == 0x03)
396                         break;
397         } while (--retries > 0);
398
399         if (retries == 0) {
400                 dev_err(&client->dev, "not in factory mode after %dms.\n",
401                         EDT_SWITCH_MODE_RETRIES * EDT_SWITCH_MODE_DELAY);
402                 error = -EIO;
403                 goto err_out;
404         }
405
406         return 0;
407
408 err_out:
409         kfree(tsdata->raw_buffer);
410         tsdata->raw_buffer = NULL;
411         tsdata->factory_mode = false;
412         enable_irq(client->irq);
413
414         return error;
415 }
416
417 static int edt_ft5x06_work_mode(struct edt_ft5x06_ts_data *tsdata)
418 {
419         struct i2c_client *client = tsdata->client;
420         int retries = EDT_SWITCH_MODE_RETRIES;
421         int ret;
422         int error;
423
424         /* mode register is 0x01 when in the factory mode */
425         error = edt_ft5x06_register_write(tsdata, FACTORY_REGISTER_OPMODE, 0x1);
426         if (error) {
427                 dev_err(&client->dev,
428                         "failed to switch to work mode, error: %d\n", error);
429                 return error;
430         }
431
432         tsdata->factory_mode = false;
433
434         do {
435                 mdelay(EDT_SWITCH_MODE_DELAY);
436                 /* mode register is 0x01 when in factory mode */
437                 ret = edt_ft5x06_register_read(tsdata, WORK_REGISTER_OPMODE);
438                 if (ret == 0x01)
439                         break;
440         } while (--retries > 0);
441
442         if (retries == 0) {
443                 dev_err(&client->dev, "not in work mode after %dms.\n",
444                         EDT_SWITCH_MODE_RETRIES * EDT_SWITCH_MODE_DELAY);
445                 tsdata->factory_mode = true;
446                 return -EIO;
447         }
448
449         kfree(tsdata->raw_buffer);
450         tsdata->raw_buffer = NULL;
451
452         /* restore parameters */
453         edt_ft5x06_register_write(tsdata, WORK_REGISTER_THRESHOLD,
454                                   tsdata->threshold);
455         edt_ft5x06_register_write(tsdata, WORK_REGISTER_GAIN,
456                                   tsdata->gain);
457         edt_ft5x06_register_write(tsdata, WORK_REGISTER_OFFSET,
458                                   tsdata->offset);
459         edt_ft5x06_register_write(tsdata, WORK_REGISTER_REPORT_RATE,
460                                   tsdata->report_rate);
461
462         enable_irq(client->irq);
463
464         return 0;
465 }
466
467 static int edt_ft5x06_debugfs_mode_get(void *data, u64 *mode)
468 {
469         struct edt_ft5x06_ts_data *tsdata = data;
470
471         *mode = tsdata->factory_mode;
472
473         return 0;
474 };
475
476 static int edt_ft5x06_debugfs_mode_set(void *data, u64 mode)
477 {
478         struct edt_ft5x06_ts_data *tsdata = data;
479         int retval = 0;
480
481         if (mode > 1)
482                 return -ERANGE;
483
484         mutex_lock(&tsdata->mutex);
485
486         if (mode != tsdata->factory_mode) {
487                 retval = mode ? edt_ft5x06_factory_mode(tsdata) :
488                                 edt_ft5x06_work_mode(tsdata);
489         }
490
491         mutex_unlock(&tsdata->mutex);
492
493         return retval;
494 };
495
496 DEFINE_SIMPLE_ATTRIBUTE(debugfs_mode_fops, edt_ft5x06_debugfs_mode_get,
497                         edt_ft5x06_debugfs_mode_set, "%llu\n");
498
499 static ssize_t edt_ft5x06_debugfs_raw_data_read(struct file *file,
500                                 char __user *buf, size_t count, loff_t *off)
501 {
502         struct edt_ft5x06_ts_data *tsdata = file->private_data;
503         struct i2c_client *client = tsdata->client;
504         int retries  = EDT_RAW_DATA_RETRIES;
505         int val, i, error;
506         size_t read = 0;
507         int colbytes;
508         char wrbuf[3];
509         u8 *rdbuf;
510
511         if (*off < 0 || *off >= tsdata->raw_bufsize)
512                 return 0;
513
514         mutex_lock(&tsdata->mutex);
515
516         if (!tsdata->factory_mode || !tsdata->raw_buffer) {
517                 error = -EIO;
518                 goto out;
519         }
520
521         error = edt_ft5x06_register_write(tsdata, 0x08, 0x01);
522         if (error) {
523                 dev_dbg(&client->dev,
524                         "failed to write 0x08 register, error %d\n", error);
525                 goto out;
526         }
527
528         do {
529                 msleep(EDT_RAW_DATA_DELAY);
530                 val = edt_ft5x06_register_read(tsdata, 0x08);
531                 if (val < 1)
532                         break;
533         } while (--retries > 0);
534
535         if (val < 0) {
536                 error = val;
537                 dev_dbg(&client->dev,
538                         "failed to read 0x08 register, error %d\n", error);
539                 goto out;
540         }
541
542         if (retries == 0) {
543                 dev_dbg(&client->dev,
544                         "timed out waiting for register to settle\n");
545                 error = -ETIMEDOUT;
546                 goto out;
547         }
548
549         rdbuf = tsdata->raw_buffer;
550         colbytes = tsdata->num_y * sizeof(u16);
551
552         wrbuf[0] = 0xf5;
553         wrbuf[1] = 0x0e;
554         for (i = 0; i < tsdata->num_x; i++) {
555                 wrbuf[2] = i;  /* column index */
556                 error = edt_ft5x06_ts_readwrite(tsdata->client,
557                                                 sizeof(wrbuf), wrbuf,
558                                                 colbytes, rdbuf);
559                 if (error)
560                         goto out;
561
562                 rdbuf += colbytes;
563         }
564
565         read = min_t(size_t, count, tsdata->raw_bufsize - *off);
566         if (copy_to_user(buf, tsdata->raw_buffer + *off, read)) {
567                 error = -EFAULT;
568                 goto out;
569         }
570
571         *off += read;
572 out:
573         mutex_unlock(&tsdata->mutex);
574         return error ?: read;
575 };
576
577 static const struct file_operations debugfs_raw_data_fops = {
578         .open = simple_open,
579         .read = edt_ft5x06_debugfs_raw_data_read,
580 };
581
582 static void
583 edt_ft5x06_ts_prepare_debugfs(struct edt_ft5x06_ts_data *tsdata,
584                               const char *debugfs_name)
585 {
586         tsdata->debug_dir = debugfs_create_dir(debugfs_name, NULL);
587         if (!tsdata->debug_dir)
588                 return;
589
590         debugfs_create_u16("num_x", S_IRUSR, tsdata->debug_dir, &tsdata->num_x);
591         debugfs_create_u16("num_y", S_IRUSR, tsdata->debug_dir, &tsdata->num_y);
592
593         debugfs_create_file("mode", S_IRUSR | S_IWUSR,
594                             tsdata->debug_dir, tsdata, &debugfs_mode_fops);
595         debugfs_create_file("raw_data", S_IRUSR,
596                             tsdata->debug_dir, tsdata, &debugfs_raw_data_fops);
597 }
598
599 static void
600 edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata)
601 {
602         if (tsdata->debug_dir)
603                 debugfs_remove_recursive(tsdata->debug_dir);
604         kfree(tsdata->raw_buffer);
605 }
606
607 #else
608
609 static inline void
610 edt_ft5x06_ts_prepare_debugfs(struct edt_ft5x06_ts_data *tsdata,
611                               const char *debugfs_name)
612 {
613 }
614
615 static inline void
616 edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata)
617 {
618 }
619
620 #endif /* CONFIG_DEBUGFS */
621
622 static int edt_ft5x06_ts_reset(struct i2c_client *client,
623                         struct edt_ft5x06_ts_data *tsdata)
624 {
625         int error;
626
627         if (gpio_is_valid(tsdata->wake_pin)) {
628                 error = devm_gpio_request_one(&client->dev,
629                                         tsdata->wake_pin, GPIOF_OUT_INIT_LOW,
630                                         "edt-ft5x06 wake");
631                 if (error) {
632                         dev_err(&client->dev,
633                                 "Failed to request GPIO %d as wake pin, error %d\n",
634                                 tsdata->wake_pin, error);
635                         return error;
636                 }
637
638                 msleep(5);
639                 gpio_set_value(tsdata->wake_pin, 1);
640         }
641         if (gpio_is_valid(tsdata->reset_pin)) {
642                 /* this pulls reset down, enabling the low active reset */
643                 error = devm_gpio_request_one(&client->dev,
644                                         tsdata->reset_pin, GPIOF_OUT_INIT_LOW,
645                                         "edt-ft5x06 reset");
646                 if (error) {
647                         dev_err(&client->dev,
648                                 "Failed to request GPIO %d as reset pin, error %d\n",
649                                 tsdata->reset_pin, error);
650                         return error;
651                 }
652
653                 msleep(5);
654                 gpio_set_value(tsdata->reset_pin, 1);
655                 msleep(300);
656         }
657
658         return 0;
659 }
660
661 static int edt_ft5x06_ts_identify(struct i2c_client *client,
662                                             char *model_name,
663                                             char *fw_version)
664 {
665         u8 rdbuf[EDT_NAME_LEN];
666         char *p;
667         int error;
668
669         error = edt_ft5x06_ts_readwrite(client, 1, "\xbb",
670                                         EDT_NAME_LEN - 1, rdbuf);
671         if (error)
672                 return error;
673
674         /* remove last '$' end marker */
675         rdbuf[EDT_NAME_LEN - 1] = '\0';
676         if (rdbuf[EDT_NAME_LEN - 2] == '$')
677                 rdbuf[EDT_NAME_LEN - 2] = '\0';
678
679         /* look for Model/Version separator */
680         p = strchr(rdbuf, '*');
681         if (p)
682                 *p++ = '\0';
683
684         strlcpy(model_name, rdbuf + 1, EDT_NAME_LEN);
685         strlcpy(fw_version, p ? p : "", EDT_NAME_LEN);
686
687         return 0;
688 }
689
690 #define EDT_ATTR_CHECKSET(name, reg) \
691         if (pdata->name >= edt_ft5x06_attr_##name.limit_low &&          \
692             pdata->name <= edt_ft5x06_attr_##name.limit_high)           \
693                 edt_ft5x06_register_write(tsdata, reg, pdata->name)
694
695 #define EDT_GET_PROP(name, reg) {                               \
696         u32 val;                                                \
697         if (of_property_read_u32(np, #name, &val) == 0)         \
698                 edt_ft5x06_register_write(tsdata, reg, val);    \
699 }
700
701 static void edt_ft5x06_ts_get_dt_defaults(struct device_node *np,
702                                         struct edt_ft5x06_ts_data *tsdata)
703 {
704         EDT_GET_PROP(threshold, WORK_REGISTER_THRESHOLD);
705         EDT_GET_PROP(gain, WORK_REGISTER_GAIN);
706         EDT_GET_PROP(offset, WORK_REGISTER_OFFSET);
707 }
708
709 static void
710 edt_ft5x06_ts_get_defaults(struct edt_ft5x06_ts_data *tsdata,
711                            const struct edt_ft5x06_platform_data *pdata)
712 {
713         if (!pdata->use_parameters)
714                 return;
715
716         /* pick up defaults from the platform data */
717         EDT_ATTR_CHECKSET(threshold, WORK_REGISTER_THRESHOLD);
718         EDT_ATTR_CHECKSET(gain, WORK_REGISTER_GAIN);
719         EDT_ATTR_CHECKSET(offset, WORK_REGISTER_OFFSET);
720         EDT_ATTR_CHECKSET(report_rate, WORK_REGISTER_REPORT_RATE);
721 }
722
723 static void
724 edt_ft5x06_ts_get_parameters(struct edt_ft5x06_ts_data *tsdata)
725 {
726         tsdata->threshold = edt_ft5x06_register_read(tsdata,
727                                                      WORK_REGISTER_THRESHOLD);
728         tsdata->gain = edt_ft5x06_register_read(tsdata, WORK_REGISTER_GAIN);
729         tsdata->offset = edt_ft5x06_register_read(tsdata, WORK_REGISTER_OFFSET);
730         tsdata->report_rate = edt_ft5x06_register_read(tsdata,
731                                                 WORK_REGISTER_REPORT_RATE);
732         tsdata->num_x = edt_ft5x06_register_read(tsdata, WORK_REGISTER_NUM_X);
733         tsdata->num_y = edt_ft5x06_register_read(tsdata, WORK_REGISTER_NUM_Y);
734 }
735
736 #ifdef CONFIG_OF
737 static int edt_ft5x06_i2c_ts_probe_dt(struct device *dev,
738                                 struct edt_ft5x06_ts_data *tsdata)
739 {
740         struct device_node *np = dev->of_node;
741
742         /*
743          * irq_pin is not needed for DT setup.
744          * irq is associated via 'interrupts' property in DT
745          */
746         tsdata->irq_pin = -EINVAL;
747         tsdata->reset_pin = of_get_named_gpio(np, "reset-gpios", 0);
748         tsdata->wake_pin = of_get_named_gpio(np, "wake-gpios", 0);
749
750         return 0;
751 }
752 #else
753 static inline int edt_ft5x06_i2c_ts_probe_dt(struct device *dev,
754                                         struct edt_ft5x06_ts_data *tsdata)
755 {
756         return -ENODEV;
757 }
758 #endif
759
760 static int edt_ft5x06_ts_probe(struct i2c_client *client,
761                                          const struct i2c_device_id *id)
762 {
763         const struct edt_ft5x06_platform_data *pdata =
764                                                 dev_get_platdata(&client->dev);
765         struct edt_ft5x06_ts_data *tsdata;
766         struct input_dev *input;
767         int error;
768         char fw_version[EDT_NAME_LEN];
769
770         dev_dbg(&client->dev, "probing for EDT FT5x06 I2C\n");
771
772         tsdata = devm_kzalloc(&client->dev, sizeof(*tsdata), GFP_KERNEL);
773         if (!tsdata) {
774                 dev_err(&client->dev, "failed to allocate driver data.\n");
775                 return -ENOMEM;
776         }
777
778         if (!pdata) {
779                 error = edt_ft5x06_i2c_ts_probe_dt(&client->dev, tsdata);
780                 if (error) {
781                         dev_err(&client->dev,
782                                 "DT probe failed and no platform data present\n");
783                         return error;
784                 }
785         } else {
786                 tsdata->reset_pin = pdata->reset_pin;
787                 tsdata->irq_pin = pdata->irq_pin;
788                 tsdata->wake_pin = -EINVAL;
789         }
790
791         error = edt_ft5x06_ts_reset(client, tsdata);
792         if (error)
793                 return error;
794
795         if (gpio_is_valid(tsdata->irq_pin)) {
796                 error = devm_gpio_request_one(&client->dev, tsdata->irq_pin,
797                                         GPIOF_IN, "edt-ft5x06 irq");
798                 if (error) {
799                         dev_err(&client->dev,
800                                 "Failed to request GPIO %d, error %d\n",
801                                 tsdata->irq_pin, error);
802                         return error;
803                 }
804         }
805
806         input = devm_input_allocate_device(&client->dev);
807         if (!input) {
808                 dev_err(&client->dev, "failed to allocate input device.\n");
809                 return -ENOMEM;
810         }
811
812         mutex_init(&tsdata->mutex);
813         tsdata->client = client;
814         tsdata->input = input;
815         tsdata->factory_mode = false;
816
817         error = edt_ft5x06_ts_identify(client, tsdata->name, fw_version);
818         if (error) {
819                 dev_err(&client->dev, "touchscreen probe failed\n");
820                 return error;
821         }
822
823         if (!pdata)
824                 edt_ft5x06_ts_get_dt_defaults(client->dev.of_node, tsdata);
825         else
826                 edt_ft5x06_ts_get_defaults(tsdata, pdata);
827
828         edt_ft5x06_ts_get_parameters(tsdata);
829
830         dev_dbg(&client->dev,
831                 "Model \"%s\", Rev. \"%s\", %dx%d sensors\n",
832                 tsdata->name, fw_version, tsdata->num_x, tsdata->num_y);
833
834         input->name = tsdata->name;
835         input->id.bustype = BUS_I2C;
836         input->dev.parent = &client->dev;
837
838         __set_bit(EV_SYN, input->evbit);
839         __set_bit(EV_KEY, input->evbit);
840         __set_bit(EV_ABS, input->evbit);
841         __set_bit(BTN_TOUCH, input->keybit);
842         input_set_abs_params(input, ABS_X, 0, tsdata->num_x * 64 - 1, 0, 0);
843         input_set_abs_params(input, ABS_Y, 0, tsdata->num_y * 64 - 1, 0, 0);
844         input_set_abs_params(input, ABS_MT_POSITION_X,
845                              0, tsdata->num_x * 64 - 1, 0, 0);
846         input_set_abs_params(input, ABS_MT_POSITION_Y,
847                              0, tsdata->num_y * 64 - 1, 0, 0);
848         error = input_mt_init_slots(input, MAX_SUPPORT_POINTS, 0);
849         if (error) {
850                 dev_err(&client->dev, "Unable to init MT slots.\n");
851                 return error;
852         }
853
854         input_set_drvdata(input, tsdata);
855         i2c_set_clientdata(client, tsdata);
856
857         error = devm_request_threaded_irq(&client->dev, client->irq, NULL,
858                                         edt_ft5x06_ts_isr,
859                                         IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
860                                         client->name, tsdata);
861         if (error) {
862                 dev_err(&client->dev, "Unable to request touchscreen IRQ.\n");
863                 return error;
864         }
865
866         error = sysfs_create_group(&client->dev.kobj, &edt_ft5x06_attr_group);
867         if (error)
868                 return error;
869
870         error = input_register_device(input);
871         if (error)
872                 goto err_remove_attrs;
873
874         edt_ft5x06_ts_prepare_debugfs(tsdata, dev_driver_string(&client->dev));
875         device_init_wakeup(&client->dev, 1);
876
877         dev_dbg(&client->dev,
878                 "EDT FT5x06 initialized: IRQ %d, WAKE pin %d, Reset pin %d.\n",
879                 client->irq, tsdata->wake_pin, tsdata->reset_pin);
880
881         return 0;
882
883 err_remove_attrs:
884         sysfs_remove_group(&client->dev.kobj, &edt_ft5x06_attr_group);
885         return error;
886 }
887
888 static int edt_ft5x06_ts_remove(struct i2c_client *client)
889 {
890         struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client);
891
892         edt_ft5x06_ts_teardown_debugfs(tsdata);
893         sysfs_remove_group(&client->dev.kobj, &edt_ft5x06_attr_group);
894
895         return 0;
896 }
897
898 #ifdef CONFIG_PM_SLEEP
899 static int edt_ft5x06_ts_suspend(struct device *dev)
900 {
901         struct i2c_client *client = to_i2c_client(dev);
902
903         if (device_may_wakeup(dev))
904                 enable_irq_wake(client->irq);
905
906         return 0;
907 }
908
909 static int edt_ft5x06_ts_resume(struct device *dev)
910 {
911         struct i2c_client *client = to_i2c_client(dev);
912
913         if (device_may_wakeup(dev))
914                 disable_irq_wake(client->irq);
915
916         return 0;
917 }
918 #endif
919
920 static SIMPLE_DEV_PM_OPS(edt_ft5x06_ts_pm_ops,
921                          edt_ft5x06_ts_suspend, edt_ft5x06_ts_resume);
922
923 static const struct i2c_device_id edt_ft5x06_ts_id[] = {
924         { "edt-ft5x06", 0, },
925         { /* sentinel */ }
926 };
927 MODULE_DEVICE_TABLE(i2c, edt_ft5x06_ts_id);
928
929 #ifdef CONFIG_OF
930 static const struct of_device_id edt_ft5x06_of_match[] = {
931         { .compatible = "edt,edt-ft5206", },
932         { .compatible = "edt,edt-ft5306", },
933         { .compatible = "edt,edt-ft5406", },
934         { /* sentinel */ }
935 };
936 MODULE_DEVICE_TABLE(of, edt_ft5x06_of_match);
937 #endif
938
939 static struct i2c_driver edt_ft5x06_ts_driver = {
940         .driver = {
941                 .owner = THIS_MODULE,
942                 .name = "edt_ft5x06",
943                 .of_match_table = of_match_ptr(edt_ft5x06_of_match),
944                 .pm = &edt_ft5x06_ts_pm_ops,
945         },
946         .id_table = edt_ft5x06_ts_id,
947         .probe    = edt_ft5x06_ts_probe,
948         .remove   = edt_ft5x06_ts_remove,
949 };
950
951 module_i2c_driver(edt_ft5x06_ts_driver);
952
953 MODULE_AUTHOR("Simon Budig <simon.budig@kernelconcepts.de>");
954 MODULE_DESCRIPTION("EDT FT5x06 I2C Touchscreen Driver");
955 MODULE_LICENSE("GPL");