diff options
Diffstat (limited to 'drivers/hid')
-rw-r--r-- | drivers/hid/hid-input.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c index b12c07e64fbd..04121beed358 100644 --- a/drivers/hid/hid-input.c +++ b/drivers/hid/hid-input.c @@ -77,7 +77,10 @@ static bool match_scancode(struct hid_usage *usage, static bool match_keycode(struct hid_usage *usage, unsigned int cur_idx, unsigned int keycode) { - return usage->code == keycode; + /* + * We should exclude unmapped usages when doing lookup by keycode. + */ + return (usage->type == EV_KEY && usage->code == keycode); } static bool match_index(struct hid_usage *usage, @@ -103,7 +106,7 @@ static struct hid_usage *hidinput_find_key(struct hid_device *hid, for (i = 0; i < report->maxfield; i++) { for (j = 0; j < report->field[i]->maxusage; j++) { usage = report->field[i]->usage + j; - if (usage->type == EV_KEY) { + if (usage->type == EV_KEY || usage->type == 0) { if (match(usage, cur_idx, value)) { if (usage_idx) *usage_idx = cur_idx; @@ -144,7 +147,8 @@ static int hidinput_getkeycode(struct input_dev *dev, usage = hidinput_locate_usage(hid, ke, &index); if (usage) { - ke->keycode = usage->code; + ke->keycode = usage->type == EV_KEY ? + usage->code : KEY_RESERVED; ke->index = index; scancode = usage->hid & (HID_USAGE_PAGE | HID_USAGE); ke->len = sizeof(scancode); @@ -164,7 +168,8 @@ static int hidinput_setkeycode(struct input_dev *dev, usage = hidinput_locate_usage(hid, ke, NULL); if (usage) { - *old_keycode = usage->code; + *old_keycode = usage->type == EV_KEY ? + usage->code : KEY_RESERVED; usage->code = ke->keycode; clear_bit(*old_keycode, dev->keybit); |