Allow drivers to alter LSR save mask. Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@xxxxxxxxxxxxxxx> --- drivers/tty/serial/8250/8250_core.c | 4 +++- drivers/tty/serial/8250/8250_port.c | 6 +++--- include/linux/serial_8250.h | 1 + 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c index f67bc3b76f65..7cb1267559d4 100644 --- a/drivers/tty/serial/8250/8250_core.c +++ b/drivers/tty/serial/8250/8250_core.c @@ -278,7 +278,7 @@ static void serial8250_backup_timeout(struct timer_list *t) * ia64 and parisc boxes. */ lsr = serial_in(up, UART_LSR); - up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS; + up->lsr_saved_flags |= lsr & up->lsr_save_mask; if ((iir & UART_IIR_NO_INT) && (up->ier & UART_IER_THRI) && (!uart_circ_empty(&up->port.state->xmit) || up->port.x_char) && (lsr & UART_LSR_THRE)) { @@ -1097,6 +1097,8 @@ int serial8250_register_8250_port(const struct uart_8250_port *up) ret = 0; } + uart->lsr_save_mask = up->lsr_save_mask ?: LSR_SAVE_FLAGS; + /* Initialise interrupt backoff work if required */ if (up->overrun_backoff_time_ms > 0) { uart->overrun_backoff_time_ms = diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c index c2492b91b0cd..3be95e861f21 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -1595,7 +1595,7 @@ static inline void __start_tx(struct uart_port *port) unsigned int lsr; lsr = serial_in(up, UART_LSR); - up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS; + up->lsr_saved_flags |= lsr & up->lsr_save_mask; if (lsr & UART_LSR_THRE) serial8250_tx_chars(up); } @@ -2029,7 +2029,7 @@ static unsigned int serial8250_tx_empty(struct uart_port *port) spin_lock_irqsave(&port->lock, flags); lsr = serial_port_in(port, UART_LSR); - up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS; + up->lsr_saved_flags |= lsr & up->lsr_save_mask; spin_unlock_irqrestore(&port->lock, flags); serial8250_rpm_put(up); @@ -2110,7 +2110,7 @@ static void wait_for_xmitr(struct uart_8250_port *up, int bits) for (;;) { status = serial_in(up, UART_LSR); - up->lsr_saved_flags |= status & LSR_SAVE_FLAGS; + up->lsr_saved_flags |= status & up->lsr_save_mask; if ((status & bits) == bits) break; diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h index 921df4c60062..aff76ea22287 100644 --- a/include/linux/serial_8250.h +++ b/include/linux/serial_8250.h @@ -120,6 +120,7 @@ struct uart_8250_port { */ #define LSR_SAVE_FLAGS UART_LSR_BRK_ERROR_BITS u16 lsr_saved_flags; + u16 lsr_save_mask; #define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA unsigned char msr_saved_flags; -- 2.30.2