button: gpio: handle broken controller
authorCaleb Connolly <caleb.connolly@linaro.org>
Wed, 13 Nov 2024 04:59:24 +0000 (05:59 +0100)
committerTom Rini <trini@konsulko.com>
Wed, 4 Dec 2024 20:06:23 +0000 (14:06 -0600)
Avoid crashing U-Boot when the GPIO controller for a button is disabled
or failed to probe. We also need to check the priv data for each button
since even if a button fails to probe it will still be polled by the
core code.

Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
drivers/button/button-gpio.c

index 43b82d9..31b85c8 100644 (file)
@@ -20,6 +20,9 @@ static enum button_state_t button_gpio_get_state(struct udevice *dev)
        struct button_gpio_priv *priv = dev_get_priv(dev);
        int ret;
 
+       if (!priv)
+               return -ENODATA;
+
        if (!dm_gpio_is_valid(&priv->gpio))
                return -EREMOTEIO;
        ret = dm_gpio_get_value(&priv->gpio);
@@ -32,6 +35,8 @@ static enum button_state_t button_gpio_get_state(struct udevice *dev)
 static int button_gpio_get_code(struct udevice *dev)
 {
        struct button_gpio_priv *priv = dev_get_priv(dev);
+       if (!priv)
+               return -ENODATA;
        int code = priv->linux_code;
 
        if (!code)
@@ -51,7 +56,7 @@ static int button_gpio_probe(struct udevice *dev)
                return 0;
 
        ret = gpio_request_by_name(dev, "gpios", 0, &priv->gpio, GPIOD_IS_IN);
-       if (ret)
+       if (ret || !dm_gpio_is_valid(&priv->gpio))
                return ret;
 
        ret = dev_read_u32(dev, "linux,code", &priv->linux_code);
@@ -98,6 +103,8 @@ static int button_gpio_bind(struct udevice *parent)
                        return ret;
                uc_plat = dev_get_uclass_plat(dev);
                uc_plat->label = label;
+               debug("Button '%s' bound to driver '%s'\n", label,
+                     dev->driver->name);
        }
 
        return 0;