You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Input: pxa27x-keypad - fix generating scancode
The number of columns of pxa27x-keypad used by various boards is not fixed.
When building keymap with call to:
matrix_keypad_build_keymap(keymap_data, NULL,
pdata->matrix_key_rows,
pdata->matrix_key_cols,
keypad->keycodes, input_dev);
it will internally calculate needed row shift and use it to fill the
keymap. Therefore when calculating the "scancode" we should no longer use
constant row shift but also calculate it from number of columns.
Signed-off-by: Chao Xie <chao.xie@marvell.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
committed by
Dmitry Torokhov
parent
ba77341cfd
commit
c5ec1948ea
@@ -111,6 +111,8 @@ struct pxa27x_keypad {
|
|||||||
unsigned short keycodes[MAX_KEYPAD_KEYS];
|
unsigned short keycodes[MAX_KEYPAD_KEYS];
|
||||||
int rotary_rel_code[2];
|
int rotary_rel_code[2];
|
||||||
|
|
||||||
|
unsigned int row_shift;
|
||||||
|
|
||||||
/* state row bits of each column scan */
|
/* state row bits of each column scan */
|
||||||
uint32_t matrix_key_state[MAX_MATRIX_KEY_COLS];
|
uint32_t matrix_key_state[MAX_MATRIX_KEY_COLS];
|
||||||
uint32_t direct_key_state;
|
uint32_t direct_key_state;
|
||||||
@@ -467,7 +469,8 @@ scan:
|
|||||||
if ((bits_changed & (1 << row)) == 0)
|
if ((bits_changed & (1 << row)) == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
code = MATRIX_SCAN_CODE(row, col, MATRIX_ROW_SHIFT);
|
code = MATRIX_SCAN_CODE(row, col, keypad->row_shift);
|
||||||
|
|
||||||
input_event(input_dev, EV_MSC, MSC_SCAN, code);
|
input_event(input_dev, EV_MSC, MSC_SCAN, code);
|
||||||
input_report_key(input_dev, keypad->keycodes[code],
|
input_report_key(input_dev, keypad->keycodes[code],
|
||||||
new_state[col] & (1 << row));
|
new_state[col] & (1 << row));
|
||||||
@@ -802,6 +805,8 @@ static int pxa27x_keypad_probe(struct platform_device *pdev)
|
|||||||
goto failed_put_clk;
|
goto failed_put_clk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
keypad->row_shift = get_count_order(pdata->matrix_key_cols);
|
||||||
|
|
||||||
if ((pdata->enable_rotary0 && keypad->rotary_rel_code[0] != -1) ||
|
if ((pdata->enable_rotary0 && keypad->rotary_rel_code[0] != -1) ||
|
||||||
(pdata->enable_rotary1 && keypad->rotary_rel_code[1] != -1)) {
|
(pdata->enable_rotary1 && keypad->rotary_rel_code[1] != -1)) {
|
||||||
input_dev->evbit[0] |= BIT_MASK(EV_REL);
|
input_dev->evbit[0] |= BIT_MASK(EV_REL);
|
||||||
|
|||||||
Reference in New Issue
Block a user