[PATCH v2 09/12] clk: boston: Allow to get regmap from parent device

Jiaxun Yang jiaxun.yang at flygoat.com
Thu May 16 13:40:29 CEST 2024


In upstream devicetree, clk_boston is a child of syscon node
and there is no "regmap" property for clk_boston node.

Try to check parent device first to look for syscon.

Signed-off-by: Jiaxun Yang <jiaxun.yang at flygoat.com>
---
v2: Move syscon_get_regmap to probe
---
 drivers/clk/clk_boston.c | 37 +++++++++++++++++++++++++------------
 1 file changed, 25 insertions(+), 12 deletions(-)

diff --git a/drivers/clk/clk_boston.c b/drivers/clk/clk_boston.c
index 030ff7cc58ec..1985bb0ec334 100644
--- a/drivers/clk/clk_boston.c
+++ b/drivers/clk/clk_boston.c
@@ -12,6 +12,7 @@
 #include <linux/printk.h>
 
 struct clk_boston {
+	struct udevice *syscon;
 	struct regmap *regmap;
 };
 
@@ -58,23 +59,33 @@ const struct clk_ops clk_boston_ops = {
 	.get_rate = clk_boston_get_rate,
 };
 
-static int clk_boston_of_to_plat(struct udevice *dev)
+static int clk_boston_probe(struct udevice *dev)
 {
 	struct clk_boston *state = dev_get_plat(dev);
-	struct udevice *syscon;
-	int err;
 
-	err = uclass_get_device_by_phandle(UCLASS_SYSCON, dev,
-					   "regmap", &syscon);
-	if (err) {
-		pr_err("unable to find syscon device\n");
-		return err;
+	state->regmap = syscon_get_regmap(state->syscon);
+	if (IS_ERR(state->regmap)) {
+		pr_err("unable to find regmap\n");
+		return PTR_ERR(state->regmap);
 	}
 
-	state->regmap = syscon_get_regmap(syscon);
-	if (!state->regmap) {
-		pr_err("unable to find regmap\n");
-		return -ENODEV;
+	return 0;
+}
+
+static int clk_boston_of_to_plat(struct udevice *dev)
+{
+	struct clk_boston *state = dev_get_plat(dev);
+	int err;
+
+	if (dev->parent && device_get_uclass_id(dev->parent) == UCLASS_SYSCON) {
+		state->syscon = dev->parent;
+	} else {
+		err = uclass_get_device_by_phandle(UCLASS_SYSCON, dev,
+						   "regmap", &state->syscon);
+		if (err) {
+			pr_err("unable to find syscon device\n");
+			return err;
+		}
 	}
 
 	return 0;
@@ -92,6 +103,8 @@ U_BOOT_DRIVER(clk_boston) = {
 	.id = UCLASS_CLK,
 	.of_match = clk_boston_match,
 	.of_to_plat = clk_boston_of_to_plat,
+	.probe = clk_boston_probe,
 	.plat_auto	= sizeof(struct clk_boston),
 	.ops = &clk_boston_ops,
+	.flags = DM_FLAG_PRE_RELOC,
 };

-- 
2.34.1



More information about the U-Boot mailing list