linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] twl4030-gpio: Fix getting the value of the TWL4030 GPIO  output pin
@ 2009-02-07  6:13 Joonyoung Shim
  2009-02-07  8:00 ` David Brownell
  0 siblings, 1 reply; 4+ messages in thread
From: Joonyoung Shim @ 2009-02-07  6:13 UTC (permalink / raw)
  To: Tony Lindgren, David Brownell; +Cc: linux-arm-kernel, linux-kernel, linux-omap

If TWL4030 GPIO pin is output, must read the value from REG_GPIODATAOUTx
register in twl4030_get_gpio_datainout().

Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com>
---

diff --git a/drivers/gpio/twl4030-gpio.c b/drivers/gpio/twl4030-gpio.c
index afad147..890518a 100644
--- a/drivers/gpio/twl4030-gpio.c
+++ b/drivers/gpio/twl4030-gpio.c
@@ -183,7 +183,7 @@ static int twl4030_set_gpio_dataout(int gpio, int enable)
 	return gpio_twl4030_write(base, d_msk);
 }

-static int twl4030_get_gpio_datain(int gpio)
+static int twl4030_get_gpio_datainout(int gpio)
 {
 	u8 d_bnk = gpio >> 3;
 	u8 d_off = gpio & 0x7;
@@ -194,7 +194,17 @@ static int twl4030_get_gpio_datain(int gpio)
 		|| !(gpio_usage_count & BIT(gpio))))
 		return -EPERM;

-	base = REG_GPIODATAIN1 + d_bnk;
+	base = REG_GPIODATADIR1 + d_bnk;
+	ret = gpio_twl4030_read(base);
+	if (ret > 0)
+		ret = (ret >> d_off) & 0x1;
+	else
+		return ret;
+
+	if (ret)
+		base = REG_GPIODATAOUT1 + d_bnk;
+	else
+		base = REG_GPIODATAIN1 + d_bnk;
 	ret = gpio_twl4030_read(base);
 	if (ret > 0)
 		ret = (ret >> d_off) & 0x1;

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

* Re: [PATCH] twl4030-gpio: Fix getting the value of the TWL4030 GPIO  output pin
  2009-02-07  6:13 [PATCH] twl4030-gpio: Fix getting the value of the TWL4030 GPIO output pin Joonyoung Shim
@ 2009-02-07  8:00 ` David Brownell
  2009-02-09 13:02   ` Joonyoung Shim
  0 siblings, 1 reply; 4+ messages in thread
From: David Brownell @ 2009-02-07  8:00 UTC (permalink / raw)
  To: Joonyoung Shim; +Cc: Tony Lindgren, linux-arm-kernel, linux-kernel, linux-omap

On Friday 06 February 2009, Joonyoung Shim wrote:
> If TWL4030 GPIO pin is output, must read the value from REG_GPIODATAOUTx
> register in twl4030_get_gpio_datainout().

Why "must"?  The goal is to return the *actual* value of the pin,
not the intended one.  When an external signal overwhelms the drive
capability of that GPIO -- just a couple mA -- the correct value
to return can't be the value written in the output register.

Plus, this patch won't even link ... you changed the name of the
function at its definition, but not at its use points.

NAK, unless you can show there's a real bug this addresses...

- Dave

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

* Re: [PATCH] twl4030-gpio: Fix getting the value of the TWL4030 GPIO  output pin
  2009-02-07  8:00 ` David Brownell
@ 2009-02-09 13:02   ` Joonyoung Shim
  2009-02-12  2:16     ` David Brownell
  0 siblings, 1 reply; 4+ messages in thread
From: Joonyoung Shim @ 2009-02-09 13:02 UTC (permalink / raw)
  To: David Brownell; +Cc: Tony Lindgren, linux-arm-kernel, linux-kernel, linux-omap

2009/2/7 David Brownell <david-b@pacbell.net>:
> On Friday 06 February 2009, Joonyoung Shim wrote:
>> If TWL4030 GPIO pin is output, must read the value from REG_GPIODATAOUTx
>> register in twl4030_get_gpio_datainout().
>
> Why "must"?  The goal is to return the *actual* value of the pin,
> not the intended one.  When an external signal overwhelms the drive
> capability of that GPIO -- just a couple mA -- the correct value
> to return can't be the value written in the output register.

but, it doesn't return actual value of the pin if twl4030 GPIO pin is output.

For example, the GPIO13 pin of twl4030 is configured as an output
using gpio_direction_output() and assigns the GPIO's value to 1
using gpio_set_value_cansleep(), the result of "# cat /sys/kernel/debug/gpio"
reports to me as follows.

GPIOs 192-209, platform/twl4030_gpio, twl4030, can sleep:
 gpio-205 (keyled              ) out lo

but it should have reported "hi" instead of "lo".


>
> Plus, this patch won't even link ... you changed the name of the
> function at its definition, but not at its use points.

Sorry, i missed some code.

>
> NAK, unless you can show there's a real bug this addresses...
>
> - Dave
>

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

* Re: [PATCH] twl4030-gpio: Fix getting the value of the TWL4030 GPIO  output pin
  2009-02-09 13:02   ` Joonyoung Shim
@ 2009-02-12  2:16     ` David Brownell
  0 siblings, 0 replies; 4+ messages in thread
From: David Brownell @ 2009-02-12  2:16 UTC (permalink / raw)
  To: Joonyoung Shim; +Cc: Tony Lindgren, linux-arm-kernel, linux-kernel, linux-omap

On Monday 09 February 2009, Joonyoung Shim wrote:
> but, it doesn't return actual value of the pin if twl4030 GPIO pin is output.

So it would seem that these GPIOs don't support
bidirectional usage.  Documentation/gpio.txt includes:

>>>		However, note that not all platforms can
>>>	read the value of output pins; those that can't
>>>	should always return zero.  

Which is exactly what's happening here, it seems...




> For example, the GPIO13 pin of twl4030 is configured as an output
> using gpio_direction_output() and assigns the GPIO's value to 1
> using gpio_set_value_cansleep(), the result of "# cat /sys/kernel/debug/gpio"
> reports to me as follows.
> 
> GPIOs 192-209, platform/twl4030_gpio, twl4030, can sleep:
>  gpio-205 (keyled              ) out lo
> 
> but it should have reported "hi" instead of "lo".
> 



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

end of thread, other threads:[~2009-02-12  2:16 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-02-07  6:13 [PATCH] twl4030-gpio: Fix getting the value of the TWL4030 GPIO output pin Joonyoung Shim
2009-02-07  8:00 ` David Brownell
2009-02-09 13:02   ` Joonyoung Shim
2009-02-12  2:16     ` David Brownell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).