lkml.org 
[lkml]   [2014]   [Jun]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH v2] serial: uart: add hw flow control support configuration
    On 5/28/2014 4:04 PM, Dann Frazier wrote:
    > On Thu, May 1, 2014 at 1:04 PM, Murali Karicheri <m-karicheri2@ti.com> wrote:
    >> 8250 uart driver currently supports only software assisted hw flow
    >> control. The software assisted hw flow control maintains a hw_stopped
    >> flag in the tty structure to stop and start transmission and use modem
    >> status interrupt for the event to drive the handshake signals. This is
    >> not needed if hw has flow control capabilities. This patch adds a
    >> DT attribute for enabling hw flow control for a uart port. Also skip
    >> stop and start if this flag is present in flag field of the port
    >> structure.
    > ubuntu@hwflow:~$ sudo stty -a --file /dev/ttyS0 |tr ' ' '\n' | grep crtscts
    > crtscts
    > ubuntu@hwflow:~$ ls /proc/device-tree/soc/serial@1c021000/has-hw-flow-control
    > /proc/device-tree/soc/serial@1c021000/has-hw-flow-control
    > ubuntu@hwflow:~$ python
    > Python 2.7.6 (default, Mar 22 2014, 22:58:30)
    > [GCC 4.8.2] on linux2
    > Type "help", "copyright", "credits" or "license" for more information.
    >>>> UPF_HARDWARE_FLOW = 1 << 21
    >>>> if 0xB9200000 & UPF_HARDWARE_FLOW:
    > ... print "OK"
    > ...
    > OK
    >
    > Hope that's a reasonable test case. Test fails when booted w/o
    > has-hw-flow-control attribute.
    >
    > Tested-by: dann frazier <dann.frazier@canonical.com>
    What is the verdict? pass/fail? Ok/Not OK to merge?

    Murali
    >> Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>
    >>
    >> CC: Rob Herring <robh+dt@kernel.org>
    >> CC: Pawel Moll <pawel.moll@arm.com>
    >> CC: Mark Rutland <mark.rutland@arm.com>
    >> CC: Ian Campbell <ijc+devicetree@hellion.org.uk>
    >> CC: Kumar Gala <galak@codeaurora.org>
    >> CC: Randy Dunlap <rdunlap@infradead.org>
    >> CC: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    >> CC: Jiri Slaby <jslaby@suse.cz>
    >> CC: Santosh Shilimkar <santosh.shilimkar@ti.com>
    >> ---
    >> .../devicetree/bindings/serial/of-serial.txt | 1 +
    >> drivers/tty/serial/8250/8250_core.c | 6 ++++--
    >> drivers/tty/serial/of_serial.c | 4 ++++
    >> drivers/tty/serial/serial_core.c | 12 +++++++++---
    >> 4 files changed, 18 insertions(+), 5 deletions(-)
    >>
    >> diff --git a/Documentation/devicetree/bindings/serial/of-serial.txt b/Documentation/devicetree/bindings/serial/of-serial.txt
    >> index 1928a3e..7705477 100644
    >> --- a/Documentation/devicetree/bindings/serial/of-serial.txt
    >> +++ b/Documentation/devicetree/bindings/serial/of-serial.txt
    >> @@ -37,6 +37,7 @@ Optional properties:
    >> - auto-flow-control: one way to enable automatic flow control support. The
    >> driver is allowed to detect support for the capability even without this
    >> property.
    >> +- has-hw-flow-control: the hardware has flow control capability.
    >>
    >> Example:
    >>
    >> diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c
    >> index 0e1bf88..b69aff2 100644
    >> --- a/drivers/tty/serial/8250/8250_core.c
    >> +++ b/drivers/tty/serial/8250/8250_core.c
    >> @@ -2338,9 +2338,11 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
    >> * the trigger, or the MCR RTS bit is cleared. In the case where
    >> * the remote UART is not using CTS auto flow control, we must
    >> * have sufficient FIFO entries for the latency of the remote
    >> - * UART to respond. IOW, at least 32 bytes of FIFO.
    >> + * UART to respond. IOW, at least 32 bytes of FIFO. Also enable
    >> + * AFE if hw flow control is supported
    >> */
    >> - if (up->capabilities & UART_CAP_AFE && port->fifosize >= 32) {
    >> + if ((up->capabilities & UART_CAP_AFE && (port->fifosize >= 32)) ||
    >> + (port->flags & UPF_HARD_FLOW)) {
    >> up->mcr &= ~UART_MCR_AFE;
    >> if (termios->c_cflag & CRTSCTS)
    >> up->mcr |= UART_MCR_AFE;
    >> diff --git a/drivers/tty/serial/of_serial.c b/drivers/tty/serial/of_serial.c
    >> index 9924660..77ec6a1 100644
    >> --- a/drivers/tty/serial/of_serial.c
    >> +++ b/drivers/tty/serial/of_serial.c
    >> @@ -182,6 +182,10 @@ static int of_platform_serial_probe(struct platform_device *ofdev)
    >> "auto-flow-control"))
    >> port8250.capabilities |= UART_CAP_AFE;
    >>
    >> + if (of_property_read_bool(ofdev->dev.of_node,
    >> + "has-hw-flow-control"))
    >> + port8250.port.flags |= UPF_HARD_FLOW;
    >> +
    >> ret = serial8250_register_8250_port(&port8250);
    >> break;
    >> }
    >> diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
    >> index b68550d..851707a 100644
    >> --- a/drivers/tty/serial/serial_core.c
    >> +++ b/drivers/tty/serial/serial_core.c
    >> @@ -174,8 +174,12 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,
    >> if (tty->termios.c_cflag & CBAUD)
    >> uart_set_mctrl(uport, TIOCM_RTS | TIOCM_DTR);
    >> }
    >> -
    >> - if (tty_port_cts_enabled(port)) {
    >> + /*
    >> + * if hw support flow control without software intervention,
    >> + * then skip the below check
    >> + */
    >> + if (tty_port_cts_enabled(port) &&
    >> + !(uport->flags & UPF_HARD_FLOW)) {
    >> spin_lock_irq(&uport->lock);
    >> if (!(uport->ops->get_mctrl(uport) & TIOCM_CTS))
    >> tty->hw_stopped = 1;
    >> @@ -2772,7 +2776,9 @@ void uart_handle_cts_change(struct uart_port *uport, unsigned int status)
    >>
    >> uport->icount.cts++;
    >>
    >> - if (tty_port_cts_enabled(port)) {
    >> + /* skip below code if the hw flow control is supported */
    >> + if (tty_port_cts_enabled(port) &&
    >> + !(uport->flags & UPF_HARD_FLOW)) {
    >> if (tty->hw_stopped) {
    >> if (status) {
    >> tty->hw_stopped = 0;
    >> --
    >> 1.7.9.5
    >>
    >> --
    >> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    >> the body of a message to majordomo@vger.kernel.org
    >> More majordomo info at http://vger.kernel.org/majordomo-info.html
    >> Please read the FAQ at http://www.tux.org/lkml/
    >>
    >>



    \
     
     \ /
      Last update: 2014-06-11 23:41    [W:3.049 / U:0.244 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site