Skip to content

Commit a1d6ca2

Browse files
committed
uclogic: Support disabling pen usage
Restore the ability to disable pen usage in hid-uclogic to support e.g. keyboard interfaces which also have pen usages for some reason, but which we don't want to rewrite report descriptors for.
1 parent 7a87300 commit a1d6ca2

2 files changed

Lines changed: 26 additions & 0 deletions

File tree

hid-uclogic-core.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,24 @@ static __u8 *uclogic_report_fixup(struct hid_device *hdev, __u8 *rdesc,
8484
return rdesc;
8585
}
8686

87+
static int uclogic_input_mapping(struct hid_device *hdev,
88+
struct hid_input *hi,
89+
struct hid_field *field,
90+
struct hid_usage *usage,
91+
unsigned long **bit,
92+
int *max)
93+
{
94+
struct uclogic_drvdata *drvdata = hid_get_drvdata(hdev);
95+
struct uclogic_params *params = &drvdata->params;
96+
97+
/* Discard invalid pen usages */
98+
if (params->pen.usage_invalid && (field->application == HID_DG_PEN))
99+
return -1;
100+
101+
/* Let hid-core decide what to do */
102+
return 0;
103+
}
104+
87105
#if KERNEL_VERSION(4, 4, 0) > LINUX_VERSION_CODE
88106
#define RETURN_SUCCESS return
89107
static void uclogic_input_configured(struct hid_device *hdev,
@@ -525,6 +543,7 @@ static struct hid_driver uclogic_driver = {
525543
.remove = uclogic_remove,
526544
.report_fixup = uclogic_report_fixup,
527545
.raw_event = uclogic_raw_event,
546+
.input_mapping = uclogic_input_mapping,
528547
.input_configured = uclogic_input_configured,
529548
#ifdef CONFIG_PM
530549
.resume = uclogic_resume,

hid-uclogic-params.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ struct uclogic_params_pen_subreport {
6161
* Noop (preserving functionality) when filled with zeroes.
6262
*/
6363
struct uclogic_params_pen {
64+
/*
65+
* True if pen usage is invalid for this interface and should be
66+
* ignored, false otherwise.
67+
*/
68+
bool usage_invalid;
6469
/*
6570
* Pointer to report descriptor part describing the pen inputs.
6671
* Allocated with kmalloc. NULL if the part is not specified.
@@ -214,6 +219,7 @@ extern int uclogic_params_init(struct uclogic_params *params,
214219
".desc_ptr = %p\n" \
215220
".desc_size = %u\n" \
216221
".pen = {\n" \
222+
"\t.usage_invalid = %s\n" \
217223
"\t.desc_ptr = %p\n" \
218224
"\t.desc_size = %u\n" \
219225
"\t.id = %u\n" \
@@ -270,6 +276,7 @@ extern int uclogic_params_init(struct uclogic_params *params,
270276
((_params)->invalid ? "true" : "false"), \
271277
(_params)->desc_ptr, \
272278
(_params)->desc_size, \
279+
((_params)->pen.usage_invalid ? "true" : "false"), \
273280
(_params)->pen.desc_ptr, \
274281
(_params)->pen.desc_size, \
275282
(_params)->pen.id, \

0 commit comments

Comments
 (0)