[PATCH 3/3] gpio: pca953x: add optional support for regulator and reset GPIO

Ahmad Fatoum a.fatoum at pengutronix.de
Tue Mar 7 02:23:20 PST 2023


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 at pengutronix.de>
---
 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




More information about the barebox mailing list