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