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++) {