gpio: drop lock before reading GPIO direction
authorLinus Walleij <linus.walleij@linaro.org>
Mon, 30 May 2016 15:11:59 +0000 (17:11 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 30 May 2016 15:11:59 +0000 (17:11 +0200)
When adding the gpiochip, the GPIO HW drivers' callback get_direction()
could get called in atomic context. Some of the GPIO HW drivers may
sleep when accessing the register.

Move the lock before initializing the descriptors.

Reported-by: Laxman Dewangan <ldewangan@nvidia.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpiolib.c

index 246b6b051b0d79f6f5547a8a541ba79b9f8086af..24f60d28f0c055dbddfcd2750737534071813d26 100644 (file)
@@ -629,6 +629,8 @@ int gpiochip_add_data(struct gpio_chip *chip, void *data)
                goto err_free_label;
        }
 
+       spin_unlock_irqrestore(&gpio_lock, flags);
+
        for (i = 0; i < chip->ngpio; i++) {
                struct gpio_desc *desc = &gdev->descs[i];
 
@@ -660,8 +662,6 @@ int gpiochip_add_data(struct gpio_chip *chip, void *data)
                }
        }
 
-       spin_unlock_irqrestore(&gpio_lock, flags);
-
 #ifdef CONFIG_PINCTRL
        INIT_LIST_HEAD(&gdev->pin_ranges);
 #endif