aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty/serial/serial_core.c
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2012-04-17 11:34:13 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2012-11-04 06:25:54 -0500
commit2cbacafd7af0f1cc7a433668c662a91ba6aabc1b (patch)
treebe2e5735b395cba0bfcaf89c312a3fbdce7b05c3 /drivers/tty/serial/serial_core.c
parentdec94e70e12c39440e63159e0050d46795dfcf09 (diff)
SERIAL: core: add hardware assisted s/w flow control support
Ports which are capable of handling s/w flow control in hardware to know when the s/w flow control termios settings are changed. Add a flag to allow the low level serial drivers to indicate that they support this, and these changes should be propagated to them. Acked-by: Alan Cox <alan@linux.intel.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'drivers/tty/serial/serial_core.c')
-rw-r--r--drivers/tty/serial/serial_core.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
index bc2065d323b9..bd10bbd56446 100644
--- a/drivers/tty/serial/serial_core.c
+++ b/drivers/tty/serial/serial_core.c
@@ -1213,7 +1213,19 @@ static void uart_set_termios(struct tty_struct *tty,
1213 struct uart_port *uport = state->uart_port; 1213 struct uart_port *uport = state->uart_port;
1214 unsigned long flags; 1214 unsigned long flags;
1215 unsigned int cflag = tty->termios.c_cflag; 1215 unsigned int cflag = tty->termios.c_cflag;
1216 unsigned int iflag_mask = IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK;
1217 bool sw_changed = false;
1216 1218
1219 /*
1220 * Drivers doing software flow control also need to know
1221 * about changes to these input settings.
1222 */
1223 if (uport->flags & UPF_SOFT_FLOW) {
1224 iflag_mask |= IXANY|IXON|IXOFF;
1225 sw_changed =
1226 tty->termios.c_cc[VSTART] != old_termios->c_cc[VSTART] ||
1227 tty->termios.c_cc[VSTOP] != old_termios->c_cc[VSTOP];
1228 }
1217 1229
1218 /* 1230 /*
1219 * These are the bits that are used to setup various 1231 * These are the bits that are used to setup various
@@ -1221,11 +1233,11 @@ static void uart_set_termios(struct tty_struct *tty,
1221 * bits in c_cflag; c_[io]speed will always be set 1233 * bits in c_cflag; c_[io]speed will always be set
1222 * appropriately by set_termios() in tty_ioctl.c 1234 * appropriately by set_termios() in tty_ioctl.c
1223 */ 1235 */
1224#define RELEVANT_IFLAG(iflag) ((iflag) & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK))
1225 if ((cflag ^ old_termios->c_cflag) == 0 && 1236 if ((cflag ^ old_termios->c_cflag) == 0 &&
1226 tty->termios.c_ospeed == old_termios->c_ospeed && 1237 tty->termios.c_ospeed == old_termios->c_ospeed &&
1227 tty->termios.c_ispeed == old_termios->c_ispeed && 1238 tty->termios.c_ispeed == old_termios->c_ispeed &&
1228 RELEVANT_IFLAG(tty->termios.c_iflag ^ old_termios->c_iflag) == 0) { 1239 ((tty->termios.c_iflag ^ old_termios->c_iflag) & iflag_mask) == 0 &&
1240 !sw_changed) {
1229 return; 1241 return;
1230 } 1242 }
1231 1243