浏览代码

gpio: zevio: Get correct gpio output value

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>
Axel Lin 11 年之前
父节点
当前提交
ef7de2625f
共有 1 个文件被更改,包括 8 次插入2 次删除
  1. 8 2
      drivers/gpio/gpio-zevio.c

+ 8 - 2
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)
 static int zevio_gpio_get(struct gpio_chip *chip, unsigned pin)
 {
 {
 	struct zevio_gpio *controller = to_zevio_gpio(chip);
 	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;
 	return (val >> ZEVIO_GPIO_BIT(pin)) & 0x1;
 }
 }