From: Rodolfo Giometti <giometti@xxxxxxxx> This patch adds multidrop support for atmel serial controllers and it has been tested by using a SAMA5D3 CPU. Signed-off-by: Rodolfo Giometti <giometti@xxxxxxxx> Signed-off-by: Joshua Henderson <joshua.henderson@xxxxxxxxxxxxx> --- drivers/tty/serial/atmel_serial.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c index 0b4f36905321..b30b4a336907 100644 --- a/drivers/tty/serial/atmel_serial.c +++ b/drivers/tty/serial/atmel_serial.c @@ -2178,7 +2178,7 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios, { struct atmel_uart_port *atmel_port = to_atmel_uart_port(port); unsigned long flags; - unsigned int old_mode, mode, imr, quot, baud, div, cd, fp = 0; + unsigned int old_mode, mode, mdrop, imr, quot, baud, div, cd, fp = 0; /* save the current mode register */ mode = old_mode = atmel_uart_readl(port, ATMEL_US_MR); @@ -2211,9 +2211,11 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios, /* parity */ if (termios->c_cflag & PARENB) { - /* Mark or Space parity */ + /* Mark, Space or Multidrop parity */ if (termios->c_cflag & CMSPAR) { - if (termios->c_cflag & PARODD) + if (termios->c_cflag & PARMD) + mode |= ATMEL_US_PAR_MULTI_DROP; + else if (termios->c_cflag & PARODD) mode |= ATMEL_US_PAR_MARK; else mode |= ATMEL_US_PAR_SPACE; @@ -2221,8 +2223,11 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios, mode |= ATMEL_US_PAR_ODD; else mode |= ATMEL_US_PAR_EVEN; + } else mode |= ATMEL_US_PAR_NONE; + mdrop = termios->c_cflag & SENDA ? ATMEL_US_SENDA : 0; + termios->c_cflag &= ~SENDA; /* SENDA bit must be cleared once used */ spin_lock_irqsave(&port->lock, flags); @@ -2363,7 +2368,8 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios, if (!(port->iso7816.flags & SER_ISO7816_ENABLED)) atmel_uart_writel(port, ATMEL_US_BRGR, quot); atmel_uart_writel(port, ATMEL_US_CR, ATMEL_US_RSTSTA | ATMEL_US_RSTRX); - atmel_uart_writel(port, ATMEL_US_CR, ATMEL_US_TXEN | ATMEL_US_RXEN); + atmel_uart_writel(port, ATMEL_US_CR, + mdrop | ATMEL_US_TXEN | ATMEL_US_RXEN); atmel_port->tx_stopped = false; /* restore interrupts */ -- 2.17.1