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 <ma...@denx.de>
---
Cc: Johan Jonker <jbx6...@gmail.com>
Cc: Simon Glass <s...@chromium.org>
Cc: Sumit Garg <sumit.g...@linaro.org>
Cc: Tom Rini <tr...@konsulko.com>
---
 drivers/core/syscon-uclass.c | 27 +++++++++++++++++++++++++++
 include/syscon.h             | 13 +++++++++++++
 2 files changed, 40 insertions(+)

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
  *
-- 
2.43.0

Reply via email to