From mboxrd@z Thu Jan 1 00:00:00 1970 From: Peter Robinson Date: Wed, 7 Mar 2018 12:57:54 +0000 Subject: [U-Boot] [PATCH 1/2] serial_bcm283x_mu: Flush RX queue after setting baud rate In-Reply-To: <20180306131327.61174-2-agraf@suse.de> References: <20180306131327.61174-1-agraf@suse.de> <20180306131327.61174-2-agraf@suse.de> Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable To: u-boot@lists.denx.de On Tue, Mar 6, 2018 at 1:13 PM, Alexander Graf 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= =3D1 > is not set in config.txt. > > Fixes: caf2233b28 ("bcm283x: Add pinctrl driver") > Reported-by: G=C3=B6ran Lundberg > Reported-by: Peter Robinson > Signed-off-by: Alexander Graf Tested-by: Peter Robinson 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_b= cm283x_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 =3D dev_get_platdata(dev); > @@ -59,13 +61,17 @@ static int bcm283x_mu_serial_setbrg(struct udevice *d= ev, int baudrate) > u32 divider; > > if (plat->skip_init) > - return 0; > + goto out; > > divider =3D plat->clock / (baudrate * 8); > > writel(BCM283X_MU_LCR_DATA_SIZE_8, ®s->lcr); > writel(divider - 1, ®s->baud); > > +out: > + /* Flush the RX queue - all data in there is bogus */ > + while (bcm283x_mu_serial_getc(dev) !=3D -EAGAIN) ; > + > return 0; > } > > -- > 2.12.3 >