Lines Matching full:hid

3  *  HID support for Linux
31 #include <linux/hid.h>
33 #include <linux/hid-debug.h>
36 #include "hid-ids.h"
42 #define DRIVER_DESC "HID core driver"
46 MODULE_PARM_DESC(debug, "toggle HID debugging messages");
319 field->usage[i].hid = parser->local.usage[j]; in hid_add_field()
424 * nibble due to the common misunderstanding of HID in hid_parser_global()
708 struct hid_device *hid = to_hid_device(dev); in hid_device_release() local
710 hid_close_report(hid); in hid_device_release()
711 kfree(hid->dev_rdesc); in hid_device_release()
712 kfree(hid); in hid_device_release()
784 struct hid_device *hid = parser->device; in hid_scan_input_usage() local
787 hid->group = HID_GROUP_MULTITOUCH; in hid_scan_input_usage()
803 struct hid_device *hid = parser->device; in hid_scan_collection() local
808 hid->group = HID_GROUP_SENSOR_HUB; in hid_scan_collection()
810 if (hid->vendor == USB_VENDOR_ID_MICROSOFT && in hid_scan_collection()
811 hid->product == USB_DEVICE_ID_MS_POWER_COVER && in hid_scan_collection()
812 hid->group == HID_GROUP_MULTITOUCH) in hid_scan_collection()
813 hid->group = HID_GROUP_GENERIC; in hid_scan_collection()
847 /* ignore constant inputs, they will be ignored by hid-input */ in hid_scan_main()
872 static int hid_scan_report(struct hid_device *hid) in hid_scan_report() argument
876 __u8 *start = hid->dev_rdesc; in hid_scan_report()
877 __u8 *end = start + hid->dev_rsize; in hid_scan_report()
890 parser->device = hid; in hid_scan_report()
891 hid->group = HID_GROUP_GENERIC; in hid_scan_report()
895 * be robust against hid errors. Those errors will be raised by in hid_scan_report()
905 (hid->group == HID_GROUP_MULTITOUCH)) in hid_scan_report()
906 hid->group = HID_GROUP_MULTITOUCH_WIN_8; in hid_scan_report()
911 switch (hid->vendor) { in hid_scan_report()
913 hid->group = HID_GROUP_WACOM; in hid_scan_report()
916 if (hid->group == HID_GROUP_GENERIC) in hid_scan_report()
920 * hid-rmi should take care of them, in hid_scan_report()
921 * not hid-generic in hid_scan_report()
923 hid->group = HID_GROUP_RMI; in hid_scan_report()
935 * @hid: hid device
942 int hid_parse_report(struct hid_device *hid, __u8 *start, unsigned size) in hid_parse_report() argument
944 hid->dev_rdesc = kmemdup(start, size, GFP_KERNEL); in hid_parse_report()
945 if (!hid->dev_rdesc) in hid_parse_report()
947 hid->dev_rsize = size; in hid_parse_report()
960 * @hid: hid device
969 struct hid_report *hid_validate_values(struct hid_device *hid, in hid_validate_values() argument
977 hid_err(hid, "invalid HID report type %u\n", type); in hid_validate_values()
982 hid_err(hid, "invalid HID report id %u\n", id); in hid_validate_values()
997 hid->report_enum[type].report_list.next, in hid_validate_values()
1000 report = hid->report_enum[type].report_id_hash[id]; in hid_validate_values()
1003 hid_err(hid, "missing %s %u\n", hid_report_names[type], id); in hid_validate_values()
1007 hid_err(hid, "not enough fields in %s %u\n", in hid_validate_values()
1012 hid_err(hid, "not enough values in %s %u field %u\n", in hid_validate_values()
1020 static int hid_calculate_multiplier(struct hid_device *hid, in hid_calculate_multiplier() argument
1035 * HID Usage Table, v1.12, Section 4.3.1, p31 in hid_calculate_multiplier()
1045 hid_warn(hid, in hid_calculate_multiplier()
1052 hid_warn(hid, "unsupported Resolution Multiplier %d\n", m); in hid_calculate_multiplier()
1059 static void hid_apply_multiplier_to_field(struct hid_device *hid, in hid_apply_multiplier_to_field() argument
1077 collection = &hid->collection[usage->collection_index]; in hid_apply_multiplier_to_field()
1080 collection = &hid->collection[collection->parent_idx]; in hid_apply_multiplier_to_field()
1089 static void hid_apply_multiplier(struct hid_device *hid, in hid_apply_multiplier() argument
1108 * HID Usage Table, v1.12, Section 4.3.1, p30 in hid_apply_multiplier()
1117 multiplier_collection = &hid->collection[multiplier->usage->collection_index]; in hid_apply_multiplier()
1120 multiplier_collection = &hid->collection[multiplier_collection->parent_idx]; in hid_apply_multiplier()
1122 effective_multiplier = hid_calculate_multiplier(hid, multiplier); in hid_apply_multiplier()
1124 rep_enum = &hid->report_enum[HID_INPUT_REPORT]; in hid_apply_multiplier()
1128 hid_apply_multiplier_to_field(hid, field, in hid_apply_multiplier()
1138 * @device: hid device
1158 void hid_setup_resolution_multiplier(struct hid_device *hid) in hid_setup_resolution_multiplier() argument
1165 rep_enum = &hid->report_enum[HID_FEATURE_REPORT]; in hid_setup_resolution_multiplier()
1174 if (usage->hid == HID_GD_RESOLUTION_MULTIPLIER) in hid_setup_resolution_multiplier()
1175 hid_apply_multiplier(hid, in hid_setup_resolution_multiplier()
1186 * @device: hid device
1350 * Code sort-of follows HID spec:
1353 * While the USB HID spec allows unlimited length bit fields in "report
1356 * Search linux-kernel and linux-usb-devel archives for "hid-core extract".
1380 u32 hid_field_extract(const struct hid_device *hid, u8 *report, in hid_field_extract() argument
1384 hid_warn_once(hid, "%s() called with n (%d) > 32! (%s)\n", in hid_field_extract()
1426 static void implement(const struct hid_device *hid, u8 *report, in implement() argument
1430 hid_warn(hid, "%s() called with n (%d) > 32! (%s)\n", in implement()
1437 hid_warn(hid, in implement()
1464 * @hid: hid device
1465 * @report: hid report to match against
1467 * compare hid->driver->report_table->report_type to report->type
1469 static int hid_match_report(struct hid_device *hid, struct hid_report *report) in hid_match_report() argument
1471 const struct hid_report_id *id = hid->driver->report_table; in hid_match_report()
1486 * @hid: hid device
1489 * compare hid->driver->usage_table->usage_{type,code} to
1492 static int hid_match_usage(struct hid_device *hid, struct hid_usage *usage) in hid_match_usage() argument
1494 const struct hid_usage_id *id = hid->driver->usage_table; in hid_match_usage()
1501 id->usage_hid == usage->hid) && in hid_match_usage()
1510 static void hid_process_event(struct hid_device *hid, struct hid_field *field, in hid_process_event() argument
1513 struct hid_driver *hdrv = hid->driver; in hid_process_event()
1516 if (!list_empty(&hid->debug_list)) in hid_process_event()
1517 hid_dump_input(hid, usage, value); in hid_process_event()
1519 if (hdrv && hdrv->event && hid_match_usage(hid, usage)) { in hid_process_event()
1520 ret = hdrv->event(hid, field, usage, value); in hid_process_event()
1523 hid_err(hid, "%s's event failed with %d\n", in hid_process_event()
1529 if (hid->claimed & HID_CLAIMED_INPUT) in hid_process_event()
1530 hidinput_hid_event(hid, field, usage, value); in hid_process_event()
1531 if (hid->claimed & HID_CLAIMED_HIDDEV && interrupt && hid->hiddev_hid_event) in hid_process_event()
1532 hid->hiddev_hid_event(hid, field, usage, value); in hid_process_event()
1557 static void hid_input_fetch_field(struct hid_device *hid, in hid_input_fetch_field() argument
1575 snto32(hid_field_extract(hid, data, offset + n * size, in hid_input_fetch_field()
1577 hid_field_extract(hid, data, offset + n * size, size); in hid_input_fetch_field()
1582 field->usage[value[n] - min].hid == HID_UP_KEYBOARD + 1) { in hid_input_fetch_field()
1593 static void hid_input_var_field(struct hid_device *hid, in hid_input_var_field() argument
1602 hid_process_event(hid, in hid_input_var_field()
1616 static void hid_input_array_field(struct hid_device *hid, in hid_input_array_field() argument
1634 hid_process_event(hid, in hid_input_array_field()
1642 hid_process_event(hid, in hid_input_array_field()
1657 static void hid_process_report(struct hid_device *hid, in hid_process_report() argument
1668 hid_input_fetch_field(hid, report->field[a], data); in hid_process_report()
1678 hid_process_event(hid, in hid_process_report()
1684 hid_input_array_field(hid, field, interrupt); in hid_process_report()
1701 hid_input_var_field(hid, field, interrupt); in hid_process_report()
1703 hid_input_array_field(hid, field, interrupt); in hid_process_report()
1715 static void __hid_insert_field_entry(struct hid_device *hid, in __hid_insert_field_entry() argument
1745 static void hid_report_process_ordering(struct hid_device *hid, in hid_report_process_ordering() argument
1783 __hid_insert_field_entry(hid, report, in hid_report_process_ordering()
1789 __hid_insert_field_entry(hid, report, &entries[usages], in hid_report_process_ordering()
1796 static void hid_process_ordering(struct hid_device *hid) in hid_process_ordering() argument
1799 struct hid_report_enum *report_enum = &hid->report_enum[HID_INPUT_REPORT]; in hid_process_ordering()
1802 hid_report_process_ordering(hid, report); in hid_process_ordering()
1809 static void hid_output_field(const struct hid_device *hid, in hid_output_field() argument
1819 implement(hid, data, offset + n * size, size, in hid_output_field()
1822 implement(hid, data, offset + n * size, size, in hid_output_field()
1924 * DO NOT USE in hid drivers directly, but through hid_hw_request instead.
1926 int __hid_request(struct hid_device *hid, struct hid_report *report, in __hid_request() argument
1942 ret = hid->ll_driver->raw_request(hid, report->id, buf, len, in __hid_request()
1950 hid_input_report(hid, report->type, buf, ret, 0); in __hid_request()
1960 int hid_report_raw_event(struct hid_device *hid, enum hid_report_type type, u8 *data, u32 size, in hid_report_raw_event() argument
1963 struct hid_report_enum *report_enum = hid->report_enum + type; in hid_report_raw_event()
1992 if ((hid->claimed & HID_CLAIMED_HIDDEV) && hid->hiddev_report_event) in hid_report_raw_event()
1993 hid->hiddev_report_event(hid, report); in hid_report_raw_event()
1994 if (hid->claimed & HID_CLAIMED_HIDRAW) { in hid_report_raw_event()
1995 ret = hidraw_report_event(hid, data, size); in hid_report_raw_event()
2000 if (hid->claimed != HID_CLAIMED_HIDRAW && report->maxfield) { in hid_report_raw_event()
2001 hid_process_report(hid, report, cdata, interrupt); in hid_report_raw_event()
2002 hdrv = hid->driver; in hid_report_raw_event()
2004 hdrv->report(hid, report); in hid_report_raw_event()
2007 if (hid->claimed & HID_CLAIMED_INPUT) in hid_report_raw_event()
2008 hidinput_report_event(hid, report); in hid_report_raw_event()
2017 * @hid: hid device
2018 * @type: HID report type (HID_*_REPORT)
2025 int hid_input_report(struct hid_device *hid, enum hid_report_type type, u8 *data, u32 size, in hid_input_report() argument
2033 if (!hid) in hid_input_report()
2036 if (down_trylock(&hid->driver_input_lock)) in hid_input_report()
2039 if (!hid->driver) { in hid_input_report()
2043 report_enum = hid->report_enum + type; in hid_input_report()
2044 hdrv = hid->driver; in hid_input_report()
2053 if (!list_empty(&hid->debug_list)) in hid_input_report()
2054 hid_dump_report(hid, type, data, size); in hid_input_report()
2063 if (hdrv && hdrv->raw_event && hid_match_report(hid, report)) { in hid_input_report()
2064 ret = hdrv->raw_event(hid, report, data, size); in hid_input_report()
2069 ret = hid_report_raw_event(hid, type, data, size, interrupt); in hid_input_report()
2072 up(&hid->driver_input_lock); in hid_input_report()
2243 hid_info(hdev, "%s: %s HID v%x.%02x %s [%s] on %s\n", in hid_connect()
2266 * @hdev: hid device
2295 * @hdev: hid device
2309 * @hdev: hid device
2337 * @hdev: hid device
2355 * @hdev: hid device
2357 * @reqtype: hid request type
2372 * @hdev: hid device
2376 * @rtype: HID report type
2398 * @hdev: hid device
2451 * new_id_store - add a new HID device ID to this driver and re-probe devices
2456 * Adds a new dynamic hid device ID to this driver,
2539 * @hdev_a: hid device
2540 * @hdev_b: hid device
2589 * hid-generic implements .match(), so if in hid_device_probe()
2648 return scnprintf(buf, PAGE_SIZE, "hid:b%04Xg%04Xv%08Xp%08X\n", in modalias_show()
2684 if (add_uevent_var(env, "MODALIAS=hid:b%04Xg%04Xv%08Xp%08X", in hid_uevent()
2692 .name = "hid",
2766 * hid_allocate_device - allocate new hid device descriptor
2768 * Allocate and initialize hid device, so that hid_destroy_device might be
2815 * @hdev: hid device
2890 int hid_check_keys_pressed(struct hid_device *hid) in hid_check_keys_pressed() argument
2895 if (!(hid->claimed & HID_CLAIMED_INPUT)) in hid_check_keys_pressed()
2898 list_for_each_entry(hidinput, &hid->inputs, list) { in hid_check_keys_pressed()
2918 pr_err("can't register hid bus\n"); in hid_init()