• Home
  • Raw
  • Download

Lines Matching +full:input +full:- +full:value

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (c) 2000-2001 Vojtech Pavlik
4 * Copyright (c) 2006-2010 Jiri Kosina
6 * HID to Linux Input mapping
12 * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
21 #include <linux/hid-debug.h>
23 #include "hid-ids.h"
49 } hid_hat_to_axis[] = {{ 0, 0}, { 0,-1}, { 1,-1}, { 1, 0}, { 1, 1}, { 0, 1}, {-1, 1}, {-1, 0}, {-1…
64 return (usage->hid & (HID_USAGE_PAGE | HID_USAGE)) == scancode; in match_scancode()
73 return (usage->type == EV_KEY && usage->code == keycode); in match_keycode()
87 unsigned int value, in hidinput_find_key() argument
95 list_for_each_entry(report, &hid->report_enum[k].report_list, list) { in hidinput_find_key()
96 for (i = 0; i < report->maxfield; i++) { in hidinput_find_key()
97 for (j = 0; j < report->field[i]->maxusage; j++) { in hidinput_find_key()
98 usage = report->field[i]->usage + j; in hidinput_find_key()
99 if (usage->type == EV_KEY || usage->type == 0) { in hidinput_find_key()
100 if (match(usage, cur_idx, value)) { in hidinput_find_key()
121 if (ke->flags & INPUT_KEYMAP_BY_INDEX) in hidinput_locate_usage()
122 usage = hidinput_find_key(hid, match_index, ke->index, index); in hidinput_locate_usage()
140 ke->keycode = usage->type == EV_KEY ? in hidinput_getkeycode()
141 usage->code : KEY_RESERVED; in hidinput_getkeycode()
142 ke->index = index; in hidinput_getkeycode()
143 scancode = usage->hid & (HID_USAGE_PAGE | HID_USAGE); in hidinput_getkeycode()
144 ke->len = sizeof(scancode); in hidinput_getkeycode()
145 memcpy(ke->scancode, &scancode, sizeof(scancode)); in hidinput_getkeycode()
149 return -EINVAL; in hidinput_getkeycode()
161 *old_keycode = usage->type == EV_KEY ? in hidinput_setkeycode()
162 usage->code : KEY_RESERVED; in hidinput_setkeycode()
163 usage->code = ke->keycode; in hidinput_setkeycode()
165 clear_bit(*old_keycode, dev->keybit); in hidinput_setkeycode()
166 set_bit(usage->code, dev->keybit); in hidinput_setkeycode()
168 usage->code, usage->hid); in hidinput_setkeycode()
175 set_bit(*old_keycode, dev->keybit); in hidinput_setkeycode()
180 return -EINVAL; in hidinput_setkeycode()
185 * hidinput_calc_abs_res - calculate an absolute axis resolution
190 * (logical_maximum - logical_minimum)
191 * resolution = ----------------------------------------------------------
192 * (physical_maximum - physical_minimum) * 10 ^ unit_exponent
201 __s32 unit_exponent = field->unit_exponent; in hidinput_calc_abs_res()
202 __s32 logical_extents = field->logical_maximum - in hidinput_calc_abs_res()
203 field->logical_minimum; in hidinput_calc_abs_res()
204 __s32 physical_extents = field->physical_maximum - in hidinput_calc_abs_res()
205 field->physical_minimum; in hidinput_calc_abs_res()
226 if (field->unit == 0x11) { /* If centimeters */ in hidinput_calc_abs_res()
229 } else if (field->unit == 0x13) { /* If inches */ in hidinput_calc_abs_res()
235 unit_exponent -= 1; in hidinput_calc_abs_res()
247 if (field->unit == 0x14) { /* If degrees */ in hidinput_calc_abs_res()
254 } else if (field->unit != 0x12) { /* If not radians */ in hidinput_calc_abs_res()
271 for (; unit_exponent > 0; unit_exponent--) { in hidinput_calc_abs_res()
341 quirks = match->driver_data; in find_battery_quirk()
347 int value) in hidinput_scale_battery_capacity() argument
349 if (dev->battery_min < dev->battery_max && in hidinput_scale_battery_capacity()
350 value >= dev->battery_min && value <= dev->battery_max) in hidinput_scale_battery_capacity()
351 value = ((value - dev->battery_min) * 100) / in hidinput_scale_battery_capacity()
352 (dev->battery_max - dev->battery_min); in hidinput_scale_battery_capacity()
354 return value; in hidinput_scale_battery_capacity()
364 return -ENOMEM; in hidinput_query_battery_capacity()
366 ret = hid_hw_raw_request(dev, dev->battery_report_id, buf, 4, in hidinput_query_battery_capacity()
367 dev->battery_report_type, HID_REQ_GET_REPORT); in hidinput_query_battery_capacity()
370 return -ENODATA; in hidinput_query_battery_capacity()
383 int value; in hidinput_get_battery_property() local
389 val->intval = 1; in hidinput_get_battery_property()
393 if (dev->battery_status != HID_BATTERY_REPORTED && in hidinput_get_battery_property()
394 !dev->battery_avoid_query) { in hidinput_get_battery_property()
395 value = hidinput_query_battery_capacity(dev); in hidinput_get_battery_property()
396 if (value < 0) in hidinput_get_battery_property()
397 return value; in hidinput_get_battery_property()
399 value = dev->battery_capacity; in hidinput_get_battery_property()
402 val->intval = value; in hidinput_get_battery_property()
406 val->strval = dev->name; in hidinput_get_battery_property()
410 if (dev->battery_status != HID_BATTERY_REPORTED && in hidinput_get_battery_property()
411 !dev->battery_avoid_query) { in hidinput_get_battery_property()
412 value = hidinput_query_battery_capacity(dev); in hidinput_get_battery_property()
413 if (value < 0) in hidinput_get_battery_property()
414 return value; in hidinput_get_battery_property()
416 dev->battery_capacity = value; in hidinput_get_battery_property()
417 dev->battery_status = HID_BATTERY_QUERIED; in hidinput_get_battery_property()
420 if (dev->battery_status == HID_BATTERY_UNKNOWN) in hidinput_get_battery_property()
421 val->intval = POWER_SUPPLY_STATUS_UNKNOWN; in hidinput_get_battery_property()
423 val->intval = POWER_SUPPLY_STATUS_DISCHARGING; in hidinput_get_battery_property()
427 val->intval = POWER_SUPPLY_SCOPE_DEVICE; in hidinput_get_battery_property()
431 ret = -EINVAL; in hidinput_get_battery_property()
446 if (dev->battery) in hidinput_setup_battery()
452 dev->bus, dev->vendor, dev->product, dev->version, quirks); in hidinput_setup_battery()
459 return -ENOMEM; in hidinput_setup_battery()
461 psy_desc->name = kasprintf(GFP_KERNEL, "hid-%s-battery", in hidinput_setup_battery()
462 strlen(dev->uniq) ? in hidinput_setup_battery()
463 dev->uniq : dev_name(&dev->dev)); in hidinput_setup_battery()
464 if (!psy_desc->name) { in hidinput_setup_battery()
465 error = -ENOMEM; in hidinput_setup_battery()
469 psy_desc->type = POWER_SUPPLY_TYPE_BATTERY; in hidinput_setup_battery()
470 psy_desc->properties = hidinput_battery_props; in hidinput_setup_battery()
471 psy_desc->num_properties = ARRAY_SIZE(hidinput_battery_props); in hidinput_setup_battery()
472 psy_desc->use_for_apm = 0; in hidinput_setup_battery()
473 psy_desc->get_property = hidinput_get_battery_property; in hidinput_setup_battery()
475 min = field->logical_minimum; in hidinput_setup_battery()
476 max = field->logical_maximum; in hidinput_setup_battery()
486 dev->battery_min = min; in hidinput_setup_battery()
487 dev->battery_max = max; in hidinput_setup_battery()
488 dev->battery_report_type = report_type; in hidinput_setup_battery()
489 dev->battery_report_id = field->report->id; in hidinput_setup_battery()
496 dev->battery_avoid_query = report_type == HID_INPUT_REPORT && in hidinput_setup_battery()
497 field->physical == HID_DG_STYLUS; in hidinput_setup_battery()
499 dev->battery = power_supply_register(&dev->dev, psy_desc, &psy_cfg); in hidinput_setup_battery()
500 if (IS_ERR(dev->battery)) { in hidinput_setup_battery()
501 error = PTR_ERR(dev->battery); in hidinput_setup_battery()
506 power_supply_powers(dev->battery, &dev->dev); in hidinput_setup_battery()
510 kfree(psy_desc->name); in hidinput_setup_battery()
513 dev->battery = NULL; in hidinput_setup_battery()
521 if (!dev->battery) in hidinput_cleanup_battery()
524 psy_desc = dev->battery->desc; in hidinput_cleanup_battery()
525 power_supply_unregister(dev->battery); in hidinput_cleanup_battery()
526 kfree(psy_desc->name); in hidinput_cleanup_battery()
528 dev->battery = NULL; in hidinput_cleanup_battery()
531 static void hidinput_update_battery(struct hid_device *dev, int value) in hidinput_update_battery() argument
535 if (!dev->battery) in hidinput_update_battery()
538 if (value == 0 || value < dev->battery_min || value > dev->battery_max) in hidinput_update_battery()
541 capacity = hidinput_scale_battery_capacity(dev, value); in hidinput_update_battery()
543 if (dev->battery_status != HID_BATTERY_REPORTED || in hidinput_update_battery()
544 capacity != dev->battery_capacity) { in hidinput_update_battery()
545 dev->battery_capacity = capacity; in hidinput_update_battery()
546 dev->battery_status = HID_BATTERY_REPORTED; in hidinput_update_battery()
547 power_supply_changed(dev->battery); in hidinput_update_battery()
561 static void hidinput_update_battery(struct hid_device *dev, int value) in hidinput_update_battery() argument
569 struct input_dev *input = hidinput->input; in hidinput_configure_usage() local
570 struct hid_device *device = input_get_drvdata(input); in hidinput_configure_usage()
574 field->hidinput = hidinput; in hidinput_configure_usage()
576 if (field->flags & HID_MAIN_ITEM_CONSTANT) in hidinput_configure_usage()
580 if (field->report_count < 1) in hidinput_configure_usage()
584 if (field->report_type == HID_OUTPUT_REPORT && in hidinput_configure_usage()
585 (usage->hid & HID_USAGE_PAGE) != HID_UP_LED) { in hidinput_configure_usage()
589 if (device->driver->input_mapping) { in hidinput_configure_usage()
590 int ret = device->driver->input_mapping(device, hidinput, field, in hidinput_configure_usage()
598 switch (usage->hid & HID_USAGE_PAGE) { in hidinput_configure_usage()
603 set_bit(EV_REP, input->evbit); in hidinput_configure_usage()
605 if ((usage->hid & HID_USAGE) < 256) { in hidinput_configure_usage()
606 if (!hid_keyboard[usage->hid & HID_USAGE]) goto ignore; in hidinput_configure_usage()
607 map_key_clear(hid_keyboard[usage->hid & HID_USAGE]); in hidinput_configure_usage()
614 code = ((usage->hid - 1) & HID_USAGE); in hidinput_configure_usage()
616 switch (field->application) { in hidinput_configure_usage()
623 code += BTN_TRIGGER_HAPPY - 0x10; in hidinput_configure_usage()
629 code += BTN_TRIGGER_HAPPY - 0x10; in hidinput_configure_usage()
632 switch (field->physical) { in hidinput_configure_usage()
645 switch (usage->hid & 0xffff) { in hidinput_configure_usage()
656 if ((usage->hid & 0xf0) == 0x80) { /* SystemControl */ in hidinput_configure_usage()
657 switch (usage->hid & 0xf) { in hidinput_configure_usage()
678 if ((usage->hid & 0xf0) == 0xb0) { /* SC - Display */ in hidinput_configure_usage()
679 switch (usage->hid & 0xf) { in hidinput_configure_usage()
692 if (field->application == HID_GD_SYSTEM_CONTROL) in hidinput_configure_usage()
695 if ((usage->hid & 0xf0) == 0x90) { /* D-pad */ in hidinput_configure_usage()
696 switch (usage->hid) { in hidinput_configure_usage()
697 case HID_GD_UP: usage->hat_dir = 1; break; in hidinput_configure_usage()
698 case HID_GD_DOWN: usage->hat_dir = 5; break; in hidinput_configure_usage()
699 case HID_GD_RIGHT: usage->hat_dir = 3; break; in hidinput_configure_usage()
700 case HID_GD_LEFT: usage->hat_dir = 7; break; in hidinput_configure_usage()
703 if (field->dpad) { in hidinput_configure_usage()
704 map_abs(field->dpad); in hidinput_configure_usage()
711 switch (usage->hid) { in hidinput_configure_usage()
715 if (field->flags & HID_MAIN_ITEM_RELATIVE) in hidinput_configure_usage()
716 map_rel(usage->hid & 0xf); in hidinput_configure_usage()
718 map_abs_clear(usage->hid & 0xf); in hidinput_configure_usage()
722 if (field->flags & HID_MAIN_ITEM_RELATIVE) { in hidinput_configure_usage()
723 set_bit(REL_WHEEL, input->relbit); in hidinput_configure_usage()
726 map_abs(usage->hid & 0xf); in hidinput_configure_usage()
730 if (field->flags & HID_MAIN_ITEM_RELATIVE) in hidinput_configure_usage()
731 map_rel(usage->hid & 0xf); in hidinput_configure_usage()
733 map_abs(usage->hid & 0xf); in hidinput_configure_usage()
737 usage->hat_min = field->logical_minimum; in hidinput_configure_usage()
738 usage->hat_max = field->logical_maximum; in hidinput_configure_usage()
747 if (field->application == HID_GD_WIRELESS_RADIO_CTLS) { in hidinput_configure_usage()
750 field->flags |= HID_MAIN_ITEM_RELATIVE; in hidinput_configure_usage()
760 switch (usage->hid & 0xffff) { /* HID-Value: */ in hidinput_configure_usage()
766 case 0x27: map_led (LED_SLEEP); break; /* "Stand-By" */ in hidinput_configure_usage()
778 if ((field->application & 0xff) == 0x01) /* Digitizer */ in hidinput_configure_usage()
779 __set_bit(INPUT_PROP_POINTER, input->propbit); in hidinput_configure_usage()
780 else if ((field->application & 0xff) == 0x02) /* Pen */ in hidinput_configure_usage()
781 __set_bit(INPUT_PROP_DIRECT, input->propbit); in hidinput_configure_usage()
783 switch (usage->hid & 0xff) { in hidinput_configure_usage()
788 if (!test_bit(BTN_TOUCH, input->keybit)) { in hidinput_configure_usage()
789 device->quirks |= HID_QUIRK_NOTOUCH; in hidinput_configure_usage()
790 set_bit(EV_KEY, input->evbit); in hidinput_configure_usage()
791 set_bit(BTN_TOUCH, input->keybit); in hidinput_configure_usage()
797 switch (field->physical & 0xff) { in hidinput_configure_usage()
806 usage->type = EV_PWR; in hidinput_configure_usage()
824 device->quirks &= ~HID_QUIRK_NOTOUCH; in hidinput_configure_usage()
847 usage->type = EV_MSC; in hidinput_configure_usage()
848 usage->code = MSC_SERIAL; in hidinput_configure_usage()
849 bit = input->mscbit; in hidinput_configure_usage()
858 switch (usage->hid & HID_USAGE) { in hidinput_configure_usage()
880 case HID_UP_CONSUMER: /* USB HUT v1.12, pages 75-84 */ in hidinput_configure_usage()
881 switch (usage->hid & HID_USAGE) { in hidinput_configure_usage()
897 case 0x047: map_key_clear(KEY_KPPLUS); break; /* Menu Value Increase */ in hidinput_configure_usage()
898 case 0x048: map_key_clear(KEY_KPMINUS); break; /* Menu Value Decrease */ in hidinput_configure_usage()
1040 set_bit(REL_HWHEEL, input->relbit); in hidinput_configure_usage()
1071 switch (usage->hid) { in hidinput_configure_usage()
1074 usage->type = EV_PWR; in hidinput_configure_usage()
1080 set_bit(EV_REP, input->evbit); in hidinput_configure_usage()
1081 switch (usage->hid & HID_USAGE) { in hidinput_configure_usage()
1099 set_bit(EV_REP, input->evbit); in hidinput_configure_usage()
1100 switch (usage->hid & HID_USAGE) { in hidinput_configure_usage()
1112 set_bit(EV_REP, input->evbit); in hidinput_configure_usage()
1123 switch (usage->hid & HID_USAGE) { in hidinput_configure_usage()
1131 if (field->report_size == 1) { in hidinput_configure_usage()
1132 if (field->report->type == HID_OUTPUT_REPORT) { in hidinput_configure_usage()
1139 if (field->flags & HID_MAIN_ITEM_RELATIVE) { in hidinput_configure_usage()
1152 if (device->driver->input_mapped && in hidinput_configure_usage()
1153 device->driver->input_mapped(device, hidinput, field, usage, in hidinput_configure_usage()
1162 set_bit(usage->type, input->evbit); in hidinput_configure_usage()
1166 * - HID aims at being generic so we should do our best to export in hidinput_configure_usage()
1168 * - HID describes what events are, so there is no reason for ABS_X in hidinput_configure_usage()
1170 * - HID is using *_MISC+N as a default value, but nothing prevents in hidinput_configure_usage()
1179 while (usage->code <= max && test_and_set_bit(usage->code, bit)) { in hidinput_configure_usage()
1180 if (device->quirks & HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE) { in hidinput_configure_usage()
1181 usage->code = find_next_zero_bit(bit, in hidinput_configure_usage()
1183 usage->code); in hidinput_configure_usage()
1185 device->status |= HID_STAT_DUP_DETECTED; in hidinput_configure_usage()
1190 if (usage->code > max) in hidinput_configure_usage()
1193 if (usage->type == EV_ABS) { in hidinput_configure_usage()
1195 int a = field->logical_minimum; in hidinput_configure_usage()
1196 int b = field->logical_maximum; in hidinput_configure_usage()
1198 if ((device->quirks & HID_QUIRK_BADPAD) && (usage->code == ABS_X || usage->code == ABS_Y)) { in hidinput_configure_usage()
1199 a = field->logical_minimum = 0; in hidinput_configure_usage()
1200 b = field->logical_maximum = 255; in hidinput_configure_usage()
1203 if (field->application == HID_GD_GAMEPAD || field->application == HID_GD_JOYSTICK) in hidinput_configure_usage()
1204 input_set_abs_params(input, usage->code, a, b, (b - a) >> 8, (b - a) >> 4); in hidinput_configure_usage()
1205 else input_set_abs_params(input, usage->code, a, b, 0, 0); in hidinput_configure_usage()
1207 input_abs_set_res(input, usage->code, in hidinput_configure_usage()
1208 hidinput_calc_abs_res(field, usage->code)); in hidinput_configure_usage()
1210 /* use a larger default input buffer for MT devices */ in hidinput_configure_usage()
1211 if (usage->code == ABS_MT_POSITION_X && input->hint_events_per_packet == 0) in hidinput_configure_usage()
1212 input_set_events_per_packet(input, 60); in hidinput_configure_usage()
1215 if (usage->type == EV_ABS && in hidinput_configure_usage()
1216 (usage->hat_min < usage->hat_max || usage->hat_dir)) { in hidinput_configure_usage()
1218 for (i = usage->code; i < usage->code + 2 && i <= max; i++) { in hidinput_configure_usage()
1219 input_set_abs_params(input, i, -1, 1, 0, 0); in hidinput_configure_usage()
1220 set_bit(i, input->absbit); in hidinput_configure_usage()
1222 if (usage->hat_dir && !field->dpad) in hidinput_configure_usage()
1223 field->dpad = usage->code; in hidinput_configure_usage()
1230 if ((usage->type == EV_ABS) && (field->flags & HID_MAIN_ITEM_RELATIVE) && in hidinput_configure_usage()
1231 (usage->code == ABS_VOLUME)) { in hidinput_configure_usage()
1232 set_bit(KEY_VOLUMEUP, input->keybit); in hidinput_configure_usage()
1233 set_bit(KEY_VOLUMEDOWN, input->keybit); in hidinput_configure_usage()
1236 if (usage->type == EV_KEY) { in hidinput_configure_usage()
1237 set_bit(EV_MSC, input->evbit); in hidinput_configure_usage()
1238 set_bit(MSC_SCAN, input->mscbit); in hidinput_configure_usage()
1244 usage->type = 0; in hidinput_configure_usage()
1245 usage->code = 0; in hidinput_configure_usage()
1249 struct input_dev *input, in hidinput_handle_scroll() argument
1250 __s32 value) in hidinput_handle_scroll() argument
1255 if (value == 0) in hidinput_handle_scroll()
1258 if (usage->code == REL_WHEEL_HI_RES) in hidinput_handle_scroll()
1264 * Windows reports one wheel click as value 120. Where a high-res in hidinput_handle_scroll()
1269 hi_res = value * 120/usage->resolution_multiplier; in hidinput_handle_scroll()
1271 usage->wheel_accumulated += hi_res; in hidinput_handle_scroll()
1272 lo_res = usage->wheel_accumulated/120; in hidinput_handle_scroll()
1274 usage->wheel_accumulated -= lo_res * 120; in hidinput_handle_scroll()
1276 input_event(input, EV_REL, code, lo_res); in hidinput_handle_scroll()
1277 input_event(input, EV_REL, usage->code, hi_res); in hidinput_handle_scroll()
1280 …ut_hid_event(struct hid_device *hid, struct hid_field *field, struct hid_usage *usage, __s32 value) in hidinput_hid_event() argument
1282 struct input_dev *input; in hidinput_hid_event() local
1283 unsigned *quirks = &hid->quirks; in hidinput_hid_event()
1285 if (!usage->type) in hidinput_hid_event()
1288 if (usage->type == EV_PWR) { in hidinput_hid_event()
1289 hidinput_update_battery(hid, value); in hidinput_hid_event()
1293 if (!field->hidinput) in hidinput_hid_event()
1296 input = field->hidinput->input; in hidinput_hid_event()
1298 if (usage->type == EV_ABS && in hidinput_hid_event()
1299 (((*quirks & HID_QUIRK_X_INVERT) && usage->code == ABS_X) || in hidinput_hid_event()
1300 ((*quirks & HID_QUIRK_Y_INVERT) && usage->code == ABS_Y))) { in hidinput_hid_event()
1301 value = field->logical_maximum - value; in hidinput_hid_event()
1304 if (usage->hat_min < usage->hat_max || usage->hat_dir) { in hidinput_hid_event()
1305 int hat_dir = usage->hat_dir; in hidinput_hid_event()
1307 hat_dir = (value - usage->hat_min) * 8 / (usage->hat_max - usage->hat_min + 1) + 1; in hidinput_hid_event()
1309 input_event(input, usage->type, usage->code , hid_hat_to_axis[hat_dir].x); in hidinput_hid_event()
1310 input_event(input, usage->type, usage->code + 1, hid_hat_to_axis[hat_dir].y); in hidinput_hid_event()
1314 if (usage->hid == (HID_UP_DIGITIZER | 0x003c)) { /* Invert */ in hidinput_hid_event()
1315 *quirks = value ? (*quirks | HID_QUIRK_INVERT) : (*quirks & ~HID_QUIRK_INVERT); in hidinput_hid_event()
1319 if (usage->hid == (HID_UP_DIGITIZER | 0x0032)) { /* InRange */ in hidinput_hid_event()
1320 if (value) { in hidinput_hid_event()
1321 input_event(input, usage->type, (*quirks & HID_QUIRK_INVERT) ? BTN_TOOL_RUBBER : usage->code, 1); in hidinput_hid_event()
1324 input_event(input, usage->type, usage->code, 0); in hidinput_hid_event()
1325 input_event(input, usage->type, BTN_TOOL_RUBBER, 0); in hidinput_hid_event()
1329 if (usage->hid == (HID_UP_DIGITIZER | 0x0030) && (*quirks & HID_QUIRK_NOTOUCH)) { /* Pressure */ in hidinput_hid_event()
1330 int a = field->logical_minimum; in hidinput_hid_event()
1331 int b = field->logical_maximum; in hidinput_hid_event()
1332 input_event(input, EV_KEY, BTN_TOUCH, value > a + ((b - a) >> 3)); in hidinput_hid_event()
1335 if (usage->hid == (HID_UP_PID | 0x83UL)) { /* Simultaneous Effects Max */ in hidinput_hid_event()
1336 dbg_hid("Maximum Effects - %d\n",value); in hidinput_hid_event()
1340 if (usage->hid == (HID_UP_PID | 0x7fUL)) { in hidinput_hid_event()
1345 if ((usage->type == EV_KEY) && (usage->code == 0)) /* Key 0 is "unassigned", not KEY_UNKNOWN */ in hidinput_hid_event()
1348 if ((usage->type == EV_REL) && (usage->code == REL_WHEEL_HI_RES || in hidinput_hid_event()
1349 usage->code == REL_HWHEEL_HI_RES)) { in hidinput_hid_event()
1350 hidinput_handle_scroll(usage, input, value); in hidinput_hid_event()
1354 if ((usage->type == EV_ABS) && (field->flags & HID_MAIN_ITEM_RELATIVE) && in hidinput_hid_event()
1355 (usage->code == ABS_VOLUME)) { in hidinput_hid_event()
1356 int count = abs(value); in hidinput_hid_event()
1357 int direction = value > 0 ? KEY_VOLUMEUP : KEY_VOLUMEDOWN; in hidinput_hid_event()
1361 input_event(input, EV_KEY, direction, 1); in hidinput_hid_event()
1362 input_sync(input); in hidinput_hid_event()
1363 input_event(input, EV_KEY, direction, 0); in hidinput_hid_event()
1364 input_sync(input); in hidinput_hid_event()
1370 * Ignore out-of-range values as per HID specification, in hidinput_hid_event()
1372 * When it's not, clamp the value to match Microsoft's input in hidinput_hid_event()
1374 * https://msdn.microsoft.com/en-us/library/windows/hardware/dn672278(v=vs.85).asp in hidinput_hid_event()
1380 if ((field->flags & HID_MAIN_ITEM_VARIABLE) && in hidinput_hid_event()
1381 (field->logical_minimum < field->logical_maximum)) { in hidinput_hid_event()
1382 if (field->flags & HID_MAIN_ITEM_NULL_STATE && in hidinput_hid_event()
1383 (value < field->logical_minimum || in hidinput_hid_event()
1384 value > field->logical_maximum)) { in hidinput_hid_event()
1385 dbg_hid("Ignoring out-of-range value %x\n", value); in hidinput_hid_event()
1388 value = clamp(value, in hidinput_hid_event()
1389 field->logical_minimum, in hidinput_hid_event()
1390 field->logical_maximum); in hidinput_hid_event()
1400 * the input layer. If we filter the 'dead' keys on the HID level, we in hidinput_hid_event()
1403 if (!(field->flags & (HID_MAIN_ITEM_RELATIVE | in hidinput_hid_event()
1405 (field->flags & HID_MAIN_ITEM_VARIABLE) && in hidinput_hid_event()
1406 usage->usage_index < field->maxusage && in hidinput_hid_event()
1407 value == field->value[usage->usage_index]) in hidinput_hid_event()
1411 if (usage->type == EV_KEY && in hidinput_hid_event()
1412 (!test_bit(usage->code, input->key)) == value) in hidinput_hid_event()
1413 input_event(input, EV_MSC, MSC_SCAN, usage->hid); in hidinput_hid_event()
1415 input_event(input, usage->type, usage->code, value); in hidinput_hid_event()
1417 if ((field->flags & HID_MAIN_ITEM_RELATIVE) && in hidinput_hid_event()
1418 usage->type == EV_KEY && value) { in hidinput_hid_event()
1419 input_sync(input); in hidinput_hid_event()
1420 input_event(input, usage->type, usage->code, 0); in hidinput_hid_event()
1428 if (hid->quirks & HID_QUIRK_NO_INPUT_SYNC) in hidinput_report_event()
1431 list_for_each_entry(hidinput, &hid->inputs, list) in hidinput_report_event()
1432 input_sync(hidinput->input); in hidinput_report_event()
1441 list_for_each_entry(report, &hid->report_enum[HID_OUTPUT_REPORT].report_list, list) { in hidinput_find_field()
1442 for (i = 0; i < report->maxfield; i++) { in hidinput_find_field()
1443 *field = report->field[i]; in hidinput_find_field()
1444 for (j = 0; j < (*field)->maxusage; j++) in hidinput_find_field()
1445 if ((*field)->usage[j].type == type && (*field)->usage[j].code == code) in hidinput_find_field()
1449 return -1; in hidinput_find_field()
1460 &hid->report_enum[HID_OUTPUT_REPORT].report_list, in hidinput_get_led_field()
1462 for (i = 0; i < report->maxfield; i++) { in hidinput_get_led_field()
1463 field = report->field[i]; in hidinput_get_led_field()
1464 for (j = 0; j < field->maxusage; j++) in hidinput_get_led_field()
1465 if (field->usage[j].type == EV_LED) in hidinput_get_led_field()
1481 &hid->report_enum[HID_OUTPUT_REPORT].report_list, in hidinput_count_leds()
1483 for (i = 0; i < report->maxfield; i++) { in hidinput_count_leds()
1484 field = report->field[i]; in hidinput_count_leds()
1485 for (j = 0; j < field->maxusage; j++) in hidinput_count_leds()
1486 if (field->usage[j].type == EV_LED && in hidinput_count_leds()
1487 field->value[j]) in hidinput_count_leds()
1510 * field->report is accessed unlocked regarding HID core. So there might in hidinput_led_worker()
1511 * be another incoming SET-LED request from user-space, which changes in hidinput_led_worker()
1514 * boolean value no matter what information is currently set on the LED in hidinput_led_worker()
1517 * And in case we send a wrong value, a next led worker is spawned in hidinput_led_worker()
1518 * for every SET-LED request so the following worker will send the in hidinput_led_worker()
1519 * correct value, guaranteed! in hidinput_led_worker()
1522 report = field->report; in hidinput_led_worker()
1525 if (hid->ll_driver->request) in hidinput_led_worker()
1526 return hid->ll_driver->request(hid, report, HID_REQ_SET_REPORT); in hidinput_led_worker()
1528 /* fall back to generic raw-output-report */ in hidinput_led_worker()
1537 if (ret == -ENOSYS) in hidinput_led_worker()
1538 hid_hw_raw_request(hid, report->id, buf, len, HID_OUTPUT_REPORT, in hidinput_led_worker()
1544 unsigned int code, int value) in hidinput_input_event() argument
1551 return input_ff_event(dev, type, code, value); in hidinput_input_event()
1554 return -1; in hidinput_input_event()
1556 if ((offset = hidinput_find_field(hid, type, code, &field)) == -1) { in hidinput_input_event()
1558 return -1; in hidinput_input_event()
1561 hid_set_field(field, offset, value); in hidinput_input_event()
1563 schedule_work(&hid->led_work); in hidinput_input_event()
1589 if (report->maxfield == 0) in __hidinput_change_resolution_multipliers()
1592 for (i = 0; i < report->maxfield; i++) { in __hidinput_change_resolution_multipliers()
1593 __s32 value = use_logical_max ? in __hidinput_change_resolution_multipliers() local
1594 report->field[i]->logical_maximum : in __hidinput_change_resolution_multipliers()
1595 report->field[i]->logical_minimum; in __hidinput_change_resolution_multipliers()
1601 if (report->field[i]->report_count != 1) in __hidinput_change_resolution_multipliers()
1604 for (j = 0; j < report->field[i]->maxusage; j++) { in __hidinput_change_resolution_multipliers()
1605 usage = &report->field[i]->usage[j]; in __hidinput_change_resolution_multipliers()
1607 if (usage->hid != HID_GD_RESOLUTION_MULTIPLIER) in __hidinput_change_resolution_multipliers()
1620 if (!get_report_completed && report->maxfield > 1) { in __hidinput_change_resolution_multipliers()
1621 if (hid->quirks & HID_QUIRK_NO_INIT_REPORTS) in __hidinput_change_resolution_multipliers()
1629 report->field[i]->value[j] = value; in __hidinput_change_resolution_multipliers()
1643 rep_enum = &hid->report_enum[HID_FEATURE_REPORT]; in hidinput_change_resolution_multipliers()
1644 list_for_each_entry(rep, &rep_enum->report_list, list) { in hidinput_change_resolution_multipliers()
1664 struct hid_driver *drv = hid->driver; in report_features()
1670 rep_enum = &hid->report_enum[HID_FEATURE_REPORT]; in report_features()
1671 list_for_each_entry(rep, &rep_enum->report_list, list) in report_features()
1672 for (i = 0; i < rep->maxfield; i++) { in report_features()
1674 if (rep->field[i]->report_count < 1) in report_features()
1677 for (j = 0; j < rep->field[i]->maxusage; j++) { in report_features()
1678 usage = &rep->field[i]->usage[j]; in report_features()
1681 if (usage->hid == HID_DC_BATTERYSTRENGTH) in report_features()
1683 rep->field[i]); in report_features()
1685 if (drv->feature_mapping) in report_features()
1686 drv->feature_mapping(hid, rep->field[i], usage); in report_features()
1702 if ((hid->quirks & HID_QUIRK_INPUT_PER_APP) && in hidinput_allocate()
1703 hid->maxapplication > 1) { in hidinput_allocate()
1741 name_len = strlen(hid->name); in hidinput_allocate()
1744 strcmp(hid->name + name_len - suffix_len, suffix)) { in hidinput_allocate()
1745 hidinput->name = kasprintf(GFP_KERNEL, "%s %s", in hidinput_allocate()
1746 hid->name, suffix); in hidinput_allocate()
1747 if (!hidinput->name) in hidinput_allocate()
1753 input_dev->event = hidinput_input_event; in hidinput_allocate()
1754 input_dev->open = hidinput_open; in hidinput_allocate()
1755 input_dev->close = hidinput_close; in hidinput_allocate()
1756 input_dev->setkeycode = hidinput_setkeycode; in hidinput_allocate()
1757 input_dev->getkeycode = hidinput_getkeycode; in hidinput_allocate()
1759 input_dev->name = hidinput->name ? hidinput->name : hid->name; in hidinput_allocate()
1760 input_dev->phys = hid->phys; in hidinput_allocate()
1761 input_dev->uniq = hid->uniq; in hidinput_allocate()
1762 input_dev->id.bustype = hid->bus; in hidinput_allocate()
1763 input_dev->id.vendor = hid->vendor; in hidinput_allocate()
1764 input_dev->id.product = hid->product; in hidinput_allocate()
1765 input_dev->id.version = hid->version; in hidinput_allocate()
1766 input_dev->dev.parent = &hid->dev; in hidinput_allocate()
1768 hidinput->input = input_dev; in hidinput_allocate()
1769 hidinput->application = application; in hidinput_allocate()
1770 list_add_tail(&hidinput->list, &hid->inputs); in hidinput_allocate()
1772 INIT_LIST_HEAD(&hidinput->reports); in hidinput_allocate()
1779 hid_err(hid, "Out of memory during hid input probe\n"); in hidinput_allocate()
1789 r |= hidinput->input->evbit[i]; in hidinput_has_been_populated()
1792 r |= hidinput->input->keybit[i]; in hidinput_has_been_populated()
1795 r |= hidinput->input->relbit[i]; in hidinput_has_been_populated()
1798 r |= hidinput->input->absbit[i]; in hidinput_has_been_populated()
1801 r |= hidinput->input->mscbit[i]; in hidinput_has_been_populated()
1804 r |= hidinput->input->ledbit[i]; in hidinput_has_been_populated()
1807 r |= hidinput->input->sndbit[i]; in hidinput_has_been_populated()
1810 r |= hidinput->input->ffbit[i]; in hidinput_has_been_populated()
1813 r |= hidinput->input->swbit[i]; in hidinput_has_been_populated()
1824 list_del(&hidinput->list); in hidinput_cleanup_hidinput()
1825 input_free_device(hidinput->input); in hidinput_cleanup_hidinput()
1826 kfree(hidinput->name); in hidinput_cleanup_hidinput()
1830 hid->quirks & HID_QUIRK_SKIP_OUTPUT_REPORTS) in hidinput_cleanup_hidinput()
1833 list_for_each_entry(report, &hid->report_enum[k].report_list, in hidinput_cleanup_hidinput()
1836 for (i = 0; i < report->maxfield; i++) in hidinput_cleanup_hidinput()
1837 if (report->field[i]->hidinput == hidinput) in hidinput_cleanup_hidinput()
1838 report->field[i]->hidinput = NULL; in hidinput_cleanup_hidinput()
1847 struct hid_device *hid = report->device; in hidinput_match()
1850 list_for_each_entry(hidinput, &hid->inputs, list) { in hidinput_match()
1851 if (hidinput->report && in hidinput_match()
1852 hidinput->report->id == report->id) in hidinput_match()
1861 struct hid_device *hid = report->device; in hidinput_match_application()
1864 list_for_each_entry(hidinput, &hid->inputs, list) { in hidinput_match_application()
1865 if (hidinput->application == report->application) in hidinput_match_application()
1877 for (i = 0; i < report->maxfield; i++) in hidinput_configure_usages()
1878 for (j = 0; j < report->field[i]->maxusage; j++) in hidinput_configure_usages()
1879 hidinput_configure_usage(hidinput, report->field[i], in hidinput_configure_usages()
1880 report->field[i]->usage + j); in hidinput_configure_usages()
1884 * Register the input device; print a message.
1885 * Configure the input layer interface
1891 struct hid_driver *drv = hid->driver; in hidinput_connect()
1897 INIT_LIST_HEAD(&hid->inputs); in hidinput_connect()
1898 INIT_WORK(&hid->led_work, hidinput_led_worker); in hidinput_connect()
1900 hid->status &= ~HID_STAT_DUP_DETECTED; in hidinput_connect()
1903 for (i = 0; i < hid->maxcollection; i++) { in hidinput_connect()
1904 struct hid_collection *col = &hid->collection[i]; in hidinput_connect()
1905 if (col->type == HID_COLLECTION_APPLICATION || in hidinput_connect()
1906 col->type == HID_COLLECTION_PHYSICAL) in hidinput_connect()
1907 if (IS_INPUT_APPLICATION(col->usage)) in hidinput_connect()
1911 if (i == hid->maxcollection) in hidinput_connect()
1912 return -1; in hidinput_connect()
1919 hid->quirks & HID_QUIRK_SKIP_OUTPUT_REPORTS) in hidinput_connect()
1922 list_for_each_entry(report, &hid->report_enum[k].report_list, list) { in hidinput_connect()
1924 if (!report->maxfield) in hidinput_connect()
1927 application = report->application; in hidinput_connect()
1933 if (hid->quirks & HID_QUIRK_MULTI_INPUT) in hidinput_connect()
1935 else if (hid->maxapplication > 1 && in hidinput_connect()
1936 (hid->quirks & HID_QUIRK_INPUT_PER_APP)) in hidinput_connect()
1947 if (hid->quirks & HID_QUIRK_MULTI_INPUT) in hidinput_connect()
1948 hidinput->report = report; in hidinput_connect()
1950 list_add_tail(&report->hidinput_list, in hidinput_connect()
1951 &hidinput->reports); in hidinput_connect()
1957 list_for_each_entry_safe(hidinput, next, &hid->inputs, list) { in hidinput_connect()
1958 if (drv->input_configured && in hidinput_connect()
1959 drv->input_configured(hid, hidinput)) in hidinput_connect()
1963 /* no need to register an input device not populated */ in hidinput_connect()
1968 if (input_register_device(hidinput->input)) in hidinput_connect()
1970 hidinput->registered = true; in hidinput_connect()
1973 if (list_empty(&hid->inputs)) { in hidinput_connect()
1978 if (hid->status & HID_STAT_DUP_DETECTED) in hidinput_connect()
1988 return -1; in hidinput_connect()
1998 list_for_each_entry_safe(hidinput, next, &hid->inputs, list) { in hidinput_disconnect()
1999 list_del(&hidinput->list); in hidinput_disconnect()
2000 if (hidinput->registered) in hidinput_disconnect()
2001 input_unregister_device(hidinput->input); in hidinput_disconnect()
2003 input_free_device(hidinput->input); in hidinput_disconnect()
2004 kfree(hidinput->name); in hidinput_disconnect()
2009 * parent input_dev at all. Once all input devices are removed, we in hidinput_disconnect()
2012 cancel_work_sync(&hid->led_work); in hidinput_disconnect()