diff options
author | Aaron Ma <aaron.ma@canonical.com> | 2018-04-09 03:41:31 -0400 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2018-04-12 09:06:18 -0400 |
commit | 3e83eda467050f13fa69d888993458b76e733de9 (patch) | |
tree | 145524babf4dd5dcf69ae33eb03453e2966e5e03 | |
parent | 619d3a2922ce623ca2eca443cc936810d328317c (diff) |
HID: i2c-hid: Fix resume issue on Raydium touchscreen device
When Rayd touchscreen resumed from S3, it issues too many errors like:
i2c_hid i2c-RAYD0001:00: i2c_hid_get_input: incomplete report (58/5442)
And all the report data are corrupted, touchscreen is unresponsive.
Fix this by re-sending report description command after resume.
Add device ID as a quirk.
Cc: stable@vger.kernel.org
Signed-off-by: Aaron Ma <aaron.ma@canonical.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
-rw-r--r-- | drivers/hid/hid-ids.h | 3 | ||||
-rw-r--r-- | drivers/hid/i2c-hid/i2c-hid.c | 13 |
2 files changed, 16 insertions, 0 deletions
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 5a3a7ead3012..0b5cc910f62e 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
@@ -525,6 +525,9 @@ | |||
525 | #define I2C_VENDOR_ID_HANTICK 0x0911 | 525 | #define I2C_VENDOR_ID_HANTICK 0x0911 |
526 | #define I2C_PRODUCT_ID_HANTICK_5288 0x5288 | 526 | #define I2C_PRODUCT_ID_HANTICK_5288 0x5288 |
527 | 527 | ||
528 | #define I2C_VENDOR_ID_RAYD 0x2386 | ||
529 | #define I2C_PRODUCT_ID_RAYD_3118 0x3118 | ||
530 | |||
528 | #define USB_VENDOR_ID_HANWANG 0x0b57 | 531 | #define USB_VENDOR_ID_HANWANG 0x0b57 |
529 | #define USB_DEVICE_ID_HANWANG_TABLET_FIRST 0x5000 | 532 | #define USB_DEVICE_ID_HANWANG_TABLET_FIRST 0x5000 |
530 | #define USB_DEVICE_ID_HANWANG_TABLET_LAST 0x8fff | 533 | #define USB_DEVICE_ID_HANWANG_TABLET_LAST 0x8fff |
diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c index 97689e98e53f..615a91ac93bd 100644 --- a/drivers/hid/i2c-hid/i2c-hid.c +++ b/drivers/hid/i2c-hid/i2c-hid.c | |||
@@ -47,6 +47,7 @@ | |||
47 | /* quirks to control the device */ | 47 | /* quirks to control the device */ |
48 | #define I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV BIT(0) | 48 | #define I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV BIT(0) |
49 | #define I2C_HID_QUIRK_NO_IRQ_AFTER_RESET BIT(1) | 49 | #define I2C_HID_QUIRK_NO_IRQ_AFTER_RESET BIT(1) |
50 | #define I2C_HID_QUIRK_RESEND_REPORT_DESCR BIT(2) | ||
50 | 51 | ||
51 | /* flags */ | 52 | /* flags */ |
52 | #define I2C_HID_STARTED 0 | 53 | #define I2C_HID_STARTED 0 |
@@ -171,6 +172,8 @@ static const struct i2c_hid_quirks { | |||
171 | I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV }, | 172 | I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV }, |
172 | { I2C_VENDOR_ID_HANTICK, I2C_PRODUCT_ID_HANTICK_5288, | 173 | { I2C_VENDOR_ID_HANTICK, I2C_PRODUCT_ID_HANTICK_5288, |
173 | I2C_HID_QUIRK_NO_IRQ_AFTER_RESET }, | 174 | I2C_HID_QUIRK_NO_IRQ_AFTER_RESET }, |
175 | { I2C_VENDOR_ID_RAYD, I2C_PRODUCT_ID_RAYD_3118, | ||
176 | I2C_HID_QUIRK_RESEND_REPORT_DESCR }, | ||
174 | { 0, 0 } | 177 | { 0, 0 } |
175 | }; | 178 | }; |
176 | 179 | ||
@@ -1220,6 +1223,16 @@ static int i2c_hid_resume(struct device *dev) | |||
1220 | if (ret) | 1223 | if (ret) |
1221 | return ret; | 1224 | return ret; |
1222 | 1225 | ||
1226 | /* RAYDIUM device (2386:3118) need to re-send report descr cmd | ||
1227 | * after resume, after this it will be back normal. | ||
1228 | * otherwise it issues too many incomplete reports. | ||
1229 | */ | ||
1230 | if (ihid->quirks & I2C_HID_QUIRK_RESEND_REPORT_DESCR) { | ||
1231 | ret = i2c_hid_command(client, &hid_report_descr_cmd, NULL, 0); | ||
1232 | if (!ret) | ||
1233 | return ret; | ||
1234 | } | ||
1235 | |||
1223 | if (hid->driver && hid->driver->reset_resume) { | 1236 | if (hid->driver && hid->driver->reset_resume) { |
1224 | ret = hid->driver->reset_resume(hid); | 1237 | ret = hid->driver->reset_resume(hid); |
1225 | return ret; | 1238 | return ret; |