gpio: zevio: Get correct gpio output value
authorAxel Lin <axel.lin@ingics.com>
Mon, 7 Apr 2014 23:59:39 +0000 (07:59 +0800)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 28 Apr 2014 19:35:09 +0000 (12:35 -0700)
Read gpio output value from ZEVIO_GPIO_OUTPUT.
The spin_lock is required to ensure the direction is not changed before reading
input/ouput value.

Signed-off-by: Axel Lin <axel.lin@ingics.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpio-zevio.c

index 7184f4577848aadb949375098e3213af627ffde6..6270f755d0ed3d3107b846c1f6dbbcded0ba1d7a 100644 (file)
@@ -81,9 +81,15 @@ static inline void zevio_gpio_port_set(struct zevio_gpio *c, unsigned pin,
 static int zevio_gpio_get(struct gpio_chip *chip, unsigned pin)
 {
        struct zevio_gpio *controller = to_zevio_gpio(chip);
+       u32 val, dir;
 
-       /* Only reading allowed, so no spinlock needed */
-       u32 val = zevio_gpio_port_get(controller, pin, ZEVIO_GPIO_INPUT);
+       spin_lock(&controller->lock);
+       dir = zevio_gpio_port_get(controller, pin, ZEVIO_GPIO_DIRECTION);
+       if (dir & BIT(ZEVIO_GPIO_BIT(pin)))
+               val = zevio_gpio_port_get(controller, pin, ZEVIO_GPIO_INPUT);
+       else
+               val = zevio_gpio_port_get(controller, pin, ZEVIO_GPIO_OUTPUT);
+       spin_unlock(&controller->lock);
 
        return (val >> ZEVIO_GPIO_BIT(pin)) & 0x1;
 }