mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Hugo Villeneuve <hugo@hugovil.com>
To: gregkh@linuxfoundation.org, robh+dt@kernel.org,
	krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org,
	jirislaby@kernel.org, jringle@gridpoint.com,
	l.perczak@camlintechnologies.com, tomasz.mon@camlingroup.com
Cc: linux-serial@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, hugo@hugovil.com,
	linux-gpio@vger.kernel.org,
	Hugo Villeneuve <hvilleneuve@dimonoff.com>
Subject: [PATCH v4 4/9] serial: sc16is7xx: fix bug when first setting GPIO direction
Date: Mon, 29 May 2023 10:07:06 -0400	[thread overview]
Message-ID: <20230529140711.896830-5-hugo@hugovil.com> (raw)
In-Reply-To: <20230529140711.896830-1-hugo@hugovil.com>

From: Hugo Villeneuve <hvilleneuve@dimonoff.com>

When configuring a pin as an output pin with a value of logic 0, we
end up as having a value of logic 1 on the output pin. Setting a
logic 0 a second time (or more) after that will correctly output a
logic 0 on the output pin.

By default, all GPIO pins are configured as inputs. When we enter
sc16is7xx_gpio_direction_output() for the first time, we first set the
desired value in IOSTATE, and then we configure the pin as an output.
The datasheet states that writing to IOSTATE register will trigger a
transfer of the value to the I/O pin configured as output, so if the
pin is configured as an input, nothing will be transferred.

Therefore, set the direction first in IODIR, and then set the desired
value in IOSTATE.

This is what is done in NXP application note AN10587.

Fixes: dfeae619d781 ("serial: sc16is7xx")
Signed-off-by: Hugo Villeneuve <hvilleneuve@dimonoff.com>
---
 drivers/tty/serial/sc16is7xx.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c
index fdf18add1c49..06be1daa733a 100644
--- a/drivers/tty/serial/sc16is7xx.c
+++ b/drivers/tty/serial/sc16is7xx.c
@@ -1343,9 +1343,18 @@ static int sc16is7xx_gpio_direction_output(struct gpio_chip *chip,
 		state |= BIT(offset);
 	else
 		state &= ~BIT(offset);
-	sc16is7xx_port_write(port, SC16IS7XX_IOSTATE_REG, state);
+
+	/*
+	 * If we write IOSTATE first, and then IODIR, the output value is not
+	 * transferred to the corresponding I/O pin.
+	 * The datasheet states that each register bit will be transferred to
+	 * the corresponding I/O pin programmed as output when writing to
+	 * IOSTATE. Therefore, configure direction first with IODIR, and then
+	 * set value after with IOSTATE.
+	 */
 	sc16is7xx_port_update(port, SC16IS7XX_IODIR_REG, BIT(offset),
 			      BIT(offset));
+	sc16is7xx_port_write(port, SC16IS7XX_IOSTATE_REG, state);
 
 	return 0;
 }
-- 
2.30.2


  parent reply	other threads:[~2023-05-29 14:08 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-29 14:07 [PATCH v4 0/9] serial: sc16is7xx: fix GPIO regression and rs485 improvements Hugo Villeneuve
2023-05-29 14:07 ` [PATCH v4 1/9] serial: sc16is7xx: mark IOCONTROL register as volatile Hugo Villeneuve
2023-05-29 14:07 ` [PATCH v4 2/9] serial: sc16is7xx: add post reset delay Hugo Villeneuve
2023-05-29 14:07 ` [PATCH v4 3/9] serial: sc16is7xx: fix broken port 0 uart init Hugo Villeneuve
2023-05-29 14:07 ` Hugo Villeneuve [this message]
2023-05-29 14:07 ` [PATCH v4 5/9] serial: sc16is7xx: refactor GPIO controller registration Hugo Villeneuve
2023-05-29 14:07 ` [PATCH v4 6/9] dt-bindings: sc16is7xx: Add property to change GPIO function Hugo Villeneuve
2023-05-29 14:16   ` Conor Dooley
2023-05-29 14:26     ` Hugo Villeneuve
2023-05-29 18:09       ` Conor Dooley
2023-05-29 18:19   ` Conor Dooley
2023-05-29 18:33     ` Hugo Villeneuve
2023-05-29 14:07 ` [PATCH v4 7/9] serial: sc16is7xx: fix regression with GPIO configuration Hugo Villeneuve
2023-05-29 16:10   ` Ilpo Järvinen
2023-05-29 22:38   ` andy.shevchenko
2023-05-30 15:36     ` Hugo Villeneuve
2023-05-30 21:56       ` Andy Shevchenko
2023-05-31 13:57         ` Hugo Villeneuve
2023-05-31 23:57         ` Hugo Villeneuve
2023-06-01  9:24           ` Andy Shevchenko
2023-05-30 10:25   ` Greg KH
2023-05-30 16:25     ` Hugo Villeneuve
2023-05-29 14:07 ` [PATCH v4 8/9] serial: sc16is7xx: add call to get rs485 DT flags and properties Hugo Villeneuve
2023-05-29 14:07 ` [PATCH v4 9/9] serial: sc16is7xx: improve comments about variants Hugo Villeneuve
2023-05-29 22:31 ` [PATCH v4 0/9] serial: sc16is7xx: fix GPIO regression and rs485 improvements andy.shevchenko
2023-05-30  2:07   ` Hugo Villeneuve
2023-05-30 11:15     ` andy.shevchenko
2023-05-30 15:41       ` Hugo Villeneuve
2023-05-29 22:40 ` andy.shevchenko
2023-05-30  9:30 ` Lech Perczak
2023-05-30 13:08   ` Hugo Villeneuve
2023-05-31 10:43     ` Lech Perczak
2023-05-31 13:56       ` Hugo Villeneuve
2023-05-31 15:00         ` Hugo Villeneuve

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230529140711.896830-5-hugo@hugovil.com \
    --to=hugo@hugovil.com \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=hvilleneuve@dimonoff.com \
    --cc=jirislaby@kernel.org \
    --cc=jringle@gridpoint.com \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=l.perczak@camlintechnologies.com \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-serial@vger.kernel.org \
    --cc=robh+dt@kernel.org \
    --cc=tomasz.mon@camlingroup.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®