gpiolib: Fix of_node inconsistency
authorBiju Das <biju.das@bp.renesas.com>
Mon, 6 Aug 2018 09:48:01 +0000 (10:48 +0100)
committerLinus Walleij <linus.walleij@linaro.org>
Fri, 10 Aug 2018 21:04:27 +0000 (23:04 +0200)
Some platforms are not setting of_node in the driver. On these platforms
defining gpio-reserved-ranges on device tree leads to kernel crash.

It is due to some parts of the gpio core relying on the driver to set up
of_node,while other parts do themselves.This inconsistent behaviour leads
to a crash.

gpiochip_add_data_with_key() calls gpiochip_init_valid_mask() with of_node
as NULL. of_gpiochip_add() fills "of_node" and calls
of_gpiochip_init_valid_mask().

The fix is to move the assignment to chip->of_node from of_gpiochip_add()
to gpiochip_add_data_with_key().

Signed-off-by: Biju Das <biju.das@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpiolib-of.c
drivers/gpio/gpiolib.c

index 28d968088131f433901d3b5b4bee4da8a9002250..91174bf15cf38af850e15a5622c89cbeb36b2bcb 100644 (file)
@@ -620,9 +620,6 @@ int of_gpiochip_add(struct gpio_chip *chip)
 {
        int status;
 
-       if ((!chip->of_node) && (chip->parent))
-               chip->of_node = chip->parent->of_node;
-
        if (!chip->of_node)
                return 0;
 
index 6bfd4e5cc1619152cfd119244894b568b423710d..2c457e60440386b2e05fe5cd37714c959f4bf12f 100644 (file)
@@ -1262,6 +1262,8 @@ int gpiochip_add_data_with_key(struct gpio_chip *chip, void *data,
        /* If the gpiochip has an assigned OF node this takes precedence */
        if (chip->of_node)
                gdev->dev.of_node = chip->of_node;
+       else
+               chip->of_node = gdev->dev.of_node;
 #endif
 
        gdev->id = ida_simple_get(&gpio_ida, 0, 0, GFP_KERNEL);