1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Core Source for: 4 * Cypress TrueTouch(TM) Standard Product (TTSP) touchscreen drivers. 5 * For use with Cypress Txx3xx parts. 6 * Supported parts include: 7 * CY8CTST341 8 * CY8CTMA340 9 * 10 * Copyright (C) 2009, 2010, 2011 Cypress Semiconductor, Inc. 11 * Copyright (C) 2012 Javier Martinez Canillas <javier@dowhile0.org> 12 * 13 * Contact Cypress Semiconductor at www.cypress.com <kev@cypress.com> 14 */ 15 16 #include <linux/delay.h> 17 #include <linux/export.h> 18 #include <linux/input.h> 19 #include <linux/input/mt.h> 20 #include <linux/input/touchscreen.h> 21 #include <linux/interrupt.h> 22 #include <linux/slab.h> 23 #include <linux/property.h> 24 #include <linux/gpio/consumer.h> 25 #include <linux/regulator/consumer.h> 26 27 #include "cyttsp_core.h" 28 29 /* Bootloader number of command keys */ 30 #define CY_NUM_BL_KEYS 8 31 32 /* helpers */ 33 #define GET_NUM_TOUCHES(x) ((x) & 0x0F) 34 #define IS_LARGE_AREA(x) (((x) & 0x10) >> 4) 35 #define IS_BAD_PKT(x) ((x) & 0x20) 36 #define IS_VALID_APP(x) ((x) & 0x01) 37 #define IS_OPERATIONAL_ERR(x) ((x) & 0x3F) 38 #define GET_HSTMODE(reg) (((reg) & 0x70) >> 4) 39 #define GET_BOOTLOADERMODE(reg) (((reg) & 0x10) >> 4) 40 41 #define CY_REG_BASE 0x00 42 #define CY_REG_ACT_DIST 0x1E 43 #define CY_REG_ACT_INTRVL 0x1D 44 #define CY_REG_TCH_TMOUT (CY_REG_ACT_INTRVL + 1) 45 #define CY_REG_LP_INTRVL (CY_REG_TCH_TMOUT + 1) 46 #define CY_MAXZ 255 47 #define CY_DELAY_DFLT 20 /* ms */ 48 #define CY_DELAY_MAX 500 49 /* Active distance in pixels for a gesture to be reported */ 50 #define CY_ACT_DIST_DFLT 0xF8 /* pixels */ 51 #define CY_ACT_DIST_MASK 0x0F 52 /* Active Power state scanning/processing refresh interval */ 53 #define CY_ACT_INTRVL_DFLT 0x00 /* ms */ 54 /* Low Power state scanning/processing refresh interval */ 55 #define CY_LP_INTRVL_DFLT 0x0A /* ms */ 56 /* touch timeout for the Active power */ 57 #define CY_TCH_TMOUT_DFLT 0xFF /* ms */ 58 #define CY_HNDSHK_BIT 0x80 59 /* device mode bits */ 60 #define CY_OPERATE_MODE 0x00 61 #define CY_SYSINFO_MODE 0x10 62 /* power mode select bits */ 63 #define CY_SOFT_RESET_MODE 0x01 /* return to Bootloader mode */ 64 #define CY_DEEP_SLEEP_MODE 0x02 65 #define CY_LOW_POWER_MODE 0x04 66 67 /* Slots management */ 68 #define CY_MAX_FINGER 4 69 #define CY_MAX_ID 16 70 71 static const u8 bl_command[] = { 72 0x00, /* file offset */ 73 0xFF, /* command */ 74 0xA5, /* exit bootloader command */ 75 0, 1, 2, 3, 4, 5, 6, 7 /* default keys */ 76 }; 77 78 static int ttsp_read_block_data(struct cyttsp *ts, u8 command, 79 u8 length, void *buf) 80 { 81 int error; 82 int tries; 83 84 for (tries = 0; tries < CY_NUM_RETRY; tries++) { 85 error = ts->bus_ops->read(ts->dev, ts->xfer_buf, command, 86 length, buf); 87 if (!error) 88 return 0; 89 90 msleep(CY_DELAY_DFLT); 91 } 92 93 return -EIO; 94 } 95 96 static int ttsp_write_block_data(struct cyttsp *ts, u8 command, 97 u8 length, void *buf) 98 { 99 int error; 100 int tries; 101 102 for (tries = 0; tries < CY_NUM_RETRY; tries++) { 103 error = ts->bus_ops->write(ts->dev, ts->xfer_buf, command, 104 length, buf); 105 if (!error) 106 return 0; 107 108 msleep(CY_DELAY_DFLT); 109 } 110 111 return -EIO; 112 } 113 114 static int ttsp_send_command(struct cyttsp *ts, u8 cmd) 115 { 116 return ttsp_write_block_data(ts, CY_REG_BASE, sizeof(cmd), &cmd); 117 } 118 119 static int cyttsp_handshake(struct cyttsp *ts) 120 { 121 if (ts->use_hndshk) 122 return ttsp_send_command(ts, 123 ts->xy_data.hst_mode ^ CY_HNDSHK_BIT); 124 125 return 0; 126 } 127 128 static int cyttsp_load_bl_regs(struct cyttsp *ts) 129 { 130 memset(&ts->bl_data, 0, sizeof(ts->bl_data)); 131 ts->bl_data.bl_status = 0x10; 132 133 return ttsp_read_block_data(ts, CY_REG_BASE, 134 sizeof(ts->bl_data), &ts->bl_data); 135 } 136 137 static int cyttsp_exit_bl_mode(struct cyttsp *ts) 138 { 139 int error; 140 u8 bl_cmd[sizeof(bl_command)]; 141 142 memcpy(bl_cmd, bl_command, sizeof(bl_command)); 143 if (ts->bl_keys) 144 memcpy(&bl_cmd[sizeof(bl_command) - CY_NUM_BL_KEYS], 145 ts->bl_keys, CY_NUM_BL_KEYS); 146 147 error = ttsp_write_block_data(ts, CY_REG_BASE, 148 sizeof(bl_cmd), bl_cmd); 149 if (error) 150 return error; 151 152 /* wait for TTSP Device to complete the operation */ 153 msleep(CY_DELAY_DFLT); 154 155 error = cyttsp_load_bl_regs(ts); 156 if (error) 157 return error; 158 159 if (GET_BOOTLOADERMODE(ts->bl_data.bl_status)) 160 return -EIO; 161 162 return 0; 163 } 164 165 static int cyttsp_set_operational_mode(struct cyttsp *ts) 166 { 167 int error; 168 169 error = ttsp_send_command(ts, CY_OPERATE_MODE); 170 if (error) 171 return error; 172 173 /* wait for TTSP Device to complete switch to Operational mode */ 174 error = ttsp_read_block_data(ts, CY_REG_BASE, 175 sizeof(ts->xy_data), &ts->xy_data); 176 if (error) 177 return error; 178 179 error = cyttsp_handshake(ts); 180 if (error) 181 return error; 182 183 return ts->xy_data.act_dist == CY_ACT_DIST_DFLT ? -EIO : 0; 184 } 185 186 static int cyttsp_set_sysinfo_mode(struct cyttsp *ts) 187 { 188 int error; 189 190 memset(&ts->sysinfo_data, 0, sizeof(ts->sysinfo_data)); 191 192 /* switch to sysinfo mode */ 193 error = ttsp_send_command(ts, CY_SYSINFO_MODE); 194 if (error) 195 return error; 196 197 /* read sysinfo registers */ 198 msleep(CY_DELAY_DFLT); 199 error = ttsp_read_block_data(ts, CY_REG_BASE, sizeof(ts->sysinfo_data), 200 &ts->sysinfo_data); 201 if (error) 202 return error; 203 204 error = cyttsp_handshake(ts); 205 if (error) 206 return error; 207 208 if (!ts->sysinfo_data.tts_verh && !ts->sysinfo_data.tts_verl) 209 return -EIO; 210 211 return 0; 212 } 213 214 static int cyttsp_set_sysinfo_regs(struct cyttsp *ts) 215 { 216 int retval = 0; 217 218 if (ts->act_intrvl != CY_ACT_INTRVL_DFLT || 219 ts->tch_tmout != CY_TCH_TMOUT_DFLT || 220 ts->lp_intrvl != CY_LP_INTRVL_DFLT) { 221 222 u8 intrvl_ray[] = { 223 ts->act_intrvl, 224 ts->tch_tmout, 225 ts->lp_intrvl 226 }; 227 228 /* set intrvl registers */ 229 retval = ttsp_write_block_data(ts, CY_REG_ACT_INTRVL, 230 sizeof(intrvl_ray), intrvl_ray); 231 msleep(CY_DELAY_DFLT); 232 } 233 234 return retval; 235 } 236 237 static void cyttsp_hard_reset(struct cyttsp *ts) 238 { 239 if (ts->reset_gpio) { 240 /* 241 * According to the CY8CTMA340 datasheet page 21, the external 242 * reset pulse width should be >= 1 ms. The datasheet does not 243 * specify how long we have to wait after reset but a vendor 244 * tree specifies 5 ms here. 245 */ 246 gpiod_set_value_cansleep(ts->reset_gpio, 1); 247 usleep_range(1000, 2000); 248 gpiod_set_value_cansleep(ts->reset_gpio, 0); 249 usleep_range(5000, 6000); 250 } 251 } 252 253 static int cyttsp_soft_reset(struct cyttsp *ts) 254 { 255 int retval; 256 257 /* wait for interrupt to set ready completion */ 258 reinit_completion(&ts->bl_ready); 259 ts->state = CY_BL_STATE; 260 261 enable_irq(ts->irq); 262 263 retval = ttsp_send_command(ts, CY_SOFT_RESET_MODE); 264 if (retval) { 265 dev_err(ts->dev, "failed to send soft reset\n"); 266 goto out; 267 } 268 269 if (!wait_for_completion_timeout(&ts->bl_ready, 270 msecs_to_jiffies(CY_DELAY_DFLT * CY_DELAY_MAX))) { 271 dev_err(ts->dev, "timeout waiting for soft reset\n"); 272 retval = -EIO; 273 } 274 275 out: 276 ts->state = CY_IDLE_STATE; 277 disable_irq(ts->irq); 278 return retval; 279 } 280 281 static int cyttsp_act_dist_setup(struct cyttsp *ts) 282 { 283 u8 act_dist_setup = ts->act_dist; 284 285 /* Init gesture; active distance setup */ 286 return ttsp_write_block_data(ts, CY_REG_ACT_DIST, 287 sizeof(act_dist_setup), &act_dist_setup); 288 } 289 290 static void cyttsp_extract_track_ids(struct cyttsp_xydata *xy_data, int *ids) 291 { 292 ids[0] = xy_data->touch12_id >> 4; 293 ids[1] = xy_data->touch12_id & 0xF; 294 ids[2] = xy_data->touch34_id >> 4; 295 ids[3] = xy_data->touch34_id & 0xF; 296 } 297 298 static const struct cyttsp_tch *cyttsp_get_tch(struct cyttsp_xydata *xy_data, 299 int idx) 300 { 301 switch (idx) { 302 case 0: 303 return &xy_data->tch1; 304 case 1: 305 return &xy_data->tch2; 306 case 2: 307 return &xy_data->tch3; 308 case 3: 309 return &xy_data->tch4; 310 default: 311 return NULL; 312 } 313 } 314 315 static void cyttsp_report_tchdata(struct cyttsp *ts) 316 { 317 struct cyttsp_xydata *xy_data = &ts->xy_data; 318 struct input_dev *input = ts->input; 319 int num_tch = GET_NUM_TOUCHES(xy_data->tt_stat); 320 const struct cyttsp_tch *tch; 321 int ids[CY_MAX_ID]; 322 int i; 323 DECLARE_BITMAP(used, CY_MAX_ID); 324 325 if (IS_LARGE_AREA(xy_data->tt_stat) == 1) { 326 /* terminate all active tracks */ 327 num_tch = 0; 328 dev_dbg(ts->dev, "%s: Large area detected\n", __func__); 329 } else if (num_tch > CY_MAX_FINGER) { 330 /* terminate all active tracks */ 331 num_tch = 0; 332 dev_dbg(ts->dev, "%s: Num touch error detected\n", __func__); 333 } else if (IS_BAD_PKT(xy_data->tt_mode)) { 334 /* terminate all active tracks */ 335 num_tch = 0; 336 dev_dbg(ts->dev, "%s: Invalid buffer detected\n", __func__); 337 } 338 339 cyttsp_extract_track_ids(xy_data, ids); 340 341 bitmap_zero(used, CY_MAX_ID); 342 343 for (i = 0; i < num_tch; i++) { 344 tch = cyttsp_get_tch(xy_data, i); 345 346 input_mt_slot(input, ids[i]); 347 input_mt_report_slot_state(input, MT_TOOL_FINGER, true); 348 input_report_abs(input, ABS_MT_POSITION_X, be16_to_cpu(tch->x)); 349 input_report_abs(input, ABS_MT_POSITION_Y, be16_to_cpu(tch->y)); 350 input_report_abs(input, ABS_MT_TOUCH_MAJOR, tch->z); 351 352 __set_bit(ids[i], used); 353 } 354 355 for (i = 0; i < CY_MAX_ID; i++) { 356 if (test_bit(i, used)) 357 continue; 358 359 input_mt_slot(input, i); 360 input_mt_report_slot_inactive(input); 361 } 362 363 input_sync(input); 364 } 365 366 static irqreturn_t cyttsp_irq(int irq, void *handle) 367 { 368 struct cyttsp *ts = handle; 369 int error; 370 371 if (unlikely(ts->state == CY_BL_STATE)) { 372 complete(&ts->bl_ready); 373 goto out; 374 } 375 376 /* Get touch data from CYTTSP device */ 377 error = ttsp_read_block_data(ts, CY_REG_BASE, 378 sizeof(struct cyttsp_xydata), &ts->xy_data); 379 if (error) 380 goto out; 381 382 /* provide flow control handshake */ 383 error = cyttsp_handshake(ts); 384 if (error) 385 goto out; 386 387 if (unlikely(ts->state == CY_IDLE_STATE)) 388 goto out; 389 390 if (GET_BOOTLOADERMODE(ts->xy_data.tt_mode)) { 391 /* 392 * TTSP device has reset back to bootloader mode. 393 * Restore to operational mode. 394 */ 395 error = cyttsp_exit_bl_mode(ts); 396 if (error) { 397 dev_err(ts->dev, 398 "Could not return to operational mode, err: %d\n", 399 error); 400 ts->state = CY_IDLE_STATE; 401 } 402 } else { 403 cyttsp_report_tchdata(ts); 404 } 405 406 out: 407 return IRQ_HANDLED; 408 } 409 410 static int cyttsp_power_on(struct cyttsp *ts) 411 { 412 int error; 413 414 error = cyttsp_soft_reset(ts); 415 if (error) 416 return error; 417 418 error = cyttsp_load_bl_regs(ts); 419 if (error) 420 return error; 421 422 if (GET_BOOTLOADERMODE(ts->bl_data.bl_status) && 423 IS_VALID_APP(ts->bl_data.bl_status)) { 424 error = cyttsp_exit_bl_mode(ts); 425 if (error) { 426 dev_err(ts->dev, "failed to exit bootloader mode\n"); 427 return error; 428 } 429 } 430 431 if (GET_HSTMODE(ts->bl_data.bl_file) != CY_OPERATE_MODE || 432 IS_OPERATIONAL_ERR(ts->bl_data.bl_status)) { 433 return -ENODEV; 434 } 435 436 error = cyttsp_set_sysinfo_mode(ts); 437 if (error) 438 return error; 439 440 error = cyttsp_set_sysinfo_regs(ts); 441 if (error) 442 return error; 443 444 error = cyttsp_set_operational_mode(ts); 445 if (error) 446 return error; 447 448 /* init active distance */ 449 error = cyttsp_act_dist_setup(ts); 450 if (error) 451 return error; 452 453 ts->state = CY_ACTIVE_STATE; 454 455 return 0; 456 } 457 458 static int cyttsp_enable(struct cyttsp *ts) 459 { 460 int error; 461 462 /* 463 * The device firmware can wake on an I2C or SPI memory slave 464 * address match. So just reading a register is sufficient to 465 * wake up the device. The first read attempt will fail but it 466 * will wake it up making the second read attempt successful. 467 */ 468 error = ttsp_read_block_data(ts, CY_REG_BASE, 469 sizeof(ts->xy_data), &ts->xy_data); 470 if (error) 471 return error; 472 473 if (GET_HSTMODE(ts->xy_data.hst_mode)) 474 return -EIO; 475 476 enable_irq(ts->irq); 477 478 return 0; 479 } 480 481 static int cyttsp_disable(struct cyttsp *ts) 482 { 483 int error; 484 485 error = ttsp_send_command(ts, CY_LOW_POWER_MODE); 486 if (error) 487 return error; 488 489 disable_irq(ts->irq); 490 491 return 0; 492 } 493 494 static int cyttsp_suspend(struct device *dev) 495 { 496 struct cyttsp *ts = dev_get_drvdata(dev); 497 int error; 498 499 guard(mutex)(&ts->input->mutex); 500 501 if (input_device_enabled(ts->input)) { 502 error = cyttsp_disable(ts); 503 if (error) 504 return error; 505 } 506 507 ts->suspended = true; 508 return 0; 509 } 510 511 static int cyttsp_resume(struct device *dev) 512 { 513 struct cyttsp *ts = dev_get_drvdata(dev); 514 515 guard(mutex)(&ts->input->mutex); 516 517 if (input_device_enabled(ts->input)) 518 cyttsp_enable(ts); 519 520 ts->suspended = false; 521 return 0; 522 } 523 524 EXPORT_GPL_SIMPLE_DEV_PM_OPS(cyttsp_pm_ops, cyttsp_suspend, cyttsp_resume); 525 526 static int cyttsp_open(struct input_dev *dev) 527 { 528 struct cyttsp *ts = input_get_drvdata(dev); 529 int retval = 0; 530 531 if (!ts->suspended) 532 retval = cyttsp_enable(ts); 533 534 return retval; 535 } 536 537 static void cyttsp_close(struct input_dev *dev) 538 { 539 struct cyttsp *ts = input_get_drvdata(dev); 540 541 if (!ts->suspended) 542 cyttsp_disable(ts); 543 } 544 545 static int cyttsp_parse_properties(struct cyttsp *ts) 546 { 547 struct device *dev = ts->dev; 548 u32 dt_value; 549 int ret; 550 551 ts->bl_keys = devm_kzalloc(dev, CY_NUM_BL_KEYS, GFP_KERNEL); 552 if (!ts->bl_keys) 553 return -ENOMEM; 554 555 /* Set some default values */ 556 ts->use_hndshk = false; 557 ts->act_dist = CY_ACT_DIST_DFLT; 558 ts->act_intrvl = CY_ACT_INTRVL_DFLT; 559 ts->tch_tmout = CY_TCH_TMOUT_DFLT; 560 ts->lp_intrvl = CY_LP_INTRVL_DFLT; 561 562 ret = device_property_read_u8_array(dev, "bootloader-key", 563 ts->bl_keys, CY_NUM_BL_KEYS); 564 if (ret) { 565 dev_err(dev, 566 "bootloader-key property could not be retrieved\n"); 567 return ret; 568 } 569 570 ts->use_hndshk = device_property_present(dev, "use-handshake"); 571 572 if (!device_property_read_u32(dev, "active-distance", &dt_value)) { 573 if (dt_value > 15) { 574 dev_err(dev, "active-distance (%u) must be [0-15]\n", 575 dt_value); 576 return -EINVAL; 577 } 578 ts->act_dist &= ~CY_ACT_DIST_MASK; 579 ts->act_dist |= dt_value; 580 } 581 582 if (!device_property_read_u32(dev, "active-interval-ms", &dt_value)) { 583 if (dt_value > 255) { 584 dev_err(dev, "active-interval-ms (%u) must be [0-255]\n", 585 dt_value); 586 return -EINVAL; 587 } 588 ts->act_intrvl = dt_value; 589 } 590 591 if (!device_property_read_u32(dev, "lowpower-interval-ms", &dt_value)) { 592 if (dt_value > 2550) { 593 dev_err(dev, "lowpower-interval-ms (%u) must be [0-2550]\n", 594 dt_value); 595 return -EINVAL; 596 } 597 /* Register value is expressed in 0.01s / bit */ 598 ts->lp_intrvl = dt_value / 10; 599 } 600 601 if (!device_property_read_u32(dev, "touch-timeout-ms", &dt_value)) { 602 if (dt_value > 2550) { 603 dev_err(dev, "touch-timeout-ms (%u) must be [0-2550]\n", 604 dt_value); 605 return -EINVAL; 606 } 607 /* Register value is expressed in 0.01s / bit */ 608 ts->tch_tmout = dt_value / 10; 609 } 610 611 return 0; 612 } 613 614 struct cyttsp *cyttsp_probe(const struct cyttsp_bus_ops *bus_ops, 615 struct device *dev, int irq, size_t xfer_buf_size) 616 { 617 /* 618 * VCPIN is the analog voltage supply 619 * VDD is the digital voltage supply 620 */ 621 static const char * const supplies[] = { "vcpin", "vdd" }; 622 struct cyttsp *ts; 623 struct input_dev *input_dev; 624 int error; 625 626 ts = devm_kzalloc(dev, sizeof(*ts) + xfer_buf_size, GFP_KERNEL); 627 if (!ts) 628 return ERR_PTR(-ENOMEM); 629 630 input_dev = devm_input_allocate_device(dev); 631 if (!input_dev) 632 return ERR_PTR(-ENOMEM); 633 634 ts->dev = dev; 635 ts->input = input_dev; 636 ts->bus_ops = bus_ops; 637 ts->irq = irq; 638 639 error = devm_regulator_bulk_get_enable(dev, ARRAY_SIZE(supplies), 640 supplies); 641 if (error) { 642 dev_err(dev, "Failed to enable regulators: %d\n", error); 643 return ERR_PTR(error); 644 } 645 646 ts->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); 647 if (IS_ERR(ts->reset_gpio)) { 648 error = PTR_ERR(ts->reset_gpio); 649 dev_err(dev, "Failed to request reset gpio, error %d\n", error); 650 return ERR_PTR(error); 651 } 652 653 error = cyttsp_parse_properties(ts); 654 if (error) 655 return ERR_PTR(error); 656 657 init_completion(&ts->bl_ready); 658 659 input_dev->name = "Cypress TTSP TouchScreen"; 660 input_dev->id.bustype = bus_ops->bustype; 661 input_dev->dev.parent = ts->dev; 662 663 input_dev->open = cyttsp_open; 664 input_dev->close = cyttsp_close; 665 666 input_set_drvdata(input_dev, ts); 667 668 input_set_capability(input_dev, EV_ABS, ABS_MT_POSITION_X); 669 input_set_capability(input_dev, EV_ABS, ABS_MT_POSITION_Y); 670 /* One byte for width 0..255 so this is the limit */ 671 input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); 672 673 touchscreen_parse_properties(input_dev, true, NULL); 674 675 error = input_mt_init_slots(input_dev, CY_MAX_ID, INPUT_MT_DIRECT); 676 if (error) { 677 dev_err(dev, "Unable to init MT slots.\n"); 678 return ERR_PTR(error); 679 } 680 681 error = devm_request_threaded_irq(dev, ts->irq, NULL, cyttsp_irq, 682 IRQF_ONESHOT | IRQF_NO_AUTOEN, 683 "cyttsp", ts); 684 if (error) { 685 dev_err(ts->dev, "failed to request IRQ %d, err: %d\n", 686 ts->irq, error); 687 return ERR_PTR(error); 688 } 689 690 cyttsp_hard_reset(ts); 691 692 error = cyttsp_power_on(ts); 693 if (error) 694 return ERR_PTR(error); 695 696 error = input_register_device(input_dev); 697 if (error) { 698 dev_err(ts->dev, "failed to register input device: %d\n", 699 error); 700 return ERR_PTR(error); 701 } 702 703 return ts; 704 } 705 EXPORT_SYMBOL_GPL(cyttsp_probe); 706 707 MODULE_LICENSE("GPL"); 708 MODULE_DESCRIPTION("Cypress TrueTouch(R) Standard touchscreen driver core"); 709 MODULE_AUTHOR("Cypress"); 710