Re: [PATCH] serial: fsl_lpuart: add support for GPIO-controlled modem lines

From: Greg Kroah-Hartman

Date: Wed Sep 23 2026 - 08:59:40 EST


On Wed, Aug 19, 2026 at 04:44:53PM +0200, João Loureiro wrote:
> LPUART has no register bit to drive RTS to a chosen level: UARTMODIR only
> offers receiver-driven auto-RTS (RXRTSE) and RTS-during-transmit (TXRTSE).
> Consequently lpuart_set_mctrl() and lpuart32_set_mctrl() ignore TIOCM_RTS,
> and their get_mctrl() counterparts report a hardcoded
> TIOCM_CAR | TIOCM_DSR | TIOCM_CTS.
>
> That makes it impossible to talk to a peripheral which is driven by a
> software controlled RTS strobe and answers on CTS. TIOCMBIS/TIOCMBIC
> silently do nothing, and because CTS always reads back as asserted, a
> userspace handshake that waits for CTS to follow RTS can never complete:
> de-asserting RTS and waiting for CTS to drop times out every time. Boards
> that route the two pins to plain GPIOs cannot work around it either, since
> the driver never looks at rts-gpios/cts-gpios.
>
> Wire the driver up to the serial_mctrl_gpio helpers, as imx.c and
> atmel_serial.c already do. set_mctrl() forwards the state to
> mctrl_gpio_set(), and get_mctrl() runs the flags through mctrl_gpio_get()
> so that a described cts-gpios overrides the assumed-asserted default.
> Boards without such a description keep the previous behaviour. Modem
> status interrupts are enabled from startup() and disabled from shutdown(),
> with a .enable_ms callback for the serial core.
>
> The same limitation was reported for an i.MX 8XLite board that needs RS-485
> with a GPIO RTS [1]. This change was developed and tested on an i.MX95
> board whose barcode scanner is driven over LPUART with a manual RTS strobe;
> with it, RTS toggles as requested and CTS is reported from the real pin.
>
> [1] https://lore.kernel.org/all/20260210-rearview-hungrily-536a95fc3385@xxxxxxxxxxx/
>
> Signed-off-by: João Loureiro <joaofl@xxxxxxxxx>
> ---
> drivers/tty/serial/Kconfig | 1 +
> drivers/tty/serial/fsl_lpuart.c | 35 +++++++++++++++++++++++++++++++--
> 2 files changed, 34 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig
> index 4f57833e3ec7..a173eaf769ff 100644
> --- a/drivers/tty/serial/Kconfig
> +++ b/drivers/tty/serial/Kconfig
> @@ -1301,6 +1301,7 @@ config SERIAL_FSL_LPUART
> tristate "Freescale lpuart serial port support"
> depends on HAS_DMA
> select SERIAL_CORE
> + select SERIAL_MCTRL_GPIO if GPIOLIB

Why not depends?

thanks,

greg k-h