2015-03-27 12:32 GMT+01:00 Peter Hurley <peter@xxxxxxxxxxxxxxxxxx>: > On 03/26/2015 06:03 PM, Maxime Coquelin wrote: >>>> +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. Ok, thanks for your support. I will implement this in the v4. Regards, Maxime > > Regards, > Peter Hurley > -- To unsubscribe from this list: send the line "unsubscribe linux-arch" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html