|
49 | 49 | #define I2C_HID_QUIRK_NO_IRQ_AFTER_RESET BIT(1)
|
50 | 50 | #define I2C_HID_QUIRK_BOGUS_IRQ BIT(4)
|
51 | 51 | #define I2C_HID_QUIRK_RESET_ON_RESUME BIT(5)
|
| 52 | +#define I2C_HID_QUIRK_BAD_INPUT_SIZE BIT(6) |
| 53 | + |
52 | 54 |
|
53 | 55 | /* flags */
|
54 | 56 | #define I2C_HID_STARTED 0
|
@@ -175,6 +177,8 @@ static const struct i2c_hid_quirks {
|
175 | 177 | I2C_HID_QUIRK_BOGUS_IRQ },
|
176 | 178 | { USB_VENDOR_ID_ALPS_JP, HID_ANY_ID,
|
177 | 179 | I2C_HID_QUIRK_RESET_ON_RESUME },
|
| 180 | + { USB_VENDOR_ID_ITE, I2C_DEVICE_ID_ITE_LENOVO_LEGION_Y720, |
| 181 | + I2C_HID_QUIRK_BAD_INPUT_SIZE }, |
178 | 182 | { 0, 0 }
|
179 | 183 | };
|
180 | 184 |
|
@@ -496,9 +500,15 @@ static void i2c_hid_get_input(struct i2c_hid *ihid)
|
496 | 500 | }
|
497 | 501 |
|
498 | 502 | if ((ret_size > size) || (ret_size < 2)) {
|
499 |
| - dev_err(&ihid->client->dev, "%s: incomplete report (%d/%d)\n", |
500 |
| - __func__, size, ret_size); |
501 |
| - return; |
| 503 | + if (ihid->quirks & I2C_HID_QUIRK_BAD_INPUT_SIZE) { |
| 504 | + ihid->inbuf[0] = size & 0xff; |
| 505 | + ihid->inbuf[1] = size >> 8; |
| 506 | + ret_size = size; |
| 507 | + } else { |
| 508 | + dev_err(&ihid->client->dev, "%s: incomplete report (%d/%d)\n", |
| 509 | + __func__, size, ret_size); |
| 510 | + return; |
| 511 | + } |
502 | 512 | }
|
503 | 513 |
|
504 | 514 | i2c_hid_dbg(ihid, "input: %*ph\n", ret_size, ihid->inbuf);
|
|
0 commit comments