aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input
diff options
context:
space:
mode:
authorChao Xie <chao.xie@marvell.com>2013-05-05 23:24:58 -0400
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2013-06-19 01:56:51 -0400
commit0a085a9482fa51efb58c9d351ea98e83c5df93fc (patch)
tree411592ae841ea8b18dce07a7e4bce3fce30fcadc /drivers/input
parent483180281f0ac60d1138710eb21f4b9961901294 (diff)
Input: pxa27x-keypad - use matrix_keymap for matrix keys
pxa27x-keypad includes matrix keys. Make use of matrix_keymap for the matrix keys. Signed-off-by: Chao Xie <chao.xie@marvell.com> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/keyboard/Kconfig1
-rw-r--r--drivers/input/keyboard/pxa27x_keypad.c35
2 files changed, 24 insertions, 12 deletions
diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
index 37c366623fc0..706e11bb6a32 100644
--- a/drivers/input/keyboard/Kconfig
+++ b/drivers/input/keyboard/Kconfig
@@ -451,6 +451,7 @@ config KEYBOARD_OPENCORES
451config KEYBOARD_PXA27x 451config KEYBOARD_PXA27x
452 tristate "PXA27x/PXA3xx keypad support" 452 tristate "PXA27x/PXA3xx keypad support"
453 depends on PXA27x || PXA3xx || ARCH_MMP 453 depends on PXA27x || PXA3xx || ARCH_MMP
454 select INPUT_MATRIXKMAP
454 help 455 help
455 Enable support for PXA27x/PXA3xx keypad controller. 456 Enable support for PXA27x/PXA3xx keypad controller.
456 457
diff --git a/drivers/input/keyboard/pxa27x_keypad.c b/drivers/input/keyboard/pxa27x_keypad.c
index b674e7aca404..5b2d8764dd37 100644
--- a/drivers/input/keyboard/pxa27x_keypad.c
+++ b/drivers/input/keyboard/pxa27x_keypad.c
@@ -118,25 +118,30 @@ struct pxa27x_keypad {
118 unsigned int direct_key_mask; 118 unsigned int direct_key_mask;
119}; 119};
120 120
121static void pxa27x_keypad_build_keycode(struct pxa27x_keypad *keypad) 121static int pxa27x_keypad_build_keycode(struct pxa27x_keypad *keypad)
122{ 122{
123 struct pxa27x_keypad_platform_data *pdata = keypad->pdata; 123 struct pxa27x_keypad_platform_data *pdata = keypad->pdata;
124 struct input_dev *input_dev = keypad->input_dev; 124 struct input_dev *input_dev = keypad->input_dev;
125 const struct matrix_keymap_data *keymap_data =
126 pdata ? pdata->matrix_keymap_data : NULL;
125 unsigned short keycode; 127 unsigned short keycode;
126 int i; 128 int i;
129 int error;
127 130
128 for (i = 0; i < pdata->matrix_key_map_size; i++) { 131 error = matrix_keypad_build_keymap(keymap_data, NULL,
129 unsigned int key = pdata->matrix_key_map[i]; 132 pdata->matrix_key_rows,
130 unsigned int row = KEY_ROW(key); 133 pdata->matrix_key_cols,
131 unsigned int col = KEY_COL(key); 134 keypad->keycodes, input_dev);
132 unsigned int scancode = MATRIX_SCAN_CODE(row, col, 135 if (error)
133 MATRIX_ROW_SHIFT); 136 return error;
134 137
135 keycode = KEY_VAL(key); 138 /*
136 keypad->keycodes[scancode] = keycode; 139 * The keycodes may not only include matrix keys but also the direct
137 __set_bit(keycode, input_dev->keybit); 140 * or rotary keys.
138 } 141 */
142 input_dev->keycodemax = ARRAY_SIZE(keypad->keycodes);
139 143
144 /* For direct keys. */
140 for (i = 0; i < pdata->direct_key_num; i++) { 145 for (i = 0; i < pdata->direct_key_num; i++) {
141 keycode = pdata->direct_key_map[i]; 146 keycode = pdata->direct_key_map[i];
142 keypad->keycodes[MAX_MATRIX_KEY_NUM + i] = keycode; 147 keypad->keycodes[MAX_MATRIX_KEY_NUM + i] = keycode;
@@ -178,6 +183,8 @@ static void pxa27x_keypad_build_keycode(struct pxa27x_keypad *keypad)
178 } 183 }
179 184
180 __clear_bit(KEY_RESERVED, input_dev->keybit); 185 __clear_bit(KEY_RESERVED, input_dev->keybit);
186
187 return 0;
181} 188}
182 189
183static void pxa27x_keypad_scan_matrix(struct pxa27x_keypad *keypad) 190static void pxa27x_keypad_scan_matrix(struct pxa27x_keypad *keypad)
@@ -555,7 +562,11 @@ static int pxa27x_keypad_probe(struct platform_device *pdev)
555 input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); 562 input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP);
556 input_set_capability(input_dev, EV_MSC, MSC_SCAN); 563 input_set_capability(input_dev, EV_MSC, MSC_SCAN);
557 564
558 pxa27x_keypad_build_keycode(keypad); 565 error = pxa27x_keypad_build_keycode(keypad);
566 if (error) {
567 dev_err(&pdev->dev, "failed to build keycode\n");
568 goto failed_put_clk;
569 }
559 570
560 if ((pdata->enable_rotary0 && keypad->rotary_rel_code[0] != -1) || 571 if ((pdata->enable_rotary0 && keypad->rotary_rel_code[0] != -1) ||
561 (pdata->enable_rotary1 && keypad->rotary_rel_code[1] != -1)) { 572 (pdata->enable_rotary1 && keypad->rotary_rel_code[1] != -1)) {