]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
Input: tsc2004/5 - fix handling of VIO power supply
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Thu, 11 Jul 2024 17:27:12 +0000 (10:27 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Mon, 5 Aug 2024 01:10:40 +0000 (18:10 -0700)
The chip needs to be powered up before calling tsc200x_stop_scan() which
communicates with it; move the call to enable the regulator earlier in
tsc200x_probe().

At the same time switch to using devm_regulator_get_enable() to simplify
error handling. This also makes sure that regulator is not shut off too
early when unbinding the driver.

Link: https://lore.kernel.org/r/20240711172719.1248373-1-dmitry.torokhov@gmail.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/touchscreen/tsc2004.c
drivers/input/touchscreen/tsc2005.c
drivers/input/touchscreen/tsc200x-core.c
drivers/input/touchscreen/tsc200x-core.h

index b673098535ad199e2b80f4fe565d130b17ca3787..787f2caf4f7342ac60144179253ef5dce0cb5e9b 100644 (file)
@@ -42,11 +42,6 @@ static int tsc2004_probe(struct i2c_client *i2c)
                             tsc2004_cmd);
 }
 
-static void tsc2004_remove(struct i2c_client *i2c)
-{
-       tsc200x_remove(&i2c->dev);
-}
-
 static const struct i2c_device_id tsc2004_idtable[] = {
        { "tsc2004" },
        { }
@@ -70,7 +65,6 @@ static struct i2c_driver tsc2004_driver = {
        },
        .id_table       = tsc2004_idtable,
        .probe          = tsc2004_probe,
-       .remove         = tsc2004_remove,
 };
 module_i2c_driver(tsc2004_driver);
 
index 1b40ce0ca1b9910c60a38cd207f8d9de5d16fc57..6fe8b41b3ecc0ac1f401d6a4420329b19942368f 100644 (file)
@@ -64,11 +64,6 @@ static int tsc2005_probe(struct spi_device *spi)
                             tsc2005_cmd);
 }
 
-static void tsc2005_remove(struct spi_device *spi)
-{
-       tsc200x_remove(&spi->dev);
-}
-
 #ifdef CONFIG_OF
 static const struct of_device_id tsc2005_of_match[] = {
        { .compatible = "ti,tsc2005" },
@@ -85,7 +80,6 @@ static struct spi_driver tsc2005_driver = {
                .pm             = pm_sleep_ptr(&tsc200x_pm_ops),
        },
        .probe  = tsc2005_probe,
-       .remove = tsc2005_remove,
 };
 module_spi_driver(tsc2005_driver);
 
index a4c0e9db9bb94d0abb47aadc793d11838033e3c7..39789a27f65b20d3ae54f8fb89e7a19b1fb16cf3 100644 (file)
@@ -104,8 +104,6 @@ struct tsc200x {
 
        bool                    pen_down;
 
-       struct regulator        *vio;
-
        struct gpio_desc        *reset_gpio;
        int                     (*tsc200x_cmd)(struct device *dev, u8 cmd);
        int                     irq;
@@ -495,10 +493,9 @@ int tsc200x_probe(struct device *dev, int irq, const struct input_id *tsc_id,
                return error;
        }
 
-       ts->vio = devm_regulator_get(dev, "vio");
-       if (IS_ERR(ts->vio)) {
-               error = PTR_ERR(ts->vio);
-               dev_err(dev, "error acquiring vio regulator: %d", error);
+       error = devm_regulator_get_enable(dev, "vio");
+       if (error) {
+               dev_err(dev, "error acquiring vio regulator: %d\n", error);
                return error;
        }
 
@@ -554,36 +551,20 @@ int tsc200x_probe(struct device *dev, int irq, const struct input_id *tsc_id,
                return error;
        }
 
-       error = regulator_enable(ts->vio);
-       if (error)
-               return error;
-
        dev_set_drvdata(dev, ts);
 
        error = input_register_device(ts->idev);
        if (error) {
                dev_err(dev,
                        "Failed to register input device, err: %d\n", error);
-               goto disable_regulator;
+               return error;
        }
 
        irq_set_irq_wake(irq, 1);
        return 0;
-
-disable_regulator:
-       regulator_disable(ts->vio);
-       return error;
 }
 EXPORT_SYMBOL_GPL(tsc200x_probe);
 
-void tsc200x_remove(struct device *dev)
-{
-       struct tsc200x *ts = dev_get_drvdata(dev);
-
-       regulator_disable(ts->vio);
-}
-EXPORT_SYMBOL_GPL(tsc200x_remove);
-
 static int tsc200x_suspend(struct device *dev)
 {
        struct tsc200x *ts = dev_get_drvdata(dev);
index 37de91efd78ea3cae52bb785d52c8517e5a9b653..e76ba7a889ddc3ff566a90c0db8d49c1655082aa 100644 (file)
@@ -75,6 +75,5 @@ extern const struct attribute_group *tsc200x_groups[];
 int tsc200x_probe(struct device *dev, int irq, const struct input_id *tsc_id,
                  struct regmap *regmap,
                  int (*tsc200x_cmd)(struct device *dev, u8 cmd));
-void tsc200x_remove(struct device *dev);
 
 #endif