Patch "HID: i2c-hid: goodix: Add support for "goodix,no-reset-during-suspend" property" has been added to the 6.4-stable tree

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

 



This is a note to let you know that I've just added the patch titled

    HID: i2c-hid: goodix: Add support for "goodix,no-reset-during-suspend" property

to the 6.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     hid-i2c-hid-goodix-add-support-for-goodix-no-reset-d.patch
and it can be found in the queue-6.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit c493df85647fd95d2d5d31be82ca778295e42832
Author: Fei Shao <fshao@xxxxxxxxxxxx>
Date:   Wed May 24 11:42:37 2023 +0800

    HID: i2c-hid: goodix: Add support for "goodix,no-reset-during-suspend" property
    
    [ Upstream commit 7607f12ba735f04e0ef8718dabadf3a765c9a477 ]
    
    In the beginning, commit 18eeef46d359 ("HID: i2c-hid: goodix: Tie the
    reset line to true state of the regulator") introduced a change to tie
    the reset line of the Goodix touchscreen to the state of the regulator
    to fix a power leakage issue in suspend.
    
    After some time, the change was deemed unnecessary and was reverted in
    commit 557e05fa9fdd ("HID: i2c-hid: goodix: Stop tying the reset line to
    the regulator") due to difficulties in managing regulator notifiers for
    designs like Evoker, which provides a second power rail to touchscreen.
    
    However, the revert caused a power regression on another Chromebook
    device Steelix in the field, which has a dedicated always-on regulator
    for touchscreen and was covered by the workaround in the first commit.
    
    To address both cases, this patch adds the support for the new
    "goodix,no-reset-during-suspend" property in the driver:
    - When set to true, the driver does not assert the reset GPIO during
      power-down.
      Instead, the GPIO will be asserted during power-up to ensure the
      touchscreen always has a clean start and consistent behavior after
      resuming.
      This is for designs with a dedicated always-on regulator.
    - When set to false or unset, the driver uses the original control flow
      and asserts GPIO and disables regulators normally.
      This is for the two-regulator and shared-regulator designs.
    
    Signed-off-by: Fei Shao <fshao@xxxxxxxxxxxx>
    Suggested-by: Douglas Anderson <dianders@xxxxxxxxxxxx>
    Reviewed-by: Douglas Anderson <dianders@xxxxxxxxxxxx>
    Reviewed-by: Jeff LaBundy <jeff@xxxxxxxxxxx>
    Signed-off-by: Jiri Kosina <jkosina@xxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/hid/i2c-hid/i2c-hid-of-goodix.c b/drivers/hid/i2c-hid/i2c-hid-of-goodix.c
index 0060e3dcd775d..db4639db98407 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);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux