Merge branch 'for-6.3/hid-bpf' into for-linus
[linux-block.git] / drivers / hid / hid-core.c
index fa4436b8101ecac63d573772b505ea16a778353d..1ee623c26c49d22c22aef92091d580137af0fc3c 100644 (file)
 
 #define DRIVER_DESC "HID core driver"
 
-int hid_debug = 0;
-module_param_named(debug, hid_debug, int, 0600);
-MODULE_PARM_DESC(debug, "toggle HID debugging messages");
-EXPORT_SYMBOL_GPL(hid_debug);
-
 static int hid_ignore_special_drivers = 0;
 module_param_named(ignore_special_drivers, hid_ignore_special_drivers, int, 0600);
 MODULE_PARM_DESC(ignore_special_drivers, "Ignore any special drivers and handle all devices by generic driver");
@@ -804,7 +799,8 @@ static void hid_scan_collection(struct hid_parser *parser, unsigned type)
        int i;
 
        if (((parser->global.usage_page << 16) == HID_UP_SENSOR) &&
-           type == HID_COLLECTION_PHYSICAL)
+           (type == HID_COLLECTION_PHYSICAL ||
+            type == HID_COLLECTION_APPLICATION))
                hid->group = HID_GROUP_SENSOR_HUB;
 
        if (hid->vendor == USB_VENDOR_ID_MICROSOFT &&
@@ -993,8 +989,8 @@ struct hid_report *hid_validate_values(struct hid_device *hid,
                 * Validating on id 0 means we should examine the first
                 * report in the list.
                 */
-               report = list_entry(
-                               hid->report_enum[type].report_list.next,
+               report = list_first_entry_or_null(
+                               &hid->report_enum[type].report_list,
                                struct hid_report, list);
        } else {
                report = hid->report_enum[type].report_id_hash[id];
@@ -1202,6 +1198,7 @@ int hid_open_report(struct hid_device *device)
        __u8 *end;
        __u8 *next;
        int ret;
+       int i;
        static int (*dispatch_type[])(struct hid_parser *parser,
                                      struct hid_item *item) = {
                hid_parser_main,
@@ -1253,6 +1250,8 @@ int hid_open_report(struct hid_device *device)
                goto err;
        }
        device->collection_size = HID_DEFAULT_NUM_COLLECTIONS;
+       for (i = 0; i < HID_DEFAULT_NUM_COLLECTIONS; i++)
+               device->collection[i].parent_idx = -1;
 
        ret = -EINVAL;
        while ((next = fetch_item(start, end, &item)) != NULL) {
@@ -1316,6 +1315,9 @@ static s32 snto32(__u32 value, unsigned n)
        if (!value || !n)
                return 0;
 
+       if (n > 32)
+               n = 32;
+
        switch (n) {
        case 8:  return ((__s8)value);
        case 16: return ((__s16)value);
@@ -2931,10 +2933,6 @@ static int __init hid_init(void)
 {
        int ret;
 
-       if (hid_debug)
-               pr_warn("hid_debug is now used solely for parser and driver debugging.\n"
-                       "debugfs is now used for inspecting the device (report descriptor, reports)\n");
-
        ret = bus_register(&hid_bus_type);
        if (ret) {
                pr_err("can't register hid bus\n");