lib: utils/reset: separate driver init func
authorNikita Shubin <n.shubin@yadro.com>
Wed, 10 Nov 2021 09:42:26 +0000 (12:42 +0300)
committerAnup Patel <anup@brainfault.org>
Fri, 12 Nov 2021 04:46:23 +0000 (10:16 +0530)
Move driver init code to separate function, so it can be reused
elsewhere.

Tested-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Reviewed-by: Alexandre Ghiti <alexandre.ghiti@canonical.com>
Tested-by: Alexandre Ghiti <alexandre.ghiti@canonical.com>
Signed-off-by: Nikita Shubin <n.shubin@yadro.com>
include/sbi_utils/reset/fdt_reset.h
lib/utils/reset/fdt_reset.c

index 46167b9..e7f7350 100644 (file)
@@ -18,6 +18,11 @@ struct fdt_reset {
 };
 
 /**
+ * fdt_reset_driver_init() - initialize reset driver based on the device-tree
+ */
+int fdt_reset_driver_init(void *fdt, struct fdt_reset *drv);
+
+/**
  * fdt_reset_init() - initialize reset drivers based on the device-tree
  *
  * This function shall be invoked in final init.
index f4befa2..66281cb 100644 (file)
@@ -29,26 +29,31 @@ static struct fdt_reset *reset_drivers[] = {
        &fdt_reset_thead,
 };
 
-void fdt_reset_init(void)
+int fdt_reset_driver_init(void *fdt, struct fdt_reset *drv)
 {
-       int pos, noff, rc;
-       struct fdt_reset *drv;
+       int noff, rc = SBI_ENODEV;
        const struct fdt_match *match;
-       void *fdt = fdt_get_address();
-
-       for (pos = 0; pos < array_size(reset_drivers); pos++) {
-               drv = reset_drivers[pos];
 
-               noff = fdt_find_match(fdt, -1, drv->match_table, &match);
-               if (noff < 0)
-                       continue;
+       noff = fdt_find_match(fdt, -1, drv->match_table, &match);
+       if (noff < 0)
+               return SBI_ENODEV;
 
-               if (drv->init) {
-                       rc = drv->init(fdt, noff, match);
-                       if (rc && rc != SBI_ENODEV) {
-                               sbi_printf("%s: %s init failed, %d\n",
-                                          __func__, match->compatible, rc);
-                       }
+       if (drv->init) {
+               rc = drv->init(fdt, noff, match);
+               if (rc && rc != SBI_ENODEV) {
+                       sbi_printf("%s: %s init failed, %d\n",
+                                  __func__, match->compatible, rc);
                }
        }
+
+       return rc;
+}
+
+void fdt_reset_init(void)
+{
+       int pos;
+       void *fdt = fdt_get_address();
+
+       for (pos = 0; pos < array_size(reset_drivers); pos++)
+               fdt_reset_driver_init(fdt, reset_drivers[pos]);
 }