gpio: zevio: Get correct gpio output value
[deliverable/linux.git] / drivers / gpio / gpio-zevio.c
index 9bf5034b6cdb61bc14f85fc98b090690190eaaa1..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;
 }
@@ -209,7 +215,7 @@ static struct platform_driver zevio_gpio_driver = {
        .driver         = {
                .name   = "gpio-zevio",
                .owner  = THIS_MODULE,
-               .of_match_table = of_match_ptr(zevio_gpio_of_match),
+               .of_match_table = zevio_gpio_of_match,
        },
        .probe          = zevio_gpio_probe,
 };
This page took 0.023722 seconds and 5 git commands to generate.