root/drivers/input/touchscreen/raydium_i2c_ts.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. raydium_i2c_send
  2. raydium_i2c_read
  3. raydium_i2c_read_message
  4. raydium_i2c_send_message
  5. raydium_i2c_sw_reset
  6. raydium_i2c_query_ts_info
  7. raydium_i2c_check_fw_status
  8. raydium_i2c_initialize
  9. raydium_i2c_bl_chk_state
  10. raydium_i2c_write_object
  11. raydium_i2c_boot_trigger
  12. raydium_i2c_fw_trigger
  13. raydium_i2c_check_path
  14. raydium_i2c_enter_bl
  15. raydium_i2c_leave_bl
  16. raydium_i2c_write_checksum
  17. raydium_i2c_disable_watch_dog
  18. raydium_i2c_fw_write_page
  19. raydium_calc_chksum
  20. raydium_i2c_do_update_firmware
  21. raydium_i2c_fw_update
  22. raydium_mt_event
  23. raydium_i2c_irq
  24. raydium_i2c_fw_ver_show
  25. raydium_i2c_hw_ver_show
  26. raydium_i2c_boot_mode_show
  27. raydium_i2c_update_fw_store
  28. raydium_i2c_calibrate_store
  29. raydium_i2c_power_on
  30. raydium_i2c_power_off
  31. raydium_i2c_probe
  32. raydium_enter_sleep
  33. raydium_i2c_suspend
  34. raydium_i2c_resume

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

/* [<][>][^][v][top][bottom][index][help] */