diff options
Diffstat (limited to 'drivers/input/keyboard/imx_keypad.c')
-rw-r--r-- | drivers/input/keyboard/imx_keypad.c | 43 |
1 files changed, 25 insertions, 18 deletions
diff --git a/drivers/input/keyboard/imx_keypad.c b/drivers/input/keyboard/imx_keypad.c index 6d150e3e1f55..98f9113251d2 100644 --- a/drivers/input/keyboard/imx_keypad.c +++ b/drivers/input/keyboard/imx_keypad.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/jiffies.h> | 20 | #include <linux/jiffies.h> |
21 | #include <linux/kernel.h> | 21 | #include <linux/kernel.h> |
22 | #include <linux/module.h> | 22 | #include <linux/module.h> |
23 | #include <linux/of.h> | ||
23 | #include <linux/platform_device.h> | 24 | #include <linux/platform_device.h> |
24 | #include <linux/slab.h> | 25 | #include <linux/slab.h> |
25 | #include <linux/timer.h> | 26 | #include <linux/timer.h> |
@@ -414,15 +415,23 @@ open_err: | |||
414 | return -EIO; | 415 | return -EIO; |
415 | } | 416 | } |
416 | 417 | ||
418 | #ifdef CONFIG_OF | ||
419 | static struct of_device_id imx_keypad_of_match[] = { | ||
420 | { .compatible = "fsl,imx21-kpp", }, | ||
421 | { /* sentinel */ } | ||
422 | }; | ||
423 | MODULE_DEVICE_TABLE(of, imx_keypad_of_match); | ||
424 | #endif | ||
425 | |||
417 | static int imx_keypad_probe(struct platform_device *pdev) | 426 | static int imx_keypad_probe(struct platform_device *pdev) |
418 | { | 427 | { |
419 | const struct matrix_keymap_data *keymap_data = pdev->dev.platform_data; | 428 | const struct matrix_keymap_data *keymap_data = pdev->dev.platform_data; |
420 | struct imx_keypad *keypad; | 429 | struct imx_keypad *keypad; |
421 | struct input_dev *input_dev; | 430 | struct input_dev *input_dev; |
422 | struct resource *res; | 431 | struct resource *res; |
423 | int irq, error, i; | 432 | int irq, error, i, row, col; |
424 | 433 | ||
425 | if (keymap_data == NULL) { | 434 | if (!keymap_data && !pdev->dev.of_node) { |
426 | dev_err(&pdev->dev, "no keymap defined\n"); | 435 | dev_err(&pdev->dev, "no keymap defined\n"); |
427 | return -EINVAL; | 436 | return -EINVAL; |
428 | } | 437 | } |
@@ -480,22 +489,6 @@ static int imx_keypad_probe(struct platform_device *pdev) | |||
480 | goto failed_unmap; | 489 | goto failed_unmap; |
481 | } | 490 | } |
482 | 491 | ||
483 | /* Search for rows and cols enabled */ | ||
484 | for (i = 0; i < keymap_data->keymap_size; i++) { | ||
485 | keypad->rows_en_mask |= 1 << KEY_ROW(keymap_data->keymap[i]); | ||
486 | keypad->cols_en_mask |= 1 << KEY_COL(keymap_data->keymap[i]); | ||
487 | } | ||
488 | |||
489 | if (keypad->rows_en_mask > ((1 << MAX_MATRIX_KEY_ROWS) - 1) || | ||
490 | keypad->cols_en_mask > ((1 << MAX_MATRIX_KEY_COLS) - 1)) { | ||
491 | dev_err(&pdev->dev, | ||
492 | "invalid key data (too many rows or colums)\n"); | ||
493 | error = -EINVAL; | ||
494 | goto failed_clock_put; | ||
495 | } | ||
496 | dev_dbg(&pdev->dev, "enabled rows mask: %x\n", keypad->rows_en_mask); | ||
497 | dev_dbg(&pdev->dev, "enabled cols mask: %x\n", keypad->cols_en_mask); | ||
498 | |||
499 | /* Init the Input device */ | 492 | /* Init the Input device */ |
500 | input_dev->name = pdev->name; | 493 | input_dev->name = pdev->name; |
501 | input_dev->id.bustype = BUS_HOST; | 494 | input_dev->id.bustype = BUS_HOST; |
@@ -512,6 +505,19 @@ static int imx_keypad_probe(struct platform_device *pdev) | |||
512 | goto failed_clock_put; | 505 | goto failed_clock_put; |
513 | } | 506 | } |
514 | 507 | ||
508 | /* Search for rows and cols enabled */ | ||
509 | for (row = 0; row < MAX_MATRIX_KEY_ROWS; row++) { | ||
510 | for (col = 0; col < MAX_MATRIX_KEY_COLS; col++) { | ||
511 | i = MATRIX_SCAN_CODE(row, col, MATRIX_ROW_SHIFT); | ||
512 | if (keypad->keycodes[i] != KEY_RESERVED) { | ||
513 | keypad->rows_en_mask |= 1 << row; | ||
514 | keypad->cols_en_mask |= 1 << col; | ||
515 | } | ||
516 | } | ||
517 | } | ||
518 | dev_dbg(&pdev->dev, "enabled rows mask: %x\n", keypad->rows_en_mask); | ||
519 | dev_dbg(&pdev->dev, "enabled cols mask: %x\n", keypad->cols_en_mask); | ||
520 | |||
515 | __set_bit(EV_REP, input_dev->evbit); | 521 | __set_bit(EV_REP, input_dev->evbit); |
516 | input_set_capability(input_dev, EV_MSC, MSC_SCAN); | 522 | input_set_capability(input_dev, EV_MSC, MSC_SCAN); |
517 | input_set_drvdata(input_dev, keypad); | 523 | input_set_drvdata(input_dev, keypad); |
@@ -631,6 +637,7 @@ static struct platform_driver imx_keypad_driver = { | |||
631 | .name = "imx-keypad", | 637 | .name = "imx-keypad", |
632 | .owner = THIS_MODULE, | 638 | .owner = THIS_MODULE, |
633 | .pm = &imx_kbd_pm_ops, | 639 | .pm = &imx_kbd_pm_ops, |
640 | .of_match_table = of_match_ptr(imx_keypad_of_match), | ||
634 | }, | 641 | }, |
635 | .probe = imx_keypad_probe, | 642 | .probe = imx_keypad_probe, |
636 | .remove = imx_keypad_remove, | 643 | .remove = imx_keypad_remove, |