@@ -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 =
@@ -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;
@@ -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;
Allow drivers to alter LSR save mask. Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> --- 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(-)