RE: [PATCH] serial: fsl_lpuart: Skip the reset for the early console port

From: Sherry Sun
Date: Mon Oct 24 2022 - 05:57:11 EST




> -----Original Message-----
> From: Xiaolei Wang <xiaolei.wang@xxxxxxxxxxxxx>
> Sent: 2022年10月24日 17:12
> To: gregkh@xxxxxxxxxxxxxxxxxxx; jirislaby@xxxxxxxxxx; lukas@xxxxxxxxx
> Cc: fugang.duan@xxxxxxx; Sherry Sun <sherry.sun@xxxxxxx>;
> ilpo.jarvinen@xxxxxxxxxxxxxxx; linux-serial@xxxxxxxxxxxxxxx; linux-
> kernel@xxxxxxxxxxxxxxx
> Subject: [PATCH] serial: fsl_lpuart: Skip the reset for the early console port
>
> The commit 60f361722ad2 ("serial: fsl_lpuart: Reset prior to
> registration") has moved the reset before the port registration, this change
> makes the uart_console() in lpuart_global_reset() no sense since the port is
> not registered to the system yet. So drop it.
> But we sill need to check if the port is used as an early console before
> performing the port reset, otherwise the reset will hang the system.
>
> Fixes: 60f361722ad2 ("serial: fsl_lpuart: Reset prior to registration")
> Signed-off-by: Xiaolei Wang <xiaolei.wang@xxxxxxxxxxxxx>
> ---
> drivers/tty/serial/fsl_lpuart.c | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c
> index 67fa113f77d4..d0efeba5c695 100644
> --- a/drivers/tty/serial/fsl_lpuart.c
> +++ b/drivers/tty/serial/fsl_lpuart.c
> @@ -239,6 +239,8 @@
> /* IMX lpuart has four extra unused regs located at the beginning */
> #define IMX_REG_OFF 0x10
>
> +static resource_size_t lpuart_earlycon_mapbase;
> +
> enum lpuart_type {
> VF610_LPUART,
> LS1021A_LPUART,
> @@ -410,7 +412,7 @@ static int lpuart_global_reset(struct lpuart_port
> *sport)
> void __iomem *global_addr;
> int ret;
>
> - if (uart_console(port))
> + if ((port->mapbase - 0x10) == lpuart_earlycon_mapbase)
> return 0;
>
> ret = clk_prepare_enable(sport->ipg_clk);
> @@ -2604,6 +2606,7 @@ static int __init
> lpuart32_imx_early_console_setup(struct earlycon_device *devic
> device->port.iotype = UPIO_MEM32;
> device->port.membase += IMX_REG_OFF;
> device->con->write = lpuart32_early_write;
> + lpuart_earlycon_mapbase = device->port.mapbase;
>

Hi, thanks for the fix for lpuart driver, but this looks more like a workaround patch.
Per my understanding, the root cause for this issue is that lpuart_global_reset() break the on-going transfer, such as the earlycon here.
I have sent a patch to fix the lpuart console hang issue, please check https://lore.kernel.org/lkml/20221024085844.22786-1-sherry.sun@xxxxxxx/

Best Regards
Sherry