aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/keyboard/tegra-kbc.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input/keyboard/tegra-kbc.c')
-rw-r--r--drivers/input/keyboard/tegra-kbc.c68
1 files changed, 41 insertions, 27 deletions
diff --git a/drivers/input/keyboard/tegra-kbc.c b/drivers/input/keyboard/tegra-kbc.c
index fe4ac95ca6c8..4ffe64d53107 100644
--- a/drivers/input/keyboard/tegra-kbc.c
+++ b/drivers/input/keyboard/tegra-kbc.c
@@ -619,8 +619,8 @@ tegra_kbc_check_pin_cfg(const struct tegra_kbc_platform_data *pdata,
619} 619}
620 620
621#ifdef CONFIG_OF 621#ifdef CONFIG_OF
622static struct tegra_kbc_platform_data * __devinit 622static struct tegra_kbc_platform_data * __devinit tegra_kbc_dt_parse_pdata(
623tegra_kbc_dt_parse_pdata(struct platform_device *pdev) 623 struct platform_device *pdev)
624{ 624{
625 struct tegra_kbc_platform_data *pdata; 625 struct tegra_kbc_platform_data *pdata;
626 struct device_node *np = pdev->dev.of_node; 626 struct device_node *np = pdev->dev.of_node;
@@ -660,10 +660,6 @@ tegra_kbc_dt_parse_pdata(struct platform_device *pdev)
660 pdata->pin_cfg[KBC_MAX_ROW + i].type = PIN_CFG_COL; 660 pdata->pin_cfg[KBC_MAX_ROW + i].type = PIN_CFG_COL;
661 } 661 }
662 662
663 pdata->keymap_data = matrix_keyboard_of_fill_keymap(np, "linux,keymap");
664
665 /* FIXME: Add handling of linux,fn-keymap here */
666
667 return pdata; 663 return pdata;
668} 664}
669#else 665#else
@@ -674,10 +670,36 @@ static inline struct tegra_kbc_platform_data *tegra_kbc_dt_parse_pdata(
674} 670}
675#endif 671#endif
676 672
673static int __devinit tegra_kbd_setup_keymap(struct tegra_kbc *kbc)
674{
675 const struct tegra_kbc_platform_data *pdata = kbc->pdata;
676 const struct matrix_keymap_data *keymap_data = pdata->keymap_data;
677 unsigned int keymap_rows = KBC_MAX_KEY;
678 int retval;
679
680 if (keymap_data && pdata->use_fn_map)
681 keymap_rows *= 2;
682
683 retval = matrix_keypad_build_keymap(keymap_data, NULL,
684 keymap_rows, KBC_MAX_COL,
685 kbc->keycode, kbc->idev);
686 if (retval == -ENOSYS || retval == -ENOENT) {
687 /*
688 * If there is no OF support in kernel or keymap
689 * property is missing, use default keymap.
690 */
691 retval = matrix_keypad_build_keymap(
692 &tegra_kbc_default_keymap_data, NULL,
693 keymap_rows, KBC_MAX_COL,
694 kbc->keycode, kbc->idev);
695 }
696
697 return retval;
698}
699
677static int __devinit tegra_kbc_probe(struct platform_device *pdev) 700static int __devinit tegra_kbc_probe(struct platform_device *pdev)
678{ 701{
679 const struct tegra_kbc_platform_data *pdata = pdev->dev.platform_data; 702 const struct tegra_kbc_platform_data *pdata = pdev->dev.platform_data;
680 const struct matrix_keymap_data *keymap_data;
681 struct tegra_kbc *kbc; 703 struct tegra_kbc *kbc;
682 struct input_dev *input_dev; 704 struct input_dev *input_dev;
683 struct resource *res; 705 struct resource *res;
@@ -757,29 +779,26 @@ static int __devinit tegra_kbc_probe(struct platform_device *pdev)
757 kbc->repoll_dly = KBC_ROW_SCAN_DLY + scan_time_rows + pdata->repeat_cnt; 779 kbc->repoll_dly = KBC_ROW_SCAN_DLY + scan_time_rows + pdata->repeat_cnt;
758 kbc->repoll_dly = DIV_ROUND_UP(kbc->repoll_dly, KBC_CYCLE_MS); 780 kbc->repoll_dly = DIV_ROUND_UP(kbc->repoll_dly, KBC_CYCLE_MS);
759 781
782 kbc->wakeup_key = pdata->wakeup_key;
783 kbc->use_fn_map = pdata->use_fn_map;
784 kbc->use_ghost_filter = pdata->use_ghost_filter;
785
760 input_dev->name = pdev->name; 786 input_dev->name = pdev->name;
761 input_dev->id.bustype = BUS_HOST; 787 input_dev->id.bustype = BUS_HOST;
762 input_dev->dev.parent = &pdev->dev; 788 input_dev->dev.parent = &pdev->dev;
763 input_dev->open = tegra_kbc_open; 789 input_dev->open = tegra_kbc_open;
764 input_dev->close = tegra_kbc_close; 790 input_dev->close = tegra_kbc_close;
765 791
766 input_set_drvdata(input_dev, kbc); 792 err = tegra_kbd_setup_keymap(kbc);
793 if (err) {
794 dev_err(&pdev->dev, "failed to setup keymap\n");
795 goto err_put_clk;
796 }
767 797
768 input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); 798 __set_bit(EV_REP, input_dev->evbit);
769 input_set_capability(input_dev, EV_MSC, MSC_SCAN); 799 input_set_capability(input_dev, EV_MSC, MSC_SCAN);
770 800
771 input_dev->keycode = kbc->keycode; 801 input_set_drvdata(input_dev, kbc);
772 input_dev->keycodesize = sizeof(kbc->keycode[0]);
773 input_dev->keycodemax = KBC_MAX_KEY;
774 if (pdata->use_fn_map)
775 input_dev->keycodemax *= 2;
776
777 kbc->use_fn_map = pdata->use_fn_map;
778 kbc->use_ghost_filter = pdata->use_ghost_filter;
779 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;
783 802
784 err = request_irq(kbc->irq, tegra_kbc_isr, 803 err = request_irq(kbc->irq, tegra_kbc_isr,
785 IRQF_NO_SUSPEND | IRQF_TRIGGER_HIGH, pdev->name, kbc); 804 IRQF_NO_SUSPEND | IRQF_TRIGGER_HIGH, pdev->name, kbc);
@@ -799,9 +818,6 @@ static int __devinit tegra_kbc_probe(struct platform_device *pdev)
799 platform_set_drvdata(pdev, kbc); 818 platform_set_drvdata(pdev, kbc);
800 device_init_wakeup(&pdev->dev, pdata->wakeup); 819 device_init_wakeup(&pdev->dev, pdata->wakeup);
801 820
802 if (!pdev->dev.platform_data)
803 matrix_keyboard_of_free_keymap(pdata->keymap_data);
804
805 return 0; 821 return 0;
806 822
807err_free_irq: 823err_free_irq:
@@ -816,10 +832,8 @@ err_free_mem:
816 input_free_device(input_dev); 832 input_free_device(input_dev);
817 kfree(kbc); 833 kfree(kbc);
818err_free_pdata: 834err_free_pdata:
819 if (!pdev->dev.platform_data) { 835 if (!pdev->dev.platform_data)
820 matrix_keyboard_of_free_keymap(pdata->keymap_data);
821 kfree(pdata); 836 kfree(pdata);
822 }
823 837
824 return err; 838 return err;
825} 839}