devicetree.vger.kernel.org archive mirror
 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,
	jesse.sung@canonical.com, isaac.true@canonical.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>,
	stable@vger.kernel.org,
	Lech Perczak <lech.perczak@camlingroup.com>
Subject: [PATCH v8 07/10] serial: sc16is7xx: fix bug when first setting GPIO direction
Date: Wed,  7 Jun 2023 10:05:21 -0400	[thread overview]
Message-ID: <20230607140525.833982-8-hugo@hugovil.com> (raw)
In-Reply-To: <20230607140525.833982-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")
Cc: <stable@vger.kernel.org>
Signed-off-by: Hugo Villeneuve <hvilleneuve@dimonoff.com>
Reviewed-by: Lech Perczak <lech.perczak@camlingroup.com>
Tested-by: Lech Perczak <lech.perczak@camlingroup.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 11edbebe8fa2..98c520ef4a02 100644
--- a/drivers/tty/serial/sc16is7xx.c
+++ b/drivers/tty/serial/sc16is7xx.c
@@ -1342,9 +1342,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-06-07 14:05 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-06-07 14:05 [PATCH v8 00/10] serial: sc16is7xx: fix GPIO regression and rs485 improvements Hugo Villeneuve
2023-06-07 14:05 ` [PATCH v8 01/10] serial: sc16is7xx: fix broken port 0 uart init Hugo Villeneuve
2023-06-07 14:05 ` [PATCH v8 02/10] serial: sc16is7xx: mark IOCONTROL register as volatile Hugo Villeneuve
2023-06-07 14:05 ` [PATCH v8 03/10] serial: sc16is7xx: remove obsolete out_thread label Hugo Villeneuve
2023-06-07 14:05 ` [PATCH v8 04/10] serial: sc16is7xx: refactor GPIO controller registration Hugo Villeneuve
2023-06-07 14:05 ` [PATCH v8 05/10] dt-bindings: sc16is7xx: Add property to change GPIO function Hugo Villeneuve
2023-06-07 14:30   ` Krzysztof Kozlowski
2023-06-07 14:41     ` Hugo Villeneuve
2023-06-07 14:46       ` Krzysztof Kozlowski
2023-06-07 14:52         ` Hugo Villeneuve
2023-06-07 14:57           ` Krzysztof Kozlowski
2023-06-07 15:09             ` Hugo Villeneuve
2023-06-07 14:05 ` [PATCH v8 06/10] serial: sc16is7xx: fix regression with GPIO configuration Hugo Villeneuve
2023-06-07 14:05 ` Hugo Villeneuve [this message]
2023-06-07 14:05 ` [PATCH v8 08/10] serial: sc16is7xx: add call to get rs485 DT flags and properties Hugo Villeneuve
2023-06-07 14:05 ` [PATCH v8 09/10] serial: sc16is7xx: add post reset delay Hugo Villeneuve
2023-06-07 14:05 ` [PATCH v8 10/10] serial: sc16is7xx: improve comments about variants Hugo Villeneuve
2023-06-12 12:10 ` [PATCH v8 00/10] serial: sc16is7xx: fix GPIO regression and rs485 improvements Lech Perczak
2023-06-12 13:40   ` 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=20230607140525.833982-8-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=isaac.true@canonical.com \
    --cc=jesse.sung@canonical.com \
    --cc=jirislaby@kernel.org \
    --cc=jringle@gridpoint.com \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=l.perczak@camlintechnologies.com \
    --cc=lech.perczak@camlingroup.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=stable@vger.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;
as well as URLs for NNTP newsgroup(s).