]> git.karo-electronics.de Git - linux-beck.git/commitdiff
Input: pxa27x_keypad direct key may be low active
authorChao Xie <chao.xie@marvell.com>
Sun, 1 Apr 2012 02:08:03 +0000 (10:08 +0800)
committerHaojian Zhuang <haojian.zhuang@gmail.com>
Fri, 27 Apr 2012 08:49:07 +0000 (16:49 +0800)
KPDK_DK only indicates the pin level of direct key.
So it is related to board, and low level may be active which
indicates that a key is pressed.

Signed-off-by: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Haojian Zhuang <haojian.zhuang@gmail.com>
arch/arm/plat-pxa/include/plat/pxa27x_keypad.h
drivers/input/keyboard/pxa27x_keypad.c

index abcc36eb12425ac04a28da7e61f6e9fa171ddac0..7ffb16b806392ef5a4a9fcc6658556ebb359ae51 100644 (file)
@@ -44,6 +44,8 @@ struct pxa27x_keypad_platform_data {
        /* direct keys */
        int             direct_key_num;
        unsigned int    direct_key_map[MAX_DIRECT_KEY_NUM];
+       /* the key output may be low active */
+       int             direct_key_low_active;
 
        /* rotary encoders 0 */
        int             enable_rotary0;
index 5d717202aad8121a567cddbaabac67b14f8fc107..a60f14e7983e17656977f8b6326759be81bd6a4c 100644 (file)
@@ -311,7 +311,15 @@ static void pxa27x_keypad_scan_direct(struct pxa27x_keypad *keypad)
        if (pdata->enable_rotary0 || pdata->enable_rotary1)
                pxa27x_keypad_scan_rotary(keypad);
 
-       new_state = KPDK_DK(kpdk) & keypad->direct_key_mask;
+       /*
+        * The KPDR_DK only output the key pin level, so it relates to board,
+        * and low level may be active.
+        */
+       if (pdata->direct_key_low_active)
+               new_state = ~KPDK_DK(kpdk) & keypad->direct_key_mask;
+       else
+               new_state = KPDK_DK(kpdk) & keypad->direct_key_mask;
+
        bits_changed = keypad->direct_key_state ^ new_state;
 
        if (bits_changed == 0)