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