Re: [PATCH] HID: i2c-hid: Add no-irq-after-reset quirk for 0911:5288 device

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Nov 06 2017 or thereabouts, Hans de Goede wrote:
> Several cheap Apollo Lake based laptops / 2-in-1s use an i2c-hid mt
> touchpad which is advertised by the DSDT with an ACPI HID of "SYNA3602",
> this touchpad can be found on e.g. the Cube Thinker and the EZBook 3 Pro.
> 
> On my "T-bao Tbook air" the i2c-hid driver fails to bind to this touchpad:
> "i2c_hid i2c-SYNA3602:00: failed to reset device.".
> 
> After some debuging this it seems that this touchpad simply never sends
> an interrupt after a reset as expected by the i2c hid driver. This commit
> adds a quirk for this device, making i2c_hid_command sleep 100ms after
> a reset instead of waiting for an irq, fixing i2c-hid failing to bind to
> this touchpad.
> 
> Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx>
> ---
>  drivers/hid/hid-ids.h         | 7 +++++++
>  drivers/hid/i2c-hid/i2c-hid.c | 7 ++++++-
>  2 files changed, 13 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
> index be2e005c3c51..47c5e709c2fd 100644
> --- a/drivers/hid/hid-ids.h
> +++ b/drivers/hid/hid-ids.h
> @@ -1003,6 +1003,13 @@
>  #define USB_DEVICE_ID_SYNAPTICS_QUAD_HD	0x1ac3
>  #define USB_DEVICE_ID_SYNAPTICS_TP_V103	0x5710
>  
> +/*
> + * These are from i2c-hid mt touchpads found in several cheap Apollo Lake
> + * based laptops which advertise the touchpad with an ACPI HID of "SYNA3602".
> + */
> +#define I2C_VENDOR_ID_SYNAPTICS		0x0911

Is this really a Synaptics device? What is the Windows driver
advertising? Because I am having a hard time Synaptics would do such
thing. The USB Vendor ID for 0x0911 is "Philips Speech Processing"
https://usb-ids.gowdy.us/read/UD/0911, and I doubt HID over I2C devices
are supposed to use anything but USB managed vendor IDs...

> +#define I2C_PRODUCT_ID_SYNA3602		0x5288
> +
>  #define USB_VENDOR_ID_TEXAS_INSTRUMENTS	0x2047
>  #define USB_DEVICE_ID_TEXAS_INSTRUMENTS_LENOVO_YOGA	0x0855
>  
> diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c
> index 7f701772edfe..9ceef884a4b3 100644
> --- a/drivers/hid/i2c-hid/i2c-hid.c
> +++ b/drivers/hid/i2c-hid/i2c-hid.c
> @@ -46,6 +46,7 @@
>  
>  /* quirks to control the device */
>  #define I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV	BIT(0)
> +#define I2C_HID_QUIRK_NO_IRQ_AFTER_RESET	BIT(1)
>  
>  /* flags */
>  #define I2C_HID_STARTED		0
> @@ -168,6 +169,8 @@ static const struct i2c_hid_quirks {
>  		I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV },
>  	{ USB_VENDOR_ID_WEIDA, USB_DEVICE_ID_WEIDA_8755,
>  		I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV },
> +	{ I2C_VENDOR_ID_SYNAPTICS, I2C_PRODUCT_ID_SYNA3602,
> +		I2C_HID_QUIRK_NO_IRQ_AFTER_RESET },
>  	{ 0, 0 }
>  };
>  
> @@ -252,7 +255,9 @@ static int __i2c_hid_command(struct i2c_client *client,
>  
>  	ret = 0;
>  
> -	if (wait) {
> +	if (wait && (ihid->quirks & I2C_HID_QUIRK_NO_IRQ_AFTER_RESET)) {
> +		msleep(100);

This is a sad thing to add, but if we do not have the choice... Does the
Windows driver requires any changes or the Windows shipped one just
works?

Cheers,
Benjamin

> +	} else if (wait) {
>  		i2c_hid_dbg(ihid, "%s: waiting...\n", __func__);
>  		if (!wait_event_timeout(ihid->wait,
>  				!test_bit(I2C_HID_RESET_PENDING, &ihid->flags),
> -- 
> 2.14.3
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux