lib: utils: Improve fdt_serial_init
authorXiang W <wxjstz@126.com>
Mon, 22 May 2023 05:18:07 +0000 (13:18 +0800)
committerAnup Patel <anup@brainfault.org>
Fri, 26 May 2023 07:07:25 +0000 (12:37 +0530)
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>
lib/utils/serial/fdt_serial.c

index 1a4bf9e..0baa722 100644 (file)
 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;
 }