diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2012-04-17 11:34:13 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2012-11-04 06:25:54 -0500 |
commit | 2cbacafd7af0f1cc7a433668c662a91ba6aabc1b (patch) | |
tree | be2e5735b395cba0bfcaf89c312a3fbdce7b05c3 /drivers/tty/serial/serial_core.c | |
parent | dec94e70e12c39440e63159e0050d46795dfcf09 (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.c | 16 |
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 | ||