LKML Archive on
help / color / mirror / Atom feed
From: Lukas Wunner <>
To: Ivan Sistik <>
Cc: Russell King <>,
	Florian Fainelli <>,
	Ray Jui <>,
	Scott Branden <>,,
	Eric Anholt <>,
	Stefan Wahren <>,
	Greg Kroah-Hartman <>,
	Jiri Slaby <>,,,,,
	Nicolas Saenz Julienne <>
Subject: Re: [PATCH] tty: serial: amba-pl011: added RS485 support
Date: Thu, 16 Jan 2020 14:29:54 +0100	[thread overview]
Message-ID: <> (raw)
In-Reply-To: <>

On Tue, Jan 07, 2020 at 12:52:03AM +0100, Ivan Sistik wrote:
> AMBA PL011 do not have hardware support for RS485. This implementation is
> for drive enable signal (DE), which switch direction of RS485 driver chip.

So I've implemented rs485 support for amba-pl011.c two years ago
but the patches need a little more polishing before they can be
upstreamed and I haven't gotten around to that yet.  I apologize
that it meant you had to reinvent the wheel.

You can find my implementation on this branch:

Specifically this commit:

You've used hrtimers in case delays are necessary after assertion
or before deassertion of RTS.  Note that 8250_port.c already contains
code for that.  If one wants to go that route, it would probably be
best to move that code into serial_core.c to make it available to
non-8250 ports.

I took a completely different approach:  I converted amba-pl011.c
to threaded interrupt handling using two kthreads, one for sending,
one for receiving.  This allows simultaneous writing to and reading
from the FIFO.  The driver keeps track of the FIFO fill level,
which allows writing to the FIFO blindly.  The hardirq handler
updates the fill level counter and wakes either of the IRQ threads.

Once the driver was converted to threaded interrupts, it became
possible to sleep in the IRQ handler, so I just used msleep()
for the RTS delays.

The above-linked branch also has rs485 console support for amba-pl011.c
as well as for the auxiliary UART on the Raspberry Pi.

> There is missing FIFO empty interrupt in PL011. It is replaced by second
> hrtimer which is started if there are no more data in port transmit buffer.

The tty layer lets you know when there's nothing more to transmit by
calling the ->stop_tx() hook.  Then you just busy-wait for the FIFO
to empty before you deassert RTS.

Another idea would be to set TXIFLSEL (TX interrupt FIFO level select)
in the UARTIFLS register to the lowest possible setting.  Then you'll
get an interrupt when the TX FIFO only contains 2 bytes (on a PL011
with 16 byte FIFOs), thus minimizing the busy-wait duration.



  parent reply	other threads:[~2020-01-16 13:38 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-06 23:52 Ivan Sistik
2020-01-07  7:27 ` Greg Kroah-Hartman
2020-01-17  0:31   ` Ivan Sistik - 3K Solutions, s. r. o.
2020-01-07  7:28 ` Greg Kroah-Hartman
2020-01-16 13:29 ` Lukas Wunner [this message]
2020-01-17  0:58   ` Ivan Šištík - 3K Solutions, s. r. o.
2020-01-21  8:49     ` Lukas Wunner
2020-12-21 23:18 Ivan Sistik
2020-12-28 15:13 ` Greg Kroah-Hartman

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:

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

  git send-email \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
    --subject='Re: [PATCH] tty: serial: amba-pl011: added RS485 support' \

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

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