Commit 787a3b43 authored by Linus Torvalds's avatar Linus Torvalds

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
parents 48b16198 1950f462
...@@ -125,6 +125,7 @@ static int open_collection(struct hid_parser *parser, unsigned type) ...@@ -125,6 +125,7 @@ static int open_collection(struct hid_parser *parser, unsigned type)
{ {
struct hid_collection *collection; struct hid_collection *collection;
unsigned usage; unsigned usage;
int collection_index;
usage = parser->local.usage[0]; usage = parser->local.usage[0];
...@@ -167,13 +168,13 @@ static int open_collection(struct hid_parser *parser, unsigned type) ...@@ -167,13 +168,13 @@ static int open_collection(struct hid_parser *parser, unsigned type)
parser->collection_stack[parser->collection_stack_ptr++] = parser->collection_stack[parser->collection_stack_ptr++] =
parser->device->maxcollection; parser->device->maxcollection;
collection = parser->device->collection + collection_index = parser->device->maxcollection++;
parser->device->maxcollection++; collection = parser->device->collection + collection_index;
collection->type = type; collection->type = type;
collection->usage = usage; collection->usage = usage;
collection->level = parser->collection_stack_ptr - 1; collection->level = parser->collection_stack_ptr - 1;
collection->parent = parser->active_collection; collection->parent_idx = (collection->level == 0) ? -1 :
parser->active_collection = collection; parser->collection_stack[collection->level - 1];
if (type == HID_COLLECTION_APPLICATION) if (type == HID_COLLECTION_APPLICATION)
parser->device->maxapplication++; parser->device->maxapplication++;
...@@ -192,8 +193,6 @@ static int close_collection(struct hid_parser *parser) ...@@ -192,8 +193,6 @@ static int close_collection(struct hid_parser *parser)
return -EINVAL; return -EINVAL;
} }
parser->collection_stack_ptr--; parser->collection_stack_ptr--;
if (parser->active_collection)
parser->active_collection = parser->active_collection->parent;
return 0; return 0;
} }
...@@ -1006,10 +1005,12 @@ static void hid_apply_multiplier_to_field(struct hid_device *hid, ...@@ -1006,10 +1005,12 @@ static void hid_apply_multiplier_to_field(struct hid_device *hid,
usage = &field->usage[i]; usage = &field->usage[i];
collection = &hid->collection[usage->collection_index]; collection = &hid->collection[usage->collection_index];
while (collection && collection != multiplier_collection) while (collection->parent_idx != -1 &&
collection = collection->parent; collection != multiplier_collection)
collection = &hid->collection[collection->parent_idx];
if (collection || multiplier_collection == NULL) if (collection->parent_idx != -1 ||
multiplier_collection == NULL)
usage->resolution_multiplier = effective_multiplier; usage->resolution_multiplier = effective_multiplier;
} }
...@@ -1044,9 +1045,9 @@ static void hid_apply_multiplier(struct hid_device *hid, ...@@ -1044,9 +1045,9 @@ static void hid_apply_multiplier(struct hid_device *hid,
* applicable fields later. * applicable fields later.
*/ */
multiplier_collection = &hid->collection[multiplier->usage->collection_index]; multiplier_collection = &hid->collection[multiplier->usage->collection_index];
while (multiplier_collection && while (multiplier_collection->parent_idx != -1 &&
multiplier_collection->type != HID_COLLECTION_LOGICAL) multiplier_collection->type != HID_COLLECTION_LOGICAL)
multiplier_collection = multiplier_collection->parent; multiplier_collection = &hid->collection[multiplier_collection->parent_idx];
effective_multiplier = hid_calculate_multiplier(hid, multiplier); effective_multiplier = hid_calculate_multiplier(hid, multiplier);
......
...@@ -461,6 +461,9 @@ ...@@ -461,6 +461,9 @@
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_010A 0x010a #define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_010A 0x010a
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_E100 0xe100 #define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_E100 0xe100
#define I2C_VENDOR_ID_GOODIX 0x27c6
#define I2C_DEVICE_ID_GOODIX_01F0 0x01f0
#define USB_VENDOR_ID_GOODTOUCH 0x1aad #define USB_VENDOR_ID_GOODTOUCH 0x1aad
#define USB_DEVICE_ID_GOODTOUCH_000f 0x000f #define USB_DEVICE_ID_GOODTOUCH_000f 0x000f
......
...@@ -179,6 +179,8 @@ static const struct i2c_hid_quirks { ...@@ -179,6 +179,8 @@ static const struct i2c_hid_quirks {
I2C_HID_QUIRK_DELAY_AFTER_SLEEP }, I2C_HID_QUIRK_DELAY_AFTER_SLEEP },
{ USB_VENDOR_ID_LG, I2C_DEVICE_ID_LG_8001, { USB_VENDOR_ID_LG, I2C_DEVICE_ID_LG_8001,
I2C_HID_QUIRK_NO_RUNTIME_PM }, I2C_HID_QUIRK_NO_RUNTIME_PM },
{ I2C_VENDOR_ID_GOODIX, I2C_DEVICE_ID_GOODIX_01F0,
I2C_HID_QUIRK_NO_RUNTIME_PM },
{ 0, 0 } { 0, 0 }
}; };
......
...@@ -430,7 +430,7 @@ struct hid_local { ...@@ -430,7 +430,7 @@ struct hid_local {
*/ */
struct hid_collection { struct hid_collection {
struct hid_collection *parent; int parent_idx; /* device->collection */
unsigned type; unsigned type;
unsigned usage; unsigned usage;
unsigned level; unsigned level;
...@@ -658,7 +658,6 @@ struct hid_parser { ...@@ -658,7 +658,6 @@ struct hid_parser {
unsigned int *collection_stack; unsigned int *collection_stack;
unsigned int collection_stack_ptr; unsigned int collection_stack_ptr;
unsigned int collection_stack_size; unsigned int collection_stack_size;
struct hid_collection *active_collection;
struct hid_device *device; struct hid_device *device;
unsigned int scan_flags; unsigned int scan_flags;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment