0001
0002
0003
0004
0005
0006 #include <linux/module.h>
0007 #include <linux/of.h>
0008 #include <linux/firmware.h>
0009 #include <linux/delay.h>
0010 #include <linux/gpio/consumer.h>
0011 #include <linux/i2c.h>
0012 #include <linux/acpi.h>
0013 #include <linux/interrupt.h>
0014 #include <linux/regmap.h>
0015 #include <linux/sysfs.h>
0016 #include <linux/input.h>
0017 #include <linux/input/mt.h>
0018 #include <linux/input/touchscreen.h>
0019 #include <linux/regulator/consumer.h>
0020 #include <asm/unaligned.h>
0021
0022 #define HIDEEP_TS_NAME "HiDeep Touchscreen"
0023 #define HIDEEP_I2C_NAME "hideep_ts"
0024
0025 #define HIDEEP_MT_MAX 10
0026 #define HIDEEP_KEY_MAX 3
0027
0028
0029 #define HIDEEP_MAX_EVENT 108UL
0030
0031 #define HIDEEP_TOUCH_EVENT_INDEX 2
0032 #define HIDEEP_KEY_EVENT_INDEX 102
0033
0034
0035 #define HIDEEP_EVENT_ADDR 0x240
0036
0037
0038 #define HIDEEP_RESET_CMD 0x9800
0039
0040
0041 #define HIDEEP_MT_RELEASED BIT(4)
0042 #define HIDEEP_KEY_PRESSED BIT(7)
0043 #define HIDEEP_KEY_FIRST_PRESSED BIT(8)
0044 #define HIDEEP_KEY_PRESSED_MASK (HIDEEP_KEY_PRESSED | \
0045 HIDEEP_KEY_FIRST_PRESSED)
0046
0047 #define HIDEEP_KEY_IDX_MASK 0x0f
0048
0049
0050 #define HIDEEP_YRAM_BASE 0x40000000
0051 #define HIDEEP_PERIPHERAL_BASE 0x50000000
0052 #define HIDEEP_ESI_BASE (HIDEEP_PERIPHERAL_BASE + 0x00000000)
0053 #define HIDEEP_FLASH_BASE (HIDEEP_PERIPHERAL_BASE + 0x01000000)
0054 #define HIDEEP_SYSCON_BASE (HIDEEP_PERIPHERAL_BASE + 0x02000000)
0055
0056 #define HIDEEP_SYSCON_MOD_CON (HIDEEP_SYSCON_BASE + 0x0000)
0057 #define HIDEEP_SYSCON_SPC_CON (HIDEEP_SYSCON_BASE + 0x0004)
0058 #define HIDEEP_SYSCON_CLK_CON (HIDEEP_SYSCON_BASE + 0x0008)
0059 #define HIDEEP_SYSCON_CLK_ENA (HIDEEP_SYSCON_BASE + 0x000C)
0060 #define HIDEEP_SYSCON_RST_CON (HIDEEP_SYSCON_BASE + 0x0010)
0061 #define HIDEEP_SYSCON_WDT_CON (HIDEEP_SYSCON_BASE + 0x0014)
0062 #define HIDEEP_SYSCON_WDT_CNT (HIDEEP_SYSCON_BASE + 0x0018)
0063 #define HIDEEP_SYSCON_PWR_CON (HIDEEP_SYSCON_BASE + 0x0020)
0064 #define HIDEEP_SYSCON_PGM_ID (HIDEEP_SYSCON_BASE + 0x00F4)
0065
0066 #define HIDEEP_FLASH_CON (HIDEEP_FLASH_BASE + 0x0000)
0067 #define HIDEEP_FLASH_STA (HIDEEP_FLASH_BASE + 0x0004)
0068 #define HIDEEP_FLASH_CFG (HIDEEP_FLASH_BASE + 0x0008)
0069 #define HIDEEP_FLASH_TIM (HIDEEP_FLASH_BASE + 0x000C)
0070 #define HIDEEP_FLASH_CACHE_CFG (HIDEEP_FLASH_BASE + 0x0010)
0071 #define HIDEEP_FLASH_PIO_SIG (HIDEEP_FLASH_BASE + 0x400000)
0072
0073 #define HIDEEP_ESI_TX_INVALID (HIDEEP_ESI_BASE + 0x0008)
0074
0075 #define HIDEEP_PERASE 0x00040000
0076 #define HIDEEP_WRONLY 0x00100000
0077
0078 #define HIDEEP_NVM_MASK_OFS 0x0000000C
0079 #define HIDEEP_NVM_DEFAULT_PAGE 0
0080 #define HIDEEP_NVM_SFR_WPAGE 1
0081 #define HIDEEP_NVM_SFR_RPAGE 2
0082
0083 #define HIDEEP_PIO_SIG 0x00400000
0084 #define HIDEEP_PROT_MODE 0x03400000
0085
0086 #define HIDEEP_NVM_PAGE_SIZE 128
0087
0088 #define HIDEEP_DWZ_INFO 0x000002C0
0089
0090 struct hideep_event {
0091 __le16 x;
0092 __le16 y;
0093 __le16 z;
0094 u8 w;
0095 u8 flag;
0096 u8 type;
0097 u8 index;
0098 };
0099
0100 struct dwz_info {
0101 __be32 code_start;
0102 u8 code_crc[12];
0103
0104 __be32 c_code_start;
0105 __be16 gen_ver;
0106 __be16 c_code_len;
0107
0108 __be32 vr_start;
0109 __be16 rsv0;
0110 __be16 vr_len;
0111
0112 __be32 ft_start;
0113 __be16 vr_version;
0114 __be16 ft_len;
0115
0116 __be16 core_ver;
0117 __be16 boot_ver;
0118
0119 __be16 release_ver;
0120 __be16 custom_ver;
0121
0122 u8 factory_id;
0123 u8 panel_type;
0124 u8 model_name[6];
0125
0126 __be16 extra_option;
0127 __be16 product_code;
0128
0129 __be16 vendor_id;
0130 __be16 product_id;
0131 };
0132
0133 struct pgm_packet {
0134 struct {
0135 u8 unused[3];
0136 u8 len;
0137 __be32 addr;
0138 } header;
0139 __be32 payload[HIDEEP_NVM_PAGE_SIZE / sizeof(__be32)];
0140 };
0141
0142 #define HIDEEP_XFER_BUF_SIZE sizeof(struct pgm_packet)
0143
0144 struct hideep_ts {
0145 struct i2c_client *client;
0146 struct input_dev *input_dev;
0147 struct regmap *reg;
0148
0149 struct touchscreen_properties prop;
0150
0151 struct gpio_desc *reset_gpio;
0152
0153 struct regulator *vcc_vdd;
0154 struct regulator *vcc_vid;
0155
0156 struct mutex dev_mutex;
0157
0158 u32 tch_count;
0159 u32 lpm_count;
0160
0161
0162
0163
0164
0165
0166
0167 u8 xfer_buf[HIDEEP_XFER_BUF_SIZE] __aligned(4);
0168
0169 int key_num;
0170 u32 key_codes[HIDEEP_KEY_MAX];
0171
0172 struct dwz_info dwz_info;
0173
0174 unsigned int fw_size;
0175 u32 nvm_mask;
0176 };
0177
0178 static int hideep_pgm_w_mem(struct hideep_ts *ts, u32 addr,
0179 const __be32 *data, size_t count)
0180 {
0181 struct pgm_packet *packet = (void *)ts->xfer_buf;
0182 size_t len = count * sizeof(*data);
0183 struct i2c_msg msg = {
0184 .addr = ts->client->addr,
0185 .len = len + sizeof(packet->header.len) +
0186 sizeof(packet->header.addr),
0187 .buf = &packet->header.len,
0188 };
0189 int ret;
0190
0191 if (len > HIDEEP_NVM_PAGE_SIZE)
0192 return -EINVAL;
0193
0194 packet->header.len = 0x80 | (count - 1);
0195 packet->header.addr = cpu_to_be32(addr);
0196 memcpy(packet->payload, data, len);
0197
0198 ret = i2c_transfer(ts->client->adapter, &msg, 1);
0199 if (ret != 1)
0200 return ret < 0 ? ret : -EIO;
0201
0202 return 0;
0203 }
0204
0205 static int hideep_pgm_r_mem(struct hideep_ts *ts, u32 addr,
0206 __be32 *data, size_t count)
0207 {
0208 struct pgm_packet *packet = (void *)ts->xfer_buf;
0209 size_t len = count * sizeof(*data);
0210 struct i2c_msg msg[] = {
0211 {
0212 .addr = ts->client->addr,
0213 .len = sizeof(packet->header.len) +
0214 sizeof(packet->header.addr),
0215 .buf = &packet->header.len,
0216 },
0217 {
0218 .addr = ts->client->addr,
0219 .flags = I2C_M_RD,
0220 .len = len,
0221 .buf = (u8 *)data,
0222 },
0223 };
0224 int ret;
0225
0226 if (len > HIDEEP_NVM_PAGE_SIZE)
0227 return -EINVAL;
0228
0229 packet->header.len = count - 1;
0230 packet->header.addr = cpu_to_be32(addr);
0231
0232 ret = i2c_transfer(ts->client->adapter, msg, ARRAY_SIZE(msg));
0233 if (ret != ARRAY_SIZE(msg))
0234 return ret < 0 ? ret : -EIO;
0235
0236 return 0;
0237 }
0238
0239 static int hideep_pgm_r_reg(struct hideep_ts *ts, u32 addr, u32 *val)
0240 {
0241 __be32 data;
0242 int error;
0243
0244 error = hideep_pgm_r_mem(ts, addr, &data, 1);
0245 if (error) {
0246 dev_err(&ts->client->dev,
0247 "read of register %#08x failed: %d\n",
0248 addr, error);
0249 return error;
0250 }
0251
0252 *val = be32_to_cpu(data);
0253 return 0;
0254 }
0255
0256 static int hideep_pgm_w_reg(struct hideep_ts *ts, u32 addr, u32 val)
0257 {
0258 __be32 data = cpu_to_be32(val);
0259 int error;
0260
0261 error = hideep_pgm_w_mem(ts, addr, &data, 1);
0262 if (error) {
0263 dev_err(&ts->client->dev,
0264 "write to register %#08x (%#08x) failed: %d\n",
0265 addr, val, error);
0266 return error;
0267 }
0268
0269 return 0;
0270 }
0271
0272 #define SW_RESET_IN_PGM(clk) \
0273 { \
0274 hideep_pgm_w_reg(ts, HIDEEP_SYSCON_WDT_CNT, (clk)); \
0275 hideep_pgm_w_reg(ts, HIDEEP_SYSCON_WDT_CON, 0x03); \
0276 hideep_pgm_w_reg(ts, HIDEEP_SYSCON_WDT_CON, 0x01); \
0277 }
0278
0279 #define SET_FLASH_PIO(ce) \
0280 hideep_pgm_w_reg(ts, HIDEEP_FLASH_CON, \
0281 0x01 | ((ce) << 1))
0282
0283 #define SET_PIO_SIG(x, y) \
0284 hideep_pgm_w_reg(ts, HIDEEP_FLASH_PIO_SIG + (x), (y))
0285
0286 #define SET_FLASH_HWCONTROL() \
0287 hideep_pgm_w_reg(ts, HIDEEP_FLASH_CON, 0x00)
0288
0289 #define NVM_W_SFR(x, y) \
0290 { \
0291 SET_FLASH_PIO(1); \
0292 SET_PIO_SIG(x, y); \
0293 SET_FLASH_PIO(0); \
0294 }
0295
0296 static void hideep_pgm_set(struct hideep_ts *ts)
0297 {
0298 hideep_pgm_w_reg(ts, HIDEEP_SYSCON_WDT_CON, 0x00);
0299 hideep_pgm_w_reg(ts, HIDEEP_SYSCON_SPC_CON, 0x00);
0300 hideep_pgm_w_reg(ts, HIDEEP_SYSCON_CLK_ENA, 0xFF);
0301 hideep_pgm_w_reg(ts, HIDEEP_SYSCON_CLK_CON, 0x01);
0302 hideep_pgm_w_reg(ts, HIDEEP_SYSCON_PWR_CON, 0x01);
0303 hideep_pgm_w_reg(ts, HIDEEP_FLASH_TIM, 0x03);
0304 hideep_pgm_w_reg(ts, HIDEEP_FLASH_CACHE_CFG, 0x00);
0305 }
0306
0307 static int hideep_pgm_get_pattern(struct hideep_ts *ts, u32 *pattern)
0308 {
0309 u16 p1 = 0xAF39;
0310 u16 p2 = 0xDF9D;
0311 int error;
0312
0313 error = regmap_bulk_write(ts->reg, p1, &p2, 1);
0314 if (error) {
0315 dev_err(&ts->client->dev,
0316 "%s: regmap_bulk_write() failed with %d\n",
0317 __func__, error);
0318 return error;
0319 }
0320
0321 usleep_range(1000, 1100);
0322
0323
0324 error = hideep_pgm_w_reg(ts, HIDEEP_ESI_TX_INVALID, 0x01);
0325 if (error)
0326 return error;
0327
0328 error = hideep_pgm_r_reg(ts, HIDEEP_SYSCON_PGM_ID, pattern);
0329 if (error)
0330 return error;
0331
0332 return 0;
0333 }
0334
0335 static int hideep_enter_pgm(struct hideep_ts *ts)
0336 {
0337 int retry_count = 10;
0338 u32 pattern;
0339 int error;
0340
0341 while (retry_count--) {
0342 error = hideep_pgm_get_pattern(ts, &pattern);
0343 if (error) {
0344 dev_err(&ts->client->dev,
0345 "hideep_pgm_get_pattern failed: %d\n", error);
0346 } else if (pattern != 0x39AF9DDF) {
0347 dev_err(&ts->client->dev, "%s: bad pattern: %#08x\n",
0348 __func__, pattern);
0349 } else {
0350 dev_dbg(&ts->client->dev, "found magic code");
0351
0352 hideep_pgm_set(ts);
0353 usleep_range(1000, 1100);
0354
0355 return 0;
0356 }
0357 }
0358
0359 dev_err(&ts->client->dev, "failed to enter pgm mode\n");
0360 SW_RESET_IN_PGM(1000);
0361 return -EIO;
0362 }
0363
0364 static int hideep_nvm_unlock(struct hideep_ts *ts)
0365 {
0366 u32 unmask_code;
0367 int error;
0368
0369 hideep_pgm_w_reg(ts, HIDEEP_FLASH_CFG, HIDEEP_NVM_SFR_RPAGE);
0370 error = hideep_pgm_r_reg(ts, 0x0000000C, &unmask_code);
0371 hideep_pgm_w_reg(ts, HIDEEP_FLASH_CFG, HIDEEP_NVM_DEFAULT_PAGE);
0372 if (error)
0373 return error;
0374
0375
0376 unmask_code &= ~HIDEEP_PROT_MODE;
0377
0378
0379 if (unmask_code != ts->nvm_mask)
0380 dev_warn(&ts->client->dev,
0381 "read mask code different %#08x vs %#08x",
0382 unmask_code, ts->nvm_mask);
0383
0384 hideep_pgm_w_reg(ts, HIDEEP_FLASH_CFG, HIDEEP_NVM_SFR_WPAGE);
0385 SET_FLASH_PIO(0);
0386
0387 NVM_W_SFR(HIDEEP_NVM_MASK_OFS, ts->nvm_mask);
0388 SET_FLASH_HWCONTROL();
0389 hideep_pgm_w_reg(ts, HIDEEP_FLASH_CFG, HIDEEP_NVM_DEFAULT_PAGE);
0390
0391 return 0;
0392 }
0393
0394 static int hideep_check_status(struct hideep_ts *ts)
0395 {
0396 int time_out = 100;
0397 int status;
0398 int error;
0399
0400 while (time_out--) {
0401 error = hideep_pgm_r_reg(ts, HIDEEP_FLASH_STA, &status);
0402 if (!error && status)
0403 return 0;
0404
0405 usleep_range(1000, 1100);
0406 }
0407
0408 return -ETIMEDOUT;
0409 }
0410
0411 static int hideep_program_page(struct hideep_ts *ts, u32 addr,
0412 const __be32 *ucode, size_t xfer_count)
0413 {
0414 u32 val;
0415 int error;
0416
0417 error = hideep_check_status(ts);
0418 if (error)
0419 return -EBUSY;
0420
0421 addr &= ~(HIDEEP_NVM_PAGE_SIZE - 1);
0422
0423 SET_FLASH_PIO(0);
0424 SET_FLASH_PIO(1);
0425
0426
0427 SET_PIO_SIG(HIDEEP_PERASE | addr, 0xFFFFFFFF);
0428
0429 SET_FLASH_PIO(0);
0430
0431 error = hideep_check_status(ts);
0432 if (error)
0433 return -EBUSY;
0434
0435
0436 SET_FLASH_PIO(1);
0437
0438 val = be32_to_cpu(ucode[0]);
0439 SET_PIO_SIG(HIDEEP_WRONLY | addr, val);
0440
0441 hideep_pgm_w_mem(ts, HIDEEP_FLASH_PIO_SIG | HIDEEP_WRONLY,
0442 ucode, xfer_count);
0443
0444 val = be32_to_cpu(ucode[xfer_count - 1]);
0445 SET_PIO_SIG(124, val);
0446
0447 SET_FLASH_PIO(0);
0448
0449 usleep_range(1000, 1100);
0450
0451 error = hideep_check_status(ts);
0452 if (error)
0453 return -EBUSY;
0454
0455 SET_FLASH_HWCONTROL();
0456
0457 return 0;
0458 }
0459
0460 static int hideep_program_nvm(struct hideep_ts *ts,
0461 const __be32 *ucode, size_t ucode_len)
0462 {
0463 struct pgm_packet *packet_r = (void *)ts->xfer_buf;
0464 __be32 *current_ucode = packet_r->payload;
0465 size_t xfer_len;
0466 size_t xfer_count;
0467 u32 addr = 0;
0468 int error;
0469
0470 error = hideep_nvm_unlock(ts);
0471 if (error)
0472 return error;
0473
0474 while (ucode_len > 0) {
0475 xfer_len = min_t(size_t, ucode_len, HIDEEP_NVM_PAGE_SIZE);
0476 xfer_count = xfer_len / sizeof(*ucode);
0477
0478 error = hideep_pgm_r_mem(ts, 0x00000000 + addr,
0479 current_ucode, xfer_count);
0480 if (error) {
0481 dev_err(&ts->client->dev,
0482 "%s: failed to read page at offset %#08x: %d\n",
0483 __func__, addr, error);
0484 return error;
0485 }
0486
0487
0488 if (memcmp(ucode, current_ucode, xfer_len)) {
0489 error = hideep_program_page(ts, addr,
0490 ucode, xfer_count);
0491 if (error) {
0492 dev_err(&ts->client->dev,
0493 "%s: iwrite failure @%#08x: %d\n",
0494 __func__, addr, error);
0495 return error;
0496 }
0497
0498 usleep_range(1000, 1100);
0499 }
0500
0501 ucode += xfer_count;
0502 addr += xfer_len;
0503 ucode_len -= xfer_len;
0504 }
0505
0506 return 0;
0507 }
0508
0509 static int hideep_verify_nvm(struct hideep_ts *ts,
0510 const __be32 *ucode, size_t ucode_len)
0511 {
0512 struct pgm_packet *packet_r = (void *)ts->xfer_buf;
0513 __be32 *current_ucode = packet_r->payload;
0514 size_t xfer_len;
0515 size_t xfer_count;
0516 u32 addr = 0;
0517 int i;
0518 int error;
0519
0520 while (ucode_len > 0) {
0521 xfer_len = min_t(size_t, ucode_len, HIDEEP_NVM_PAGE_SIZE);
0522 xfer_count = xfer_len / sizeof(*ucode);
0523
0524 error = hideep_pgm_r_mem(ts, 0x00000000 + addr,
0525 current_ucode, xfer_count);
0526 if (error) {
0527 dev_err(&ts->client->dev,
0528 "%s: failed to read page at offset %#08x: %d\n",
0529 __func__, addr, error);
0530 return error;
0531 }
0532
0533 if (memcmp(ucode, current_ucode, xfer_len)) {
0534 const u8 *ucode_bytes = (const u8 *)ucode;
0535 const u8 *current_bytes = (const u8 *)current_ucode;
0536
0537 for (i = 0; i < xfer_len; i++)
0538 if (ucode_bytes[i] != current_bytes[i])
0539 dev_err(&ts->client->dev,
0540 "%s: mismatch @%#08x: (%#02x vs %#02x)\n",
0541 __func__, addr + i,
0542 ucode_bytes[i],
0543 current_bytes[i]);
0544
0545 return -EIO;
0546 }
0547
0548 ucode += xfer_count;
0549 addr += xfer_len;
0550 ucode_len -= xfer_len;
0551 }
0552
0553 return 0;
0554 }
0555
0556 static int hideep_load_dwz(struct hideep_ts *ts)
0557 {
0558 u16 product_code;
0559 int error;
0560
0561 error = hideep_enter_pgm(ts);
0562 if (error)
0563 return error;
0564
0565 msleep(50);
0566
0567 error = hideep_pgm_r_mem(ts, HIDEEP_DWZ_INFO,
0568 (void *)&ts->dwz_info,
0569 sizeof(ts->dwz_info) / sizeof(__be32));
0570
0571 SW_RESET_IN_PGM(10);
0572 msleep(50);
0573
0574 if (error) {
0575 dev_err(&ts->client->dev,
0576 "failed to fetch DWZ data: %d\n", error);
0577 return error;
0578 }
0579
0580 product_code = be16_to_cpu(ts->dwz_info.product_code);
0581
0582 switch (product_code & 0xF0) {
0583 case 0x40:
0584 dev_dbg(&ts->client->dev, "used crimson IC");
0585 ts->fw_size = 1024 * 48;
0586 ts->nvm_mask = 0x00310000;
0587 break;
0588 case 0x60:
0589 dev_dbg(&ts->client->dev, "used lime IC");
0590 ts->fw_size = 1024 * 64;
0591 ts->nvm_mask = 0x0030027B;
0592 break;
0593 default:
0594 dev_err(&ts->client->dev, "product code is wrong: %#04x",
0595 product_code);
0596 return -EINVAL;
0597 }
0598
0599 dev_dbg(&ts->client->dev, "firmware release version: %#04x",
0600 be16_to_cpu(ts->dwz_info.release_ver));
0601
0602 return 0;
0603 }
0604
0605 static int hideep_flash_firmware(struct hideep_ts *ts,
0606 const __be32 *ucode, size_t ucode_len)
0607 {
0608 int retry_cnt = 3;
0609 int error;
0610
0611 while (retry_cnt--) {
0612 error = hideep_program_nvm(ts, ucode, ucode_len);
0613 if (!error) {
0614 error = hideep_verify_nvm(ts, ucode, ucode_len);
0615 if (!error)
0616 return 0;
0617 }
0618 }
0619
0620 return error;
0621 }
0622
0623 static int hideep_update_firmware(struct hideep_ts *ts,
0624 const __be32 *ucode, size_t ucode_len)
0625 {
0626 int error, error2;
0627
0628 dev_dbg(&ts->client->dev, "starting firmware update");
0629
0630
0631 error = hideep_enter_pgm(ts);
0632 if (error)
0633 return error;
0634
0635 error = hideep_flash_firmware(ts, ucode, ucode_len);
0636 if (error)
0637 dev_err(&ts->client->dev,
0638 "firmware update failed: %d\n", error);
0639 else
0640 dev_dbg(&ts->client->dev, "firmware updated successfully\n");
0641
0642 SW_RESET_IN_PGM(1000);
0643
0644 error2 = hideep_load_dwz(ts);
0645 if (error2)
0646 dev_err(&ts->client->dev,
0647 "failed to load dwz after firmware update: %d\n",
0648 error2);
0649
0650 return error ?: error2;
0651 }
0652
0653 static int hideep_power_on(struct hideep_ts *ts)
0654 {
0655 int error = 0;
0656
0657 error = regulator_enable(ts->vcc_vdd);
0658 if (error)
0659 dev_err(&ts->client->dev,
0660 "failed to enable 'vdd' regulator: %d", error);
0661
0662 usleep_range(999, 1000);
0663
0664 error = regulator_enable(ts->vcc_vid);
0665 if (error)
0666 dev_err(&ts->client->dev,
0667 "failed to enable 'vcc_vid' regulator: %d",
0668 error);
0669
0670 msleep(30);
0671
0672 if (ts->reset_gpio) {
0673 gpiod_set_value_cansleep(ts->reset_gpio, 0);
0674 } else {
0675 error = regmap_write(ts->reg, HIDEEP_RESET_CMD, 0x01);
0676 if (error)
0677 dev_err(&ts->client->dev,
0678 "failed to send 'reset' command: %d\n", error);
0679 }
0680
0681 msleep(50);
0682
0683 return error;
0684 }
0685
0686 static void hideep_power_off(void *data)
0687 {
0688 struct hideep_ts *ts = data;
0689
0690 if (ts->reset_gpio)
0691 gpiod_set_value(ts->reset_gpio, 1);
0692
0693 regulator_disable(ts->vcc_vid);
0694 regulator_disable(ts->vcc_vdd);
0695 }
0696
0697 #define __GET_MT_TOOL_TYPE(type) ((type) == 0x01 ? MT_TOOL_FINGER : MT_TOOL_PEN)
0698
0699 static void hideep_report_slot(struct input_dev *input,
0700 const struct hideep_event *event)
0701 {
0702 input_mt_slot(input, event->index & 0x0f);
0703 input_mt_report_slot_state(input,
0704 __GET_MT_TOOL_TYPE(event->type),
0705 !(event->flag & HIDEEP_MT_RELEASED));
0706 if (!(event->flag & HIDEEP_MT_RELEASED)) {
0707 input_report_abs(input, ABS_MT_POSITION_X,
0708 le16_to_cpup(&event->x));
0709 input_report_abs(input, ABS_MT_POSITION_Y,
0710 le16_to_cpup(&event->y));
0711 input_report_abs(input, ABS_MT_PRESSURE,
0712 le16_to_cpup(&event->z));
0713 input_report_abs(input, ABS_MT_TOUCH_MAJOR, event->w);
0714 }
0715 }
0716
0717 static void hideep_parse_and_report(struct hideep_ts *ts)
0718 {
0719 const struct hideep_event *events =
0720 (void *)&ts->xfer_buf[HIDEEP_TOUCH_EVENT_INDEX];
0721 const u8 *keys = &ts->xfer_buf[HIDEEP_KEY_EVENT_INDEX];
0722 int touch_count = ts->xfer_buf[0];
0723 int key_count = ts->xfer_buf[1] & 0x0f;
0724 int lpm_count = ts->xfer_buf[1] & 0xf0;
0725 int i;
0726
0727
0728 dev_dbg(&ts->client->dev, "mt = %d, key = %d, lpm = %02x",
0729 touch_count, key_count, lpm_count);
0730
0731 touch_count = min(touch_count, HIDEEP_MT_MAX);
0732 for (i = 0; i < touch_count; i++)
0733 hideep_report_slot(ts->input_dev, events + i);
0734
0735 key_count = min(key_count, HIDEEP_KEY_MAX);
0736 for (i = 0; i < key_count; i++) {
0737 u8 key_data = keys[i * 2];
0738
0739 input_report_key(ts->input_dev,
0740 ts->key_codes[key_data & HIDEEP_KEY_IDX_MASK],
0741 key_data & HIDEEP_KEY_PRESSED_MASK);
0742 }
0743
0744 input_mt_sync_frame(ts->input_dev);
0745 input_sync(ts->input_dev);
0746 }
0747
0748 static irqreturn_t hideep_irq(int irq, void *handle)
0749 {
0750 struct hideep_ts *ts = handle;
0751 int error;
0752
0753 BUILD_BUG_ON(HIDEEP_MAX_EVENT > HIDEEP_XFER_BUF_SIZE);
0754
0755 error = regmap_bulk_read(ts->reg, HIDEEP_EVENT_ADDR,
0756 ts->xfer_buf, HIDEEP_MAX_EVENT / 2);
0757 if (error) {
0758 dev_err(&ts->client->dev, "failed to read events: %d\n", error);
0759 goto out;
0760 }
0761
0762 hideep_parse_and_report(ts);
0763
0764 out:
0765 return IRQ_HANDLED;
0766 }
0767
0768 static int hideep_get_axis_info(struct hideep_ts *ts)
0769 {
0770 __le16 val[2];
0771 int error;
0772
0773 error = regmap_bulk_read(ts->reg, 0x28, val, ARRAY_SIZE(val));
0774 if (error)
0775 return error;
0776
0777 ts->prop.max_x = le16_to_cpup(val);
0778 ts->prop.max_y = le16_to_cpup(val + 1);
0779
0780 dev_dbg(&ts->client->dev, "X: %d, Y: %d",
0781 ts->prop.max_x, ts->prop.max_y);
0782
0783 return 0;
0784 }
0785
0786 static int hideep_init_input(struct hideep_ts *ts)
0787 {
0788 struct device *dev = &ts->client->dev;
0789 int i;
0790 int error;
0791
0792 ts->input_dev = devm_input_allocate_device(dev);
0793 if (!ts->input_dev) {
0794 dev_err(dev, "failed to allocate input device\n");
0795 return -ENOMEM;
0796 }
0797
0798 ts->input_dev->name = HIDEEP_TS_NAME;
0799 ts->input_dev->id.bustype = BUS_I2C;
0800 input_set_drvdata(ts->input_dev, ts);
0801
0802 input_set_capability(ts->input_dev, EV_ABS, ABS_MT_POSITION_X);
0803 input_set_capability(ts->input_dev, EV_ABS, ABS_MT_POSITION_Y);
0804 input_set_abs_params(ts->input_dev, ABS_MT_PRESSURE, 0, 65535, 0, 0);
0805 input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
0806 input_set_abs_params(ts->input_dev, ABS_MT_TOOL_TYPE,
0807 0, MT_TOOL_MAX, 0, 0);
0808 touchscreen_parse_properties(ts->input_dev, true, &ts->prop);
0809
0810 if (ts->prop.max_x == 0 || ts->prop.max_y == 0) {
0811 error = hideep_get_axis_info(ts);
0812 if (error)
0813 return error;
0814 }
0815
0816 error = input_mt_init_slots(ts->input_dev, HIDEEP_MT_MAX,
0817 INPUT_MT_DIRECT);
0818 if (error)
0819 return error;
0820
0821 ts->key_num = device_property_count_u32(dev, "linux,keycodes");
0822 if (ts->key_num > HIDEEP_KEY_MAX) {
0823 dev_err(dev, "too many keys defined: %d\n",
0824 ts->key_num);
0825 return -EINVAL;
0826 }
0827
0828 if (ts->key_num <= 0) {
0829 dev_dbg(dev,
0830 "missing or malformed 'linux,keycodes' property\n");
0831 } else {
0832 error = device_property_read_u32_array(dev, "linux,keycodes",
0833 ts->key_codes,
0834 ts->key_num);
0835 if (error) {
0836 dev_dbg(dev, "failed to read keymap: %d", error);
0837 return error;
0838 }
0839
0840 if (ts->key_num) {
0841 ts->input_dev->keycode = ts->key_codes;
0842 ts->input_dev->keycodesize = sizeof(ts->key_codes[0]);
0843 ts->input_dev->keycodemax = ts->key_num;
0844
0845 for (i = 0; i < ts->key_num; i++)
0846 input_set_capability(ts->input_dev, EV_KEY,
0847 ts->key_codes[i]);
0848 }
0849 }
0850
0851 error = input_register_device(ts->input_dev);
0852 if (error) {
0853 dev_err(dev, "failed to register input device: %d", error);
0854 return error;
0855 }
0856
0857 return 0;
0858 }
0859
0860 static ssize_t hideep_update_fw(struct device *dev,
0861 struct device_attribute *attr,
0862 const char *buf, size_t count)
0863 {
0864 struct i2c_client *client = to_i2c_client(dev);
0865 struct hideep_ts *ts = i2c_get_clientdata(client);
0866 const struct firmware *fw_entry;
0867 char *fw_name;
0868 int mode;
0869 int error;
0870
0871 error = kstrtoint(buf, 0, &mode);
0872 if (error)
0873 return error;
0874
0875 fw_name = kasprintf(GFP_KERNEL, "hideep_ts_%04x.bin",
0876 be16_to_cpu(ts->dwz_info.product_id));
0877 if (!fw_name)
0878 return -ENOMEM;
0879
0880 error = request_firmware(&fw_entry, fw_name, dev);
0881 if (error) {
0882 dev_err(dev, "failed to request firmware %s: %d",
0883 fw_name, error);
0884 goto out_free_fw_name;
0885 }
0886
0887 if (fw_entry->size % sizeof(__be32)) {
0888 dev_err(dev, "invalid firmware size %zu\n", fw_entry->size);
0889 error = -EINVAL;
0890 goto out_release_fw;
0891 }
0892
0893 if (fw_entry->size > ts->fw_size) {
0894 dev_err(dev, "fw size (%zu) is too big (memory size %d)\n",
0895 fw_entry->size, ts->fw_size);
0896 error = -EFBIG;
0897 goto out_release_fw;
0898 }
0899
0900 mutex_lock(&ts->dev_mutex);
0901 disable_irq(client->irq);
0902
0903 error = hideep_update_firmware(ts, (const __be32 *)fw_entry->data,
0904 fw_entry->size);
0905
0906 enable_irq(client->irq);
0907 mutex_unlock(&ts->dev_mutex);
0908
0909 out_release_fw:
0910 release_firmware(fw_entry);
0911 out_free_fw_name:
0912 kfree(fw_name);
0913
0914 return error ?: count;
0915 }
0916
0917 static ssize_t hideep_fw_version_show(struct device *dev,
0918 struct device_attribute *attr, char *buf)
0919 {
0920 struct i2c_client *client = to_i2c_client(dev);
0921 struct hideep_ts *ts = i2c_get_clientdata(client);
0922 ssize_t len;
0923
0924 mutex_lock(&ts->dev_mutex);
0925 len = scnprintf(buf, PAGE_SIZE, "%04x\n",
0926 be16_to_cpu(ts->dwz_info.release_ver));
0927 mutex_unlock(&ts->dev_mutex);
0928
0929 return len;
0930 }
0931
0932 static ssize_t hideep_product_id_show(struct device *dev,
0933 struct device_attribute *attr, char *buf)
0934 {
0935 struct i2c_client *client = to_i2c_client(dev);
0936 struct hideep_ts *ts = i2c_get_clientdata(client);
0937 ssize_t len;
0938
0939 mutex_lock(&ts->dev_mutex);
0940 len = scnprintf(buf, PAGE_SIZE, "%04x\n",
0941 be16_to_cpu(ts->dwz_info.product_id));
0942 mutex_unlock(&ts->dev_mutex);
0943
0944 return len;
0945 }
0946
0947 static DEVICE_ATTR(version, 0664, hideep_fw_version_show, NULL);
0948 static DEVICE_ATTR(product_id, 0664, hideep_product_id_show, NULL);
0949 static DEVICE_ATTR(update_fw, 0664, NULL, hideep_update_fw);
0950
0951 static struct attribute *hideep_ts_sysfs_entries[] = {
0952 &dev_attr_version.attr,
0953 &dev_attr_product_id.attr,
0954 &dev_attr_update_fw.attr,
0955 NULL,
0956 };
0957
0958 static const struct attribute_group hideep_ts_attr_group = {
0959 .attrs = hideep_ts_sysfs_entries,
0960 };
0961
0962 static int __maybe_unused hideep_suspend(struct device *dev)
0963 {
0964 struct i2c_client *client = to_i2c_client(dev);
0965 struct hideep_ts *ts = i2c_get_clientdata(client);
0966
0967 disable_irq(client->irq);
0968 hideep_power_off(ts);
0969
0970 return 0;
0971 }
0972
0973 static int __maybe_unused hideep_resume(struct device *dev)
0974 {
0975 struct i2c_client *client = to_i2c_client(dev);
0976 struct hideep_ts *ts = i2c_get_clientdata(client);
0977 int error;
0978
0979 error = hideep_power_on(ts);
0980 if (error) {
0981 dev_err(&client->dev, "power on failed");
0982 return error;
0983 }
0984
0985 enable_irq(client->irq);
0986
0987 return 0;
0988 }
0989
0990 static SIMPLE_DEV_PM_OPS(hideep_pm_ops, hideep_suspend, hideep_resume);
0991
0992 static const struct regmap_config hideep_regmap_config = {
0993 .reg_bits = 16,
0994 .reg_format_endian = REGMAP_ENDIAN_LITTLE,
0995 .val_bits = 16,
0996 .val_format_endian = REGMAP_ENDIAN_LITTLE,
0997 .max_register = 0xffff,
0998 };
0999
1000 static int hideep_probe(struct i2c_client *client,
1001 const struct i2c_device_id *id)
1002 {
1003 struct hideep_ts *ts;
1004 int error;
1005
1006
1007 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
1008 dev_err(&client->dev, "check i2c device error");
1009 return -ENODEV;
1010 }
1011
1012 if (client->irq <= 0) {
1013 dev_err(&client->dev, "missing irq: %d\n", client->irq);
1014 return -EINVAL;
1015 }
1016
1017 ts = devm_kzalloc(&client->dev, sizeof(*ts), GFP_KERNEL);
1018 if (!ts)
1019 return -ENOMEM;
1020
1021 ts->client = client;
1022 i2c_set_clientdata(client, ts);
1023 mutex_init(&ts->dev_mutex);
1024
1025 ts->reg = devm_regmap_init_i2c(client, &hideep_regmap_config);
1026 if (IS_ERR(ts->reg)) {
1027 error = PTR_ERR(ts->reg);
1028 dev_err(&client->dev,
1029 "failed to initialize regmap: %d\n", error);
1030 return error;
1031 }
1032
1033 ts->vcc_vdd = devm_regulator_get(&client->dev, "vdd");
1034 if (IS_ERR(ts->vcc_vdd))
1035 return PTR_ERR(ts->vcc_vdd);
1036
1037 ts->vcc_vid = devm_regulator_get(&client->dev, "vid");
1038 if (IS_ERR(ts->vcc_vid))
1039 return PTR_ERR(ts->vcc_vid);
1040
1041 ts->reset_gpio = devm_gpiod_get_optional(&client->dev,
1042 "reset", GPIOD_OUT_HIGH);
1043 if (IS_ERR(ts->reset_gpio))
1044 return PTR_ERR(ts->reset_gpio);
1045
1046 error = hideep_power_on(ts);
1047 if (error) {
1048 dev_err(&client->dev, "power on failed: %d\n", error);
1049 return error;
1050 }
1051
1052 error = devm_add_action_or_reset(&client->dev, hideep_power_off, ts);
1053 if (error)
1054 return error;
1055
1056 error = hideep_load_dwz(ts);
1057 if (error) {
1058 dev_err(&client->dev, "failed to load dwz: %d", error);
1059 return error;
1060 }
1061
1062 error = hideep_init_input(ts);
1063 if (error)
1064 return error;
1065
1066 error = devm_request_threaded_irq(&client->dev, client->irq,
1067 NULL, hideep_irq, IRQF_ONESHOT,
1068 client->name, ts);
1069 if (error) {
1070 dev_err(&client->dev, "failed to request irq %d: %d\n",
1071 client->irq, error);
1072 return error;
1073 }
1074
1075 error = devm_device_add_group(&client->dev, &hideep_ts_attr_group);
1076 if (error) {
1077 dev_err(&client->dev,
1078 "failed to add sysfs attributes: %d\n", error);
1079 return error;
1080 }
1081
1082 return 0;
1083 }
1084
1085 static const struct i2c_device_id hideep_i2c_id[] = {
1086 { HIDEEP_I2C_NAME, 0 },
1087 { }
1088 };
1089 MODULE_DEVICE_TABLE(i2c, hideep_i2c_id);
1090
1091 #ifdef CONFIG_ACPI
1092 static const struct acpi_device_id hideep_acpi_id[] = {
1093 { "HIDP0001", 0 },
1094 { }
1095 };
1096 MODULE_DEVICE_TABLE(acpi, hideep_acpi_id);
1097 #endif
1098
1099 #ifdef CONFIG_OF
1100 static const struct of_device_id hideep_match_table[] = {
1101 { .compatible = "hideep,hideep-ts" },
1102 { }
1103 };
1104 MODULE_DEVICE_TABLE(of, hideep_match_table);
1105 #endif
1106
1107 static struct i2c_driver hideep_driver = {
1108 .driver = {
1109 .name = HIDEEP_I2C_NAME,
1110 .of_match_table = of_match_ptr(hideep_match_table),
1111 .acpi_match_table = ACPI_PTR(hideep_acpi_id),
1112 .pm = &hideep_pm_ops,
1113 },
1114 .id_table = hideep_i2c_id,
1115 .probe = hideep_probe,
1116 };
1117
1118 module_i2c_driver(hideep_driver);
1119
1120 MODULE_DESCRIPTION("Driver for HiDeep Touchscreen Controller");
1121 MODULE_AUTHOR("anthony.kim@hideep.com");
1122 MODULE_LICENSE("GPL v2");