ACK/cmnt: [PATCH 1/1] HID: i2c-hid: disable runtime PM operations on hantick touchpad

Kleber Souza kleber.souza at canonical.com
Thu Dec 20 14:06:15 UTC 2018


On 12/20/18 7:52 AM, Kai-Heng Feng wrote:
> From: Anisse Astier <anisse at astier.eu>
>
> BugLink: https://bugs.launchpad.net/bugs/1728244
>
> This hantick HTIX5288 touchpad can quickly fall in a wrong state if
> there are too many open/close operations. This will either make it stop
> reporting any input, or will shift all the input reads by a few bytes,
> making it impossible to decode.
>
> Here, we never release the probed touchpad runtime pm while the driver
> is loaded, which should disable all runtime pm suspend/resumes.
>
> This fast repetition of sleep/wakeup is also more likely to happen when
> using runtime PM, which is why the quirk is done there, and not for all
> power downs, which would include suspend or module removal.
>
> Signed-off-by: Anisse Astier <anisse at astier.eu>
> Cc: stable at vger.kernel.org
> Acked-by: Benjamin Tissoires <benjamin.tissoires at redhat.com>
> Reviewed-by: Hans de Goede <hdegoede at redhat.com>
> Tested-by: Philip Müller <philm at manjaro.org>
> Signed-off-by: Jiri Kosina <jkosina at suse.cz>
> (cherry picked from commit 807588ac92018bde88a1958f546438e840eb0158)
> Signed-off-by: Kai-Heng Feng <kai.heng.feng at canonical.com>

Looks good, thanks for sending a separate SRU request!


Please note that for Bionic this is a re-req for

"HID: i2c-hid: Disable runtime PM for LG touchscreen"

sent as part of a earlier thread named

"Fix and issue that LG I2C touchscreen stops working after reboot"


Acked-by: Kleber Sacilotto de Souza <kleber.souza at canonical.com>

> ---
>  drivers/hid/i2c-hid/i2c-hid.c | 11 ++++++++---
>  1 file changed, 8 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c
> index 46037a692384..72df970c60ef 100644
> --- a/drivers/hid/i2c-hid/i2c-hid.c
> +++ b/drivers/hid/i2c-hid/i2c-hid.c
> @@ -48,6 +48,7 @@
>  #define I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV	BIT(0)
>  #define I2C_HID_QUIRK_NO_IRQ_AFTER_RESET	BIT(1)
>  #define I2C_HID_QUIRK_RESEND_REPORT_DESCR	BIT(2)
> +#define I2C_HID_QUIRK_NO_RUNTIME_PM		BIT(3)
>  
>  /* flags */
>  #define I2C_HID_STARTED		0
> @@ -171,7 +172,8 @@ static const struct i2c_hid_quirks {
>  	{ USB_VENDOR_ID_WEIDA, USB_DEVICE_ID_WEIDA_8755,
>  		I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV },
>  	{ I2C_VENDOR_ID_HANTICK, I2C_PRODUCT_ID_HANTICK_5288,
> -		I2C_HID_QUIRK_NO_IRQ_AFTER_RESET },
> +		I2C_HID_QUIRK_NO_IRQ_AFTER_RESET |
> +		I2C_HID_QUIRK_NO_RUNTIME_PM },
>  	{ USB_VENDOR_ID_SIS_TOUCH, USB_DEVICE_ID_SIS10FB_TOUCH,
>  		I2C_HID_QUIRK_RESEND_REPORT_DESCR },
>  	{ 0, 0 }
> @@ -1081,7 +1083,9 @@ static int i2c_hid_probe(struct i2c_client *client,
>  		goto err_mem_free;
>  	}
>  
> -	pm_runtime_put(&client->dev);
> +	if (!(ihid->quirks & I2C_HID_QUIRK_NO_RUNTIME_PM))
> +		pm_runtime_put(&client->dev);
> +
>  	return 0;
>  
>  err_mem_free:
> @@ -1108,7 +1112,8 @@ static int i2c_hid_remove(struct i2c_client *client)
>  	struct i2c_hid *ihid = i2c_get_clientdata(client);
>  	struct hid_device *hid;
>  
> -	pm_runtime_get_sync(&client->dev);
> +	if (!(ihid->quirks & I2C_HID_QUIRK_NO_RUNTIME_PM))
> +		pm_runtime_get_sync(&client->dev);
>  	pm_runtime_disable(&client->dev);
>  	pm_runtime_set_suspended(&client->dev);
>  	pm_runtime_put_noidle(&client->dev);





More information about the kernel-team mailing list