Accept partial 'gpio-line-names' property.
authorChristophe Blaess <christophe.blaess@logilin.fr>
Fri, 28 Sep 2018 13:38:43 +0000 (15:38 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 1 Oct 2018 11:15:06 +0000 (13:15 +0200)
Documentation/devicetree/bindings/gpio/gpio.txt says: "The names are
assigned starting from line offset 0 from left to right from the
passed array. An incomplete array (where the number of passed named
are less than ngpios) will still be used up until the last provided
valid line index". This patch makes it actually work this way.

Signed-off-by: Christophe Blaess <christophe.blaess@logilin.fr>
Signed-off-by: Patrick Boettcher <p@yai.se>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpiolib-devprop.c

index 43443b2c32a85ddbb5cc1a749715b281f9915748..dd517098ab9529df69ed4d5c7ca6af5b299ee813 100644 (file)
@@ -29,32 +29,29 @@ void devprop_gpiochip_set_names(struct gpio_chip *chip,
        struct gpio_device *gdev = chip->gpiodev;
        const char **names;
        int ret, i;
+       int count;
 
-       ret = fwnode_property_read_string_array(fwnode, "gpio-line-names",
-                                               NULL, 0);
-       if (ret < 0)
+       count = fwnode_property_read_string_array(fwnode, "gpio-line-names",
+                                                 NULL, 0);
+       if (count < 0)
                return;
 
-       if (ret != gdev->ngpio) {
-               dev_warn(&gdev->dev,
-                        "names %d do not match number of GPIOs %d\n", ret,
-                        gdev->ngpio);
-               return;
-       }
+       if (count > gdev->ngpio)
+               count = gdev->ngpio;
 
-       names = kcalloc(gdev->ngpio, sizeof(*names), GFP_KERNEL);
+       names = kcalloc(count, sizeof(*names), GFP_KERNEL);
        if (!names)
                return;
 
        ret = fwnode_property_read_string_array(fwnode, "gpio-line-names",
-                                               names, gdev->ngpio);
+                                               names, count);
        if (ret < 0) {
                dev_warn(&gdev->dev, "failed to read GPIO line names\n");
                kfree(names);
                return;
        }
 
-       for (i = 0; i < gdev->ngpio; i++)
+       for (i = 0; i < count; i++)
                gdev->descs[i].name = names[i];
 
        kfree(names);