[PATCH] led: gpio: Use NOP uclass driver for top-level node

Marek Vasut marex at denx.de
Fri Apr 22 15:34:00 CEST 2022


The top level DT node of gpio-leds is not a LED itself, bind NOP uclass
driver to it, and bind different LED uclass driver to its subnodes which
represent the actual LEDs. This simplifies the probe() implementation
and fixes the bogus top-level not-an-LED in 'led list' command output:

```
=> led list
led             Error -121 <--- This is removed/fixed by this patch
green:user0     off
```

Signed-off-by: Marek Vasut <marex at denx.de>
Cc: Patrice Chotard <patrice.chotard at foss.st.com>
Cc: Patrick Delaunay <patrick.delaunay at foss.st.com>
Cc: Sean Anderson <seanga2 at gmail.com>
Cc: Simon Glass <sjg at chromium.org>
Cc: Steven Lawrance <steven.lawrance at softathome.com>
---
 drivers/led/led_gpio.c | 30 +++++++++++++-----------------
 1 file changed, 13 insertions(+), 17 deletions(-)

diff --git a/drivers/led/led_gpio.c b/drivers/led/led_gpio.c
index 23156907593..fbed151b5d9 100644
--- a/drivers/led/led_gpio.c
+++ b/drivers/led/led_gpio.c
@@ -58,17 +58,8 @@ static enum led_state_t gpio_led_get_state(struct udevice *dev)
 static int led_gpio_probe(struct udevice *dev)
 {
 	struct led_gpio_priv *priv = dev_get_priv(dev);
-	int ret;
-
-	/* Ignore the top-level LED node */
-	if (device_is_compatible(dev, "gpio-leds"))
-		return 0;
-
-	ret = gpio_request_by_name(dev, "gpios", 0, &priv->gpio, GPIOD_IS_OUT);
-	if (ret)
-		return ret;
 
-	return 0;
+	return gpio_request_by_name(dev, "gpios", 0, &priv->gpio, GPIOD_IS_OUT);
 }
 
 static int led_gpio_remove(struct udevice *dev)
@@ -109,18 +100,23 @@ static const struct led_ops gpio_led_ops = {
 	.get_state	= gpio_led_get_state,
 };
 
-static const struct udevice_id led_gpio_ids[] = {
-	{ .compatible = "gpio-leds" },
-	{ }
-};
-
 U_BOOT_DRIVER(led_gpio) = {
 	.name	= "gpio_led",
 	.id	= UCLASS_LED,
-	.of_match = led_gpio_ids,
 	.ops	= &gpio_led_ops,
 	.priv_auto	= sizeof(struct led_gpio_priv),
-	.bind	= led_gpio_bind,
 	.probe	= led_gpio_probe,
 	.remove	= led_gpio_remove,
 };
+
+static const struct udevice_id led_gpio_ids[] = {
+	{ .compatible = "gpio-leds" },
+	{ }
+};
+
+U_BOOT_DRIVER(led_gpio_wrap) = {
+	.name	= "gpio_led_wrap",
+	.id	= UCLASS_NOP,
+	.of_match = led_gpio_ids,
+	.bind	= led_gpio_bind,
+};
-- 
2.35.1



More information about the U-Boot mailing list