diff options
author | Xiang W <wxjstz@126.com> | 2023-05-22 13:18:07 +0800 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2023-05-26 12:37:25 +0530 |
commit | 264d0be1fdd93874bc8f4a365c911e15ec330ce5 (patch) | |
tree | 1a18fe46baae634e86e9a3d7562e876461b8be28 /lib/utils/serial/fdt_serial.c | |
parent | 8b99a7f7d8294be29e18a667d51e13755ed2c0e0 (diff) | |
download | opensbi-264d0be1fdd93874bc8f4a365c911e15ec330ce5.zip opensbi-264d0be1fdd93874bc8f4a365c911e15ec330ce5.tar.gz opensbi-264d0be1fdd93874bc8f4a365c911e15ec330ce5.tar.bz2 |
lib: utils: Improve fdt_serial_init
A final check of all DT nodes does not necessarily find a match, so
SBI_ENODEV needs to be returned. Optimize removal of current_driver.
Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Diffstat (limited to 'lib/utils/serial/fdt_serial.c')
-rw-r--r-- | lib/utils/serial/fdt_serial.c | 48 |
1 files changed, 17 insertions, 31 deletions
diff --git a/lib/utils/serial/fdt_serial.c b/lib/utils/serial/fdt_serial.c index 1a4bf9e..0baa722 100644 --- a/lib/utils/serial/fdt_serial.c +++ b/lib/utils/serial/fdt_serial.c @@ -17,13 +17,6 @@ extern struct fdt_serial *fdt_serial_drivers[]; extern unsigned long fdt_serial_drivers_size; -static struct fdt_serial dummy = { - .match_table = NULL, - .init = NULL, -}; - -static struct fdt_serial *current_driver = &dummy; - int fdt_serial_init(void) { const void *prop; @@ -57,20 +50,15 @@ int fdt_serial_init(void) if (!match) continue; - if (drv->init) { - rc = drv->init(fdt, noff, match); - if (rc == SBI_ENODEV) - continue; - if (rc) - return rc; - } - current_driver = drv; - break; - } + /* drv->init must not be NULL */ + if (drv->init == NULL) + return SBI_EFAIL; - /* Check if we found desired driver */ - if (current_driver != &dummy) - goto done; + rc = drv->init(fdt, noff, match); + if (rc == SBI_ENODEV) + continue; + return rc; + } /* Lastly check all DT nodes */ for (pos = 0; pos < fdt_serial_drivers_size; pos++) { @@ -80,17 +68,15 @@ int fdt_serial_init(void) if (noff < 0) continue; - if (drv->init) { - rc = drv->init(fdt, noff, match); - if (rc == SBI_ENODEV) - continue; - if (rc) - return rc; - } - current_driver = drv; - break; + /* drv->init must not be NULL */ + if (drv->init == NULL) + return SBI_EFAIL; + + rc = drv->init(fdt, noff, match); + if (rc == SBI_ENODEV) + continue; + return rc; } -done: - return 0; + return SBI_ENODEV; } |