Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

RS485: fix inconsistencies in the meaning of some variables

The crisv10.c and the atmel_serial.c serial drivers intepret the fields of the
serial_rs485 structure in a different way.

In particular, crisv10.c uses SER_RS485_RTS_AFTER_SEND and
SER_RS485_RTS_ON_SEND for the voltage of the RTS pin; atmel_serial.c,
instead, uses these values to know if a delay must be set before and
after sending. This patch makes the usage of these variables consistent
across all drivers and fixes the Documentation as well.

From now on, SER_RS485_RTS_AFTER_SEND and SER_RS485_RTS_ON_SEND will be
used to set the voltage of the RTS pin (as in the crisv10.c driver); the
delay will be understood by looking only at the value of
delay_rts_before_send and delay_rts_after_send.

Signed-off-by: Claudio Scordino <claudio@evidence.eu.com>
Signed-off-by: Darron Black <darron@griffin.net>
Acked-by: Jesper Nilsson <jesper.nilsson@axis.com>
Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com>
Acked-by: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

Claudio Scordino and committed by
Greg Kroah-Hartman
93f3350c 90f04c29

+24 -30
+11 -3
Documentation/serial/serial-rs485.txt
··· 97 97 98 98 struct serial_rs485 rs485conf; 99 99 100 - /* Set RS485 mode: */ 100 + /* Enable RS485 mode: */ 101 101 rs485conf.flags |= SER_RS485_ENABLED; 102 102 103 + /* Set logical level for RTS pin equal to 1 when sending: */ 104 + rs485conf.flags |= SER_RS485_RTS_ON_SEND; 105 + /* or, set logical level for RTS pin equal to 0 when sending: */ 106 + rs485conf.flags &= ~(SER_RS485_RTS_ON_SEND); 107 + 108 + /* Set logical level for RTS pin equal to 1 after sending: */ 109 + rs485conf.flags |= SER_RS485_RTS_AFTER_SEND; 110 + /* or, set logical level for RTS pin equal to 0 after sending: */ 111 + rs485conf.flags &= ~(SER_RS485_RTS_AFTER_SEND); 112 + 103 113 /* Set rts delay before send, if needed: */ 104 - rs485conf.flags |= SER_RS485_RTS_BEFORE_SEND; 105 114 rs485conf.delay_rts_before_send = ...; 106 115 107 116 /* Set rts delay after send, if needed: */ 108 - rs485conf.flags |= SER_RS485_RTS_AFTER_SEND; 109 117 rs485conf.delay_rts_after_send = ...; 110 118 111 119 /* Set this flag if you want to receive data even whilst sending data */
+3 -13
drivers/tty/serial/atmel_serial.c
··· 228 228 if (rs485conf->flags & SER_RS485_ENABLED) { 229 229 dev_dbg(port->dev, "Setting UART to RS485\n"); 230 230 atmel_port->tx_done_mask = ATMEL_US_TXEMPTY; 231 - if (rs485conf->flags & SER_RS485_RTS_AFTER_SEND) 231 + if ((rs485conf->delay_rts_after_send) > 0) 232 232 UART_PUT_TTGR(port, rs485conf->delay_rts_after_send); 233 233 mode |= ATMEL_US_USMODE_RS485; 234 234 } else { ··· 304 304 305 305 if (atmel_port->rs485.flags & SER_RS485_ENABLED) { 306 306 dev_dbg(port->dev, "Setting UART to RS485\n"); 307 - if (atmel_port->rs485.flags & SER_RS485_RTS_AFTER_SEND) 307 + if ((atmel_port->rs485.delay_rts_after_send) > 0) 308 308 UART_PUT_TTGR(port, 309 309 atmel_port->rs485.delay_rts_after_send); 310 310 mode |= ATMEL_US_USMODE_RS485; ··· 1228 1228 1229 1229 if (atmel_port->rs485.flags & SER_RS485_ENABLED) { 1230 1230 dev_dbg(port->dev, "Setting UART to RS485\n"); 1231 - if (atmel_port->rs485.flags & SER_RS485_RTS_AFTER_SEND) 1231 + if ((atmel_port->rs485.delay_rts_after_send) > 0) 1232 1232 UART_PUT_TTGR(port, 1233 1233 atmel_port->rs485.delay_rts_after_send); 1234 1234 mode |= ATMEL_US_USMODE_RS485; ··· 1446 1446 rs485conf->delay_rts_before_send = rs485_delay[0]; 1447 1447 rs485conf->delay_rts_after_send = rs485_delay[1]; 1448 1448 rs485conf->flags = 0; 1449 - 1450 - if (rs485conf->delay_rts_before_send == 0 && 1451 - rs485conf->delay_rts_after_send == 0) { 1452 - rs485conf->flags |= SER_RS485_RTS_ON_SEND; 1453 - } else { 1454 - if (rs485conf->delay_rts_before_send) 1455 - rs485conf->flags |= SER_RS485_RTS_BEFORE_SEND; 1456 - if (rs485conf->delay_rts_after_send) 1457 - rs485conf->flags |= SER_RS485_RTS_AFTER_SEND; 1458 - } 1459 1449 1460 1450 if (of_get_property(np, "rs485-rx-during-tx", NULL)) 1461 1451 rs485conf->flags |= SER_RS485_RX_DURING_TX;
+2 -8
drivers/tty/serial/crisv10.c
··· 3234 3234 e100_disable_rx(info); 3235 3235 e100_enable_rx_irq(info); 3236 3236 #endif 3237 - if ((info->rs485.flags & SER_RS485_RTS_BEFORE_SEND) && 3238 - (info->rs485.delay_rts_before_send > 0)) 3239 - msleep(info->rs485.delay_rts_before_send); 3237 + if (info->rs485.delay_rts_before_send > 0) 3238 + msleep(info->rs485.delay_rts_before_send); 3240 3239 } 3241 3240 #endif /* CONFIG_ETRAX_RS485 */ 3242 3241 ··· 3692 3693 3693 3694 rs485data.delay_rts_before_send = rs485ctrl.delay_rts_before_send; 3694 3695 rs485data.flags = 0; 3695 - if (rs485data.delay_rts_before_send != 0) 3696 - rs485data.flags |= SER_RS485_RTS_BEFORE_SEND; 3697 - else 3698 - rs485data.flags &= ~(SER_RS485_RTS_BEFORE_SEND); 3699 3696 3700 3697 if (rs485ctrl.enabled) 3701 3698 rs485data.flags |= SER_RS485_ENABLED; ··· 4526 4531 /* Set sane defaults */ 4527 4532 info->rs485.flags &= ~(SER_RS485_RTS_ON_SEND); 4528 4533 info->rs485.flags |= SER_RS485_RTS_AFTER_SEND; 4529 - info->rs485.flags &= ~(SER_RS485_RTS_BEFORE_SEND); 4530 4534 info->rs485.delay_rts_before_send = 0; 4531 4535 info->rs485.flags &= ~(SER_RS485_ENABLED); 4532 4536 #endif
+8 -6
include/linux/serial.h
··· 207 207 208 208 struct serial_rs485 { 209 209 __u32 flags; /* RS485 feature flags */ 210 - #define SER_RS485_ENABLED (1 << 0) 211 - #define SER_RS485_RTS_ON_SEND (1 << 1) 212 - #define SER_RS485_RTS_AFTER_SEND (1 << 2) 213 - #define SER_RS485_RTS_BEFORE_SEND (1 << 3) 210 + #define SER_RS485_ENABLED (1 << 0) /* If enabled */ 211 + #define SER_RS485_RTS_ON_SEND (1 << 1) /* Logical level for 212 + RTS pin when 213 + sending */ 214 + #define SER_RS485_RTS_AFTER_SEND (1 << 2) /* Logical level for 215 + RTS pin after sent*/ 214 216 #define SER_RS485_RX_DURING_TX (1 << 4) 215 - __u32 delay_rts_before_send; /* Milliseconds */ 216 - __u32 delay_rts_after_send; /* Milliseconds */ 217 + __u32 delay_rts_before_send; /* Delay before send (milliseconds) */ 218 + __u32 delay_rts_after_send; /* Delay after send (milliseconds) */ 217 219 __u32 padding[5]; /* Memory is cheap, new structs 218 220 are a royal PITA .. */ 219 221 };