forked from Imagelibrary/rtems
bsps: Improve riscv console FDT parsing
This fixes a problem with parsing the FDT compatible property by replacing the RISCV_CONSOLE_IS_COMPATIBLE macro with calls to the fdt_stringlist_contains function. The macro only works when the compatible FDT entry is a single string and not a list of strings. The new call will compare each item in the string list. Close #4728.
This commit is contained in:
committed by
Joel Sherrill
parent
e9a69c5744
commit
1d2fab8a79
@@ -139,10 +139,6 @@ static void riscv_console_set_reg_32(uintptr_t addr, uint8_t i, uint8_t val)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define RISCV_CONSOLE_IS_COMPATIBLE(actual, actual_len, desired) \
|
|
||||||
(actual_len == sizeof(desired) \
|
|
||||||
&& memcmp(actual, desired, sizeof(desired) - 1) == 0)
|
|
||||||
|
|
||||||
static void riscv_console_probe(void)
|
static void riscv_console_probe(void)
|
||||||
{
|
{
|
||||||
const void *fdt;
|
const void *fdt;
|
||||||
@@ -170,7 +166,7 @@ static void riscv_console_probe(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if RISCV_ENABLE_HTIF_SUPPORT != 0
|
#if RISCV_ENABLE_HTIF_SUPPORT != 0
|
||||||
if (RISCV_CONSOLE_IS_COMPATIBLE(compat, compat_len, "ucb,htif0")) {
|
if (fdt_stringlist_contains(compat, compat_len, "ucb,htif0")) {
|
||||||
htif_console_context_init(&htif_console_instance.base, node);
|
htif_console_context_init(&htif_console_instance.base, node);
|
||||||
|
|
||||||
riscv_console.context = &htif_console_instance.base;
|
riscv_console.context = &htif_console_instance.base;
|
||||||
@@ -181,8 +177,8 @@ static void riscv_console_probe(void)
|
|||||||
|
|
||||||
#if RISCV_CONSOLE_MAX_NS16550_DEVICES > 0
|
#if RISCV_CONSOLE_MAX_NS16550_DEVICES > 0
|
||||||
if (
|
if (
|
||||||
(RISCV_CONSOLE_IS_COMPATIBLE(compat, compat_len, "ns16550a")
|
(fdt_stringlist_contains(compat, compat_len, "ns16550a")
|
||||||
|| RISCV_CONSOLE_IS_COMPATIBLE(compat, compat_len, "ns16750"))
|
|| fdt_stringlist_contains(compat, compat_len, "ns16750"))
|
||||||
&& ns16550_devices < RISCV_CONSOLE_MAX_NS16550_DEVICES
|
&& ns16550_devices < RISCV_CONSOLE_MAX_NS16550_DEVICES
|
||||||
) {
|
) {
|
||||||
ns16550_context *ctx;
|
ns16550_context *ctx;
|
||||||
@@ -203,7 +199,7 @@ static void riscv_console_probe(void)
|
|||||||
ctx->set_reg = riscv_console_set_reg_8;
|
ctx->set_reg = riscv_console_set_reg_8;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RISCV_CONSOLE_IS_COMPATIBLE(compat, compat_len, "ns16750")) {
|
if (fdt_stringlist_contains(compat, compat_len, "ns16750")) {
|
||||||
ctx->has_precision_clock_synthesizer = true;
|
ctx->has_precision_clock_synthesizer = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -243,7 +239,7 @@ static void riscv_console_probe(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if RISCV_ENABLE_FRDME310ARTY_SUPPORT != 0
|
#if RISCV_ENABLE_FRDME310ARTY_SUPPORT != 0
|
||||||
if (RISCV_CONSOLE_IS_COMPATIBLE(compat, compat_len, "sifive,uart0")) {
|
if (fdt_stringlist_contains(compat, compat_len, "sifive,uart0")) {
|
||||||
fe310_uart_context *ctx;
|
fe310_uart_context *ctx;
|
||||||
|
|
||||||
ctx = &fe310_uart_instance;
|
ctx = &fe310_uart_instance;
|
||||||
|
|||||||
Reference in New Issue
Block a user