[U-Boot] [PATCH 2/2] bcm283x_pl011: Flush RX queue after setting baud rate
Alexander Graf
agraf at suse.de
Wed Mar 7 21:06:26 UTC 2018
On 07.03.18 13:59, Peter Robinson wrote:
> 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 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 at lundberg.email>
>> Reported-by: Peter Robinson <pbrobinson at gmail.com>
>> Signed-off-by: Alexander Graf <agraf at 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
More information about the U-Boot
mailing list