On 21.11.23 at 10:51, Crescent CY Hsieh wrote: > Add "SER_RS485_MODE_RS422" flag to struct serial_rs485, so that serial > port can switch interface into RS422 if supported by using ioctl command > "TIOCSRS485". > > By treating RS422 as a mode of RS485, which means while enabling RS422 > there are two flags need to be set (SER_RS485_ENABLED and > SER_RS485_MODE_RS422), it would make things much easier. For example > some places that checks for "SER_RS485_ENABLED" won't need to be rewritten. > > Signed-off-by: Crescent CY Hsieh <crescentcy.hsieh@xxxxxxxx> > > --- > Changes from v4 to v5: > - Revise commit message. > - Delete RS422 checks within uart_set_rs485_termination(). > > Changes from v3 to v4: > - Include 'linux/const.h' header in '/include/uapi/linux/serial.h' > - Replace BIT() with _BITUL() which defined in > '/include/uapi/linux/const.h' > > Changes from v2 to v3: > - Remove "SER_RS422_ENABLED" flag from legacy flags. > - Revise "SER_RS422_ENABLED" into "SER_RS485_MODE_RS422". > - Remove the code which checks the conflicts between SER_RS485_ENABLED > and SER_RS422_ENABLED. > - Add return check in uart_set_rs485_termination(). > > Changes from v1 to v2: > - Revise the logic that checks whether RS422/RS485 are enabled > simultaneously. > > v4: https://lore.kernel.org/all/20231113094136.52003-1-crescentcy.hsieh@xxxxxxxx/ > v3: https://lore.kernel.org/all/20231108060719.11775-1-crescentcy.hsieh@xxxxxxxx/ > v2: https://lore.kernel.org/all/20231101064404.45711-1-crescentcy.hsieh@xxxxxxxx/ > v1: https://lore.kernel.org/all/20231030053632.5109-1-crescentcy.hsieh@xxxxxxxx/ > > --- > drivers/tty/serial/serial_core.c | 7 +++++++ > include/uapi/linux/serial.h | 19 +++++++++++-------- > 2 files changed, 18 insertions(+), 8 deletions(-) > > diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c > index 831d03361..db1ebed7f 100644 > --- a/drivers/tty/serial/serial_core.c > +++ b/drivers/tty/serial/serial_core.c > @@ -1376,6 +1376,13 @@ static void uart_sanitize_serial_rs485(struct uart_port *port, struct serial_rs4 > return; > } > > + /* Clear other RS485 flags and return if enabling RS422 */ > + if (rs485->flags & SER_RS485_MODE_RS422) { > + memset(rs485, 0, sizeof(*rs485)); > + rs485->flags |= (SER_RS485_ENABLED | SER_RS485_MODE_RS422); Does not RS422 also require termination resistors? So what about SER_RS485_TERMINATE_BUS? Regards, Lino