Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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);