mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-29 22:02:02 +00:00
i2c: muxes: pca954x: Add regulator support
Add a vdd regulator and enable it for boards that have the mux powered off by default. Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com> Reviewed-by: Andi Shyti <andi.shyti@kernel.org> Acked-by: Peter Rosin <peda@axentia.se> Signed-off-by: Wolfram Sang <wsa@kernel.org>
This commit is contained in:
parent
81694437b6
commit
6c30ac917a
1 changed files with 23 additions and 5 deletions
|
@ -48,6 +48,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <dt-bindings/mux/mux.h>
|
||||
|
@ -100,6 +101,7 @@ struct pca954x {
|
|||
struct irq_domain *irq;
|
||||
unsigned int irq_mask;
|
||||
raw_spinlock_t lock;
|
||||
struct regulator *supply;
|
||||
};
|
||||
|
||||
/* Provide specs for the MAX735x, PCA954x and PCA984x types we know about */
|
||||
|
@ -447,6 +449,8 @@ static void pca954x_cleanup(struct i2c_mux_core *muxc)
|
|||
struct pca954x *data = i2c_mux_priv(muxc);
|
||||
int c, irq;
|
||||
|
||||
regulator_disable(data->supply);
|
||||
|
||||
if (data->irq) {
|
||||
for (c = 0; c < data->chip->nchans; c++) {
|
||||
irq = irq_find_mapping(data->irq, c);
|
||||
|
@ -499,10 +503,22 @@ static int pca954x_probe(struct i2c_client *client)
|
|||
i2c_set_clientdata(client, muxc);
|
||||
data->client = client;
|
||||
|
||||
data->supply = devm_regulator_get(dev, "vdd");
|
||||
if (IS_ERR(data->supply))
|
||||
return dev_err_probe(dev, PTR_ERR(data->supply),
|
||||
"Failed to request regulator\n");
|
||||
|
||||
ret = regulator_enable(data->supply);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret,
|
||||
"Failed to enable vdd supply\n");
|
||||
|
||||
/* Reset the mux if a reset GPIO is specified. */
|
||||
gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
|
||||
if (IS_ERR(gpio))
|
||||
return PTR_ERR(gpio);
|
||||
if (IS_ERR(gpio)) {
|
||||
ret = PTR_ERR(gpio);
|
||||
goto fail_cleanup;
|
||||
}
|
||||
if (gpio) {
|
||||
udelay(1);
|
||||
gpiod_set_value_cansleep(gpio, 0);
|
||||
|
@ -519,7 +535,7 @@ static int pca954x_probe(struct i2c_client *client)
|
|||
|
||||
ret = i2c_get_device_id(client, &id);
|
||||
if (ret && ret != -EOPNOTSUPP)
|
||||
return ret;
|
||||
goto fail_cleanup;
|
||||
|
||||
if (!ret &&
|
||||
(id.manufacturer_id != data->chip->id.manufacturer_id ||
|
||||
|
@ -527,7 +543,8 @@ static int pca954x_probe(struct i2c_client *client)
|
|||
dev_warn(dev, "unexpected device id %03x-%03x-%x\n",
|
||||
id.manufacturer_id, id.part_id,
|
||||
id.die_revision);
|
||||
return -ENODEV;
|
||||
ret = -ENODEV;
|
||||
goto fail_cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -546,7 +563,8 @@ static int pca954x_probe(struct i2c_client *client)
|
|||
ret = pca954x_init(client, data);
|
||||
if (ret < 0) {
|
||||
dev_warn(dev, "probe failed\n");
|
||||
return -ENODEV;
|
||||
ret = -ENODEV;
|
||||
goto fail_cleanup;
|
||||
}
|
||||
|
||||
ret = pca954x_irq_setup(muxc);
|
||||
|
|
Loading…
Reference in a new issue