[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20220625195844.GB2879@wunner.de>
Date: Sat, 25 Jun 2022 21:58:44 +0200
From: Lukas Wunner <lukas@...ner.de>
To: Lino Sanfilippo <LinoSanfilippo@....de>
Cc: gregkh@...uxfoundation.org, jirislaby@...nel.org,
ilpo.jarvinen@...ux.intel.com, robh+dt@...nel.org,
krzysztof.kozlowski+dt@...aro.org,
andriy.shevchenko@...ux.intel.com, vz@...ia.com,
linux-arm-kernel@...ts.infradead.org, devicetree@...r.kernel.org,
linux-serial@...r.kernel.org, linux-kernel@...r.kernel.org,
p.rosenberger@...bus.com, Lino Sanfilippo <l.sanfilippo@...bus.com>
Subject: Re: [PATCH 2/8] serial: core, 8250: set RS485 termination gpio in
serial core
On Wed, Jun 22, 2022 at 05:46:53PM +0200, Lino Sanfilippo wrote:
> From: Lino Sanfilippo <l.sanfilippo@...bus.com>
>
> In serial8250_em485_config() the termination GPIO is set with the uart_port
> spinlock held. This is an issue if setting the GPIO line can sleep (e.g.
> since the concerning GPIO expander is connected via SPI or I2C).
>
> Fix this by setting the termination line outside of the uart_port spinlock
> in the serial core.
[...]
> --- a/drivers/tty/serial/serial_core.c
> +++ b/drivers/tty/serial/serial_core.c
> @@ -1400,6 +1411,7 @@ static int uart_set_rs485_config(struct uart_port *port,
> if (ret)
> return ret;
> uart_sanitize_serial_rs485(port, &rs485);
> + uart_set_rs485_termination(port, &rs485);
>
> spin_lock_irqsave(&port->lock, flags);
> ret = port->rs485_config(port, &rs485);
That's one way to solve the issue. Another would be to push
acquisition of the port spinlock down into drivers.
I think in most drivers we don't need to take the port spinlock at all
or only for a few specific register accesses. So taking the lock here
in the midlayer is likely unwarranted. However, changing that requires
going through every single driver's ->rs485_config() callback and
checking whether it needs the lock or not. That's painful, but
unavoidable in the long run. This patch just kicks the can down the road...
Thanks,
Lukas
Powered by blists - more mailing lists