From: Nikolai Kondrashov <spbnick@xxxxxxxxx> Switch from matching UC-Logic subreport with a mask to a full value to support detecting Huion HS610 touch dial reports. Those would match the button mask otherwise. Signed-off-by: Nikolai Kondrashov <spbnick@xxxxxxxxx> Signed-off-by: José Expósito <jose.exposito89@xxxxxxxxx> --- drivers/hid/hid-uclogic-core.c | 9 ++++++--- drivers/hid/hid-uclogic-params.c | 4 ++-- drivers/hid/hid-uclogic-params.h | 13 +++++++------ 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/drivers/hid/hid-uclogic-core.c b/drivers/hid/hid-uclogic-core.c index 7092f86517a5..a02edeb30a35 100644 --- a/drivers/hid/hid-uclogic-core.c +++ b/drivers/hid/hid-uclogic-core.c @@ -365,9 +365,12 @@ static int uclogic_raw_event(struct hid_device *hdev, ARRAY_SIZE(params->pen.subreport_list); /* Try to match a subreport */ for (subreport = params->pen.subreport_list; - subreport < subreport_list_end && - (data[1] & subreport->mask) != subreport->mask; - subreport++); + subreport < subreport_list_end; subreport++) { + if (subreport->value != 0 && + subreport->value == data[1]) { + break; + } + } /* If a subreport matched */ if (subreport < subreport_list_end) { /* Change to subreport ID, and restart */ diff --git a/drivers/hid/hid-uclogic-params.c b/drivers/hid/hid-uclogic-params.c index 138dd8b0a360..a4a53ab1e72c 100644 --- a/drivers/hid/hid-uclogic-params.c +++ b/drivers/hid/hid-uclogic-params.c @@ -763,7 +763,7 @@ static int uclogic_params_huion_init(struct uclogic_params *params, goto cleanup; } /* Link frame button subreports from pen reports */ - p.pen.subreport_list[0].mask = 0x20; + p.pen.subreport_list[0].value = 0xe0; p.pen.subreport_list[0].id = UCLOGIC_RDESC_BUTTONPAD_V2_ID; goto output; @@ -791,7 +791,7 @@ static int uclogic_params_huion_init(struct uclogic_params *params, (found ? "" : " not")); if (found) { /* Link frame button subreports from pen reports */ - p.pen.subreport_list[0].mask = 0x20; + p.pen.subreport_list[0].value = 0xe0; p.pen.subreport_list[0].id = UCLOGIC_RDESC_BUTTONPAD_V1_ID; } diff --git a/drivers/hid/hid-uclogic-params.h b/drivers/hid/hid-uclogic-params.h index 82db8ab36fec..c18569591b75 100644 --- a/drivers/hid/hid-uclogic-params.h +++ b/drivers/hid/hid-uclogic-params.h @@ -39,14 +39,15 @@ extern const char *uclogic_params_pen_inrange_to_str( */ struct uclogic_params_pen_subreport { /* - * The subreport's bitmask matching the second byte of the pen report. - * If zero, the subreport is considered invalid, and won't match. + * The value of the second byte of the pen report indicating this + * subreport. If zero, the subreport should be considered invalid and + * not matched. */ - __u8 mask; + __u8 value; /* - * The ID to be assigned to the report, if the "mask" matches. - * Only valid if "mask" is not zero. + * The ID to be assigned to the report, if the second byte of the pen + * report is equal to "value". Only valid if "value" is not zero. */ __u8 id; }; @@ -200,7 +201,7 @@ extern int uclogic_params_init(struct uclogic_params *params, (_params)->pen.desc_ptr, \ (_params)->pen.desc_size, \ (_params)->pen.id, \ - (_params)->pen.subreport_list[0].mask, \ + (_params)->pen.subreport_list[0].value, \ (_params)->pen.subreport_list[0].id, \ uclogic_params_pen_inrange_to_str((_params)->pen.inrange), \ ((_params)->pen.fragmented_hires ? "true" : "false"), \ -- 2.25.1