On Mon, Jan 14, 2019 at 08:19:22AM +0100, Philipp Zabel wrote: > 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@xxxxxxxxx> > --- > Changes since v1: > - Rebased onto commit ee46967fc6e ("HID: core: replace the collection tree > pointers with indices"). yep, much simpler, and it passes the test suite. Thanks! Reviewed-by: Peter Hutterer <peter.hutterer@xxxxxxxxx> Cheers, Peter > --- > drivers/hid/hid-core.c | 13 ++----------- > include/linux/hid.h | 1 - > 2 files changed, 2 insertions(+), 12 deletions(-) > > diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c > index f9093dedf647..9993b692598f 100644 > --- a/drivers/hid/hid-core.c > +++ b/drivers/hid/hid-core.c > @@ -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; > > diff --git a/include/linux/hid.h b/include/linux/hid.h > index 992bbb7196df..f9707d1dcb58 100644 > --- a/include/linux/hid.h > +++ b/include/linux/hid.h > @@ -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; > }; > -- > 2.20.1 >