gpiolib: Move of_node operations to gpiolib-of and correct fwnode use
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Tue, 9 Mar 2021 09:37:33 +0000 (11:37 +0200)
committerBartosz Golaszewski <bgolaszewski@baylibre.com>
Fri, 26 Mar 2021 13:56:18 +0000 (14:56 +0100)
The initial value of the OF node based on presence of parent, but
at the same time this operation somehow appeared separately from others
that handle the OF case. On the other hand there is no need to assign
dev->fwnode in the OF case if code properly retrieves fwnode, i.e.
via dev_fwnode() helper.

Amend gpiolib.c and gpiolib-of.c code in order to group OF operations.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
drivers/gpio/gpiolib-of.c
drivers/gpio/gpiolib.c

index baf0153b7bca3f150af5b129453b5f6e284f6d2c..bbcc7c073f631c7ce5b8435e0d231aa62dcbf341 100644 (file)
@@ -1042,11 +1042,13 @@ void of_gpiochip_remove(struct gpio_chip *chip)
 
 void of_gpio_dev_init(struct gpio_chip *gc, struct gpio_device *gdev)
 {
+       /* Set default OF node to parent's one if present */
+       if (gc->parent)
+               gdev->dev.of_node = gc->parent->of_node;
+
        /* If the gpiochip has an assigned OF node this takes precedence */
        if (gc->of_node)
                gdev->dev.of_node = gc->of_node;
        else
                gc->of_node = gdev->dev.of_node;
-       if (gdev->dev.of_node)
-               gdev->dev.fwnode = of_fwnode_handle(gdev->dev.of_node);
 }
index 14d79c166124fb9237c75739c40afadfc382c123..90ead10bc0869e2ed2e09c637d8dd8e6780de068 100644 (file)
@@ -586,12 +586,9 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data,
        if (!gdev)
                return -ENOMEM;
        gdev->dev.bus = &gpio_bus_type;
+       gdev->dev.parent = gc->parent;
        gdev->chip = gc;
        gc->gpiodev = gdev;
-       if (gc->parent) {
-               gdev->dev.parent = gc->parent;
-               gdev->dev.of_node = gc->parent->of_node;
-       }
 
        of_gpio_dev_init(gc, gdev);
 
@@ -4218,11 +4215,13 @@ EXPORT_SYMBOL_GPL(gpiod_put_array);
 
 static int gpio_bus_match(struct device *dev, struct device_driver *drv)
 {
+       struct fwnode_handle *fwnode = dev_fwnode(dev);
+
        /*
         * Only match if the fwnode doesn't already have a proper struct device
         * created for it.
         */
-       if (dev->fwnode && dev->fwnode->dev != dev)
+       if (fwnode && fwnode->dev != dev)
                return 0;
        return 1;
 }