[U-Boot] [PATCH] mx6: gpio: read data register if direction is out

Stefano Babic sbabic at denx.de
Tue Jun 24 15:07:59 CEST 2014


Hi Klaus,

On 23/06/2014 08:35, Klaus Goger wrote:
> 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.
> 

This conflicts with commit :

commit 5dafa4543c399d329c7b01df1afa98437861cac0
Author: Benoît Thébaudeau <benoit.thebaudeau at advansee.com>
Date:   Mon Aug 20 10:55:41 2012 +0000

    mxc: Make gpio_get_value() use PSR


> Signed-off-by: Klaus Goger <klaus.goger at 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(&regs->gpio_dir) >> gpio & 0x01)
> +		val = (readl(&regs->gpio_dr) >> gpio & 0x01);
> +	else
> +		val = (readl(&regs->gpio_psr) >> gpio) & 0x01;
> +#else
>  	val = (readl(&regs->gpio_psr) >> gpio) & 0x01;
> +#endif

According to the documentation, I disagree with you. What I read from
the MX6 manual is:

28.4.2.1 GPIO Read Mode

The programming sequence for reading input signals should be as follows:
1. Configure IOMUX to select GPIO mode (Via IOMUX Controller (IOMUXC) ).
2. Configure GPIO direction register to input (GPIO_GDIR[GDIR] set to 0b).
3. Read value from data register/pad status register.

What you are describing looks an issue in your pinmux configuration
because you do not set the SION bit, as requested to read back the value
of the GPIO from the Pad Register.

I assume that if you read the value from the DR register, you do not
read the current value of the pin, but simply you get what you have
programmed, that could be different if you have a conflict on the pin
itself.

Best regards,
Stefano Babic


-- 
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================


More information about the U-Boot mailing list