2021-04-12 01:37:50

by Johnny Chuang

[permalink] [raw]
Subject: [PATCH v2] HID: i2c-hid: Skip ELAN power-on command after reset

Previous commit 43b7029f475e ("HID: i2c-hid:
Send power-on command after reset"), it fixed issue for SIS touchscreen.

For ELAN touchscreen, we found our boot code of IC was not flexible enough
to receive and handle this command.
Once the FW main code of our controller is crashed for some reason,
the controller could not be enumerated successfully to be recognized
by the system host. therefore, it lost touch functionality.

Add quirk for skip send power-on command after reset.
It will impact to ELAN touchscreen and touchpad on HID over I2C projects.

Signed-off-by: Johnny Chuang <[email protected]>
---
Changes in v2:
- move comment to quirk entry
---
drivers/hid/i2c-hid/i2c-hid-core.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/hid/i2c-hid/i2c-hid-core.c b/drivers/hid/i2c-hid/i2c-hid-core.c
index 9993133..957d865 100644
--- a/drivers/hid/i2c-hid/i2c-hid-core.c
+++ b/drivers/hid/i2c-hid/i2c-hid-core.c
@@ -45,6 +45,7 @@
#define I2C_HID_QUIRK_BOGUS_IRQ BIT(4)
#define I2C_HID_QUIRK_RESET_ON_RESUME BIT(5)
#define I2C_HID_QUIRK_BAD_INPUT_SIZE BIT(6)
+#define I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET BIT(7)


/* flags */
@@ -178,6 +179,12 @@ static const struct i2c_hid_quirks {
I2C_HID_QUIRK_RESET_ON_RESUME },
{ USB_VENDOR_ID_ITE, I2C_DEVICE_ID_ITE_LENOVO_LEGION_Y720,
I2C_HID_QUIRK_BAD_INPUT_SIZE },
+/*
+ * Sending the wakeup after reset actually break ELAN touchscreen controller
+ * Add I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET to skip wakeup after reset
+ */
+ { USB_VENDOR_ID_ELAN, HID_ANY_ID,
+ I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET },
{ 0, 0 }
};

@@ -461,7 +468,8 @@ static int i2c_hid_hwreset(struct i2c_client *client)
}

/* At least some SIS devices need this after reset */
- ret = i2c_hid_set_power(client, I2C_HID_PWR_ON);
+ if (!(ihid->quirks & I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET))
+ ret = i2c_hid_set_power(client, I2C_HID_PWR_ON);

out_unlock:
mutex_unlock(&ihid->reset_lock);
--
2.7.4


2021-04-12 17:59:32

by Harry Cutts

[permalink] [raw]
Subject: Re: [PATCH v2] HID: i2c-hid: Skip ELAN power-on command after reset

On Mon, 12 Apr 2021 at 10:56, Harry Cutts <[email protected]> wrote:
>
> On Sun, 11 Apr 2021 at 18:21, Johnny Chuang <[email protected]> wrote:
> >
> > Previous commit 43b7029f475e ("HID: i2c-hid:
> > Send power-on command after reset"), it fixed issue for SIS touchscreen.
> >
> > For ELAN touchscreen, we found our boot code of IC was not flexible enough
> > to receive and handle this command.
> > Once the FW main code of our controller is crashed for some reason,
> > the controller could not be enumerated successfully to be recognized
> > by the system host. therefore, it lost touch functionality.
> >
> > Add quirk for skip send power-on command after reset.
> > It will impact to ELAN touchscreen and touchpad on HID over I2C projects.
> >
> > Signed-off-by: Johnny Chuang <[email protected]>
>
> It's probably a good idea to add a Fixes: tag, like so:
>
> Fixes: 43b7029f475e ("HID: i2c-hid: Send power-on command after reset")
>
> Other than that,
>
> Reviewed-by: Harry Cutts <[email protected]>
>
> Harry Cutts
> Chrome OS Touch/Input team
>
> > ---
> > Changes in v2:
> > - move comment to quirk entry
> > ---
> > drivers/hid/i2c-hid/i2c-hid-core.c | 10 +++++++++-
> > 1 file changed, 9 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/hid/i2c-hid/i2c-hid-core.c b/drivers/hid/i2c-hid/i2c-hid-core.c
> > index 9993133..957d865 100644
> > --- a/drivers/hid/i2c-hid/i2c-hid-core.c
> > +++ b/drivers/hid/i2c-hid/i2c-hid-core.c
> > @@ -45,6 +45,7 @@
> > #define I2C_HID_QUIRK_BOGUS_IRQ BIT(4)
> > #define I2C_HID_QUIRK_RESET_ON_RESUME BIT(5)
> > #define I2C_HID_QUIRK_BAD_INPUT_SIZE BIT(6)
> > +#define I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET BIT(7)
> >
> >
> > /* flags */
> > @@ -178,6 +179,12 @@ static const struct i2c_hid_quirks {
> > I2C_HID_QUIRK_RESET_ON_RESUME },
> > { USB_VENDOR_ID_ITE, I2C_DEVICE_ID_ITE_LENOVO_LEGION_Y720,
> > I2C_HID_QUIRK_BAD_INPUT_SIZE },
> > +/*
> > + * Sending the wakeup after reset actually break ELAN touchscreen controller
> > + * Add I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET to skip wakeup after reset
> > + */

...though, just spotted, you should indent the comment.

> > + { USB_VENDOR_ID_ELAN, HID_ANY_ID,
> > + I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET },
> > { 0, 0 }
> > };
> >
> > @@ -461,7 +468,8 @@ static int i2c_hid_hwreset(struct i2c_client *client)
> > }
> >
> > /* At least some SIS devices need this after reset */
> > - ret = i2c_hid_set_power(client, I2C_HID_PWR_ON);
> > + if (!(ihid->quirks & I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET))
> > + ret = i2c_hid_set_power(client, I2C_HID_PWR_ON);
> >
> > out_unlock:
> > mutex_unlock(&ihid->reset_lock);
> > --
> > 2.7.4
> >

2021-04-13 10:41:30

by Harry Cutts

[permalink] [raw]
Subject: Re: [PATCH v2] HID: i2c-hid: Skip ELAN power-on command after reset

On Sun, 11 Apr 2021 at 18:21, Johnny Chuang <[email protected]> wrote:
>
> Previous commit 43b7029f475e ("HID: i2c-hid:
> Send power-on command after reset"), it fixed issue for SIS touchscreen.
>
> For ELAN touchscreen, we found our boot code of IC was not flexible enough
> to receive and handle this command.
> Once the FW main code of our controller is crashed for some reason,
> the controller could not be enumerated successfully to be recognized
> by the system host. therefore, it lost touch functionality.
>
> Add quirk for skip send power-on command after reset.
> It will impact to ELAN touchscreen and touchpad on HID over I2C projects.
>
> Signed-off-by: Johnny Chuang <[email protected]>

It's probably a good idea to add a Fixes: tag, like so:

Fixes: 43b7029f475e ("HID: i2c-hid: Send power-on command after reset")

Other than that,

Reviewed-by: Harry Cutts <[email protected]>

Harry Cutts
Chrome OS Touch/Input team

> ---
> Changes in v2:
> - move comment to quirk entry
> ---
> drivers/hid/i2c-hid/i2c-hid-core.c | 10 +++++++++-
> 1 file changed, 9 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/hid/i2c-hid/i2c-hid-core.c b/drivers/hid/i2c-hid/i2c-hid-core.c
> index 9993133..957d865 100644
> --- a/drivers/hid/i2c-hid/i2c-hid-core.c
> +++ b/drivers/hid/i2c-hid/i2c-hid-core.c
> @@ -45,6 +45,7 @@
> #define I2C_HID_QUIRK_BOGUS_IRQ BIT(4)
> #define I2C_HID_QUIRK_RESET_ON_RESUME BIT(5)
> #define I2C_HID_QUIRK_BAD_INPUT_SIZE BIT(6)
> +#define I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET BIT(7)
>
>
> /* flags */
> @@ -178,6 +179,12 @@ static const struct i2c_hid_quirks {
> I2C_HID_QUIRK_RESET_ON_RESUME },
> { USB_VENDOR_ID_ITE, I2C_DEVICE_ID_ITE_LENOVO_LEGION_Y720,
> I2C_HID_QUIRK_BAD_INPUT_SIZE },
> +/*
> + * Sending the wakeup after reset actually break ELAN touchscreen controller
> + * Add I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET to skip wakeup after reset
> + */
> + { USB_VENDOR_ID_ELAN, HID_ANY_ID,
> + I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET },
> { 0, 0 }
> };
>
> @@ -461,7 +468,8 @@ static int i2c_hid_hwreset(struct i2c_client *client)
> }
>
> /* At least some SIS devices need this after reset */
> - ret = i2c_hid_set_power(client, I2C_HID_PWR_ON);
> + if (!(ihid->quirks & I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET))
> + ret = i2c_hid_set_power(client, I2C_HID_PWR_ON);
>
> out_unlock:
> mutex_unlock(&ihid->reset_lock);
> --
> 2.7.4
>