mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
HID: hid-goodix: Fix HID get/set feature operation overwritten problem
Implement the hid get/set feature report function using a separate address, rather than sharing an address with coordinate reporting, to prevent feature events from being overwritten by coordinate events. Signed-off-by: Charles Wang <charles.goodix@gmail.com> Signed-off-by: Jiri Kosina <jkosina@suse.com>
This commit is contained in:
parent
be8f7f2281
commit
253ed2740b
|
|
@ -19,6 +19,7 @@
|
|||
#define GOODIX_HID_DESC_ADDR 0x1058C
|
||||
#define GOODIX_HID_REPORT_DESC_ADDR 0x105AA
|
||||
#define GOODIX_HID_SIGN_ADDR 0x10D32
|
||||
#define GOODIX_HID_CMD_ADDR 0x10364
|
||||
|
||||
#define GOODIX_HID_GET_REPORT_CMD 0x02
|
||||
#define GOODIX_HID_SET_REPORT_CMD 0x03
|
||||
|
|
@ -348,7 +349,7 @@ static int goodix_hid_check_ack_status(struct goodix_ts_data *ts, u32 *resp_len)
|
|||
* - byte 0: Ack flag, value of 1 for data ready
|
||||
* - bytes 1-2: Response data length
|
||||
*/
|
||||
error = goodix_spi_read(ts, ts->hid_report_addr,
|
||||
error = goodix_spi_read(ts, GOODIX_HID_CMD_ADDR,
|
||||
&hdr, sizeof(hdr));
|
||||
if (!error && (hdr.flag & GOODIX_HID_ACK_READY_FLAG)) {
|
||||
len = le16_to_cpu(hdr.size);
|
||||
|
|
@ -431,7 +432,7 @@ static int goodix_hid_get_raw_report(struct hid_device *hid,
|
|||
tx_len += args_len;
|
||||
|
||||
/* Step1: write report request info */
|
||||
error = goodix_spi_write(ts, ts->hid_report_addr, tmp_buf, tx_len);
|
||||
error = goodix_spi_write(ts, GOODIX_HID_CMD_ADDR, tmp_buf, tx_len);
|
||||
if (error) {
|
||||
dev_err(ts->dev, "failed send read feature cmd, %d", error);
|
||||
return error;
|
||||
|
|
@ -451,7 +452,7 @@ static int goodix_hid_get_raw_report(struct hid_device *hid,
|
|||
return 0;
|
||||
len = min(len, response_data_len);
|
||||
/* Step3: read response data(skip 2bytes of hid pkg length) */
|
||||
error = goodix_spi_read(ts, ts->hid_report_addr +
|
||||
error = goodix_spi_read(ts, GOODIX_HID_CMD_ADDR +
|
||||
GOODIX_HID_ACK_HEADER_SIZE +
|
||||
GOODIX_HID_PKG_LEN_SIZE, buf, len);
|
||||
if (error) {
|
||||
|
|
@ -521,7 +522,7 @@ static int goodix_hid_set_raw_report(struct hid_device *hid,
|
|||
memcpy(tmp_buf + tx_len, buf, len);
|
||||
tx_len += len;
|
||||
|
||||
error = goodix_spi_write(ts, ts->hid_report_addr, tmp_buf, tx_len);
|
||||
error = goodix_spi_write(ts, GOODIX_HID_CMD_ADDR, tmp_buf, tx_len);
|
||||
if (error) {
|
||||
dev_err(ts->dev, "failed send report: %*ph", tx_len, tmp_buf);
|
||||
return error;
|
||||
|
|
@ -752,7 +753,7 @@ static int goodix_spi_set_power(struct goodix_ts_data *ts, int power_state)
|
|||
power_control_cmd[5] = power_state;
|
||||
|
||||
guard(mutex)(&ts->hid_request_lock);
|
||||
error = goodix_spi_write(ts, ts->hid_report_addr, power_control_cmd,
|
||||
error = goodix_spi_write(ts, GOODIX_HID_CMD_ADDR, power_control_cmd,
|
||||
sizeof(power_control_cmd));
|
||||
if (error) {
|
||||
dev_err(ts->dev, "failed set power mode: %s",
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user