]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
HID: hid-goodix: Fix HID get/set feature operation overwritten problem
authorCharles Wang <charles.goodix@gmail.com>
Thu, 31 Oct 2024 12:31:13 +0000 (20:31 +0800)
committerJiri Kosina <jkosina@suse.com>
Wed, 6 Nov 2024 14:08:31 +0000 (15:08 +0100)
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>
drivers/hid/hid-goodix-spi.c

index 077a91ee1d377f4cced2867fe162cb78a0c59065..6ae2300a603ef2ae794055c8abdc012911093039 100644 (file)
@@ -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",