[PATCH] Keyboard: omap-keypad: use matrix_keypad.h

2010-12-17 Thread Janusz Krzysztofik
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

2010-12-17 Thread Tony Lindgren
* 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

2010-12-17 Thread Cory Maccarrone
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

2010-12-17 Thread Cory Maccarrone
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

2010-12-17 Thread Dmitry Torokhov
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