[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