[U-Boot] [PATCH 2/2] serial: bcm283x_mu: Detect disabled serial device

Alexander Graf agraf at suse.de
Fri Aug 12 07:24:01 CEST 2016



> Am 12.08.2016 um 00:38 schrieb Simon Glass <sjg at chromium.org>:
> 
> Hi Alex,
> 
>> On 11 August 2016 at 05:38, Alexander Graf <agraf at suse.de> wrote:
>> On the raspberry pi, you can disable the serial port to gain dynamic frequency
>> scaling which can get handy at times.
>> 
>> However, in such a configuration the serial controller gets its rx queue filled
>> up with zero bytes which then happily get transmitted on to whoever calls
>> getc() today.
>> 
>> This patch adds detection logic for that case by checking whether the RX pin is
>> mapped to GPIO15 and disables the mini uart if it is not mapped properly.
>> 
>> That way we can leave the driver enabled in the tree and can determine during
>> runtime whether serial is usable or not, having a single binary that allows for
>> uart and non-uart operation.
>> 
>> Signed-off-by: Alexander Graf <agraf at suse.de>
>> 
>> ---
>> 
>> v2 -> v3:
>> 
>>  - Disable and detect pinmux in board file
>> ---
>> board/raspberrypi/rpi/rpi.c | 29 +++++++++++++++++++++++++++++
>> configs/rpi_3_32b_defconfig |  1 +
>> configs/rpi_3_defconfig     |  1 +
>> include/configs/rpi.h       |  1 +
>> 4 files changed, 32 insertions(+)
>> 
>> diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c
>> index 4c8253d..20b0d1b 100644
>> --- a/board/raspberrypi/rpi/rpi.c
>> +++ b/board/raspberrypi/rpi/rpi.c
>> @@ -453,6 +453,35 @@ int board_init(void)
>>        return power_on_module(BCM2835_MBOX_POWER_DEVID_USB_HCD);
>> }
>> 
>> +static bool rpi_is_serial_active(void)
>> +{
>> +#ifndef CONFIG_PL01X_SERIAL
>> +       int serial_gpio = 15;
>> +       struct udevice *dev;
>> +
>> +       /*
>> +        * The RPi3 disables the mini uart by default. The easiest way to find
>> +        * out whether it is available is to check if the pin is muxed.
>> +        */
>> +       if (uclass_first_device(UCLASS_GPIO, &dev) || !dev)
>> +               return true;
>> +
>> +       if (bcm2835_gpio_get_func_id(dev, serial_gpio) != BCM2835_GPIO_ALT5)
>> +               return false;
> 
> Do you mean gpio_get_function()?

That only tells me whether it's in/out/other, but I need to know whether the pin is configured to exactly function 5.


Alex




More information about the U-Boot mailing list