Patch "Input: elants_i2c - properly handle the reset GPIO when power is off" has been added to the 4.19-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

    Input: elants_i2c - properly handle the reset GPIO when power is off

to the 4.19-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:
     input-elants_i2c-properly-handle-the-reset-gpio-when.patch
and it can be found in the queue-4.19 subdirectory.

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



commit 342c26c36923388adaf4ba2cffdf95d46b385636
Author: Douglas Anderson <dianders@xxxxxxxxxxxx>
Date:   Thu Nov 17 21:49:19 2022 -0800

    Input: elants_i2c - properly handle the reset GPIO when power is off
    
    [ Upstream commit a85fbd6498441694475716a4d5c65f9d3e073faf ]
    
    As can be seen in elants_i2c_power_off(), we want the reset GPIO
    asserted when power is off. The reset GPIO is active low so we need
    the reset line logic low when power is off to avoid leakage.
    
    We have a problem, though, at probe time. At probe time we haven't
    powered the regulators on yet but we have:
    
      devm_gpiod_get(&client->dev, "reset", GPIOD_OUT_LOW);
    
    While that _looks_ right, it turns out that it's not. The
    GPIOD_OUT_LOW doesn't mean to init the GPIO to low. It means init the
    GPIO to "not asserted". Since this is an active low GPIO that inits it
    to be high.
    
    Let's fix this to properly init the GPIO. Now after both probe and
    power off the state of the GPIO is consistent (it's "asserted" or
    level low).
    
    Once we fix this, we can see that at power on time we no longer to
    assert the reset GPIO as the first thing. The reset GPIO is _always_
    asserted before powering on. Let's fix powering on to account for
    this.
    
    Fixes: afe10358e47a ("Input: elants_i2c - wire up regulator support")
    Signed-off-by: Douglas Anderson <dianders@xxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20221117123805.1.I9959ac561dd6e1e8e1ce7085e4de6167b27c574f@changeid
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/input/touchscreen/elants_i2c.c b/drivers/input/touchscreen/elants_i2c.c
index adfae2d88707..83e9bded87d9 100644
--- a/drivers/input/touchscreen/elants_i2c.c
+++ b/drivers/input/touchscreen/elants_i2c.c
@@ -1082,14 +1082,12 @@ static int elants_i2c_power_on(struct elants_data *ts)
 	if (IS_ERR_OR_NULL(ts->reset_gpio))
 		return 0;
 
-	gpiod_set_value_cansleep(ts->reset_gpio, 1);
-
 	error = regulator_enable(ts->vcc33);
 	if (error) {
 		dev_err(&ts->client->dev,
 			"failed to enable vcc33 regulator: %d\n",
 			error);
-		goto release_reset_gpio;
+		return error;
 	}
 
 	error = regulator_enable(ts->vccio);
@@ -1098,7 +1096,7 @@ static int elants_i2c_power_on(struct elants_data *ts)
 			"failed to enable vccio regulator: %d\n",
 			error);
 		regulator_disable(ts->vcc33);
-		goto release_reset_gpio;
+		return error;
 	}
 
 	/*
@@ -1107,7 +1105,6 @@ static int elants_i2c_power_on(struct elants_data *ts)
 	 */
 	udelay(ELAN_POWERON_DELAY_USEC);
 
-release_reset_gpio:
 	gpiod_set_value_cansleep(ts->reset_gpio, 0);
 	if (error)
 		return error;
@@ -1215,7 +1212,7 @@ static int elants_i2c_probe(struct i2c_client *client,
 		return error;
 	}
 
-	ts->reset_gpio = devm_gpiod_get(&client->dev, "reset", GPIOD_OUT_LOW);
+	ts->reset_gpio = devm_gpiod_get(&client->dev, "reset", GPIOD_OUT_HIGH);
 	if (IS_ERR(ts->reset_gpio)) {
 		error = PTR_ERR(ts->reset_gpio);
 



[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