[PATCH v2] gpio: 74x164: use dev_read_* APIs for live-tree compatibility

Chanhong Jung happycpu at gmail.com
Wed Apr 22 16:05:38 CEST 2026


With CONFIG_OF_LIVE=y, dev_of_offset(dev) does not return a valid
flat-FDT offset, so fdtdec_get_int(gd->fdt_blob, offset, ...) inside
gen_74x164_probe() fails to locate the "registers-number" property and
always falls back to the default value of 1. This results in a 4-chip
74HC595 daisy chain being exposed as only 8 GPIOs instead of 32, and
any consumer referencing offsets >= 8 fails to bind with -ENOENT
("GPIO ... not found" / Error -22).

The "registers-default" property is ignored for the same reason, so
any configured power-on output pattern is silently discarded.

Replace the flat-FDT helpers with dev_read_u32_default() and
dev_read_u8_array_ptr(), which correctly walk both live and flat
trees. This matches how other DM GPIO drivers (e.g. pca953x_gpio.c)
read their per-device properties.

With gd->fdt_blob no longer referenced, also drop the now-unused
DECLARE_GLOBAL_DATA_PTR and <asm/global_data.h> include.

Tested on stm32mp153d-ssonic (CONFIG_OF_LIVE=y) with a 4-chip 74HC595
chain: all 32 GPIOs are now exposed, and 16 consumer LED nodes at
offsets 0..31 bind successfully.

Fixes: 9300f711baac ("dm: gpio: introduce 74x164 driver")
Signed-off-by: Chanhong Jung <happycpu at gmail.com>
Reviewed-by: Simon Glass <sjg at chromium.org>
---
 drivers/gpio/74x164_gpio.c | 17 ++++++-----------
 1 file changed, 6 insertions(+), 11 deletions(-)

diff --git a/drivers/gpio/74x164_gpio.c b/drivers/gpio/74x164_gpio.c
index 331428ccd..de2926894 100644
--- a/drivers/gpio/74x164_gpio.c
+++ b/drivers/gpio/74x164_gpio.c
@@ -10,17 +10,13 @@
 
 #include <errno.h>
 #include <dm.h>
-#include <fdtdec.h>
 #include <malloc.h>
-#include <asm/global_data.h>
 #include <asm/gpio.h>
 #include <asm/io.h>
 #include <dm/device_compat.h>
 #include <dt-bindings/gpio/gpio.h>
 #include <spi.h>
 
-DECLARE_GLOBAL_DATA_PTR;
-
 /*
  * struct gen_74x164_chip - Data for 74Hx164
  *
@@ -127,11 +123,9 @@ static int gen_74x164_probe(struct udevice *dev)
 {
 	struct gen_74x164_priv *priv = dev_get_priv(dev);
 	struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
+	const u8 *defaults;
 	char *str, name[32];
 	int ret;
-	const void *fdt = gd->fdt_blob;
-	int node = dev_of_offset(dev);
-
 	snprintf(name, sizeof(name), "%s_", dev->name);
 	str = strdup(name);
 	if (!str)
@@ -141,16 +135,17 @@ static int gen_74x164_probe(struct udevice *dev)
 	 * See Linux kernel:
 	 * Documentation/devicetree/bindings/gpio/gpio-74x164.txt
 	 */
-	priv->nregs = fdtdec_get_int(fdt, node, "registers-number", 1);
+	priv->nregs = dev_read_u32_default(dev, "registers-number", 1);
 	priv->buffer = calloc(priv->nregs, sizeof(u8));
 	if (!priv->buffer) {
 		ret = -ENOMEM;
 		goto free_str;
 	}
 
-	ret = fdtdec_get_byte_array(fdt, node, "registers-default",
-				    priv->buffer, priv->nregs);
-	if (ret)
+	defaults = dev_read_u8_array_ptr(dev, "registers-default", priv->nregs);
+	if (defaults)
+		memcpy(priv->buffer, defaults, priv->nregs);
+	else
 		dev_dbg(dev, "No registers-default property\n");
 
 	ret = gpio_request_by_name(dev, "oe-gpios", 0, &priv->oe,
-- 
2.34.1



More information about the U-Boot mailing list