aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTingwei Zhang <tingwei@codeaurora.org>2019-09-10 13:58:33 +0800
committerGerrit - the friendly Code Review server <code-review@localhost>2019-09-11 03:55:00 -0700
commit1f01db5a42ccd3123517a9d5730024719abf095d (patch)
treea650c745ad7815d6cf7418d80e1c41550d124831
parent1d1a62b9870023ec7faed6193eade1ecea20ea91 (diff)
Revert "HID: core: move Usage Page concatenation to Main item"LA.UM.8.3.r1-05800-sdm845.0
This reverts commit 1410277e190084f1de51f8656215d508d9132086. Upstream commit causes issue in report parsing leading to device registration failure. Change-Id: Ia1615c1330157de1d7583f60902552b888b95404 Signed-off-by: Tingwei Zhang <tingwei@codeaurora.org>
-rw-r--r--drivers/hid/hid-core.c36
-rw-r--r--include/linux/hid.h1
2 files changed, 12 insertions, 25 deletions
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index d030731d2a51..81efba580279 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -200,14 +200,13 @@ static unsigned hid_lookup_collection(struct hid_parser *parser, unsigned type)
* Add a usage to the temporary parser table.
*/
-static int hid_add_usage(struct hid_parser *parser, unsigned usage, u8 size)
+static int hid_add_usage(struct hid_parser *parser, unsigned usage)
{
if (parser->local.usage_index >= HID_MAX_USAGES) {
hid_err(parser->device, "usage index exceeded\n");
return -1;
}
parser->local.usage[parser->local.usage_index] = usage;
- parser->local.usage_size[parser->local.usage_index] = size;
parser->local.collection_index[parser->local.usage_index] =
parser->collection_stack_ptr ?
parser->collection_stack[parser->collection_stack_ptr - 1] : 0;
@@ -464,7 +463,10 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)
return 0;
}
- return hid_add_usage(parser, data, item->size);
+ if (item->size <= 2)
+ data = (parser->global.usage_page << 16) + data;
+
+ return hid_add_usage(parser, data);
case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM:
@@ -473,6 +475,9 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)
return 0;
}
+ if (item->size <= 2)
+ data = (parser->global.usage_page << 16) + data;
+
parser->local.usage_minimum = data;
return 0;
@@ -483,6 +488,9 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)
return 0;
}
+ if (item->size <= 2)
+ data = (parser->global.usage_page << 16) + data;
+
count = data - parser->local.usage_minimum;
if (count + parser->local.usage_index >= HID_MAX_USAGES) {
/*
@@ -502,7 +510,7 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)
}
for (n = parser->local.usage_minimum; n <= data; n++)
- if (hid_add_usage(parser, n, item->size)) {
+ if (hid_add_usage(parser, n)) {
dbg_hid("hid_add_usage failed\n");
return -1;
}
@@ -517,22 +525,6 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)
}
/*
- * Concatenate Usage Pages into Usages where relevant:
- * As per specification, 6.2.2.8: "When the parser encounters a main item it
- * concatenates the last declared Usage Page with a Usage to form a complete
- * usage value."
- */
-
-static void hid_concatenate_usage_page(struct hid_parser *parser)
-{
- int i;
-
- for (i = 0; i < parser->local.usage_index; i++)
- if (parser->local.usage_size[i] <= 2)
- parser->local.usage[i] += parser->global.usage_page << 16;
-}
-
-/*
* Process a main item.
*/
@@ -541,8 +533,6 @@ static int hid_parser_main(struct hid_parser *parser, struct hid_item *item)
__u32 data;
int ret;
- hid_concatenate_usage_page(parser);
-
data = item_udata(item);
switch (item->tag) {
@@ -756,8 +746,6 @@ static int hid_scan_main(struct hid_parser *parser, struct hid_item *item)
__u32 data;
int i;
- hid_concatenate_usage_page(parser);
-
data = item_udata(item);
switch (item->tag) {
diff --git a/include/linux/hid.h b/include/linux/hid.h
index 04bdf5477ec5..fab65b61d6d4 100644
--- a/include/linux/hid.h
+++ b/include/linux/hid.h
@@ -374,7 +374,6 @@ struct hid_global {
struct hid_local {
unsigned usage[HID_MAX_USAGES]; /* usage array */
- u8 usage_size[HID_MAX_USAGES]; /* usage size array */
unsigned collection_index[HID_MAX_USAGES]; /* collection index array */
unsigned usage_index;
unsigned usage_minimum;