mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 15:14:43 +00:00
dm: serial: Handle "stdout-path" with ":options" correctly
With commitf0921f5098
("fdt: Sync up to the latest libfdt"), SiFive Unleashed board does not boot any more. This was due to the U-Boot local changes commit77d7fff8ce
("fdt: Fix handling of paths with options in them") to libfdt/fdt_ro.c was dropped during the libfdt upgrade. >From the history [1] it was mentioned that the U-Boot changes commit77d7fff8ce
("fdt: Fix handling of paths with options in them") was rejected by libfdt upstream, hence we need find another way to fix the things. This commit uses another method, by updating serial_check_stdout() directly to handle the situation of "stdout-path" with ":options". A simpler way is to change the logic in fdtdec_get_chosen_node() to do similar thing, but I feel that not every property in chosen node may have the option in them, hence it would make more sense to do the special handling in serial_check_stdout() directly. [1]: http://patchwork.ozlabs.org/patch/462756/ Signed-off-by: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
dd38416d6b
commit
151f275e05
1 changed files with 18 additions and 16 deletions
|
@ -29,29 +29,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;
|
||||
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);
|
||||
|
||||
/*
|
||||
* 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 (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))
|
||||
|
|
Loading…
Reference in a new issue