public inbox for linux-omap@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] gpio: twl4030: Correct status reporting when the GPIO is used as output
@ 2012-12-05  9:49 Peter Ujfalusi
  2012-12-05 22:48 ` Grant Likely
  0 siblings, 1 reply; 3+ messages in thread
From: Peter Ujfalusi @ 2012-12-05  9:49 UTC (permalink / raw)
  To: Grant Likely, Linus Walleij; +Cc: linux-kernel, linux-omap

When the GPIO is configured as output we need to read the GPIODATAOUT*
register to get correct information. When the GPIO is output the GPIODATAIN*
registers report 0 all the time (no feedback from output path).

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
---
 drivers/gpio/gpio-twl4030.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/gpio/gpio-twl4030.c b/drivers/gpio/gpio-twl4030.c
index 55b4fe4..e7aa620 100644
--- a/drivers/gpio/gpio-twl4030.c
+++ b/drivers/gpio/gpio-twl4030.c
@@ -191,13 +191,19 @@ static int twl4030_get_gpio_datain(int gpio)
 	u8 d_bnk = gpio >> 3;
 	u8 d_off = gpio & 0x7;
 	u8 base = 0;
+	int direction;
 	int ret = 0;
 
 	if (unlikely((gpio >= TWL4030_GPIO_MAX)
 		|| !(gpio_usage_count & BIT(gpio))))
 		return -EPERM;
 
-	base = REG_GPIODATAIN1 + d_bnk;
+	direction = gpio_twl4030_read(REG_GPIODATADIR1 + d_bnk);
+	if (direction > 0 && (direction >> d_off) & 0x1)
+		base = REG_SETGPIODATAOUT1 + d_bnk;
+	else
+		base = REG_GPIODATAIN1 + d_bnk;
+
 	ret = gpio_twl4030_read(base);
 	if (ret > 0)
 		ret = (ret >> d_off) & 0x1;
-- 
1.8.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] gpio: twl4030: Correct status reporting when the GPIO is used as output
  2012-12-05  9:49 [PATCH] gpio: twl4030: Correct status reporting when the GPIO is used as output Peter Ujfalusi
@ 2012-12-05 22:48 ` Grant Likely
  2012-12-06 10:55   ` Peter Ujfalusi
  0 siblings, 1 reply; 3+ messages in thread
From: Grant Likely @ 2012-12-05 22:48 UTC (permalink / raw)
  To: Peter Ujfalusi, Linus Walleij; +Cc: linux-kernel, linux-omap

On Wed, 5 Dec 2012 10:49:45 +0100, Peter Ujfalusi <peter.ujfalusi@ti.com> wrote:
> When the GPIO is configured as output we need to read the GPIODATAOUT*
> register to get correct information. When the GPIO is output the GPIODATAIN*
> registers report 0 all the time (no feedback from output path).
> 
> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
> ---
>  drivers/gpio/gpio-twl4030.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpio/gpio-twl4030.c b/drivers/gpio/gpio-twl4030.c
> index 55b4fe4..e7aa620 100644
> --- a/drivers/gpio/gpio-twl4030.c
> +++ b/drivers/gpio/gpio-twl4030.c
> @@ -191,13 +191,19 @@ static int twl4030_get_gpio_datain(int gpio)
>  	u8 d_bnk = gpio >> 3;
>  	u8 d_off = gpio & 0x7;
>  	u8 base = 0;
> +	int direction;
>  	int ret = 0;
>  
>  	if (unlikely((gpio >= TWL4030_GPIO_MAX)
>  		|| !(gpio_usage_count & BIT(gpio))))
>  		return -EPERM;
>  
> -	base = REG_GPIODATAIN1 + d_bnk;
> +	direction = gpio_twl4030_read(REG_GPIODATADIR1 + d_bnk);
> +	if (direction > 0 && (direction >> d_off) & 0x1)
> +		base = REG_SETGPIODATAOUT1 + d_bnk;
> +	else
> +		base = REG_GPIODATAIN1 + d_bnk;
> +

This is probably quite expensive considering that reads need to go out
the i2c bus. Things like the output state and the pin direction should
be cached by the driver in its private data structure so that you don't
add an additional i2c round trip.

g.


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] gpio: twl4030: Correct status reporting when the GPIO is used as output
  2012-12-05 22:48 ` Grant Likely
@ 2012-12-06 10:55   ` Peter Ujfalusi
  0 siblings, 0 replies; 3+ messages in thread
From: Peter Ujfalusi @ 2012-12-06 10:55 UTC (permalink / raw)
  To: Grant Likely; +Cc: Linus Walleij, linux-kernel, linux-omap

On 12/05/2012 11:48 PM, Grant Likely wrote:
>> -	base = REG_GPIODATAIN1 + d_bnk;
>> +	direction = gpio_twl4030_read(REG_GPIODATADIR1 + d_bnk);
>> +	if (direction > 0 && (direction >> d_off) & 0x1)
>> +		base = REG_SETGPIODATAOUT1 + d_bnk;
>> +	else
>> +		base = REG_GPIODATAIN1 + d_bnk;
>> +
> 
> This is probably quite expensive considering that reads need to go out
> the i2c bus. Things like the output state and the pin direction should
> be cached by the driver in its private data structure so that you don't
> add an additional i2c round trip.

True. I have sent the v2, which grown a bit since I did not wanted to add more
global variable to this driver.

-- 
Péter
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2012-12-06 10:55 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-12-05  9:49 [PATCH] gpio: twl4030: Correct status reporting when the GPIO is used as output Peter Ujfalusi
2012-12-05 22:48 ` Grant Likely
2012-12-06 10:55   ` Peter Ujfalusi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox