Skip to content

Commit cb62975

Browse files
committed
Merge branch 'at91-4.14-trunk/9bit' into linux-4.14-at91
2 parents c54111a + 709fb3b commit cb62975

3 files changed

Lines changed: 14 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
@@ -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 */

include/linux/tty.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,8 @@ struct tty_bufhead {
167167
#define C_CIBAUD(tty) _C_FLAG((tty), CIBAUD)
168168
#define C_CRTSCTS(tty) _C_FLAG((tty), CRTSCTS)
169169
#define C_CMSPAR(tty) _C_FLAG((tty), CMSPAR)
170+
#define C_PARMD(tty) _C_FLAG((tty), PARMD)
171+
#define C_SENDA(tty) _C_FLAG((tty), SENDA)
170172

171173
#define L_ISIG(tty) _L_FLAG((tty), ISIG)
172174
#define L_ICANON(tty) _L_FLAG((tty), ICANON)

include/uapi/asm-generic/termbits.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ struct ktermios {
141141
#define HUPCL 0002000
142142
#define CLOCAL 0004000
143143
#define CBAUDEX 0010000
144+
#define PARMD 040000000
145+
#define SENDA 0100000000
144146
#define BOTHER 0010000
145147
#define B57600 0010001
146148
#define B115200 0010002

0 commit comments

Comments
 (0)