serial_bcm283x_mu: Flush RX queue after setting baud rate 86/205886/1
authorAlexander Graf <agraf@suse.de>
Wed, 7 Mar 2018 21:08:24 +0000 (22:08 +0100)
committerSeung-Woo Kim <sw0312.kim@samsung.com>
Fri, 10 May 2019 05:49:10 +0000 (14:49 +0900)
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@lundberg.email>
Reported-by: Peter Robinson <pbrobinson@gmail.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
Tested-by: Peter Robinson <pbrobinson@gmail.com>
Tested-by: Tuomas Tynkkynen <tuomas@tuxera.com>
[sw0312.kim: cherry-pick mainline commit 293b9814d760 for rpi3 uart rx]
Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Change-Id: I6eb64561ee0e3103b410850c2cadcef55c68b881

drivers/serial/serial_bcm283x_mu.c

index 5b88deb17d250dfa324bef722ba3a0574d8753ce..d8cdb1f1d4e165ba6ff904b5b05f9dc60a77e059 100644 (file)
@@ -58,6 +58,8 @@ struct bcm283x_mu_priv {
        int rx_buffer_out_pos;
 };
 
+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);
@@ -66,13 +68,17 @@ static int bcm283x_mu_serial_setbrg(struct udevice *dev, int baudrate)
        u32 divider;
 
        if (plat->disabled || 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;
 }