[PATCH v2 08/11] lib: utils/regmap: Use fdt_driver for initialization

Samuel Holland samuel.holland at sifive.com
Mon Nov 11 14:02:52 PST 2024


The regmap driver subsystem does not need any extra data, so it can use
`struct fdt_driver` directly. It always initializes the driver for a
specific DT node.

Signed-off-by: Samuel Holland <samuel.holland at sifive.com>
---

Changes in v2:
 - New patch for v2

 include/sbi_utils/regmap/fdt_regmap.h      |  8 +------
 lib/utils/regmap/fdt_regmap.c              | 28 +++-------------------
 lib/utils/regmap/fdt_regmap_drivers.carray |  2 +-
 lib/utils/regmap/fdt_regmap_syscon.c       |  2 +-
 4 files changed, 6 insertions(+), 34 deletions(-)

diff --git a/include/sbi_utils/regmap/fdt_regmap.h b/include/sbi_utils/regmap/fdt_regmap.h
index de946f27..a24f7a98 100644
--- a/include/sbi_utils/regmap/fdt_regmap.h
+++ b/include/sbi_utils/regmap/fdt_regmap.h
@@ -10,17 +10,11 @@
 #ifndef __FDT_REGMAP_H__
 #define __FDT_REGMAP_H__
 
+#include <sbi_utils/fdt/fdt_driver.h>
 #include <sbi_utils/regmap/regmap.h>
 
 struct fdt_phandle_args;
 
-/** FDT based regmap driver */
-struct fdt_regmap {
-	const struct fdt_match *match_table;
-	int (*init)(const void *fdt, int nodeoff,
-		    const struct fdt_match *match);
-};
-
 /** Get regmap instance based on phandle */
 int fdt_regmap_get_by_phandle(const void *fdt, u32 phandle,
 			      struct regmap **out_rmap);
diff --git a/lib/utils/regmap/fdt_regmap.c b/lib/utils/regmap/fdt_regmap.c
index ab991c45..2e8c2143 100644
--- a/lib/utils/regmap/fdt_regmap.c
+++ b/lib/utils/regmap/fdt_regmap.c
@@ -13,30 +13,7 @@
 #include <sbi_utils/regmap/fdt_regmap.h>
 
 /* List of FDT regmap drivers generated at compile time */
-extern struct fdt_regmap *const fdt_regmap_drivers[];
-
-static int fdt_regmap_init(const void *fdt, int nodeoff)
-{
-	int pos, rc;
-	struct fdt_regmap *drv;
-	const struct fdt_match *match;
-
-	/* Try all I2C drivers one-by-one */
-	for (pos = 0; fdt_regmap_drivers[pos]; pos++) {
-		drv = fdt_regmap_drivers[pos];
-		match = fdt_match_node(fdt, nodeoff, drv->match_table);
-		if (match && drv->init) {
-			rc = drv->init(fdt, nodeoff, match);
-			if (rc == SBI_ENODEV)
-				continue;
-			if (rc)
-				return rc;
-			return 0;
-		}
-	}
-
-	return SBI_ENOSYS;
-}
+extern const struct fdt_driver *const fdt_regmap_drivers[];
 
 static int fdt_regmap_find(const void *fdt, int nodeoff,
 			   struct regmap **out_rmap)
@@ -46,7 +23,8 @@ static int fdt_regmap_find(const void *fdt, int nodeoff,
 
 	if (!rmap) {
 		/* Regmap not found so initialize matching driver */
-		rc = fdt_regmap_init(fdt, nodeoff);
+		rc = fdt_driver_init_by_offset(fdt, nodeoff,
+					       fdt_regmap_drivers);
 		if (rc)
 			return rc;
 
diff --git a/lib/utils/regmap/fdt_regmap_drivers.carray b/lib/utils/regmap/fdt_regmap_drivers.carray
index c2f1c9d0..d19a932b 100644
--- a/lib/utils/regmap/fdt_regmap_drivers.carray
+++ b/lib/utils/regmap/fdt_regmap_drivers.carray
@@ -1,3 +1,3 @@
 HEADER: sbi_utils/regmap/fdt_regmap.h
-TYPE: struct fdt_regmap
+TYPE: const struct fdt_driver
 NAME: fdt_regmap_drivers
diff --git a/lib/utils/regmap/fdt_regmap_syscon.c b/lib/utils/regmap/fdt_regmap_syscon.c
index ba559086..1309a55c 100644
--- a/lib/utils/regmap/fdt_regmap_syscon.c
+++ b/lib/utils/regmap/fdt_regmap_syscon.c
@@ -263,7 +263,7 @@ static const struct fdt_match regmap_syscon_match[] = {
 	{ },
 };
 
-struct fdt_regmap fdt_regmap_syscon = {
+const struct fdt_driver fdt_regmap_syscon = {
 	.match_table = regmap_syscon_match,
 	.init = regmap_syscon_init,
 };
-- 
2.45.1




More information about the opensbi mailing list