[PATCH] Keyboard: omap-keypad: use matrix_keypad.h
Most keypad drivers make use of the linux/input/matrix_keypad.h defined macros, structures and inline functions. Convert omap-keypad driver to use those as well, as suggested by a compile time warning, hardcoded into the OMAP palt/keypad.h. Created against linux-2.6.37-rc5. Tested on Amstrad Delta. Compile tested with omap1_defconfig and omap2plus_defconfig shrinked to board-h4. Signed-off-by: Janusz Krzysztofik jkrzy...@tis.icnet.pl --- arch/arm/mach-omap1/board-ams-delta.c| 128 +++ arch/arm/mach-omap1/board-fsample.c | 65 --- arch/arm/mach-omap1/board-h2.c | 69 arch/arm/mach-omap1/board-h3.c | 69 arch/arm/mach-omap1/board-htcherald.c| 90 +++-- arch/arm/mach-omap1/board-innovator.c| 19 ++-- arch/arm/mach-omap1/board-nokia770.c | 27 +++--- arch/arm/mach-omap1/board-osk.c | 19 ++-- arch/arm/mach-omap1/board-palmte.c | 24 +++-- arch/arm/mach-omap1/board-palmtt.c | 26 +++--- arch/arm/mach-omap1/board-palmz71.c | 26 +++--- arch/arm/mach-omap1/board-perseus2.c | 65 --- arch/arm/mach-omap1/board-sx1.c | 55 +++-- arch/arm/mach-omap2/board-h4.c | 59 +++--- arch/arm/plat-omap/include/plat/keypad.h | 31 --- drivers/input/keyboard/omap-keypad.c | 36 include/linux/input/matrix_keypad.h |2 17 files changed, 429 insertions(+), 381 deletions(-) --- linux-2.6.37-rc5/arch/arm/plat-omap/include/plat/keypad.h.orig 2010-12-09 23:07:38.0 +0100 +++ linux-2.6.37-rc5/arch/arm/plat-omap/include/plat/keypad.h 2010-12-16 21:11:46.0 +0100 @@ -10,13 +10,15 @@ #ifndef ASMARM_ARCH_KEYPAD_H #define ASMARM_ARCH_KEYPAD_H -#warning: Please update the board to use matrix_keypad.h instead +#ifndef CONFIG_ARCH_OMAP1 +#warning Please update the board to use matrix-keypad driver +#endif +#include linux/input/matrix_keypad.h struct omap_kp_platform_data { int rows; int cols; - int *keymap; - unsigned int keymapsize; + const struct matrix_keymap_data *keymap_data; unsigned int rep:1; unsigned long delay; unsigned int dbounce:1; @@ -28,18 +30,21 @@ struct omap_kp_platform_data { /* Group (0..3) -- when multiple keys are pressed, only the * keys pressed in the same group are considered as pressed. This is * in order to workaround certain crappy HW designs that produce ghost - * keypresses. */ -#define GROUP_0(0 16) -#define GROUP_1(1 16) -#define GROUP_2(2 16) -#define GROUP_3(3 16) + * keypresses. Two free bits, not used by neither row/col nor keynum, + * must be available for use as group bits. The below GROUP_SHIFT + * macro definition is based on some prior knowledge of the + * matrix_keypad defined KEY() macro internals. + */ +#define GROUP_SHIFT14 +#define GROUP_0(0 GROUP_SHIFT) +#define GROUP_1(1 GROUP_SHIFT) +#define GROUP_2(2 GROUP_SHIFT) +#define GROUP_3(3 GROUP_SHIFT) #define GROUP_MASK GROUP_3 +#if KEY_MAX GROUP_MASK +#error Group bits in conflict with keynum bits +#endif -#define KEY_PERSISTENT 0x0080 -#define KEYNUM_MASK0x00EF -#define KEY(col, row, val) (((col) 28) | ((row) 24) | (val)) -#define PERSISTENT_KEY(col, row) (((col) 28) | ((row) 24) | \ - KEY_PERSISTENT) #endif --- linux-2.6.37-rc5/include/linux/input/matrix_keypad.h.orig 2010-12-09 23:09:05.0 +0100 +++ linux-2.6.37-rc5/include/linux/input/matrix_keypad.h2010-12-17 03:13:28.0 +0100 @@ -9,7 +9,7 @@ #define KEY(row, col, val) row) (MATRIX_MAX_ROWS - 1)) 24) |\ (((col) (MATRIX_MAX_COLS - 1)) 16) |\ -(val 0x)) +((val) 0x)) #define KEY_ROW(k) (((k) 24) 0xff) #define KEY_COL(k) (((k) 16) 0xff) --- linux-2.6.37-rc5/drivers/input/keyboard/omap-keypad.c.orig 2010-12-09 23:08:09.0 +0100 +++ linux-2.6.37-rc5/drivers/input/keyboard/omap-keypad.c 2010-12-16 21:04:07.0 +0100 @@ -65,7 +65,6 @@ struct omap_kp { static DECLARE_TASKLET_DISABLED(kp_tasklet, omap_kp_tasklet, 0); -static int *keymap; static unsigned int *row_gpios; static unsigned int *col_gpios; @@ -162,20 +161,11 @@ static void omap_kp_scan_keypad(struct o } } -static inline int omap_kp_find_key(int col, int row) -{ - int i, key; - - key = KEY(col, row, 0); - for (i = 0; keymap[i] != 0; i++) - if ((keymap[i] 0xff00) == key) - return keymap[i] 0x00ff; - return -1; -} - static void omap_kp_tasklet(unsigned long data) {
Re: [PATCH] Keyboard: omap-keypad: use matrix_keypad.h
* Janusz Krzysztofik jkrzy...@tis.icnet.pl [101217 14:33]: Most keypad drivers make use of the linux/input/matrix_keypad.h defined macros, structures and inline functions. Convert omap-keypad driver to use those as well, as suggested by a compile time warning, hardcoded into the OMAP palt/keypad.h. Created against linux-2.6.37-rc5. Tested on Amstrad Delta. Compile tested with omap1_defconfig and omap2plus_defconfig shrinked to board-h4. Great, good to get rid of those annoying warnings! drivers/input/keyboard/omap-keypad.c | 36 include/linux/input/matrix_keypad.h |2 We also need Dmitry's ack for these changes. Regards, Tony -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] Keyboard: omap-keypad: use matrix_keypad.h
On Fri, Dec 17, 2010 at 8:29 PM, Cory Maccarrone darkstar6...@gmail.com wrote: On Fri, Dec 17, 2010 at 2:32 PM, Janusz Krzysztofik jkrzy...@tis.icnet.pl wrote: Most keypad drivers make use of the linux/input/matrix_keypad.h defined macros, structures and inline functions. Convert omap-keypad driver to use those as well, as suggested by a compile time warning, hardcoded into the OMAP palt/keypad.h. Created against linux-2.6.37-rc5. Tested on Amstrad Delta. Compile tested with omap1_defconfig and omap2plus_defconfig shrinked to board-h4. Signed-off-by: Janusz Krzysztofik jkrzy...@tis.icnet.pl --- Works perfectly on the herald, and no more warning message. Good work! Tested-by: Cory Maccarrone darkstar6...@gmail.com - Cory Hmm, I may have spoken too soon. This works perfectly on the latest Torvalds master branch, but does not seem to work applied to linux-omap/master. There, all my keys report the same KEY_RECORD event. Probably not a problem in this patch, I think -- will try and track it down. Out of curiosity, which branch did you test it on? - Cory -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] Keyboard: omap-keypad: use matrix_keypad.h
On Fri, Dec 17, 2010 at 9:29 PM, Cory Maccarrone darkstar6...@gmail.com wrote: On Fri, Dec 17, 2010 at 8:29 PM, Cory Maccarrone darkstar6...@gmail.com wrote: On Fri, Dec 17, 2010 at 2:32 PM, Janusz Krzysztofik jkrzy...@tis.icnet.pl wrote: Most keypad drivers make use of the linux/input/matrix_keypad.h defined macros, structures and inline functions. Convert omap-keypad driver to use those as well, as suggested by a compile time warning, hardcoded into the OMAP palt/keypad.h. Created against linux-2.6.37-rc5. Tested on Amstrad Delta. Compile tested with omap1_defconfig and omap2plus_defconfig shrinked to board-h4. Signed-off-by: Janusz Krzysztofik jkrzy...@tis.icnet.pl --- Works perfectly on the herald, and no more warning message. Good work! Tested-by: Cory Maccarrone darkstar6...@gmail.com - Cory Hmm, I may have spoken too soon. This works perfectly on the latest Torvalds master branch, but does not seem to work applied to linux-omap/master. There, all my keys report the same KEY_RECORD event. Probably not a problem in this patch, I think -- will try and track it down. Out of curiosity, which branch did you test it on? - Cory OK, looks like it definitely isn't this patch, something else on linux-omap/master broke it. I'll bisect and see if I can figure it out. - Cory -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] Keyboard: omap-keypad: use matrix_keypad.h
Hi Janusz, On Fri, Dec 17, 2010 at 11:32:04PM +0100, Janusz Krzysztofik wrote: Most keypad drivers make use of the linux/input/matrix_keypad.h defined macros, structures and inline functions. Convert omap-keypad driver to use those as well, as suggested by a compile time warning, hardcoded into the OMAP palt/keypad.h. Looks nice, couple of comments. struct omap_kp_platform_data { int rows; int cols; - int *keymap; - unsigned int keymapsize; + const struct matrix_keymap_data *keymap_data; unsigned int rep:1; unsigned long delay; unsigned int dbounce:1; Since you are updating all boards maybe also change rep and dbounce to bool? --- linux-2.6.37-rc5/drivers/input/keyboard/omap-keypad.c.orig 2010-12-09 23:08:09.0 +0100 +++ linux-2.6.37-rc5/drivers/input/keyboard/omap-keypad.c 2010-12-16 21:04:07.0 +0100 @@ -65,7 +65,6 @@ struct omap_kp { static DECLARE_TASKLET_DISABLED(kp_tasklet, omap_kp_tasklet, 0); -static int *keymap; static unsigned int *row_gpios; static unsigned int *col_gpios; @@ -162,20 +161,11 @@ static void omap_kp_scan_keypad(struct o } } -static inline int omap_kp_find_key(int col, int row) -{ - int i, key; - - key = KEY(col, row, 0); - for (i = 0; keymap[i] != 0; i++) - if ((keymap[i] 0xff00) == key) - return keymap[i] 0x00ff; - return -1; -} - static void omap_kp_tasklet(unsigned long data) { struct omap_kp *omap_kp_data = (struct omap_kp *) data; + unsigned short *keycodes = omap_kp_data-input-keycode; + unsigned int row_shift = get_count_order(omap_kp_data-cols); unsigned char new_state[8], changed, key_down = 0; int col, row; int spurious = 0; @@ -199,7 +189,7 @@ static void omap_kp_tasklet(unsigned lon row, (new_state[col] (1 row)) ? pressed : released); #else - key = omap_kp_find_key(col, row); + key = keycodes[MATRIX_SCAN_CODE(row, col, row_shift)]; if (key 0) { printk(KERN_WARNING omap-keypad: Spurious key event %d-%d\n, @@ -298,16 +288,22 @@ static int __devinit omap_kp_probe(struc struct input_dev *input_dev; struct omap_kp_platform_data *pdata = pdev-dev.platform_data; int i, col_idx, row_idx, irq_idx, ret; + unsigned short *keycodes; + unsigned int row_shift; - if (!pdata-rows || !pdata-cols || !pdata-keymap) { - printk(KERN_ERR No rows, cols or keymap from pdata\n); + if (!pdata-rows || !pdata-cols || !pdata-keymap_data) { + printk(KERN_ERR No rows, cols or keymap_data from pdata\n); return -EINVAL; } omap_kp = kzalloc(sizeof(struct omap_kp), GFP_KERNEL); + row_shift = get_count_order(pdata-cols); + keycodes = kzalloc((pdata-rows row_shift) * sizeof(*keycodes), + GFP_KERNEL); input_dev = input_allocate_device(); - if (!omap_kp || !input_dev) { + if (!omap_kp || !keycodes || !input_dev) { kfree(omap_kp); + kfree(keycodes); I do not see where you freeing keycodes in case something else fails nor in omap_kp_remove(). But why don't you put keycodes at the end of struct omap_kp and allocate it in one shot? Thanks. -- Dmitry -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html