1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Azoteq IQS7222A/B/C/D Capacitive Touch Controller 4 * 5 * Copyright (C) 2022 Jeff LaBundy <jeff@labundy.com> 6 */ 7 8 #include <linux/bits.h> 9 #include <linux/delay.h> 10 #include <linux/device.h> 11 #include <linux/err.h> 12 #include <linux/gpio/consumer.h> 13 #include <linux/i2c.h> 14 #include <linux/input.h> 15 #include <linux/input/touchscreen.h> 16 #include <linux/interrupt.h> 17 #include <linux/kernel.h> 18 #include <linux/ktime.h> 19 #include <linux/mod_devicetable.h> 20 #include <linux/module.h> 21 #include <linux/property.h> 22 #include <linux/slab.h> 23 #include <asm/unaligned.h> 24 25 #define IQS7222_PROD_NUM 0x00 26 #define IQS7222_PROD_NUM_A 840 27 #define IQS7222_PROD_NUM_B 698 28 #define IQS7222_PROD_NUM_C 863 29 #define IQS7222_PROD_NUM_D 1046 30 31 #define IQS7222_SYS_STATUS 0x10 32 #define IQS7222_SYS_STATUS_RESET BIT(3) 33 #define IQS7222_SYS_STATUS_ATI_ERROR BIT(1) 34 #define IQS7222_SYS_STATUS_ATI_ACTIVE BIT(0) 35 36 #define IQS7222_CHAN_SETUP_0_REF_MODE_MASK GENMASK(15, 14) 37 #define IQS7222_CHAN_SETUP_0_REF_MODE_FOLLOW BIT(15) 38 #define IQS7222_CHAN_SETUP_0_REF_MODE_REF BIT(14) 39 #define IQS7222_CHAN_SETUP_0_CHAN_EN BIT(8) 40 41 #define IQS7222_SLDR_SETUP_0_CHAN_CNT_MASK GENMASK(2, 0) 42 #define IQS7222_SLDR_SETUP_2_RES_MASK GENMASK(15, 8) 43 #define IQS7222_SLDR_SETUP_2_RES_SHIFT 8 44 #define IQS7222_SLDR_SETUP_2_TOP_SPEED_MASK GENMASK(7, 0) 45 46 #define IQS7222_GPIO_SETUP_0_GPIO_EN BIT(0) 47 48 #define IQS7222_SYS_SETUP 0xD0 49 #define IQS7222_SYS_SETUP_INTF_MODE_MASK GENMASK(7, 6) 50 #define IQS7222_SYS_SETUP_INTF_MODE_TOUCH BIT(7) 51 #define IQS7222_SYS_SETUP_INTF_MODE_EVENT BIT(6) 52 #define IQS7222_SYS_SETUP_PWR_MODE_MASK GENMASK(5, 4) 53 #define IQS7222_SYS_SETUP_PWR_MODE_AUTO IQS7222_SYS_SETUP_PWR_MODE_MASK 54 #define IQS7222_SYS_SETUP_REDO_ATI BIT(2) 55 #define IQS7222_SYS_SETUP_ACK_RESET BIT(0) 56 57 #define IQS7222_EVENT_MASK_ATI BIT(12) 58 #define IQS7222_EVENT_MASK_SLDR BIT(10) 59 #define IQS7222_EVENT_MASK_TPAD IQS7222_EVENT_MASK_SLDR 60 #define IQS7222_EVENT_MASK_TOUCH BIT(1) 61 #define IQS7222_EVENT_MASK_PROX BIT(0) 62 63 #define IQS7222_COMMS_HOLD BIT(0) 64 #define IQS7222_COMMS_ERROR 0xEEEE 65 #define IQS7222_COMMS_RETRY_MS 50 66 #define IQS7222_COMMS_TIMEOUT_MS 100 67 #define IQS7222_RESET_TIMEOUT_MS 250 68 #define IQS7222_ATI_TIMEOUT_MS 2000 69 70 #define IQS7222_MAX_COLS_STAT 8 71 #define IQS7222_MAX_COLS_CYCLE 3 72 #define IQS7222_MAX_COLS_GLBL 3 73 #define IQS7222_MAX_COLS_BTN 3 74 #define IQS7222_MAX_COLS_CHAN 6 75 #define IQS7222_MAX_COLS_FILT 2 76 #define IQS7222_MAX_COLS_SLDR 11 77 #define IQS7222_MAX_COLS_TPAD 24 78 #define IQS7222_MAX_COLS_GPIO 3 79 #define IQS7222_MAX_COLS_SYS 13 80 81 #define IQS7222_MAX_CHAN 20 82 #define IQS7222_MAX_SLDR 2 83 84 #define IQS7222_NUM_RETRIES 5 85 #define IQS7222_REG_OFFSET 0x100 86 87 enum iqs7222_reg_key_id { 88 IQS7222_REG_KEY_NONE, 89 IQS7222_REG_KEY_PROX, 90 IQS7222_REG_KEY_TOUCH, 91 IQS7222_REG_KEY_DEBOUNCE, 92 IQS7222_REG_KEY_TAP, 93 IQS7222_REG_KEY_TAP_LEGACY, 94 IQS7222_REG_KEY_AXIAL, 95 IQS7222_REG_KEY_AXIAL_LEGACY, 96 IQS7222_REG_KEY_WHEEL, 97 IQS7222_REG_KEY_NO_WHEEL, 98 IQS7222_REG_KEY_RESERVED 99 }; 100 101 enum iqs7222_reg_grp_id { 102 IQS7222_REG_GRP_STAT, 103 IQS7222_REG_GRP_FILT, 104 IQS7222_REG_GRP_CYCLE, 105 IQS7222_REG_GRP_GLBL, 106 IQS7222_REG_GRP_BTN, 107 IQS7222_REG_GRP_CHAN, 108 IQS7222_REG_GRP_SLDR, 109 IQS7222_REG_GRP_TPAD, 110 IQS7222_REG_GRP_GPIO, 111 IQS7222_REG_GRP_SYS, 112 IQS7222_NUM_REG_GRPS 113 }; 114 115 static const char * const iqs7222_reg_grp_names[IQS7222_NUM_REG_GRPS] = { 116 [IQS7222_REG_GRP_CYCLE] = "cycle-%d", 117 [IQS7222_REG_GRP_CHAN] = "channel-%d", 118 [IQS7222_REG_GRP_SLDR] = "slider-%d", 119 [IQS7222_REG_GRP_TPAD] = "trackpad", 120 [IQS7222_REG_GRP_GPIO] = "gpio-%d", 121 }; 122 123 static const unsigned int iqs7222_max_cols[IQS7222_NUM_REG_GRPS] = { 124 [IQS7222_REG_GRP_STAT] = IQS7222_MAX_COLS_STAT, 125 [IQS7222_REG_GRP_CYCLE] = IQS7222_MAX_COLS_CYCLE, 126 [IQS7222_REG_GRP_GLBL] = IQS7222_MAX_COLS_GLBL, 127 [IQS7222_REG_GRP_BTN] = IQS7222_MAX_COLS_BTN, 128 [IQS7222_REG_GRP_CHAN] = IQS7222_MAX_COLS_CHAN, 129 [IQS7222_REG_GRP_FILT] = IQS7222_MAX_COLS_FILT, 130 [IQS7222_REG_GRP_SLDR] = IQS7222_MAX_COLS_SLDR, 131 [IQS7222_REG_GRP_TPAD] = IQS7222_MAX_COLS_TPAD, 132 [IQS7222_REG_GRP_GPIO] = IQS7222_MAX_COLS_GPIO, 133 [IQS7222_REG_GRP_SYS] = IQS7222_MAX_COLS_SYS, 134 }; 135 136 static const unsigned int iqs7222_gpio_links[] = { 2, 5, 6, }; 137 138 struct iqs7222_event_desc { 139 const char *name; 140 u16 link; 141 u16 mask; 142 u16 val; 143 u16 strict; 144 u16 enable; 145 enum iqs7222_reg_key_id reg_key; 146 }; 147 148 static const struct iqs7222_event_desc iqs7222_kp_events[] = { 149 { 150 .name = "event-prox", 151 .enable = IQS7222_EVENT_MASK_PROX, 152 .reg_key = IQS7222_REG_KEY_PROX, 153 }, 154 { 155 .name = "event-touch", 156 .enable = IQS7222_EVENT_MASK_TOUCH, 157 .reg_key = IQS7222_REG_KEY_TOUCH, 158 }, 159 }; 160 161 static const struct iqs7222_event_desc iqs7222_sl_events[] = { 162 { .name = "event-press", }, 163 { 164 .name = "event-tap", 165 .mask = BIT(0), 166 .val = BIT(0), 167 .enable = BIT(0), 168 .reg_key = IQS7222_REG_KEY_TAP, 169 }, 170 { 171 .name = "event-swipe-pos", 172 .mask = BIT(5) | BIT(1), 173 .val = BIT(1), 174 .enable = BIT(1), 175 .reg_key = IQS7222_REG_KEY_AXIAL, 176 }, 177 { 178 .name = "event-swipe-neg", 179 .mask = BIT(5) | BIT(1), 180 .val = BIT(5) | BIT(1), 181 .enable = BIT(1), 182 .reg_key = IQS7222_REG_KEY_AXIAL, 183 }, 184 { 185 .name = "event-flick-pos", 186 .mask = BIT(5) | BIT(2), 187 .val = BIT(2), 188 .enable = BIT(2), 189 .reg_key = IQS7222_REG_KEY_AXIAL, 190 }, 191 { 192 .name = "event-flick-neg", 193 .mask = BIT(5) | BIT(2), 194 .val = BIT(5) | BIT(2), 195 .enable = BIT(2), 196 .reg_key = IQS7222_REG_KEY_AXIAL, 197 }, 198 }; 199 200 static const struct iqs7222_event_desc iqs7222_tp_events[] = { 201 { 202 .name = "event-press", 203 .link = BIT(7), 204 }, 205 { 206 .name = "event-tap", 207 .link = BIT(0), 208 .mask = BIT(0), 209 .val = BIT(0), 210 .enable = BIT(0), 211 .reg_key = IQS7222_REG_KEY_TAP, 212 }, 213 { 214 .name = "event-swipe-x-pos", 215 .link = BIT(2), 216 .mask = BIT(2) | BIT(1), 217 .val = BIT(2), 218 .strict = BIT(4), 219 .enable = BIT(1), 220 .reg_key = IQS7222_REG_KEY_AXIAL, 221 }, 222 { 223 .name = "event-swipe-y-pos", 224 .link = BIT(3), 225 .mask = BIT(3) | BIT(1), 226 .val = BIT(3), 227 .strict = BIT(3), 228 .enable = BIT(1), 229 .reg_key = IQS7222_REG_KEY_AXIAL, 230 }, 231 { 232 .name = "event-swipe-x-neg", 233 .link = BIT(4), 234 .mask = BIT(4) | BIT(1), 235 .val = BIT(4), 236 .strict = BIT(4), 237 .enable = BIT(1), 238 .reg_key = IQS7222_REG_KEY_AXIAL, 239 }, 240 { 241 .name = "event-swipe-y-neg", 242 .link = BIT(5), 243 .mask = BIT(5) | BIT(1), 244 .val = BIT(5), 245 .strict = BIT(3), 246 .enable = BIT(1), 247 .reg_key = IQS7222_REG_KEY_AXIAL, 248 }, 249 { 250 .name = "event-flick-x-pos", 251 .link = BIT(2), 252 .mask = BIT(2) | BIT(1), 253 .val = BIT(2) | BIT(1), 254 .strict = BIT(4), 255 .enable = BIT(2), 256 .reg_key = IQS7222_REG_KEY_AXIAL, 257 }, 258 { 259 .name = "event-flick-y-pos", 260 .link = BIT(3), 261 .mask = BIT(3) | BIT(1), 262 .val = BIT(3) | BIT(1), 263 .strict = BIT(3), 264 .enable = BIT(2), 265 .reg_key = IQS7222_REG_KEY_AXIAL, 266 }, 267 { 268 .name = "event-flick-x-neg", 269 .link = BIT(4), 270 .mask = BIT(4) | BIT(1), 271 .val = BIT(4) | BIT(1), 272 .strict = BIT(4), 273 .enable = BIT(2), 274 .reg_key = IQS7222_REG_KEY_AXIAL, 275 }, 276 { 277 .name = "event-flick-y-neg", 278 .link = BIT(5), 279 .mask = BIT(5) | BIT(1), 280 .val = BIT(5) | BIT(1), 281 .strict = BIT(3), 282 .enable = BIT(2), 283 .reg_key = IQS7222_REG_KEY_AXIAL, 284 }, 285 }; 286 287 struct iqs7222_reg_grp_desc { 288 u16 base; 289 int num_row; 290 int num_col; 291 }; 292 293 struct iqs7222_dev_desc { 294 u16 prod_num; 295 u16 fw_major; 296 u16 fw_minor; 297 u16 sldr_res; 298 u16 touch_link; 299 u16 wheel_enable; 300 int allow_offset; 301 int event_offset; 302 int comms_offset; 303 bool legacy_gesture; 304 struct iqs7222_reg_grp_desc reg_grps[IQS7222_NUM_REG_GRPS]; 305 }; 306 307 static const struct iqs7222_dev_desc iqs7222_devs[] = { 308 { 309 .prod_num = IQS7222_PROD_NUM_A, 310 .fw_major = 1, 311 .fw_minor = 13, 312 .sldr_res = U8_MAX * 16, 313 .touch_link = 1768, 314 .allow_offset = 9, 315 .event_offset = 10, 316 .comms_offset = 12, 317 .reg_grps = { 318 [IQS7222_REG_GRP_STAT] = { 319 .base = IQS7222_SYS_STATUS, 320 .num_row = 1, 321 .num_col = 8, 322 }, 323 [IQS7222_REG_GRP_CYCLE] = { 324 .base = 0x8000, 325 .num_row = 7, 326 .num_col = 3, 327 }, 328 [IQS7222_REG_GRP_GLBL] = { 329 .base = 0x8700, 330 .num_row = 1, 331 .num_col = 3, 332 }, 333 [IQS7222_REG_GRP_BTN] = { 334 .base = 0x9000, 335 .num_row = 12, 336 .num_col = 3, 337 }, 338 [IQS7222_REG_GRP_CHAN] = { 339 .base = 0xA000, 340 .num_row = 12, 341 .num_col = 6, 342 }, 343 [IQS7222_REG_GRP_FILT] = { 344 .base = 0xAC00, 345 .num_row = 1, 346 .num_col = 2, 347 }, 348 [IQS7222_REG_GRP_SLDR] = { 349 .base = 0xB000, 350 .num_row = 2, 351 .num_col = 11, 352 }, 353 [IQS7222_REG_GRP_GPIO] = { 354 .base = 0xC000, 355 .num_row = 1, 356 .num_col = 3, 357 }, 358 [IQS7222_REG_GRP_SYS] = { 359 .base = IQS7222_SYS_SETUP, 360 .num_row = 1, 361 .num_col = 13, 362 }, 363 }, 364 }, 365 { 366 .prod_num = IQS7222_PROD_NUM_A, 367 .fw_major = 1, 368 .fw_minor = 12, 369 .sldr_res = U8_MAX * 16, 370 .touch_link = 1768, 371 .allow_offset = 9, 372 .event_offset = 10, 373 .comms_offset = 12, 374 .legacy_gesture = true, 375 .reg_grps = { 376 [IQS7222_REG_GRP_STAT] = { 377 .base = IQS7222_SYS_STATUS, 378 .num_row = 1, 379 .num_col = 8, 380 }, 381 [IQS7222_REG_GRP_CYCLE] = { 382 .base = 0x8000, 383 .num_row = 7, 384 .num_col = 3, 385 }, 386 [IQS7222_REG_GRP_GLBL] = { 387 .base = 0x8700, 388 .num_row = 1, 389 .num_col = 3, 390 }, 391 [IQS7222_REG_GRP_BTN] = { 392 .base = 0x9000, 393 .num_row = 12, 394 .num_col = 3, 395 }, 396 [IQS7222_REG_GRP_CHAN] = { 397 .base = 0xA000, 398 .num_row = 12, 399 .num_col = 6, 400 }, 401 [IQS7222_REG_GRP_FILT] = { 402 .base = 0xAC00, 403 .num_row = 1, 404 .num_col = 2, 405 }, 406 [IQS7222_REG_GRP_SLDR] = { 407 .base = 0xB000, 408 .num_row = 2, 409 .num_col = 11, 410 }, 411 [IQS7222_REG_GRP_GPIO] = { 412 .base = 0xC000, 413 .num_row = 1, 414 .num_col = 3, 415 }, 416 [IQS7222_REG_GRP_SYS] = { 417 .base = IQS7222_SYS_SETUP, 418 .num_row = 1, 419 .num_col = 13, 420 }, 421 }, 422 }, 423 { 424 .prod_num = IQS7222_PROD_NUM_B, 425 .fw_major = 1, 426 .fw_minor = 43, 427 .event_offset = 10, 428 .comms_offset = 11, 429 .reg_grps = { 430 [IQS7222_REG_GRP_STAT] = { 431 .base = IQS7222_SYS_STATUS, 432 .num_row = 1, 433 .num_col = 6, 434 }, 435 [IQS7222_REG_GRP_CYCLE] = { 436 .base = 0x8000, 437 .num_row = 10, 438 .num_col = 2, 439 }, 440 [IQS7222_REG_GRP_GLBL] = { 441 .base = 0x8A00, 442 .num_row = 1, 443 .num_col = 3, 444 }, 445 [IQS7222_REG_GRP_BTN] = { 446 .base = 0x9000, 447 .num_row = 20, 448 .num_col = 2, 449 }, 450 [IQS7222_REG_GRP_CHAN] = { 451 .base = 0xB000, 452 .num_row = 20, 453 .num_col = 4, 454 }, 455 [IQS7222_REG_GRP_FILT] = { 456 .base = 0xC400, 457 .num_row = 1, 458 .num_col = 2, 459 }, 460 [IQS7222_REG_GRP_SYS] = { 461 .base = IQS7222_SYS_SETUP, 462 .num_row = 1, 463 .num_col = 13, 464 }, 465 }, 466 }, 467 { 468 .prod_num = IQS7222_PROD_NUM_B, 469 .fw_major = 1, 470 .fw_minor = 27, 471 .reg_grps = { 472 [IQS7222_REG_GRP_STAT] = { 473 .base = IQS7222_SYS_STATUS, 474 .num_row = 1, 475 .num_col = 6, 476 }, 477 [IQS7222_REG_GRP_CYCLE] = { 478 .base = 0x8000, 479 .num_row = 10, 480 .num_col = 2, 481 }, 482 [IQS7222_REG_GRP_GLBL] = { 483 .base = 0x8A00, 484 .num_row = 1, 485 .num_col = 3, 486 }, 487 [IQS7222_REG_GRP_BTN] = { 488 .base = 0x9000, 489 .num_row = 20, 490 .num_col = 2, 491 }, 492 [IQS7222_REG_GRP_CHAN] = { 493 .base = 0xB000, 494 .num_row = 20, 495 .num_col = 4, 496 }, 497 [IQS7222_REG_GRP_FILT] = { 498 .base = 0xC400, 499 .num_row = 1, 500 .num_col = 2, 501 }, 502 [IQS7222_REG_GRP_SYS] = { 503 .base = IQS7222_SYS_SETUP, 504 .num_row = 1, 505 .num_col = 10, 506 }, 507 }, 508 }, 509 { 510 .prod_num = IQS7222_PROD_NUM_C, 511 .fw_major = 2, 512 .fw_minor = 6, 513 .sldr_res = U16_MAX, 514 .touch_link = 1686, 515 .wheel_enable = BIT(3), 516 .event_offset = 9, 517 .comms_offset = 10, 518 .reg_grps = { 519 [IQS7222_REG_GRP_STAT] = { 520 .base = IQS7222_SYS_STATUS, 521 .num_row = 1, 522 .num_col = 6, 523 }, 524 [IQS7222_REG_GRP_CYCLE] = { 525 .base = 0x8000, 526 .num_row = 5, 527 .num_col = 3, 528 }, 529 [IQS7222_REG_GRP_GLBL] = { 530 .base = 0x8500, 531 .num_row = 1, 532 .num_col = 3, 533 }, 534 [IQS7222_REG_GRP_BTN] = { 535 .base = 0x9000, 536 .num_row = 10, 537 .num_col = 3, 538 }, 539 [IQS7222_REG_GRP_CHAN] = { 540 .base = 0xA000, 541 .num_row = 10, 542 .num_col = 6, 543 }, 544 [IQS7222_REG_GRP_FILT] = { 545 .base = 0xAA00, 546 .num_row = 1, 547 .num_col = 2, 548 }, 549 [IQS7222_REG_GRP_SLDR] = { 550 .base = 0xB000, 551 .num_row = 2, 552 .num_col = 10, 553 }, 554 [IQS7222_REG_GRP_GPIO] = { 555 .base = 0xC000, 556 .num_row = 3, 557 .num_col = 3, 558 }, 559 [IQS7222_REG_GRP_SYS] = { 560 .base = IQS7222_SYS_SETUP, 561 .num_row = 1, 562 .num_col = 12, 563 }, 564 }, 565 }, 566 { 567 .prod_num = IQS7222_PROD_NUM_C, 568 .fw_major = 1, 569 .fw_minor = 13, 570 .sldr_res = U16_MAX, 571 .touch_link = 1674, 572 .wheel_enable = BIT(3), 573 .event_offset = 9, 574 .comms_offset = 10, 575 .reg_grps = { 576 [IQS7222_REG_GRP_STAT] = { 577 .base = IQS7222_SYS_STATUS, 578 .num_row = 1, 579 .num_col = 6, 580 }, 581 [IQS7222_REG_GRP_CYCLE] = { 582 .base = 0x8000, 583 .num_row = 5, 584 .num_col = 3, 585 }, 586 [IQS7222_REG_GRP_GLBL] = { 587 .base = 0x8500, 588 .num_row = 1, 589 .num_col = 3, 590 }, 591 [IQS7222_REG_GRP_BTN] = { 592 .base = 0x9000, 593 .num_row = 10, 594 .num_col = 3, 595 }, 596 [IQS7222_REG_GRP_CHAN] = { 597 .base = 0xA000, 598 .num_row = 10, 599 .num_col = 6, 600 }, 601 [IQS7222_REG_GRP_FILT] = { 602 .base = 0xAA00, 603 .num_row = 1, 604 .num_col = 2, 605 }, 606 [IQS7222_REG_GRP_SLDR] = { 607 .base = 0xB000, 608 .num_row = 2, 609 .num_col = 10, 610 }, 611 [IQS7222_REG_GRP_GPIO] = { 612 .base = 0xC000, 613 .num_row = 1, 614 .num_col = 3, 615 }, 616 [IQS7222_REG_GRP_SYS] = { 617 .base = IQS7222_SYS_SETUP, 618 .num_row = 1, 619 .num_col = 11, 620 }, 621 }, 622 }, 623 { 624 .prod_num = IQS7222_PROD_NUM_D, 625 .fw_major = 0, 626 .fw_minor = 37, 627 .touch_link = 1770, 628 .allow_offset = 9, 629 .event_offset = 10, 630 .comms_offset = 11, 631 .reg_grps = { 632 [IQS7222_REG_GRP_STAT] = { 633 .base = IQS7222_SYS_STATUS, 634 .num_row = 1, 635 .num_col = 7, 636 }, 637 [IQS7222_REG_GRP_CYCLE] = { 638 .base = 0x8000, 639 .num_row = 7, 640 .num_col = 2, 641 }, 642 [IQS7222_REG_GRP_GLBL] = { 643 .base = 0x8700, 644 .num_row = 1, 645 .num_col = 3, 646 }, 647 [IQS7222_REG_GRP_BTN] = { 648 .base = 0x9000, 649 .num_row = 14, 650 .num_col = 3, 651 }, 652 [IQS7222_REG_GRP_CHAN] = { 653 .base = 0xA000, 654 .num_row = 14, 655 .num_col = 4, 656 }, 657 [IQS7222_REG_GRP_FILT] = { 658 .base = 0xAE00, 659 .num_row = 1, 660 .num_col = 2, 661 }, 662 [IQS7222_REG_GRP_TPAD] = { 663 .base = 0xB000, 664 .num_row = 1, 665 .num_col = 24, 666 }, 667 [IQS7222_REG_GRP_GPIO] = { 668 .base = 0xC000, 669 .num_row = 3, 670 .num_col = 3, 671 }, 672 [IQS7222_REG_GRP_SYS] = { 673 .base = IQS7222_SYS_SETUP, 674 .num_row = 1, 675 .num_col = 12, 676 }, 677 }, 678 }, 679 }; 680 681 struct iqs7222_prop_desc { 682 const char *name; 683 enum iqs7222_reg_grp_id reg_grp; 684 enum iqs7222_reg_key_id reg_key; 685 int reg_offset; 686 int reg_shift; 687 int reg_width; 688 int val_pitch; 689 int val_min; 690 int val_max; 691 bool invert; 692 const char *label; 693 }; 694 695 static const struct iqs7222_prop_desc iqs7222_props[] = { 696 { 697 .name = "azoteq,conv-period", 698 .reg_grp = IQS7222_REG_GRP_CYCLE, 699 .reg_offset = 0, 700 .reg_shift = 8, 701 .reg_width = 8, 702 .label = "conversion period", 703 }, 704 { 705 .name = "azoteq,conv-frac", 706 .reg_grp = IQS7222_REG_GRP_CYCLE, 707 .reg_offset = 0, 708 .reg_shift = 0, 709 .reg_width = 8, 710 .label = "conversion frequency fractional divider", 711 }, 712 { 713 .name = "azoteq,rx-float-inactive", 714 .reg_grp = IQS7222_REG_GRP_CYCLE, 715 .reg_offset = 1, 716 .reg_shift = 6, 717 .reg_width = 1, 718 .invert = true, 719 }, 720 { 721 .name = "azoteq,dead-time-enable", 722 .reg_grp = IQS7222_REG_GRP_CYCLE, 723 .reg_offset = 1, 724 .reg_shift = 5, 725 .reg_width = 1, 726 }, 727 { 728 .name = "azoteq,tx-freq-fosc", 729 .reg_grp = IQS7222_REG_GRP_CYCLE, 730 .reg_offset = 1, 731 .reg_shift = 4, 732 .reg_width = 1, 733 }, 734 { 735 .name = "azoteq,vbias-enable", 736 .reg_grp = IQS7222_REG_GRP_CYCLE, 737 .reg_offset = 1, 738 .reg_shift = 3, 739 .reg_width = 1, 740 }, 741 { 742 .name = "azoteq,sense-mode", 743 .reg_grp = IQS7222_REG_GRP_CYCLE, 744 .reg_offset = 1, 745 .reg_shift = 0, 746 .reg_width = 3, 747 .val_max = 3, 748 .label = "sensing mode", 749 }, 750 { 751 .name = "azoteq,iref-enable", 752 .reg_grp = IQS7222_REG_GRP_CYCLE, 753 .reg_offset = 2, 754 .reg_shift = 10, 755 .reg_width = 1, 756 }, 757 { 758 .name = "azoteq,iref-level", 759 .reg_grp = IQS7222_REG_GRP_CYCLE, 760 .reg_offset = 2, 761 .reg_shift = 4, 762 .reg_width = 4, 763 .label = "current reference level", 764 }, 765 { 766 .name = "azoteq,iref-trim", 767 .reg_grp = IQS7222_REG_GRP_CYCLE, 768 .reg_offset = 2, 769 .reg_shift = 0, 770 .reg_width = 4, 771 .label = "current reference trim", 772 }, 773 { 774 .name = "azoteq,max-counts", 775 .reg_grp = IQS7222_REG_GRP_GLBL, 776 .reg_offset = 0, 777 .reg_shift = 13, 778 .reg_width = 2, 779 .label = "maximum counts", 780 }, 781 { 782 .name = "azoteq,auto-mode", 783 .reg_grp = IQS7222_REG_GRP_GLBL, 784 .reg_offset = 0, 785 .reg_shift = 2, 786 .reg_width = 2, 787 .label = "number of conversions", 788 }, 789 { 790 .name = "azoteq,ati-frac-div-fine", 791 .reg_grp = IQS7222_REG_GRP_GLBL, 792 .reg_offset = 1, 793 .reg_shift = 9, 794 .reg_width = 5, 795 .label = "ATI fine fractional divider", 796 }, 797 { 798 .name = "azoteq,ati-frac-div-coarse", 799 .reg_grp = IQS7222_REG_GRP_GLBL, 800 .reg_offset = 1, 801 .reg_shift = 0, 802 .reg_width = 5, 803 .label = "ATI coarse fractional divider", 804 }, 805 { 806 .name = "azoteq,ati-comp-select", 807 .reg_grp = IQS7222_REG_GRP_GLBL, 808 .reg_offset = 2, 809 .reg_shift = 0, 810 .reg_width = 10, 811 .label = "ATI compensation selection", 812 }, 813 { 814 .name = "azoteq,ati-band", 815 .reg_grp = IQS7222_REG_GRP_CHAN, 816 .reg_offset = 0, 817 .reg_shift = 12, 818 .reg_width = 2, 819 .label = "ATI band", 820 }, 821 { 822 .name = "azoteq,global-halt", 823 .reg_grp = IQS7222_REG_GRP_CHAN, 824 .reg_offset = 0, 825 .reg_shift = 11, 826 .reg_width = 1, 827 }, 828 { 829 .name = "azoteq,invert-enable", 830 .reg_grp = IQS7222_REG_GRP_CHAN, 831 .reg_offset = 0, 832 .reg_shift = 10, 833 .reg_width = 1, 834 }, 835 { 836 .name = "azoteq,dual-direction", 837 .reg_grp = IQS7222_REG_GRP_CHAN, 838 .reg_offset = 0, 839 .reg_shift = 9, 840 .reg_width = 1, 841 }, 842 { 843 .name = "azoteq,samp-cap-double", 844 .reg_grp = IQS7222_REG_GRP_CHAN, 845 .reg_offset = 0, 846 .reg_shift = 3, 847 .reg_width = 1, 848 }, 849 { 850 .name = "azoteq,vref-half", 851 .reg_grp = IQS7222_REG_GRP_CHAN, 852 .reg_offset = 0, 853 .reg_shift = 2, 854 .reg_width = 1, 855 }, 856 { 857 .name = "azoteq,proj-bias", 858 .reg_grp = IQS7222_REG_GRP_CHAN, 859 .reg_offset = 0, 860 .reg_shift = 0, 861 .reg_width = 2, 862 .label = "projected bias current", 863 }, 864 { 865 .name = "azoteq,ati-target", 866 .reg_grp = IQS7222_REG_GRP_CHAN, 867 .reg_offset = 1, 868 .reg_shift = 8, 869 .reg_width = 8, 870 .val_pitch = 8, 871 .label = "ATI target", 872 }, 873 { 874 .name = "azoteq,ati-base", 875 .reg_grp = IQS7222_REG_GRP_CHAN, 876 .reg_offset = 1, 877 .reg_shift = 3, 878 .reg_width = 5, 879 .val_pitch = 16, 880 .label = "ATI base", 881 }, 882 { 883 .name = "azoteq,ati-mode", 884 .reg_grp = IQS7222_REG_GRP_CHAN, 885 .reg_offset = 1, 886 .reg_shift = 0, 887 .reg_width = 3, 888 .val_max = 5, 889 .label = "ATI mode", 890 }, 891 { 892 .name = "azoteq,ati-frac-div-fine", 893 .reg_grp = IQS7222_REG_GRP_CHAN, 894 .reg_offset = 2, 895 .reg_shift = 9, 896 .reg_width = 5, 897 .label = "ATI fine fractional divider", 898 }, 899 { 900 .name = "azoteq,ati-frac-mult-coarse", 901 .reg_grp = IQS7222_REG_GRP_CHAN, 902 .reg_offset = 2, 903 .reg_shift = 5, 904 .reg_width = 4, 905 .label = "ATI coarse fractional multiplier", 906 }, 907 { 908 .name = "azoteq,ati-frac-div-coarse", 909 .reg_grp = IQS7222_REG_GRP_CHAN, 910 .reg_offset = 2, 911 .reg_shift = 0, 912 .reg_width = 5, 913 .label = "ATI coarse fractional divider", 914 }, 915 { 916 .name = "azoteq,ati-comp-div", 917 .reg_grp = IQS7222_REG_GRP_CHAN, 918 .reg_offset = 3, 919 .reg_shift = 11, 920 .reg_width = 5, 921 .label = "ATI compensation divider", 922 }, 923 { 924 .name = "azoteq,ati-comp-select", 925 .reg_grp = IQS7222_REG_GRP_CHAN, 926 .reg_offset = 3, 927 .reg_shift = 0, 928 .reg_width = 10, 929 .label = "ATI compensation selection", 930 }, 931 { 932 .name = "azoteq,debounce-exit", 933 .reg_grp = IQS7222_REG_GRP_BTN, 934 .reg_key = IQS7222_REG_KEY_DEBOUNCE, 935 .reg_offset = 0, 936 .reg_shift = 12, 937 .reg_width = 4, 938 .label = "debounce exit factor", 939 }, 940 { 941 .name = "azoteq,debounce-enter", 942 .reg_grp = IQS7222_REG_GRP_BTN, 943 .reg_key = IQS7222_REG_KEY_DEBOUNCE, 944 .reg_offset = 0, 945 .reg_shift = 8, 946 .reg_width = 4, 947 .label = "debounce entrance factor", 948 }, 949 { 950 .name = "azoteq,thresh", 951 .reg_grp = IQS7222_REG_GRP_BTN, 952 .reg_key = IQS7222_REG_KEY_PROX, 953 .reg_offset = 0, 954 .reg_shift = 0, 955 .reg_width = 8, 956 .val_max = 127, 957 .label = "threshold", 958 }, 959 { 960 .name = "azoteq,thresh", 961 .reg_grp = IQS7222_REG_GRP_BTN, 962 .reg_key = IQS7222_REG_KEY_TOUCH, 963 .reg_offset = 1, 964 .reg_shift = 0, 965 .reg_width = 8, 966 .label = "threshold", 967 }, 968 { 969 .name = "azoteq,hyst", 970 .reg_grp = IQS7222_REG_GRP_BTN, 971 .reg_key = IQS7222_REG_KEY_TOUCH, 972 .reg_offset = 1, 973 .reg_shift = 8, 974 .reg_width = 8, 975 .label = "hysteresis", 976 }, 977 { 978 .name = "azoteq,lta-beta-lp", 979 .reg_grp = IQS7222_REG_GRP_FILT, 980 .reg_offset = 0, 981 .reg_shift = 12, 982 .reg_width = 4, 983 .label = "low-power mode long-term average beta", 984 }, 985 { 986 .name = "azoteq,lta-beta-np", 987 .reg_grp = IQS7222_REG_GRP_FILT, 988 .reg_offset = 0, 989 .reg_shift = 8, 990 .reg_width = 4, 991 .label = "normal-power mode long-term average beta", 992 }, 993 { 994 .name = "azoteq,counts-beta-lp", 995 .reg_grp = IQS7222_REG_GRP_FILT, 996 .reg_offset = 0, 997 .reg_shift = 4, 998 .reg_width = 4, 999 .label = "low-power mode counts beta", 1000 }, 1001 { 1002 .name = "azoteq,counts-beta-np", 1003 .reg_grp = IQS7222_REG_GRP_FILT, 1004 .reg_offset = 0, 1005 .reg_shift = 0, 1006 .reg_width = 4, 1007 .label = "normal-power mode counts beta", 1008 }, 1009 { 1010 .name = "azoteq,lta-fast-beta-lp", 1011 .reg_grp = IQS7222_REG_GRP_FILT, 1012 .reg_offset = 1, 1013 .reg_shift = 4, 1014 .reg_width = 4, 1015 .label = "low-power mode long-term average fast beta", 1016 }, 1017 { 1018 .name = "azoteq,lta-fast-beta-np", 1019 .reg_grp = IQS7222_REG_GRP_FILT, 1020 .reg_offset = 1, 1021 .reg_shift = 0, 1022 .reg_width = 4, 1023 .label = "normal-power mode long-term average fast beta", 1024 }, 1025 { 1026 .name = "azoteq,lower-cal", 1027 .reg_grp = IQS7222_REG_GRP_SLDR, 1028 .reg_offset = 0, 1029 .reg_shift = 8, 1030 .reg_width = 8, 1031 .label = "lower calibration", 1032 }, 1033 { 1034 .name = "azoteq,static-beta", 1035 .reg_grp = IQS7222_REG_GRP_SLDR, 1036 .reg_key = IQS7222_REG_KEY_NO_WHEEL, 1037 .reg_offset = 0, 1038 .reg_shift = 6, 1039 .reg_width = 1, 1040 }, 1041 { 1042 .name = "azoteq,bottom-beta", 1043 .reg_grp = IQS7222_REG_GRP_SLDR, 1044 .reg_key = IQS7222_REG_KEY_NO_WHEEL, 1045 .reg_offset = 0, 1046 .reg_shift = 3, 1047 .reg_width = 3, 1048 .label = "bottom beta", 1049 }, 1050 { 1051 .name = "azoteq,static-beta", 1052 .reg_grp = IQS7222_REG_GRP_SLDR, 1053 .reg_key = IQS7222_REG_KEY_WHEEL, 1054 .reg_offset = 0, 1055 .reg_shift = 7, 1056 .reg_width = 1, 1057 }, 1058 { 1059 .name = "azoteq,bottom-beta", 1060 .reg_grp = IQS7222_REG_GRP_SLDR, 1061 .reg_key = IQS7222_REG_KEY_WHEEL, 1062 .reg_offset = 0, 1063 .reg_shift = 4, 1064 .reg_width = 3, 1065 .label = "bottom beta", 1066 }, 1067 { 1068 .name = "azoteq,bottom-speed", 1069 .reg_grp = IQS7222_REG_GRP_SLDR, 1070 .reg_offset = 1, 1071 .reg_shift = 8, 1072 .reg_width = 8, 1073 .label = "bottom speed", 1074 }, 1075 { 1076 .name = "azoteq,upper-cal", 1077 .reg_grp = IQS7222_REG_GRP_SLDR, 1078 .reg_offset = 1, 1079 .reg_shift = 0, 1080 .reg_width = 8, 1081 .label = "upper calibration", 1082 }, 1083 { 1084 .name = "azoteq,gesture-max-ms", 1085 .reg_grp = IQS7222_REG_GRP_SLDR, 1086 .reg_key = IQS7222_REG_KEY_TAP, 1087 .reg_offset = 9, 1088 .reg_shift = 8, 1089 .reg_width = 8, 1090 .val_pitch = 16, 1091 .label = "maximum gesture time", 1092 }, 1093 { 1094 .name = "azoteq,gesture-max-ms", 1095 .reg_grp = IQS7222_REG_GRP_SLDR, 1096 .reg_key = IQS7222_REG_KEY_TAP_LEGACY, 1097 .reg_offset = 9, 1098 .reg_shift = 8, 1099 .reg_width = 8, 1100 .val_pitch = 4, 1101 .label = "maximum gesture time", 1102 }, 1103 { 1104 .name = "azoteq,gesture-min-ms", 1105 .reg_grp = IQS7222_REG_GRP_SLDR, 1106 .reg_key = IQS7222_REG_KEY_TAP, 1107 .reg_offset = 9, 1108 .reg_shift = 3, 1109 .reg_width = 5, 1110 .val_pitch = 16, 1111 .label = "minimum gesture time", 1112 }, 1113 { 1114 .name = "azoteq,gesture-min-ms", 1115 .reg_grp = IQS7222_REG_GRP_SLDR, 1116 .reg_key = IQS7222_REG_KEY_TAP_LEGACY, 1117 .reg_offset = 9, 1118 .reg_shift = 3, 1119 .reg_width = 5, 1120 .val_pitch = 4, 1121 .label = "minimum gesture time", 1122 }, 1123 { 1124 .name = "azoteq,gesture-dist", 1125 .reg_grp = IQS7222_REG_GRP_SLDR, 1126 .reg_key = IQS7222_REG_KEY_AXIAL, 1127 .reg_offset = 10, 1128 .reg_shift = 8, 1129 .reg_width = 8, 1130 .val_pitch = 16, 1131 .label = "gesture distance", 1132 }, 1133 { 1134 .name = "azoteq,gesture-dist", 1135 .reg_grp = IQS7222_REG_GRP_SLDR, 1136 .reg_key = IQS7222_REG_KEY_AXIAL_LEGACY, 1137 .reg_offset = 10, 1138 .reg_shift = 8, 1139 .reg_width = 8, 1140 .val_pitch = 16, 1141 .label = "gesture distance", 1142 }, 1143 { 1144 .name = "azoteq,gesture-max-ms", 1145 .reg_grp = IQS7222_REG_GRP_SLDR, 1146 .reg_key = IQS7222_REG_KEY_AXIAL, 1147 .reg_offset = 10, 1148 .reg_shift = 0, 1149 .reg_width = 8, 1150 .val_pitch = 16, 1151 .label = "maximum gesture time", 1152 }, 1153 { 1154 .name = "azoteq,gesture-max-ms", 1155 .reg_grp = IQS7222_REG_GRP_SLDR, 1156 .reg_key = IQS7222_REG_KEY_AXIAL_LEGACY, 1157 .reg_offset = 10, 1158 .reg_shift = 0, 1159 .reg_width = 8, 1160 .val_pitch = 4, 1161 .label = "maximum gesture time", 1162 }, 1163 { 1164 .name = "azoteq,num-rows", 1165 .reg_grp = IQS7222_REG_GRP_TPAD, 1166 .reg_offset = 0, 1167 .reg_shift = 4, 1168 .reg_width = 4, 1169 .val_min = 1, 1170 .val_max = 12, 1171 .label = "number of rows", 1172 }, 1173 { 1174 .name = "azoteq,num-cols", 1175 .reg_grp = IQS7222_REG_GRP_TPAD, 1176 .reg_offset = 0, 1177 .reg_shift = 0, 1178 .reg_width = 4, 1179 .val_min = 1, 1180 .val_max = 12, 1181 .label = "number of columns", 1182 }, 1183 { 1184 .name = "azoteq,lower-cal-y", 1185 .reg_grp = IQS7222_REG_GRP_TPAD, 1186 .reg_offset = 1, 1187 .reg_shift = 8, 1188 .reg_width = 8, 1189 .label = "lower vertical calibration", 1190 }, 1191 { 1192 .name = "azoteq,lower-cal-x", 1193 .reg_grp = IQS7222_REG_GRP_TPAD, 1194 .reg_offset = 1, 1195 .reg_shift = 0, 1196 .reg_width = 8, 1197 .label = "lower horizontal calibration", 1198 }, 1199 { 1200 .name = "azoteq,upper-cal-y", 1201 .reg_grp = IQS7222_REG_GRP_TPAD, 1202 .reg_offset = 2, 1203 .reg_shift = 8, 1204 .reg_width = 8, 1205 .label = "upper vertical calibration", 1206 }, 1207 { 1208 .name = "azoteq,upper-cal-x", 1209 .reg_grp = IQS7222_REG_GRP_TPAD, 1210 .reg_offset = 2, 1211 .reg_shift = 0, 1212 .reg_width = 8, 1213 .label = "upper horizontal calibration", 1214 }, 1215 { 1216 .name = "azoteq,top-speed", 1217 .reg_grp = IQS7222_REG_GRP_TPAD, 1218 .reg_offset = 3, 1219 .reg_shift = 8, 1220 .reg_width = 8, 1221 .val_pitch = 4, 1222 .label = "top speed", 1223 }, 1224 { 1225 .name = "azoteq,bottom-speed", 1226 .reg_grp = IQS7222_REG_GRP_TPAD, 1227 .reg_offset = 3, 1228 .reg_shift = 0, 1229 .reg_width = 8, 1230 .label = "bottom speed", 1231 }, 1232 { 1233 .name = "azoteq,gesture-min-ms", 1234 .reg_grp = IQS7222_REG_GRP_TPAD, 1235 .reg_key = IQS7222_REG_KEY_TAP, 1236 .reg_offset = 20, 1237 .reg_shift = 8, 1238 .reg_width = 8, 1239 .val_pitch = 16, 1240 .label = "minimum gesture time", 1241 }, 1242 { 1243 .name = "azoteq,gesture-max-ms", 1244 .reg_grp = IQS7222_REG_GRP_TPAD, 1245 .reg_key = IQS7222_REG_KEY_AXIAL, 1246 .reg_offset = 21, 1247 .reg_shift = 8, 1248 .reg_width = 8, 1249 .val_pitch = 16, 1250 .label = "maximum gesture time", 1251 }, 1252 { 1253 .name = "azoteq,gesture-max-ms", 1254 .reg_grp = IQS7222_REG_GRP_TPAD, 1255 .reg_key = IQS7222_REG_KEY_TAP, 1256 .reg_offset = 21, 1257 .reg_shift = 0, 1258 .reg_width = 8, 1259 .val_pitch = 16, 1260 .label = "maximum gesture time", 1261 }, 1262 { 1263 .name = "azoteq,gesture-dist", 1264 .reg_grp = IQS7222_REG_GRP_TPAD, 1265 .reg_key = IQS7222_REG_KEY_TAP, 1266 .reg_offset = 22, 1267 .reg_shift = 0, 1268 .reg_width = 16, 1269 .label = "gesture distance", 1270 }, 1271 { 1272 .name = "azoteq,gesture-dist", 1273 .reg_grp = IQS7222_REG_GRP_TPAD, 1274 .reg_key = IQS7222_REG_KEY_AXIAL, 1275 .reg_offset = 23, 1276 .reg_shift = 0, 1277 .reg_width = 16, 1278 .label = "gesture distance", 1279 }, 1280 { 1281 .name = "drive-open-drain", 1282 .reg_grp = IQS7222_REG_GRP_GPIO, 1283 .reg_offset = 0, 1284 .reg_shift = 1, 1285 .reg_width = 1, 1286 }, 1287 { 1288 .name = "azoteq,timeout-ati-ms", 1289 .reg_grp = IQS7222_REG_GRP_SYS, 1290 .reg_offset = 1, 1291 .reg_shift = 0, 1292 .reg_width = 16, 1293 .val_pitch = 500, 1294 .label = "ATI error timeout", 1295 }, 1296 { 1297 .name = "azoteq,rate-ati-ms", 1298 .reg_grp = IQS7222_REG_GRP_SYS, 1299 .reg_offset = 2, 1300 .reg_shift = 0, 1301 .reg_width = 16, 1302 .label = "ATI report rate", 1303 }, 1304 { 1305 .name = "azoteq,timeout-np-ms", 1306 .reg_grp = IQS7222_REG_GRP_SYS, 1307 .reg_offset = 3, 1308 .reg_shift = 0, 1309 .reg_width = 16, 1310 .label = "normal-power mode timeout", 1311 }, 1312 { 1313 .name = "azoteq,rate-np-ms", 1314 .reg_grp = IQS7222_REG_GRP_SYS, 1315 .reg_offset = 4, 1316 .reg_shift = 0, 1317 .reg_width = 16, 1318 .val_max = 3000, 1319 .label = "normal-power mode report rate", 1320 }, 1321 { 1322 .name = "azoteq,timeout-lp-ms", 1323 .reg_grp = IQS7222_REG_GRP_SYS, 1324 .reg_offset = 5, 1325 .reg_shift = 0, 1326 .reg_width = 16, 1327 .label = "low-power mode timeout", 1328 }, 1329 { 1330 .name = "azoteq,rate-lp-ms", 1331 .reg_grp = IQS7222_REG_GRP_SYS, 1332 .reg_offset = 6, 1333 .reg_shift = 0, 1334 .reg_width = 16, 1335 .val_max = 3000, 1336 .label = "low-power mode report rate", 1337 }, 1338 { 1339 .name = "azoteq,timeout-ulp-ms", 1340 .reg_grp = IQS7222_REG_GRP_SYS, 1341 .reg_offset = 7, 1342 .reg_shift = 0, 1343 .reg_width = 16, 1344 .label = "ultra-low-power mode timeout", 1345 }, 1346 { 1347 .name = "azoteq,rate-ulp-ms", 1348 .reg_grp = IQS7222_REG_GRP_SYS, 1349 .reg_offset = 8, 1350 .reg_shift = 0, 1351 .reg_width = 16, 1352 .val_max = 3000, 1353 .label = "ultra-low-power mode report rate", 1354 }, 1355 }; 1356 1357 struct iqs7222_private { 1358 const struct iqs7222_dev_desc *dev_desc; 1359 struct gpio_desc *reset_gpio; 1360 struct gpio_desc *irq_gpio; 1361 struct i2c_client *client; 1362 struct input_dev *keypad; 1363 struct touchscreen_properties prop; 1364 unsigned int kp_type[IQS7222_MAX_CHAN][ARRAY_SIZE(iqs7222_kp_events)]; 1365 unsigned int kp_code[IQS7222_MAX_CHAN][ARRAY_SIZE(iqs7222_kp_events)]; 1366 unsigned int sl_code[IQS7222_MAX_SLDR][ARRAY_SIZE(iqs7222_sl_events)]; 1367 unsigned int sl_axis[IQS7222_MAX_SLDR]; 1368 unsigned int tp_code[ARRAY_SIZE(iqs7222_tp_events)]; 1369 u16 cycle_setup[IQS7222_MAX_CHAN / 2][IQS7222_MAX_COLS_CYCLE]; 1370 u16 glbl_setup[IQS7222_MAX_COLS_GLBL]; 1371 u16 btn_setup[IQS7222_MAX_CHAN][IQS7222_MAX_COLS_BTN]; 1372 u16 chan_setup[IQS7222_MAX_CHAN][IQS7222_MAX_COLS_CHAN]; 1373 u16 filt_setup[IQS7222_MAX_COLS_FILT]; 1374 u16 sldr_setup[IQS7222_MAX_SLDR][IQS7222_MAX_COLS_SLDR]; 1375 u16 tpad_setup[IQS7222_MAX_COLS_TPAD]; 1376 u16 gpio_setup[ARRAY_SIZE(iqs7222_gpio_links)][IQS7222_MAX_COLS_GPIO]; 1377 u16 sys_setup[IQS7222_MAX_COLS_SYS]; 1378 }; 1379 1380 static u16 *iqs7222_setup(struct iqs7222_private *iqs7222, 1381 enum iqs7222_reg_grp_id reg_grp, int row) 1382 { 1383 switch (reg_grp) { 1384 case IQS7222_REG_GRP_CYCLE: 1385 return iqs7222->cycle_setup[row]; 1386 1387 case IQS7222_REG_GRP_GLBL: 1388 return iqs7222->glbl_setup; 1389 1390 case IQS7222_REG_GRP_BTN: 1391 return iqs7222->btn_setup[row]; 1392 1393 case IQS7222_REG_GRP_CHAN: 1394 return iqs7222->chan_setup[row]; 1395 1396 case IQS7222_REG_GRP_FILT: 1397 return iqs7222->filt_setup; 1398 1399 case IQS7222_REG_GRP_SLDR: 1400 return iqs7222->sldr_setup[row]; 1401 1402 case IQS7222_REG_GRP_TPAD: 1403 return iqs7222->tpad_setup; 1404 1405 case IQS7222_REG_GRP_GPIO: 1406 return iqs7222->gpio_setup[row]; 1407 1408 case IQS7222_REG_GRP_SYS: 1409 return iqs7222->sys_setup; 1410 1411 default: 1412 return NULL; 1413 } 1414 } 1415 1416 static int iqs7222_irq_poll(struct iqs7222_private *iqs7222, u16 timeout_ms) 1417 { 1418 ktime_t irq_timeout = ktime_add_ms(ktime_get(), timeout_ms); 1419 int ret; 1420 1421 do { 1422 usleep_range(1000, 1100); 1423 1424 ret = gpiod_get_value_cansleep(iqs7222->irq_gpio); 1425 if (ret < 0) 1426 return ret; 1427 else if (ret > 0) 1428 return 0; 1429 } while (ktime_compare(ktime_get(), irq_timeout) < 0); 1430 1431 return -EBUSY; 1432 } 1433 1434 static int iqs7222_hard_reset(struct iqs7222_private *iqs7222) 1435 { 1436 struct i2c_client *client = iqs7222->client; 1437 int error; 1438 1439 if (!iqs7222->reset_gpio) 1440 return 0; 1441 1442 gpiod_set_value_cansleep(iqs7222->reset_gpio, 1); 1443 usleep_range(1000, 1100); 1444 1445 gpiod_set_value_cansleep(iqs7222->reset_gpio, 0); 1446 1447 error = iqs7222_irq_poll(iqs7222, IQS7222_RESET_TIMEOUT_MS); 1448 if (error) 1449 dev_err(&client->dev, "Failed to reset device: %d\n", error); 1450 1451 return error; 1452 } 1453 1454 static int iqs7222_force_comms(struct iqs7222_private *iqs7222) 1455 { 1456 u8 msg_buf[] = { 0xFF, }; 1457 int ret; 1458 1459 /* 1460 * The device cannot communicate until it asserts its interrupt (RDY) 1461 * pin. Attempts to do so while RDY is deasserted return an ACK; how- 1462 * ever all write data is ignored, and all read data returns 0xEE. 1463 * 1464 * Unsolicited communication must be preceded by a special force com- 1465 * munication command, after which the device eventually asserts its 1466 * RDY pin and agrees to communicate. 1467 * 1468 * Regardless of whether communication is forced or the result of an 1469 * interrupt, the device automatically deasserts its RDY pin once it 1470 * detects an I2C stop condition, or a timeout expires. 1471 */ 1472 ret = gpiod_get_value_cansleep(iqs7222->irq_gpio); 1473 if (ret < 0) 1474 return ret; 1475 else if (ret > 0) 1476 return 0; 1477 1478 ret = i2c_master_send(iqs7222->client, msg_buf, sizeof(msg_buf)); 1479 if (ret < (int)sizeof(msg_buf)) { 1480 if (ret >= 0) 1481 ret = -EIO; 1482 1483 /* 1484 * The datasheet states that the host must wait to retry any 1485 * failed attempt to communicate over I2C. 1486 */ 1487 msleep(IQS7222_COMMS_RETRY_MS); 1488 return ret; 1489 } 1490 1491 return iqs7222_irq_poll(iqs7222, IQS7222_COMMS_TIMEOUT_MS); 1492 } 1493 1494 static int iqs7222_read_burst(struct iqs7222_private *iqs7222, 1495 u16 reg, void *val, u16 num_val) 1496 { 1497 u8 reg_buf[sizeof(__be16)]; 1498 int ret, i; 1499 struct i2c_client *client = iqs7222->client; 1500 struct i2c_msg msg[] = { 1501 { 1502 .addr = client->addr, 1503 .flags = 0, 1504 .len = reg > U8_MAX ? sizeof(reg) : sizeof(u8), 1505 .buf = reg_buf, 1506 }, 1507 { 1508 .addr = client->addr, 1509 .flags = I2C_M_RD, 1510 .len = num_val * sizeof(__le16), 1511 .buf = (u8 *)val, 1512 }, 1513 }; 1514 1515 if (reg > U8_MAX) 1516 put_unaligned_be16(reg, reg_buf); 1517 else 1518 *reg_buf = (u8)reg; 1519 1520 /* 1521 * The following loop protects against an edge case in which the RDY 1522 * pin is automatically deasserted just as the read is initiated. In 1523 * that case, the read must be retried using forced communication. 1524 */ 1525 for (i = 0; i < IQS7222_NUM_RETRIES; i++) { 1526 ret = iqs7222_force_comms(iqs7222); 1527 if (ret < 0) 1528 continue; 1529 1530 ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)); 1531 if (ret < (int)ARRAY_SIZE(msg)) { 1532 if (ret >= 0) 1533 ret = -EIO; 1534 1535 msleep(IQS7222_COMMS_RETRY_MS); 1536 continue; 1537 } 1538 1539 if (get_unaligned_le16(msg[1].buf) == IQS7222_COMMS_ERROR) { 1540 ret = -ENODATA; 1541 continue; 1542 } 1543 1544 ret = 0; 1545 break; 1546 } 1547 1548 /* 1549 * The following delay ensures the device has deasserted the RDY pin 1550 * following the I2C stop condition. 1551 */ 1552 usleep_range(50, 100); 1553 1554 if (ret < 0) 1555 dev_err(&client->dev, 1556 "Failed to read from address 0x%04X: %d\n", reg, ret); 1557 1558 return ret; 1559 } 1560 1561 static int iqs7222_read_word(struct iqs7222_private *iqs7222, u16 reg, u16 *val) 1562 { 1563 __le16 val_buf; 1564 int error; 1565 1566 error = iqs7222_read_burst(iqs7222, reg, &val_buf, 1); 1567 if (error) 1568 return error; 1569 1570 *val = le16_to_cpu(val_buf); 1571 1572 return 0; 1573 } 1574 1575 static int iqs7222_write_burst(struct iqs7222_private *iqs7222, 1576 u16 reg, const void *val, u16 num_val) 1577 { 1578 int reg_len = reg > U8_MAX ? sizeof(reg) : sizeof(u8); 1579 int val_len = num_val * sizeof(__le16); 1580 int msg_len = reg_len + val_len; 1581 int ret, i; 1582 struct i2c_client *client = iqs7222->client; 1583 u8 *msg_buf; 1584 1585 msg_buf = kzalloc(msg_len, GFP_KERNEL); 1586 if (!msg_buf) 1587 return -ENOMEM; 1588 1589 if (reg > U8_MAX) 1590 put_unaligned_be16(reg, msg_buf); 1591 else 1592 *msg_buf = (u8)reg; 1593 1594 memcpy(msg_buf + reg_len, val, val_len); 1595 1596 /* 1597 * The following loop protects against an edge case in which the RDY 1598 * pin is automatically asserted just before the force communication 1599 * command is sent. 1600 * 1601 * In that case, the subsequent I2C stop condition tricks the device 1602 * into preemptively deasserting the RDY pin and the command must be 1603 * sent again. 1604 */ 1605 for (i = 0; i < IQS7222_NUM_RETRIES; i++) { 1606 ret = iqs7222_force_comms(iqs7222); 1607 if (ret < 0) 1608 continue; 1609 1610 ret = i2c_master_send(client, msg_buf, msg_len); 1611 if (ret < msg_len) { 1612 if (ret >= 0) 1613 ret = -EIO; 1614 1615 msleep(IQS7222_COMMS_RETRY_MS); 1616 continue; 1617 } 1618 1619 ret = 0; 1620 break; 1621 } 1622 1623 kfree(msg_buf); 1624 1625 usleep_range(50, 100); 1626 1627 if (ret < 0) 1628 dev_err(&client->dev, 1629 "Failed to write to address 0x%04X: %d\n", reg, ret); 1630 1631 return ret; 1632 } 1633 1634 static int iqs7222_write_word(struct iqs7222_private *iqs7222, u16 reg, u16 val) 1635 { 1636 __le16 val_buf = cpu_to_le16(val); 1637 1638 return iqs7222_write_burst(iqs7222, reg, &val_buf, 1); 1639 } 1640 1641 static int iqs7222_ati_trigger(struct iqs7222_private *iqs7222) 1642 { 1643 struct i2c_client *client = iqs7222->client; 1644 ktime_t ati_timeout; 1645 u16 sys_status = 0; 1646 u16 sys_setup; 1647 int error, i; 1648 1649 /* 1650 * The reserved fields of the system setup register may have changed 1651 * as a result of other registers having been written. As such, read 1652 * the register's latest value to avoid unexpected behavior when the 1653 * register is written in the loop that follows. 1654 */ 1655 error = iqs7222_read_word(iqs7222, IQS7222_SYS_SETUP, &sys_setup); 1656 if (error) 1657 return error; 1658 1659 for (i = 0; i < IQS7222_NUM_RETRIES; i++) { 1660 /* 1661 * Trigger ATI from streaming and normal-power modes so that 1662 * the RDY pin continues to be asserted during ATI. 1663 */ 1664 error = iqs7222_write_word(iqs7222, IQS7222_SYS_SETUP, 1665 sys_setup | 1666 IQS7222_SYS_SETUP_REDO_ATI); 1667 if (error) 1668 return error; 1669 1670 ati_timeout = ktime_add_ms(ktime_get(), IQS7222_ATI_TIMEOUT_MS); 1671 1672 do { 1673 error = iqs7222_irq_poll(iqs7222, 1674 IQS7222_COMMS_TIMEOUT_MS); 1675 if (error) 1676 continue; 1677 1678 error = iqs7222_read_word(iqs7222, IQS7222_SYS_STATUS, 1679 &sys_status); 1680 if (error) 1681 return error; 1682 1683 if (sys_status & IQS7222_SYS_STATUS_RESET) 1684 return 0; 1685 1686 if (sys_status & IQS7222_SYS_STATUS_ATI_ERROR) 1687 break; 1688 1689 if (sys_status & IQS7222_SYS_STATUS_ATI_ACTIVE) 1690 continue; 1691 1692 /* 1693 * Use stream-in-touch mode if either slider reports 1694 * absolute position. 1695 */ 1696 sys_setup |= test_bit(EV_ABS, iqs7222->keypad->evbit) 1697 ? IQS7222_SYS_SETUP_INTF_MODE_TOUCH 1698 : IQS7222_SYS_SETUP_INTF_MODE_EVENT; 1699 sys_setup |= IQS7222_SYS_SETUP_PWR_MODE_AUTO; 1700 1701 return iqs7222_write_word(iqs7222, IQS7222_SYS_SETUP, 1702 sys_setup); 1703 } while (ktime_compare(ktime_get(), ati_timeout) < 0); 1704 1705 dev_err(&client->dev, 1706 "ATI attempt %d of %d failed with status 0x%02X, %s\n", 1707 i + 1, IQS7222_NUM_RETRIES, (u8)sys_status, 1708 i + 1 < IQS7222_NUM_RETRIES ? "retrying" : "stopping"); 1709 } 1710 1711 return -ETIMEDOUT; 1712 } 1713 1714 static int iqs7222_dev_init(struct iqs7222_private *iqs7222, int dir) 1715 { 1716 const struct iqs7222_dev_desc *dev_desc = iqs7222->dev_desc; 1717 int comms_offset = dev_desc->comms_offset; 1718 int error, i, j, k; 1719 1720 /* 1721 * Acknowledge reset before writing any registers in case the device 1722 * suffers a spurious reset during initialization. Because this step 1723 * may change the reserved fields of the second filter beta register, 1724 * its cache must be updated. 1725 * 1726 * Writing the second filter beta register, in turn, may clobber the 1727 * system status register. As such, the filter beta register pair is 1728 * written first to protect against this hazard. 1729 */ 1730 if (dir == WRITE) { 1731 u16 reg = dev_desc->reg_grps[IQS7222_REG_GRP_FILT].base + 1; 1732 u16 filt_setup; 1733 1734 error = iqs7222_write_word(iqs7222, IQS7222_SYS_SETUP, 1735 iqs7222->sys_setup[0] | 1736 IQS7222_SYS_SETUP_ACK_RESET); 1737 if (error) 1738 return error; 1739 1740 error = iqs7222_read_word(iqs7222, reg, &filt_setup); 1741 if (error) 1742 return error; 1743 1744 iqs7222->filt_setup[1] &= GENMASK(7, 0); 1745 iqs7222->filt_setup[1] |= (filt_setup & ~GENMASK(7, 0)); 1746 } 1747 1748 /* 1749 * Take advantage of the stop-bit disable function, if available, to 1750 * save the trouble of having to reopen a communication window after 1751 * each burst read or write. 1752 */ 1753 if (comms_offset) { 1754 u16 comms_setup; 1755 1756 error = iqs7222_read_word(iqs7222, 1757 IQS7222_SYS_SETUP + comms_offset, 1758 &comms_setup); 1759 if (error) 1760 return error; 1761 1762 error = iqs7222_write_word(iqs7222, 1763 IQS7222_SYS_SETUP + comms_offset, 1764 comms_setup | IQS7222_COMMS_HOLD); 1765 if (error) 1766 return error; 1767 } 1768 1769 for (i = 0; i < IQS7222_NUM_REG_GRPS; i++) { 1770 int num_row = dev_desc->reg_grps[i].num_row; 1771 int num_col = dev_desc->reg_grps[i].num_col; 1772 u16 reg = dev_desc->reg_grps[i].base; 1773 __le16 *val_buf; 1774 u16 *val; 1775 1776 if (!num_col) 1777 continue; 1778 1779 val = iqs7222_setup(iqs7222, i, 0); 1780 if (!val) 1781 continue; 1782 1783 val_buf = kcalloc(num_col, sizeof(__le16), GFP_KERNEL); 1784 if (!val_buf) 1785 return -ENOMEM; 1786 1787 for (j = 0; j < num_row; j++) { 1788 switch (dir) { 1789 case READ: 1790 error = iqs7222_read_burst(iqs7222, reg, 1791 val_buf, num_col); 1792 for (k = 0; k < num_col; k++) 1793 val[k] = le16_to_cpu(val_buf[k]); 1794 break; 1795 1796 case WRITE: 1797 for (k = 0; k < num_col; k++) 1798 val_buf[k] = cpu_to_le16(val[k]); 1799 error = iqs7222_write_burst(iqs7222, reg, 1800 val_buf, num_col); 1801 break; 1802 1803 default: 1804 error = -EINVAL; 1805 } 1806 1807 if (error) 1808 break; 1809 1810 reg += IQS7222_REG_OFFSET; 1811 val += iqs7222_max_cols[i]; 1812 } 1813 1814 kfree(val_buf); 1815 1816 if (error) 1817 return error; 1818 } 1819 1820 if (comms_offset) { 1821 u16 comms_setup; 1822 1823 error = iqs7222_read_word(iqs7222, 1824 IQS7222_SYS_SETUP + comms_offset, 1825 &comms_setup); 1826 if (error) 1827 return error; 1828 1829 error = iqs7222_write_word(iqs7222, 1830 IQS7222_SYS_SETUP + comms_offset, 1831 comms_setup & ~IQS7222_COMMS_HOLD); 1832 if (error) 1833 return error; 1834 } 1835 1836 if (dir == READ) { 1837 iqs7222->sys_setup[0] &= ~IQS7222_SYS_SETUP_INTF_MODE_MASK; 1838 iqs7222->sys_setup[0] &= ~IQS7222_SYS_SETUP_PWR_MODE_MASK; 1839 return 0; 1840 } 1841 1842 return iqs7222_ati_trigger(iqs7222); 1843 } 1844 1845 static int iqs7222_dev_info(struct iqs7222_private *iqs7222) 1846 { 1847 struct i2c_client *client = iqs7222->client; 1848 bool prod_num_valid = false; 1849 __le16 dev_id[3]; 1850 int error, i; 1851 1852 error = iqs7222_read_burst(iqs7222, IQS7222_PROD_NUM, dev_id, 1853 ARRAY_SIZE(dev_id)); 1854 if (error) 1855 return error; 1856 1857 for (i = 0; i < ARRAY_SIZE(iqs7222_devs); i++) { 1858 if (le16_to_cpu(dev_id[0]) != iqs7222_devs[i].prod_num) 1859 continue; 1860 1861 prod_num_valid = true; 1862 1863 if (le16_to_cpu(dev_id[1]) < iqs7222_devs[i].fw_major) 1864 continue; 1865 1866 if (le16_to_cpu(dev_id[2]) < iqs7222_devs[i].fw_minor) 1867 continue; 1868 1869 iqs7222->dev_desc = &iqs7222_devs[i]; 1870 return 0; 1871 } 1872 1873 if (prod_num_valid) 1874 dev_err(&client->dev, "Unsupported firmware revision: %u.%u\n", 1875 le16_to_cpu(dev_id[1]), le16_to_cpu(dev_id[2])); 1876 else 1877 dev_err(&client->dev, "Unrecognized product number: %u\n", 1878 le16_to_cpu(dev_id[0])); 1879 1880 return -EINVAL; 1881 } 1882 1883 static int iqs7222_gpio_select(struct iqs7222_private *iqs7222, 1884 struct fwnode_handle *child_node, 1885 int child_enable, u16 child_link) 1886 { 1887 const struct iqs7222_dev_desc *dev_desc = iqs7222->dev_desc; 1888 struct i2c_client *client = iqs7222->client; 1889 int num_gpio = dev_desc->reg_grps[IQS7222_REG_GRP_GPIO].num_row; 1890 int error, count, i; 1891 unsigned int gpio_sel[ARRAY_SIZE(iqs7222_gpio_links)]; 1892 1893 if (!num_gpio) 1894 return 0; 1895 1896 if (!fwnode_property_present(child_node, "azoteq,gpio-select")) 1897 return 0; 1898 1899 count = fwnode_property_count_u32(child_node, "azoteq,gpio-select"); 1900 if (count > num_gpio) { 1901 dev_err(&client->dev, "Invalid number of %s GPIOs\n", 1902 fwnode_get_name(child_node)); 1903 return -EINVAL; 1904 } else if (count < 0) { 1905 dev_err(&client->dev, "Failed to count %s GPIOs: %d\n", 1906 fwnode_get_name(child_node), count); 1907 return count; 1908 } 1909 1910 error = fwnode_property_read_u32_array(child_node, 1911 "azoteq,gpio-select", 1912 gpio_sel, count); 1913 if (error) { 1914 dev_err(&client->dev, "Failed to read %s GPIOs: %d\n", 1915 fwnode_get_name(child_node), error); 1916 return error; 1917 } 1918 1919 for (i = 0; i < count; i++) { 1920 u16 *gpio_setup; 1921 1922 if (gpio_sel[i] >= num_gpio) { 1923 dev_err(&client->dev, "Invalid %s GPIO: %u\n", 1924 fwnode_get_name(child_node), gpio_sel[i]); 1925 return -EINVAL; 1926 } 1927 1928 gpio_setup = iqs7222->gpio_setup[gpio_sel[i]]; 1929 1930 if (gpio_setup[2] && child_link != gpio_setup[2]) { 1931 dev_err(&client->dev, 1932 "Conflicting GPIO %u event types\n", 1933 gpio_sel[i]); 1934 return -EINVAL; 1935 } 1936 1937 gpio_setup[0] |= IQS7222_GPIO_SETUP_0_GPIO_EN; 1938 gpio_setup[1] |= child_enable; 1939 gpio_setup[2] = child_link; 1940 } 1941 1942 return 0; 1943 } 1944 1945 static int iqs7222_parse_props(struct iqs7222_private *iqs7222, 1946 struct fwnode_handle *reg_grp_node, 1947 int reg_grp_index, 1948 enum iqs7222_reg_grp_id reg_grp, 1949 enum iqs7222_reg_key_id reg_key) 1950 { 1951 u16 *setup = iqs7222_setup(iqs7222, reg_grp, reg_grp_index); 1952 struct i2c_client *client = iqs7222->client; 1953 int i; 1954 1955 if (!setup) 1956 return 0; 1957 1958 for (i = 0; i < ARRAY_SIZE(iqs7222_props); i++) { 1959 const char *name = iqs7222_props[i].name; 1960 int reg_offset = iqs7222_props[i].reg_offset; 1961 int reg_shift = iqs7222_props[i].reg_shift; 1962 int reg_width = iqs7222_props[i].reg_width; 1963 int val_pitch = iqs7222_props[i].val_pitch ? : 1; 1964 int val_min = iqs7222_props[i].val_min; 1965 int val_max = iqs7222_props[i].val_max; 1966 bool invert = iqs7222_props[i].invert; 1967 const char *label = iqs7222_props[i].label ? : name; 1968 unsigned int val; 1969 int error; 1970 1971 if (iqs7222_props[i].reg_grp != reg_grp || 1972 iqs7222_props[i].reg_key != reg_key) 1973 continue; 1974 1975 /* 1976 * Boolean register fields are one bit wide; they are forcibly 1977 * reset to provide a means to undo changes by a bootloader if 1978 * necessary. 1979 * 1980 * Scalar fields, on the other hand, are left untouched unless 1981 * their corresponding properties are present. 1982 */ 1983 if (reg_width == 1) { 1984 if (invert) 1985 setup[reg_offset] |= BIT(reg_shift); 1986 else 1987 setup[reg_offset] &= ~BIT(reg_shift); 1988 } 1989 1990 if (!fwnode_property_present(reg_grp_node, name)) 1991 continue; 1992 1993 if (reg_width == 1) { 1994 if (invert) 1995 setup[reg_offset] &= ~BIT(reg_shift); 1996 else 1997 setup[reg_offset] |= BIT(reg_shift); 1998 1999 continue; 2000 } 2001 2002 error = fwnode_property_read_u32(reg_grp_node, name, &val); 2003 if (error) { 2004 dev_err(&client->dev, "Failed to read %s %s: %d\n", 2005 fwnode_get_name(reg_grp_node), label, error); 2006 return error; 2007 } 2008 2009 if (!val_max) 2010 val_max = GENMASK(reg_width - 1, 0) * val_pitch; 2011 2012 if (val < val_min || val > val_max) { 2013 dev_err(&client->dev, "Invalid %s %s: %u\n", 2014 fwnode_get_name(reg_grp_node), label, val); 2015 return -EINVAL; 2016 } 2017 2018 setup[reg_offset] &= ~GENMASK(reg_shift + reg_width - 1, 2019 reg_shift); 2020 setup[reg_offset] |= (val / val_pitch << reg_shift); 2021 } 2022 2023 return 0; 2024 } 2025 2026 static int iqs7222_parse_event(struct iqs7222_private *iqs7222, 2027 struct fwnode_handle *event_node, 2028 int reg_grp_index, 2029 enum iqs7222_reg_grp_id reg_grp, 2030 enum iqs7222_reg_key_id reg_key, 2031 u16 event_enable, u16 event_link, 2032 unsigned int *event_type, 2033 unsigned int *event_code) 2034 { 2035 struct i2c_client *client = iqs7222->client; 2036 int error; 2037 2038 error = iqs7222_parse_props(iqs7222, event_node, reg_grp_index, 2039 reg_grp, reg_key); 2040 if (error) 2041 return error; 2042 2043 error = iqs7222_gpio_select(iqs7222, event_node, event_enable, 2044 event_link); 2045 if (error) 2046 return error; 2047 2048 error = fwnode_property_read_u32(event_node, "linux,code", event_code); 2049 if (error == -EINVAL) { 2050 return 0; 2051 } else if (error) { 2052 dev_err(&client->dev, "Failed to read %s code: %d\n", 2053 fwnode_get_name(event_node), error); 2054 return error; 2055 } 2056 2057 if (!event_type) { 2058 input_set_capability(iqs7222->keypad, EV_KEY, *event_code); 2059 return 0; 2060 } 2061 2062 error = fwnode_property_read_u32(event_node, "linux,input-type", 2063 event_type); 2064 if (error == -EINVAL) { 2065 *event_type = EV_KEY; 2066 } else if (error) { 2067 dev_err(&client->dev, "Failed to read %s input type: %d\n", 2068 fwnode_get_name(event_node), error); 2069 return error; 2070 } else if (*event_type != EV_KEY && *event_type != EV_SW) { 2071 dev_err(&client->dev, "Invalid %s input type: %d\n", 2072 fwnode_get_name(event_node), *event_type); 2073 return -EINVAL; 2074 } 2075 2076 input_set_capability(iqs7222->keypad, *event_type, *event_code); 2077 2078 return 0; 2079 } 2080 2081 static int iqs7222_parse_cycle(struct iqs7222_private *iqs7222, 2082 struct fwnode_handle *cycle_node, int cycle_index) 2083 { 2084 u16 *cycle_setup = iqs7222->cycle_setup[cycle_index]; 2085 struct i2c_client *client = iqs7222->client; 2086 unsigned int pins[9]; 2087 int error, count, i; 2088 2089 /* 2090 * Each channel shares a cycle with one other channel; the mapping of 2091 * channels to cycles is fixed. Properties defined for a cycle impact 2092 * both channels tied to the cycle. 2093 * 2094 * Unlike channels which are restricted to a select range of CRx pins 2095 * based on channel number, any cycle can claim any of the device's 9 2096 * CTx pins (CTx0-8). 2097 */ 2098 if (!fwnode_property_present(cycle_node, "azoteq,tx-enable")) 2099 return 0; 2100 2101 count = fwnode_property_count_u32(cycle_node, "azoteq,tx-enable"); 2102 if (count < 0) { 2103 dev_err(&client->dev, "Failed to count %s CTx pins: %d\n", 2104 fwnode_get_name(cycle_node), count); 2105 return count; 2106 } else if (count > ARRAY_SIZE(pins)) { 2107 dev_err(&client->dev, "Invalid number of %s CTx pins\n", 2108 fwnode_get_name(cycle_node)); 2109 return -EINVAL; 2110 } 2111 2112 error = fwnode_property_read_u32_array(cycle_node, "azoteq,tx-enable", 2113 pins, count); 2114 if (error) { 2115 dev_err(&client->dev, "Failed to read %s CTx pins: %d\n", 2116 fwnode_get_name(cycle_node), error); 2117 return error; 2118 } 2119 2120 cycle_setup[1] &= ~GENMASK(7 + ARRAY_SIZE(pins) - 1, 7); 2121 2122 for (i = 0; i < count; i++) { 2123 if (pins[i] > 8) { 2124 dev_err(&client->dev, "Invalid %s CTx pin: %u\n", 2125 fwnode_get_name(cycle_node), pins[i]); 2126 return -EINVAL; 2127 } 2128 2129 cycle_setup[1] |= BIT(pins[i] + 7); 2130 } 2131 2132 return 0; 2133 } 2134 2135 static int iqs7222_parse_chan(struct iqs7222_private *iqs7222, 2136 struct fwnode_handle *chan_node, int chan_index) 2137 { 2138 const struct iqs7222_dev_desc *dev_desc = iqs7222->dev_desc; 2139 struct i2c_client *client = iqs7222->client; 2140 int num_chan = dev_desc->reg_grps[IQS7222_REG_GRP_CHAN].num_row; 2141 int ext_chan = rounddown(num_chan, 10); 2142 int error, i; 2143 u16 *chan_setup = iqs7222->chan_setup[chan_index]; 2144 u16 *sys_setup = iqs7222->sys_setup; 2145 unsigned int val; 2146 2147 if (dev_desc->allow_offset && 2148 fwnode_property_present(chan_node, "azoteq,ulp-allow")) 2149 sys_setup[dev_desc->allow_offset] &= ~BIT(chan_index); 2150 2151 chan_setup[0] |= IQS7222_CHAN_SETUP_0_CHAN_EN; 2152 2153 /* 2154 * The reference channel function allows for differential measurements 2155 * and is only available in the case of IQS7222A or IQS7222C. 2156 */ 2157 if (dev_desc->reg_grps[IQS7222_REG_GRP_CHAN].num_col > 4 && 2158 fwnode_property_present(chan_node, "azoteq,ref-select")) { 2159 u16 *ref_setup; 2160 2161 error = fwnode_property_read_u32(chan_node, "azoteq,ref-select", 2162 &val); 2163 if (error) { 2164 dev_err(&client->dev, 2165 "Failed to read %s reference channel: %d\n", 2166 fwnode_get_name(chan_node), error); 2167 return error; 2168 } 2169 2170 if (val >= ext_chan) { 2171 dev_err(&client->dev, 2172 "Invalid %s reference channel: %u\n", 2173 fwnode_get_name(chan_node), val); 2174 return -EINVAL; 2175 } 2176 2177 ref_setup = iqs7222->chan_setup[val]; 2178 2179 /* 2180 * Configure the current channel as a follower of the selected 2181 * reference channel. 2182 */ 2183 chan_setup[0] |= IQS7222_CHAN_SETUP_0_REF_MODE_FOLLOW; 2184 chan_setup[4] = val * 42 + 1048; 2185 2186 error = fwnode_property_read_u32(chan_node, "azoteq,ref-weight", 2187 &val); 2188 if (!error) { 2189 if (val > U16_MAX) { 2190 dev_err(&client->dev, 2191 "Invalid %s reference weight: %u\n", 2192 fwnode_get_name(chan_node), val); 2193 return -EINVAL; 2194 } 2195 2196 chan_setup[5] = val; 2197 } else if (error != -EINVAL) { 2198 dev_err(&client->dev, 2199 "Failed to read %s reference weight: %d\n", 2200 fwnode_get_name(chan_node), error); 2201 return error; 2202 } 2203 2204 /* 2205 * Configure the selected channel as a reference channel which 2206 * serves the current channel. 2207 */ 2208 ref_setup[0] |= IQS7222_CHAN_SETUP_0_REF_MODE_REF; 2209 ref_setup[5] |= BIT(chan_index); 2210 2211 ref_setup[4] = dev_desc->touch_link; 2212 if (fwnode_property_present(chan_node, "azoteq,use-prox")) 2213 ref_setup[4] -= 2; 2214 } else if (dev_desc->reg_grps[IQS7222_REG_GRP_TPAD].num_row && 2215 fwnode_property_present(chan_node, 2216 "azoteq,counts-filt-enable")) { 2217 /* 2218 * In the case of IQS7222D, however, the reference mode field 2219 * is partially repurposed as a counts filter enable control. 2220 */ 2221 chan_setup[0] |= IQS7222_CHAN_SETUP_0_REF_MODE_REF; 2222 } 2223 2224 if (fwnode_property_present(chan_node, "azoteq,rx-enable")) { 2225 /* 2226 * Each channel can claim up to 4 CRx pins. The first half of 2227 * the channels can use CRx0-3, while the second half can use 2228 * CRx4-7. 2229 */ 2230 unsigned int pins[4]; 2231 int count; 2232 2233 count = fwnode_property_count_u32(chan_node, 2234 "azoteq,rx-enable"); 2235 if (count < 0) { 2236 dev_err(&client->dev, 2237 "Failed to count %s CRx pins: %d\n", 2238 fwnode_get_name(chan_node), count); 2239 return count; 2240 } else if (count > ARRAY_SIZE(pins)) { 2241 dev_err(&client->dev, 2242 "Invalid number of %s CRx pins\n", 2243 fwnode_get_name(chan_node)); 2244 return -EINVAL; 2245 } 2246 2247 error = fwnode_property_read_u32_array(chan_node, 2248 "azoteq,rx-enable", 2249 pins, count); 2250 if (error) { 2251 dev_err(&client->dev, 2252 "Failed to read %s CRx pins: %d\n", 2253 fwnode_get_name(chan_node), error); 2254 return error; 2255 } 2256 2257 chan_setup[0] &= ~GENMASK(4 + ARRAY_SIZE(pins) - 1, 4); 2258 2259 for (i = 0; i < count; i++) { 2260 int min_crx = chan_index < ext_chan / 2 ? 0 : 4; 2261 2262 if (pins[i] < min_crx || pins[i] > min_crx + 3) { 2263 dev_err(&client->dev, 2264 "Invalid %s CRx pin: %u\n", 2265 fwnode_get_name(chan_node), pins[i]); 2266 return -EINVAL; 2267 } 2268 2269 chan_setup[0] |= BIT(pins[i] + 4 - min_crx); 2270 } 2271 } 2272 2273 for (i = 0; i < ARRAY_SIZE(iqs7222_kp_events); i++) { 2274 const char *event_name = iqs7222_kp_events[i].name; 2275 u16 event_enable = iqs7222_kp_events[i].enable; 2276 struct fwnode_handle *event_node; 2277 2278 event_node = fwnode_get_named_child_node(chan_node, event_name); 2279 if (!event_node) 2280 continue; 2281 2282 error = fwnode_property_read_u32(event_node, 2283 "azoteq,timeout-press-ms", 2284 &val); 2285 if (!error) { 2286 /* 2287 * The IQS7222B employs a global pair of press timeout 2288 * registers as opposed to channel-specific registers. 2289 */ 2290 u16 *setup = dev_desc->reg_grps 2291 [IQS7222_REG_GRP_BTN].num_col > 2 ? 2292 &iqs7222->btn_setup[chan_index][2] : 2293 &sys_setup[9]; 2294 2295 if (val > U8_MAX * 500) { 2296 dev_err(&client->dev, 2297 "Invalid %s press timeout: %u\n", 2298 fwnode_get_name(event_node), val); 2299 fwnode_handle_put(event_node); 2300 return -EINVAL; 2301 } 2302 2303 *setup &= ~(U8_MAX << i * 8); 2304 *setup |= (val / 500 << i * 8); 2305 } else if (error != -EINVAL) { 2306 dev_err(&client->dev, 2307 "Failed to read %s press timeout: %d\n", 2308 fwnode_get_name(event_node), error); 2309 fwnode_handle_put(event_node); 2310 return error; 2311 } 2312 2313 error = iqs7222_parse_event(iqs7222, event_node, chan_index, 2314 IQS7222_REG_GRP_BTN, 2315 iqs7222_kp_events[i].reg_key, 2316 BIT(chan_index), 2317 dev_desc->touch_link - (i ? 0 : 2), 2318 &iqs7222->kp_type[chan_index][i], 2319 &iqs7222->kp_code[chan_index][i]); 2320 fwnode_handle_put(event_node); 2321 if (error) 2322 return error; 2323 2324 if (!dev_desc->event_offset) 2325 continue; 2326 2327 sys_setup[dev_desc->event_offset] |= event_enable; 2328 } 2329 2330 /* 2331 * The following call handles a special pair of properties that apply 2332 * to a channel node, but reside within the button (event) group. 2333 */ 2334 return iqs7222_parse_props(iqs7222, chan_node, chan_index, 2335 IQS7222_REG_GRP_BTN, 2336 IQS7222_REG_KEY_DEBOUNCE); 2337 } 2338 2339 static int iqs7222_parse_sldr(struct iqs7222_private *iqs7222, 2340 struct fwnode_handle *sldr_node, int sldr_index) 2341 { 2342 const struct iqs7222_dev_desc *dev_desc = iqs7222->dev_desc; 2343 struct i2c_client *client = iqs7222->client; 2344 int num_chan = dev_desc->reg_grps[IQS7222_REG_GRP_CHAN].num_row; 2345 int ext_chan = rounddown(num_chan, 10); 2346 int count, error, reg_offset, i; 2347 u16 *event_mask = &iqs7222->sys_setup[dev_desc->event_offset]; 2348 u16 *sldr_setup = iqs7222->sldr_setup[sldr_index]; 2349 unsigned int chan_sel[4], val; 2350 2351 /* 2352 * Each slider can be spread across 3 to 4 channels. It is possible to 2353 * select only 2 channels, but doing so prevents the slider from using 2354 * the specified resolution. 2355 */ 2356 count = fwnode_property_count_u32(sldr_node, "azoteq,channel-select"); 2357 if (count < 0) { 2358 dev_err(&client->dev, "Failed to count %s channels: %d\n", 2359 fwnode_get_name(sldr_node), count); 2360 return count; 2361 } else if (count < 3 || count > ARRAY_SIZE(chan_sel)) { 2362 dev_err(&client->dev, "Invalid number of %s channels\n", 2363 fwnode_get_name(sldr_node)); 2364 return -EINVAL; 2365 } 2366 2367 error = fwnode_property_read_u32_array(sldr_node, 2368 "azoteq,channel-select", 2369 chan_sel, count); 2370 if (error) { 2371 dev_err(&client->dev, "Failed to read %s channels: %d\n", 2372 fwnode_get_name(sldr_node), error); 2373 return error; 2374 } 2375 2376 /* 2377 * Resolution and top speed, if small enough, are packed into a single 2378 * register. Otherwise, each occupies its own register and the rest of 2379 * the slider-related register addresses are offset by one. 2380 */ 2381 reg_offset = dev_desc->sldr_res < U16_MAX ? 0 : 1; 2382 2383 sldr_setup[0] |= count; 2384 sldr_setup[3 + reg_offset] &= ~GENMASK(ext_chan - 1, 0); 2385 2386 for (i = 0; i < ARRAY_SIZE(chan_sel); i++) { 2387 sldr_setup[5 + reg_offset + i] = 0; 2388 if (i >= count) 2389 continue; 2390 2391 if (chan_sel[i] >= ext_chan) { 2392 dev_err(&client->dev, "Invalid %s channel: %u\n", 2393 fwnode_get_name(sldr_node), chan_sel[i]); 2394 return -EINVAL; 2395 } 2396 2397 /* 2398 * The following fields indicate which channels participate in 2399 * the slider, as well as each channel's relative placement. 2400 */ 2401 sldr_setup[3 + reg_offset] |= BIT(chan_sel[i]); 2402 sldr_setup[5 + reg_offset + i] = chan_sel[i] * 42 + 1080; 2403 } 2404 2405 sldr_setup[4 + reg_offset] = dev_desc->touch_link; 2406 if (fwnode_property_present(sldr_node, "azoteq,use-prox")) 2407 sldr_setup[4 + reg_offset] -= 2; 2408 2409 error = fwnode_property_read_u32(sldr_node, "azoteq,slider-size", &val); 2410 if (!error) { 2411 if (val > dev_desc->sldr_res) { 2412 dev_err(&client->dev, "Invalid %s size: %u\n", 2413 fwnode_get_name(sldr_node), val); 2414 return -EINVAL; 2415 } 2416 2417 if (reg_offset) { 2418 sldr_setup[3] = val; 2419 } else { 2420 sldr_setup[2] &= ~IQS7222_SLDR_SETUP_2_RES_MASK; 2421 sldr_setup[2] |= (val / 16 << 2422 IQS7222_SLDR_SETUP_2_RES_SHIFT); 2423 } 2424 } else if (error != -EINVAL) { 2425 dev_err(&client->dev, "Failed to read %s size: %d\n", 2426 fwnode_get_name(sldr_node), error); 2427 return error; 2428 } 2429 2430 if (!(reg_offset ? sldr_setup[3] 2431 : sldr_setup[2] & IQS7222_SLDR_SETUP_2_RES_MASK)) { 2432 dev_err(&client->dev, "Undefined %s size\n", 2433 fwnode_get_name(sldr_node)); 2434 return -EINVAL; 2435 } 2436 2437 error = fwnode_property_read_u32(sldr_node, "azoteq,top-speed", &val); 2438 if (!error) { 2439 if (val > (reg_offset ? U16_MAX : U8_MAX * 4)) { 2440 dev_err(&client->dev, "Invalid %s top speed: %u\n", 2441 fwnode_get_name(sldr_node), val); 2442 return -EINVAL; 2443 } 2444 2445 if (reg_offset) { 2446 sldr_setup[2] = val; 2447 } else { 2448 sldr_setup[2] &= ~IQS7222_SLDR_SETUP_2_TOP_SPEED_MASK; 2449 sldr_setup[2] |= (val / 4); 2450 } 2451 } else if (error != -EINVAL) { 2452 dev_err(&client->dev, "Failed to read %s top speed: %d\n", 2453 fwnode_get_name(sldr_node), error); 2454 return error; 2455 } 2456 2457 error = fwnode_property_read_u32(sldr_node, "linux,axis", &val); 2458 if (!error) { 2459 u16 sldr_max = sldr_setup[3] - 1; 2460 2461 if (!reg_offset) { 2462 sldr_max = sldr_setup[2]; 2463 2464 sldr_max &= IQS7222_SLDR_SETUP_2_RES_MASK; 2465 sldr_max >>= IQS7222_SLDR_SETUP_2_RES_SHIFT; 2466 2467 sldr_max = sldr_max * 16 - 1; 2468 } 2469 2470 input_set_abs_params(iqs7222->keypad, val, 0, sldr_max, 0, 0); 2471 iqs7222->sl_axis[sldr_index] = val; 2472 } else if (error != -EINVAL) { 2473 dev_err(&client->dev, "Failed to read %s axis: %d\n", 2474 fwnode_get_name(sldr_node), error); 2475 return error; 2476 } 2477 2478 if (dev_desc->wheel_enable) { 2479 sldr_setup[0] &= ~dev_desc->wheel_enable; 2480 if (iqs7222->sl_axis[sldr_index] == ABS_WHEEL) 2481 sldr_setup[0] |= dev_desc->wheel_enable; 2482 } 2483 2484 /* 2485 * The absence of a register offset makes it safe to assume the device 2486 * supports gestures, each of which is first disabled until explicitly 2487 * enabled. 2488 */ 2489 if (!reg_offset) 2490 for (i = 0; i < ARRAY_SIZE(iqs7222_sl_events); i++) 2491 sldr_setup[9] &= ~iqs7222_sl_events[i].enable; 2492 2493 for (i = 0; i < ARRAY_SIZE(iqs7222_sl_events); i++) { 2494 const char *event_name = iqs7222_sl_events[i].name; 2495 struct fwnode_handle *event_node; 2496 enum iqs7222_reg_key_id reg_key; 2497 2498 event_node = fwnode_get_named_child_node(sldr_node, event_name); 2499 if (!event_node) 2500 continue; 2501 2502 /* 2503 * Depending on the device, gestures are either offered using 2504 * one of two timing resolutions, or are not supported at all. 2505 */ 2506 if (reg_offset) 2507 reg_key = IQS7222_REG_KEY_RESERVED; 2508 else if (dev_desc->legacy_gesture && 2509 iqs7222_sl_events[i].reg_key == IQS7222_REG_KEY_TAP) 2510 reg_key = IQS7222_REG_KEY_TAP_LEGACY; 2511 else if (dev_desc->legacy_gesture && 2512 iqs7222_sl_events[i].reg_key == IQS7222_REG_KEY_AXIAL) 2513 reg_key = IQS7222_REG_KEY_AXIAL_LEGACY; 2514 else 2515 reg_key = iqs7222_sl_events[i].reg_key; 2516 2517 /* 2518 * The press/release event does not expose a direct GPIO link, 2519 * but one can be emulated by tying each of the participating 2520 * channels to the same GPIO. 2521 */ 2522 error = iqs7222_parse_event(iqs7222, event_node, sldr_index, 2523 IQS7222_REG_GRP_SLDR, reg_key, 2524 i ? iqs7222_sl_events[i].enable 2525 : sldr_setup[3 + reg_offset], 2526 i ? 1568 + sldr_index * 30 2527 : sldr_setup[4 + reg_offset], 2528 NULL, 2529 &iqs7222->sl_code[sldr_index][i]); 2530 fwnode_handle_put(event_node); 2531 if (error) 2532 return error; 2533 2534 if (!reg_offset) 2535 sldr_setup[9] |= iqs7222_sl_events[i].enable; 2536 2537 if (!dev_desc->event_offset) 2538 continue; 2539 2540 /* 2541 * The press/release event is determined based on whether the 2542 * coordinate field reports 0xFFFF and solely relies on touch 2543 * or proximity interrupts to be unmasked. 2544 */ 2545 if (i && !reg_offset) 2546 *event_mask |= (IQS7222_EVENT_MASK_SLDR << sldr_index); 2547 else if (sldr_setup[4 + reg_offset] == dev_desc->touch_link) 2548 *event_mask |= IQS7222_EVENT_MASK_TOUCH; 2549 else 2550 *event_mask |= IQS7222_EVENT_MASK_PROX; 2551 } 2552 2553 /* 2554 * The following call handles a special pair of properties that shift 2555 * to make room for a wheel enable control in the case of IQS7222C. 2556 */ 2557 return iqs7222_parse_props(iqs7222, sldr_node, sldr_index, 2558 IQS7222_REG_GRP_SLDR, 2559 dev_desc->wheel_enable ? 2560 IQS7222_REG_KEY_WHEEL : 2561 IQS7222_REG_KEY_NO_WHEEL); 2562 } 2563 2564 static int iqs7222_parse_tpad(struct iqs7222_private *iqs7222, 2565 struct fwnode_handle *tpad_node, int tpad_index) 2566 { 2567 const struct iqs7222_dev_desc *dev_desc = iqs7222->dev_desc; 2568 struct touchscreen_properties *prop = &iqs7222->prop; 2569 struct i2c_client *client = iqs7222->client; 2570 int num_chan = dev_desc->reg_grps[IQS7222_REG_GRP_CHAN].num_row; 2571 int count, error, i; 2572 u16 *event_mask = &iqs7222->sys_setup[dev_desc->event_offset]; 2573 u16 *tpad_setup = iqs7222->tpad_setup; 2574 unsigned int chan_sel[12]; 2575 2576 error = iqs7222_parse_props(iqs7222, tpad_node, tpad_index, 2577 IQS7222_REG_GRP_TPAD, 2578 IQS7222_REG_KEY_NONE); 2579 if (error) 2580 return error; 2581 2582 count = fwnode_property_count_u32(tpad_node, "azoteq,channel-select"); 2583 if (count < 0) { 2584 dev_err(&client->dev, "Failed to count %s channels: %d\n", 2585 fwnode_get_name(tpad_node), count); 2586 return count; 2587 } else if (!count || count > ARRAY_SIZE(chan_sel)) { 2588 dev_err(&client->dev, "Invalid number of %s channels\n", 2589 fwnode_get_name(tpad_node)); 2590 return -EINVAL; 2591 } 2592 2593 error = fwnode_property_read_u32_array(tpad_node, 2594 "azoteq,channel-select", 2595 chan_sel, count); 2596 if (error) { 2597 dev_err(&client->dev, "Failed to read %s channels: %d\n", 2598 fwnode_get_name(tpad_node), error); 2599 return error; 2600 } 2601 2602 tpad_setup[6] &= ~GENMASK(num_chan - 1, 0); 2603 2604 for (i = 0; i < ARRAY_SIZE(chan_sel); i++) { 2605 tpad_setup[8 + i] = 0; 2606 if (i >= count || chan_sel[i] == U8_MAX) 2607 continue; 2608 2609 if (chan_sel[i] >= num_chan) { 2610 dev_err(&client->dev, "Invalid %s channel: %u\n", 2611 fwnode_get_name(tpad_node), chan_sel[i]); 2612 return -EINVAL; 2613 } 2614 2615 /* 2616 * The following fields indicate which channels participate in 2617 * the trackpad, as well as each channel's relative placement. 2618 */ 2619 tpad_setup[6] |= BIT(chan_sel[i]); 2620 tpad_setup[8 + i] = chan_sel[i] * 34 + 1072; 2621 } 2622 2623 tpad_setup[7] = dev_desc->touch_link; 2624 if (fwnode_property_present(tpad_node, "azoteq,use-prox")) 2625 tpad_setup[7] -= 2; 2626 2627 for (i = 0; i < ARRAY_SIZE(iqs7222_tp_events); i++) 2628 tpad_setup[20] &= ~(iqs7222_tp_events[i].strict | 2629 iqs7222_tp_events[i].enable); 2630 2631 for (i = 0; i < ARRAY_SIZE(iqs7222_tp_events); i++) { 2632 const char *event_name = iqs7222_tp_events[i].name; 2633 struct fwnode_handle *event_node; 2634 2635 event_node = fwnode_get_named_child_node(tpad_node, event_name); 2636 if (!event_node) 2637 continue; 2638 2639 if (fwnode_property_present(event_node, 2640 "azoteq,gesture-angle-tighten")) 2641 tpad_setup[20] |= iqs7222_tp_events[i].strict; 2642 2643 tpad_setup[20] |= iqs7222_tp_events[i].enable; 2644 2645 error = iqs7222_parse_event(iqs7222, event_node, tpad_index, 2646 IQS7222_REG_GRP_TPAD, 2647 iqs7222_tp_events[i].reg_key, 2648 iqs7222_tp_events[i].link, 1566, 2649 NULL, 2650 &iqs7222->tp_code[i]); 2651 fwnode_handle_put(event_node); 2652 if (error) 2653 return error; 2654 2655 if (!dev_desc->event_offset) 2656 continue; 2657 2658 /* 2659 * The press/release event is determined based on whether the 2660 * coordinate fields report 0xFFFF and solely relies on touch 2661 * or proximity interrupts to be unmasked. 2662 */ 2663 if (i) 2664 *event_mask |= IQS7222_EVENT_MASK_TPAD; 2665 else if (tpad_setup[7] == dev_desc->touch_link) 2666 *event_mask |= IQS7222_EVENT_MASK_TOUCH; 2667 else 2668 *event_mask |= IQS7222_EVENT_MASK_PROX; 2669 } 2670 2671 if (!iqs7222->tp_code[0]) 2672 return 0; 2673 2674 input_set_abs_params(iqs7222->keypad, ABS_X, 2675 0, (tpad_setup[4] ? : 1) - 1, 0, 0); 2676 2677 input_set_abs_params(iqs7222->keypad, ABS_Y, 2678 0, (tpad_setup[5] ? : 1) - 1, 0, 0); 2679 2680 touchscreen_parse_properties(iqs7222->keypad, false, prop); 2681 2682 if (prop->max_x >= U16_MAX || prop->max_y >= U16_MAX) { 2683 dev_err(&client->dev, "Invalid trackpad size: %u*%u\n", 2684 prop->max_x, prop->max_y); 2685 return -EINVAL; 2686 } 2687 2688 tpad_setup[4] = prop->max_x + 1; 2689 tpad_setup[5] = prop->max_y + 1; 2690 2691 return 0; 2692 } 2693 2694 static int (*iqs7222_parse_extra[IQS7222_NUM_REG_GRPS]) 2695 (struct iqs7222_private *iqs7222, 2696 struct fwnode_handle *reg_grp_node, 2697 int reg_grp_index) = { 2698 [IQS7222_REG_GRP_CYCLE] = iqs7222_parse_cycle, 2699 [IQS7222_REG_GRP_CHAN] = iqs7222_parse_chan, 2700 [IQS7222_REG_GRP_SLDR] = iqs7222_parse_sldr, 2701 [IQS7222_REG_GRP_TPAD] = iqs7222_parse_tpad, 2702 }; 2703 2704 static int iqs7222_parse_reg_grp(struct iqs7222_private *iqs7222, 2705 enum iqs7222_reg_grp_id reg_grp, 2706 int reg_grp_index) 2707 { 2708 struct i2c_client *client = iqs7222->client; 2709 struct fwnode_handle *reg_grp_node; 2710 int error; 2711 2712 if (iqs7222_reg_grp_names[reg_grp]) { 2713 char reg_grp_name[16]; 2714 2715 snprintf(reg_grp_name, sizeof(reg_grp_name), 2716 iqs7222_reg_grp_names[reg_grp], reg_grp_index); 2717 2718 reg_grp_node = device_get_named_child_node(&client->dev, 2719 reg_grp_name); 2720 } else { 2721 reg_grp_node = fwnode_handle_get(dev_fwnode(&client->dev)); 2722 } 2723 2724 if (!reg_grp_node) 2725 return 0; 2726 2727 error = iqs7222_parse_props(iqs7222, reg_grp_node, reg_grp_index, 2728 reg_grp, IQS7222_REG_KEY_NONE); 2729 2730 if (!error && iqs7222_parse_extra[reg_grp]) 2731 error = iqs7222_parse_extra[reg_grp](iqs7222, reg_grp_node, 2732 reg_grp_index); 2733 2734 fwnode_handle_put(reg_grp_node); 2735 2736 return error; 2737 } 2738 2739 static int iqs7222_parse_all(struct iqs7222_private *iqs7222) 2740 { 2741 const struct iqs7222_dev_desc *dev_desc = iqs7222->dev_desc; 2742 const struct iqs7222_reg_grp_desc *reg_grps = dev_desc->reg_grps; 2743 u16 *sys_setup = iqs7222->sys_setup; 2744 int error, i, j; 2745 2746 if (dev_desc->allow_offset) 2747 sys_setup[dev_desc->allow_offset] = U16_MAX; 2748 2749 if (dev_desc->event_offset) 2750 sys_setup[dev_desc->event_offset] = IQS7222_EVENT_MASK_ATI; 2751 2752 for (i = 0; i < reg_grps[IQS7222_REG_GRP_GPIO].num_row; i++) { 2753 u16 *gpio_setup = iqs7222->gpio_setup[i]; 2754 2755 gpio_setup[0] &= ~IQS7222_GPIO_SETUP_0_GPIO_EN; 2756 gpio_setup[1] = 0; 2757 gpio_setup[2] = 0; 2758 2759 if (reg_grps[IQS7222_REG_GRP_GPIO].num_row == 1) 2760 continue; 2761 2762 /* 2763 * The IQS7222C and IQS7222D expose multiple GPIO and must be 2764 * informed as to which GPIO this group represents. 2765 */ 2766 for (j = 0; j < ARRAY_SIZE(iqs7222_gpio_links); j++) 2767 gpio_setup[0] &= ~BIT(iqs7222_gpio_links[j]); 2768 2769 gpio_setup[0] |= BIT(iqs7222_gpio_links[i]); 2770 } 2771 2772 for (i = 0; i < reg_grps[IQS7222_REG_GRP_CHAN].num_row; i++) { 2773 u16 *chan_setup = iqs7222->chan_setup[i]; 2774 2775 chan_setup[0] &= ~IQS7222_CHAN_SETUP_0_REF_MODE_MASK; 2776 chan_setup[0] &= ~IQS7222_CHAN_SETUP_0_CHAN_EN; 2777 2778 chan_setup[5] = 0; 2779 } 2780 2781 for (i = 0; i < reg_grps[IQS7222_REG_GRP_SLDR].num_row; i++) { 2782 u16 *sldr_setup = iqs7222->sldr_setup[i]; 2783 2784 sldr_setup[0] &= ~IQS7222_SLDR_SETUP_0_CHAN_CNT_MASK; 2785 } 2786 2787 for (i = 0; i < IQS7222_NUM_REG_GRPS; i++) { 2788 for (j = 0; j < reg_grps[i].num_row; j++) { 2789 error = iqs7222_parse_reg_grp(iqs7222, i, j); 2790 if (error) 2791 return error; 2792 } 2793 } 2794 2795 return 0; 2796 } 2797 2798 static int iqs7222_report(struct iqs7222_private *iqs7222) 2799 { 2800 const struct iqs7222_dev_desc *dev_desc = iqs7222->dev_desc; 2801 struct i2c_client *client = iqs7222->client; 2802 int num_chan = dev_desc->reg_grps[IQS7222_REG_GRP_CHAN].num_row; 2803 int num_stat = dev_desc->reg_grps[IQS7222_REG_GRP_STAT].num_col; 2804 int error, i, j; 2805 __le16 status[IQS7222_MAX_COLS_STAT]; 2806 2807 error = iqs7222_read_burst(iqs7222, IQS7222_SYS_STATUS, status, 2808 num_stat); 2809 if (error) 2810 return error; 2811 2812 if (le16_to_cpu(status[0]) & IQS7222_SYS_STATUS_RESET) { 2813 dev_err(&client->dev, "Unexpected device reset\n"); 2814 return iqs7222_dev_init(iqs7222, WRITE); 2815 } 2816 2817 if (le16_to_cpu(status[0]) & IQS7222_SYS_STATUS_ATI_ERROR) { 2818 dev_err(&client->dev, "Unexpected ATI error\n"); 2819 return iqs7222_ati_trigger(iqs7222); 2820 } 2821 2822 if (le16_to_cpu(status[0]) & IQS7222_SYS_STATUS_ATI_ACTIVE) 2823 return 0; 2824 2825 for (i = 0; i < num_chan; i++) { 2826 u16 *chan_setup = iqs7222->chan_setup[i]; 2827 2828 if (!(chan_setup[0] & IQS7222_CHAN_SETUP_0_CHAN_EN)) 2829 continue; 2830 2831 for (j = 0; j < ARRAY_SIZE(iqs7222_kp_events); j++) { 2832 /* 2833 * Proximity state begins at offset 2 and spills into 2834 * offset 3 for devices with more than 16 channels. 2835 * 2836 * Touch state begins at the first offset immediately 2837 * following proximity state. 2838 */ 2839 int k = 2 + j * (num_chan > 16 ? 2 : 1); 2840 u16 state = le16_to_cpu(status[k + i / 16]); 2841 2842 if (!iqs7222->kp_type[i][j]) 2843 continue; 2844 2845 input_event(iqs7222->keypad, 2846 iqs7222->kp_type[i][j], 2847 iqs7222->kp_code[i][j], 2848 !!(state & BIT(i % 16))); 2849 } 2850 } 2851 2852 for (i = 0; i < dev_desc->reg_grps[IQS7222_REG_GRP_SLDR].num_row; i++) { 2853 u16 *sldr_setup = iqs7222->sldr_setup[i]; 2854 u16 sldr_pos = le16_to_cpu(status[4 + i]); 2855 u16 state = le16_to_cpu(status[6 + i]); 2856 2857 if (!(sldr_setup[0] & IQS7222_SLDR_SETUP_0_CHAN_CNT_MASK)) 2858 continue; 2859 2860 if (sldr_pos < dev_desc->sldr_res) 2861 input_report_abs(iqs7222->keypad, iqs7222->sl_axis[i], 2862 sldr_pos); 2863 2864 input_report_key(iqs7222->keypad, iqs7222->sl_code[i][0], 2865 sldr_pos < dev_desc->sldr_res); 2866 2867 /* 2868 * A maximum resolution indicates the device does not support 2869 * gestures, in which case the remaining fields are ignored. 2870 */ 2871 if (dev_desc->sldr_res == U16_MAX) 2872 continue; 2873 2874 if (!(le16_to_cpu(status[1]) & IQS7222_EVENT_MASK_SLDR << i)) 2875 continue; 2876 2877 /* 2878 * Skip the press/release event, as it does not have separate 2879 * status fields and is handled separately. 2880 */ 2881 for (j = 1; j < ARRAY_SIZE(iqs7222_sl_events); j++) { 2882 u16 mask = iqs7222_sl_events[j].mask; 2883 u16 val = iqs7222_sl_events[j].val; 2884 2885 input_report_key(iqs7222->keypad, 2886 iqs7222->sl_code[i][j], 2887 (state & mask) == val); 2888 } 2889 2890 input_sync(iqs7222->keypad); 2891 2892 for (j = 1; j < ARRAY_SIZE(iqs7222_sl_events); j++) 2893 input_report_key(iqs7222->keypad, 2894 iqs7222->sl_code[i][j], 0); 2895 } 2896 2897 for (i = 0; i < dev_desc->reg_grps[IQS7222_REG_GRP_TPAD].num_row; i++) { 2898 u16 tpad_pos_x = le16_to_cpu(status[4]); 2899 u16 tpad_pos_y = le16_to_cpu(status[5]); 2900 u16 state = le16_to_cpu(status[6]); 2901 2902 input_report_key(iqs7222->keypad, iqs7222->tp_code[0], 2903 tpad_pos_x < U16_MAX); 2904 2905 if (tpad_pos_x < U16_MAX) 2906 touchscreen_report_pos(iqs7222->keypad, &iqs7222->prop, 2907 tpad_pos_x, tpad_pos_y, false); 2908 2909 if (!(le16_to_cpu(status[1]) & IQS7222_EVENT_MASK_TPAD)) 2910 continue; 2911 2912 /* 2913 * Skip the press/release event, as it does not have separate 2914 * status fields and is handled separately. 2915 */ 2916 for (j = 1; j < ARRAY_SIZE(iqs7222_tp_events); j++) { 2917 u16 mask = iqs7222_tp_events[j].mask; 2918 u16 val = iqs7222_tp_events[j].val; 2919 2920 input_report_key(iqs7222->keypad, 2921 iqs7222->tp_code[j], 2922 (state & mask) == val); 2923 } 2924 2925 input_sync(iqs7222->keypad); 2926 2927 for (j = 1; j < ARRAY_SIZE(iqs7222_tp_events); j++) 2928 input_report_key(iqs7222->keypad, 2929 iqs7222->tp_code[j], 0); 2930 } 2931 2932 input_sync(iqs7222->keypad); 2933 2934 return 0; 2935 } 2936 2937 static irqreturn_t iqs7222_irq(int irq, void *context) 2938 { 2939 struct iqs7222_private *iqs7222 = context; 2940 2941 return iqs7222_report(iqs7222) ? IRQ_NONE : IRQ_HANDLED; 2942 } 2943 2944 static int iqs7222_probe(struct i2c_client *client) 2945 { 2946 struct iqs7222_private *iqs7222; 2947 unsigned long irq_flags; 2948 int error, irq; 2949 2950 iqs7222 = devm_kzalloc(&client->dev, sizeof(*iqs7222), GFP_KERNEL); 2951 if (!iqs7222) 2952 return -ENOMEM; 2953 2954 i2c_set_clientdata(client, iqs7222); 2955 iqs7222->client = client; 2956 2957 iqs7222->keypad = devm_input_allocate_device(&client->dev); 2958 if (!iqs7222->keypad) 2959 return -ENOMEM; 2960 2961 iqs7222->keypad->name = client->name; 2962 iqs7222->keypad->id.bustype = BUS_I2C; 2963 2964 /* 2965 * The RDY pin behaves as an interrupt, but must also be polled ahead 2966 * of unsolicited I2C communication. As such, it is first opened as a 2967 * GPIO and then passed to gpiod_to_irq() to register the interrupt. 2968 */ 2969 iqs7222->irq_gpio = devm_gpiod_get(&client->dev, "irq", GPIOD_IN); 2970 if (IS_ERR(iqs7222->irq_gpio)) { 2971 error = PTR_ERR(iqs7222->irq_gpio); 2972 dev_err(&client->dev, "Failed to request IRQ GPIO: %d\n", 2973 error); 2974 return error; 2975 } 2976 2977 iqs7222->reset_gpio = devm_gpiod_get_optional(&client->dev, "reset", 2978 GPIOD_OUT_HIGH); 2979 if (IS_ERR(iqs7222->reset_gpio)) { 2980 error = PTR_ERR(iqs7222->reset_gpio); 2981 dev_err(&client->dev, "Failed to request reset GPIO: %d\n", 2982 error); 2983 return error; 2984 } 2985 2986 error = iqs7222_hard_reset(iqs7222); 2987 if (error) 2988 return error; 2989 2990 error = iqs7222_dev_info(iqs7222); 2991 if (error) 2992 return error; 2993 2994 error = iqs7222_dev_init(iqs7222, READ); 2995 if (error) 2996 return error; 2997 2998 error = iqs7222_parse_all(iqs7222); 2999 if (error) 3000 return error; 3001 3002 error = iqs7222_dev_init(iqs7222, WRITE); 3003 if (error) 3004 return error; 3005 3006 error = iqs7222_report(iqs7222); 3007 if (error) 3008 return error; 3009 3010 error = input_register_device(iqs7222->keypad); 3011 if (error) { 3012 dev_err(&client->dev, "Failed to register device: %d\n", error); 3013 return error; 3014 } 3015 3016 irq = gpiod_to_irq(iqs7222->irq_gpio); 3017 if (irq < 0) 3018 return irq; 3019 3020 irq_flags = gpiod_is_active_low(iqs7222->irq_gpio) ? IRQF_TRIGGER_LOW 3021 : IRQF_TRIGGER_HIGH; 3022 irq_flags |= IRQF_ONESHOT; 3023 3024 error = devm_request_threaded_irq(&client->dev, irq, NULL, iqs7222_irq, 3025 irq_flags, client->name, iqs7222); 3026 if (error) 3027 dev_err(&client->dev, "Failed to request IRQ: %d\n", error); 3028 3029 return error; 3030 } 3031 3032 static const struct of_device_id iqs7222_of_match[] = { 3033 { .compatible = "azoteq,iqs7222a" }, 3034 { .compatible = "azoteq,iqs7222b" }, 3035 { .compatible = "azoteq,iqs7222c" }, 3036 { .compatible = "azoteq,iqs7222d" }, 3037 { } 3038 }; 3039 MODULE_DEVICE_TABLE(of, iqs7222_of_match); 3040 3041 static struct i2c_driver iqs7222_i2c_driver = { 3042 .driver = { 3043 .name = "iqs7222", 3044 .of_match_table = iqs7222_of_match, 3045 }, 3046 .probe = iqs7222_probe, 3047 }; 3048 module_i2c_driver(iqs7222_i2c_driver); 3049 3050 MODULE_AUTHOR("Jeff LaBundy <jeff@labundy.com>"); 3051 MODULE_DESCRIPTION("Azoteq IQS7222A/B/C/D Capacitive Touch Controller"); 3052 MODULE_LICENSE("GPL"); 3053