Skip to content

Commit 709fb3b

Browse files
Rodolfo Giometticristibirsan
authored andcommitted
tty serial: add multidrop support for atmel serial controllers
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@linux.it> Signed-off-by: Joshua Henderson <joshua.henderson@microchip.com>
1 parent 53880bd commit 709fb3b

1 file changed

Lines changed: 10 additions & 4 deletions

File tree

drivers/tty/serial/atmel_serial.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2042,7 +2042,7 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios,
20422042
{
20432043
struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
20442044
unsigned long flags;
2045-
unsigned int old_mode, mode, imr, quot, baud, div, cd, fp = 0;
2045+
unsigned int old_mode, mode, mdrop, imr, quot, baud, div, cd, fp = 0;
20462046

20472047
/* save the current mode register */
20482048
mode = old_mode = atmel_uart_readl(port, ATMEL_US_MR);
@@ -2075,18 +2075,23 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios,
20752075

20762076
/* parity */
20772077
if (termios->c_cflag & PARENB) {
2078-
/* Mark or Space parity */
2078+
/* Mark, Space or Multidrop parity */
20792079
if (termios->c_cflag & CMSPAR) {
2080-
if (termios->c_cflag & PARODD)
2080+
if (termios->c_cflag & PARMD)
2081+
mode |= ATMEL_US_PAR_MULTI_DROP;
2082+
else if (termios->c_cflag & PARODD)
20812083
mode |= ATMEL_US_PAR_MARK;
20822084
else
20832085
mode |= ATMEL_US_PAR_SPACE;
20842086
} else if (termios->c_cflag & PARODD)
20852087
mode |= ATMEL_US_PAR_ODD;
20862088
else
20872089
mode |= ATMEL_US_PAR_EVEN;
2090+
20882091
} else
20892092
mode |= ATMEL_US_PAR_NONE;
2093+
mdrop = termios->c_cflag & SENDA ? ATMEL_US_SENDA : 0;
2094+
termios->c_cflag &= ~SENDA; /* SENDA bit must be cleared once used */
20902095

20912096
spin_lock_irqsave(&port->lock, flags);
20922097

@@ -2215,7 +2220,8 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios,
22152220

22162221
atmel_uart_writel(port, ATMEL_US_BRGR, quot);
22172222
atmel_uart_writel(port, ATMEL_US_CR, ATMEL_US_RSTSTA | ATMEL_US_RSTRX);
2218-
atmel_uart_writel(port, ATMEL_US_CR, ATMEL_US_TXEN | ATMEL_US_RXEN);
2223+
atmel_uart_writel(port, ATMEL_US_CR,
2224+
mdrop | ATMEL_US_TXEN | ATMEL_US_RXEN);
22192225
atmel_port->tx_stopped = false;
22202226

22212227
/* restore interrupts */

0 commit comments

Comments
 (0)