From mboxrd@z Thu Jan 1 00:00:00 1970 From: Murali Karicheri Subject: Re: [PATCH v2] serial: uart: add hw flow control support configuration Date: Wed, 11 Jun 2014 16:53:36 -0400 Message-ID: <5398C1D0.30808@ti.com> References: <1398971093-17164-1-git-send-email-m-karicheri2@ti.com> Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: Sender: linux-kernel-owner@vger.kernel.org To: Dann Frazier Cc: "devicetree@vger.kernel.org" , "linux-doc@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "linux-serial@vger.kernel.org" , Rob Herring , Pawel Moll , Mark Rutland , Ian Campbell , Kumar Gala , Randy Dunlap , Greg Kroah-Hartman , Jiri Slaby , "Shilimkar, Santosh" List-Id: devicetree@vger.kernel.org On 5/28/2014 4:04 PM, Dann Frazier wrote: > On Thu, May 1, 2014 at 1:04 PM, Murali Karicheri 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 What is the verdict? pass/fail? Ok/Not OK to merge? Murali >> Signed-off-by: Murali Karicheri >> >> CC: Rob Herring >> CC: Pawel Moll >> CC: Mark Rutland >> CC: Ian Campbell >> CC: Kumar Gala >> CC: Randy Dunlap >> CC: Greg Kroah-Hartman >> CC: Jiri Slaby >> CC: Santosh Shilimkar >> --- >> .../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/ >> >>