Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Input: pmic8xxx-keypad - migrate to DT

The driver is only supported on DT enabled platforms. Convert the
driver to DT so that it can probe properly.

Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

authored by

Stephen Boyd and committed by
Dmitry Torokhov
86ea5e6b a5dde0c7

+175 -116
+89
Documentation/devicetree/bindings/input/qcom,pm8xxx-keypad.txt
··· 1 + Qualcomm PM8xxx PMIC Keypad 2 + 3 + PROPERTIES 4 + 5 + - compatible: 6 + Usage: required 7 + Value type: <string> 8 + Definition: must be one of: 9 + "qcom,pm8058-keypad" 10 + "qcom,pm8921-keypad" 11 + 12 + - reg: 13 + Usage: required 14 + Value type: <prop-encoded-array> 15 + Definition: address of keypad control register 16 + 17 + - interrupts: 18 + Usage: required 19 + Value type: <prop-encoded-array> 20 + Definition: the first interrupt specifies the key sense interrupt 21 + and the second interrupt specifies the key stuck interrupt. 22 + The format of the specifier is defined by the binding 23 + document describing the node's interrupt parent. 24 + 25 + - linux,keymap: 26 + Usage: required 27 + Value type: <prop-encoded-array> 28 + Definition: the linux keymap. More information can be found in 29 + input/matrix-keymap.txt. 30 + 31 + - linux,keypad-no-autorepeat: 32 + Usage: optional 33 + Value type: <bool> 34 + Definition: don't enable autorepeat feature. 35 + 36 + - linux,keypad-wakeup: 37 + Usage: optional 38 + Value type: <bool> 39 + Definition: use any event on keypad as wakeup event. 40 + 41 + - keypad,num-rows: 42 + Usage: required 43 + Value type: <u32> 44 + Definition: number of rows in the keymap. More information can be found 45 + in input/matrix-keymap.txt. 46 + 47 + - keypad,num-columns: 48 + Usage: required 49 + Value type: <u32> 50 + Definition: number of columns in the keymap. More information can be 51 + found in input/matrix-keymap.txt. 52 + 53 + - debounce: 54 + Usage: optional 55 + Value type: <u32> 56 + Definition: time in microseconds that key must be pressed or release 57 + for key sense interrupt to trigger. 58 + 59 + - scan-delay: 60 + Usage: optional 61 + Value type: <u32> 62 + Definition: time in microseconds to pause between successive scans 63 + of the matrix array. 64 + 65 + - row-hold: 66 + Usage: optional 67 + Value type: <u32> 68 + Definition: time in nanoseconds to pause between scans of each row in 69 + the matrix array. 70 + 71 + EXAMPLE 72 + 73 + keypad@148 { 74 + compatible = "qcom,pm8921-keypad"; 75 + reg = <0x148>; 76 + interrupt-parent = <&pmicintc>; 77 + interrupts = <74 1>, <75 1>; 78 + linux,keymap = < 79 + MATRIX_KEY(0, 0, KEY_VOLUMEUP) 80 + MATRIX_KEY(0, 1, KEY_VOLUMEDOWN) 81 + MATRIX_KEY(0, 2, KEY_CAMERA_FOCUS) 82 + MATRIX_KEY(0, 3, KEY_CAMERA) 83 + >; 84 + keypad,num-rows = <1>; 85 + keypad,num-columns = <5>; 86 + debounce = <15>; 87 + scan-delay = <32>; 88 + row-hold = <91500>; 89 + };
+86 -64
drivers/input/keyboard/pmic8xxx-keypad.c
··· 20 20 #include <linux/delay.h> 21 21 #include <linux/mutex.h> 22 22 #include <linux/regmap.h> 23 - 24 - #include <linux/input/pmic8xxx-keypad.h> 23 + #include <linux/of.h> 24 + #include <linux/input/matrix_keypad.h> 25 25 26 26 #define PM8XXX_MAX_ROWS 18 27 27 #define PM8XXX_MAX_COLS 8 ··· 84 84 85 85 /** 86 86 * struct pmic8xxx_kp - internal keypad data structure 87 - * @pdata - keypad platform data pointer 87 + * @num_cols - number of columns of keypad 88 + * @num_rows - number of row of keypad 88 89 * @input - input device pointer for keypad 89 90 * @regmap - regmap handle 90 91 * @key_sense_irq - key press/release irq number ··· 97 96 * @ctrl_reg - control register value 98 97 */ 99 98 struct pmic8xxx_kp { 100 - const struct pm8xxx_keypad_platform_data *pdata; 99 + unsigned int num_rows; 100 + unsigned int num_cols; 101 101 struct input_dev *input; 102 102 struct regmap *regmap; 103 103 int key_sense_irq; ··· 117 115 { 118 116 /* all keys pressed on that particular row? */ 119 117 if (col == 0x00) 120 - return 1 << kp->pdata->num_cols; 118 + return 1 << kp->num_cols; 121 119 else 122 - return col & ((1 << kp->pdata->num_cols) - 1); 120 + return col & ((1 << kp->num_cols) - 1); 123 121 } 124 122 125 123 /* ··· 182 180 int rc, read_rows; 183 181 unsigned int scan_val; 184 182 185 - if (kp->pdata->num_rows < PM8XXX_MIN_ROWS) 183 + if (kp->num_rows < PM8XXX_MIN_ROWS) 186 184 read_rows = PM8XXX_MIN_ROWS; 187 185 else 188 - read_rows = kp->pdata->num_rows; 186 + read_rows = kp->num_rows; 189 187 190 188 pmic8xxx_chk_sync_read(kp); 191 189 ··· 229 227 { 230 228 int row, col, code; 231 229 232 - for (row = 0; row < kp->pdata->num_rows; row++) { 230 + for (row = 0; row < kp->num_rows; row++) { 233 231 int bits_changed = new_state[row] ^ old_state[row]; 234 232 235 233 if (!bits_changed) 236 234 continue; 237 235 238 - for (col = 0; col < kp->pdata->num_cols; col++) { 236 + for (col = 0; col < kp->num_cols; col++) { 239 237 if (!(bits_changed & (1 << col))) 240 238 continue; 241 239 ··· 261 259 u16 check, row_state; 262 260 263 261 check = 0; 264 - for (row = 0; row < kp->pdata->num_rows; row++) { 262 + for (row = 0; row < kp->num_rows; row++) { 265 263 row_state = (~new_state[row]) & 266 - ((1 << kp->pdata->num_cols) - 1); 264 + ((1 << kp->num_cols) - 1); 267 265 268 266 if (hweight16(row_state) > 1) { 269 267 if (found_first == -1) ··· 371 369 return IRQ_HANDLED; 372 370 } 373 371 374 - static int pmic8xxx_kpd_init(struct pmic8xxx_kp *kp) 372 + static int pmic8xxx_kpd_init(struct pmic8xxx_kp *kp, 373 + struct platform_device *pdev) 375 374 { 375 + const struct device_node *of_node = pdev->dev.of_node; 376 + unsigned int scan_delay_ms; 377 + unsigned int row_hold_ns; 378 + unsigned int debounce_ms; 376 379 int bits, rc, cycles; 377 380 u8 scan_val = 0, ctrl_val = 0; 378 381 static const u8 row_bits[] = { ··· 385 378 }; 386 379 387 380 /* Find column bits */ 388 - if (kp->pdata->num_cols < KEYP_CTRL_SCAN_COLS_MIN) 381 + if (kp->num_cols < KEYP_CTRL_SCAN_COLS_MIN) 389 382 bits = 0; 390 383 else 391 - bits = kp->pdata->num_cols - KEYP_CTRL_SCAN_COLS_MIN; 384 + bits = kp->num_cols - KEYP_CTRL_SCAN_COLS_MIN; 392 385 ctrl_val = (bits & KEYP_CTRL_SCAN_COLS_BITS) << 393 386 KEYP_CTRL_SCAN_COLS_SHIFT; 394 387 395 388 /* Find row bits */ 396 - if (kp->pdata->num_rows < KEYP_CTRL_SCAN_ROWS_MIN) 389 + if (kp->num_rows < KEYP_CTRL_SCAN_ROWS_MIN) 397 390 bits = 0; 398 391 else 399 - bits = row_bits[kp->pdata->num_rows - KEYP_CTRL_SCAN_ROWS_MIN]; 392 + bits = row_bits[kp->num_rows - KEYP_CTRL_SCAN_ROWS_MIN]; 400 393 401 394 ctrl_val |= (bits << KEYP_CTRL_SCAN_ROWS_SHIFT); 402 395 ··· 406 399 return rc; 407 400 } 408 401 409 - bits = (kp->pdata->debounce_ms / 5) - 1; 402 + if (of_property_read_u32(of_node, "scan-delay", &scan_delay_ms)) 403 + scan_delay_ms = MIN_SCAN_DELAY; 404 + 405 + if (scan_delay_ms > MAX_SCAN_DELAY || scan_delay_ms < MIN_SCAN_DELAY || 406 + !is_power_of_2(scan_delay_ms)) { 407 + dev_err(&pdev->dev, "invalid keypad scan time supplied\n"); 408 + return -EINVAL; 409 + } 410 + 411 + if (of_property_read_u32(of_node, "row-hold", &row_hold_ns)) 412 + row_hold_ns = MIN_ROW_HOLD_DELAY; 413 + 414 + if (row_hold_ns > MAX_ROW_HOLD_DELAY || 415 + row_hold_ns < MIN_ROW_HOLD_DELAY || 416 + ((row_hold_ns % MIN_ROW_HOLD_DELAY) != 0)) { 417 + dev_err(&pdev->dev, "invalid keypad row hold time supplied\n"); 418 + return -EINVAL; 419 + } 420 + 421 + if (of_property_read_u32(of_node, "debounce", &debounce_ms)) 422 + debounce_ms = MIN_DEBOUNCE_TIME; 423 + 424 + if (((debounce_ms % 5) != 0) || 425 + debounce_ms > MAX_DEBOUNCE_TIME || 426 + debounce_ms < MIN_DEBOUNCE_TIME) { 427 + dev_err(&pdev->dev, "invalid debounce time supplied\n"); 428 + return -EINVAL; 429 + } 430 + 431 + bits = (debounce_ms / 5) - 1; 410 432 411 433 scan_val |= (bits << KEYP_SCAN_DBOUNCE_SHIFT); 412 434 413 - bits = fls(kp->pdata->scan_delay_ms) - 1; 435 + bits = fls(scan_delay_ms) - 1; 414 436 scan_val |= (bits << KEYP_SCAN_PAUSE_SHIFT); 415 437 416 438 /* Row hold time is a multiple of 32KHz cycles. */ 417 - cycles = (kp->pdata->row_hold_ns * KEYP_CLOCK_FREQ) / NSEC_PER_SEC; 439 + cycles = (row_hold_ns * KEYP_CLOCK_FREQ) / NSEC_PER_SEC; 418 440 419 441 scan_val |= (cycles << KEYP_SCAN_ROW_HOLD_SHIFT); 420 442 ··· 507 471 */ 508 472 static int pmic8xxx_kp_probe(struct platform_device *pdev) 509 473 { 510 - const struct pm8xxx_keypad_platform_data *pdata = 511 - dev_get_platdata(&pdev->dev); 512 - const struct matrix_keymap_data *keymap_data; 474 + unsigned int rows, cols; 475 + bool repeat; 476 + bool wakeup; 513 477 struct pmic8xxx_kp *kp; 514 478 int rc; 515 479 unsigned int ctrl_val; 516 480 517 - if (!pdata || !pdata->num_cols || !pdata->num_rows || 518 - pdata->num_cols > PM8XXX_MAX_COLS || 519 - pdata->num_rows > PM8XXX_MAX_ROWS || 520 - pdata->num_cols < PM8XXX_MIN_COLS) { 481 + rc = matrix_keypad_parse_of_params(&pdev->dev, &rows, &cols); 482 + if (rc) 483 + return rc; 484 + 485 + if (cols > PM8XXX_MAX_COLS || rows > PM8XXX_MAX_ROWS || 486 + cols < PM8XXX_MIN_COLS) { 521 487 dev_err(&pdev->dev, "invalid platform data\n"); 522 488 return -EINVAL; 523 489 } 524 490 525 - if (!pdata->scan_delay_ms || 526 - pdata->scan_delay_ms > MAX_SCAN_DELAY || 527 - pdata->scan_delay_ms < MIN_SCAN_DELAY || 528 - !is_power_of_2(pdata->scan_delay_ms)) { 529 - dev_err(&pdev->dev, "invalid keypad scan time supplied\n"); 530 - return -EINVAL; 531 - } 532 - 533 - if (!pdata->row_hold_ns || 534 - pdata->row_hold_ns > MAX_ROW_HOLD_DELAY || 535 - pdata->row_hold_ns < MIN_ROW_HOLD_DELAY || 536 - ((pdata->row_hold_ns % MIN_ROW_HOLD_DELAY) != 0)) { 537 - dev_err(&pdev->dev, "invalid keypad row hold time supplied\n"); 538 - return -EINVAL; 539 - } 540 - 541 - if (!pdata->debounce_ms || 542 - ((pdata->debounce_ms % 5) != 0) || 543 - pdata->debounce_ms > MAX_DEBOUNCE_TIME || 544 - pdata->debounce_ms < MIN_DEBOUNCE_TIME) { 545 - dev_err(&pdev->dev, "invalid debounce time supplied\n"); 546 - return -EINVAL; 547 - } 548 - 549 - keymap_data = pdata->keymap_data; 550 - if (!keymap_data) { 551 - dev_err(&pdev->dev, "no keymap data supplied\n"); 552 - return -EINVAL; 553 - } 491 + repeat = !of_property_read_bool(pdev->dev.of_node, 492 + "linux,input-no-autorepeat"); 493 + wakeup = of_property_read_bool(pdev->dev.of_node, 494 + "linux,keypad-wakeup"); 554 495 555 496 kp = devm_kzalloc(&pdev->dev, sizeof(*kp), GFP_KERNEL); 556 497 if (!kp) ··· 539 526 540 527 platform_set_drvdata(pdev, kp); 541 528 542 - kp->pdata = pdata; 529 + kp->num_rows = rows; 530 + kp->num_cols = cols; 543 531 kp->dev = &pdev->dev; 544 532 545 533 kp->input = devm_input_allocate_device(&pdev->dev); ··· 561 547 return kp->key_stuck_irq; 562 548 } 563 549 564 - kp->input->name = pdata->input_name ? : "PMIC8XXX keypad"; 565 - kp->input->phys = pdata->input_phys_device ? : "pmic8xxx_keypad/input0"; 550 + kp->input->name = "PMIC8XXX keypad"; 551 + kp->input->phys = "pmic8xxx_keypad/input0"; 566 552 567 553 kp->input->id.bustype = BUS_I2C; 568 554 kp->input->id.version = 0x0001; ··· 572 558 kp->input->open = pmic8xxx_kp_open; 573 559 kp->input->close = pmic8xxx_kp_close; 574 560 575 - rc = matrix_keypad_build_keymap(keymap_data, NULL, 561 + rc = matrix_keypad_build_keymap(NULL, NULL, 576 562 PM8XXX_MAX_ROWS, PM8XXX_MAX_COLS, 577 563 kp->keycodes, kp->input); 578 564 if (rc) { ··· 580 566 return rc; 581 567 } 582 568 583 - if (pdata->rep) 569 + if (repeat) 584 570 __set_bit(EV_REP, kp->input->evbit); 585 571 input_set_capability(kp->input, EV_MSC, MSC_SCAN); 586 572 ··· 590 576 memset(kp->keystate, 0xff, sizeof(kp->keystate)); 591 577 memset(kp->stuckstate, 0xff, sizeof(kp->stuckstate)); 592 578 593 - rc = pmic8xxx_kpd_init(kp); 579 + rc = pmic8xxx_kpd_init(kp, pdev); 594 580 if (rc < 0) { 595 581 dev_err(&pdev->dev, "unable to initialize keypad controller\n"); 596 582 return rc; ··· 626 612 return rc; 627 613 } 628 614 629 - device_init_wakeup(&pdev->dev, pdata->wakeup); 615 + device_init_wakeup(&pdev->dev, wakeup); 630 616 631 617 return 0; 632 618 } ··· 676 662 static SIMPLE_DEV_PM_OPS(pm8xxx_kp_pm_ops, 677 663 pmic8xxx_kp_suspend, pmic8xxx_kp_resume); 678 664 665 + static const struct of_device_id pm8xxx_match_table[] = { 666 + { .compatible = "qcom,pm8058-keypad" }, 667 + { .compatible = "qcom,pm8921-keypad" }, 668 + { } 669 + }; 670 + MODULE_DEVICE_TABLE(of, pm8xxx_match_table); 671 + 679 672 static struct platform_driver pmic8xxx_kp_driver = { 680 673 .probe = pmic8xxx_kp_probe, 681 674 .driver = { 682 - .name = PM8XXX_KEYPAD_DEV_NAME, 675 + .name = "pm8xxx-keypad", 683 676 .owner = THIS_MODULE, 684 677 .pm = &pm8xxx_kp_pm_ops, 678 + .of_match_table = pm8xxx_match_table, 685 679 }, 686 680 }; 687 681 module_platform_driver(pmic8xxx_kp_driver);
-52
include/linux/input/pmic8xxx-keypad.h
··· 1 - /* Copyright (c) 2011, Code Aurora Forum. All rights reserved. 2 - * 3 - * This program is free software; you can redistribute it and/or modify 4 - * it under the terms of the GNU General Public License version 2 and 5 - * only version 2 as published by the Free Software Foundation. 6 - * 7 - * This program is distributed in the hope that it will be useful, 8 - * but WITHOUT ANY WARRANTY; without even the implied warranty of 9 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 - * GNU General Public License for more details. 11 - */ 12 - 13 - #ifndef __PMIC8XXX_KEYPAD_H__ 14 - #define __PMIC8XXX_KEYPAD_H__ 15 - 16 - #include <linux/input/matrix_keypad.h> 17 - 18 - #define PM8XXX_KEYPAD_DEV_NAME "pm8xxx-keypad" 19 - 20 - /** 21 - * struct pm8xxx_keypad_platform_data - platform data for keypad 22 - * @keymap_data - matrix keymap data 23 - * @input_name - input device name 24 - * @input_phys_device - input device name 25 - * @num_cols - number of columns of keypad 26 - * @num_rows - number of row of keypad 27 - * @debounce_ms - debounce period in milliseconds 28 - * @scan_delay_ms - scan delay in milliseconds 29 - * @row_hold_ns - row hold period in nanoseconds 30 - * @wakeup - configure keypad as wakeup 31 - * @rep - enable or disable key repeat bit 32 - */ 33 - struct pm8xxx_keypad_platform_data { 34 - const struct matrix_keymap_data *keymap_data; 35 - 36 - const char *input_name; 37 - const char *input_phys_device; 38 - 39 - unsigned int num_cols; 40 - unsigned int num_rows; 41 - unsigned int rows_gpio_start; 42 - unsigned int cols_gpio_start; 43 - 44 - unsigned int debounce_ms; 45 - unsigned int scan_delay_ms; 46 - unsigned int row_hold_ns; 47 - 48 - bool wakeup; 49 - bool rep; 50 - }; 51 - 52 - #endif /*__PMIC8XXX_KEYPAD_H__ */