HID: core: simplify active collection tracking
authorPhilipp Zabel <philipp.zabel@gmail.com>
Mon, 14 Jan 2019 07:19:22 +0000 (08:19 +0100)
committerBenjamin Tissoires <benjamin.tissoires@redhat.com>
Wed, 16 Jan 2019 13:29:48 +0000 (14:29 +0100)
Manually tracking an active collection to set collection parents is not
necessary, we just have to look one step back into the collection stack
to find the correct parent.

Signed-off-by: Philipp Zabel <philipp.zabel@gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
drivers/hid/hid-core.c
include/linux/hid.h

index f9093de..9993b69 100644 (file)
@@ -173,8 +173,8 @@ static int open_collection(struct hid_parser *parser, unsigned type)
        collection->type = type;
        collection->usage = usage;
        collection->level = parser->collection_stack_ptr - 1;
-       collection->parent_idx = parser->active_collection_idx;
-       parser->active_collection_idx = collection_index;
+       collection->parent_idx = (collection->level == 0) ? -1 :
+               parser->collection_stack[collection->level - 1];
 
        if (type == HID_COLLECTION_APPLICATION)
                parser->device->maxapplication++;
@@ -193,13 +193,6 @@ static int close_collection(struct hid_parser *parser)
                return -EINVAL;
        }
        parser->collection_stack_ptr--;
-       if (parser->active_collection_idx != -1) {
-               struct hid_device *device = parser->device;
-               struct hid_collection *c;
-
-               c = &device->collection[parser->active_collection_idx];
-               parser->active_collection_idx = c->parent_idx;
-       }
        return 0;
 }
 
@@ -825,7 +818,6 @@ static int hid_scan_report(struct hid_device *hid)
                return -ENOMEM;
 
        parser->device = hid;
-       parser->active_collection_idx = -1;
        hid->group = HID_GROUP_GENERIC;
 
        /*
@@ -1179,7 +1171,6 @@ int hid_open_report(struct hid_device *device)
        }
 
        parser->device = device;
-       parser->active_collection_idx = -1;
 
        end = start + size;
 
index 992bbb7..f9707d1 100644 (file)
@@ -658,7 +658,6 @@ struct hid_parser {
        unsigned int         *collection_stack;
        unsigned int          collection_stack_ptr;
        unsigned int          collection_stack_size;
-       int                   active_collection_idx; /* device->collection */
        struct hid_device    *device;
        unsigned int          scan_flags;
 };