[U-Boot] [PATCH 04/13] dm: serial: Deal with stdout-path with an alias

Simon Glass sjg at chromium.org
Mon Aug 31 15:54:28 CEST 2015


Hi Michal,

On 31 August 2015 at 05:13, Michal Simek <monstr at monstr.eu> wrote:
> On 08/29/2015 05:10 PM, Simon Glass wrote:
>> Sometimes stdout-path contains a UART alias along with speed, etc. For
>> example:
>>
>>       stdout-path = "serial0:115200n8";
>>
>> Add support for decoding this.
>>
>> Signed-off-by: Simon Glass <sjg at chromium.org>
>> ---
>>
>>  drivers/serial/serial-uclass.c | 30 +++++++++++++++++++++++++-----
>>  1 file changed, 25 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/serial/serial-uclass.c b/drivers/serial/serial-uclass.c
>> index 55011cc..842f78b 100644
>> --- a/drivers/serial/serial-uclass.c
>> +++ b/drivers/serial/serial-uclass.c
>> @@ -29,14 +29,34 @@ static const unsigned long baudrate_table[] = CONFIG_SYS_BAUDRATE_TABLE;
>>
>>  static void serial_find_console_or_panic(void)
>>  {
>> +     const void *blob = gd->fdt_blob;
>
> This is one change and should be separated from the rest.

Yes I should do that.

>
>>       struct udevice *dev;
>>       int node;
>>
>> -     if (CONFIG_IS_ENABLED(OF_CONTROL) && gd->fdt_blob) {
>> +     if (CONFIG_IS_ENABLED(OF_CONTROL) && blob) {
>>               /* Check for a chosen console */
>> -             node = fdtdec_get_chosen_node(gd->fdt_blob, "stdout-path");
>> +             node = fdtdec_get_chosen_node(blob, "stdout-path");
>> +             if (node < 0) {
>> +                     const char *str, *p, *name;
>> +
>> +                     /*
>> +                      * Deal with things like
>> +                      *      stdout-path = "serial0:115200n8";
>> +                      *
>> +                      * We need to look up the alias and then follow it to
>> +                      * the correct node.
>> +                      */
>> +                     str = fdtdec_get_chosen_prop(blob, "stdout-path");
>> +                     if (str) {
>> +                             p = strchr(str, ':');
>> +                             name = fdt_get_alias_namelen(blob, str,
>> +                                             p ? p - str : strlen(str));
>> +                             if (name)
>> +                                     node = fdt_path_offset(blob, name);
>> +                     }
>> +             }
>
> And this is second.
>
>>               if (node < 0)
>
> You have if (node < 0) above too which looks pretty odd.

OK, but that's what I want to check...

>
>> -                     node = fdt_path_offset(gd->fdt_blob, "console");
>> +                     node = fdt_path_offset(blob, "console");
>>               if (!uclass_get_device_by_of_offset(UCLASS_SERIAL, node,
>>                                                   &dev)) {
>>                       gd->cur_serial_dev = dev;
>> @@ -48,14 +68,14 @@ static void serial_find_console_or_panic(void)
>>               * bind it anyway.
>>               */
>>               if (node > 0 &&
>> -                 !lists_bind_fdt(gd->dm_root, gd->fdt_blob, node, &dev)) {
>> +                 !lists_bind_fdt(gd->dm_root, blob, node, &dev)) {
>>                       if (!device_probe(dev)) {
>>                               gd->cur_serial_dev = dev;
>>                               return;
>>                       }
>>               }
>>       }
>> -     if (!SPL_BUILD || !CONFIG_IS_ENABLED(OF_CONTROL) || !gd->fdt_blob) {
>> +     if (!SPL_BUILD || !CONFIG_IS_ENABLED(OF_CONTROL) || !blob) {
>>               /*
>>               * Try to use CONFIG_CONS_INDEX if available (it is numbered
>>               * from 1!).
>>

Regards,
Simon


More information about the U-Boot mailing list