Skip to content

Commit a788b20

Browse files
EvenxfJiri Kosina
authored andcommitted
HID: Intel-thc-hid: Intel-quicki2c: Add output report support
Add support for HID output reports in the intel-quicki2c driver by implementing the output_report callback in the HID low-level driver interface. This enables proper communication with HID devices that require output report functionality, such as setting device configuration or updating device firmware. Tested-by: Rui Zhang <rui1.zhang@intel.com> Signed-off-by: Even Xu <even.xu@intel.com> Signed-off-by: Jiri Kosina <jkosina@suse.com>
1 parent e149af9 commit a788b20

3 files changed

Lines changed: 28 additions & 0 deletions

File tree

drivers/hid/intel-thc-hid/intel-quicki2c/quicki2c-hid.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,13 @@ static int quicki2c_hid_power(struct hid_device *hid, int lvl)
8282
return 0;
8383
}
8484

85+
static int quicki2c_hid_output_report(struct hid_device *hid, u8 *buf, size_t count)
86+
{
87+
struct quicki2c_device *qcdev = hid->driver_data;
88+
89+
return quicki2c_output_report(qcdev, buf, count);
90+
}
91+
8592
static struct hid_ll_driver quicki2c_hid_ll_driver = {
8693
.parse = quicki2c_hid_parse,
8794
.start = quicki2c_hid_start,
@@ -90,6 +97,7 @@ static struct hid_ll_driver quicki2c_hid_ll_driver = {
9097
.close = quicki2c_hid_close,
9198
.power = quicki2c_hid_power,
9299
.raw_request = quicki2c_hid_raw_request,
100+
.output_report = quicki2c_hid_output_report,
93101
};
94102

95103
/**

drivers/hid/intel-thc-hid/intel-quicki2c/quicki2c-protocol.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,25 @@ int quicki2c_set_report(struct quicki2c_device *qcdev, u8 report_type,
195195
return buf_len;
196196
}
197197

198+
int quicki2c_output_report(struct quicki2c_device *qcdev, void *buf, size_t buf_len)
199+
{
200+
ssize_t len;
201+
int ret;
202+
203+
len = quicki2c_init_write_buf(qcdev, 0, 0, false, buf, buf_len,
204+
qcdev->report_buf, qcdev->report_len);
205+
if (len < 0)
206+
return -EINVAL;
207+
208+
ret = thc_dma_write(qcdev->thc_hw, qcdev->report_buf, len);
209+
if (ret) {
210+
dev_err(qcdev->dev, "Output Report failed, ret %d\n", ret);
211+
return ret;
212+
}
213+
214+
return buf_len;
215+
}
216+
198217
#define HIDI2C_RESET_TIMEOUT 5
199218

200219
int quicki2c_reset(struct quicki2c_device *qcdev)

drivers/hid/intel-thc-hid/intel-quicki2c/quicki2c-protocol.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ int quicki2c_get_report(struct quicki2c_device *qcdev, u8 report_type,
1313
unsigned int reportnum, void *buf, size_t buf_len);
1414
int quicki2c_set_report(struct quicki2c_device *qcdev, u8 report_type,
1515
unsigned int reportnum, void *buf, size_t buf_len);
16+
int quicki2c_output_report(struct quicki2c_device *qcdev, void *buf, size_t buf_len);
1617
int quicki2c_get_device_descriptor(struct quicki2c_device *qcdev);
1718
int quicki2c_get_report_descriptor(struct quicki2c_device *qcdev);
1819
int quicki2c_reset(struct quicki2c_device *qcdev);

0 commit comments

Comments
 (0)