Skip to content

Commit 6379841

Browse files
committed
serial: Deduplicate rs485 sanitization
Signed-off-by: Lukas Wunner <lukas@wunner.de>
1 parent 82c9896 commit 6379841

File tree

4 files changed

+32
-27
lines changed

4 files changed

+32
-27
lines changed

drivers/tty/serial/8250/8250_port.c

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -673,20 +673,10 @@ int serial8250_em485_config(struct uart_port *port, struct serial_rs485 *rs485)
673673
{
674674
struct uart_8250_port *up = up_to_u8250p(port);
675675

676-
/* pick sane settings if the user hasn't */
677-
if (!!(rs485->flags & SER_RS485_RTS_ON_SEND) ==
678-
!!(rs485->flags & SER_RS485_RTS_AFTER_SEND)) {
679-
rs485->flags |= SER_RS485_RTS_ON_SEND;
680-
rs485->flags &= ~SER_RS485_RTS_AFTER_SEND;
681-
}
682-
683-
/* clamp the delays to [0, 100ms] */
684-
rs485->delay_rts_before_send = min(rs485->delay_rts_before_send, 100U);
685-
rs485->delay_rts_after_send = min(rs485->delay_rts_after_send, 100U);
686-
687-
memset(rs485->padding, 0, sizeof(rs485->padding));
688676
port->rs485 = *rs485;
689677

678+
uart_sanitize_rs485_mode(port);
679+
690680
gpiod_set_value(port->rs485_term_gpio,
691681
rs485->flags & SER_RS485_TERMINATE_BUS);
692682

drivers/tty/serial/amba-pl011.c

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2170,22 +2170,12 @@ static int pl011_rs485_config(struct uart_port *port,
21702170
struct uart_amba_port *uap =
21712171
container_of(port, struct uart_amba_port, port);
21722172

2173-
/* pick sane settings if the user hasn't */
2174-
if (!(rs485->flags & SER_RS485_RTS_ON_SEND) ==
2175-
!(rs485->flags & SER_RS485_RTS_AFTER_SEND)) {
2176-
rs485->flags |= SER_RS485_RTS_ON_SEND;
2177-
rs485->flags &= ~SER_RS485_RTS_AFTER_SEND;
2178-
}
2179-
/* clamp the delays to [0, 100ms] */
2180-
rs485->delay_rts_before_send = min(rs485->delay_rts_before_send, 100U);
2181-
rs485->delay_rts_after_send = min(rs485->delay_rts_after_send, 100U);
2182-
memset(rs485->padding, 0, sizeof(rs485->padding));
2183-
21842173
if (port->rs485.flags & SER_RS485_ENABLED)
21852174
pl011_rs485_tx_stop(uap);
21862175

21872176
/* Set new configuration */
21882177
port->rs485 = *rs485;
2178+
uart_sanitize_rs485_mode(port);
21892179

21902180
/* Make sure auto RTS is disabled */
21912181
if (port->rs485.flags & SER_RS485_ENABLED) {
@@ -2662,16 +2652,13 @@ static int pl011_find_free_port(void)
26622652
static int pl011_get_rs485_mode(struct uart_amba_port *uap)
26632653
{
26642654
struct uart_port *port = &uap->port;
2665-
struct serial_rs485 *rs485 = &port->rs485;
26662655
int ret;
26672656

26682657
ret = uart_get_rs485_mode(port);
26692658
if (ret)
26702659
return ret;
26712660

2672-
/* clamp the delays to [0, 100ms] */
2673-
rs485->delay_rts_before_send = min(rs485->delay_rts_before_send, 100U);
2674-
rs485->delay_rts_after_send = min(rs485->delay_rts_after_send, 100U);
2661+
uart_sanitize_rs485_mode(port);
26752662

26762663
return 0;
26772664
}

drivers/tty/serial/serial_core.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3271,5 +3271,32 @@ int uart_get_rs485_mode(struct uart_port *port)
32713271
}
32723272
EXPORT_SYMBOL_GPL(uart_get_rs485_mode);
32733273

3274+
/**
3275+
* uart_sanitize_rs485_mode() - sanitize rs485 properties for given uart
3276+
* @port: uart device's target port
3277+
*
3278+
* Correct faulty rs485 properties after they're passed in from user space
3279+
* through a TIOCSRS485 ioctl() or retrieved from the device tree or ACPI.
3280+
*/
3281+
void uart_sanitize_rs485_mode(struct uart_port *port)
3282+
{
3283+
struct serial_rs485 *rs485 = &port->rs485;
3284+
struct device *dev = port->dev;
3285+
3286+
/* assume active-high polarity if settings are nonsensical */
3287+
if (!!(rs485->flags & SER_RS485_RTS_ON_SEND) ==
3288+
!!(rs485->flags & SER_RS485_RTS_AFTER_SEND)) {
3289+
rs485->flags |= SER_RS485_RTS_ON_SEND;
3290+
rs485->flags &= ~SER_RS485_RTS_AFTER_SEND;
3291+
}
3292+
3293+
/* clamp the delays to [0, 100ms] */
3294+
rs485->delay_rts_before_send = min(rs485->delay_rts_before_send, 100U);
3295+
rs485->delay_rts_after_send = min(rs485->delay_rts_after_send, 100U);
3296+
3297+
memset(rs485->padding, 0, sizeof(rs485->padding));
3298+
}
3299+
EXPORT_SYMBOL_GPL(uart_sanitize_rs485_mode);
3300+
32743301
MODULE_DESCRIPTION("Serial driver core");
32753302
MODULE_LICENSE("GPL");

include/linux/serial_core.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -589,4 +589,5 @@ static inline int uart_handle_break(struct uart_port *port)
589589
!((cflag) & CLOCAL))
590590

591591
int uart_get_rs485_mode(struct uart_port *port);
592+
void uart_sanitize_rs485_mode(struct uart_port *port);
592593
#endif /* LINUX_SERIAL_CORE_H */

0 commit comments

Comments
 (0)