Message ID | 20220622154659.8710-2-LinoSanfilippo@gmx.de |
---|---|
State | New |
Headers | show |
Series | Fixes and cleanup for RS485 | expand |
Hi, On 27.06.22 11:05, Ilpo Järvinen wrote: > On Sat, 25 Jun 2022, Lukas Wunner wrote: >> >> I think what you want to do is amend uart_get_rs485_mode() to set >> SER_RS485_TERMINATE_BUS in port->rs485_supported_flags if a GPIO >> was found in the DT. Instead of the change proposed above. Agreed. > > That seems appropriate (and is a fix). > > What makes it a bit complicated though is that it's a pointer currently > and what it points to is shared per driver (besides being const): > const struct serial_rs485 *rs485_supported; > While it could be embedded into uart_port, there's the .padding which we > might not want to bloat uart_port with. Perhaps create non-uapi struct > kserial_rs485 w/o .padding and add static_assert()s to ensure the > layout is identical to serial_rs485? > > This seems to be indeed the cleanest solution. Regards, Lino
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c index 1368b0ef7d7f..015f4e1da647 100644 --- a/drivers/tty/serial/serial_core.c +++ b/drivers/tty/serial/serial_core.c @@ -3384,17 +3384,20 @@ int uart_get_rs485_mode(struct uart_port *port) rs485conf->flags |= SER_RS485_RTS_AFTER_SEND; } - /* - * Disabling termination by default is the safe choice: Else if many - * bus participants enable it, no communication is possible at all. - * Works fine for short cables and users may enable for longer cables. - */ - port->rs485_term_gpio = devm_gpiod_get_optional(dev, "rs485-term", - GPIOD_OUT_LOW); - if (IS_ERR(port->rs485_term_gpio)) { - ret = PTR_ERR(port->rs485_term_gpio); - port->rs485_term_gpio = NULL; - return dev_err_probe(dev, ret, "Cannot get rs485-term-gpios\n"); + if (port->rs485_supported->flags & SER_RS485_TERMINATE_BUS) { + /* + * Disabling termination by default is the safe choice: Else if + * many bus participants enable it, no communication is possible + * at all. Works fine for short cables and users may enable for + * longer cables. + */ + port->rs485_term_gpio = devm_gpiod_get_optional(dev, "rs485-term", + GPIOD_OUT_LOW); + if (IS_ERR(port->rs485_term_gpio)) { + ret = PTR_ERR(port->rs485_term_gpio); + port->rs485_term_gpio = NULL; + return dev_err_probe(dev, ret, "Cannot get rs485-term-gpios\n"); + } } return 0;