gpio: Propagate all errors in devm_get_gpiod_from_child()
authorGeert Uytterhoeven <geert+renesas@glider.be>
Fri, 19 Feb 2016 10:00:50 +0000 (11:00 +0100)
committerLinus Walleij <linus.walleij@linaro.org>
Thu, 25 Feb 2016 09:04:25 +0000 (10:04 +0100)
devm_get_gpiod_from_child() tries several property suffixes to find a
GPIO descriptor. If all suffixes fail and no probe deferral has been
detected, it returns the error of the last try.

However, if any but the last try fails with a real error (e.g. -EBUSY),
this error is not propagated, and -ENOENT will be returned.
This confuses drivers that e.g. want to detect if a GPIO is already in
use.

To fix this, change the loop logic to continue on -ENOENT, which
indicates the property was not found and the next suffix should be
tried, and propagate all other detected errors.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/devres.c

index 903fcf4d04a06e557bdacdeb69890d0cbf8c8a15..b760cbbb41d824908e1532f384de8c447b16b603 100644 (file)
@@ -155,7 +155,7 @@ struct gpio_desc *devm_get_gpiod_from_child(struct device *dev,
                                                               suffixes[i]);
 
                desc = fwnode_get_named_gpiod(child, prop_name);
-               if (!IS_ERR(desc) || (PTR_ERR(desc) == -EPROBE_DEFER))
+               if (!IS_ERR(desc) || (PTR_ERR(desc) != -ENOENT))
                        break;
        }
        if (IS_ERR(desc)) {