[PATCH] pinctrl: mediatek: fix failing to get syscon

David Lechner dlechner at baylibre.com
Wed Jan 14 23:37:19 CET 2026


Replace uclass_get_device_by_ofnode() with syscon_regmap_lookup_by_phandle()
to get the "mediatek,pctl-regmap" syscon device.

Depending on probe order, uclass_get_device_by_ofnode() may fail, but
syscon_regmap_lookup_by_phandle() has logic in it to handle that case
correctly.

The previous implementation could read more than one syscon if the
"mediatek,pctl-regmap" property had more than one phandle, but the one
board with a devicetree that does that is not supported in U-Boot yet,
so we can save that for later (it may never be needed).

Fixes: 424ceba18bfb ("pinctrl: mediatek: support mediatek,pctl-regmap property")
Signed-off-by: David Lechner <dlechner at baylibre.com>
---
A few notes:

I missed this in initial testing since by luck the probe order was OK.
And I did consider converting the driver to use regmap everywhere but
it was far from trivial so just using regmap_get_range() to avoid that.
---
 drivers/pinctrl/mediatek/Kconfig              |  2 ++
 drivers/pinctrl/mediatek/pinctrl-mtk-common.c | 37 ++++++++++-----------------
 2 files changed, 15 insertions(+), 24 deletions(-)

diff --git a/drivers/pinctrl/mediatek/Kconfig b/drivers/pinctrl/mediatek/Kconfig
index 4a698568a7e..ed4b02be0dd 100644
--- a/drivers/pinctrl/mediatek/Kconfig
+++ b/drivers/pinctrl/mediatek/Kconfig
@@ -2,6 +2,8 @@ if ARCH_MEDIATEK
 
 config PINCTRL_MTK
 	depends on PINCTRL_GENERIC
+	select REGMAP
+	select SYSCON
 	bool
 
 config PINCTRL_MT7622
diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
index 0483d532800..9e319185809 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
@@ -11,6 +11,10 @@
 #include <asm/io.h>
 #include <asm-generic/gpio.h>
 #include <linux/bitops.h>
+#include <linux/err.h>
+#include <log.h>
+#include <regmap.h>
+#include <syscon.h>
 
 #include "pinctrl-mtk-common.h"
 
@@ -820,32 +824,17 @@ int mtk_pinctrl_common_probe(struct udevice *dev,
 	 * for the interrupt controller, so we only use the 1st one currently.
 	 */
 	num_regmaps = dev_count_phandle_with_args(dev, "mediatek,pctl-regmap", NULL, 0);
-	if (num_regmaps > ARRAY_SIZE(priv->base))
-		return -EINVAL;
 
 	if (num_regmaps > 0) {
-		for (i = 0; i < num_regmaps; i++) {
-			struct ofnode_phandle_args args;
-			struct udevice *syscon_dev;
-			int ret;
-
-			ret = dev_read_phandle_with_args(dev, "mediatek,pctl-regmap",
-							 NULL, 0, i, &args);
-			if (ret)
-				return ret;
-
-			ret = uclass_get_device_by_ofnode(UCLASS_SYSCON,
-							  args.node,
-							  &syscon_dev);
-			if (ret)
-				return ret;
-
-			addr = dev_read_addr_index(syscon_dev, 0);
-			if (addr == FDT_ADDR_T_NONE)
-				return -EINVAL;
-
-			priv->base[i] = (void __iomem *)addr;
-		}
+		struct regmap *regmap;
+
+		regmap = syscon_regmap_lookup_by_phandle(dev, "mediatek,pctl-regmap");
+		if (IS_ERR(regmap))
+			return log_msg_ret("regmap: ", PTR_ERR(regmap));
+
+		priv->base[0] = regmap_get_range(regmap, 0);
+		if (!priv->base[0])
+			return log_msg_ret("range: ", -EINVAL);
 
 		return 0;
 	}

---
base-commit: d503633a36767d756c7de28305cf0de79440cbc0
change-id: 20260114-pinctrl-mtk-fix-syscon-lookup-f919e7da8b9d

Best regards,
-- 
David Lechner <dlechner at baylibre.com>



More information about the U-Boot mailing list