Input: add imx-keypad driver to support the IMX Keypad Port
authorAlberto Panizzo <maramaopercheseimorto@gmail.com>
Mon, 1 Feb 2010 01:52:07 +0000 (17:52 -0800)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Mon, 1 Feb 2010 01:52:57 +0000 (17:52 -0800)
commit76cdc083f4d1a2a12a961634672fb9ca7adca29c
treef23789194c929fa1d33c376e24478d7f0f255bb8
parent429722e19dff319aa87ee552beadee71d41a3655
Input: add imx-keypad driver to support the IMX Keypad Port

The IMX family of Application Processors is shipped with a Keypad Port
supported by this driver.

The peripheral can control up to an 8x8 matrix key pad where all the
scanning is done via software.  The hardware provides two interrupts:
one for key presses (KDI) and one for all key releases (KRI). There is
also a simple circuit for glitch reduction (said for synchronization)
made by two series of 3 D-latches clocked by the keypad-clock that
stabilize the interrupts sources. KDI and KRI are fired only if the
respective conditions are maintained for at last 4 keypad-clock cycle.

Since those circuits are poor for a correct debounce process (the
keypad-clock frequency is 32K and bounces longer than 94us are not
masked) the driver, when an interrupt arrives, samples the matrix
with a period of 10ms until the readins are stable for
IMX_KEYPAD_SCANS_FOR_STABILITY times (currently set at 3). After
getting stable result appropriate events are sent through the input
stack.

If some keys are maintained pressed, the driver continues to scan
the matrix with a longer period (60ms) to catch possible multiple
key presses without overloading the cpu. This process ends when all
keys are released.

This driver is tested to build in kernel or as a module and follow
the specification of Freescale Application processors:
i.MX25 i.MX27 i.MX31 i.MX35 i.MX51 especially tested on i.MX31.

Signed-off-by: Alberto Panizzo <maramaopercheseimorto@gmail.com>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
drivers/input/keyboard/Kconfig
drivers/input/keyboard/Makefile
drivers/input/keyboard/imx_keypad.c [new file with mode: 0644]