hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/hid/hid-rmi.c
....@@ -1,13 +1,9 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * Copyright (c) 2013 Andrew Duggan <aduggan@synaptics.com>
34 * Copyright (c) 2013 Synaptics Incorporated
45 * Copyright (c) 2014 Benjamin Tissoires <benjamin.tissoires@gmail.com>
56 * Copyright (c) 2014 Red Hat, Inc
6
- *
7
- * This program is free software; you can redistribute it and/or modify it
8
- * under the terms of the GNU General Public License as published by the Free
9
- * Software Foundation; either version 2 of the License, or (at your option)
10
- * any later version.
117 */
128
139 #include <linux/kernel.h>
....@@ -39,6 +35,7 @@
3935 /* device flags */
4036 #define RMI_DEVICE BIT(0)
4137 #define RMI_DEVICE_HAS_PHYS_BUTTONS BIT(1)
38
+#define RMI_DEVICE_OUTPUT_SET_REPORT BIT(2)
4239
4340 /*
4441 * retrieve the ctrl registers
....@@ -167,9 +164,19 @@
167164
168165 static int rmi_write_report(struct hid_device *hdev, u8 *report, int len)
169166 {
167
+ struct rmi_data *data = hid_get_drvdata(hdev);
170168 int ret;
171169
172
- ret = hid_hw_output_report(hdev, (void *)report, len);
170
+ if (data->device_flags & RMI_DEVICE_OUTPUT_SET_REPORT) {
171
+ /*
172
+ * Talk to device by using SET_REPORT requests instead.
173
+ */
174
+ ret = hid_hw_raw_request(hdev, report[0], report,
175
+ len, HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
176
+ } else {
177
+ ret = hid_hw_output_report(hdev, (void *)report, len);
178
+ }
179
+
173180 if (ret < 0) {
174181 dev_err(&hdev->dev, "failed to write hid report (%d)\n", ret);
175182 return ret;
....@@ -210,7 +217,6 @@
210217 ret = rmi_write_report(hdev, data->writeReport,
211218 data->output_report_size);
212219 if (ret != data->output_report_size) {
213
- clear_bit(RMI_READ_REQUEST_PENDING, &data->flags);
214220 dev_err(&hdev->dev,
215221 "failed to write request output report (%d)\n",
216222 ret);
....@@ -422,7 +428,6 @@
422428
423429 switch (report->id) {
424430 case RMI_READ_DATA_REPORT_ID:
425
- /* fall-through */
426431 case RMI_ATTN_REPORT_ID:
427432 return;
428433 }
....@@ -715,7 +720,7 @@
715720 }
716721
717722 if (data->device_flags & RMI_DEVICE_HAS_PHYS_BUTTONS)
718
- rmi_hid_pdata.f30_data.disable = true;
723
+ rmi_hid_pdata.gpio_data.disable = true;
719724
720725 data->xport.dev = hdev->dev.parent;
721726 data->xport.pdata = rmi_hid_pdata;
....@@ -752,6 +757,8 @@
752757 .driver_data = RMI_DEVICE_HAS_PHYS_BUTTONS },
753758 { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_COVER) },
754759 { HID_USB_DEVICE(USB_VENDOR_ID_PRIMAX, USB_DEVICE_ID_PRIMAX_REZEL) },
760
+ { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5),
761
+ .driver_data = RMI_DEVICE_OUTPUT_SET_REPORT },
755762 { HID_DEVICE(HID_BUS_ANY, HID_GROUP_RMI, HID_ANY_ID, HID_ANY_ID) },
756763 { }
757764 };