gpiolib: request the gpio before querying its direction
authorTimur Tabi <timur@codeaurora.org>
Thu, 27 Jul 2017 18:19:23 +0000 (13:19 -0500)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 14 Aug 2017 13:01:12 +0000 (15:01 +0200)
Before querying a GPIO to determine its direction, the GPIO should be
formally requested.  This allows the GPIO driver to block access to
unavailable GPIOs, which makes it easier for some drivers to support
sparse GPIO maps.

Signed-off-by: Timur Tabi <timur@codeaurora.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpiolib.c

index cd003b74512f692e2ec67eca68bd1f4d80db0e39..bd90737dce77a3f5d8d1e4986f65abd18d84783b 100644 (file)
@@ -1201,6 +1201,14 @@ int gpiochip_add_data(struct gpio_chip *chip, void *data)
                struct gpio_desc *desc = &gdev->descs[i];
 
                desc->gdev = gdev;
+
+               if (chip->request) {
+                       status = chip->request(chip, i);
+                       if (status < 0)
+                               /* The GPIO is unavailable, so skip it */
+                               continue;
+               }
+
                /*
                 * REVISIT: most hardware initializes GPIOs as inputs
                 * (often with pullups enabled) so power usage is
@@ -1226,6 +1234,9 @@ int gpiochip_add_data(struct gpio_chip *chip, void *data)
                         */
                        set_bit(FLAG_IS_OUT, &desc->flags);
                }
+
+               if (chip->free)
+                       chip->free(chip, i);
        }
 
 #ifdef CONFIG_PINCTRL