History

Input: matrix-keymap - uninline and prepare for device tree support

Change matrix-keymap helper to be out-of-line, like sparse keymap, allow the helper perform basic keymap validation and return errors, and prepare for device tree support.

Dmitry Torokhov committed 14 years ago

Commit 19328111 parent d0a345722 files · +265 −209Browse files

Unified · Split

22 files
  1. drivers/input/Kconfig +13 −4
  2. drivers/input/Makefile +1 −1
  3. drivers/input/keyboard/Kconfig +17 −1
  4. drivers/input/keyboard/ep93xx_keypad.c +8 −10
  5. drivers/input/keyboard/imx_keypad.c +10 −7
  6. drivers/input/keyboard/lm8333.c +7 −8
  7. drivers/input/keyboard/matrix_keypad.c +8 −9
  8. drivers/input/keyboard/nomadik-ske-keypad.c +10 −10
  9. drivers/input/keyboard/omap-keypad.c +10 −10
  10. drivers/input/keyboard/omap4-keypad.c +7 −8
  11. drivers/input/keyboard/pmic8xxx-keypad.c +10 −10
  12. drivers/input/keyboard/samsung-keypad.c +10 −10
  13. drivers/input/keyboard/spear-keyboard.c +11 −10
  14. drivers/input/keyboard/stmpe-keypad.c +7 −9
  15. drivers/input/keyboard/tc3589x-keypad.c +9 −10
  16. drivers/input/keyboard/tca8418_keypad.c +7 −8
  17. drivers/input/keyboard/tegra-kbc.c +20 −14
  18. drivers/input/keyboard/tnetv107x-keypad.c +11 −10
  19. drivers/input/keyboard/twl4030_keypad.c +12 −13
  20. drivers/input/keyboard/w90p910_keypad.c +14 −13
  21. drivers/input/matrix-keymap.c +57 −2
  22. include/linux/input/matrix_keypad.h +6 −32
drivers/input/Kconfig+13−4
@@ -25,10 +25,6 @@ config INPUT · 24 unmodified lines
2525
2626 if INPUT
2727
28−config INPUT_OF_MATRIX_KEYMAP
29− depends on USE_OF
30− bool
31−
3228 config INPUT_FF_MEMLESS
3329 tristate "Support for memoryless force-feedback devices"
3430 help
@@ -68,6 +64,19 @@ config INPUT_SPARSEKMAP · 33 unmodified lines
6864 To compile this driver as a module, choose M here: the
6965 module will be called sparse-keymap.
7066
67+config INPUT_MATRIXKMAP
68+ tristate "Matrix keymap support library"
69+ help
70+ Say Y here if you are using a driver for an input
71+ device that uses matrix keymap. This option is only
72+ useful for out-of-tree drivers since in-tree drivers
73+ select it automatically.
74+
75+ If unsure, say N.
76+
77+ To compile this driver as a module, choose M here: the
78+ module will be called matrix-keymap.
79+
7180 comment "Userland interfaces"
7281
7382 config INPUT_MOUSEDEV
drivers/input/Makefile+1−1
@@ -10,6 +10,7 @@ input-core-y := input.o input-compat.o input-mt.o ff-core.o · 9 unmodified lines
1010 obj-$(CONFIG_INPUT_FF_MEMLESS) += ff-memless.o
1111 obj-$(CONFIG_INPUT_POLLDEV) += input-polldev.o
1212 obj-$(CONFIG_INPUT_SPARSEKMAP) += sparse-keymap.o
13+obj-$(CONFIG_INPUT_MATRIXKMAP) += matrix-keymap.o
1314
1415 obj-$(CONFIG_INPUT_MOUSEDEV) += mousedev.o
1516 obj-$(CONFIG_INPUT_JOYDEV) += joydev.o
@@ -24,4 +25,3 @@ obj-$(CONFIG_INPUT_TOUCHSCREEN) += touchscreen/ · 8 unmodified lines
2425 obj-$(CONFIG_INPUT_MISC) += misc/
2526
2627 obj-$(CONFIG_INPUT_APMPOWER) += apm-power.o
27−obj-$(CONFIG_INPUT_OF_MATRIX_KEYMAP) += of_keymap.o
drivers/input/keyboard/Kconfig+17−1
@@ -166,6 +166,7 @@ config KEYBOARD_LKKBD · 165 unmodified lines
166166 config KEYBOARD_EP93XX
167167 tristate "EP93xx Matrix Keypad support"
168168 depends on ARCH_EP93XX
169+ select INPUT_MATRIXKMAP
169170 help
170171 Say Y here to enable the matrix keypad on the Cirrus EP93XX.
171172
@@ -224,6 +225,7 @@ config KEYBOARD_TCA6416 · 52 unmodified lines
224225 config KEYBOARD_TCA8418
225226 tristate "TCA8418 Keypad Support"
226227 depends on I2C
228+ select INPUT_MATRIXKMAP
227229 help
228230 This driver implements basic keypad functionality
229231 for keys connected through TCA8418 keypad decoder.
@@ -240,6 +242,7 @@ config KEYBOARD_TCA8418 · 10 unmodified lines
240242 config KEYBOARD_MATRIX
241243 tristate "GPIO driven matrix keypad support"
242244 depends on GENERIC_GPIO
245+ select INPUT_MATRIXKMAP
243246 help
244247 Enable support for GPIO driven matrix keypad.
245248
@@ -312,6 +315,7 @@ config KEYBOARD_LM8323 · 66 unmodified lines
312315 config KEYBOARD_LM8333
313316 tristate "LM8333 keypad chip"
314317 depends on I2C
318+ select INPUT_MATRIXKMAP
315319 help
316320 If you say yes here you get support for the National Semiconductor
317321 LM8333 keypad controller.
@@ -376,6 +380,7 @@ config KEYBOARD_MPR121 · 58 unmodified lines
376380 config KEYBOARD_IMX
377381 tristate "IMX keypad support"
378382 depends on ARCH_MXC
383+ select INPUT_MATRIXKMAP
379384 help
380385 Enable support for IMX keypad port.
381386
@@ -394,6 +399,7 @@ config KEYBOARD_NEWTON · 12 unmodified lines
394399 config KEYBOARD_NOMADIK
395400 tristate "ST-Ericsson Nomadik SKE keyboard"
396401 depends on PLAT_NOMADIK
402+ select INPUT_MATRIXKMAP
397403 help
398404 Say Y here if you want to use a keypad provided on the SKE controller
399405 used on the Ux500 and Nomadik platforms
@@ -404,7 +410,7 @@ config KEYBOARD_NOMADIK · 4 unmodified lines
404410 config KEYBOARD_TEGRA
405411 tristate "NVIDIA Tegra internal matrix keyboard controller support"
406412 depends on ARCH_TEGRA
407− select INPUT_OF_MATRIX_KEYMAP if USE_OF
413+ select INPUT_MATRIXKMAP
408414 help
409415 Say Y here if you want to use a matrix keyboard connected directly
410416 to the internal keyboard controller on Tegra SoCs.
@@ -442,6 +448,7 @@ config KEYBOARD_PXA930_ROTARY · 31 unmodified lines
442448 config KEYBOARD_PMIC8XXX
443449 tristate "Qualcomm PMIC8XXX keypad support"
444450 depends on MFD_PM8XXX
451+ select INPUT_MATRIXKMAP
445452 help
446453 Say Y here if you want to enable the driver for the PMIC8XXX
447454 keypad provided as a reference design from Qualcomm. This is intended
@@ -453,6 +460,7 @@ config KEYBOARD_PMIC8XXX · 5 unmodified lines
453460 config KEYBOARD_SAMSUNG
454461 tristate "Samsung keypad support"
455462 depends on HAVE_CLK
463+ select INPUT_MATRIXKMAP
456464 help
457465 Say Y here if you want to use the keypad on your Samsung mobile
458466 device.
@@ -495,6 +503,7 @@ config KEYBOARD_SH_KEYSC · 36 unmodified lines
495503 config KEYBOARD_STMPE
496504 tristate "STMPE keypad support"
497505 depends on MFD_STMPE
506+ select INPUT_MATRIXKMAP
498507 help
499508 Say Y here if you want to use the keypad controller on STMPE I/O
500509 expanders.
@@ -515,6 +524,7 @@ config KEYBOARD_DAVINCI · 14 unmodified lines
515524 config KEYBOARD_OMAP
516525 tristate "TI OMAP keypad support"
517526 depends on (ARCH_OMAP1 || ARCH_OMAP2)
527+ select INPUT_MATRIXKMAP
518528 help
519529 Say Y here if you want to use the OMAP keypad.
520530
@@ -523,6 +533,7 @@ config KEYBOARD_OMAP · 2 unmodified lines
523533
524534 config KEYBOARD_OMAP4
525535 tristate "TI OMAP4+ keypad support"
536+ select INPUT_MATRIXKMAP
526537 help
527538 Say Y here if you want to use the OMAP4+ keypad.
528539
@@ -532,6 +543,7 @@ config KEYBOARD_OMAP4 · 3 unmodified lines
532543 config KEYBOARD_SPEAR
533544 tristate "ST SPEAR keyboard support"
534545 depends on PLAT_SPEAR
546+ select INPUT_MATRIXKMAP
535547 help
536548 Say Y here if you want to use the SPEAR keyboard.
537549
@@ -541,6 +553,7 @@ config KEYBOARD_SPEAR · 3 unmodified lines
541553 config KEYBOARD_TC3589X
542554 tristate "TC3589X Keypad support"
543555 depends on MFD_TC3589X
556+ select INPUT_MATRIXKMAP
544557 help
545558 Say Y here if you want to use the keypad controller on
546559 TC35892/3 I/O expander.
@@ -551,6 +564,7 @@ config KEYBOARD_TC3589X · 4 unmodified lines
551564 config KEYBOARD_TNETV107X
552565 tristate "TI TNETV107X keypad support"
553566 depends on ARCH_DAVINCI_TNETV107X
567+ select INPUT_MATRIXKMAP
554568 help
555569 Say Y here if you want to use the TNETV107X keypad.
556570
@@ -560,6 +574,7 @@ config KEYBOARD_TNETV107X · 3 unmodified lines
560574 config KEYBOARD_TWL4030
561575 tristate "TI TWL4030/TWL5030/TPS659x0 keypad support"
562576 depends on TWL4030_CORE
577+ select INPUT_MATRIXKMAP
563578 help
564579 Say Y here if your board use the keypad controller on
565580 TWL4030 family chips. It's safe to say enable this
@@ -583,6 +598,7 @@ config KEYBOARD_XTKBD · 17 unmodified lines
583598 config KEYBOARD_W90P910
584599 tristate "W90P910 Matrix Keypad support"
585600 depends on ARCH_W90X900
601+ select INPUT_MATRIXKMAP
586602 help
587603 Say Y here to enable the matrix keypad on evaluation board
588604 based on W90P910.
drivers/input/keyboard/ep93xx_keypad.c+8−10
@@ -303,19 +303,16 @@ static int __devinit ep93xx_keypad_probe(struct platform_device *pdev) · 302 unmodified lines
303303 input_dev->open = ep93xx_keypad_open;
304304 input_dev->close = ep93xx_keypad_close;
305305 input_dev->dev.parent = &pdev->dev;
306− input_dev->keycode = keypad->keycodes;
307− input_dev->keycodesize = sizeof(keypad->keycodes[0]);
308− input_dev->keycodemax = ARRAY_SIZE(keypad->keycodes);
309306
310− input_set_drvdata(input_dev, keypad);
307+ err = matrix_keypad_build_keymap(keymap_data, NULL,
308+ EP93XX_MATRIX_ROWS, EP93XX_MATRIX_COLS,
309+ keypad->keycodes, input_dev);
310+ if (err)
311+ goto failed_free_dev;
311312
312− input_dev->evbit[0] = BIT_MASK(EV_KEY);
313313 if (keypad->pdata->flags & EP93XX_KEYPAD_AUTOREPEAT)
314− input_dev->evbit[0] |= BIT_MASK(EV_REP);
315−
316− matrix_keypad_build_keymap(keymap_data, 3,
317− input_dev->keycode, input_dev->keybit);
318− platform_set_drvdata(pdev, keypad);
314+ __set_bit(EV_REP, input_dev->evbit);
315+ input_set_drvdata(input_dev, keypad);
319316
320317 err = request_irq(keypad->irq, ep93xx_keypad_irq_handler,
321318 0, pdev->name, keypad);
@@ -326,6 +323,7 @@ static int __devinit ep93xx_keypad_probe(struct platform_device *pdev) · 4 unmodified lines
326323 if (err)
327324 goto failed_free_irq;
328325
326+ platform_set_drvdata(pdev, keypad);
329327 device_init_wakeup(&pdev->dev, 1);
330328
331329 return 0;
drivers/input/keyboard/imx_keypad.c+10−7
@@ -481,7 +481,7 @@ static int __devinit imx_keypad_probe(struct platform_device *pdev) · 480 unmodified lines
481481 }
482482
483483 if (keypad->rows_en_mask > ((1 << MAX_MATRIX_KEY_ROWS) - 1) ||
484− keypad->cols_en_mask > ((1 << MAX_MATRIX_KEY_COLS) - 1)) {
484+ keypad->cols_en_mask > ((1 << MAX_MATRIX_KEY_COLS) - 1)) {
485485 dev_err(&pdev->dev,
486486 "invalid key data (too many rows or colums)\n");
487487 error = -EINVAL;
@@ -496,14 +496,17 @@ static int __devinit imx_keypad_probe(struct platform_device *pdev) · 8 unmodified lines
496496 input_dev->dev.parent = &pdev->dev;
497497 input_dev->open = imx_keypad_open;
498498 input_dev->close = imx_keypad_close;
499− input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP);
500− input_dev->keycode = keypad->keycodes;
501− input_dev->keycodesize = sizeof(keypad->keycodes[0]);
502− input_dev->keycodemax = ARRAY_SIZE(keypad->keycodes);
503499
504− matrix_keypad_build_keymap(keymap_data, MATRIX_ROW_SHIFT,
505− keypad->keycodes, input_dev->keybit);
500+ error = matrix_keypad_build_keymap(keymap_data, NULL,
501+ MAX_MATRIX_KEY_ROWS,
502+ MAX_MATRIX_KEY_COLS,
503+ keypad->keycodes, input_dev);
504+ if (error) {
505+ dev_err(&pdev->dev, "failed to build keymap\n");
506+ goto failed_clock_put;
507+ }
506508
509+ __set_bit(EV_REP, input_dev->evbit);
507510 input_set_capability(input_dev, EV_MSC, MSC_SCAN);
508511 input_set_drvdata(input_dev, keypad);
509512
drivers/input/keyboard/lm8333.c+7−8
@@ -29,9 +29,9 @@ · 28 unmodified lines
2929
3030 #define LM8333_FIFO_TRANSFER_SIZE 16
3131
32−#define LM8333_ROW_SHIFT 4
3332 #define LM8333_NUM_ROWS 8
34−
33+#define LM8333_NUM_COLS 16
34+#define LM8333_ROW_SHIFT 4
3535
3636 struct lm8333 {
3737 struct i2c_client *client;
@@ -159,14 +159,13 @@ static int __devinit lm8333_probe(struct i2c_client *client, · 121 unmodified lines
159159 input->dev.parent = &client->dev;
160160 input->id.bustype = BUS_I2C;
161161
162− input->keycode = lm8333->keycodes;
163− input->keycodesize = sizeof(lm8333->keycodes[0]);
164− input->keycodemax = ARRAY_SIZE(lm8333->keycodes);
165− input->evbit[0] = BIT_MASK(EV_KEY);
166162 input_set_capability(input, EV_MSC, MSC_SCAN);
167163
168− matrix_keypad_build_keymap(pdata->matrix_data, LM8333_ROW_SHIFT,
169− input->keycode, input->keybit);
164+ err = matrix_keypad_build_keymap(pdata->matrix_data, NULL,
165+ LM8333_NUM_ROWS, LM8333_NUM_COLS,
166+ lm8333->keycodes, input);
167+ if (err)
168+ goto free_mem;
170169
171170 if (pdata->debounce_time) {
172171 err = lm8333_write8(lm8333, LM8333_DEBOUNCE,
drivers/input/keyboard/matrix_keypad.c+8−9
@@ -437,19 +437,18 @@ static int __devinit matrix_keypad_probe(struct platform_device *pdev) · 436 unmodified lines
437437 input_dev->name = pdev->name;
438438 input_dev->id.bustype = BUS_HOST;
439439 input_dev->dev.parent = &pdev->dev;
440− input_dev->evbit[0] = BIT_MASK(EV_KEY);
441− if (!pdata->no_autorepeat)
442− input_dev->evbit[0] |= BIT_MASK(EV_REP);
443440 input_dev->open = matrix_keypad_start;
444441 input_dev->close = matrix_keypad_stop;
445442
446− input_dev->keycode = keypad->keycodes;
447− input_dev->keycodesize = sizeof(keypad->keycodes[0]);
448− input_dev->keycodemax = pdata->num_row_gpios << row_shift;
449−
450− matrix_keypad_build_keymap(keymap_data, row_shift,
451− input_dev->keycode, input_dev->keybit);
443+ err = matrix_keypad_build_keymap(keymap_data, NULL,
444+ pdata->num_row_gpios,
445+ pdata->num_col_gpios,
446+ keypad->keycodes, input_dev);
447+ if (err)
448+ goto err_free_mem;
452449
450+ if (!pdata->no_autorepeat)
451+ __set_bit(EV_REP, input_dev->evbit);
453452 input_set_capability(input_dev, EV_MSC, MSC_SCAN);
454453 input_set_drvdata(input_dev, keypad);
455454
drivers/input/keyboard/nomadik-ske-keypad.c+10−10
@@ -39,7 +39,8 @@ · 38 unmodified lines
3939 #define SKE_KPRISA (0x1 << 2)
4040
4141 #define SKE_KEYPAD_ROW_SHIFT 3
42−#define SKE_KPD_KEYMAP_SIZE (8 * 8)
42+#define SKE_KPD_NUM_ROWS 8
43+#define SKE_KPD_NUM_COLS 8
4344
4445 /* keypad auto scan registers */
4546 #define SKE_ASR0 0x20
@@ -63,7 +64,7 @@ struct ske_keypad { · 17 unmodified lines
6364 void __iomem *reg_base;
6465 struct input_dev *input;
6566 const struct ske_keypad_platform_data *board;
66− unsigned short keymap[SKE_KPD_KEYMAP_SIZE];
67+ unsigned short keymap[SKE_KPD_NUM_ROWS * SKE_KPD_NUM_COLS];
6768 struct clk *clk;
6869 spinlock_t ske_keypad_lock;
6970 };
@@ -261,19 +262,18 @@ static int __init ske_keypad_probe(struct platform_device *pdev) · 191 unmodified lines
261262 input->name = "ux500-ske-keypad";
262263 input->dev.parent = &pdev->dev;
263264
264− input->keycode = keypad->keymap;
265− input->keycodesize = sizeof(keypad->keymap[0]);
266− input->keycodemax = ARRAY_SIZE(keypad->keymap);
265+ error = matrix_keypad_build_keymap(plat->keymap_data, NULL,
266+ SKE_KPD_NUM_ROWS, SKE_KPD_NUM_COLS,
267+ keypad->keymap, input);
268+ if (error) {
269+ dev_err(&pdev->dev, "Failed to build keymap\n");
270+ goto err_iounmap;
271+ }
267272
268273 input_set_capability(input, EV_MSC, MSC_SCAN);
269−
270− __set_bit(EV_KEY, input->evbit);
271274 if (!plat->no_autorepeat)
272275 __set_bit(EV_REP, input->evbit);
273276
274− matrix_keypad_build_keymap(plat->keymap_data, SKE_KEYPAD_ROW_SHIFT,
275− input->keycode, input->keybit);
276−
277277 clk_enable(keypad->clk);
278278
279279 /* go through board initialization helpers */
drivers/input/keyboard/omap-keypad.c+10−10
@@ -61,6 +61,7 @@ struct omap_kp { · 60 unmodified lines
6161 unsigned int cols;
6262 unsigned long delay;
6363 unsigned int debounce;
64+ unsigned short keymap[];
6465 };
6566
6667 static DECLARE_TASKLET_DISABLED(kp_tasklet, omap_kp_tasklet, 0);
@@ -316,13 +317,6 @@ static int __devinit omap_kp_probe(struct platform_device *pdev) · 249 unmodified lines
316317 if (!cpu_is_omap24xx())
317318 omap_writew(1, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT);
318319
319− input_dev->keycode = &omap_kp[1];
320− input_dev->keycodesize = sizeof(unsigned short);
321− input_dev->keycodemax = keycodemax;
322−
323− if (pdata->rep)
324− __set_bit(EV_REP, input_dev->evbit);
325−
326320 if (pdata->delay)
327321 omap_kp->delay = pdata->delay;
328322
@@ -371,9 +365,6 @@ static int __devinit omap_kp_probe(struct platform_device *pdev) · 42 unmodified lines
371365 goto err2;
372366
373367 /* setup input device */
374− __set_bit(EV_KEY, input_dev->evbit);
375− matrix_keypad_build_keymap(pdata->keymap_data, row_shift,
376− input_dev->keycode, input_dev->keybit);
377368 input_dev->name = "omap-keypad";
378369 input_dev->phys = "omap-keypad/input0";
379370 input_dev->dev.parent = &pdev->dev;
@@ -383,6 +374,15 @@ static int __devinit omap_kp_probe(struct platform_device *pdev) · 3 unmodified lines
383374 input_dev->id.product = 0x0001;
384375 input_dev->id.version = 0x0100;
385376
377+ if (pdata->rep)
378+ __set_bit(EV_REP, input_dev->evbit);
379+
380+ ret = matrix_keypad_build_keymap(pdata->keymap_data, NULL,
381+ pdata->rows, pdata->cols,
382+ omap_kp->keymap, input_dev);
383+ if (ret < 0)
384+ goto err3;
385+
386386 ret = input_register_device(omap_kp->input);
387387 if (ret < 0) {
388388 printk(KERN_ERR "Unable to register omap-keypad input device\n");
drivers/input/keyboard/omap4-keypad.c+7−8
@@ -322,20 +322,19 @@ static int __devinit omap4_keypad_probe(struct platform_device *pdev) · 321 unmodified lines
322322 input_dev->open = omap4_keypad_open;
323323 input_dev->close = omap4_keypad_close;
324324
325− input_dev->keycode = keypad_data->keymap;
326− input_dev->keycodesize = sizeof(keypad_data->keymap[0]);
327− input_dev->keycodemax = max_keys;
325+ error = matrix_keypad_build_keymap(pdata->keymap_data, NULL,
326+ pdata->rows, pdata->cols,
327+ keypad_data->keymap, input_dev);
328+ if (error) {
329+ dev_err(&pdev->dev, "failed to build keymap\n");
330+ goto err_free_input;
331+ }
328332
329− __set_bit(EV_KEY, input_dev->evbit);
330333 __set_bit(EV_REP, input_dev->evbit);
331−
332334 input_set_capability(input_dev, EV_MSC, MSC_SCAN);
333335
334336 input_set_drvdata(input_dev, keypad_data);
335337
336− matrix_keypad_build_keymap(pdata->keymap_data, row_shift,
337− input_dev->keycode, input_dev->keybit);
338−
339338 error = request_irq(keypad_data->irq, omap4_keypad_interrupt,
340339 IRQF_TRIGGER_RISING,
341340 "omap4-keypad", keypad_data);
drivers/input/keyboard/pmic8xxx-keypad.c+10−10
@@ -626,21 +626,21 @@ static int __devinit pmic8xxx_kp_probe(struct platform_device *pdev) · 625 unmodified lines
626626 kp->input->id.product = 0x0001;
627627 kp->input->id.vendor = 0x0001;
628628
629− kp->input->evbit[0] = BIT_MASK(EV_KEY);
630−
631− if (pdata->rep)
632− __set_bit(EV_REP, kp->input->evbit);
633−
634− kp->input->keycode = kp->keycodes;
635− kp->input->keycodemax = PM8XXX_MATRIX_MAX_SIZE;
636− kp->input->keycodesize = sizeof(kp->keycodes);
637629 kp->input->open = pmic8xxx_kp_open;
638630 kp->input->close = pmic8xxx_kp_close;
639631
640− matrix_keypad_build_keymap(keymap_data, PM8XXX_ROW_SHIFT,
641− kp->input->keycode, kp->input->keybit);
632+ rc = matrix_keypad_build_keymap(keymap_data, NULL,
633+ PM8XXX_MAX_ROWS, PM8XXX_MAX_COLS,
634+ kp->keycodes, kp->input);
635+ if (rc) {
636+ dev_err(&pdev->dev, "failed to build keymap\n");
637+ goto err_get_irq;
638+ }
642639
640+ if (pdata->rep)
641+ __set_bit(EV_REP, kp->input->evbit);
643642 input_set_capability(kp->input, EV_MSC, MSC_SCAN);
643+
644644 input_set_drvdata(kp->input, kp);
645645
646646 /* initialize keypad state */
drivers/input/keyboard/samsung-keypad.c+10−10
@@ -454,23 +454,23 @@ static int __devinit samsung_keypad_probe(struct platform_device *pdev) · 453 unmodified lines
454454 input_dev->name = pdev->name;
455455 input_dev->id.bustype = BUS_HOST;
456456 input_dev->dev.parent = &pdev->dev;
457− input_set_drvdata(input_dev, keypad);
458457
459458 input_dev->open = samsung_keypad_open;
460459 input_dev->close = samsung_keypad_close;
461460
462− input_dev->evbit[0] = BIT_MASK(EV_KEY);
463− if (!pdata->no_autorepeat)
464− input_dev->evbit[0] |= BIT_MASK(EV_REP);
461+ error = matrix_keypad_build_keymap(keymap_data, NULL,
462+ pdata->rows, pdata->cols,
463+ keypad->keycodes, input_dev);
464+ if (error) {
465+ dev_err(&pdev->dev, "failed to build keymap\n");
466+ goto err_put_clk;
467+ }
465468
466469 input_set_capability(input_dev, EV_MSC, MSC_SCAN);
470+ if (!pdata->no_autorepeat)
471+ __set_bit(EV_REP, input_dev->evbit);
467472
468− input_dev->keycode = keypad->keycodes;
469− input_dev->keycodesize = sizeof(keypad->keycodes[0]);
470− input_dev->keycodemax = pdata->rows << row_shift;
471−
472− matrix_keypad_build_keymap(keymap_data, row_shift,
473− input_dev->keycode, input_dev->keybit);
473+ input_set_drvdata(input_dev, keypad);
474474
475475 keypad->irq = platform_get_irq(pdev, 0);
476476 if (keypad->irq < 0) {
drivers/input/keyboard/spear-keyboard.c+11−10
@@ -49,7 +49,9 @@ · 48 unmodified lines
4949 #define KEY_VALUE 0x00FFFFFF
5050 #define ROW_MASK 0xF0
5151 #define COLUMN_MASK 0x0F
52−#define ROW_SHIFT 4
52+#define NUM_ROWS 16
53+#define NUM_COLS 16
54+
5355 #define KEY_MATRIX_SHIFT 6
5456
5557 struct spear_kbd {
@@ -60,7 +62,7 @@ struct spear_kbd { · 4 unmodified lines
6062 unsigned int irq;
6163 unsigned int mode;
6264 unsigned short last_key;
63− unsigned short keycodes[256];
65+ unsigned short keycodes[NUM_ROWS * NUM_COLS];
6466 };
6567
6668 static irqreturn_t spear_kbd_interrupt(int irq, void *dev_id)
@@ -212,18 +214,17 @@ static int __devinit spear_kbd_probe(struct platform_device *pdev) · 145 unmodified lines
212214 input_dev->open = spear_kbd_open;
213215 input_dev->close = spear_kbd_close;
214216
215− __set_bit(EV_KEY, input_dev->evbit);
217+ error = matrix_keypad_build_keymap(keymap, NULL, NUM_ROWS, NUM_COLS,
218+ kbd->keycodes, input_dev);
219+ if (error) {
220+ dev_err(&pdev->dev, "Failed to build keymap\n");
221+ goto err_put_clk;
222+ }
223+
216224 if (pdata->rep)
217225 __set_bit(EV_REP, input_dev->evbit);
218226 input_set_capability(input_dev, EV_MSC, MSC_SCAN);
219227
220− input_dev->keycode = kbd->keycodes;
221− input_dev->keycodesize = sizeof(kbd->keycodes[0]);
222− input_dev->keycodemax = ARRAY_SIZE(kbd->keycodes);
223−
224− matrix_keypad_build_keymap(keymap, ROW_SHIFT,
225− input_dev->keycode, input_dev->keybit);
226−
227228 input_set_drvdata(input_dev, kbd);
228229
229230 error = request_irq(irq, spear_kbd_interrupt, 0, "keyboard", kbd);
drivers/input/keyboard/stmpe-keypad.c+7−9
@@ -289,19 +289,17 @@ static int __devinit stmpe_keypad_probe(struct platform_device *pdev) · 288 unmodified lines
289289 input->id.bustype = BUS_I2C;
290290 input->dev.parent = &pdev->dev;
291291
292− input_set_capability(input, EV_MSC, MSC_SCAN);
292+ ret = matrix_keypad_build_keymap(plat->keymap_data, NULL,
293+ STMPE_KEYPAD_MAX_ROWS,
294+ STMPE_KEYPAD_MAX_COLS,
295+ keypad->keymap, input);
296+ if (ret)
297+ goto out_freeinput;
293298
294− __set_bit(EV_KEY, input->evbit);
299+ input_set_capability(input, EV_MSC, MSC_SCAN);
295300 if (!plat->no_autorepeat)
296301 __set_bit(EV_REP, input->evbit);
297302
298− input->keycode = keypad->keymap;
299− input->keycodesize = sizeof(keypad->keymap[0]);
300− input->keycodemax = ARRAY_SIZE(keypad->keymap);
301−
302− matrix_keypad_build_keymap(plat->keymap_data, STMPE_KEYPAD_ROW_SHIFT,
303− input->keycode, input->keybit);
304−
305303 for (i = 0; i < plat->keymap_data->keymap_size; i++) {
306304 unsigned int key = plat->keymap_data->keymap[i];
307305
drivers/input/keyboard/tc3589x-keypad.c+9−10
@@ -78,7 +78,7 @@ · 77 unmodified lines
7878 * @input: pointer to input device object
7979 * @board: keypad platform device
8080 * @krow: number of rows
81− * @kcol: number of coloumns
81+ * @kcol: number of columns
8282 * @keymap: matrix scan code table for keycodes
8383 * @keypad_stopped: holds keypad status
8484 */
@@ -333,23 +333,22 @@ static int __devinit tc3589x_keypad_probe(struct platform_device *pdev) · 248 unmodified lines
333333 input->name = pdev->name;
334334 input->dev.parent = &pdev->dev;
335335
336− input->keycode = keypad->keymap;
337− input->keycodesize = sizeof(keypad->keymap[0]);
338− input->keycodemax = ARRAY_SIZE(keypad->keymap);
339−
340336 input->open = tc3589x_keypad_open;
341337 input->close = tc3589x_keypad_close;
342338
343− input_set_drvdata(input, keypad);
339+ error = matrix_keypad_build_keymap(plat->keymap_data, NULL,
340+ TC3589x_MAX_KPROW, TC3589x_MAX_KPCOL,
341+ keypad->keymap, input);
342+ if (error) {
343+ dev_err(&pdev->dev, "Failed to build keymap\n");
344+ goto err_free_mem;
345+ }
344346
345347 input_set_capability(input, EV_MSC, MSC_SCAN);
346−
347− __set_bit(EV_KEY, input->evbit);
348348 if (!plat->no_autorepeat)
349349 __set_bit(EV_REP, input->evbit);
350350
351− matrix_keypad_build_keymap(plat->keymap_data, 0x3,
352− input->keycode, input->keybit);
351+ input_set_drvdata(input, keypad);
353352
354353 error = request_threaded_irq(irq, NULL,
355354 tc3589x_keypad_irq, plat->irqtype,
drivers/input/keyboard/tca8418_keypad.c+7−8
@@ -342,21 +342,20 @@ static int __devinit tca8418_keypad_probe(struct i2c_client *client, · 341 unmodified lines
342342 input->id.product = 0x001;
343343 input->id.version = 0x0001;
344344
345− input->keycode = keypad_data->keymap;
346− input->keycodesize = sizeof(keypad_data->keymap[0]);
347− input->keycodemax = max_keys;
345+ error = matrix_keypad_build_keymap(pdata->keymap_data, NULL,
346+ pdata->rows, pdata->cols,
347+ keypad_data->keymap, input);
348+ if (error) {
349+ dev_dbg(&client->dev, "Failed to build keymap\n");
350+ goto fail2;
351+ }
348352
349− __set_bit(EV_KEY, input->evbit);
350353 if (pdata->rep)
351354 __set_bit(EV_REP, input->evbit);
352−
353355 input_set_capability(input, EV_MSC, MSC_SCAN);
354356
355357 input_set_drvdata(input, keypad_data);
356358
357− matrix_keypad_build_keymap(pdata->keymap_data, row_shift,
358− input->keycode, input->keybit);
359−
360359 if (pdata->irq_is_gpio)
361360 client->irq = gpio_to_irq(client->irq);
362361
drivers/input/keyboard/tegra-kbc.c+20−14
@@ -686,6 +686,7 @@ static int __devinit tegra_kbc_probe(struct platform_device *pdev) · 685 unmodified lines
686686 int num_rows = 0;
687687 unsigned int debounce_cnt;
688688 unsigned int scan_time_rows;
689+ unsigned int keymap_rows;
689690
690691 if (!pdata)
691692 pdata = tegra_kbc_dt_parse_pdata(pdev);
@@ -757,29 +758,34 @@ static int __devinit tegra_kbc_probe(struct platform_device *pdev) · 65 unmodified lines
757758 kbc->repoll_dly = KBC_ROW_SCAN_DLY + scan_time_rows + pdata->repeat_cnt;
758759 kbc->repoll_dly = DIV_ROUND_UP(kbc->repoll_dly, KBC_CYCLE_MS);
759760
761+ kbc->wakeup_key = pdata->wakeup_key;
762+ kbc->use_fn_map = pdata->use_fn_map;
763+ kbc->use_ghost_filter = pdata->use_ghost_filter;
764+
760765 input_dev->name = pdev->name;
761766 input_dev->id.bustype = BUS_HOST;
762767 input_dev->dev.parent = &pdev->dev;
763768 input_dev->open = tegra_kbc_open;
764769 input_dev->close = tegra_kbc_close;
765770
766− input_set_drvdata(input_dev, kbc);
767−
768− input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP);
769− input_set_capability(input_dev, EV_MSC, MSC_SCAN);
770−
771− input_dev->keycode = kbc->keycode;
772− input_dev->keycodesize = sizeof(kbc->keycode[0]);
773− input_dev->keycodemax = KBC_MAX_KEY;
771+ keymap_rows = KBC_MAX_KEY;
774772 if (pdata->use_fn_map)
775− input_dev->keycodemax *= 2;
773+ keymap_rows *= 2;
776774
777− kbc->use_fn_map = pdata->use_fn_map;
778− kbc->use_ghost_filter = pdata->use_ghost_filter;
779775 keymap_data = pdata->keymap_data ?: &tegra_kbc_default_keymap_data;
780− matrix_keypad_build_keymap(keymap_data, KBC_ROW_SHIFT,
781− input_dev->keycode, input_dev->keybit);
782− kbc->wakeup_key = pdata->wakeup_key;
776+
777+ err = matrix_keypad_build_keymap(keymap_data, NULL,
778+ keymap_rows, KBC_MAX_COL,
779+ kbc->keycode, input_dev);
780+ if (err) {
781+ dev_err(&pdev->dev, "failed to build keymap\n");
782+ goto err_put_clk;
783+ }
784+
785+ __set_bit(EV_REP, input_dev->evbit);
786+ input_set_capability(input_dev, EV_MSC, MSC_SCAN);
787+
788+ input_set_drvdata(input_dev, kbc);
783789
784790 err = request_irq(kbc->irq, tegra_kbc_isr,
785791 IRQF_NO_SUSPEND | IRQF_TRIGGER_HIGH, pdev->name, kbc);
drivers/input/keyboard/tnetv107x-keypad.c+11−10
@@ -247,15 +247,11 @@ static int __devinit keypad_probe(struct platform_device *pdev) · 246 unmodified lines
247247 error = -ENOMEM;
248248 goto error_input;
249249 }
250− input_set_drvdata(kp->input_dev, kp);
251250
252251 kp->input_dev->name = pdev->name;
253252 kp->input_dev->dev.parent = &pdev->dev;
254253 kp->input_dev->open = keypad_start;
255254 kp->input_dev->close = keypad_stop;
256− kp->input_dev->evbit[0] = BIT_MASK(EV_KEY);
257− if (!pdata->no_autorepeat)
258− kp->input_dev->evbit[0] |= BIT_MASK(EV_REP);
259255
260256 clk_enable(kp->clk);
261257 rev = keypad_read(kp, rev);
@@ -264,15 +260,20 @@ static int __devinit keypad_probe(struct platform_device *pdev) · 2 unmodified lines
264260 kp->input_dev->id.version = ((rev >> 16) & 0xfff);
265261 clk_disable(kp->clk);
266262
267− kp->input_dev->keycode = kp->keycodes;
268− kp->input_dev->keycodesize = sizeof(kp->keycodes[0]);
269− kp->input_dev->keycodemax = kp->rows << kp->row_shift;
270−
271− matrix_keypad_build_keymap(keymap_data, kp->row_shift, kp->keycodes,
272− kp->input_dev->keybit);
263+ error = matrix_keypad_build_keymap(keymap_data, NULL,
264+ kp->rows, kp->cols,
265+ kp->keycodes, kp->input_dev);
266+ if (error) {
267+ dev_err(dev, "Failed to build keymap\n");
268+ goto error_reg;
269+ }
273270
271+ if (!pdata->no_autorepeat)
272+ kp->input_dev->evbit[0] |= BIT_MASK(EV_REP);
274273 input_set_capability(kp->input_dev, EV_MSC, MSC_SCAN);
275274
275+ input_set_drvdata(kp->input_dev, kp);
276+
276277 error = input_register_device(kp->input_dev);
277278 if (error < 0) {
278279 dev_err(dev, "Could not register input device\n");
drivers/input/keyboard/twl4030_keypad.c+12−13
@@ -361,14 +361,6 @@ static int __devinit twl4030_kp_probe(struct platform_device *pdev) · 360 unmodified lines
361361 kp->irq = platform_get_irq(pdev, 0);
362362
363363 /* setup input device */
364− __set_bit(EV_KEY, input->evbit);
365−
366− /* Enable auto repeat feature of Linux input subsystem */
367− if (pdata->rep)
368− __set_bit(EV_REP, input->evbit);
369−
370− input_set_capability(input, EV_MSC, MSC_SCAN);
371−
372364 input->name = "TWL4030 Keypad";
373365 input->phys = "twl4030_keypad/input0";
374366 input->dev.parent = &pdev->dev;
@@ -378,12 +370,19 @@ static int __devinit twl4030_kp_probe(struct platform_device *pdev) · 3 unmodified lines
378370 input->id.product = 0x0001;
379371 input->id.version = 0x0003;
380372
381− input->keycode = kp->keymap;
382− input->keycodesize = sizeof(kp->keymap[0]);
383− input->keycodemax = ARRAY_SIZE(kp->keymap);
373+ error = matrix_keypad_build_keymap(keymap_data, NULL,
374+ TWL4030_MAX_ROWS,
375+ 1 << TWL4030_ROW_SHIFT,
376+ kp->keymap, input);
377+ if (error) {
378+ dev_err(kp->dbg_dev, "Failed to build keymap\n");
379+ goto err1;
380+ }
384381
385− matrix_keypad_build_keymap(keymap_data, TWL4030_ROW_SHIFT,
386− input->keycode, input->keybit);
382+ input_set_capability(input, EV_MSC, MSC_SCAN);
383+ /* Enable auto repeat feature of Linux input subsystem */
384+ if (pdata->rep)
385+ __set_bit(EV_REP, input->evbit);
387386
388387 error = input_register_device(input);
389388 if (error) {
drivers/input/keyboard/w90p910_keypad.c+14−13
@@ -42,7 +42,8 @@ · 41 unmodified lines
4242 #define KGET_RAW(n) (((n) & KEY0R) >> 3)
4343 #define KGET_COLUMN(n) ((n) & KEY0C)
4444
45−#define W90P910_MAX_KEY_NUM (8 * 8)
45+#define W90P910_NUM_ROWS 8
46+#define W90P910_NUM_COLS 8
4647 #define W90P910_ROW_SHIFT 3
4748
4849 struct w90p910_keypad {
@@ -51,7 +52,7 @@ struct w90p910_keypad { · 2 unmodified lines
5152 struct input_dev *input_dev;
5253 void __iomem *mmio_base;
5354 int irq;
54− unsigned short keymap[W90P910_MAX_KEY_NUM];
55+ unsigned short keymap[W90P910_NUM_ROWS * W90P910_NUM_COLS];
5556 };
5657
5758 static void w90p910_keypad_scan_matrix(struct w90p910_keypad *keypad,
@@ -190,17 +191,13 @@ static int __devinit w90p910_keypad_probe(struct platform_device *pdev) · 132 unmodified lines
190191 input_dev->close = w90p910_keypad_close;
191192 input_dev->dev.parent = &pdev->dev;
192193
193− input_dev->keycode = keypad->keymap;
194− input_dev->keycodesize = sizeof(keypad->keymap[0]);
195− input_dev->keycodemax = ARRAY_SIZE(keypad->keymap);
196−
197− input_set_drvdata(input_dev, keypad);
198−
199− input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP);
200− input_set_capability(input_dev, EV_MSC, MSC_SCAN);
201−
202− matrix_keypad_build_keymap(keymap_data, W90P910_ROW_SHIFT,
203− input_dev->keycode, input_dev->keybit);
194+ error = matrix_keypad_build_keymap(keymap_data, NULL,
195+ W90P910_NUM_ROWS, W90P910_NUM_COLS,
196+ keypad->keymap, input_dev);
197+ if (error) {
198+ dev_err(&pdev->dev, "failed to build keymap\n");
199+ goto failed_put_clk;
200+ }
204201
205202 error = request_irq(keypad->irq, w90p910_keypad_irq_handler,
206203 0, pdev->name, keypad);
@@ -209,6 +206,10 @@ static int __devinit w90p910_keypad_probe(struct platform_device *pdev) · 2 unmodified lines
209206 goto failed_put_clk;
210207 }
211208
209+ __set_bit(EV_REP, input_dev->evbit);
210+ input_set_capability(input_dev, EV_MSC, MSC_SCAN);
211+ input_set_drvdata(input_dev, keypad);
212+
212213 /* Register the input device */
213214 error = input_register_device(input_dev);
214215 if (error) {
drivers/input/matrix-keymap.crenamed from drivers/input/of_keymap.c+57−2
@@ -1,5 +1,5 @@
11 /*
2− * Helpers for open firmware matrix keyboard bindings
2+ * Helpers for matrix keyboard bindings
33 *
44 * Copyright (C) 2012 Google, Inc
55 *
@@ -21,11 +21,65 @@ · 15 unmodified lines
2121 #include <linux/types.h>
2222 #include <linux/input.h>
2323 #include <linux/of.h>
24−#include <linux/input/matrix_keypad.h>
2524 #include <linux/export.h>
2625 #include <linux/gfp.h>
2726 #include <linux/slab.h>
27+#include <linux/input/matrix_keypad.h>
28+
29+
30+/**
31+ * matrix_keypad_build_keymap - convert platform keymap into matrix keymap
32+ * @keymap_data: keymap supplied by the platform code
33+ * @keymap_name: name of device tree property containing keymap (if device
34+ * tree support is enabled).
35+ * @rows: number of rows in target keymap array
36+ * @cols: number of cols in target keymap array
37+ * @keymap: expanded version of keymap that is suitable for use by
38+ * matrix keyboard driver
39+ * @input_dev: input devices for which we are setting up the keymap
40+ *
41+ * This function converts platform keymap (encoded with KEY() macro) into
42+ * an array of keycodes that is suitable for using in a standard matrix
43+ * keyboard driver that uses row and col as indices.
44+ */
45+int matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data,
46+ const char *keymap_name,
47+ unsigned int rows, unsigned int cols,
48+ unsigned short *keymap,
49+ struct input_dev *input_dev)
50+{
51+ unsigned int row_shift = get_count_order(cols);
52+ int i;
53+
54+ input_dev->keycode = keymap;
55+ input_dev->keycodesize = sizeof(*keymap);
56+ input_dev->keycodemax = rows << row_shift;
57+
58+ __set_bit(EV_KEY, input_dev->evbit);
59+
60+ for (i = 0; i < keymap_data->keymap_size; i++) {
61+ unsigned int key = keymap_data->keymap[i];
62+ unsigned int row = KEY_ROW(key);
63+ unsigned int col = KEY_COL(key);
64+ unsigned short code = KEY_VAL(key);
65+
66+ if (row >= rows || col >= cols) {
67+ dev_err(input_dev->dev.parent,
68+ "%s: invalid keymap entry %d (row: %d, col: %d, rows: %d, cols: %d)\n",
69+ __func__, i, row, col, rows, cols);
70+ return -EINVAL;
71+ }
72+
73+ keymap[MATRIX_SCAN_CODE(row, col, row_shift)] = code;
74+ __set_bit(code, input_dev->keybit);
75+ }
76+ __clear_bit(KEY_RESERVED, input_dev->keybit);
77+
78+ return 0;
79+}
80+EXPORT_SYMBOL(matrix_keypad_build_keymap);
2881
82+#ifdef CONFIG_OF
2983 struct matrix_keymap_data *
3084 matrix_keyboard_of_fill_keymap(struct device_node *np,
3185 const char *propname)
@@ -85,3 +139,4 @@ void matrix_keyboard_of_free_keymap(const struct matrix_keymap_data *kd) · 53 unmodified lines
85139 }
86140 }
87141 EXPORT_SYMBOL_GPL(matrix_keyboard_of_free_keymap);
142+#endif
include/linux/input/matrix_keypad.h+6−32
@@ -75,39 +75,13 @@ struct matrix_keypad_platform_data { · 74 unmodified lines
7575 bool no_autorepeat;
7676 };
7777
78−/**
79− * matrix_keypad_build_keymap - convert platform keymap into matrix keymap
80− * @keymap_data: keymap supplied by the platform code
81− * @row_shift: number of bits to shift row value by to advance to the next
82− * line in the keymap
83− * @keymap: expanded version of keymap that is suitable for use by
84− * matrix keyboad driver
85− * @keybit: pointer to bitmap of keys supported by input device
86− *
87− * This function converts platform keymap (encoded with KEY() macro) into
88− * an array of keycodes that is suitable for using in a standard matrix
89− * keyboard driver that uses row and col as indices.
90− */
91−static inline void
92−matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data,
93− unsigned int row_shift,
94− unsigned short *keymap, unsigned long *keybit)
95−{
96− int i;
97−
98− for (i = 0; i < keymap_data->keymap_size; i++) {
99− unsigned int key = keymap_data->keymap[i];
100− unsigned int row = KEY_ROW(key);
101− unsigned int col = KEY_COL(key);
102− unsigned short code = KEY_VAL(key);
103−
104− keymap[MATRIX_SCAN_CODE(row, col, row_shift)] = code;
105− __set_bit(code, keybit);
106− }
107− __clear_bit(KEY_RESERVED, keybit);
108−}
78+int matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data,
79+ const char *keymap_name,
80+ unsigned int rows, unsigned int cols,
81+ unsigned short *keymap,
82+ struct input_dev *input_dev);
10983
110−#ifdef CONFIG_INPUT_OF_MATRIX_KEYMAP
84+#ifdef CONFIG_OF
11185 struct matrix_keymap_data *
11286 matrix_keyboard_of_fill_keymap(struct device_node *np, const char *propname);
11387