@@ -2043,7 +2043,7 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios,
20432043{
20442044 struct atmel_uart_port * atmel_port = to_atmel_uart_port (port );
20452045 unsigned long flags ;
2046- unsigned int old_mode , mode , imr , quot , baud , div , cd , fp = 0 ;
2046+ unsigned int old_mode , mode , mdrop , imr , quot , baud , div , cd , fp = 0 ;
20472047
20482048 /* save the current mode register */
20492049 mode = old_mode = atmel_uart_readl (port , ATMEL_US_MR );
@@ -2076,18 +2076,23 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios,
20762076
20772077 /* parity */
20782078 if (termios -> c_cflag & PARENB ) {
2079- /* Mark or Space parity */
2079+ /* Mark, Space or Multidrop parity */
20802080 if (termios -> c_cflag & CMSPAR ) {
2081- if (termios -> c_cflag & PARODD )
2081+ if (termios -> c_cflag & PARMD )
2082+ mode |= ATMEL_US_PAR_MULTI_DROP ;
2083+ else if (termios -> c_cflag & PARODD )
20822084 mode |= ATMEL_US_PAR_MARK ;
20832085 else
20842086 mode |= ATMEL_US_PAR_SPACE ;
20852087 } else if (termios -> c_cflag & PARODD )
20862088 mode |= ATMEL_US_PAR_ODD ;
20872089 else
20882090 mode |= ATMEL_US_PAR_EVEN ;
2091+
20892092 } else
20902093 mode |= ATMEL_US_PAR_NONE ;
2094+ mdrop = termios -> c_cflag & SENDA ? ATMEL_US_SENDA : 0 ;
2095+ termios -> c_cflag &= ~SENDA ; /* SENDA bit must be cleared once used */
20912096
20922097 spin_lock_irqsave (& port -> lock , flags );
20932098
@@ -2216,7 +2221,8 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios,
22162221
22172222 atmel_uart_writel (port , ATMEL_US_BRGR , quot );
22182223 atmel_uart_writel (port , ATMEL_US_CR , ATMEL_US_RSTSTA | ATMEL_US_RSTRX );
2219- atmel_uart_writel (port , ATMEL_US_CR , ATMEL_US_TXEN | ATMEL_US_RXEN );
2224+ atmel_uart_writel (port , ATMEL_US_CR ,
2225+ mdrop | ATMEL_US_TXEN | ATMEL_US_RXEN );
22202226 atmel_port -> tx_stopped = false;
22212227
22222228 /* restore interrupts */
0 commit comments