[PATCH 1/3] Input: imx_keypad - Add device tree support

Dmitry Torokhov dmitry.torokhov at gmail.com
Mon Dec 31 15:22:17 EST 2012


On Mon, Dec 31, 2012 at 02:36:54PM +0800, Liu Ying wrote:
> Hi, Dmitry,
> 
> Thanks for reviewing this patch.
> 
> 2012/12/31 Dmitry Torokhov <dmitry.torokhov at gmail.com>:
> > Hi Liu,
> >
> > On Sun, Dec 30, 2012 at 09:09:04PM +0800, Liu Ying wrote:
> >> This patch adds device tree support for imx keypad driver.
> >> 1) Basic device tree binding support.
> >> 2) Since the probe function needs keymap and keymap size
> >>    information, we get them from device tree if it is
> >>    supported, otherwise, we fall back to legacy platform data.
> >> 3) Support to configure keypad pins via pinctrl system.
> >>
> >> Signed-off-by: Liu Ying <Ying.Liu at freescale.com>
> >> ---
> >>  .../devicetree/bindings/input/imx-keypad.txt       |   54 +++++++++++++
> >>  drivers/input/keyboard/imx_keypad.c                |   80 ++++++++++++++++++--
> >>  2 files changed, 127 insertions(+), 7 deletions(-)
> >>  create mode 100644 Documentation/devicetree/bindings/input/imx-keypad.txt
> >>
> >> diff --git a/Documentation/devicetree/bindings/input/imx-keypad.txt b/Documentation/devicetree/bindings/input/imx-keypad.txt
> >> new file mode 100644
> >> index 0000000..1c6e16d
> >> --- /dev/null
> >> +++ b/Documentation/devicetree/bindings/input/imx-keypad.txt
> >> @@ -0,0 +1,54 @@
> >> +* Freescale i.MX Keypad Port(KPP) device tree bindings
> >> +
> >> +The KPP is designed to interface with a keypad matrix with 2-point contact
> >> +or 3-point contact keys. The KPP is designed to simplify the software task
> >> +of scanning a keypad matrix. The KPP is capable of detecting, debouncing,
> >> +and decoding one or multiple keys pressed simultaneously on a keypad.
> >> +
> >> +Required SoC Specific Properties:
> >> +- compatible: Should be "fsl,imx-kpp".
> >> +
> >> +- reg: Physical base address of the KPP and length of memory mapped
> >> +  region.
> >> +
> >> +- interrupts: The KPP interrupt number to the CPU(s).
> >> +
> >> +- clocks: The clock provided by the SoC to the KPP. Some SoCs use ipg clock,
> >> +others use dummy clock(The clock for the KPP is provided by the SoCs
> >> +automatically).
> >> +
> >> +Required Board Specific Properties:
> >> +- pinctrl-names: The definition can be found at
> >> +pinctrl/pinctrl-bindings.txt.
> >> +
> >> +- pinctrl-0: The definition can be found at
> >> +pinctrl/pinctrl-bindings.txt.
> >> +
> >> +- linux,keymap: The definition can be found at
> >> +bindings/input/matrix-keymap.txt.
> >> +
> >> +Example:
> >> +kpp: kpp at 73f94000 {
> >> +     compatible = "fsl,imx-kpp";
> >> +     reg = <0x73f94000 0x4000>;
> >> +     interrupts = <60>;
> >> +     clocks = <&clks 0>;
> >> +     pinctrl-names = "default";
> >> +     pinctrl-0 = <&pinctrl_kpp_1>;
> >> +     linux,keymap = <0x00000067      /* KEY_UP */
> >> +                     0x0001006c      /* KEY_DOWN */
> >> +                     0x00020072      /* KEY_VOLUMEDOWN */
> >> +                     0x00030066      /* KEY_HOME */
> >> +                     0x0100006a      /* KEY_RIGHT */
> >> +                     0x01010069      /* KEY_LEFT */
> >> +                     0x0102001c      /* KEY_ENTER */
> >> +                     0x01030073      /* KEY_VOLUMEUP */
> >> +                     0x02000040      /* KEY_F6 */
> >> +                     0x02010042      /* KEY_F8 */
> >> +                     0x02020043      /* KEY_F9 */
> >> +                     0x02030044      /* KEY_F10 */
> >> +                     0x0300003b      /* KEY_F1 */
> >> +                     0x0301003c      /* KEY_F2 */
> >> +                     0x0302003d      /* KEY_F3 */
> >> +                     0x03030074>;    /* KEY_POWER */
> >> +};
> >> diff --git a/drivers/input/keyboard/imx_keypad.c b/drivers/input/keyboard/imx_keypad.c
> >> index 6d150e3..e4f5c6a 100644
> >> --- a/drivers/input/keyboard/imx_keypad.c
> >> +++ b/drivers/input/keyboard/imx_keypad.c
> >> @@ -20,6 +20,8 @@
> >>  #include <linux/jiffies.h>
> >>  #include <linux/kernel.h>
> >>  #include <linux/module.h>
> >> +#include <linux/of.h>
> >> +#include <linux/pinctrl/consumer.h>
> >>  #include <linux/platform_device.h>
> >>  #include <linux/slab.h>
> >>  #include <linux/timer.h>
> >> @@ -414,17 +416,76 @@ open_err:
> >>       return -EIO;
> >>  }
> >>
> >> +static struct of_device_id imx_keypad_of_match[] = {
> >> +     { .compatible = "fsl,imx-kpp", },
> >> +     { /* sentinel */ }
> >> +};
> >> +MODULE_DEVICE_TABLE(of, imx_keypad_of_match);
> >> +
> >> +#ifdef CONFIG_OF
> >> +static int imx_keypad_parse_dt(struct platform_device *pdev,
> >> +                            uint32_t *keymap, int *keymap_size)
> >> +{
> >> +     struct device_node *np = pdev->dev.of_node;
> >> +     struct device *dev = &pdev->dev;
> >> +     unsigned int proplen, i;
> >> +     const __be32 *prop;
> >> +
> >> +     if (!np)
> >> +             return -ENODEV;
> >> +
> >> +     prop = of_get_property(np, "linux,keymap", &proplen);
> >> +     if (!prop) {
> >> +             dev_err(dev, "OF: linux,keymap property not defined in %s\n",
> >> +                             np->full_name);
> >> +             return -ENOENT;
> >> +     }
> >> +
> >> +     if (proplen % sizeof(u32)) {
> >> +             dev_err(dev, "OF: Malformed keycode property in %s\n",
> >> +                             np->full_name);
> >> +             return -EINVAL;
> >> +     }
> >> +
> >> +     *keymap_size = proplen / sizeof(u32);
> >> +     if (*keymap_size > MAX_MATRIX_KEY_NUM) {
> >> +             dev_err(dev, "OF: linux,keymap size overflow\n");
> >> +             return -EINVAL;
> >> +     }
> >> +
> >> +     for (i = 0; i < *keymap_size; i++)
> >> +             keymap[i] = be32_to_cpup(prop + i);
> >
> > All of this is implemented in matrix_keypad_build_keymap(), there is no
> > need to do it again here.
> The probe function of this driver needs the keymap information to set
> keypad->rows_en_mask and keypad->cols_en_mask so that they can be used
> later. I plan to change to parse the array keypad->keycodes[], which
> is set by matrix_keypad_build_keymap(),  to get the row/col mask. Do
> you think this is acceptable?

Yes, I believe this should be fine.

Thanks.

-- 
Dmitry



More information about the linux-arm-kernel mailing list