Re: [PATCH v2] HID: i2c-hid: disable runtime PM operations on hantick touchpad

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

 



On Wed, Sep 12, 2018 at 3:08 PM Anisse Astier <anisse@xxxxxxxxx> wrote:
>
> 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@xxxxxxxxx>
> Cc: stable@xxxxxxxxxxxxxxx
> ---
>
> Changes since v1: (thanks Hans de Goede)
>  - no longer uses msleep to delay suspend, but disables runtime suspend it
>    entirely

I like it better. Thanks both of you :)

Acked-by: Benjamin Tissoires <benjamin.tissoires@xxxxxxxxxx>

Cheers,
Benjamin

>  - quirk is now named NO_RUNTIME_PM and OR-ed with the other Hantick quirk
>
>
> Regards,
>
> Anisse
>
>  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 847b55ad0d60..9917eb2c98f3 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 }
> @@ -1097,7 +1099,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:
> @@ -1124,7 +1128,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);
> --
> 2.11.0
>



[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