Re: [PATCH v3 10/15] serial: stm32-usart: Add STM32 USART Driver
From: Peter Hurley <hidden>
Date: 2015-03-27 11:32:58
Also in:
linux-api, linux-arch, linux-arm-kernel, linux-gpio, linux-serial, lkml
On 03/26/2015 06:03 PM, Maxime Coquelin wrote:
quoted
quoted
+static void stm32_set_termios(struct uart_port *port, struct ktermios *termios, + struct ktermios *old) +{ + unsigned int baud; + u32 usardiv, mantissa, fraction; + tcflag_t cflag; + u32 cr1, cr2, cr3; + unsigned long flags; + + baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / 16); + cflag = termios->c_cflag; + + spin_lock_irqsave(&port->lock, flags); + + /* Stop serial port and reset value */ + writel_relaxed(0, port->membase + USART_CR1); + + cr1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE | USART_CR1_RXNEIE; + + if (cflag & CSTOPB) + cr2 = USART_CR2_STOP_2B; + + if (cflag & PARENB) { + cr1 |= USART_CR1_PCE; + if ((cflag & CSIZE) == CS8) + cr1 |= USART_CR1_M; + } + + if (cflag & PARODD) + cr1 |= USART_CR1_PS; + + if (cflag & CRTSCTS) + cr3 = USART_CR3_RTSE | USART_CR3_CTSE;If this means autoflow control, then you need to define throttle()/unthrottle() methods, otherwise the serial core won't be able to throttle the remote when input buffers are about to overflow. And you should only enable the autoCTS and let the serial core enable autoRTS through set_mctrl(TIOCM_RTS). Just let me know if you need more info about how to do this.Ok, let's see if I have well understood. USART_CR3_RTSE should be set/cleared in set_mctrl(), depending on TIOCM_RTS value. The throttle callback should disable the rx interrupt, and the unthrottle enable it. For CTS, it should be enabled in set_termios() if CRTSCTS, as done here. Am I right?
Yeah, basically. You also have to indicate to the serial core that you
require throttle/unthrottle handling in this mode by setting port->status.
Your set_termios() method would look like:
port->status &= ~(UPSTAT_AUTOCTS | UPSTAT_AUTORTS);
if (cflag & CRTSCTS) {
port->status |= UPSTAT_AUTOCTS | UPSTAT_AUTORTS;
cr3 = USART_CR3_CTSE;
}
and your set_mctrl() method would look like:
if ((mctrl & TIOCM_RTS) && (port->status & UPSTAT_AUTORTS))
stm32_set_bits(port, USART_CR3, USART_CR3_RTSE);
else
stm32_clear_bits(port, USART_CR3, USART_CR3_RTSE);
The UPSTAT_AUTOCTS doesn't really do anything right now but please
use it anyway to indicate this driver has that functionality.
Regards,
Peter Hurley