aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Boyd <sboyd@codeaurora.org>2014-03-29 15:35:35 -0400
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2014-03-30 16:25:19 -0400
commit86ea5e6b793d45fa7d2aa504ac3aefc813f0fd55 (patch)
treeb6d996281712bd64eb47664422af180c4684b561
parenta5dde0c72ccbb0f66b3491ee83f4c579aea0651d (diff)
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>
-rw-r--r--Documentation/devicetree/bindings/input/qcom,pm8xxx-keypad.txt89
-rw-r--r--drivers/input/keyboard/pmic8xxx-keypad.c150
-rw-r--r--include/linux/input/pmic8xxx-keypad.h52
3 files changed, 175 insertions, 116 deletions
diff --git a/Documentation/devicetree/bindings/input/qcom,pm8xxx-keypad.txt b/Documentation/devicetree/bindings/input/qcom,pm8xxx-keypad.txt
new file mode 100644
index 000000000000..7d8cb92831d7
--- /dev/null
+++ b/Documentation/devicetree/bindings/input/qcom,pm8xxx-keypad.txt
@@ -0,0 +1,89 @@
1Qualcomm PM8xxx PMIC Keypad
2
3PROPERTIES
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
71EXAMPLE
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 };
diff --git a/drivers/input/keyboard/pmic8xxx-keypad.c b/drivers/input/keyboard/pmic8xxx-keypad.c
index 0efd11e16b7e..80c6b0ef3fc8 100644
--- a/drivers/input/keyboard/pmic8xxx-keypad.c
+++ b/drivers/input/keyboard/pmic8xxx-keypad.c
@@ -20,8 +20,8 @@
20#include <linux/delay.h> 20#include <linux/delay.h>
21#include <linux/mutex.h> 21#include <linux/mutex.h>
22#include <linux/regmap.h> 22#include <linux/regmap.h>
23 23#include <linux/of.h>
24#include <linux/input/pmic8xxx-keypad.h> 24#include <linux/input/matrix_keypad.h>
25 25
26#define PM8XXX_MAX_ROWS 18 26#define PM8XXX_MAX_ROWS 18
27#define PM8XXX_MAX_COLS 8 27#define PM8XXX_MAX_COLS 8
@@ -84,7 +84,8 @@
84 84
85/** 85/**
86 * struct pmic8xxx_kp - internal keypad data structure 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 * @input - input device pointer for keypad 89 * @input - input device pointer for keypad
89 * @regmap - regmap handle 90 * @regmap - regmap handle
90 * @key_sense_irq - key press/release irq number 91 * @key_sense_irq - key press/release irq number
@@ -96,7 +97,8 @@
96 * @ctrl_reg - control register value 97 * @ctrl_reg - control register value
97 */ 98 */
98struct pmic8xxx_kp { 99struct pmic8xxx_kp {
99 const struct pm8xxx_keypad_platform_data *pdata; 100 unsigned int num_rows;
101 unsigned int num_cols;
100 struct input_dev *input; 102 struct input_dev *input;
101 struct regmap *regmap; 103 struct regmap *regmap;
102 int key_sense_irq; 104 int key_sense_irq;
@@ -115,9 +117,9 @@ static u8 pmic8xxx_col_state(struct pmic8xxx_kp *kp, u8 col)
115{ 117{
116 /* all keys pressed on that particular row? */ 118 /* all keys pressed on that particular row? */
117 if (col == 0x00) 119 if (col == 0x00)
118 return 1 << kp->pdata->num_cols; 120 return 1 << kp->num_cols;
119 else 121 else
120 return col & ((1 << kp->pdata->num_cols) - 1); 122 return col & ((1 << kp->num_cols) - 1);
121} 123}
122 124
123/* 125/*
@@ -180,10 +182,10 @@ static int pmic8xxx_kp_read_matrix(struct pmic8xxx_kp *kp, u16 *new_state,
180 int rc, read_rows; 182 int rc, read_rows;
181 unsigned int scan_val; 183 unsigned int scan_val;
182 184
183 if (kp->pdata->num_rows < PM8XXX_MIN_ROWS) 185 if (kp->num_rows < PM8XXX_MIN_ROWS)
184 read_rows = PM8XXX_MIN_ROWS; 186 read_rows = PM8XXX_MIN_ROWS;
185 else 187 else
186 read_rows = kp->pdata->num_rows; 188 read_rows = kp->num_rows;
187 189
188 pmic8xxx_chk_sync_read(kp); 190 pmic8xxx_chk_sync_read(kp);
189 191
@@ -227,13 +229,13 @@ static void __pmic8xxx_kp_scan_matrix(struct pmic8xxx_kp *kp, u16 *new_state,
227{ 229{
228 int row, col, code; 230 int row, col, code;
229 231
230 for (row = 0; row < kp->pdata->num_rows; row++) { 232 for (row = 0; row < kp->num_rows; row++) {
231 int bits_changed = new_state[row] ^ old_state[row]; 233 int bits_changed = new_state[row] ^ old_state[row];
232 234
233 if (!bits_changed) 235 if (!bits_changed)
234 continue; 236 continue;
235 237
236 for (col = 0; col < kp->pdata->num_cols; col++) { 238 for (col = 0; col < kp->num_cols; col++) {
237 if (!(bits_changed & (1 << col))) 239 if (!(bits_changed & (1 << col)))
238 continue; 240 continue;
239 241
@@ -259,9 +261,9 @@ static bool pmic8xxx_detect_ghost_keys(struct pmic8xxx_kp *kp, u16 *new_state)
259 u16 check, row_state; 261 u16 check, row_state;
260 262
261 check = 0; 263 check = 0;
262 for (row = 0; row < kp->pdata->num_rows; row++) { 264 for (row = 0; row < kp->num_rows; row++) {
263 row_state = (~new_state[row]) & 265 row_state = (~new_state[row]) &
264 ((1 << kp->pdata->num_cols) - 1); 266 ((1 << kp->num_cols) - 1);
265 267
266 if (hweight16(row_state) > 1) { 268 if (hweight16(row_state) > 1) {
267 if (found_first == -1) 269 if (found_first == -1)
@@ -369,8 +371,13 @@ static irqreturn_t pmic8xxx_kp_irq(int irq, void *data)
369 return IRQ_HANDLED; 371 return IRQ_HANDLED;
370} 372}
371 373
372static int pmic8xxx_kpd_init(struct pmic8xxx_kp *kp) 374static int pmic8xxx_kpd_init(struct pmic8xxx_kp *kp,
375 struct platform_device *pdev)
373{ 376{
377 const struct device_node *of_node = pdev->dev.of_node;
378 unsigned int scan_delay_ms;
379 unsigned int row_hold_ns;
380 unsigned int debounce_ms;
374 int bits, rc, cycles; 381 int bits, rc, cycles;
375 u8 scan_val = 0, ctrl_val = 0; 382 u8 scan_val = 0, ctrl_val = 0;
376 static const u8 row_bits[] = { 383 static const u8 row_bits[] = {
@@ -378,18 +385,18 @@ static int pmic8xxx_kpd_init(struct pmic8xxx_kp *kp)
378 }; 385 };
379 386
380 /* Find column bits */ 387 /* Find column bits */
381 if (kp->pdata->num_cols < KEYP_CTRL_SCAN_COLS_MIN) 388 if (kp->num_cols < KEYP_CTRL_SCAN_COLS_MIN)
382 bits = 0; 389 bits = 0;
383 else 390 else
384 bits = kp->pdata->num_cols - KEYP_CTRL_SCAN_COLS_MIN; 391 bits = kp->num_cols - KEYP_CTRL_SCAN_COLS_MIN;
385 ctrl_val = (bits & KEYP_CTRL_SCAN_COLS_BITS) << 392 ctrl_val = (bits & KEYP_CTRL_SCAN_COLS_BITS) <<
386 KEYP_CTRL_SCAN_COLS_SHIFT; 393 KEYP_CTRL_SCAN_COLS_SHIFT;
387 394
388 /* Find row bits */ 395 /* Find row bits */
389 if (kp->pdata->num_rows < KEYP_CTRL_SCAN_ROWS_MIN) 396 if (kp->num_rows < KEYP_CTRL_SCAN_ROWS_MIN)
390 bits = 0; 397 bits = 0;
391 else 398 else
392 bits = row_bits[kp->pdata->num_rows - KEYP_CTRL_SCAN_ROWS_MIN]; 399 bits = row_bits[kp->num_rows - KEYP_CTRL_SCAN_ROWS_MIN];
393 400
394 ctrl_val |= (bits << KEYP_CTRL_SCAN_ROWS_SHIFT); 401 ctrl_val |= (bits << KEYP_CTRL_SCAN_ROWS_SHIFT);
395 402
@@ -399,15 +406,44 @@ static int pmic8xxx_kpd_init(struct pmic8xxx_kp *kp)
399 return rc; 406 return rc;
400 } 407 }
401 408
402 bits = (kp->pdata->debounce_ms / 5) - 1; 409 if (of_property_read_u32(of_node, "scan-delay", &scan_delay_ms))
410 scan_delay_ms = MIN_SCAN_DELAY;
411
412 if (scan_delay_ms > MAX_SCAN_DELAY || scan_delay_ms < MIN_SCAN_DELAY ||
413 !is_power_of_2(scan_delay_ms)) {
414 dev_err(&pdev->dev, "invalid keypad scan time supplied\n");
415 return -EINVAL;
416 }
417
418 if (of_property_read_u32(of_node, "row-hold", &row_hold_ns))
419 row_hold_ns = MIN_ROW_HOLD_DELAY;
420
421 if (row_hold_ns > MAX_ROW_HOLD_DELAY ||
422 row_hold_ns < MIN_ROW_HOLD_DELAY ||
423 ((row_hold_ns % MIN_ROW_HOLD_DELAY) != 0)) {
424 dev_err(&pdev->dev, "invalid keypad row hold time supplied\n");
425 return -EINVAL;
426 }
427
428 if (of_property_read_u32(of_node, "debounce", &debounce_ms))
429 debounce_ms = MIN_DEBOUNCE_TIME;
430
431 if (((debounce_ms % 5) != 0) ||
432 debounce_ms > MAX_DEBOUNCE_TIME ||
433 debounce_ms < MIN_DEBOUNCE_TIME) {
434 dev_err(&pdev->dev, "invalid debounce time supplied\n");
435 return -EINVAL;
436 }
437
438 bits = (debounce_ms / 5) - 1;
403 439
404 scan_val |= (bits << KEYP_SCAN_DBOUNCE_SHIFT); 440 scan_val |= (bits << KEYP_SCAN_DBOUNCE_SHIFT);
405 441
406 bits = fls(kp->pdata->scan_delay_ms) - 1; 442 bits = fls(scan_delay_ms) - 1;
407 scan_val |= (bits << KEYP_SCAN_PAUSE_SHIFT); 443 scan_val |= (bits << KEYP_SCAN_PAUSE_SHIFT);
408 444
409 /* Row hold time is a multiple of 32KHz cycles. */ 445 /* Row hold time is a multiple of 32KHz cycles. */
410 cycles = (kp->pdata->row_hold_ns * KEYP_CLOCK_FREQ) / NSEC_PER_SEC; 446 cycles = (row_hold_ns * KEYP_CLOCK_FREQ) / NSEC_PER_SEC;
411 447
412 scan_val |= (cycles << KEYP_SCAN_ROW_HOLD_SHIFT); 448 scan_val |= (cycles << KEYP_SCAN_ROW_HOLD_SHIFT);
413 449
@@ -471,50 +507,27 @@ static void pmic8xxx_kp_close(struct input_dev *dev)
471 */ 507 */
472static int pmic8xxx_kp_probe(struct platform_device *pdev) 508static int pmic8xxx_kp_probe(struct platform_device *pdev)
473{ 509{
474 const struct pm8xxx_keypad_platform_data *pdata = 510 unsigned int rows, cols;
475 dev_get_platdata(&pdev->dev); 511 bool repeat;
476 const struct matrix_keymap_data *keymap_data; 512 bool wakeup;
477 struct pmic8xxx_kp *kp; 513 struct pmic8xxx_kp *kp;
478 int rc; 514 int rc;
479 unsigned int ctrl_val; 515 unsigned int ctrl_val;
480 516
481 if (!pdata || !pdata->num_cols || !pdata->num_rows || 517 rc = matrix_keypad_parse_of_params(&pdev->dev, &rows, &cols);
482 pdata->num_cols > PM8XXX_MAX_COLS || 518 if (rc)
483 pdata->num_rows > PM8XXX_MAX_ROWS || 519 return rc;
484 pdata->num_cols < PM8XXX_MIN_COLS) {
485 dev_err(&pdev->dev, "invalid platform data\n");
486 return -EINVAL;
487 }
488
489 if (!pdata->scan_delay_ms ||
490 pdata->scan_delay_ms > MAX_SCAN_DELAY ||
491 pdata->scan_delay_ms < MIN_SCAN_DELAY ||
492 !is_power_of_2(pdata->scan_delay_ms)) {
493 dev_err(&pdev->dev, "invalid keypad scan time supplied\n");
494 return -EINVAL;
495 }
496
497 if (!pdata->row_hold_ns ||
498 pdata->row_hold_ns > MAX_ROW_HOLD_DELAY ||
499 pdata->row_hold_ns < MIN_ROW_HOLD_DELAY ||
500 ((pdata->row_hold_ns % MIN_ROW_HOLD_DELAY) != 0)) {
501 dev_err(&pdev->dev, "invalid keypad row hold time supplied\n");
502 return -EINVAL;
503 }
504 520
505 if (!pdata->debounce_ms || 521 if (cols > PM8XXX_MAX_COLS || rows > PM8XXX_MAX_ROWS ||
506 ((pdata->debounce_ms % 5) != 0) || 522 cols < PM8XXX_MIN_COLS) {
507 pdata->debounce_ms > MAX_DEBOUNCE_TIME || 523 dev_err(&pdev->dev, "invalid platform data\n");
508 pdata->debounce_ms < MIN_DEBOUNCE_TIME) {
509 dev_err(&pdev->dev, "invalid debounce time supplied\n");
510 return -EINVAL; 524 return -EINVAL;
511 } 525 }
512 526
513 keymap_data = pdata->keymap_data; 527 repeat = !of_property_read_bool(pdev->dev.of_node,
514 if (!keymap_data) { 528 "linux,input-no-autorepeat");
515 dev_err(&pdev->dev, "no keymap data supplied\n"); 529 wakeup = of_property_read_bool(pdev->dev.of_node,
516 return -EINVAL; 530 "linux,keypad-wakeup");
517 }
518 531
519 kp = devm_kzalloc(&pdev->dev, sizeof(*kp), GFP_KERNEL); 532 kp = devm_kzalloc(&pdev->dev, sizeof(*kp), GFP_KERNEL);
520 if (!kp) 533 if (!kp)
@@ -526,7 +539,8 @@ static int pmic8xxx_kp_probe(struct platform_device *pdev)
526 539
527 platform_set_drvdata(pdev, kp); 540 platform_set_drvdata(pdev, kp);
528 541
529 kp->pdata = pdata; 542 kp->num_rows = rows;
543 kp->num_cols = cols;
530 kp->dev = &pdev->dev; 544 kp->dev = &pdev->dev;
531 545
532 kp->input = devm_input_allocate_device(&pdev->dev); 546 kp->input = devm_input_allocate_device(&pdev->dev);
@@ -547,8 +561,8 @@ static int pmic8xxx_kp_probe(struct platform_device *pdev)
547 return kp->key_stuck_irq; 561 return kp->key_stuck_irq;
548 } 562 }
549 563
550 kp->input->name = pdata->input_name ? : "PMIC8XXX keypad"; 564 kp->input->name = "PMIC8XXX keypad";
551 kp->input->phys = pdata->input_phys_device ? : "pmic8xxx_keypad/input0"; 565 kp->input->phys = "pmic8xxx_keypad/input0";
552 566
553 kp->input->id.bustype = BUS_I2C; 567 kp->input->id.bustype = BUS_I2C;
554 kp->input->id.version = 0x0001; 568 kp->input->id.version = 0x0001;
@@ -558,7 +572,7 @@ static int pmic8xxx_kp_probe(struct platform_device *pdev)
558 kp->input->open = pmic8xxx_kp_open; 572 kp->input->open = pmic8xxx_kp_open;
559 kp->input->close = pmic8xxx_kp_close; 573 kp->input->close = pmic8xxx_kp_close;
560 574
561 rc = matrix_keypad_build_keymap(keymap_data, NULL, 575 rc = matrix_keypad_build_keymap(NULL, NULL,
562 PM8XXX_MAX_ROWS, PM8XXX_MAX_COLS, 576 PM8XXX_MAX_ROWS, PM8XXX_MAX_COLS,
563 kp->keycodes, kp->input); 577 kp->keycodes, kp->input);
564 if (rc) { 578 if (rc) {
@@ -566,7 +580,7 @@ static int pmic8xxx_kp_probe(struct platform_device *pdev)
566 return rc; 580 return rc;
567 } 581 }
568 582
569 if (pdata->rep) 583 if (repeat)
570 __set_bit(EV_REP, kp->input->evbit); 584 __set_bit(EV_REP, kp->input->evbit);
571 input_set_capability(kp->input, EV_MSC, MSC_SCAN); 585 input_set_capability(kp->input, EV_MSC, MSC_SCAN);
572 586
@@ -576,7 +590,7 @@ static int pmic8xxx_kp_probe(struct platform_device *pdev)
576 memset(kp->keystate, 0xff, sizeof(kp->keystate)); 590 memset(kp->keystate, 0xff, sizeof(kp->keystate));
577 memset(kp->stuckstate, 0xff, sizeof(kp->stuckstate)); 591 memset(kp->stuckstate, 0xff, sizeof(kp->stuckstate));
578 592
579 rc = pmic8xxx_kpd_init(kp); 593 rc = pmic8xxx_kpd_init(kp, pdev);
580 if (rc < 0) { 594 if (rc < 0) {
581 dev_err(&pdev->dev, "unable to initialize keypad controller\n"); 595 dev_err(&pdev->dev, "unable to initialize keypad controller\n");
582 return rc; 596 return rc;
@@ -612,7 +626,7 @@ static int pmic8xxx_kp_probe(struct platform_device *pdev)
612 return rc; 626 return rc;
613 } 627 }
614 628
615 device_init_wakeup(&pdev->dev, pdata->wakeup); 629 device_init_wakeup(&pdev->dev, wakeup);
616 630
617 return 0; 631 return 0;
618} 632}
@@ -662,12 +676,20 @@ static int pmic8xxx_kp_resume(struct device *dev)
662static SIMPLE_DEV_PM_OPS(pm8xxx_kp_pm_ops, 676static SIMPLE_DEV_PM_OPS(pm8xxx_kp_pm_ops,
663 pmic8xxx_kp_suspend, pmic8xxx_kp_resume); 677 pmic8xxx_kp_suspend, pmic8xxx_kp_resume);
664 678
679static const struct of_device_id pm8xxx_match_table[] = {
680 { .compatible = "qcom,pm8058-keypad" },
681 { .compatible = "qcom,pm8921-keypad" },
682 { }
683};
684MODULE_DEVICE_TABLE(of, pm8xxx_match_table);
685
665static struct platform_driver pmic8xxx_kp_driver = { 686static struct platform_driver pmic8xxx_kp_driver = {
666 .probe = pmic8xxx_kp_probe, 687 .probe = pmic8xxx_kp_probe,
667 .driver = { 688 .driver = {
668 .name = PM8XXX_KEYPAD_DEV_NAME, 689 .name = "pm8xxx-keypad",
669 .owner = THIS_MODULE, 690 .owner = THIS_MODULE,
670 .pm = &pm8xxx_kp_pm_ops, 691 .pm = &pm8xxx_kp_pm_ops,
692 .of_match_table = pm8xxx_match_table,
671 }, 693 },
672}; 694};
673module_platform_driver(pmic8xxx_kp_driver); 695module_platform_driver(pmic8xxx_kp_driver);
diff --git a/include/linux/input/pmic8xxx-keypad.h b/include/linux/input/pmic8xxx-keypad.h
deleted file mode 100644
index 5f1e2f9ad959..000000000000
--- a/include/linux/input/pmic8xxx-keypad.h
+++ /dev/null
@@ -1,52 +0,0 @@
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 */
33struct 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__ */