linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/1] gpio: mmio: Fix bgpio_get_set & bgpio_get_set_multiple
@ 2019-04-01  9:09 Jan Kotas
  2019-04-04 16:50 ` Linus Walleij
  0 siblings, 1 reply; 2+ messages in thread
From: Jan Kotas @ 2019-04-01  9:09 UTC (permalink / raw)
  To: linus.walleij, bgolaszewski; +Cc: linux-gpio, linux-kernel, Jan Kotas

During my regression testing I noticed the cadence GPIO driver
fails on the latest gpio for-next tree.

I think the reason is this patch:
commit 96cd559817f2 ("Merge branch 'devel' into for-next")

Here is a part of the test log:

Loopback 8 -> 24
TESTING: gpio: 488: output direction PASSED
TESTING: gpio: 504: input direction PASSED
TESTING: gpio: 488: 0 PASSED
TESTING: gpio: 488 -> 504: 0 PASSED
TESTING: gpio: 488: 1 FAILED
TESTING: gpio: 488 -> 504: 1 FAILED
TESTING: gpio: 488: 0 PASSED
TESTING: gpio: 488 -> 504: 0 PASSED

It looks like the issue is that gc->bgpio_dir has changed its meaning.
It used to be set to the register value (so it was being inverted).

Now it's always set to 1 for output and 0 for input.
However the bgpio_get_set functions were not updated.
So they invert the bit again, which means a wrong register
is being accessed.

This patch fixes that by removing the unnecessary inversion.

Signed-off-by: Jan Kotas <jank@cadence.com>
---
 drivers/gpio/gpio-mmio.c | 21 ++-------------------
 1 file changed, 2 insertions(+), 19 deletions(-)

diff --git a/drivers/gpio/gpio-mmio.c b/drivers/gpio/gpio-mmio.c
index f172b4382d..04be18b954 100644
--- a/drivers/gpio/gpio-mmio.c
+++ b/drivers/gpio/gpio-mmio.c
@@ -134,17 +134,6 @@ static int bgpio_get_set(struct gpio_chip *gc, unsigned int gpio)
 	unsigned long pinmask = bgpio_line2mask(gc, gpio);
 	bool dir = !!(gc->bgpio_dir & pinmask);
 
-	/*
-	 * If the direction is OUT we read the value from the SET
-	 * register, and if the direction is IN we read the value
-	 * from the DAT register.
-	 *
-	 * If the direction bits are inverted, naturally this gets
-	 * inverted too.
-	 */
-	if (gc->bgpio_dir_inverted)
-		dir = !dir;
-
 	if (dir)
 		return !!(gc->read_reg(gc->reg_set) & pinmask);
 	else
@@ -164,14 +153,8 @@ static int bgpio_get_set_multiple(struct gpio_chip *gc, unsigned long *mask,
 	/* Make sure we first clear any bits that are zero when we read the register */
 	*bits &= ~*mask;
 
-	/* Exploit the fact that we know which directions are set */
-	if (gc->bgpio_dir_inverted) {
-		set_mask = *mask & ~gc->bgpio_dir;
-		get_mask = *mask & gc->bgpio_dir;
-	} else {
-		set_mask = *mask & gc->bgpio_dir;
-		get_mask = *mask & ~gc->bgpio_dir;
-	}
+	set_mask = *mask & gc->bgpio_dir;
+	get_mask = *mask & ~gc->bgpio_dir;
 
 	if (set_mask)
 		*bits |= gc->read_reg(gc->reg_set) & set_mask;
-- 
2.15.0


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

* Re: [PATCH 1/1] gpio: mmio: Fix bgpio_get_set & bgpio_get_set_multiple
  2019-04-01  9:09 [PATCH 1/1] gpio: mmio: Fix bgpio_get_set & bgpio_get_set_multiple Jan Kotas
@ 2019-04-04 16:50 ` Linus Walleij
  0 siblings, 0 replies; 2+ messages in thread
From: Linus Walleij @ 2019-04-04 16:50 UTC (permalink / raw)
  To: Jan Kotas; +Cc: Bartosz Golaszewski, open list:GPIO SUBSYSTEM, linux-kernel

On Mon, Apr 1, 2019 at 4:10 PM Jan Kotas <jank@cadence.com> wrote:

> During my regression testing I noticed the cadence GPIO driver
> fails on the latest gpio for-next tree.
>
> I think the reason is this patch:
> commit 96cd559817f2 ("Merge branch 'devel' into for-next")
>
> Here is a part of the test log:
>
> Loopback 8 -> 24
> TESTING: gpio: 488: output direction PASSED
> TESTING: gpio: 504: input direction PASSED
> TESTING: gpio: 488: 0 PASSED
> TESTING: gpio: 488 -> 504: 0 PASSED
> TESTING: gpio: 488: 1 FAILED
> TESTING: gpio: 488 -> 504: 1 FAILED
> TESTING: gpio: 488: 0 PASSED
> TESTING: gpio: 488 -> 504: 0 PASSED
>
> It looks like the issue is that gc->bgpio_dir has changed its meaning.
> It used to be set to the register value (so it was being inverted).
>
> Now it's always set to 1 for output and 0 for input.
> However the bgpio_get_set functions were not updated.
> So they invert the bit again, which means a wrong register
> is being accessed.
>
> This patch fixes that by removing the unnecessary inversion.
>
> Signed-off-by: Jan Kotas <jank@cadence.com>

Patch applied!

Yours,
Linus Walleij

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

end of thread, other threads:[~2019-04-04 16:50 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-04-01  9:09 [PATCH 1/1] gpio: mmio: Fix bgpio_get_set & bgpio_get_set_multiple Jan Kotas
2019-04-04 16:50 ` Linus Walleij

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).