[U-Boot] [PATCH 1/2] serial_bcm283x_mu: Flush RX queue after setting baud rate

Peter Robinson pbrobinson at gmail.com
Wed Mar 7 12:57:54 UTC 2018


On Tue, Mar 6, 2018 at 1:13 PM, Alexander Graf <agraf at suse.de> wrote:
> After the UART was initialized, we may still have bogus data in the
> RX queue if it was enabled with incorrect pin muxing before.
>
> So let's flush the RX queue whenever we initialize baud rates.
>
> This fixes a regression with the dynamic pinmuxing code when enable_uart=1
> is not set in config.txt.
>
> Fixes: caf2233b28 ("bcm283x: Add pinctrl driver")
> Reported-by: Göran Lundberg <goran at lundberg.email>
> Reported-by: Peter Robinson <pbrobinson at gmail.com>
> Signed-off-by: Alexander Graf <agraf at suse.de>

Tested-by: Peter Robinson <pbrobinson at gmail.com>

Tested on both 32 bit using extlinux and 64 bit using uEFI boots. The
32 bit one, the one I saw issues with, didn't enable enable_uart
because it's attached to HDMI without a serial console, the 64 does
have serial console with the option in config.txt

> ---
>  drivers/serial/serial_bcm283x_mu.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/serial/serial_bcm283x_mu.c b/drivers/serial/serial_bcm283x_mu.c
> index 40029fadbc..d87b44e902 100644
> --- a/drivers/serial/serial_bcm283x_mu.c
> +++ b/drivers/serial/serial_bcm283x_mu.c
> @@ -51,6 +51,8 @@ struct bcm283x_mu_priv {
>         struct bcm283x_mu_regs *regs;
>  };
>
> +static int bcm283x_mu_serial_getc(struct udevice *dev);
> +
>  static int bcm283x_mu_serial_setbrg(struct udevice *dev, int baudrate)
>  {
>         struct bcm283x_mu_serial_platdata *plat = dev_get_platdata(dev);
> @@ -59,13 +61,17 @@ static int bcm283x_mu_serial_setbrg(struct udevice *dev, int baudrate)
>         u32 divider;
>
>         if (plat->skip_init)
> -               return 0;
> +               goto out;
>
>         divider = plat->clock / (baudrate * 8);
>
>         writel(BCM283X_MU_LCR_DATA_SIZE_8, &regs->lcr);
>         writel(divider - 1, &regs->baud);
>
> +out:
> +       /* Flush the RX queue - all data in there is bogus */
> +       while (bcm283x_mu_serial_getc(dev) != -EAGAIN) ;
> +
>         return 0;
>  }
>
> --
> 2.12.3
>


More information about the U-Boot mailing list