Linux-Serial Archive on lore.kernel.org
 help / color / Atom feed
* [PATCH v3 0/2] Implement support for inverted serial TX/RX on i.MX
@ 2020-02-12 16:35 George Hilliard
  2020-02-12 16:35 ` [PATCH v3 1/2] dt-bindings: serial: document fsl,inverted-tx and -rx options George Hilliard
  2020-02-12 16:35 ` [PATCH v3 2/2] tty: imx serial: Implement support for reversing TX and RX polarity George Hilliard
  0 siblings, 2 replies; 5+ messages in thread
From: George Hilliard @ 2020-02-12 16:35 UTC (permalink / raw)
  To: Greg Kroah-Hartman
  Cc: George Hilliard, linux-serial, devicetree, NXP Linux Team, kernel

This peripheral has dedicated control bits that flip input/output
signals before handing them off to the OS.  This is useful on my
hardware because the UART is connected to an RS-422 transceiver with the
+/- pins hooked up backward.  Instead of a hack flipping all the bits
before sending them, the hardware can do it for free.

Revision 3 sets *and* clears the bit as necessary during startup.  It
also moves init before transmit is enabled.

George Hilliard (2):
  dt-bindings: serial: document fsl,inverted-tx and -rx options
  tty: imx serial: Implement support for reversing TX and RX polarity

 .../bindings/serial/fsl-imx-uart.txt          |  4 +++
 drivers/tty/serial/imx.c                      | 29 +++++++++++++++----
 2 files changed, 27 insertions(+), 6 deletions(-)

-- 
2.25.0


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

* [PATCH v3 1/2] dt-bindings: serial: document fsl,inverted-tx and -rx options
  2020-02-12 16:35 [PATCH v3 0/2] Implement support for inverted serial TX/RX on i.MX George Hilliard
@ 2020-02-12 16:35 ` George Hilliard
  2020-02-18 23:07   ` Rob Herring
  2020-02-12 16:35 ` [PATCH v3 2/2] tty: imx serial: Implement support for reversing TX and RX polarity George Hilliard
  1 sibling, 1 reply; 5+ messages in thread
From: George Hilliard @ 2020-02-12 16:35 UTC (permalink / raw)
  To: Greg Kroah-Hartman
  Cc: George Hilliard, linux-serial, devicetree, NXP Linux Team, kernel

Add a description for the new fsl,inverted-tx and fsl,inverted-rx
options for the i.MX UART peripheral.

Signed-off-by: George Hilliard <ghilliard@kopismobile.com>
---
v1..v2: Removed confidentiality spam

 Documentation/devicetree/bindings/serial/fsl-imx-uart.txt | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/Documentation/devicetree/bindings/serial/fsl-imx-uart.txt b/Documentation/devicetree/bindings/serial/fsl-imx-uart.txt
index 35957cbf1571..c8d677f9491f 100644
--- a/Documentation/devicetree/bindings/serial/fsl-imx-uart.txt
+++ b/Documentation/devicetree/bindings/serial/fsl-imx-uart.txt
@@ -8,6 +8,10 @@ Required properties:
 Optional properties:
 - fsl,dte-mode : Indicate the uart works in DTE mode. The uart works
                   in DCE mode by default.
+- fsl,inverted-tx , fsl,inverted-rx : Indicate that the hardware attached
+  to the peripheral inverts the signal transmitted or received,
+  respectively, and that the peripheral should invert its output/input
+  using the INVT/INVR registers.
 - rs485-rts-delay, rs485-rts-active-low, rs485-rx-during-tx,
   linux,rs485-enabled-at-boot-time: see rs485.txt. Note that for RS485
   you must enable either the "uart-has-rtscts" or the "rts-gpios"
-- 
2.25.0


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

* [PATCH v3 2/2] tty: imx serial: Implement support for reversing TX and RX polarity
  2020-02-12 16:35 [PATCH v3 0/2] Implement support for inverted serial TX/RX on i.MX George Hilliard
  2020-02-12 16:35 ` [PATCH v3 1/2] dt-bindings: serial: document fsl,inverted-tx and -rx options George Hilliard
@ 2020-02-12 16:35 ` George Hilliard
  2020-02-12 20:47   ` Uwe Kleine-König
  1 sibling, 1 reply; 5+ messages in thread
From: George Hilliard @ 2020-02-12 16:35 UTC (permalink / raw)
  To: Greg Kroah-Hartman
  Cc: George Hilliard, linux-serial, devicetree, NXP Linux Team, kernel

The peripheral has support for inverting its input and/or output
signals.  This is useful if the hardware flips polarity of the
peripheral's signal, such as swapped +/- pins on an RS-422 transceiver,
or an inverting level shifter.  Add support for these control registers
via the device tree binding.

Signed-off-by: George Hilliard <ghilliard@kopismobile.com>
---
v1..v2: Remove confidentiality spam
v2..v3: Set *and* clear register, and do it before TX enable

 drivers/tty/serial/imx.c | 28 +++++++++++++++++++++++-----
 1 file changed, 23 insertions(+), 5 deletions(-)

diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index 0c6c63166250..205627bcad66 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
@@ -195,6 +195,8 @@ struct imx_port {
 	unsigned int		have_rtscts:1;
 	unsigned int		have_rtsgpio:1;
 	unsigned int		dte_mode:1;
+	unsigned int		inverted_tx:1;
+	unsigned int		inverted_rx:1;
 	struct clk		*clk_ipg;
 	struct clk		*clk_per;
 	const struct imx_uart_data *devdata;
@@ -1335,7 +1337,7 @@ static int imx_uart_startup(struct uart_port *port)
 	int retval, i;
 	unsigned long flags;
 	int dma_is_inited = 0;
-	u32 ucr1, ucr2, ucr4;
+	u32 ucr1, ucr2, ucr3, ucr4;
 
 	retval = clk_prepare_enable(sport->clk_per);
 	if (retval)
@@ -1390,8 +1392,22 @@ static int imx_uart_startup(struct uart_port *port)
 	ucr4 = imx_uart_readl(sport, UCR4) & ~UCR4_OREN;
 	if (!sport->dma_is_enabled)
 		ucr4 |= UCR4_OREN;
+	if (sport->inverted_rx)
+		ucr4 |= UCR4_INVR;
+	else
+		ucr4 &= ~UCR4_INVR;
 	imx_uart_writel(sport, ucr4, UCR4);
 
+	/*
+	 * configure tx polarity before enabling tx
+	 */
+	ucr3 = imx_uart_readl(sport, UCR3);
+	if (sport->inverted_tx)
+		ucr3 |= UCR3_INVT;
+	else
+		ucr3 &= ~UCR3_INVT;
+	imx_uart_writel(sport, ucr3, UCR3);
+
 	ucr2 = imx_uart_readl(sport, UCR2) & ~UCR2_ATEN;
 	ucr2 |= (UCR2_RXEN | UCR2_TXEN);
 	if (!sport->have_rtscts)
@@ -1405,10 +1421,6 @@ static int imx_uart_startup(struct uart_port *port)
 	imx_uart_writel(sport, ucr2, UCR2);
 
 	if (!imx_uart_is_imx1(sport)) {
-		u32 ucr3;
-
-		ucr3 = imx_uart_readl(sport, UCR3);
-
 		ucr3 |= UCR3_DTRDEN | UCR3_RI | UCR3_DCD;
 
 		if (sport->dte_mode)
@@ -2184,6 +2196,12 @@ static int imx_uart_probe_dt(struct imx_port *sport,
 	if (of_get_property(np, "rts-gpios", NULL))
 		sport->have_rtsgpio = 1;
 
+	if (of_get_property(np, "fsl,inverted-tx", NULL))
+		sport->inverted_tx = 1;
+
+	if (of_get_property(np, "fsl,inverted-rx", NULL))
+		sport->inverted_rx = 1;
+
 	return 0;
 }
 #else
-- 
2.25.0


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

* Re: [PATCH v3 2/2] tty: imx serial: Implement support for reversing TX and RX polarity
  2020-02-12 16:35 ` [PATCH v3 2/2] tty: imx serial: Implement support for reversing TX and RX polarity George Hilliard
@ 2020-02-12 20:47   ` Uwe Kleine-König
  0 siblings, 0 replies; 5+ messages in thread
From: Uwe Kleine-König @ 2020-02-12 20:47 UTC (permalink / raw)
  To: George Hilliard
  Cc: Greg Kroah-Hartman, linux-serial, devicetree, NXP Linux Team, kernel

On Wed, Feb 12, 2020 at 10:35:38AM -0600, George Hilliard wrote:
> The peripheral has support for inverting its input and/or output
> signals.  This is useful if the hardware flips polarity of the
> peripheral's signal, such as swapped +/- pins on an RS-422 transceiver,
> or an inverting level shifter.  Add support for these control registers
> via the device tree binding.
> 
> Signed-off-by: George Hilliard <ghilliard@kopismobile.com>
> ---
> v1..v2: Remove confidentiality spam
> v2..v3: Set *and* clear register, and do it before TX enable
> 
>  drivers/tty/serial/imx.c | 28 +++++++++++++++++++++++-----
>  1 file changed, 23 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
> index 0c6c63166250..205627bcad66 100644
> --- a/drivers/tty/serial/imx.c
> +++ b/drivers/tty/serial/imx.c
> @@ -195,6 +195,8 @@ struct imx_port {
>  	unsigned int		have_rtscts:1;
>  	unsigned int		have_rtsgpio:1;
>  	unsigned int		dte_mode:1;
> +	unsigned int		inverted_tx:1;
> +	unsigned int		inverted_rx:1;
>  	struct clk		*clk_ipg;
>  	struct clk		*clk_per;
>  	const struct imx_uart_data *devdata;
> @@ -1335,7 +1337,7 @@ static int imx_uart_startup(struct uart_port *port)
>  	int retval, i;
>  	unsigned long flags;
>  	int dma_is_inited = 0;
> -	u32 ucr1, ucr2, ucr4;
> +	u32 ucr1, ucr2, ucr3, ucr4;
>  
>  	retval = clk_prepare_enable(sport->clk_per);
>  	if (retval)
> @@ -1390,8 +1392,22 @@ static int imx_uart_startup(struct uart_port *port)
>  	ucr4 = imx_uart_readl(sport, UCR4) & ~UCR4_OREN;
>  	if (!sport->dma_is_enabled)
>  		ucr4 |= UCR4_OREN;
> +	if (sport->inverted_rx)
> +		ucr4 |= UCR4_INVR;
> +	else
> +		ucr4 &= ~UCR4_INVR;

Maybe clear UCR4_INVR in the same way as UCR4_OREN is cleared just
above?

>  	imx_uart_writel(sport, ucr4, UCR4);
>  
> +	/*
> +	 * configure tx polarity before enabling tx
> +	 */
> +	ucr3 = imx_uart_readl(sport, UCR3);
> +	if (sport->inverted_tx)
> +		ucr3 |= UCR3_INVT;
> +	else
> +		ucr3 &= ~UCR3_INVT;
> +	imx_uart_writel(sport, ucr3, UCR3);
> +
>  	ucr2 = imx_uart_readl(sport, UCR2) & ~UCR2_ATEN;
>  	ucr2 |= (UCR2_RXEN | UCR2_TXEN);
>  	if (!sport->have_rtscts)
> @@ -1405,10 +1421,6 @@ static int imx_uart_startup(struct uart_port *port)
>  	imx_uart_writel(sport, ucr2, UCR2);
>  
>  	if (!imx_uart_is_imx1(sport)) {

If this complete if block would be moved up, you only need to write this
register once.

> -		u32 ucr3;
> -
> -		ucr3 = imx_uart_readl(sport, UCR3);
> -
>  		ucr3 |= UCR3_DTRDEN | UCR3_RI | UCR3_DCD;
>  
>  		if (sport->dte_mode)

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | https://www.pengutronix.de/ |

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

* Re: [PATCH v3 1/2] dt-bindings: serial: document fsl,inverted-tx and -rx options
  2020-02-12 16:35 ` [PATCH v3 1/2] dt-bindings: serial: document fsl,inverted-tx and -rx options George Hilliard
@ 2020-02-18 23:07   ` Rob Herring
  0 siblings, 0 replies; 5+ messages in thread
From: Rob Herring @ 2020-02-18 23:07 UTC (permalink / raw)
  To: George Hilliard
  Cc: Greg Kroah-Hartman, George Hilliard, linux-serial, devicetree,
	NXP Linux Team, kernel

On Wed, 12 Feb 2020 10:35:37 -0600, George Hilliard wrote:
> Add a description for the new fsl,inverted-tx and fsl,inverted-rx
> options for the i.MX UART peripheral.
> 
> Signed-off-by: George Hilliard <ghilliard@kopismobile.com>
> ---
> v1..v2: Removed confidentiality spam
> 
>  Documentation/devicetree/bindings/serial/fsl-imx-uart.txt | 4 ++++
>  1 file changed, 4 insertions(+)
> 

Reviewed-by: Rob Herring <robh@kernel.org>

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

end of thread, back to index

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-12 16:35 [PATCH v3 0/2] Implement support for inverted serial TX/RX on i.MX George Hilliard
2020-02-12 16:35 ` [PATCH v3 1/2] dt-bindings: serial: document fsl,inverted-tx and -rx options George Hilliard
2020-02-18 23:07   ` Rob Herring
2020-02-12 16:35 ` [PATCH v3 2/2] tty: imx serial: Implement support for reversing TX and RX polarity George Hilliard
2020-02-12 20:47   ` Uwe Kleine-König

Linux-Serial Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-serial/0 linux-serial/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-serial linux-serial/ https://lore.kernel.org/linux-serial \
		linux-serial@vger.kernel.org
	public-inbox-index linux-serial

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-serial


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git