From patchwork Mon Jun 9 22:57:22 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: dann frazier X-Patchwork-Id: 357641 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) by ozlabs.org (Postfix) with ESMTP id E0B8F1400AB; Tue, 10 Jun 2014 08:57:36 +1000 (EST) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1Wu8VM-0002Ql-6F; Mon, 09 Jun 2014 22:57:28 +0000 Received: from mail-we0-f179.google.com ([74.125.82.179]) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1Wu8VH-0002Qa-6h for kernel-team@lists.ubuntu.com; Mon, 09 Jun 2014 22:57:23 +0000 Received: by mail-we0-f179.google.com with SMTP id w62so2116823wes.38 for ; Mon, 09 Jun 2014 15:57:23 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to :content-type; bh=W0SbCTTNpxm08gPfUv5WKvqKo2aV8XgaVtJynGBfyMg=; b=d5H1yVRdybGBfav7KpruziFqjgkGPVs2cowq7QshNqRsFjXdGRZm+7Wl1kPCfPK6VT o2TyjFlM1L5v80d7p7Ex3HvJSs95L2ViESLTq+C7h9NJobDKc/QLRlOlMxrBsGXLtcTK 2p2KHvC1wBthWVptx7lZR7J8z8jTNuAL5p0ltcvCPQrjT4MCCFBUiTcQ2MNCglg3getv 9DBsDSWKqSEAp5qRZ8ZdzPvsYKDAUXo8KemvUQXUFnbK2jZ5el5RbGrgycyw+h3glP6r tdULC/aaoezbToQAAb7cHG4cS/T0NPPl4C8ncGlcCW+r7ntyMLKhBG0l149TFe2Z9HS6 BKpw== X-Gm-Message-State: ALoCoQm+qqRROLRdsGDZwfpWMfQd7cB6xc0mPDjN8mmSSdEUAMOlQQLTR2sYONtcxtbYVVr01No2 MIME-Version: 1.0 X-Received: by 10.180.109.101 with SMTP id hr5mr9162268wib.25.1402354643070; Mon, 09 Jun 2014 15:57:23 -0700 (PDT) Received: by 10.216.40.66 with HTTP; Mon, 9 Jun 2014 15:57:22 -0700 (PDT) Date: Mon, 9 Jun 2014 16:57:22 -0600 Message-ID: Subject: [PATCH Trusty SRU] serial: uart: add hw flow control support configuration From: Dann Frazier To: Ubuntu Kernel Team X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.14 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: kernel-team-bounces@lists.ubuntu.com Also not in utopic, but utopic should automatically pick it up when we migrate it to 3.16. Acked-by: Andy Whitcroft Acked-by: Paolo Pisati From 667c1c27e4c0b191ec0e210418b45043c68de1ee Mon Sep 17 00:00:00 2001 From: Murali Karicheri Date: Thu, 1 May 2014 15:04:53 -0400 Subject: [PATCH] serial: uart: add hw flow control support configuration BugLink: https://bugs.launchpad.net/bugs/1328295 commit 06aa82e498c144c7784a6f3d3b55458b272d6146 upstream. 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. Signed-off-by: Murali Karicheri CC: Rob Herring CC: Pawel Moll CC: Mark Rutland CC: Ian Campbell CC: Kumar Gala CC: Randy Dunlap CC: Jiri Slaby CC: Santosh Shilimkar Signed-off-by: Greg Kroah-Hartman Signed-off-by: dann frazier --- Documentation/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 61ecd70..49fc41ec 100644 --- a/drivers/tty/serial/8250/8250_core.c +++ b/drivers/tty/serial/8250/8250_core.c @@ -2334,9 +2334,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 2caf9c6..a41d161 100644 --- a/drivers/tty/serial/of_serial.c +++ b/drivers/tty/serial/of_serial.c @@ -183,6 +183,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 0f02351..a91af71 100644 --- a/drivers/tty/serial/serial_core.c +++ b/drivers/tty/serial/serial_core.c @@ -170,8 +170,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; @@ -2754,7 +2758,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; -- 2.0.0