summaryrefslogtreecommitdiff
path: root/drivers/hid/hid-uclogic-core.c
diff options
context:
space:
mode:
authorNikolai Kondrashov <spbnick@gmail.com>2022-02-19 13:01:57 +0300
committerJiri Kosina <jkosina@suse.cz>2022-03-01 17:28:14 +0300
commit337fa051d9b8aabf7081795d40e92e9d96f3442d (patch)
treec18bc14132d4744c0eda3547542a30ac187e56d3 /drivers/hid/hid-uclogic-core.c
parent2daaeff3824dfb27409f499a2a945970729ba86f (diff)
downloadlinux-337fa051d9b8aabf7081795d40e92e9d96f3442d.tar.xz
HID: uclogic: Support multiple frame input devices
Add support for multiple frame input devices and their parameters to the UC-Logic driver. This prepares for creating a separate input device for Huion HS610 virtual touch ring reports. Signed-off-by: Nikolai Kondrashov <spbnick@gmail.com> Signed-off-by: José Expósito <jose.exposito89@gmail.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid/hid-uclogic-core.c')
-rw-r--r--drivers/hid/hid-uclogic-core.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/drivers/hid/hid-uclogic-core.c b/drivers/hid/hid-uclogic-core.c
index a02edeb30a35..05147f2d7564 100644
--- a/drivers/hid/hid-uclogic-core.c
+++ b/drivers/hid/hid-uclogic-core.c
@@ -296,17 +296,18 @@ static int uclogic_raw_event_pen(struct uclogic_drvdata *drvdata,
* uclogic_raw_event_frame - handle raw frame events (frame HID reports).
*
* @drvdata: Driver data.
+ * @frame: The parameters of the frame controls to handle.
* @data: Report data buffer, can be modified.
* @size: Report data size, bytes.
*
* Returns:
* Negative value on error (stops event delivery), zero for success.
*/
-static int uclogic_raw_event_frame(struct uclogic_drvdata *drvdata,
- u8 *data, int size)
+static int uclogic_raw_event_frame(
+ struct uclogic_drvdata *drvdata,
+ const struct uclogic_params_frame *frame,
+ u8 *data, int size)
{
- struct uclogic_params_frame *frame = &drvdata->params.frame;
-
WARN_ON(drvdata == NULL);
WARN_ON(data == NULL && size != 0);
@@ -352,6 +353,7 @@ static int uclogic_raw_event(struct hid_device *hdev,
struct uclogic_params *params = &drvdata->params;
struct uclogic_params_pen_subreport *subreport;
struct uclogic_params_pen_subreport *subreport_list_end;
+ size_t i;
/* Do not handle anything but input reports */
if (report->type != HID_INPUT_REPORT)
@@ -382,8 +384,13 @@ static int uclogic_raw_event(struct hid_device *hdev,
}
/* Tweak frame control reports, if necessary */
- if (report_id == params->frame.id)
- return uclogic_raw_event_frame(drvdata, data, size);
+ for (i = 0; i < ARRAY_SIZE(params->frame_list); i++) {
+ if (report_id == params->frame_list[i].id) {
+ return uclogic_raw_event_frame(
+ drvdata, &params->frame_list[i],
+ data, size);
+ }
+ }
break;
}