Commit 1b6331848b69d1ed165a6bdc75c4046d68767563
Committed by
Greg Kroah-Hartman
1 parent
93e3d58284
Exists in
master
and in
7 other branches
serial: general fixes in the serial_rs485 structure
Fix several issues related to the RS485 interface: - It adds the flag SER_RS485_RTS_BEFORE_SEND that was missing from the serial_rs485 structure (even if "delay_rts_before_send" was existing) - It adds a further "delay_rts_after_send" field for those drivers that can have a delay after send (e.g., atmel_serial) - It fixes the usage of the structure in the atmel_serial driver (where "delay_rts_before_send" should be used instead of "delay_rts_after_send"). Signed-off-by: Claudio Scordino <claudio@evidence.eu.com> Signed-off-by: Bernhard Roth <br@pwrnet.de> Cc: Philippe De Muyter <phdm@macqel.be> Cc: Alan Cox <alan@lxorguk.ukuu.org.uk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Showing 2 changed files with 11 additions and 4 deletions Side-by-side Diff
drivers/serial/atmel_serial.c
... | ... | @@ -217,7 +217,8 @@ |
217 | 217 | if (rs485conf->flags & SER_RS485_ENABLED) { |
218 | 218 | dev_dbg(port->dev, "Setting UART to RS485\n"); |
219 | 219 | atmel_port->tx_done_mask = ATMEL_US_TXEMPTY; |
220 | - UART_PUT_TTGR(port, rs485conf->delay_rts_before_send); | |
220 | + if (rs485conf->flags & SER_RS485_RTS_AFTER_SEND) | |
221 | + UART_PUT_TTGR(port, rs485conf->delay_rts_after_send); | |
221 | 222 | mode |= ATMEL_US_USMODE_RS485; |
222 | 223 | } else { |
223 | 224 | dev_dbg(port->dev, "Setting UART to RS232\n"); |
... | ... | @@ -292,7 +293,9 @@ |
292 | 293 | |
293 | 294 | if (atmel_port->rs485.flags & SER_RS485_ENABLED) { |
294 | 295 | dev_dbg(port->dev, "Setting UART to RS485\n"); |
295 | - UART_PUT_TTGR(port, atmel_port->rs485.delay_rts_before_send); | |
296 | + if (atmel_port->rs485.flags & SER_RS485_RTS_AFTER_SEND) | |
297 | + UART_PUT_TTGR(port, | |
298 | + atmel_port->rs485.delay_rts_after_send); | |
296 | 299 | mode |= ATMEL_US_USMODE_RS485; |
297 | 300 | } else { |
298 | 301 | dev_dbg(port->dev, "Setting UART to RS232\n"); |
... | ... | @@ -1211,7 +1214,9 @@ |
1211 | 1214 | |
1212 | 1215 | if (atmel_port->rs485.flags & SER_RS485_ENABLED) { |
1213 | 1216 | dev_dbg(port->dev, "Setting UART to RS485\n"); |
1214 | - UART_PUT_TTGR(port, atmel_port->rs485.delay_rts_before_send); | |
1217 | + if (atmel_port->rs485.flags & SER_RS485_RTS_AFTER_SEND) | |
1218 | + UART_PUT_TTGR(port, | |
1219 | + atmel_port->rs485.delay_rts_after_send); | |
1215 | 1220 | mode |= ATMEL_US_USMODE_RS485; |
1216 | 1221 | } else { |
1217 | 1222 | dev_dbg(port->dev, "Setting UART to RS232\n"); |
include/linux/serial.h
... | ... | @@ -210,8 +210,10 @@ |
210 | 210 | #define SER_RS485_ENABLED (1 << 0) |
211 | 211 | #define SER_RS485_RTS_ON_SEND (1 << 1) |
212 | 212 | #define SER_RS485_RTS_AFTER_SEND (1 << 2) |
213 | +#define SER_RS485_RTS_BEFORE_SEND (1 << 3) | |
213 | 214 | __u32 delay_rts_before_send; /* Milliseconds */ |
214 | - __u32 padding[6]; /* Memory is cheap, new structs | |
215 | + __u32 delay_rts_after_send; /* Milliseconds */ | |
216 | + __u32 padding[5]; /* Memory is cheap, new structs | |
215 | 217 | are a royal PITA .. */ |
216 | 218 | }; |
217 | 219 |