[PATCH 2/3] gpio: fix null pointer exception when there is no oftree

Lucas Stach l.stach at pengutronix.de
Thu Jul 6 05:46:20 PDT 2017


Am Mittwoch, den 05.07.2017, 20:33 +0200 schrieb Sam Ravnborg:
> From d10f426e1b8cec7de257dabf59e7fe53a591b3c1 Mon Sep 17 00:00:00 2001
> From: Sam Ravnborg <srn at skov.dk>
> Date: Mon, 3 Jul 2017 22:07:41 +0200
> Subject: [PATCH 2/3] gpio: fix null pointer exception when there is no oftree
> 
> In a system with oftree support enabled but with no oftree the
> of_gpiochip_scan_hogs() would fail due to device_node equals NULL.
> 
> Check device_node and return with 0 in this situation, as this
> mirrors what would have happened before we added support for gpio-hogs.
> 
> Use IS_ENABLED(CONFIG_OFDEVICE) to teach compiler to leave
> out the of_* specific functions if not needed.
> 
> Fixes: 37e6bee7 ("gpiolib: Add support for GPIO "hog" nodes")
> Signed-off-by: Alexander Kurz <akurz at blala.de>
> Signed-off-by: Sam Ravnborg <sam at ravnborg.org>
> ---
>  drivers/gpio/gpiolib.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
> index a3e17ada0..2bd8ef2a8 100644
> --- a/drivers/gpio/gpiolib.c
> +++ b/drivers/gpio/gpiolib.c
> @@ -379,6 +379,9 @@ static int of_gpiochip_scan_hogs(struct gpio_chip *chip)
>  	struct device_node *np;
>  	int ret, i;
>  
> +	if (!chip->dev->device_node)
> +		return 0;
> +
>  	for_each_available_child_of_node(chip->dev->device_node, np) {
>  		if (!of_property_read_bool(np, "gpio-hog"))
>  			continue;
> @@ -416,7 +419,10 @@ int gpiochip_add(struct gpio_chip *chip)
>  	for (i = chip->base; i < chip->base + chip->ngpio; i++)
>  		gpio_desc[i].chip = chip;
>  
> -	return of_gpiochip_scan_hogs(chip);
> +	if (IS_ENABLED(CONFIG_OFDEVICE))
> +		return of_gpiochip_scan_hogs(chip);
> +	else
> +		return 0;
>  }
>  
>  void gpiochip_remove(struct gpio_chip *chip)

I think this can be simplified to:

diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index a3e17ada0d39..1a373ef149a5 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -379,6 +379,9 @@ static int of_gpiochip_scan_hogs(struct gpio_chip
*chip)
        struct device_node *np;
        int ret, i;

+       if (!IS_ENABLED(CONFIG_OFDEVICE) || !chip->dev->device_node)
+               return 0;
+
        for_each_available_child_of_node(chip->dev->device_node, np) {
                if (!of_property_read_bool(np, "gpio-hog"))
                        continue;

The optimizer should be able to work this out. Can you check that this
works for you? No need to resend, if it works I'll just commit this.

Regards,
Lucas




More information about the barebox mailing list