|
@@ -1705,6 +1705,38 @@ static void pl011_shutdown(struct uart_port *port)
|
|
|
uap->port.ops->flush_buffer(port);
|
|
|
}
|
|
|
|
|
|
+static void
|
|
|
+pl011_setup_status_masks(struct uart_port *port, struct ktermios *termios)
|
|
|
+{
|
|
|
+ port->read_status_mask = UART011_DR_OE | 255;
|
|
|
+ if (termios->c_iflag & INPCK)
|
|
|
+ port->read_status_mask |= UART011_DR_FE | UART011_DR_PE;
|
|
|
+ if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
|
|
|
+ port->read_status_mask |= UART011_DR_BE;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Characters to ignore
|
|
|
+ */
|
|
|
+ port->ignore_status_mask = 0;
|
|
|
+ if (termios->c_iflag & IGNPAR)
|
|
|
+ port->ignore_status_mask |= UART011_DR_FE | UART011_DR_PE;
|
|
|
+ if (termios->c_iflag & IGNBRK) {
|
|
|
+ port->ignore_status_mask |= UART011_DR_BE;
|
|
|
+ /*
|
|
|
+ * If we're ignoring parity and break indicators,
|
|
|
+ * ignore overruns too (for real raw support).
|
|
|
+ */
|
|
|
+ if (termios->c_iflag & IGNPAR)
|
|
|
+ port->ignore_status_mask |= UART011_DR_OE;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Ignore all characters if CREAD is not set.
|
|
|
+ */
|
|
|
+ if ((termios->c_cflag & CREAD) == 0)
|
|
|
+ port->ignore_status_mask |= UART_DUMMY_DR_RX;
|
|
|
+}
|
|
|
+
|
|
|
static void
|
|
|
pl011_set_termios(struct uart_port *port, struct ktermios *termios,
|
|
|
struct ktermios *old)
|
|
@@ -1769,33 +1801,7 @@ pl011_set_termios(struct uart_port *port, struct ktermios *termios,
|
|
|
*/
|
|
|
uart_update_timeout(port, termios->c_cflag, baud);
|
|
|
|
|
|
- port->read_status_mask = UART011_DR_OE | 255;
|
|
|
- if (termios->c_iflag & INPCK)
|
|
|
- port->read_status_mask |= UART011_DR_FE | UART011_DR_PE;
|
|
|
- if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK))
|
|
|
- port->read_status_mask |= UART011_DR_BE;
|
|
|
-
|
|
|
- /*
|
|
|
- * Characters to ignore
|
|
|
- */
|
|
|
- port->ignore_status_mask = 0;
|
|
|
- if (termios->c_iflag & IGNPAR)
|
|
|
- port->ignore_status_mask |= UART011_DR_FE | UART011_DR_PE;
|
|
|
- if (termios->c_iflag & IGNBRK) {
|
|
|
- port->ignore_status_mask |= UART011_DR_BE;
|
|
|
- /*
|
|
|
- * If we're ignoring parity and break indicators,
|
|
|
- * ignore overruns too (for real raw support).
|
|
|
- */
|
|
|
- if (termios->c_iflag & IGNPAR)
|
|
|
- port->ignore_status_mask |= UART011_DR_OE;
|
|
|
- }
|
|
|
-
|
|
|
- /*
|
|
|
- * Ignore all characters if CREAD is not set.
|
|
|
- */
|
|
|
- if ((termios->c_cflag & CREAD) == 0)
|
|
|
- port->ignore_status_mask |= UART_DUMMY_DR_RX;
|
|
|
+ pl011_setup_status_masks(port, termios);
|
|
|
|
|
|
if (UART_ENABLE_MS(port, termios->c_cflag))
|
|
|
pl011_enable_ms(port);
|