Traditionally, pca953x have a Power-On Reset mechanism that activates once supply voltage rises over threshold. Newer chips additionally feature a reset input. Add support for both. To not break existing boards, we will ignore failure to claim GPIO or regulator, even if it's just probe deferral. Boards wanting to make use of the newly parsed DT properties should enable deep probe. Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> --- drivers/gpio/gpio-pca953x.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c index 2a1822ef3bcc..2fafa0325663 100644 --- a/drivers/gpio/gpio-pca953x.c +++ b/drivers/gpio/gpio-pca953x.c @@ -12,6 +12,8 @@ #include <common.h> #include <malloc.h> #include <driver.h> +#include <gpiod.h> +#include <regulator.h> #include <xfuncs.h> #include <errno.h> #include <i2c/i2c.h> @@ -414,7 +416,8 @@ static int pca953x_probe(struct device *dev) unsigned long driver_data; struct pca953x_platform_data *pdata; struct pca953x_chip *chip; - int ret; + struct regulator *reg; + int reset_gpio, ret; u32 invert = 0; chip = xzalloc(sizeof(struct pca953x_chip)); @@ -437,6 +440,20 @@ static int pca953x_probe(struct device *dev) chip->client = client; + reset_gpio = gpiod_get(dev, "reset", GPIOD_OUT_LOW); + if (!gpio_is_valid(reset_gpio) && reset_gpio != -ENOENT) + dev_warn(dev, "Failed to get 'reset' GPIO (ignored)\n"); + + reg = regulator_get(dev, "vcc"); + if (IS_ERR(reg)) { + dev_warn(dev, "Failed to get 'vcc' regulator (ignored).\n"); + reg = NULL; + } + + ret = regulator_enable(reg); + if (ret) + return dev_err_probe(dev, ret, "failed to enable register\n"); + chip->chip_type = driver_data & (PCA953X_TYPE | PCA957X_TYPE); /* initialize cached registers from their original values. -- 2.30.2