diff mbox series

[RFC] syscon: Add syscon_regmap_lookup_by_compatible wrapper

Message ID 20240321162611.76415-1-marex@denx.de
State RFC
Delegated to: Tom Rini
Headers show
Series [RFC] syscon: Add syscon_regmap_lookup_by_compatible wrapper | expand

Commit Message

Marek Vasut March 21, 2024, 4:23 p.m. UTC
Add a wrapper to look up a system controller by a compatible string.

This operates by looking up the given name in the device (device
tree property) of the device using the system controller.

Signed-off-by: Marek Vasut <marex@denx.de>
---
Cc: Johan Jonker <jbx6244@gmail.com>
Cc: Simon Glass <sjg@chromium.org>
Cc: Sumit Garg <sumit.garg@linaro.org>
Cc: Tom Rini <trini@konsulko.com>
---
 drivers/core/syscon-uclass.c | 27 +++++++++++++++++++++++++++
 include/syscon.h             | 13 +++++++++++++
 2 files changed, 40 insertions(+)
diff mbox series

Patch

diff --git a/drivers/core/syscon-uclass.c b/drivers/core/syscon-uclass.c
index a47b8bd3c01..b89006c030d 100644
--- a/drivers/core/syscon-uclass.c
+++ b/drivers/core/syscon-uclass.c
@@ -111,6 +111,33 @@  static int syscon_probe_by_ofnode(ofnode node, struct udevice **devp)
 	return 0;
 }
 
+struct regmap *syscon_regmap_lookup_by_compatible(struct udevice *dev,
+					          const char *compatible)
+{
+	struct udevice *syscon;
+	struct regmap *r;
+	ofnode node;
+	int err;
+
+	node = ofnode_by_compatible(ofnode_null(), compatible);
+	if (!ofnode_valid(node)) {
+		dev_dbg(dev, "unable to find syscon device\n");
+		return ERR_PTR(-EINVAL);
+	}
+
+	err = syscon_probe_by_ofnode(node, &syscon);
+	if (err)
+		return ERR_PTR(-ENODEV);
+
+	r = syscon_get_regmap(syscon);
+	if (!r) {
+		dev_dbg(dev, "unable to find regmap\n");
+		return ERR_PTR(-ENODEV);
+	}
+
+	return r;
+}
+
 struct regmap *syscon_regmap_lookup_by_phandle(struct udevice *dev,
 					       const char *name)
 {
diff --git a/include/syscon.h b/include/syscon.h
index 7a5ee3fa26b..88f264d801b 100644
--- a/include/syscon.h
+++ b/include/syscon.h
@@ -60,6 +60,19 @@  int syscon_get_by_driver_data(ulong driver_data, struct udevice **devp);
  */
 struct regmap *syscon_get_regmap_by_driver_data(ulong driver_data);
 
+/**
+ * syscon_regmap_lookup_by_compatible() - Look up a controller by a compatible string
+ *
+ * This operates by looking up the given name in the device (device
+ * tree property) of the device using the system controller.
+ *
+ * @dev:	Device using the system controller
+ * @compatible:	Compatible string of the system controller
+ * Return:	A pointer to the regmap if found, ERR_PTR(-ve) on error
+ */
+struct regmap *syscon_regmap_lookup_by_compatible(struct udevice *dev,
+						  const char *compatible);
+
 /**
  * syscon_regmap_lookup_by_phandle() - Look up a controller by a phandle
  *