e694a9b2b1e5fa6e2302905f0db94c5fb0520b3c
[linux-2.6-microblaze.git] / drivers / input / touchscreen / raydium_i2c_ts.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Raydium touchscreen I2C driver.
4  *
5  * Copyright (C) 2012-2014, Raydium Semiconductor Corporation.
6  *
7  * Raydium reserves the right to make changes without further notice
8  * to the materials described herein. Raydium does not assume any
9  * liability arising out of the application described herein.
10  *
11  * Contact Raydium Semiconductor Corporation at www.rad-ic.com
12  */
13
14 #include <linux/acpi.h>
15 #include <linux/delay.h>
16 #include <linux/firmware.h>
17 #include <linux/gpio/consumer.h>
18 #include <linux/i2c.h>
19 #include <linux/input.h>
20 #include <linux/input/mt.h>
21 #include <linux/interrupt.h>
22 #include <linux/module.h>
23 #include <linux/of.h>
24 #include <linux/regulator/consumer.h>
25 #include <linux/slab.h>
26 #include <asm/unaligned.h>
27
28 /* Slave I2C mode */
29 #define RM_BOOT_BLDR            0x02
30 #define RM_BOOT_MAIN            0x03
31
32 /* I2C bootoloader commands */
33 #define RM_CMD_BOOT_PAGE_WRT    0x0B            /* send bl page write */
34 #define RM_CMD_BOOT_WRT         0x11            /* send bl write */
35 #define RM_CMD_BOOT_ACK         0x22            /* send ack*/
36 #define RM_CMD_BOOT_CHK         0x33            /* send data check */
37 #define RM_CMD_BOOT_READ        0x44            /* send wait bl data ready*/
38
39 #define RM_BOOT_RDY             0xFF            /* bl data ready */
40
41 /* I2C main commands */
42 #define RM_CMD_QUERY_BANK       0x2B
43 #define RM_CMD_DATA_BANK        0x4D
44 #define RM_CMD_ENTER_SLEEP      0x4E
45 #define RM_CMD_BANK_SWITCH      0xAA
46
47 #define RM_RESET_MSG_ADDR       0x40000004
48
49 #define RM_MAX_READ_SIZE        56
50 #define RM_PACKET_CRC_SIZE      2
51
52 /* Touch relative info */
53 #define RM_MAX_RETRIES          3
54 #define RM_RETRY_DELAY_MS       20
55 #define RM_MAX_TOUCH_NUM        10
56 #define RM_BOOT_DELAY_MS        100
57
58 /* Offsets in contact data */
59 #define RM_CONTACT_STATE_POS    0
60 #define RM_CONTACT_X_POS        1
61 #define RM_CONTACT_Y_POS        3
62 #define RM_CONTACT_PRESSURE_POS 5
63 #define RM_CONTACT_WIDTH_X_POS  6
64 #define RM_CONTACT_WIDTH_Y_POS  7
65
66 /* Bootloader relative info */
67 #define RM_BL_WRT_CMD_SIZE      3       /* bl flash wrt cmd size */
68 #define RM_BL_WRT_PKG_SIZE      32      /* bl wrt pkg size */
69 #define RM_BL_WRT_LEN           (RM_BL_WRT_PKG_SIZE + RM_BL_WRT_CMD_SIZE)
70 #define RM_FW_PAGE_SIZE         128
71 #define RM_MAX_FW_RETRIES       30
72 #define RM_MAX_FW_SIZE          0xD000
73
74 #define RM_POWERON_DELAY_USEC   500
75 #define RM_RESET_DELAY_MSEC     50
76
77 enum raydium_bl_cmd {
78         BL_HEADER = 0,
79         BL_PAGE_STR,
80         BL_PKG_IDX,
81         BL_DATA_STR,
82 };
83
84 enum raydium_bl_ack {
85         RAYDIUM_ACK_NULL = 0,
86         RAYDIUM_WAIT_READY,
87         RAYDIUM_PATH_READY,
88 };
89
90 enum raydium_boot_mode {
91         RAYDIUM_TS_MAIN = 0,
92         RAYDIUM_TS_BLDR,
93 };
94
95 /* Response to RM_CMD_DATA_BANK request */
96 struct raydium_data_info {
97         __le32 data_bank_addr;
98         u8 pkg_size;
99         u8 tp_info_size;
100 };
101
102 struct raydium_info {
103         __le32 hw_ver;          /*device version */
104         u8 main_ver;
105         u8 sub_ver;
106         __le16 ft_ver;          /* test version */
107         u8 x_num;
108         u8 y_num;
109         __le16 x_max;
110         __le16 y_max;
111         u8 x_res;               /* units/mm */
112         u8 y_res;               /* units/mm */
113 };
114
115 /* struct raydium_data - represents state of Raydium touchscreen device */
116 struct raydium_data {
117         struct i2c_client *client;
118         struct input_dev *input;
119
120         struct regulator *avdd;
121         struct regulator *vccio;
122         struct gpio_desc *reset_gpio;
123
124         struct raydium_info info;
125
126         struct mutex sysfs_mutex;
127
128         u8 *report_data;
129
130         u32 data_bank_addr;
131         u8 report_size;
132         u8 contact_size;
133         u8 pkg_size;
134
135         enum raydium_boot_mode boot_mode;
136
137         bool wake_irq_enabled;
138 };
139
140 static int raydium_i2c_xfer(struct i2c_client *client,
141                             u32 addr, void *data, size_t len, bool is_read)
142 {
143         struct raydium_bank_switch_header {
144                 u8 cmd;
145                 __be32 be_addr;
146         } __packed header = {
147                 .cmd = RM_CMD_BANK_SWITCH,
148                 .be_addr = cpu_to_be32(addr),
149         };
150
151         u8 reg_addr = addr & 0xff;
152
153         struct i2c_msg xfer[] = {
154                 {
155                         .addr = client->addr,
156                         .len = sizeof(header),
157                         .buf = (u8 *)&header,
158                 },
159                 {
160                         .addr = client->addr,
161                         .len = 1,
162                         .buf = &reg_addr,
163                 },
164                 {
165                         .addr = client->addr,
166                         .len = len,
167                         .buf = data,
168                         .flags = is_read ? I2C_M_RD : 0,
169                 }
170         };
171
172         /*
173          * If address is greater than 255, then RM_CMD_BANK_SWITCH needs to be
174          * sent first. Else, skip the header i.e. xfer[0].
175          */
176         int xfer_start_idx = (addr > 0xff) ? 0 : 1;
177         size_t xfer_count = ARRAY_SIZE(xfer) - xfer_start_idx;
178         int ret;
179
180         ret = i2c_transfer(client->adapter, &xfer[xfer_start_idx], xfer_count);
181         if (likely(ret == xfer_count))
182                 return 0;
183
184         return ret < 0 ? ret : -EIO;
185 }
186
187 static int raydium_i2c_send(struct i2c_client *client,
188                             u32 addr, const void *data, size_t len)
189 {
190         int tries = 0;
191         int error;
192
193         do {
194                 error = raydium_i2c_xfer(client, addr, (void *)data, len,
195                                          false);
196                 if (likely(!error))
197                         return 0;
198
199                 msleep(RM_RETRY_DELAY_MS);
200         } while (++tries < RM_MAX_RETRIES);
201
202         dev_err(&client->dev, "%s failed: %d\n", __func__, error);
203         return error;
204 }
205
206 static int raydium_i2c_read(struct i2c_client *client,
207                             u32 addr, void *data, size_t len)
208 {
209         size_t xfer_len;
210         int error;
211
212         while (len) {
213                 xfer_len = min_t(size_t, len, RM_MAX_READ_SIZE);
214                 error = raydium_i2c_xfer(client, addr, data, xfer_len, true);
215                 if (unlikely(error))
216                         return error;
217
218                 len -= xfer_len;
219                 data += xfer_len;
220                 addr += xfer_len;
221         }
222
223         return 0;
224 }
225
226 static int raydium_i2c_sw_reset(struct i2c_client *client)
227 {
228         const u8 soft_rst_cmd = 0x01;
229         int error;
230
231         error = raydium_i2c_send(client, RM_RESET_MSG_ADDR, &soft_rst_cmd,
232                                  sizeof(soft_rst_cmd));
233         if (error) {
234                 dev_err(&client->dev, "software reset failed: %d\n", error);
235                 return error;
236         }
237
238         msleep(RM_RESET_DELAY_MSEC);
239
240         return 0;
241 }
242
243 static int raydium_i2c_query_ts_info(struct raydium_data *ts)
244 {
245         struct i2c_client *client = ts->client;
246         struct raydium_data_info data_info;
247         __le32 query_bank_addr;
248
249         int error, retry_cnt;
250
251         for (retry_cnt = 0; retry_cnt < RM_MAX_RETRIES; retry_cnt++) {
252                 error = raydium_i2c_read(client, RM_CMD_DATA_BANK,
253                                          &data_info, sizeof(data_info));
254                 if (error)
255                         continue;
256
257                 /*
258                  * Warn user if we already allocated memory for reports and
259                  * then the size changed (due to firmware update?) and keep
260                  * old size instead.
261                  */
262                 if (ts->report_data && ts->pkg_size != data_info.pkg_size) {
263                         dev_warn(&client->dev,
264                                  "report size changes, was: %d, new: %d\n",
265                                  ts->pkg_size, data_info.pkg_size);
266                 } else {
267                         ts->pkg_size = data_info.pkg_size;
268                         ts->report_size = ts->pkg_size - RM_PACKET_CRC_SIZE;
269                 }
270
271                 ts->contact_size = data_info.tp_info_size;
272                 ts->data_bank_addr = le32_to_cpu(data_info.data_bank_addr);
273
274                 dev_dbg(&client->dev,
275                         "data_bank_addr: %#08x, report_size: %d, contact_size: %d\n",
276                         ts->data_bank_addr, ts->report_size, ts->contact_size);
277
278                 error = raydium_i2c_read(client, RM_CMD_QUERY_BANK,
279                                          &query_bank_addr,
280                                          sizeof(query_bank_addr));
281                 if (error)
282                         continue;
283
284                 error = raydium_i2c_read(client, le32_to_cpu(query_bank_addr),
285                                          &ts->info, sizeof(ts->info));
286                 if (error)
287                         continue;
288
289                 return 0;
290         }
291
292         dev_err(&client->dev, "failed to query device parameters: %d\n", error);
293         return error;
294 }
295
296 static int raydium_i2c_check_fw_status(struct raydium_data *ts)
297 {
298         struct i2c_client *client = ts->client;
299         static const u8 bl_ack = 0x62;
300         static const u8 main_ack = 0x66;
301         u8 buf[4];
302         int error;
303
304         error = raydium_i2c_read(client, RM_CMD_BOOT_READ, buf, sizeof(buf));
305         if (!error) {
306                 if (buf[0] == bl_ack)
307                         ts->boot_mode = RAYDIUM_TS_BLDR;
308                 else if (buf[0] == main_ack)
309                         ts->boot_mode = RAYDIUM_TS_MAIN;
310                 return 0;
311         }
312
313         return error;
314 }
315
316 static int raydium_i2c_initialize(struct raydium_data *ts)
317 {
318         struct i2c_client *client = ts->client;
319         int error, retry_cnt;
320
321         for (retry_cnt = 0; retry_cnt < RM_MAX_RETRIES; retry_cnt++) {
322                 /* Wait for Hello packet */
323                 msleep(RM_BOOT_DELAY_MS);
324
325                 error = raydium_i2c_check_fw_status(ts);
326                 if (error) {
327                         dev_err(&client->dev,
328                                 "failed to read 'hello' packet: %d\n", error);
329                         continue;
330                 }
331
332                 if (ts->boot_mode == RAYDIUM_TS_BLDR ||
333                     ts->boot_mode == RAYDIUM_TS_MAIN) {
334                         break;
335                 }
336         }
337
338         if (error)
339                 ts->boot_mode = RAYDIUM_TS_BLDR;
340
341         if (ts->boot_mode == RAYDIUM_TS_BLDR) {
342                 ts->info.hw_ver = cpu_to_le32(0xffffffffUL);
343                 ts->info.main_ver = 0xff;
344                 ts->info.sub_ver = 0xff;
345         } else {
346                 raydium_i2c_query_ts_info(ts);
347         }
348
349         return error;
350 }
351
352 static int raydium_i2c_bl_chk_state(struct i2c_client *client,
353                                     enum raydium_bl_ack state)
354 {
355         static const u8 ack_ok[] = { 0xFF, 0x39, 0x30, 0x30, 0x54 };
356         u8 rbuf[sizeof(ack_ok)];
357         u8 retry;
358         int error;
359
360         for (retry = 0; retry < RM_MAX_FW_RETRIES; retry++) {
361                 switch (state) {
362                 case RAYDIUM_ACK_NULL:
363                         return 0;
364
365                 case RAYDIUM_WAIT_READY:
366                         error = raydium_i2c_read(client, RM_CMD_BOOT_CHK,
367                                                  &rbuf[0], 1);
368                         if (!error && rbuf[0] == RM_BOOT_RDY)
369                                 return 0;
370
371                         break;
372
373                 case RAYDIUM_PATH_READY:
374                         error = raydium_i2c_read(client, RM_CMD_BOOT_CHK,
375                                                  rbuf, sizeof(rbuf));
376                         if (!error && !memcmp(rbuf, ack_ok, sizeof(ack_ok)))
377                                 return 0;
378
379                         break;
380
381                 default:
382                         dev_err(&client->dev, "%s: invalid target state %d\n",
383                                 __func__, state);
384                         return -EINVAL;
385                 }
386
387                 msleep(20);
388         }
389
390         return -ETIMEDOUT;
391 }
392
393 static int raydium_i2c_write_object(struct i2c_client *client,
394                                     const void *data, size_t len,
395                                     enum raydium_bl_ack state)
396 {
397         int error;
398
399         error = raydium_i2c_send(client, RM_CMD_BOOT_WRT, data, len);
400         if (error) {
401                 dev_err(&client->dev, "WRT obj command failed: %d\n",
402                         error);
403                 return error;
404         }
405
406         error = raydium_i2c_send(client, RM_CMD_BOOT_ACK, NULL, 0);
407         if (error) {
408                 dev_err(&client->dev, "Ack obj command failed: %d\n", error);
409                 return error;
410         }
411
412         error = raydium_i2c_bl_chk_state(client, state);
413         if (error) {
414                 dev_err(&client->dev, "BL check state failed: %d\n", error);
415                 return error;
416         }
417         return 0;
418 }
419
420 static int raydium_i2c_boot_trigger(struct i2c_client *client)
421 {
422         static const u8 cmd[7][6] = {
423                 { 0x08, 0x0C, 0x09, 0x00, 0x50, 0xD7 },
424                 { 0x08, 0x04, 0x09, 0x00, 0x50, 0xA5 },
425                 { 0x08, 0x04, 0x09, 0x00, 0x50, 0x00 },
426                 { 0x08, 0x04, 0x09, 0x00, 0x50, 0xA5 },
427                 { 0x08, 0x0C, 0x09, 0x00, 0x50, 0x00 },
428                 { 0x06, 0x01, 0x00, 0x00, 0x00, 0x00 },
429                 { 0x02, 0xA2, 0x00, 0x00, 0x00, 0x00 },
430         };
431         int i;
432         int error;
433
434         for (i = 0; i < 7; i++) {
435                 error = raydium_i2c_write_object(client, cmd[i], sizeof(cmd[i]),
436                                                  RAYDIUM_WAIT_READY);
437                 if (error) {
438                         dev_err(&client->dev,
439                                 "boot trigger failed at step %d: %d\n",
440                                 i, error);
441                         return error;
442                 }
443         }
444
445         return 0;
446 }
447
448 static int raydium_i2c_fw_trigger(struct i2c_client *client)
449 {
450         static const u8 cmd[5][11] = {
451                 { 0, 0x09, 0x71, 0x0C, 0x09, 0x00, 0x50, 0xD7, 0, 0, 0 },
452                 { 0, 0x09, 0x71, 0x04, 0x09, 0x00, 0x50, 0xA5, 0, 0, 0 },
453                 { 0, 0x09, 0x71, 0x04, 0x09, 0x00, 0x50, 0x00, 0, 0, 0 },
454                 { 0, 0x09, 0x71, 0x04, 0x09, 0x00, 0x50, 0xA5, 0, 0, 0 },
455                 { 0, 0x09, 0x71, 0x0C, 0x09, 0x00, 0x50, 0x00, 0, 0, 0 },
456         };
457         int i;
458         int error;
459
460         for (i = 0; i < 5; i++) {
461                 error = raydium_i2c_write_object(client, cmd[i], sizeof(cmd[i]),
462                                                  RAYDIUM_ACK_NULL);
463                 if (error) {
464                         dev_err(&client->dev,
465                                 "fw trigger failed at step %d: %d\n",
466                                 i, error);
467                         return error;
468                 }
469         }
470
471         return 0;
472 }
473
474 static int raydium_i2c_check_path(struct i2c_client *client)
475 {
476         static const u8 cmd[] = { 0x09, 0x00, 0x09, 0x00, 0x50, 0x10, 0x00 };
477         int error;
478
479         error = raydium_i2c_write_object(client, cmd, sizeof(cmd),
480                                          RAYDIUM_PATH_READY);
481         if (error) {
482                 dev_err(&client->dev, "check path command failed: %d\n", error);
483                 return error;
484         }
485
486         return 0;
487 }
488
489 static int raydium_i2c_enter_bl(struct i2c_client *client)
490 {
491         static const u8 cal_cmd[] = { 0x00, 0x01, 0x52 };
492         int error;
493
494         error = raydium_i2c_write_object(client, cal_cmd, sizeof(cal_cmd),
495                                          RAYDIUM_ACK_NULL);
496         if (error) {
497                 dev_err(&client->dev, "enter bl command failed: %d\n", error);
498                 return error;
499         }
500
501         msleep(RM_BOOT_DELAY_MS);
502         return 0;
503 }
504
505 static int raydium_i2c_leave_bl(struct i2c_client *client)
506 {
507         static const u8 leave_cmd[] = { 0x05, 0x00 };
508         int error;
509
510         error = raydium_i2c_write_object(client, leave_cmd, sizeof(leave_cmd),
511                                          RAYDIUM_ACK_NULL);
512         if (error) {
513                 dev_err(&client->dev, "leave bl command failed: %d\n", error);
514                 return error;
515         }
516
517         msleep(RM_BOOT_DELAY_MS);
518         return 0;
519 }
520
521 static int raydium_i2c_write_checksum(struct i2c_client *client,
522                                       size_t length, u16 checksum)
523 {
524         u8 checksum_cmd[] = { 0x00, 0x05, 0x6D, 0x00, 0x00, 0x00, 0x00 };
525         int error;
526
527         put_unaligned_le16(length, &checksum_cmd[3]);
528         put_unaligned_le16(checksum, &checksum_cmd[5]);
529
530         error = raydium_i2c_write_object(client,
531                                          checksum_cmd, sizeof(checksum_cmd),
532                                          RAYDIUM_ACK_NULL);
533         if (error) {
534                 dev_err(&client->dev, "failed to write checksum: %d\n",
535                         error);
536                 return error;
537         }
538
539         return 0;
540 }
541
542 static int raydium_i2c_disable_watch_dog(struct i2c_client *client)
543 {
544         static const u8 cmd[] = { 0x0A, 0xAA };
545         int error;
546
547         error = raydium_i2c_write_object(client, cmd, sizeof(cmd),
548                                          RAYDIUM_WAIT_READY);
549         if (error) {
550                 dev_err(&client->dev, "disable watchdog command failed: %d\n",
551                         error);
552                 return error;
553         }
554
555         return 0;
556 }
557
558 static int raydium_i2c_fw_write_page(struct i2c_client *client,
559                                      u16 page_idx, const void *data, size_t len)
560 {
561         u8 buf[RM_BL_WRT_LEN];
562         size_t xfer_len;
563         int error;
564         int i;
565
566         BUILD_BUG_ON((RM_FW_PAGE_SIZE % RM_BL_WRT_PKG_SIZE) != 0);
567
568         for (i = 0; i < RM_FW_PAGE_SIZE / RM_BL_WRT_PKG_SIZE; i++) {
569                 buf[BL_HEADER] = RM_CMD_BOOT_PAGE_WRT;
570                 buf[BL_PAGE_STR] = page_idx ? 0xff : 0;
571                 buf[BL_PKG_IDX] = i + 1;
572
573                 xfer_len = min_t(size_t, len, RM_BL_WRT_PKG_SIZE);
574                 memcpy(&buf[BL_DATA_STR], data, xfer_len);
575                 if (len < RM_BL_WRT_PKG_SIZE)
576                         memset(&buf[BL_DATA_STR + xfer_len], 0xff,
577                                 RM_BL_WRT_PKG_SIZE - xfer_len);
578
579                 error = raydium_i2c_write_object(client, buf, RM_BL_WRT_LEN,
580                                                  RAYDIUM_WAIT_READY);
581                 if (error) {
582                         dev_err(&client->dev,
583                                 "page write command failed for page %d, chunk %d: %d\n",
584                                 page_idx, i, error);
585                         return error;
586                 }
587
588                 data += xfer_len;
589                 len -= xfer_len;
590         }
591
592         return error;
593 }
594
595 static u16 raydium_calc_chksum(const u8 *buf, u16 len)
596 {
597         u16 checksum = 0;
598         u16 i;
599
600         for (i = 0; i < len; i++)
601                 checksum += buf[i];
602
603         return checksum;
604 }
605
606 static int raydium_i2c_do_update_firmware(struct raydium_data *ts,
607                                          const struct firmware *fw)
608 {
609         struct i2c_client *client = ts->client;
610         const void *data;
611         size_t data_len;
612         size_t len;
613         int page_nr;
614         int i;
615         int error;
616         u16 fw_checksum;
617
618         if (fw->size == 0 || fw->size > RM_MAX_FW_SIZE) {
619                 dev_err(&client->dev, "Invalid firmware length\n");
620                 return -EINVAL;
621         }
622
623         error = raydium_i2c_check_fw_status(ts);
624         if (error) {
625                 dev_err(&client->dev, "Unable to access IC %d\n", error);
626                 return error;
627         }
628
629         if (ts->boot_mode == RAYDIUM_TS_MAIN) {
630                 for (i = 0; i < RM_MAX_RETRIES; i++) {
631                         error = raydium_i2c_enter_bl(client);
632                         if (!error) {
633                                 error = raydium_i2c_check_fw_status(ts);
634                                 if (error) {
635                                         dev_err(&client->dev,
636                                                 "unable to access IC: %d\n",
637                                                 error);
638                                         return error;
639                                 }
640
641                                 if (ts->boot_mode == RAYDIUM_TS_BLDR)
642                                         break;
643                         }
644                 }
645
646                 if (ts->boot_mode == RAYDIUM_TS_MAIN) {
647                         dev_err(&client->dev,
648                                 "failed to jump to boot loader: %d\n",
649                                 error);
650                         return -EIO;
651                 }
652         }
653
654         error = raydium_i2c_disable_watch_dog(client);
655         if (error)
656                 return error;
657
658         error = raydium_i2c_check_path(client);
659         if (error)
660                 return error;
661
662         error = raydium_i2c_boot_trigger(client);
663         if (error) {
664                 dev_err(&client->dev, "send boot trigger fail: %d\n", error);
665                 return error;
666         }
667
668         msleep(RM_BOOT_DELAY_MS);
669
670         data = fw->data;
671         data_len = fw->size;
672         page_nr = 0;
673
674         while (data_len) {
675                 len = min_t(size_t, data_len, RM_FW_PAGE_SIZE);
676
677                 error = raydium_i2c_fw_write_page(client, page_nr++, data, len);
678                 if (error)
679                         return error;
680
681                 msleep(20);
682
683                 data += len;
684                 data_len -= len;
685         }
686
687         error = raydium_i2c_leave_bl(client);
688         if (error) {
689                 dev_err(&client->dev,
690                         "failed to leave boot loader: %d\n", error);
691                 return error;
692         }
693
694         dev_dbg(&client->dev, "left boot loader mode\n");
695         msleep(RM_BOOT_DELAY_MS);
696
697         error = raydium_i2c_check_fw_status(ts);
698         if (error) {
699                 dev_err(&client->dev,
700                         "failed to check fw status after write: %d\n",
701                         error);
702                 return error;
703         }
704
705         if (ts->boot_mode != RAYDIUM_TS_MAIN) {
706                 dev_err(&client->dev,
707                         "failed to switch to main fw after writing firmware: %d\n",
708                         error);
709                 return -EINVAL;
710         }
711
712         error = raydium_i2c_fw_trigger(client);
713         if (error) {
714                 dev_err(&client->dev, "failed to trigger fw: %d\n", error);
715                 return error;
716         }
717
718         fw_checksum = raydium_calc_chksum(fw->data, fw->size);
719
720         error = raydium_i2c_write_checksum(client, fw->size, fw_checksum);
721         if (error)
722                 return error;
723
724         return 0;
725 }
726
727 static int raydium_i2c_fw_update(struct raydium_data *ts)
728 {
729         struct i2c_client *client = ts->client;
730         const struct firmware *fw = NULL;
731         char *fw_file;
732         int error;
733
734         fw_file = kasprintf(GFP_KERNEL, "raydium_%#04x.fw",
735                             le32_to_cpu(ts->info.hw_ver));
736         if (!fw_file)
737                 return -ENOMEM;
738
739         dev_dbg(&client->dev, "firmware name: %s\n", fw_file);
740
741         error = request_firmware(&fw, fw_file, &client->dev);
742         if (error) {
743                 dev_err(&client->dev, "Unable to open firmware %s\n", fw_file);
744                 goto out_free_fw_file;
745         }
746
747         disable_irq(client->irq);
748
749         error = raydium_i2c_do_update_firmware(ts, fw);
750         if (error) {
751                 dev_err(&client->dev, "firmware update failed: %d\n", error);
752                 ts->boot_mode = RAYDIUM_TS_BLDR;
753                 goto out_enable_irq;
754         }
755
756         error = raydium_i2c_initialize(ts);
757         if (error) {
758                 dev_err(&client->dev,
759                         "failed to initialize device after firmware update: %d\n",
760                         error);
761                 ts->boot_mode = RAYDIUM_TS_BLDR;
762                 goto out_enable_irq;
763         }
764
765         ts->boot_mode = RAYDIUM_TS_MAIN;
766
767 out_enable_irq:
768         enable_irq(client->irq);
769         msleep(100);
770
771         release_firmware(fw);
772
773 out_free_fw_file:
774         kfree(fw_file);
775
776         return error;
777 }
778
779 static void raydium_mt_event(struct raydium_data *ts)
780 {
781         int i;
782
783         for (i = 0; i < ts->report_size / ts->contact_size; i++) {
784                 u8 *contact = &ts->report_data[ts->contact_size * i];
785                 bool state = contact[RM_CONTACT_STATE_POS];
786                 u8 wx, wy;
787
788                 input_mt_slot(ts->input, i);
789                 input_mt_report_slot_state(ts->input, MT_TOOL_FINGER, state);
790
791                 if (!state)
792                         continue;
793
794                 input_report_abs(ts->input, ABS_MT_POSITION_X,
795                                 get_unaligned_le16(&contact[RM_CONTACT_X_POS]));
796                 input_report_abs(ts->input, ABS_MT_POSITION_Y,
797                                 get_unaligned_le16(&contact[RM_CONTACT_Y_POS]));
798                 input_report_abs(ts->input, ABS_MT_PRESSURE,
799                                 contact[RM_CONTACT_PRESSURE_POS]);
800
801                 wx = contact[RM_CONTACT_WIDTH_X_POS];
802                 wy = contact[RM_CONTACT_WIDTH_Y_POS];
803
804                 input_report_abs(ts->input, ABS_MT_TOUCH_MAJOR, max(wx, wy));
805                 input_report_abs(ts->input, ABS_MT_TOUCH_MINOR, min(wx, wy));
806         }
807
808         input_mt_sync_frame(ts->input);
809         input_sync(ts->input);
810 }
811
812 static irqreturn_t raydium_i2c_irq(int irq, void *_dev)
813 {
814         struct raydium_data *ts = _dev;
815         int error;
816         u16 fw_crc;
817         u16 calc_crc;
818
819         if (ts->boot_mode != RAYDIUM_TS_MAIN)
820                 goto out;
821
822         error = raydium_i2c_read(ts->client, ts->data_bank_addr,
823                                  ts->report_data, ts->pkg_size);
824         if (error)
825                 goto out;
826
827         fw_crc = get_unaligned_le16(&ts->report_data[ts->report_size]);
828         calc_crc = raydium_calc_chksum(ts->report_data, ts->report_size);
829         if (unlikely(fw_crc != calc_crc)) {
830                 dev_warn(&ts->client->dev,
831                          "%s: invalid packet crc %#04x vs %#04x\n",
832                          __func__, calc_crc, fw_crc);
833                 goto out;
834         }
835
836         raydium_mt_event(ts);
837
838 out:
839         return IRQ_HANDLED;
840 }
841
842 static ssize_t raydium_i2c_fw_ver_show(struct device *dev,
843                                        struct device_attribute *attr, char *buf)
844 {
845         struct i2c_client *client = to_i2c_client(dev);
846         struct raydium_data *ts = i2c_get_clientdata(client);
847
848         return sprintf(buf, "%d.%d\n", ts->info.main_ver, ts->info.sub_ver);
849 }
850
851 static ssize_t raydium_i2c_hw_ver_show(struct device *dev,
852                                        struct device_attribute *attr, char *buf)
853 {
854         struct i2c_client *client = to_i2c_client(dev);
855         struct raydium_data *ts = i2c_get_clientdata(client);
856
857         return sprintf(buf, "%#04x\n", le32_to_cpu(ts->info.hw_ver));
858 }
859
860 static ssize_t raydium_i2c_boot_mode_show(struct device *dev,
861                                           struct device_attribute *attr,
862                                           char *buf)
863 {
864         struct i2c_client *client = to_i2c_client(dev);
865         struct raydium_data *ts = i2c_get_clientdata(client);
866
867         return sprintf(buf, "%s\n",
868                        ts->boot_mode == RAYDIUM_TS_MAIN ?
869                                 "Normal" : "Recovery");
870 }
871
872 static ssize_t raydium_i2c_update_fw_store(struct device *dev,
873                                            struct device_attribute *attr,
874                                            const char *buf, size_t count)
875 {
876         struct i2c_client *client = to_i2c_client(dev);
877         struct raydium_data *ts = i2c_get_clientdata(client);
878         int error;
879
880         error = mutex_lock_interruptible(&ts->sysfs_mutex);
881         if (error)
882                 return error;
883
884         error = raydium_i2c_fw_update(ts);
885
886         mutex_unlock(&ts->sysfs_mutex);
887
888         return error ?: count;
889 }
890
891 static ssize_t raydium_i2c_calibrate_store(struct device *dev,
892                                            struct device_attribute *attr,
893                                            const char *buf, size_t count)
894 {
895         struct i2c_client *client = to_i2c_client(dev);
896         struct raydium_data *ts = i2c_get_clientdata(client);
897         static const u8 cal_cmd[] = { 0x00, 0x01, 0x9E };
898         int error;
899
900         error = mutex_lock_interruptible(&ts->sysfs_mutex);
901         if (error)
902                 return error;
903
904         error = raydium_i2c_write_object(client, cal_cmd, sizeof(cal_cmd),
905                                          RAYDIUM_WAIT_READY);
906         if (error)
907                 dev_err(&client->dev, "calibrate command failed: %d\n", error);
908
909         mutex_unlock(&ts->sysfs_mutex);
910         return error ?: count;
911 }
912
913 static DEVICE_ATTR(fw_version, S_IRUGO, raydium_i2c_fw_ver_show, NULL);
914 static DEVICE_ATTR(hw_version, S_IRUGO, raydium_i2c_hw_ver_show, NULL);
915 static DEVICE_ATTR(boot_mode, S_IRUGO, raydium_i2c_boot_mode_show, NULL);
916 static DEVICE_ATTR(update_fw, S_IWUSR, NULL, raydium_i2c_update_fw_store);
917 static DEVICE_ATTR(calibrate, S_IWUSR, NULL, raydium_i2c_calibrate_store);
918
919 static struct attribute *raydium_i2c_attributes[] = {
920         &dev_attr_update_fw.attr,
921         &dev_attr_boot_mode.attr,
922         &dev_attr_fw_version.attr,
923         &dev_attr_hw_version.attr,
924         &dev_attr_calibrate.attr,
925         NULL
926 };
927
928 static const struct attribute_group raydium_i2c_attribute_group = {
929         .attrs = raydium_i2c_attributes,
930 };
931
932 static int raydium_i2c_power_on(struct raydium_data *ts)
933 {
934         int error;
935
936         if (!ts->reset_gpio)
937                 return 0;
938
939         gpiod_set_value_cansleep(ts->reset_gpio, 1);
940
941         error = regulator_enable(ts->avdd);
942         if (error) {
943                 dev_err(&ts->client->dev,
944                         "failed to enable avdd regulator: %d\n", error);
945                 goto release_reset_gpio;
946         }
947
948         error = regulator_enable(ts->vccio);
949         if (error) {
950                 regulator_disable(ts->avdd);
951                 dev_err(&ts->client->dev,
952                         "failed to enable vccio regulator: %d\n", error);
953                 goto release_reset_gpio;
954         }
955
956         udelay(RM_POWERON_DELAY_USEC);
957
958 release_reset_gpio:
959         gpiod_set_value_cansleep(ts->reset_gpio, 0);
960
961         if (error)
962                 return error;
963
964         msleep(RM_RESET_DELAY_MSEC);
965
966         return 0;
967 }
968
969 static void raydium_i2c_power_off(void *_data)
970 {
971         struct raydium_data *ts = _data;
972
973         if (ts->reset_gpio) {
974                 gpiod_set_value_cansleep(ts->reset_gpio, 1);
975                 regulator_disable(ts->vccio);
976                 regulator_disable(ts->avdd);
977         }
978 }
979
980 static int raydium_i2c_probe(struct i2c_client *client,
981                              const struct i2c_device_id *id)
982 {
983         union i2c_smbus_data dummy;
984         struct raydium_data *ts;
985         int error;
986
987         if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
988                 dev_err(&client->dev,
989                         "i2c check functionality error (need I2C_FUNC_I2C)\n");
990                 return -ENXIO;
991         }
992
993         ts = devm_kzalloc(&client->dev, sizeof(*ts), GFP_KERNEL);
994         if (!ts)
995                 return -ENOMEM;
996
997         mutex_init(&ts->sysfs_mutex);
998
999         ts->client = client;
1000         i2c_set_clientdata(client, ts);
1001
1002         ts->avdd = devm_regulator_get(&client->dev, "avdd");
1003         if (IS_ERR(ts->avdd)) {
1004                 error = PTR_ERR(ts->avdd);
1005                 if (error != -EPROBE_DEFER)
1006                         dev_err(&client->dev,
1007                                 "Failed to get 'avdd' regulator: %d\n", error);
1008                 return error;
1009         }
1010
1011         ts->vccio = devm_regulator_get(&client->dev, "vccio");
1012         if (IS_ERR(ts->vccio)) {
1013                 error = PTR_ERR(ts->vccio);
1014                 if (error != -EPROBE_DEFER)
1015                         dev_err(&client->dev,
1016                                 "Failed to get 'vccio' regulator: %d\n", error);
1017                 return error;
1018         }
1019
1020         ts->reset_gpio = devm_gpiod_get_optional(&client->dev, "reset",
1021                                                  GPIOD_OUT_LOW);
1022         if (IS_ERR(ts->reset_gpio)) {
1023                 error = PTR_ERR(ts->reset_gpio);
1024                 if (error != -EPROBE_DEFER)
1025                         dev_err(&client->dev,
1026                                 "failed to get reset gpio: %d\n", error);
1027                 return error;
1028         }
1029
1030         error = raydium_i2c_power_on(ts);
1031         if (error)
1032                 return error;
1033
1034         error = devm_add_action(&client->dev, raydium_i2c_power_off, ts);
1035         if (error) {
1036                 dev_err(&client->dev,
1037                         "failed to install power off action: %d\n", error);
1038                 raydium_i2c_power_off(ts);
1039                 return error;
1040         }
1041
1042         /* Make sure there is something at this address */
1043         if (i2c_smbus_xfer(client->adapter, client->addr, 0,
1044                            I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &dummy) < 0) {
1045                 dev_err(&client->dev, "nothing at this address\n");
1046                 return -ENXIO;
1047         }
1048
1049         error = raydium_i2c_initialize(ts);
1050         if (error) {
1051                 dev_err(&client->dev, "failed to initialize: %d\n", error);
1052                 return error;
1053         }
1054
1055         ts->report_data = devm_kmalloc(&client->dev,
1056                                        ts->pkg_size, GFP_KERNEL);
1057         if (!ts->report_data)
1058                 return -ENOMEM;
1059
1060         ts->input = devm_input_allocate_device(&client->dev);
1061         if (!ts->input) {
1062                 dev_err(&client->dev, "Failed to allocate input device\n");
1063                 return -ENOMEM;
1064         }
1065
1066         ts->input->name = "Raydium Touchscreen";
1067         ts->input->id.bustype = BUS_I2C;
1068
1069         input_set_abs_params(ts->input, ABS_MT_POSITION_X,
1070                              0, le16_to_cpu(ts->info.x_max), 0, 0);
1071         input_set_abs_params(ts->input, ABS_MT_POSITION_Y,
1072                              0, le16_to_cpu(ts->info.y_max), 0, 0);
1073         input_abs_set_res(ts->input, ABS_MT_POSITION_X, ts->info.x_res);
1074         input_abs_set_res(ts->input, ABS_MT_POSITION_Y, ts->info.y_res);
1075
1076         input_set_abs_params(ts->input, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
1077         input_set_abs_params(ts->input, ABS_MT_PRESSURE, 0, 255, 0, 0);
1078
1079         error = input_mt_init_slots(ts->input, RM_MAX_TOUCH_NUM,
1080                                     INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
1081         if (error) {
1082                 dev_err(&client->dev,
1083                         "failed to initialize MT slots: %d\n", error);
1084                 return error;
1085         }
1086
1087         error = input_register_device(ts->input);
1088         if (error) {
1089                 dev_err(&client->dev,
1090                         "unable to register input device: %d\n", error);
1091                 return error;
1092         }
1093
1094         error = devm_request_threaded_irq(&client->dev, client->irq,
1095                                           NULL, raydium_i2c_irq,
1096                                           IRQF_ONESHOT, client->name, ts);
1097         if (error) {
1098                 dev_err(&client->dev, "Failed to register interrupt\n");
1099                 return error;
1100         }
1101
1102         error = devm_device_add_group(&client->dev,
1103                                    &raydium_i2c_attribute_group);
1104         if (error) {
1105                 dev_err(&client->dev, "failed to create sysfs attributes: %d\n",
1106                         error);
1107                 return error;
1108         }
1109
1110         return 0;
1111 }
1112
1113 static void __maybe_unused raydium_enter_sleep(struct i2c_client *client)
1114 {
1115         static const u8 sleep_cmd[] = { 0x5A, 0xff, 0x00, 0x0f };
1116         int error;
1117
1118         error = raydium_i2c_send(client, RM_CMD_ENTER_SLEEP,
1119                                  sleep_cmd, sizeof(sleep_cmd));
1120         if (error)
1121                 dev_err(&client->dev,
1122                         "sleep command failed: %d\n", error);
1123 }
1124
1125 static int __maybe_unused raydium_i2c_suspend(struct device *dev)
1126 {
1127         struct i2c_client *client = to_i2c_client(dev);
1128         struct raydium_data *ts = i2c_get_clientdata(client);
1129
1130         /* Sleep is not available in BLDR recovery mode */
1131         if (ts->boot_mode != RAYDIUM_TS_MAIN)
1132                 return -EBUSY;
1133
1134         disable_irq(client->irq);
1135
1136         if (device_may_wakeup(dev)) {
1137                 raydium_enter_sleep(client);
1138
1139                 ts->wake_irq_enabled = (enable_irq_wake(client->irq) == 0);
1140         } else {
1141                 raydium_i2c_power_off(ts);
1142         }
1143
1144         return 0;
1145 }
1146
1147 static int __maybe_unused raydium_i2c_resume(struct device *dev)
1148 {
1149         struct i2c_client *client = to_i2c_client(dev);
1150         struct raydium_data *ts = i2c_get_clientdata(client);
1151
1152         if (device_may_wakeup(dev)) {
1153                 if (ts->wake_irq_enabled)
1154                         disable_irq_wake(client->irq);
1155                 raydium_i2c_sw_reset(client);
1156         } else {
1157                 raydium_i2c_power_on(ts);
1158                 raydium_i2c_initialize(ts);
1159         }
1160
1161         enable_irq(client->irq);
1162
1163         return 0;
1164 }
1165
1166 static SIMPLE_DEV_PM_OPS(raydium_i2c_pm_ops,
1167                          raydium_i2c_suspend, raydium_i2c_resume);
1168
1169 static const struct i2c_device_id raydium_i2c_id[] = {
1170         { "raydium_i2c" , 0 },
1171         { "rm32380", 0 },
1172         { /* sentinel */ }
1173 };
1174 MODULE_DEVICE_TABLE(i2c, raydium_i2c_id);
1175
1176 #ifdef CONFIG_ACPI
1177 static const struct acpi_device_id raydium_acpi_id[] = {
1178         { "RAYD0001", 0 },
1179         { /* sentinel */ }
1180 };
1181 MODULE_DEVICE_TABLE(acpi, raydium_acpi_id);
1182 #endif
1183
1184 #ifdef CONFIG_OF
1185 static const struct of_device_id raydium_of_match[] = {
1186         { .compatible = "raydium,rm32380", },
1187         { /* sentinel */ }
1188 };
1189 MODULE_DEVICE_TABLE(of, raydium_of_match);
1190 #endif
1191
1192 static struct i2c_driver raydium_i2c_driver = {
1193         .probe = raydium_i2c_probe,
1194         .id_table = raydium_i2c_id,
1195         .driver = {
1196                 .name = "raydium_ts",
1197                 .pm = &raydium_i2c_pm_ops,
1198                 .acpi_match_table = ACPI_PTR(raydium_acpi_id),
1199                 .of_match_table = of_match_ptr(raydium_of_match),
1200         },
1201 };
1202 module_i2c_driver(raydium_i2c_driver);
1203
1204 MODULE_AUTHOR("Raydium");
1205 MODULE_DESCRIPTION("Raydium I2c Touchscreen driver");
1206 MODULE_LICENSE("GPL v2");