Message ID | 20210509223416.346104-3-linus.walleij@linaro.org |
---|---|
State | New |
Headers | show |
Series | [1/3,v5] Input: cyttsp - Convert bindings to YAML and extend | expand |
Hi Linus, On Mon, May 10, 2021 at 12:34:16AM +0200, Linus Walleij wrote: > The CYTTSP TMA340 chips have two supplies: VCPIN and > VDD for analog and digital voltage respectively. > Add some minimal code to obtain and enable these > regulators if need be. > > Reviewed-by: Javier Martinez Canillas <javier@dowhile0.org> > Signed-off-by: Linus Walleij <linus.walleij@linaro.org> > --- > ChangeLog v3->v5: > - Rebase on v5.13-rc1 > ChangeLog v1->v3: > - Collect Javier's reviewed-by. > --- > drivers/input/touchscreen/cyttsp_core.c | 30 +++++++++++++++++++++++-- > drivers/input/touchscreen/cyttsp_core.h | 2 ++ > 2 files changed, 30 insertions(+), 2 deletions(-) > > diff --git a/drivers/input/touchscreen/cyttsp_core.c b/drivers/input/touchscreen/cyttsp_core.c > index 106dd4962785..5af4d034b36b 100644 > --- a/drivers/input/touchscreen/cyttsp_core.c > +++ b/drivers/input/touchscreen/cyttsp_core.c > @@ -22,6 +22,7 @@ > #include <linux/slab.h> > #include <linux/property.h> > #include <linux/gpio/consumer.h> > +#include <linux/regulator/consumer.h> > > #include "cyttsp_core.h" > > @@ -628,6 +629,19 @@ struct cyttsp *cyttsp_probe(const struct cyttsp_bus_ops *bus_ops, > ts->bus_ops = bus_ops; > ts->irq = irq; > > + /* > + * VCPIN is the analog voltage supply > + * VDD is the digital voltage supply > + */ > + ts->regulators[0].supply = "vcpin"; > + ts->regulators[1].supply = "vdd"; > + error = devm_regulator_bulk_get(dev, ARRAY_SIZE(ts->regulators), > + ts->regulators); > + if (error) { > + dev_err(dev, "Failed to get regulators: %d\n", error); > + return ERR_PTR(error); > + } > + > ts->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); > if (IS_ERR(ts->reset_gpio)) { > error = PTR_ERR(ts->reset_gpio); > @@ -673,20 +687,32 @@ struct cyttsp *cyttsp_probe(const struct cyttsp_bus_ops *bus_ops, > return ERR_PTR(error); > } > > + error = regulator_bulk_enable(ARRAY_SIZE(ts->regulators), > + ts->regulators); > + if (error) { > + dev_err(dev, "Cannot enable regulators: %d\n", error); > + return ERR_PTR(error); > + } Please use devm_add_action_or_reset() to inject code disabling regulators on error or remove() into devm sequence, otherwise we are leaving regulators on. Thanks. -- Dmitry
diff --git a/drivers/input/touchscreen/cyttsp_core.c b/drivers/input/touchscreen/cyttsp_core.c index 106dd4962785..5af4d034b36b 100644 --- a/drivers/input/touchscreen/cyttsp_core.c +++ b/drivers/input/touchscreen/cyttsp_core.c @@ -22,6 +22,7 @@ #include <linux/slab.h> #include <linux/property.h> #include <linux/gpio/consumer.h> +#include <linux/regulator/consumer.h> #include "cyttsp_core.h" @@ -628,6 +629,19 @@ struct cyttsp *cyttsp_probe(const struct cyttsp_bus_ops *bus_ops, ts->bus_ops = bus_ops; ts->irq = irq; + /* + * VCPIN is the analog voltage supply + * VDD is the digital voltage supply + */ + ts->regulators[0].supply = "vcpin"; + ts->regulators[1].supply = "vdd"; + error = devm_regulator_bulk_get(dev, ARRAY_SIZE(ts->regulators), + ts->regulators); + if (error) { + dev_err(dev, "Failed to get regulators: %d\n", error); + return ERR_PTR(error); + } + ts->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); if (IS_ERR(ts->reset_gpio)) { error = PTR_ERR(ts->reset_gpio); @@ -673,20 +687,32 @@ struct cyttsp *cyttsp_probe(const struct cyttsp_bus_ops *bus_ops, return ERR_PTR(error); } + error = regulator_bulk_enable(ARRAY_SIZE(ts->regulators), + ts->regulators); + if (error) { + dev_err(dev, "Cannot enable regulators: %d\n", error); + return ERR_PTR(error); + } + cyttsp_hard_reset(ts); error = cyttsp_power_on(ts); if (error) - return ERR_PTR(error); + goto err_dis_reg; error = input_register_device(input_dev); if (error) { dev_err(ts->dev, "failed to register input device: %d\n", error); - return ERR_PTR(error); + goto err_dis_reg; } return ts; + +err_dis_reg: + regulator_bulk_disable(ARRAY_SIZE(ts->regulators), + ts->regulators); + return ERR_PTR(error); } EXPORT_SYMBOL_GPL(cyttsp_probe); diff --git a/drivers/input/touchscreen/cyttsp_core.h b/drivers/input/touchscreen/cyttsp_core.h index 9bc4fe7e6ac5..8eba9d8ba74a 100644 --- a/drivers/input/touchscreen/cyttsp_core.h +++ b/drivers/input/touchscreen/cyttsp_core.h @@ -23,6 +23,7 @@ #include <linux/types.h> #include <linux/device.h> #include <linux/input/cyttsp.h> +#include <linux/regulator/consumer.h> #define CY_NUM_RETRY 16 /* max number of retries for read ops */ @@ -122,6 +123,7 @@ struct cyttsp { enum cyttsp_state state; bool suspended; + struct regulator_bulk_data regulators[2]; struct gpio_desc *reset_gpio; bool use_hndshk; u8 act_dist;