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 <[email protected]>
---
 drivers/gpio/gpio-zevio.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/gpio/gpio-zevio.c b/drivers/gpio/gpio-zevio.c
index 9bf5034..29b0150 100644
--- a/drivers/gpio/gpio-zevio.c
+++ b/drivers/gpio/gpio-zevio.c
@@ -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;
 }
-- 
1.8.3.2



--
To unsubscribe from this list: send the line "unsubscribe linux-gpio" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to