
On 07.03.18 13:59, Peter Robinson wrote:
On Tue, Mar 6, 2018 at 1:13 PM, Alexander Graf agraf@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 on Raspberry Pis that use pl011 for serial.
This causes my RPi2 devices not to actually boot. When I connected a HDMI monitor to one of them I get the rainbow square.
Ok, I was able to reproduce this on the RPi3 CM. See below ...
Peter
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
drivers/serial/serial_bcm283x_pl011.c | 25 ++++++++++++++++++++++++- drivers/serial/serial_pl01x.c | 10 +++++----- drivers/serial/serial_pl01x_internal.h | 7 ++++++- 3 files changed, 35 insertions(+), 7 deletions(-)
diff --git a/drivers/serial/serial_bcm283x_pl011.c b/drivers/serial/serial_bcm283x_pl011.c index bfd39f84f3..2c6fb267ff 100644 --- a/drivers/serial/serial_bcm283x_pl011.c +++ b/drivers/serial/serial_bcm283x_pl011.c @@ -9,6 +9,7 @@ #include <asm/gpio.h> #include <dm/pinctrl.h> #include <dm/platform_data/serial_pl01x.h> +#include <serial.h> #include "serial_pl01x_internal.h"
/* @@ -55,6 +56,28 @@ static int bcm283x_pl011_serial_ofdata_to_platdata(struct udevice *dev) return 0; }
+static int bcm283x_pl011_serial_setbrg(struct udevice *dev, int baudrate) +{
int r;
r = pl01x_serial_setbrg(dev, baudrate);
/*
* We may have been muxed to a bogus line before. Drain the RX
* queue so we start at a clean slate.
*/
while (pl01x_serial_getc(dev) == -EAGAIN) ;
... this is obviously wrong. It doesn't drain the queue but instead loops as long as the queue is empty. Bleks.
I'll send a v2. Please retest then. Sorry for the mess :).
Alex