
On i.MX6 GPIOx_PSR does not reflect the current output value if the direction is set to output. Instead we should read GPIOx_DR.
Signed-off-by: Klaus Goger klaus.goger@theobroma-systems.com --- drivers/gpio/mxc_gpio.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/drivers/gpio/mxc_gpio.c b/drivers/gpio/mxc_gpio.c index 6a572d5..5838fc2 100644 --- a/drivers/gpio/mxc_gpio.c +++ b/drivers/gpio/mxc_gpio.c @@ -101,8 +101,16 @@ int gpio_get_value(unsigned gpio) gpio &= 0x1f;
regs = (struct gpio_regs *)gpio_ports[port]; - +#if defined(CONFIG_MX6) + /* if the direction is set to output we will always read 0 as pad status. + * so we have to read the data register to get the current output state */ + if (readl(®s->gpio_dir) >> gpio & 0x01) + val = (readl(®s->gpio_dr) >> gpio & 0x01); + else + val = (readl(®s->gpio_psr) >> gpio) & 0x01; +#else val = (readl(®s->gpio_psr) >> gpio) & 0x01; +#endif
return val; }