Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S942447AbcJ0SCo (ORCPT ); Thu, 27 Oct 2016 14:02:44 -0400 Received: from metis.ext.4.pengutronix.de ([92.198.50.35]:48872 "EHLO metis.ext.4.pengutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S941800AbcJ0SCi (ORCPT ); Thu, 27 Oct 2016 14:02:38 -0400 Date: Thu, 27 Oct 2016 20:02:29 +0200 From: Uwe =?iso-8859-1?Q?Kleine-K=F6nig?= To: Richard Genoud Cc: Nicolas Ferre , Alexandre Belloni , Greg Kroah-Hartman , Cyrille Pitchen , linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, "#4 . 4+" Subject: Re: [PATCH v6] tty/serial: at91: fix hardware handshake on Atmel platforms Message-ID: <20161027180229.5faqrvxa2a4pos7i@pengutronix.de> References: <20161027160406.25738-1-richard.genoud@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20161027160406.25738-1-richard.genoud@gmail.com> User-Agent: Mutt/1.6.2-neo (2016-06-11) X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::c5 X-SA-Exim-Mail-From: ukl@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2044 Lines: 52 Hello Richard, On Thu, Oct 27, 2016 at 06:04:06PM +0200, Richard Genoud wrote: > diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c > index fd8aa1f4ba78..168b10cad47b 100644 > --- a/drivers/tty/serial/atmel_serial.c > +++ b/drivers/tty/serial/atmel_serial.c > @@ -2132,11 +2132,29 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios, > mode |= ATMEL_US_USMODE_RS485; > } else if (termios->c_cflag & CRTSCTS) { > /* RS232 with hardware handshake (RTS/CTS) */ > - if (atmel_use_dma_rx(port) && !atmel_use_fifo(port)) { > - dev_info(port->dev, "not enabling hardware flow control because DMA is used"); > - termios->c_cflag &= ~CRTSCTS; > - } else { > + if (atmel_use_fifo(port) && > + !mctrl_gpio_to_gpiod(atmel_port->gpios, UART_GPIO_CTS)) { > + /* > + * with ATMEL_US_USMODE_HWHS set, the controller will > + * be able to drive the RTS pin high/low when the RX > + * FIFO is above RXFTHRES/below RXFTHRES2. > + * It will also disable the transmitter when the CTS > + * pin is high. > + * This mode is not activated if CTS pin is a GPIO > + * because in this case, the transmitter is always > + * disabled (there must be an internal pull-up > + * responsible for this behaviour). > + * If the RTS pin is a GPIO, the controller won't be > + * able to drive it according to the FIFO thresholds, > + * but it will be handled by the driver. > + */ > mode |= ATMEL_US_USMODE_HWHS; You use !mctrl_gpio_to_gpiod(atmel_port->gpios, UART_GPIO_CTS) as indicator that the cts mode of the respective pin is used. Is this reliable? (It's not if there are machines that don't use CTS, neither as gpio nor using the hardware function.) Maybe this needs a dt property to indicate that there is no (hw)handshaking available? > + } else { > + ... > } Best regards Uwe -- Pengutronix e.K. | Uwe Kleine-K?nig | Industrial Linux Solutions | http://www.pengutronix.de/ |