From e55c25206d5c99b12443eec37b4832d6817170ba Mon Sep 17 00:00:00 2001 From: Axel Haslam Date: Tue, 31 May 2016 14:36:08 +0200 Subject: greybus: uart: Handle CRTSCTS flag in termios Handle the CRTSCTS flag in set_termios, so that auto flow control can be turned off. For this, add a new flag in the line coding request specifically for this purpose. Reviewed-by: Johan Hovold Signed-off-by: Axel Haslam Signed-off-by: Greg Kroah-Hartman --- drivers/staging/greybus/greybus_protocols.h | 3 +++ drivers/staging/greybus/uart.c | 10 ++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/drivers/staging/greybus/greybus_protocols.h b/drivers/staging/greybus/greybus_protocols.h index 77ac3f2a48d2..072e5c99a934 100644 --- a/drivers/staging/greybus/greybus_protocols.h +++ b/drivers/staging/greybus/greybus_protocols.h @@ -1304,6 +1304,9 @@ struct gb_uart_set_line_coding_request { #define GB_SERIAL_SPACE_PARITY 4 __u8 data_bits; + + __u8 flow_control; +#define GB_SERIAL_AUTO_RTSCTS_EN 0x1 } __packed; /* output control lines */ diff --git a/drivers/staging/greybus/uart.c b/drivers/staging/greybus/uart.c index 5d8f4e8095d9..44d8b9ad183a 100644 --- a/drivers/staging/greybus/uart.c +++ b/drivers/staging/greybus/uart.c @@ -39,6 +39,7 @@ struct gb_tty_line_coding { __u8 format; __u8 parity; __u8 data_bits; + __u8 flow_control; }; struct gb_tty { @@ -375,9 +376,9 @@ static void gb_tty_set_termios(struct tty_struct *tty, if (C_BAUD(tty) == B0) { newline.rate = gb_tty->line_coding.rate; - newctrl &= ~GB_UART_CTRL_DTR; + newctrl &= ~(GB_UART_CTRL_DTR | GB_UART_CTRL_RTS); } else if (termios_old && (termios_old->c_cflag & CBAUD) == B0) { - newctrl |= GB_UART_CTRL_DTR; + newctrl |= (GB_UART_CTRL_DTR | GB_UART_CTRL_RTS); } if (newctrl != gb_tty->ctrlout) { @@ -385,6 +386,11 @@ static void gb_tty_set_termios(struct tty_struct *tty, send_control(gb_tty, newctrl); } + if (C_CRTSCTS(tty) && C_BAUD(tty) != B0) + newline.flow_control |= GB_SERIAL_AUTO_RTSCTS_EN; + else + newline.flow_control &= ~GB_SERIAL_AUTO_RTSCTS_EN; + if (memcmp(&gb_tty->line_coding, &newline, sizeof(newline))) { memcpy(&gb_tty->line_coding, &newline, sizeof(newline)); send_line_coding(gb_tty); -- cgit v1.2.3