Skip to content

Commit 787a3b4

Browse files
committed
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid
Pull HID fixes from Jiri Kosina: - descriptor parsing regression fix for devices that have more than 16 collections, from Peter Hutterer (and followup cleanup from Philipp Zabel) - quirk for Goodix touchpad * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid: HID: core: simplify active collection tracking HID: i2c-hid: Disable runtime PM on Goodix touchpad HID: core: replace the collection tree pointers with indices
2 parents 48b1619 + 1950f46 commit 787a3b4

File tree

4 files changed

+18
-13
lines changed

4 files changed

+18
-13
lines changed

drivers/hid/hid-core.c

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ static int open_collection(struct hid_parser *parser, unsigned type)
125125
{
126126
struct hid_collection *collection;
127127
unsigned usage;
128+
int collection_index;
128129

129130
usage = parser->local.usage[0];
130131

@@ -167,13 +168,13 @@ static int open_collection(struct hid_parser *parser, unsigned type)
167168
parser->collection_stack[parser->collection_stack_ptr++] =
168169
parser->device->maxcollection;
169170

170-
collection = parser->device->collection +
171-
parser->device->maxcollection++;
171+
collection_index = parser->device->maxcollection++;
172+
collection = parser->device->collection + collection_index;
172173
collection->type = type;
173174
collection->usage = usage;
174175
collection->level = parser->collection_stack_ptr - 1;
175-
collection->parent = parser->active_collection;
176-
parser->active_collection = collection;
176+
collection->parent_idx = (collection->level == 0) ? -1 :
177+
parser->collection_stack[collection->level - 1];
177178

178179
if (type == HID_COLLECTION_APPLICATION)
179180
parser->device->maxapplication++;
@@ -192,8 +193,6 @@ static int close_collection(struct hid_parser *parser)
192193
return -EINVAL;
193194
}
194195
parser->collection_stack_ptr--;
195-
if (parser->active_collection)
196-
parser->active_collection = parser->active_collection->parent;
197196
return 0;
198197
}
199198

@@ -1006,10 +1005,12 @@ static void hid_apply_multiplier_to_field(struct hid_device *hid,
10061005
usage = &field->usage[i];
10071006

10081007
collection = &hid->collection[usage->collection_index];
1009-
while (collection && collection != multiplier_collection)
1010-
collection = collection->parent;
1008+
while (collection->parent_idx != -1 &&
1009+
collection != multiplier_collection)
1010+
collection = &hid->collection[collection->parent_idx];
10111011

1012-
if (collection || multiplier_collection == NULL)
1012+
if (collection->parent_idx != -1 ||
1013+
multiplier_collection == NULL)
10131014
usage->resolution_multiplier = effective_multiplier;
10141015

10151016
}
@@ -1044,9 +1045,9 @@ static void hid_apply_multiplier(struct hid_device *hid,
10441045
* applicable fields later.
10451046
*/
10461047
multiplier_collection = &hid->collection[multiplier->usage->collection_index];
1047-
while (multiplier_collection &&
1048+
while (multiplier_collection->parent_idx != -1 &&
10481049
multiplier_collection->type != HID_COLLECTION_LOGICAL)
1049-
multiplier_collection = multiplier_collection->parent;
1050+
multiplier_collection = &hid->collection[multiplier_collection->parent_idx];
10501051

10511052
effective_multiplier = hid_calculate_multiplier(hid, multiplier);
10521053

drivers/hid/hid-ids.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,9 @@
461461
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_010A 0x010a
462462
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_E100 0xe100
463463

464+
#define I2C_VENDOR_ID_GOODIX 0x27c6
465+
#define I2C_DEVICE_ID_GOODIX_01F0 0x01f0
466+
464467
#define USB_VENDOR_ID_GOODTOUCH 0x1aad
465468
#define USB_DEVICE_ID_GOODTOUCH_000f 0x000f
466469

drivers/hid/i2c-hid/i2c-hid-core.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,8 @@ static const struct i2c_hid_quirks {
179179
I2C_HID_QUIRK_DELAY_AFTER_SLEEP },
180180
{ USB_VENDOR_ID_LG, I2C_DEVICE_ID_LG_8001,
181181
I2C_HID_QUIRK_NO_RUNTIME_PM },
182+
{ I2C_VENDOR_ID_GOODIX, I2C_DEVICE_ID_GOODIX_01F0,
183+
I2C_HID_QUIRK_NO_RUNTIME_PM },
182184
{ 0, 0 }
183185
};
184186

include/linux/hid.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ struct hid_local {
430430
*/
431431

432432
struct hid_collection {
433-
struct hid_collection *parent;
433+
int parent_idx; /* device->collection */
434434
unsigned type;
435435
unsigned usage;
436436
unsigned level;
@@ -658,7 +658,6 @@ struct hid_parser {
658658
unsigned int *collection_stack;
659659
unsigned int collection_stack_ptr;
660660
unsigned int collection_stack_size;
661-
struct hid_collection *active_collection;
662661
struct hid_device *device;
663662
unsigned int scan_flags;
664663
};

0 commit comments

Comments
 (0)