diff options
| author | Stephen Boyd <sboyd@codeaurora.org> | 2014-03-29 15:35:35 -0400 |
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2014-03-30 16:25:19 -0400 |
| commit | 86ea5e6b793d45fa7d2aa504ac3aefc813f0fd55 (patch) | |
| tree | b6d996281712bd64eb47664422af180c4684b561 | |
| parent | a5dde0c72ccbb0f66b3491ee83f4c579aea0651d (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.txt | 89 | ||||
| -rw-r--r-- | drivers/input/keyboard/pmic8xxx-keypad.c | 150 | ||||
| -rw-r--r-- | include/linux/input/pmic8xxx-keypad.h | 52 |
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 @@ | |||
| 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 | }; | ||
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 | */ |
| 98 | struct pmic8xxx_kp { | 99 | struct 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++) { |
