]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
OMAP_LDP: Add keypad support on ZOOM SDK
authorStanley.Miao <stanley.miao@windriver.com>
Tue, 11 Nov 2008 11:50:57 +0000 (19:50 +0800)
committerTony Lindgren <tony@atomide.com>
Thu, 13 Nov 2008 22:43:39 +0000 (14:43 -0800)
Support twl4030 keypad and gpio keys on ZOOM SDK.

Signed-off-by: Stanley.Miao <stanley.miao@windriver.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
arch/arm/mach-omap2/board-ldp.c
arch/arm/plat-omap/include/mach/keypad.h
drivers/input/keyboard/Kconfig
drivers/input/keyboard/gpio_keys.c
drivers/input/keyboard/omap-twl4030keypad.c
include/linux/gpio_keys.h

index c8e2360fb8820bab0d51f56a3cd8eb909556f0a1..bc66b28032c648ff73d23bf6903b37c7b6bd0d34 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/platform_device.h>
 #include <linux/delay.h>
 #include <linux/input.h>
+#include <linux/gpio_keys.h>
 #include <linux/workqueue.h>
 #include <linux/err.h>
 #include <linux/clk.h>
@@ -33,6 +34,7 @@
 #include <mach/gpio.h>
 #include <mach/board.h>
 #include <mach/common.h>
+#include <mach/keypad.h>
 #include <mach/gpmc.h>
 #include <mach/mmc.h>
 #include <mach/usb-musb.h>
@@ -72,6 +74,116 @@ static struct platform_device ldp_smc911x_device = {
        .resource       = ldp_smc911x_resources,
 };
 
+static int ldp_twl4030_keymap[] = {
+       KEY(0, 0, KEY_1),
+       KEY(1, 0, KEY_2),
+       KEY(2, 0, KEY_3),
+       KEY(0, 1, KEY_4),
+       KEY(1, 1, KEY_5),
+       KEY(2, 1, KEY_6),
+       KEY(3, 1, KEY_F5),
+       KEY(0, 2, KEY_7),
+       KEY(1, 2, KEY_8),
+       KEY(2, 2, KEY_9),
+       KEY(3, 2, KEY_F6),
+       KEY(0, 3, KEY_F7),
+       KEY(1, 3, KEY_0),
+       KEY(2, 3, KEY_F8),
+       PERSISTENT_KEY(4, 5),
+       KEY(4, 4, KEY_VOLUMEUP),
+       KEY(5, 5, KEY_VOLUMEDOWN),
+       0
+};
+
+static struct twl4030_keypad_data ldp_kp_twl4030_data = {
+       .rows           = 6,
+       .cols           = 6,
+       .keymap         = ldp_twl4030_keymap,
+       .keymapsize     = ARRAY_SIZE(ldp_twl4030_keymap),
+       .rep            = 1,
+       .irq            = TWL4030_MODIRQ_KEYPAD,
+};
+
+static struct gpio_keys_button ldp_gpio_keys_buttons[] = {
+       [0] = {
+               .code                   = KEY_ENTER,
+               .gpio                   = 101,
+               .desc                   = "enter sw",
+               .active_low             = 1,
+               .debounce_interval      = 30,
+       },
+       [1] = {
+               .code                   = KEY_F1,
+               .gpio                   = 102,
+               .desc                   = "func 1",
+               .active_low             = 1,
+               .debounce_interval      = 30,
+       },
+       [2] = {
+               .code                   = KEY_F2,
+               .gpio                   = 103,
+               .desc                   = "func 2",
+               .active_low             = 1,
+               .debounce_interval      = 30,
+       },
+       [3] = {
+               .code                   = KEY_F3,
+               .gpio                   = 104,
+               .desc                   = "func 3",
+               .active_low             = 1,
+               .debounce_interval      = 30,
+       },
+       [4] = {
+               .code                   = KEY_F4,
+               .gpio                   = 105,
+               .desc                   = "func 4",
+               .active_low             = 1,
+               .debounce_interval      = 30,
+       },
+       [5] = {
+               .code                   = KEY_LEFT,
+               .gpio                   = 106,
+               .desc                   = "left sw",
+               .active_low             = 1,
+               .debounce_interval      = 30,
+       },
+       [6] = {
+               .code                   = KEY_RIGHT,
+               .gpio                   = 107,
+               .desc                   = "right sw",
+               .active_low             = 1,
+               .debounce_interval      = 30,
+       },
+       [7] = {
+               .code                   = KEY_UP,
+               .gpio                   = 108,
+               .desc                   = "up sw",
+               .active_low             = 1,
+               .debounce_interval      = 30,
+       },
+       [8] = {
+               .code                   = KEY_DOWN,
+               .gpio                   = 109,
+               .desc                   = "down sw",
+               .active_low             = 1,
+               .debounce_interval      = 30,
+       },
+};
+
+static struct gpio_keys_platform_data ldp_gpio_keys = {
+       .buttons                = ldp_gpio_keys_buttons,
+       .nbuttons               = ARRAY_SIZE(ldp_gpio_keys_buttons),
+       .rep                    = 1,
+};
+
+static struct platform_device ldp_gpio_keys_device = {
+       .name           = "gpio-keys",
+       .id             = -1,
+       .dev            = {
+               .platform_data  = &ldp_gpio_keys,
+       },
+};
+
 static int ts_gpio;
 
 static int __init msecure_init(void)
@@ -200,6 +312,7 @@ static struct platform_device ldp_lcd_device = {
 static struct platform_device *ldp_devices[] __initdata = {
        &ldp_smc911x_device,
        &ldp_lcd_device,
+       &ldp_gpio_keys_device,
 };
 
 static inline void __init ldp_init_smc911x(void)
@@ -374,6 +487,7 @@ static struct twl4030_platform_data ldp_twldata = {
        .usb            = &ldp_usb_data,
        .power          = &sdp3430_t2scripts_data,
        .gpio           = &ldp_gpio_data,
+       .keypad         = &ldp_kp_twl4030_data,
 };
 
 static struct i2c_board_info __initdata ldp_i2c_boardinfo[] = {
index ba1c95c7c8cbea22d1b7d7308312fc6f3d2ea7f5..b7f270a6782188a471469a366c7ea86eac45ccbb 100644 (file)
@@ -34,7 +34,12 @@ struct omap_kp_platform_data {
 #define GROUP_3                (3 << 16)
 #define GROUP_MASK     GROUP_3
 
+#define ROWCOL_MASK            0xFF000000
+#define KEY_PERSISTENT         0x00800000
+#define KEYNUM_MASK            0x00EFFFFF
 #define KEY(col, row, val) (((col) << 28) | ((row) << 24) | (val))
+#define PERSISTENT_KEY(col, row) (((col) << 28) | ((row) << 24) | \
+                                               KEY_PERSISTENT)
 
 #endif
 
index e4d043679b41cf47b88ce8c43daa4068e6486a71..c8abf13a4603764c4c10d7af25daaed8d8272023 100644 (file)
@@ -261,7 +261,7 @@ config KEYBOARD_OMAP
 
 config KEYBOARD_TWL4030
        tristate "TI TWL4030 keypad support"
-       depends on TWL4030_CORE && (MACH_OMAP_2430SDP || MACH_OMAP2EVM || MACH_OMAP_3430SDP || MACH_OMAP3EVM)
+       depends on TWL4030_CORE && (MACH_OMAP_2430SDP || MACH_OMAP2EVM || MACH_OMAP_3430SDP || MACH_OMAP3EVM || MACH_OMAP_LDP)
        help
          Say Y here if you want to use the OMAP TWL4030 keypad.
 
index 05f3f43582c2c1e40658e2d8e6e77f8717210f38..722529c77147733f3f8fb8667619b6df35f409f5 100644 (file)
@@ -98,6 +98,10 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
        input->id.product = 0x0001;
        input->id.version = 0x0100;
 
+       /* Enable auto repeat feature of Linux input subsystem */
+       if (pdata->rep)
+               set_bit(EV_REP, input->evbit);
+
        ddata->input = input;
 
        for (i = 0; i < pdata->nbuttons; i++) {
index f6f1ad8cdf2d339f6f9a11d27c0e6641741966b7..21f922de7a2079578fc1ac63e8f74120571ab619 100644 (file)
 #include <linux/i2c.h>
 #include <linux/i2c/twl4030.h>
 #include <linux/irq.h>
+#include <mach/keypad.h>
+
 #include "twl4030-keypad.h"
 
 #define PTV_PRESCALER          4
 
 #define MAX_ROWS               8 /* TWL4030 hardlimit */
-#define ROWCOL_MASK            0xFF000000
-#define KEYNUM_MASK            0x00FFFFFF
-#define KEY(col, row, val) (((col) << 28) | ((row) << 24) | (val))
 
 /* Global variables */
 
@@ -101,7 +100,7 @@ static int omap_kp_find_key(struct omap_keypad *kp, int col, int row)
        rc = KEY(col, row, 0);
        for (i = 0; i < kp->keymapsize; i++)
                if ((kp->keymap[i] & ROWCOL_MASK) == rc)
-                       return kp->keymap[i] & KEYNUM_MASK;
+                       return kp->keymap[i] & (KEYNUM_MASK | KEY_PERSISTENT);
 
        return -EINVAL;
 }
@@ -189,6 +188,8 @@ static void twl4030_kp_scan(struct omap_keypad *kp, int release_all)
                                dev_warn(kp->dbg_dev,
                                        "Spurious key event %d-%d\n",
                                         col, row);
+                       else if (key & KEY_PERSISTENT)
+                               continue;
                        else
                                input_report_key(kp->omap_twl4030kp, key,
                                                 new_state[row] & (1 << col));
index ec6ecd74781dca68bdf49c3ea1b80cc00b9d4966..1289fa7623ca22d7d79188bc39cf5b5b35c180b1 100644 (file)
@@ -15,6 +15,7 @@ struct gpio_keys_button {
 struct gpio_keys_platform_data {
        struct gpio_keys_button *buttons;
        int nbuttons;
+       unsigned int rep:1;             /* enable input subsystem auto repeat */
 };
 
 #endif