^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (c) 2000-2001 Vojtech Pavlik
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (c) 2006-2010 Jiri Kosina
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * HID to Linux Input mapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * Should you need to contact me, the author, you can do so either by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/hid.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/hid-debug.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include "hid-ids.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define unk KEY_UNKNOWN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) static const unsigned char hid_keyboard[256] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) 0, 0, 0, 0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) 50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44, 2, 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) 4, 5, 6, 7, 8, 9, 10, 11, 28, 1, 14, 15, 57, 12, 13, 26,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) 27, 43, 43, 39, 40, 41, 51, 52, 53, 58, 59, 60, 61, 62, 63, 64,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) 65, 66, 67, 68, 87, 88, 99, 70,119,110,102,104,111,107,109,106,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) 105,108,103, 69, 98, 55, 74, 78, 96, 79, 80, 81, 75, 76, 77, 71,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) 72, 73, 82, 83, 86,127,116,117,183,184,185,186,187,188,189,190,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) 191,192,193,194,134,138,130,132,128,129,131,137,133,135,136,113,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) 115,114,unk,unk,unk,121,unk, 89, 93,124, 92, 94, 95,unk,unk,unk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) 122,123, 90, 91, 85,unk,unk,unk,unk,unk,unk,unk,111,unk,unk,unk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) unk,unk,unk,unk,unk,unk,179,180,unk,unk,unk,unk,unk,unk,unk,unk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) unk,unk,unk,unk,unk,unk,unk,unk,111,unk,unk,unk,unk,unk,unk,unk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) 29, 42, 56,125, 97, 54,100,126,164,166,165,163,161,115,114,113,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) 150,158,159,128,136,177,178,176,142,152,173,140,unk,unk,unk,unk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) static const struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) __s32 x;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) __s32 y;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) } hid_hat_to_axis[] = {{ 0, 0}, { 0,-1}, { 1,-1}, { 1, 0}, { 1, 1}, { 0, 1}, {-1, 1}, {-1, 0}, {-1,-1}};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define map_abs(c) hid_map_usage(hidinput, usage, &bit, &max, EV_ABS, (c))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define map_rel(c) hid_map_usage(hidinput, usage, &bit, &max, EV_REL, (c))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define map_key(c) hid_map_usage(hidinput, usage, &bit, &max, EV_KEY, (c))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define map_led(c) hid_map_usage(hidinput, usage, &bit, &max, EV_LED, (c))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define map_abs_clear(c) hid_map_usage_clear(hidinput, usage, &bit, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) &max, EV_ABS, (c))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define map_key_clear(c) hid_map_usage_clear(hidinput, usage, &bit, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) &max, EV_KEY, (c))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) static bool match_scancode(struct hid_usage *usage,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) unsigned int cur_idx, unsigned int scancode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) return (usage->hid & (HID_USAGE_PAGE | HID_USAGE)) == scancode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) static bool match_keycode(struct hid_usage *usage,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) unsigned int cur_idx, unsigned int keycode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) * We should exclude unmapped usages when doing lookup by keycode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) return (usage->type == EV_KEY && usage->code == keycode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) static bool match_index(struct hid_usage *usage,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) unsigned int cur_idx, unsigned int idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) return cur_idx == idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) typedef bool (*hid_usage_cmp_t)(struct hid_usage *usage,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) unsigned int cur_idx, unsigned int val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) static struct hid_usage *hidinput_find_key(struct hid_device *hid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) hid_usage_cmp_t match,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) unsigned int value,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) unsigned int *usage_idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) unsigned int i, j, k, cur_idx = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) struct hid_report *report;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) struct hid_usage *usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) for (k = HID_INPUT_REPORT; k <= HID_OUTPUT_REPORT; k++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) list_for_each_entry(report, &hid->report_enum[k].report_list, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) for (i = 0; i < report->maxfield; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) for (j = 0; j < report->field[i]->maxusage; j++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) usage = report->field[i]->usage + j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) if (usage->type == EV_KEY || usage->type == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) if (match(usage, cur_idx, value)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) if (usage_idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) *usage_idx = cur_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) return usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) cur_idx++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) static struct hid_usage *hidinput_locate_usage(struct hid_device *hid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) const struct input_keymap_entry *ke,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) unsigned int *index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) struct hid_usage *usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) unsigned int scancode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) if (ke->flags & INPUT_KEYMAP_BY_INDEX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) usage = hidinput_find_key(hid, match_index, ke->index, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) else if (input_scancode_to_scalar(ke, &scancode) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) usage = hidinput_find_key(hid, match_scancode, scancode, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) usage = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) return usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) static int hidinput_getkeycode(struct input_dev *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) struct input_keymap_entry *ke)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) struct hid_device *hid = input_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) struct hid_usage *usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) unsigned int scancode, index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) usage = hidinput_locate_usage(hid, ke, &index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) if (usage) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) ke->keycode = usage->type == EV_KEY ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) usage->code : KEY_RESERVED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) ke->index = index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) scancode = usage->hid & (HID_USAGE_PAGE | HID_USAGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) ke->len = sizeof(scancode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) memcpy(ke->scancode, &scancode, sizeof(scancode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) static int hidinput_setkeycode(struct input_dev *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) const struct input_keymap_entry *ke,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) unsigned int *old_keycode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) struct hid_device *hid = input_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) struct hid_usage *usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) usage = hidinput_locate_usage(hid, ke, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) if (usage) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) *old_keycode = usage->type == EV_KEY ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) usage->code : KEY_RESERVED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) usage->code = ke->keycode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) clear_bit(*old_keycode, dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) set_bit(usage->code, dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) dbg_hid("Assigned keycode %d to HID usage code %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) usage->code, usage->hid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) * Set the keybit for the old keycode if the old keycode is used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) * by another key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) if (hidinput_find_key(hid, match_keycode, *old_keycode, NULL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) set_bit(*old_keycode, dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) * hidinput_calc_abs_res - calculate an absolute axis resolution
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) * @field: the HID report field to calculate resolution for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) * @code: axis code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) * The formula is:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) * (logical_maximum - logical_minimum)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) * resolution = ----------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) * (physical_maximum - physical_minimum) * 10 ^ unit_exponent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) * as seen in the HID specification v1.11 6.2.2.7 Global Items.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) * Only exponent 1 length units are processed. Centimeters and inches are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) * converted to millimeters. Degrees are converted to radians.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) __s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) __s32 unit_exponent = field->unit_exponent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) __s32 logical_extents = field->logical_maximum -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) field->logical_minimum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) __s32 physical_extents = field->physical_maximum -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) field->physical_minimum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) __s32 prev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) /* Check if the extents are sane */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) if (logical_extents <= 0 || physical_extents <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) * Verify and convert units.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) * See HID specification v1.11 6.2.2.7 Global Items for unit decoding
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) switch (code) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) case ABS_X:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) case ABS_Y:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) case ABS_Z:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) case ABS_MT_POSITION_X:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) case ABS_MT_POSITION_Y:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) case ABS_MT_TOOL_X:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) case ABS_MT_TOOL_Y:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) case ABS_MT_TOUCH_MAJOR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) case ABS_MT_TOUCH_MINOR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) if (field->unit == 0x11) { /* If centimeters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) /* Convert to millimeters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) unit_exponent += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) } else if (field->unit == 0x13) { /* If inches */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) /* Convert to millimeters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) prev = physical_extents;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) physical_extents *= 254;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) if (physical_extents < prev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) unit_exponent -= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) case ABS_RX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) case ABS_RY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) case ABS_RZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) case ABS_WHEEL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) case ABS_TILT_X:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) case ABS_TILT_Y:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) if (field->unit == 0x14) { /* If degrees */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) /* Convert to radians */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) prev = logical_extents;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) logical_extents *= 573;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) if (logical_extents < prev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) unit_exponent += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) } else if (field->unit != 0x12) { /* If not radians */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) /* Apply negative unit exponent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) for (; unit_exponent < 0; unit_exponent++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) prev = logical_extents;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) logical_extents *= 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) if (logical_extents < prev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) /* Apply positive unit exponent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) for (; unit_exponent > 0; unit_exponent--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) prev = physical_extents;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) physical_extents *= 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) if (physical_extents < prev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) /* Calculate resolution */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) return DIV_ROUND_CLOSEST(logical_extents, physical_extents);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) EXPORT_SYMBOL_GPL(hidinput_calc_abs_res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) #ifdef CONFIG_HID_BATTERY_STRENGTH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) static enum power_supply_property hidinput_battery_props[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) POWER_SUPPLY_PROP_PRESENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) POWER_SUPPLY_PROP_ONLINE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) POWER_SUPPLY_PROP_CAPACITY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) POWER_SUPPLY_PROP_MODEL_NAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) POWER_SUPPLY_PROP_STATUS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) POWER_SUPPLY_PROP_SCOPE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) #define HID_BATTERY_QUIRK_PERCENT (1 << 0) /* always reports percent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) #define HID_BATTERY_QUIRK_FEATURE (1 << 1) /* ask for feature report */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) #define HID_BATTERY_QUIRK_IGNORE (1 << 2) /* completely ignore the battery */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) static const struct hid_device_id hid_battery_quirks[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) HID_BATTERY_QUIRK_PERCENT | HID_BATTERY_QUIRK_FEATURE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) HID_BATTERY_QUIRK_PERCENT | HID_BATTERY_QUIRK_FEATURE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) HID_BATTERY_QUIRK_PERCENT | HID_BATTERY_QUIRK_FEATURE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) HID_BATTERY_QUIRK_PERCENT | HID_BATTERY_QUIRK_FEATURE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) HID_BATTERY_QUIRK_PERCENT | HID_BATTERY_QUIRK_FEATURE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) USB_DEVICE_ID_ELECOM_BM084),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) HID_BATTERY_QUIRK_IGNORE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) { HID_USB_DEVICE(USB_VENDOR_ID_SYMBOL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) USB_DEVICE_ID_SYMBOL_SCANNER_3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) HID_BATTERY_QUIRK_IGNORE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ASUSTEK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) USB_DEVICE_ID_ASUSTEK_T100CHI_KEYBOARD),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) HID_BATTERY_QUIRK_IGNORE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) USB_DEVICE_ID_LOGITECH_DINOVO_EDGE_KBD),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) HID_BATTERY_QUIRK_IGNORE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) { HID_USB_DEVICE(USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ASUS_UX550_TOUCHSCREEN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) HID_BATTERY_QUIRK_IGNORE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) static unsigned find_battery_quirk(struct hid_device *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) unsigned quirks = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) const struct hid_device_id *match;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) match = hid_match_id(hdev, hid_battery_quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) if (match != NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) quirks = match->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) return quirks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) static int hidinput_scale_battery_capacity(struct hid_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) int value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) if (dev->battery_min < dev->battery_max &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) value >= dev->battery_min && value <= dev->battery_max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) value = ((value - dev->battery_min) * 100) /
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) (dev->battery_max - dev->battery_min);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) return value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) static int hidinput_query_battery_capacity(struct hid_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) u8 *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) buf = kmalloc(4, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) if (!buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) ret = hid_hw_raw_request(dev, dev->battery_report_id, buf, 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) dev->battery_report_type, HID_REQ_GET_REPORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) if (ret < 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) kfree(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) return -ENODATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) ret = hidinput_scale_battery_capacity(dev, buf[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) kfree(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) static int hidinput_get_battery_property(struct power_supply *psy,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) enum power_supply_property prop,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) union power_supply_propval *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) struct hid_device *dev = power_supply_get_drvdata(psy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) int value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) switch (prop) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) case POWER_SUPPLY_PROP_PRESENT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) case POWER_SUPPLY_PROP_ONLINE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) val->intval = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) case POWER_SUPPLY_PROP_CAPACITY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) if (dev->battery_status != HID_BATTERY_REPORTED &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) !dev->battery_avoid_query) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) value = hidinput_query_battery_capacity(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) if (value < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) return value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) value = dev->battery_capacity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) val->intval = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) case POWER_SUPPLY_PROP_MODEL_NAME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) val->strval = dev->name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) case POWER_SUPPLY_PROP_STATUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) if (dev->battery_status != HID_BATTERY_REPORTED &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) !dev->battery_avoid_query) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) value = hidinput_query_battery_capacity(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) if (value < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) return value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) dev->battery_capacity = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) dev->battery_status = HID_BATTERY_QUERIED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) if (dev->battery_status == HID_BATTERY_UNKNOWN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) case POWER_SUPPLY_PROP_SCOPE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) val->intval = POWER_SUPPLY_SCOPE_DEVICE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) static int hidinput_setup_battery(struct hid_device *dev, unsigned report_type, struct hid_field *field)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) struct power_supply_desc *psy_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) struct power_supply_config psy_cfg = { .drv_data = dev, };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) unsigned quirks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) s32 min, max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) if (dev->battery)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) return 0; /* already initialized? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) quirks = find_battery_quirk(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) hid_dbg(dev, "device %x:%x:%x %d quirks %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) dev->bus, dev->vendor, dev->product, dev->version, quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) if (quirks & HID_BATTERY_QUIRK_IGNORE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) psy_desc = kzalloc(sizeof(*psy_desc), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) if (!psy_desc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) psy_desc->name = kasprintf(GFP_KERNEL, "hid-%s-battery",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) strlen(dev->uniq) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) dev->uniq : dev_name(&dev->dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) if (!psy_desc->name) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) error = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) goto err_free_mem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) psy_desc->type = POWER_SUPPLY_TYPE_BATTERY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) psy_desc->properties = hidinput_battery_props;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) psy_desc->num_properties = ARRAY_SIZE(hidinput_battery_props);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) psy_desc->use_for_apm = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) psy_desc->get_property = hidinput_get_battery_property;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) min = field->logical_minimum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) max = field->logical_maximum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) if (quirks & HID_BATTERY_QUIRK_PERCENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) min = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) max = 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) if (quirks & HID_BATTERY_QUIRK_FEATURE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) report_type = HID_FEATURE_REPORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) dev->battery_min = min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) dev->battery_max = max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) dev->battery_report_type = report_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) dev->battery_report_id = field->report->id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) * Stylus is normally not connected to the device and thus we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) * can't query the device and get meaningful battery strength.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) * We have to wait for the device to report it on its own.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) dev->battery_avoid_query = report_type == HID_INPUT_REPORT &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) field->physical == HID_DG_STYLUS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) dev->battery = power_supply_register(&dev->dev, psy_desc, &psy_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) if (IS_ERR(dev->battery)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) error = PTR_ERR(dev->battery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) hid_warn(dev, "can't register power supply: %d\n", error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) goto err_free_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) power_supply_powers(dev->battery, &dev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) err_free_name:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) kfree(psy_desc->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) err_free_mem:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) kfree(psy_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) dev->battery = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) static void hidinput_cleanup_battery(struct hid_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) const struct power_supply_desc *psy_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) if (!dev->battery)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) psy_desc = dev->battery->desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) power_supply_unregister(dev->battery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) kfree(psy_desc->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) kfree(psy_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) dev->battery = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) static void hidinput_update_battery(struct hid_device *dev, int value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) int capacity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) if (!dev->battery)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) if (value == 0 || value < dev->battery_min || value > dev->battery_max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) capacity = hidinput_scale_battery_capacity(dev, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) if (dev->battery_status != HID_BATTERY_REPORTED ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) capacity != dev->battery_capacity) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) dev->battery_capacity = capacity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) dev->battery_status = HID_BATTERY_REPORTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) power_supply_changed(dev->battery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) #else /* !CONFIG_HID_BATTERY_STRENGTH */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) static int hidinput_setup_battery(struct hid_device *dev, unsigned report_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) struct hid_field *field)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) static void hidinput_cleanup_battery(struct hid_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) static void hidinput_update_battery(struct hid_device *dev, int value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) #endif /* CONFIG_HID_BATTERY_STRENGTH */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_field *field,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) struct hid_usage *usage)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) struct input_dev *input = hidinput->input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) struct hid_device *device = input_get_drvdata(input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) int max = 0, code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) unsigned long *bit = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) field->hidinput = hidinput;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) if (field->flags & HID_MAIN_ITEM_CONSTANT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) goto ignore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) /* Ignore if report count is out of bounds. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) if (field->report_count < 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) goto ignore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) /* only LED usages are supported in output fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) if (field->report_type == HID_OUTPUT_REPORT &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) (usage->hid & HID_USAGE_PAGE) != HID_UP_LED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) goto ignore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) if (device->driver->input_mapping) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) int ret = device->driver->input_mapping(device, hidinput, field,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) usage, &bit, &max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) if (ret > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) goto mapped;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) goto ignore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) switch (usage->hid & HID_USAGE_PAGE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) case HID_UP_UNDEFINED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) goto ignore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) case HID_UP_KEYBOARD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) set_bit(EV_REP, input->evbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) if ((usage->hid & HID_USAGE) < 256) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) if (!hid_keyboard[usage->hid & HID_USAGE]) goto ignore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) map_key_clear(hid_keyboard[usage->hid & HID_USAGE]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) map_key(KEY_UNKNOWN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) case HID_UP_BUTTON:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) code = ((usage->hid - 1) & HID_USAGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) switch (field->application) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) case HID_GD_MOUSE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) case HID_GD_POINTER: code += BTN_MOUSE; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) case HID_GD_JOYSTICK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) if (code <= 0xf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) code += BTN_JOYSTICK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) code += BTN_TRIGGER_HAPPY - 0x10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) case HID_GD_GAMEPAD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) if (code <= 0xf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) code += BTN_GAMEPAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) code += BTN_TRIGGER_HAPPY - 0x10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) switch (field->physical) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) case HID_GD_MOUSE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) case HID_GD_POINTER: code += BTN_MOUSE; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) case HID_GD_JOYSTICK: code += BTN_JOYSTICK; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) case HID_GD_GAMEPAD: code += BTN_GAMEPAD; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) default: code += BTN_MISC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) map_key(code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) case HID_UP_SIMULATION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) switch (usage->hid & 0xffff) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) case 0xba: map_abs(ABS_RUDDER); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) case 0xbb: map_abs(ABS_THROTTLE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) case 0xc4: map_abs(ABS_GAS); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) case 0xc5: map_abs(ABS_BRAKE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) case 0xc8: map_abs(ABS_WHEEL); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) default: goto ignore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) case HID_UP_GENDESK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) if ((usage->hid & 0xf0) == 0x80) { /* SystemControl */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) switch (usage->hid & 0xf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) case 0x1: map_key_clear(KEY_POWER); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) case 0x2: map_key_clear(KEY_SLEEP); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) case 0x3: map_key_clear(KEY_WAKEUP); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) case 0x4: map_key_clear(KEY_CONTEXT_MENU); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) case 0x5: map_key_clear(KEY_MENU); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) case 0x6: map_key_clear(KEY_PROG1); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) case 0x7: map_key_clear(KEY_HELP); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) case 0x8: map_key_clear(KEY_EXIT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) case 0x9: map_key_clear(KEY_SELECT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) case 0xa: map_key_clear(KEY_RIGHT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) case 0xb: map_key_clear(KEY_LEFT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) case 0xc: map_key_clear(KEY_UP); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) case 0xd: map_key_clear(KEY_DOWN); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) case 0xe: map_key_clear(KEY_POWER2); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) case 0xf: map_key_clear(KEY_RESTART); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) default: goto unknown;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) if ((usage->hid & 0xf0) == 0xb0) { /* SC - Display */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) switch (usage->hid & 0xf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) case 0x05: map_key_clear(KEY_SWITCHVIDEOMODE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) default: goto ignore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) * Some lazy vendors declare 255 usages for System Control,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) * leading to the creation of ABS_X|Y axis and too many others.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) * It wouldn't be a problem if joydev doesn't consider the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) * device as a joystick then.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) if (field->application == HID_GD_SYSTEM_CONTROL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) goto ignore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) if ((usage->hid & 0xf0) == 0x90) { /* D-pad */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) switch (usage->hid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) case HID_GD_UP: usage->hat_dir = 1; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) case HID_GD_DOWN: usage->hat_dir = 5; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) case HID_GD_RIGHT: usage->hat_dir = 3; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) case HID_GD_LEFT: usage->hat_dir = 7; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) default: goto unknown;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) if (field->dpad) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) map_abs(field->dpad);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) goto ignore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) map_abs(ABS_HAT0X);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) switch (usage->hid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) /* These usage IDs map directly to the usage codes. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) case HID_GD_X: case HID_GD_Y: case HID_GD_Z:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) case HID_GD_RX: case HID_GD_RY: case HID_GD_RZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) if (field->flags & HID_MAIN_ITEM_RELATIVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) map_rel(usage->hid & 0xf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) map_abs_clear(usage->hid & 0xf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) case HID_GD_WHEEL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) if (field->flags & HID_MAIN_ITEM_RELATIVE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) set_bit(REL_WHEEL, input->relbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) map_rel(REL_WHEEL_HI_RES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) map_abs(usage->hid & 0xf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) case HID_GD_SLIDER: case HID_GD_DIAL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) if (field->flags & HID_MAIN_ITEM_RELATIVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) map_rel(usage->hid & 0xf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) map_abs(usage->hid & 0xf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) case HID_GD_HATSWITCH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) usage->hat_min = field->logical_minimum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) usage->hat_max = field->logical_maximum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) map_abs(ABS_HAT0X);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) case HID_GD_START: map_key_clear(BTN_START); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) case HID_GD_SELECT: map_key_clear(BTN_SELECT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) case HID_GD_RFKILL_BTN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) /* MS wireless radio ctl extension, also check CA */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) if (field->application == HID_GD_WIRELESS_RADIO_CTLS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) map_key_clear(KEY_RFKILL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) /* We need to simulate the btn release */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) field->flags |= HID_MAIN_ITEM_RELATIVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) default: goto unknown;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) case HID_UP_LED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) switch (usage->hid & 0xffff) { /* HID-Value: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) case 0x01: map_led (LED_NUML); break; /* "Num Lock" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) case 0x02: map_led (LED_CAPSL); break; /* "Caps Lock" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) case 0x03: map_led (LED_SCROLLL); break; /* "Scroll Lock" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) case 0x04: map_led (LED_COMPOSE); break; /* "Compose" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) case 0x05: map_led (LED_KANA); break; /* "Kana" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) case 0x27: map_led (LED_SLEEP); break; /* "Stand-By" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) case 0x4c: map_led (LED_SUSPEND); break; /* "System Suspend" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) case 0x09: map_led (LED_MUTE); break; /* "Mute" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) case 0x4b: map_led (LED_MISC); break; /* "Generic Indicator" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) case 0x19: map_led (LED_MAIL); break; /* "Message Waiting" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) case 0x4d: map_led (LED_CHARGING); break; /* "External Power Connected" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) default: goto ignore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) case HID_UP_DIGITIZER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) if ((field->application & 0xff) == 0x01) /* Digitizer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) __set_bit(INPUT_PROP_POINTER, input->propbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) else if ((field->application & 0xff) == 0x02) /* Pen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) __set_bit(INPUT_PROP_DIRECT, input->propbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) switch (usage->hid & 0xff) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) case 0x00: /* Undefined */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) goto ignore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) case 0x30: /* TipPressure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) if (!test_bit(BTN_TOUCH, input->keybit)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) device->quirks |= HID_QUIRK_NOTOUCH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) set_bit(EV_KEY, input->evbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) set_bit(BTN_TOUCH, input->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) map_abs_clear(ABS_PRESSURE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) case 0x32: /* InRange */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) switch (field->physical & 0xff) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) case 0x21: map_key(BTN_TOOL_MOUSE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) case 0x22: map_key(BTN_TOOL_FINGER); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) default: map_key(BTN_TOOL_PEN); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) case 0x3b: /* Battery Strength */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) hidinput_setup_battery(device, HID_INPUT_REPORT, field);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) usage->type = EV_PWR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) case 0x3c: /* Invert */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) map_key_clear(BTN_TOOL_RUBBER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) case 0x3d: /* X Tilt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) map_abs_clear(ABS_TILT_X);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) case 0x3e: /* Y Tilt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) map_abs_clear(ABS_TILT_Y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) case 0x33: /* Touch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) case 0x42: /* TipSwitch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) case 0x43: /* TipSwitch2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) device->quirks &= ~HID_QUIRK_NOTOUCH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) map_key_clear(BTN_TOUCH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) case 0x44: /* BarrelSwitch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) map_key_clear(BTN_STYLUS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) case 0x45: /* ERASER */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) * This event is reported when eraser tip touches the surface.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) * Actual eraser (BTN_TOOL_RUBBER) is set by Invert usage when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) * tool gets in proximity.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) map_key_clear(BTN_TOUCH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) case 0x46: /* TabletPick */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) case 0x5a: /* SecondaryBarrelSwitch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) map_key_clear(BTN_STYLUS2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) case 0x5b: /* TransducerSerialNumber */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) usage->type = EV_MSC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) usage->code = MSC_SERIAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) bit = input->mscbit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) max = MSC_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) default: goto unknown;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) case HID_UP_TELEPHONY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) switch (usage->hid & HID_USAGE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) case 0x2f: map_key_clear(KEY_MICMUTE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) case 0xb0: map_key_clear(KEY_NUMERIC_0); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) case 0xb1: map_key_clear(KEY_NUMERIC_1); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) case 0xb2: map_key_clear(KEY_NUMERIC_2); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) case 0xb3: map_key_clear(KEY_NUMERIC_3); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) case 0xb4: map_key_clear(KEY_NUMERIC_4); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) case 0xb5: map_key_clear(KEY_NUMERIC_5); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) case 0xb6: map_key_clear(KEY_NUMERIC_6); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) case 0xb7: map_key_clear(KEY_NUMERIC_7); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) case 0xb8: map_key_clear(KEY_NUMERIC_8); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) case 0xb9: map_key_clear(KEY_NUMERIC_9); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) case 0xba: map_key_clear(KEY_NUMERIC_STAR); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) case 0xbb: map_key_clear(KEY_NUMERIC_POUND); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) case 0xbc: map_key_clear(KEY_NUMERIC_A); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) case 0xbd: map_key_clear(KEY_NUMERIC_B); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) case 0xbe: map_key_clear(KEY_NUMERIC_C); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) case 0xbf: map_key_clear(KEY_NUMERIC_D); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) default: goto ignore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) case HID_UP_CONSUMER: /* USB HUT v1.12, pages 75-84 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) switch (usage->hid & HID_USAGE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) case 0x000: goto ignore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) case 0x030: map_key_clear(KEY_POWER); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) case 0x031: map_key_clear(KEY_RESTART); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) case 0x032: map_key_clear(KEY_SLEEP); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) case 0x034: map_key_clear(KEY_SLEEP); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) case 0x035: map_key_clear(KEY_KBDILLUMTOGGLE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) case 0x036: map_key_clear(BTN_MISC); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) case 0x040: map_key_clear(KEY_MENU); break; /* Menu */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) case 0x041: map_key_clear(KEY_SELECT); break; /* Menu Pick */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) case 0x042: map_key_clear(KEY_UP); break; /* Menu Up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) case 0x043: map_key_clear(KEY_DOWN); break; /* Menu Down */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) case 0x044: map_key_clear(KEY_LEFT); break; /* Menu Left */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) case 0x045: map_key_clear(KEY_RIGHT); break; /* Menu Right */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) case 0x046: map_key_clear(KEY_ESC); break; /* Menu Escape */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) case 0x047: map_key_clear(KEY_KPPLUS); break; /* Menu Value Increase */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) case 0x048: map_key_clear(KEY_KPMINUS); break; /* Menu Value Decrease */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) case 0x060: map_key_clear(KEY_INFO); break; /* Data On Screen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) case 0x061: map_key_clear(KEY_SUBTITLE); break; /* Closed Caption */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) case 0x063: map_key_clear(KEY_VCR); break; /* VCR/TV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) case 0x065: map_key_clear(KEY_CAMERA); break; /* Snapshot */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) case 0x069: map_key_clear(KEY_RED); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) case 0x06a: map_key_clear(KEY_GREEN); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) case 0x06b: map_key_clear(KEY_BLUE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) case 0x06c: map_key_clear(KEY_YELLOW); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) case 0x06d: map_key_clear(KEY_ASPECT_RATIO); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) case 0x06f: map_key_clear(KEY_BRIGHTNESSUP); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) case 0x070: map_key_clear(KEY_BRIGHTNESSDOWN); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) case 0x072: map_key_clear(KEY_BRIGHTNESS_TOGGLE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) case 0x073: map_key_clear(KEY_BRIGHTNESS_MIN); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) case 0x074: map_key_clear(KEY_BRIGHTNESS_MAX); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) case 0x075: map_key_clear(KEY_BRIGHTNESS_AUTO); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) case 0x079: map_key_clear(KEY_KBDILLUMUP); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) case 0x07a: map_key_clear(KEY_KBDILLUMDOWN); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) case 0x07c: map_key_clear(KEY_KBDILLUMTOGGLE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) case 0x082: map_key_clear(KEY_VIDEO_NEXT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) case 0x083: map_key_clear(KEY_LAST); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) case 0x084: map_key_clear(KEY_ENTER); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) case 0x088: map_key_clear(KEY_PC); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) case 0x089: map_key_clear(KEY_TV); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) case 0x08a: map_key_clear(KEY_WWW); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) case 0x08b: map_key_clear(KEY_DVD); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) case 0x08c: map_key_clear(KEY_PHONE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) case 0x08d: map_key_clear(KEY_PROGRAM); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) case 0x08e: map_key_clear(KEY_VIDEOPHONE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) case 0x08f: map_key_clear(KEY_GAMES); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) case 0x090: map_key_clear(KEY_MEMO); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) case 0x091: map_key_clear(KEY_CD); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) case 0x092: map_key_clear(KEY_VCR); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) case 0x093: map_key_clear(KEY_TUNER); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) case 0x094: map_key_clear(KEY_EXIT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) case 0x095: map_key_clear(KEY_HELP); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) case 0x096: map_key_clear(KEY_TAPE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) case 0x097: map_key_clear(KEY_TV2); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) case 0x098: map_key_clear(KEY_SAT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) case 0x09a: map_key_clear(KEY_PVR); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) case 0x09c: map_key_clear(KEY_CHANNELUP); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) case 0x09d: map_key_clear(KEY_CHANNELDOWN); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) case 0x0a0: map_key_clear(KEY_VCR2); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) case 0x0b0: map_key_clear(KEY_PLAY); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) case 0x0b1: map_key_clear(KEY_PAUSE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) case 0x0b2: map_key_clear(KEY_RECORD); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) case 0x0b3: map_key_clear(KEY_FASTFORWARD); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) case 0x0b4: map_key_clear(KEY_REWIND); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) case 0x0b5: map_key_clear(KEY_NEXTSONG); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) case 0x0b6: map_key_clear(KEY_PREVIOUSSONG); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) case 0x0b7: map_key_clear(KEY_STOPCD); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) case 0x0b8: map_key_clear(KEY_EJECTCD); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) case 0x0bc: map_key_clear(KEY_MEDIA_REPEAT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) case 0x0b9: map_key_clear(KEY_SHUFFLE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) case 0x0bf: map_key_clear(KEY_SLOW); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) case 0x0cd: map_key_clear(KEY_PLAYPAUSE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) case 0x0cf: map_key_clear(KEY_VOICECOMMAND); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) case 0x0d8: map_key_clear(KEY_DICTATE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) case 0x0d9: map_key_clear(KEY_EMOJI_PICKER); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) case 0x0e0: map_abs_clear(ABS_VOLUME); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) case 0x0e2: map_key_clear(KEY_MUTE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) case 0x0e5: map_key_clear(KEY_BASSBOOST); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) case 0x0e9: map_key_clear(KEY_VOLUMEUP); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) case 0x0ea: map_key_clear(KEY_VOLUMEDOWN); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) case 0x0f5: map_key_clear(KEY_SLOW); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) case 0x181: map_key_clear(KEY_BUTTONCONFIG); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) case 0x182: map_key_clear(KEY_BOOKMARKS); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) case 0x183: map_key_clear(KEY_CONFIG); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) case 0x184: map_key_clear(KEY_WORDPROCESSOR); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) case 0x185: map_key_clear(KEY_EDITOR); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) case 0x186: map_key_clear(KEY_SPREADSHEET); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) case 0x187: map_key_clear(KEY_GRAPHICSEDITOR); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) case 0x188: map_key_clear(KEY_PRESENTATION); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) case 0x189: map_key_clear(KEY_DATABASE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) case 0x18a: map_key_clear(KEY_MAIL); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) case 0x18b: map_key_clear(KEY_NEWS); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) case 0x18c: map_key_clear(KEY_VOICEMAIL); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) case 0x18d: map_key_clear(KEY_ADDRESSBOOK); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) case 0x18e: map_key_clear(KEY_CALENDAR); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) case 0x18f: map_key_clear(KEY_TASKMANAGER); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) case 0x190: map_key_clear(KEY_JOURNAL); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) case 0x191: map_key_clear(KEY_FINANCE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) case 0x192: map_key_clear(KEY_CALC); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) case 0x193: map_key_clear(KEY_PLAYER); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) case 0x194: map_key_clear(KEY_FILE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) case 0x196: map_key_clear(KEY_WWW); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) case 0x199: map_key_clear(KEY_CHAT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) case 0x19c: map_key_clear(KEY_LOGOFF); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) case 0x19e: map_key_clear(KEY_COFFEE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) case 0x19f: map_key_clear(KEY_CONTROLPANEL); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) case 0x1a2: map_key_clear(KEY_APPSELECT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) case 0x1a3: map_key_clear(KEY_NEXT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) case 0x1a4: map_key_clear(KEY_PREVIOUS); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) case 0x1a6: map_key_clear(KEY_HELP); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) case 0x1a7: map_key_clear(KEY_DOCUMENTS); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) case 0x1ab: map_key_clear(KEY_SPELLCHECK); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) case 0x1ae: map_key_clear(KEY_KEYBOARD); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) case 0x1b1: map_key_clear(KEY_SCREENSAVER); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) case 0x1b4: map_key_clear(KEY_FILE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) case 0x1b6: map_key_clear(KEY_IMAGES); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) case 0x1b7: map_key_clear(KEY_AUDIO); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) case 0x1b8: map_key_clear(KEY_VIDEO); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) case 0x1bc: map_key_clear(KEY_MESSENGER); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) case 0x1bd: map_key_clear(KEY_INFO); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) case 0x1cb: map_key_clear(KEY_ASSISTANT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) case 0x201: map_key_clear(KEY_NEW); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) case 0x202: map_key_clear(KEY_OPEN); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) case 0x203: map_key_clear(KEY_CLOSE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) case 0x204: map_key_clear(KEY_EXIT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) case 0x207: map_key_clear(KEY_SAVE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) case 0x208: map_key_clear(KEY_PRINT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) case 0x209: map_key_clear(KEY_PROPS); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) case 0x21a: map_key_clear(KEY_UNDO); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) case 0x21b: map_key_clear(KEY_COPY); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) case 0x21c: map_key_clear(KEY_CUT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) case 0x21d: map_key_clear(KEY_PASTE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) case 0x21f: map_key_clear(KEY_FIND); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) case 0x221: map_key_clear(KEY_SEARCH); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) case 0x222: map_key_clear(KEY_GOTO); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) case 0x223: map_key_clear(KEY_HOMEPAGE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) case 0x224: map_key_clear(KEY_BACK); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) case 0x225: map_key_clear(KEY_FORWARD); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) case 0x226: map_key_clear(KEY_STOP); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) case 0x227: map_key_clear(KEY_REFRESH); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) case 0x22a: map_key_clear(KEY_BOOKMARKS); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) case 0x22d: map_key_clear(KEY_ZOOMIN); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) case 0x22e: map_key_clear(KEY_ZOOMOUT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) case 0x22f: map_key_clear(KEY_ZOOMRESET); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) case 0x232: map_key_clear(KEY_FULL_SCREEN); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) case 0x233: map_key_clear(KEY_SCROLLUP); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) case 0x234: map_key_clear(KEY_SCROLLDOWN); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) case 0x238: /* AC Pan */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) set_bit(REL_HWHEEL, input->relbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) map_rel(REL_HWHEEL_HI_RES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) case 0x23d: map_key_clear(KEY_EDIT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) case 0x25f: map_key_clear(KEY_CANCEL); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) case 0x269: map_key_clear(KEY_INSERT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) case 0x26a: map_key_clear(KEY_DELETE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) case 0x279: map_key_clear(KEY_REDO); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) case 0x289: map_key_clear(KEY_REPLY); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) case 0x28b: map_key_clear(KEY_FORWARDMAIL); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) case 0x28c: map_key_clear(KEY_SEND); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) case 0x29d: map_key_clear(KEY_KBD_LAYOUT_NEXT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) case 0x2a2: map_key_clear(KEY_ALL_APPLICATIONS); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) case 0x2c7: map_key_clear(KEY_KBDINPUTASSIST_PREV); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) case 0x2c8: map_key_clear(KEY_KBDINPUTASSIST_NEXT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) case 0x2c9: map_key_clear(KEY_KBDINPUTASSIST_PREVGROUP); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) case 0x2ca: map_key_clear(KEY_KBDINPUTASSIST_NEXTGROUP); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) case 0x2cb: map_key_clear(KEY_KBDINPUTASSIST_ACCEPT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) case 0x2cc: map_key_clear(KEY_KBDINPUTASSIST_CANCEL); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) case 0x29f: map_key_clear(KEY_SCALE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) default: map_key_clear(KEY_UNKNOWN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) case HID_UP_GENDEVCTRLS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) switch (usage->hid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) case HID_DC_BATTERYSTRENGTH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) hidinput_setup_battery(device, HID_INPUT_REPORT, field);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) usage->type = EV_PWR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) goto unknown;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) case HID_UP_HPVENDOR: /* Reported on a Dutch layout HP5308 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) set_bit(EV_REP, input->evbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) switch (usage->hid & HID_USAGE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) case 0x021: map_key_clear(KEY_PRINT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) case 0x070: map_key_clear(KEY_HP); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) case 0x071: map_key_clear(KEY_CAMERA); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) case 0x072: map_key_clear(KEY_SOUND); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) case 0x073: map_key_clear(KEY_QUESTION); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) case 0x080: map_key_clear(KEY_EMAIL); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) case 0x081: map_key_clear(KEY_CHAT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) case 0x082: map_key_clear(KEY_SEARCH); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) case 0x083: map_key_clear(KEY_CONNECT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) case 0x084: map_key_clear(KEY_FINANCE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) case 0x085: map_key_clear(KEY_SPORT); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) case 0x086: map_key_clear(KEY_SHOP); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) default: goto ignore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) case HID_UP_HPVENDOR2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) set_bit(EV_REP, input->evbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) switch (usage->hid & HID_USAGE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) case 0x001: map_key_clear(KEY_MICMUTE); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) case 0x003: map_key_clear(KEY_BRIGHTNESSDOWN); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) case 0x004: map_key_clear(KEY_BRIGHTNESSUP); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) default: goto ignore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) case HID_UP_MSVENDOR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) goto ignore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) case HID_UP_CUSTOM: /* Reported on Logitech and Apple USB keyboards */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) set_bit(EV_REP, input->evbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) goto ignore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) case HID_UP_LOGIVENDOR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) /* intentional fallback */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) case HID_UP_LOGIVENDOR2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) /* intentional fallback */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) case HID_UP_LOGIVENDOR3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) goto ignore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) case HID_UP_PID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) switch (usage->hid & HID_USAGE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) case 0xa4: map_key_clear(BTN_DEAD); break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) default: goto ignore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) unknown:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) if (field->report_size == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) if (field->report->type == HID_OUTPUT_REPORT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) map_led(LED_MISC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) map_key(BTN_MISC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) if (field->flags & HID_MAIN_ITEM_RELATIVE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) map_rel(REL_MISC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) map_abs(ABS_MISC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) mapped:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) /* Mapping failed, bail out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) if (!bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) if (device->driver->input_mapped &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) device->driver->input_mapped(device, hidinput, field, usage,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) &bit, &max) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) * The driver indicated that no further generic handling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) * of the usage is desired.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) set_bit(usage->type, input->evbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) * This part is *really* controversial:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) * - HID aims at being generic so we should do our best to export
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) * all incoming events
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) * - HID describes what events are, so there is no reason for ABS_X
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) * to be mapped to ABS_Y
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) * - HID is using *_MISC+N as a default value, but nothing prevents
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) * *_MISC+N to overwrite a legitimate even, which confuses userspace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) * (for instance ABS_MISC + 7 is ABS_MT_SLOT, which has a different
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) * processing)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) * If devices still want to use this (at their own risk), they will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) * have to use the quirk HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) * the default should be a reliable mapping.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) while (usage->code <= max && test_and_set_bit(usage->code, bit)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) if (device->quirks & HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) usage->code = find_next_zero_bit(bit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) max + 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) usage->code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) device->status |= HID_STAT_DUP_DETECTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) goto ignore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) if (usage->code > max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) goto ignore;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) if (usage->type == EV_ABS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) int a = field->logical_minimum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) int b = field->logical_maximum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) if ((device->quirks & HID_QUIRK_BADPAD) && (usage->code == ABS_X || usage->code == ABS_Y)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) a = field->logical_minimum = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) b = field->logical_maximum = 255;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) if (field->application == HID_GD_GAMEPAD || field->application == HID_GD_JOYSTICK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) input_set_abs_params(input, usage->code, a, b, (b - a) >> 8, (b - a) >> 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) else input_set_abs_params(input, usage->code, a, b, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) input_abs_set_res(input, usage->code,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) hidinput_calc_abs_res(field, usage->code));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) /* use a larger default input buffer for MT devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) if (usage->code == ABS_MT_POSITION_X && input->hint_events_per_packet == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) input_set_events_per_packet(input, 60);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) if (usage->type == EV_ABS &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) (usage->hat_min < usage->hat_max || usage->hat_dir)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) for (i = usage->code; i < usage->code + 2 && i <= max; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) input_set_abs_params(input, i, -1, 1, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) set_bit(i, input->absbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) if (usage->hat_dir && !field->dpad)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) field->dpad = usage->code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) /* for those devices which produce Consumer volume usage as relative,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) * we emulate pressing volumeup/volumedown appropriate number of times
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) * in hidinput_hid_event()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) if ((usage->type == EV_ABS) && (field->flags & HID_MAIN_ITEM_RELATIVE) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) (usage->code == ABS_VOLUME)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) set_bit(KEY_VOLUMEUP, input->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) set_bit(KEY_VOLUMEDOWN, input->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) if (usage->type == EV_KEY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) set_bit(EV_MSC, input->evbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) set_bit(MSC_SCAN, input->mscbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) ignore:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) usage->type = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) usage->code = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) static void hidinput_handle_scroll(struct hid_usage *usage,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) struct input_dev *input,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) __s32 value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) int code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) int hi_res, lo_res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) if (value == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) if (usage->code == REL_WHEEL_HI_RES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) code = REL_WHEEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) code = REL_HWHEEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) * Windows reports one wheel click as value 120. Where a high-res
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) * scroll wheel is present, a fraction of 120 is reported instead.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) * Our REL_WHEEL_HI_RES axis does the same because all HW must
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) * adhere to the 120 expectation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) hi_res = value * 120/usage->resolution_multiplier;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) usage->wheel_accumulated += hi_res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) lo_res = usage->wheel_accumulated/120;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) if (lo_res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) usage->wheel_accumulated -= lo_res * 120;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) input_event(input, EV_REL, code, lo_res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) input_event(input, EV_REL, usage->code, hi_res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct hid_usage *usage, __s32 value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) struct input_dev *input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) unsigned *quirks = &hid->quirks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) if (!usage->type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) if (usage->type == EV_PWR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) hidinput_update_battery(hid, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) if (!field->hidinput)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) input = field->hidinput->input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) if (usage->type == EV_ABS &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) (((*quirks & HID_QUIRK_X_INVERT) && usage->code == ABS_X) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) ((*quirks & HID_QUIRK_Y_INVERT) && usage->code == ABS_Y))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) value = field->logical_maximum - value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) if (usage->hat_min < usage->hat_max || usage->hat_dir) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) int hat_dir = usage->hat_dir;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) if (!hat_dir)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) hat_dir = (value - usage->hat_min) * 8 / (usage->hat_max - usage->hat_min + 1) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) if (hat_dir < 0 || hat_dir > 8) hat_dir = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) input_event(input, usage->type, usage->code , hid_hat_to_axis[hat_dir].x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) input_event(input, usage->type, usage->code + 1, hid_hat_to_axis[hat_dir].y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) if (usage->hid == (HID_UP_DIGITIZER | 0x003c)) { /* Invert */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) *quirks = value ? (*quirks | HID_QUIRK_INVERT) : (*quirks & ~HID_QUIRK_INVERT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) if (usage->hid == (HID_UP_DIGITIZER | 0x0032)) { /* InRange */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) if (value) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) input_event(input, usage->type, (*quirks & HID_QUIRK_INVERT) ? BTN_TOOL_RUBBER : usage->code, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) input_event(input, usage->type, usage->code, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) input_event(input, usage->type, BTN_TOOL_RUBBER, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) if (usage->hid == (HID_UP_DIGITIZER | 0x0030) && (*quirks & HID_QUIRK_NOTOUCH)) { /* Pressure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) int a = field->logical_minimum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) int b = field->logical_maximum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) input_event(input, EV_KEY, BTN_TOUCH, value > a + ((b - a) >> 3));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) if (usage->hid == (HID_UP_PID | 0x83UL)) { /* Simultaneous Effects Max */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) dbg_hid("Maximum Effects - %d\n",value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) if (usage->hid == (HID_UP_PID | 0x7fUL)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) dbg_hid("PID Pool Report\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) if ((usage->type == EV_KEY) && (usage->code == 0)) /* Key 0 is "unassigned", not KEY_UNKNOWN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) if ((usage->type == EV_REL) && (usage->code == REL_WHEEL_HI_RES ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) usage->code == REL_HWHEEL_HI_RES)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) hidinput_handle_scroll(usage, input, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) if ((usage->type == EV_ABS) && (field->flags & HID_MAIN_ITEM_RELATIVE) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) (usage->code == ABS_VOLUME)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) int count = abs(value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) int direction = value > 0 ? KEY_VOLUMEUP : KEY_VOLUMEDOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) for (i = 0; i < count; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) input_event(input, EV_KEY, direction, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) input_sync(input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) input_event(input, EV_KEY, direction, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) input_sync(input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) * Ignore out-of-range values as per HID specification,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) * section 5.10 and 6.2.25, when NULL state bit is present.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) * When it's not, clamp the value to match Microsoft's input
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) * driver as mentioned in "Required HID usages for digitizers":
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) * https://msdn.microsoft.com/en-us/library/windows/hardware/dn672278(v=vs.85).asp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) * The logical_minimum < logical_maximum check is done so that we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) * don't unintentionally discard values sent by devices which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) * don't specify logical min and max.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) if ((field->flags & HID_MAIN_ITEM_VARIABLE) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) (field->logical_minimum < field->logical_maximum)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) if (field->flags & HID_MAIN_ITEM_NULL_STATE &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) (value < field->logical_minimum ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) value > field->logical_maximum)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) dbg_hid("Ignoring out-of-range value %x\n", value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) value = clamp(value,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) field->logical_minimum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) field->logical_maximum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) * Ignore reports for absolute data if the data didn't change. This is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) * not only an optimization but also fixes 'dead' key reports. Some
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) * RollOver implementations for localized keys (like BACKSLASH/PIPE; HID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) * 0x31 and 0x32) report multiple keys, even though a localized keyboard
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) * can only have one of them physically available. The 'dead' keys
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) * report constant 0. As all map to the same keycode, they'd confuse
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) * the input layer. If we filter the 'dead' keys on the HID level, we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) * skip the keycode translation and only forward real events.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) if (!(field->flags & (HID_MAIN_ITEM_RELATIVE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) HID_MAIN_ITEM_BUFFERED_BYTE)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) (field->flags & HID_MAIN_ITEM_VARIABLE) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) usage->usage_index < field->maxusage &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) value == field->value[usage->usage_index])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) /* report the usage code as scancode if the key status has changed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) if (usage->type == EV_KEY &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) (!test_bit(usage->code, input->key)) == value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) input_event(input, EV_MSC, MSC_SCAN, usage->hid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) input_event(input, usage->type, usage->code, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) if ((field->flags & HID_MAIN_ITEM_RELATIVE) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) usage->type == EV_KEY && value) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) input_sync(input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) input_event(input, usage->type, usage->code, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) void hidinput_report_event(struct hid_device *hid, struct hid_report *report)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) struct hid_input *hidinput;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) if (hid->quirks & HID_QUIRK_NO_INPUT_SYNC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) list_for_each_entry(hidinput, &hid->inputs, list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) input_sync(hidinput->input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) EXPORT_SYMBOL_GPL(hidinput_report_event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) int hidinput_find_field(struct hid_device *hid, unsigned int type, unsigned int code, struct hid_field **field)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) struct hid_report *report;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) int i, j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) list_for_each_entry(report, &hid->report_enum[HID_OUTPUT_REPORT].report_list, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) for (i = 0; i < report->maxfield; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) *field = report->field[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) for (j = 0; j < (*field)->maxusage; j++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) if ((*field)->usage[j].type == type && (*field)->usage[j].code == code)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) return j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) EXPORT_SYMBOL_GPL(hidinput_find_field);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) struct hid_field *hidinput_get_led_field(struct hid_device *hid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) struct hid_report *report;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) struct hid_field *field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) int i, j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) list_for_each_entry(report,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) &hid->report_enum[HID_OUTPUT_REPORT].report_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) for (i = 0; i < report->maxfield; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) field = report->field[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) for (j = 0; j < field->maxusage; j++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) if (field->usage[j].type == EV_LED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) return field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) EXPORT_SYMBOL_GPL(hidinput_get_led_field);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) unsigned int hidinput_count_leds(struct hid_device *hid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) struct hid_report *report;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) struct hid_field *field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) int i, j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) unsigned int count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) list_for_each_entry(report,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) &hid->report_enum[HID_OUTPUT_REPORT].report_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) for (i = 0; i < report->maxfield; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) field = report->field[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) for (j = 0; j < field->maxusage; j++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) if (field->usage[j].type == EV_LED &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) field->value[j])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) count += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) EXPORT_SYMBOL_GPL(hidinput_count_leds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) static void hidinput_led_worker(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) struct hid_device *hid = container_of(work, struct hid_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) led_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) struct hid_field *field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) struct hid_report *report;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) u32 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) __u8 *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) field = hidinput_get_led_field(hid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) if (!field)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) * field->report is accessed unlocked regarding HID core. So there might
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) * be another incoming SET-LED request from user-space, which changes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) * the LED state while we assemble our outgoing buffer. However, this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) * doesn't matter as hid_output_report() correctly converts it into a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) * boolean value no matter what information is currently set on the LED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) * field (even garbage). So the remote device will always get a valid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) * request.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) * And in case we send a wrong value, a next led worker is spawned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) * for every SET-LED request so the following worker will send the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) * correct value, guaranteed!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) report = field->report;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) /* use custom SET_REPORT request if possible (asynchronous) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) if (hid->ll_driver->request)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) return hid->ll_driver->request(hid, report, HID_REQ_SET_REPORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) /* fall back to generic raw-output-report */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) len = hid_report_len(report);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) buf = hid_alloc_report_buf(report, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) if (!buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) hid_output_report(report, buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) /* synchronous output report */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) ret = hid_hw_output_report(hid, buf, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) if (ret == -ENOSYS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) hid_hw_raw_request(hid, report->id, buf, len, HID_OUTPUT_REPORT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) HID_REQ_SET_REPORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) kfree(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) static int hidinput_input_event(struct input_dev *dev, unsigned int type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) unsigned int code, int value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) struct hid_device *hid = input_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) struct hid_field *field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) int offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) if (type == EV_FF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) return input_ff_event(dev, type, code, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) if (type != EV_LED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) if ((offset = hidinput_find_field(hid, type, code, &field)) == -1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) hid_warn(dev, "event field not found\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) hid_set_field(field, offset, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) schedule_work(&hid->led_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) static int hidinput_open(struct input_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) struct hid_device *hid = input_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) return hid_hw_open(hid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) static void hidinput_close(struct input_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) struct hid_device *hid = input_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) hid_hw_close(hid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) static bool __hidinput_change_resolution_multipliers(struct hid_device *hid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) struct hid_report *report, bool use_logical_max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) struct hid_usage *usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) bool update_needed = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) bool get_report_completed = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) int i, j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) if (report->maxfield == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) for (i = 0; i < report->maxfield; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) __s32 value = use_logical_max ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) report->field[i]->logical_maximum :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) report->field[i]->logical_minimum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) /* There is no good reason for a Resolution
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) * Multiplier to have a count other than 1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) * Ignore that case.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) if (report->field[i]->report_count != 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) for (j = 0; j < report->field[i]->maxusage; j++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) usage = &report->field[i]->usage[j];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) if (usage->hid != HID_GD_RESOLUTION_MULTIPLIER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) * If we have more than one feature within this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) * report we need to fill in the bits from the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) * others before we can overwrite the ones for the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) * Resolution Multiplier.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) * But if we're not allowed to read from the device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) * we just bail. Such a device should not exist
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) * anyway.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) if (!get_report_completed && report->maxfield > 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) if (hid->quirks & HID_QUIRK_NO_INIT_REPORTS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) return update_needed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) hid_hw_request(hid, report, HID_REQ_GET_REPORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) hid_hw_wait(hid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) get_report_completed = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) report->field[i]->value[j] = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) update_needed = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) return update_needed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) static void hidinput_change_resolution_multipliers(struct hid_device *hid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) struct hid_report_enum *rep_enum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) struct hid_report *rep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) rep_enum = &hid->report_enum[HID_FEATURE_REPORT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) list_for_each_entry(rep, &rep_enum->report_list, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) bool update_needed = __hidinput_change_resolution_multipliers(hid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) rep, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) if (update_needed) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) ret = __hid_request(hid, rep, HID_REQ_SET_REPORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) __hidinput_change_resolution_multipliers(hid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) rep, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) /* refresh our structs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) hid_setup_resolution_multiplier(hid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) static void report_features(struct hid_device *hid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) struct hid_driver *drv = hid->driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) struct hid_report_enum *rep_enum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) struct hid_report *rep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) struct hid_usage *usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) int i, j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) rep_enum = &hid->report_enum[HID_FEATURE_REPORT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) list_for_each_entry(rep, &rep_enum->report_list, list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) for (i = 0; i < rep->maxfield; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) /* Ignore if report count is out of bounds. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) if (rep->field[i]->report_count < 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) for (j = 0; j < rep->field[i]->maxusage; j++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) usage = &rep->field[i]->usage[j];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) /* Verify if Battery Strength feature is available */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) if (usage->hid == HID_DC_BATTERYSTRENGTH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) hidinput_setup_battery(hid, HID_FEATURE_REPORT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) rep->field[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) if (drv->feature_mapping)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) drv->feature_mapping(hid, rep->field[i], usage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) static struct hid_input *hidinput_allocate(struct hid_device *hid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) unsigned int application)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) struct hid_input *hidinput = kzalloc(sizeof(*hidinput), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) struct input_dev *input_dev = input_allocate_device();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) const char *suffix = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) size_t suffix_len, name_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) if (!hidinput || !input_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) if ((hid->quirks & HID_QUIRK_INPUT_PER_APP) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) hid->maxapplication > 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) switch (application) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) case HID_GD_KEYBOARD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) suffix = "Keyboard";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) case HID_GD_KEYPAD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) suffix = "Keypad";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) case HID_GD_MOUSE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) suffix = "Mouse";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) case HID_DG_STYLUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) suffix = "Pen";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) case HID_DG_TOUCHSCREEN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) suffix = "Touchscreen";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) case HID_DG_TOUCHPAD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) suffix = "Touchpad";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) case HID_GD_SYSTEM_CONTROL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) suffix = "System Control";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) case HID_CP_CONSUMER_CONTROL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) suffix = "Consumer Control";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) case HID_GD_WIRELESS_RADIO_CTLS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) suffix = "Wireless Radio Control";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) case HID_GD_SYSTEM_MULTIAXIS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) suffix = "System Multi Axis";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) if (suffix) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) name_len = strlen(hid->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) suffix_len = strlen(suffix);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) if ((name_len < suffix_len) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) strcmp(hid->name + name_len - suffix_len, suffix)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) hidinput->name = kasprintf(GFP_KERNEL, "%s %s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) hid->name, suffix);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) if (!hidinput->name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) input_set_drvdata(input_dev, hid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) input_dev->event = hidinput_input_event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) input_dev->open = hidinput_open;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) input_dev->close = hidinput_close;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) input_dev->setkeycode = hidinput_setkeycode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) input_dev->getkeycode = hidinput_getkeycode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) input_dev->name = hidinput->name ? hidinput->name : hid->name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) input_dev->phys = hid->phys;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) input_dev->uniq = hid->uniq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) input_dev->id.bustype = hid->bus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) input_dev->id.vendor = hid->vendor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) input_dev->id.product = hid->product;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) input_dev->id.version = hid->version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) input_dev->dev.parent = &hid->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) hidinput->input = input_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) hidinput->application = application;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) list_add_tail(&hidinput->list, &hid->inputs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) INIT_LIST_HEAD(&hidinput->reports);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) return hidinput;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) fail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) kfree(hidinput);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) input_free_device(input_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) hid_err(hid, "Out of memory during hid input probe\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) static bool hidinput_has_been_populated(struct hid_input *hidinput)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) unsigned long r = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) for (i = 0; i < BITS_TO_LONGS(EV_CNT); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) r |= hidinput->input->evbit[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) for (i = 0; i < BITS_TO_LONGS(KEY_CNT); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) r |= hidinput->input->keybit[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) for (i = 0; i < BITS_TO_LONGS(REL_CNT); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) r |= hidinput->input->relbit[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) for (i = 0; i < BITS_TO_LONGS(ABS_CNT); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) r |= hidinput->input->absbit[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) for (i = 0; i < BITS_TO_LONGS(MSC_CNT); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) r |= hidinput->input->mscbit[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) for (i = 0; i < BITS_TO_LONGS(LED_CNT); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) r |= hidinput->input->ledbit[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) for (i = 0; i < BITS_TO_LONGS(SND_CNT); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) r |= hidinput->input->sndbit[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) for (i = 0; i < BITS_TO_LONGS(FF_CNT); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) r |= hidinput->input->ffbit[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) for (i = 0; i < BITS_TO_LONGS(SW_CNT); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) r |= hidinput->input->swbit[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) return !!r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) static void hidinput_cleanup_hidinput(struct hid_device *hid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) struct hid_input *hidinput)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) struct hid_report *report;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) int i, k;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) list_del(&hidinput->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) input_free_device(hidinput->input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) kfree(hidinput->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) for (k = HID_INPUT_REPORT; k <= HID_OUTPUT_REPORT; k++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) if (k == HID_OUTPUT_REPORT &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) hid->quirks & HID_QUIRK_SKIP_OUTPUT_REPORTS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) list_for_each_entry(report, &hid->report_enum[k].report_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) for (i = 0; i < report->maxfield; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) if (report->field[i]->hidinput == hidinput)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) report->field[i]->hidinput = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) kfree(hidinput);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) static struct hid_input *hidinput_match(struct hid_report *report)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) struct hid_device *hid = report->device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) struct hid_input *hidinput;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) list_for_each_entry(hidinput, &hid->inputs, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) if (hidinput->report &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) hidinput->report->id == report->id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) return hidinput;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) static struct hid_input *hidinput_match_application(struct hid_report *report)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) struct hid_device *hid = report->device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) struct hid_input *hidinput;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) list_for_each_entry(hidinput, &hid->inputs, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) if (hidinput->application == report->application)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) return hidinput;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) static inline void hidinput_configure_usages(struct hid_input *hidinput,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) struct hid_report *report)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) int i, j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) for (i = 0; i < report->maxfield; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) for (j = 0; j < report->field[i]->maxusage; j++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) hidinput_configure_usage(hidinput, report->field[i],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) report->field[i]->usage + j);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) * Register the input device; print a message.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) * Configure the input layer interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) * Read all reports and initialize the absolute field values.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) int hidinput_connect(struct hid_device *hid, unsigned int force)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) struct hid_driver *drv = hid->driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) struct hid_report *report;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) struct hid_input *next, *hidinput = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) unsigned int application;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) int i, k;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) INIT_LIST_HEAD(&hid->inputs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) INIT_WORK(&hid->led_work, hidinput_led_worker);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) hid->status &= ~HID_STAT_DUP_DETECTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) if (!force) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) for (i = 0; i < hid->maxcollection; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) struct hid_collection *col = &hid->collection[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) if (col->type == HID_COLLECTION_APPLICATION ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) col->type == HID_COLLECTION_PHYSICAL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) if (IS_INPUT_APPLICATION(col->usage))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) if (i == hid->maxcollection)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) report_features(hid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) for (k = HID_INPUT_REPORT; k <= HID_OUTPUT_REPORT; k++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) if (k == HID_OUTPUT_REPORT &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) hid->quirks & HID_QUIRK_SKIP_OUTPUT_REPORTS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) list_for_each_entry(report, &hid->report_enum[k].report_list, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) if (!report->maxfield)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) application = report->application;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) * Find the previous hidinput report attached
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) * to this report id.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) if (hid->quirks & HID_QUIRK_MULTI_INPUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) hidinput = hidinput_match(report);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) else if (hid->maxapplication > 1 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) (hid->quirks & HID_QUIRK_INPUT_PER_APP))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) hidinput = hidinput_match_application(report);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) if (!hidinput) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) hidinput = hidinput_allocate(hid, application);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) if (!hidinput)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) goto out_unwind;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) hidinput_configure_usages(hidinput, report);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) if (hid->quirks & HID_QUIRK_MULTI_INPUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) hidinput->report = report;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) list_add_tail(&report->hidinput_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) &hidinput->reports);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) hidinput_change_resolution_multipliers(hid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) list_for_each_entry_safe(hidinput, next, &hid->inputs, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) if (drv->input_configured &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) drv->input_configured(hid, hidinput))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) goto out_unwind;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) if (!hidinput_has_been_populated(hidinput)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) /* no need to register an input device not populated */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) hidinput_cleanup_hidinput(hid, hidinput);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) if (input_register_device(hidinput->input))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) goto out_unwind;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) hidinput->registered = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) if (list_empty(&hid->inputs)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) hid_err(hid, "No inputs registered, leaving\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) goto out_unwind;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) if (hid->status & HID_STAT_DUP_DETECTED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) hid_dbg(hid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) "Some usages could not be mapped, please use HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE if this is legitimate.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) out_unwind:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) /* unwind the ones we already registered */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) hidinput_disconnect(hid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) EXPORT_SYMBOL_GPL(hidinput_connect);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) void hidinput_disconnect(struct hid_device *hid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) struct hid_input *hidinput, *next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) hidinput_cleanup_battery(hid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) list_for_each_entry_safe(hidinput, next, &hid->inputs, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) list_del(&hidinput->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) if (hidinput->registered)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) input_unregister_device(hidinput->input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) input_free_device(hidinput->input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) kfree(hidinput->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) kfree(hidinput);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) /* led_work is spawned by input_dev callbacks, but doesn't access the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) * parent input_dev at all. Once all input devices are removed, we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) * know that led_work will never get restarted, so we can cancel it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) * synchronously and are safe. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) cancel_work_sync(&hid->led_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) EXPORT_SYMBOL_GPL(hidinput_disconnect);