[PATCH v2 2/2] serial: msm_geni: validate RX FIFO data with IRQ status flags

Casey Connolly casey.connolly at linaro.org
Wed Jul 8 14:24:18 CEST 2026


Hi Balaji,

On 7/7/26 11:52, Balaji Selvanathan wrote:
> Add IRQ status validation to distinguish legitimate UART data from
> electrical noise in the RX FIFO.
> 
> When the UART cable is disconnected, the floating RX line can pick up
> noise that the GENI hardware interprets as valid data and places in
> the FIFO. So, check the RX IRQ status register for RX watermark or last
> flags before reporting pending data.

Thanks for respinning this series. Is this patch still necessary with 
the first one? Since we should no longer be in this state with noise in 
the FIFO after resetting it correctly iiuc?

Thanks,
// Casey

> 
> Signed-off-by: Balaji Selvanathan <balaji.selvanathan at oss.qualcomm.com>
> ---
> Changes in v2:
> - No changes
> ---
>   drivers/serial/serial_msm_geni.c | 28 +++++++++++++++++++++-------
>   1 file changed, 21 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/serial/serial_msm_geni.c b/drivers/serial/serial_msm_geni.c
> index a580dee8c8a..07d38178759 100644
> --- a/drivers/serial/serial_msm_geni.c
> +++ b/drivers/serial/serial_msm_geni.c
> @@ -483,15 +483,29 @@ static int msm_serial_getc(struct udevice *dev)
>   static int msm_serial_pending(struct udevice *dev, bool input)
>   {
>   	struct msm_serial_data *priv = dev_get_priv(dev);
> +	u32 fifo_status;
> +	u32 s_irq_status;
> +	int word_count;
>   
> -	if (input)
> -		return readl(priv->base + SE_GENI_RX_FIFO_STATUS) &
> -			   RX_FIFO_WC_MSK;
> -	else
> -		return readl(priv->base + SE_GENI_TX_FIFO_STATUS) &
> -			   TX_FIFO_WC_MSK;
> +	if (input) {
> +		fifo_status = readl(priv->base + SE_GENI_RX_FIFO_STATUS);
> +		word_count = fifo_status & RX_FIFO_WC_MSK;
>   
> -	return 0;
> +		if (word_count > 0) {
> +			/* Validate RX FIFO data with IRQ status */
> +			s_irq_status = readl(priv->base + SE_GENI_S_IRQ_STATUS);
> +
> +			if (!(s_irq_status & (S_RX_FIFO_WATERMARK_EN | S_RX_FIFO_LAST_EN)))
> +				return 0;
> +		}
> +
> +		return word_count;
> +	} else {
> +		fifo_status = readl(priv->base + SE_GENI_TX_FIFO_STATUS);
> +		word_count = fifo_status & TX_FIFO_WC_MSK;
> +
> +		return word_count;
> +	}
>   }
>   
>   static const struct dm_serial_ops msm_serial_ops = {
> 



More information about the U-Boot mailing list