Input: pxa27x_keypad direct key may be low active
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>
This commit is contained in:
parent
5545fa897a
commit
ee1d8040a6
2 changed files with 11 additions and 1 deletions
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue