Commit 2f06996d authored by Lin, Meng-Bo's avatar Lin, Meng-Bo Committed by Dmitry Torokhov

Input: cyttsp5 - add handling for vddio regulator

The Cypress touchscreen controllers are often used with external pull-up
for the interrupt line and the I2C lines, so we might need to enable
a regulator to bring the lines into usable state. Otherwise, this might
cause spurious interrupts and reading from I2C will fail.

Implement support for a "vddio-supply" that is enabled by the cyttsp5
driver so that the regulator gets enabled when needed.
Signed-off-by: default avatarLin, Meng-Bo <linmengbo0689@protonmail.com>
Acked-by: default avatarAlistair Francis <alistair@alistair23.me>
Link: https://lore.kernel.org/r/20221117190507.87535-3-linmengbo0689@protonmail.comSigned-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent fade5a92
...@@ -207,7 +207,7 @@ struct cyttsp5 { ...@@ -207,7 +207,7 @@ struct cyttsp5 {
int num_prv_rec; int num_prv_rec;
struct regmap *regmap; struct regmap *regmap;
struct touchscreen_properties prop; struct touchscreen_properties prop;
struct regulator *vdd; struct regulator_bulk_data supplies[2];
}; };
/* /*
...@@ -817,7 +817,7 @@ static void cyttsp5_cleanup(void *data) ...@@ -817,7 +817,7 @@ static void cyttsp5_cleanup(void *data)
{ {
struct cyttsp5 *ts = data; struct cyttsp5 *ts = data;
regulator_disable(ts->vdd); regulator_bulk_disable(ARRAY_SIZE(ts->supplies), ts->supplies);
} }
static int cyttsp5_probe(struct device *dev, struct regmap *regmap, int irq, static int cyttsp5_probe(struct device *dev, struct regmap *regmap, int irq,
...@@ -840,9 +840,12 @@ static int cyttsp5_probe(struct device *dev, struct regmap *regmap, int irq, ...@@ -840,9 +840,12 @@ static int cyttsp5_probe(struct device *dev, struct regmap *regmap, int irq,
init_completion(&ts->cmd_done); init_completion(&ts->cmd_done);
/* Power up the device */ /* Power up the device */
ts->vdd = devm_regulator_get(dev, "vdd"); ts->supplies[0].supply = "vdd";
if (IS_ERR(ts->vdd)) { ts->supplies[1].supply = "vddio";
error = PTR_ERR(ts->vdd); error = devm_regulator_bulk_get(dev, ARRAY_SIZE(ts->supplies),
ts->supplies);
if (error) {
dev_err(ts->dev, "Failed to get regulators, error %d\n", error);
return error; return error;
} }
...@@ -850,9 +853,11 @@ static int cyttsp5_probe(struct device *dev, struct regmap *regmap, int irq, ...@@ -850,9 +853,11 @@ static int cyttsp5_probe(struct device *dev, struct regmap *regmap, int irq,
if (error) if (error)
return error; return error;
error = regulator_enable(ts->vdd); error = regulator_bulk_enable(ARRAY_SIZE(ts->supplies), ts->supplies);
if (error) if (error) {
dev_err(ts->dev, "Failed to enable regulators, error %d\n", error);
return error; return error;
}
ts->input = devm_input_allocate_device(dev); ts->input = devm_input_allocate_device(dev);
if (!ts->input) { if (!ts->input) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment