Message ID | 20230524114233.RESEND.v4.2.I424e840ae6de3cdbd67394cf4efd24534f6434ba@changeid |
---|---|
State | Accepted |
Commit | 7607f12ba735f04e0ef8718dabadf3a765c9a477 |
Headers | show |
Series | [RESEND,v4,1/2] dt-bindings: input: goodix: Add "goodix,no-reset-during-suspend" property | expand |
Hi Jiri On Tue, May 23, 2023 at 8:45 PM Fei Shao <fshao@chromium.org> wrote: > > These changes are based on the series in [1], which modified the > i2c-hid-of-goodix driver and removed the workaround for a power leakage > issue, so the issue revisits on Mediatek MT8186 boards (Steelix). > > The root cause is that the touchscreen can be powered in different ways > depending on the hardware designs, and it's not as easy to come up with > a solution that is both simple and elegant for all the known designs. > > To address the issue, I ended up adding a new boolean property for the > driver so that we can control the power up/down sequence depending on > that. > > Adding a new property might not be the cleanest approach for this, but > at least the intention would be easy enough to understand, and it > introduces relatively small change to the code and fully preserves the > original control flow. > > [1] https://lore.kernel.org/all/20230207024816.525938-1-dianders@chromium.org/ > > Changes in v4: > - Rebase on top of next-20230523 > - Collect the review tags > - Minor coding style improvement > > Changes in v3: > - In power-down, only skip the GPIO but not the regulator calls if the > flag is set > > Changes in v2: > - Use a more accurate property name and with "goodix," prefix > - Drop the change to regulator_enable logic during power-up > > Fei Shao (2): > dt-bindings: input: goodix: Add "goodix,no-reset-during-suspend" > property > HID: i2c-hid: goodix: Add support for "goodix,no-reset-during-suspend" > property > > .../bindings/input/goodix,gt7375p.yaml | 9 +++++++++ > drivers/hid/i2c-hid/i2c-hid-of-goodix.c | 16 +++++++++++++++- > 2 files changed, 24 insertions(+), 1 deletion(-) Just confirming that you're good to land these two patches as discussed previously [1]. Thanks! :-) [1] https://lore.kernel.org/r/nycvar.YFH.7.76.2305231510270.29760@cbobk.fhfr.pm
On Wed, 24 May 2023, Fei Shao wrote: > These changes are based on the series in [1], which modified the > i2c-hid-of-goodix driver and removed the workaround for a power leakage > issue, so the issue revisits on Mediatek MT8186 boards (Steelix). > > The root cause is that the touchscreen can be powered in different ways > depending on the hardware designs, and it's not as easy to come up with > a solution that is both simple and elegant for all the known designs. > > To address the issue, I ended up adding a new boolean property for the > driver so that we can control the power up/down sequence depending on > that. > > Adding a new property might not be the cleanest approach for this, but > at least the intention would be easy enough to understand, and it > introduces relatively small change to the code and fully preserves the > original control flow. Please apologize the delay. Now applied.
diff --git a/drivers/hid/i2c-hid/i2c-hid-of-goodix.c b/drivers/hid/i2c-hid/i2c-hid-of-goodix.c index 0060e3dcd775..db4639db9840 100644 --- a/drivers/hid/i2c-hid/i2c-hid-of-goodix.c +++ b/drivers/hid/i2c-hid/i2c-hid-of-goodix.c @@ -28,6 +28,7 @@ struct i2c_hid_of_goodix { struct regulator *vdd; struct regulator *vddio; struct gpio_desc *reset_gpio; + bool no_reset_during_suspend; const struct goodix_i2c_hid_timing_data *timings; }; @@ -37,6 +38,14 @@ static int goodix_i2c_hid_power_up(struct i2chid_ops *ops) container_of(ops, struct i2c_hid_of_goodix, ops); int ret; + /* + * We assert reset GPIO here (instead of during power-down) to ensure + * the device will have a clean state after powering up, just like the + * normal scenarios will have. + */ + if (ihid_goodix->no_reset_during_suspend) + gpiod_set_value_cansleep(ihid_goodix->reset_gpio, 1); + ret = regulator_enable(ihid_goodix->vdd); if (ret) return ret; @@ -60,7 +69,9 @@ static void goodix_i2c_hid_power_down(struct i2chid_ops *ops) struct i2c_hid_of_goodix *ihid_goodix = container_of(ops, struct i2c_hid_of_goodix, ops); - gpiod_set_value_cansleep(ihid_goodix->reset_gpio, 1); + if (!ihid_goodix->no_reset_during_suspend) + gpiod_set_value_cansleep(ihid_goodix->reset_gpio, 1); + regulator_disable(ihid_goodix->vddio); regulator_disable(ihid_goodix->vdd); } @@ -91,6 +102,9 @@ static int i2c_hid_of_goodix_probe(struct i2c_client *client) if (IS_ERR(ihid_goodix->vddio)) return PTR_ERR(ihid_goodix->vddio); + ihid_goodix->no_reset_during_suspend = + of_property_read_bool(client->dev.of_node, "goodix,no-reset-during-suspend"); + ihid_goodix->timings = device_get_match_data(&client->dev); return i2c_hid_core_probe(client, &ihid_goodix->ops, 0x0001, 0);