X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=drivers%2Fserial%2Fserial-uclass.c;h=a0af0e6bfde265952e2126c7087f4b9053c9417b;hb=c05ed00afb95fa5237f16962fccf5810437317bf;hp=e50f0aa851061fd2a1f00fa2f5225a699bf55f5e;hpb=e6cd05e5025bbab9723bbb09c506cbb5aa63bc53;p=oweals%2Fu-boot.git diff --git a/drivers/serial/serial-uclass.c b/drivers/serial/serial-uclass.c index e50f0aa851..a0af0e6bfd 100644 --- a/drivers/serial/serial-uclass.c +++ b/drivers/serial/serial-uclass.c @@ -5,8 +5,9 @@ #include #include -#include +#include #include +#include #include #include #include @@ -14,6 +15,7 @@ #include #include #include +#include DECLARE_GLOBAL_DATA_PTR; @@ -29,29 +31,31 @@ static const unsigned long baudrate_table[] = CONFIG_SYS_BAUDRATE_TABLE; #if CONFIG_IS_ENABLED(SERIAL_PRESENT) static int serial_check_stdout(const void *blob, struct udevice **devp) { - int node; + int node = -1; + const char *str, *p, *name; + int namelen; /* Check for a chosen console */ - 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)); + str = fdtdec_get_chosen_prop(blob, "stdout-path"); + if (str) { + p = strchr(str, ':'); + namelen = p ? p - str : strlen(str); + node = fdt_path_offset_namelen(blob, str, namelen); + + if (node < 0) { + /* + * Deal with things like + * stdout-path = "serial0:115200n8"; + * + * We need to look up the alias and then follow it to + * the correct node. + */ + name = fdt_get_alias_namelen(blob, str, namelen); if (name) node = fdt_path_offset(blob, name); } } + if (node < 0) node = fdt_path_offset(blob, "console"); if (!uclass_get_device_by_of_offset(UCLASS_SERIAL, node, devp)) @@ -62,7 +66,7 @@ static int serial_check_stdout(const void *blob, struct udevice **devp) * anyway. */ if (node > 0 && !lists_bind_fdt(gd->dm_root, offset_to_ofnode(node), - devp)) { + devp, false)) { if (!device_probe(*devp)) return 0; } @@ -159,6 +163,7 @@ int serial_init(void) #if CONFIG_IS_ENABLED(SERIAL_PRESENT) serial_find_console_or_panic(); gd->flags |= GD_FLG_SERIAL_READY; + serial_setbrg(); #endif return 0; @@ -294,20 +299,44 @@ void serial_setbrg(void) ops->setbrg(gd->cur_serial_dev, gd->baudrate); } -int serial_setconfig(uint config) +int serial_getconfig(struct udevice *dev, uint *config) { struct dm_serial_ops *ops; - if (!gd->cur_serial_dev) - return 0; + ops = serial_get_ops(dev); + if (ops->getconfig) + return ops->getconfig(dev, config); - ops = serial_get_ops(gd->cur_serial_dev); + return 0; +} + +int serial_setconfig(struct udevice *dev, uint config) +{ + struct dm_serial_ops *ops; + + ops = serial_get_ops(dev); if (ops->setconfig) - return ops->setconfig(gd->cur_serial_dev, config); + return ops->setconfig(dev, config); return 0; } +int serial_getinfo(struct udevice *dev, struct serial_device_info *info) +{ + struct dm_serial_ops *ops; + + if (!info) + return -EINVAL; + + info->baudrate = gd->baudrate; + + ops = serial_get_ops(dev); + if (ops->getinfo) + return ops->getinfo(dev, info); + + return -EINVAL; +} + void serial_stdio_init(void) { } @@ -419,12 +448,16 @@ static int serial_post_probe(struct udevice *dev) ops->pending += gd->reloc_off; if (ops->clear) ops->clear += gd->reloc_off; + if (ops->getconfig) + ops->getconfig += gd->reloc_off; if (ops->setconfig) ops->setconfig += gd->reloc_off; #if CONFIG_POST & CONFIG_SYS_POST_UART if (ops->loop) - ops->loop += gd->reloc_off + ops->loop += gd->reloc_off; #endif + if (ops->getinfo) + ops->getinfo += gd->reloc_off; #endif /* Set the baud rate */ if (ops->setbrg) {