aboutsummaryrefslogtreecommitdiff
path: root/lib/utils/serial/fdt_serial.c
diff options
context:
space:
mode:
authorXiang W <wxjstz@126.com>2023-05-22 13:18:07 +0800
committerAnup Patel <anup@brainfault.org>2023-05-26 12:37:25 +0530
commit264d0be1fdd93874bc8f4a365c911e15ec330ce5 (patch)
tree1a18fe46baae634e86e9a3d7562e876461b8be28 /lib/utils/serial/fdt_serial.c
parent8b99a7f7d8294be29e18a667d51e13755ed2c0e0 (diff)
downloadopensbi-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.c48
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;
}