gpio: omap: implement get_direction
authorYegor Yefremov <yegorslists@googlemail.com>
Thu, 24 Apr 2014 06:57:39 +0000 (08:57 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 28 Apr 2014 19:35:10 +0000 (12:35 -0700)
This patch implements gpio_chip's get_direction() routine, that
lets other drivers get particular GPIOs direction using
struct gpio_desc.

Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
Acked-by: Javier Martinez Canillas <javier@dowhile0.org>
Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Tested-by: Tony Lindgren <tony@atomide.com>
Reviewed-by: Kevin Hilman <khilman@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpio-omap.c

index 8cc9e91e7e4e8ffe480ca4ec1d9a1bd2182185dd..47c6056fe850018985c4c8423810be8621ef3d2c 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/of_device.h>
 #include <linux/irqchip/chained_irq.h>
 #include <linux/gpio.h>
+#include <linux/bitops.h>
 #include <linux/platform_data/gpio-omap.h>
 
 #define OFF_MODE       1
@@ -927,6 +928,21 @@ static inline void mpuio_init(struct gpio_bank *bank)
 
 /*---------------------------------------------------------------------*/
 
+static int gpio_get_direction(struct gpio_chip *chip, unsigned offset)
+{
+       struct gpio_bank *bank;
+       unsigned long flags;
+       void __iomem *reg;
+       int dir;
+
+       bank = container_of(chip, struct gpio_bank, chip);
+       reg = bank->base + bank->regs->direction;
+       spin_lock_irqsave(&bank->lock, flags);
+       dir = !!(readl_relaxed(reg) & BIT(offset));
+       spin_unlock_irqrestore(&bank->lock, flags);
+       return dir;
+}
+
 static int gpio_input(struct gpio_chip *chip, unsigned offset)
 {
        struct gpio_bank *bank;
@@ -1085,6 +1101,7 @@ static int omap_gpio_chip_init(struct gpio_bank *bank)
         */
        bank->chip.request = omap_gpio_request;
        bank->chip.free = omap_gpio_free;
+       bank->chip.get_direction = gpio_get_direction;
        bank->chip.direction_input = gpio_input;
        bank->chip.get = gpio_get;
        bank->chip.direction_output = gpio_output;