From 0a0093b0bc8671d3a00cf1bb71d56cabab9474e1 Mon Sep 17 00:00:00 2001 From: Anup Patel Date: Sat, 25 Apr 2020 18:33:54 +0530 Subject: [PATCH] lib: utils: Add fdt_parse_uart8250_node() function We add fdt_parse_uart8250_node() function which will allow us to parse a particular DT node as UART 8250 node. This will be useful in parsing the node pointed by stdout-path. Signed-off-by: Anup Patel Reviewed-by: Atish Patra --- include/sbi_utils/fdt/fdt_helper.h | 3 +++ lib/utils/fdt/fdt_helper.c | 37 +++++++++++++++++++----------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/include/sbi_utils/fdt/fdt_helper.h b/include/sbi_utils/fdt/fdt_helper.h index d3cc791e..1fbc215e 100644 --- a/include/sbi_utils/fdt/fdt_helper.h +++ b/include/sbi_utils/fdt/fdt_helper.h @@ -23,6 +23,9 @@ struct platform_plic_data { unsigned long num_src; }; +int fdt_parse_uart8250_node(void *fdt, int nodeoffset, + struct platform_uart_data *uart); + int fdt_parse_uart8250(void *fdt, struct platform_uart_data *uart, const char *compatible); diff --git a/lib/utils/fdt/fdt_helper.c b/lib/utils/fdt/fdt_helper.c index f620e742..4757f19c 100644 --- a/lib/utils/fdt/fdt_helper.c +++ b/lib/utils/fdt/fdt_helper.c @@ -58,21 +58,15 @@ static int fdt_get_node_addr_size(void *fdt, int node, unsigned long *addr, return 0; } -int fdt_parse_uart8250(void *fdt, struct platform_uart_data *uart, - const char *compatible) +int fdt_parse_uart8250_node(void *fdt, int nodeoffset, + struct platform_uart_data *uart) { - int nodeoffset, len, rc; - fdt32_t *val; + int len, rc; + const fdt32_t *val; unsigned long reg_addr, reg_size; - /** - * TODO: We don't know how to handle multiple nodes with the same - * compatible sring. Just return the first node for now. - */ - - nodeoffset = fdt_node_offset_by_compatible(fdt, -1, compatible); - if (nodeoffset < 0) - return nodeoffset; + if (nodeoffset < 0 || !uart || !fdt) + return SBI_ENODEV; rc = fdt_get_node_addr_size(fdt, nodeoffset, ®_addr, ®_size); if (rc < 0 || !reg_addr || !reg_size) @@ -80,8 +74,8 @@ int fdt_parse_uart8250(void *fdt, struct platform_uart_data *uart, uart->addr = reg_addr; /** - * UART address is mandaotry. clock-frequency and current-speed may not - * be present. Don't return error. + * UART address is mandaotry. clock-frequency and current-speed + * may not be present. Don't return error. */ val = (fdt32_t *)fdt_getprop(fdt, nodeoffset, "clock-frequency", &len); if (len > 0 && val) @@ -110,6 +104,21 @@ int fdt_parse_uart8250(void *fdt, struct platform_uart_data *uart, return 0; } +int fdt_parse_uart8250(void *fdt, struct platform_uart_data *uart, + const char *compatible) +{ + int nodeoffset; + + if (!compatible || !uart || !fdt) + return SBI_ENODEV; + + nodeoffset = fdt_node_offset_by_compatible(fdt, -1, compatible); + if (nodeoffset < 0) + return nodeoffset; + + return fdt_parse_uart8250_node(fdt, nodeoffset, uart); +} + int fdt_parse_plic(void *fdt, struct platform_plic_data *plic, const char *compatible) {