[PATCH 3/4] pinctrl: mediatek: print bias info along with pinmux

David Lechner dlechner at baylibre.com
Fri Mar 13 22:55:35 CET 2026


Add functionality to be able to print pin bias settings along with the
pinmux setting.

This can be useful to debug why pins might not be working correctly.

Signed-off-by: David Lechner <dlechner at baylibre.com>
---
 drivers/pinctrl/mediatek/pinctrl-mtk-common.c | 96 ++++++++++++++++++++++++++-
 drivers/pinctrl/mediatek/pinctrl-mtk-common.h |  4 ++
 2 files changed, 98 insertions(+), 2 deletions(-)

diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
index 1028b8a93f5..ef4acc946a8 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
@@ -237,9 +237,39 @@ static int mtk_get_pin_io_type(struct udevice *dev, int pin,
 	io_type->bias_set = priv->soc->io_type[io_n].bias_set;
 	io_type->drive_set = priv->soc->io_type[io_n].drive_set;
 	io_type->input_enable = priv->soc->io_type[io_n].input_enable;
+	io_type->get_pinconf = priv->soc->io_type[io_n].get_pinconf;
 
 	return 0;
 }
+
+static int mtk_pinconf_get(struct udevice *dev, u32 pin, char *buf, size_t size)
+{
+	struct mtk_io_type_desc io_type;
+	int err, pos = 0;
+
+	if (!mtk_get_pin_io_type(dev, pin, &io_type)) {
+		pos += snprintf(buf + pos, size - pos, " (%s)", io_type.name);
+		if (pos >= size)
+			return pos;
+
+		if (io_type.get_pinconf) {
+			err = io_type.get_pinconf(dev, pin, buf + pos, size - pos);
+			if (err < 0)
+				return err;
+
+			pos += err;
+			if (pos >= size)
+				return pos;
+		}
+	}
+
+	return pos;
+}
+#else
+static int mtk_pinconf_get(struct udevice *dev, u32 pin, char *buf, size_t size)
+{
+	return 0;
+}
 #endif
 
 static int mtk_get_groups_count(struct udevice *dev)
@@ -270,12 +300,22 @@ static int mtk_get_pins_count(struct udevice *dev)
 static int mtk_get_pin_muxing(struct udevice *dev, unsigned int selector,
 			      char *buf, int size)
 {
-	int val, err;
+	int val, err, pos;
+
 	err = mtk_hw_get_value(dev, selector, PINCTRL_PIN_REG_MODE, &val);
 	if (err)
 		return err;
 
-	snprintf(buf, size, "Aux Func.%d", val);
+	pos = snprintf(buf, size, "Aux Func.%d", val);
+	if (pos >= size)
+		return 0;
+
+	if (CONFIG_IS_ENABLED(PINCONF)) {
+		err = mtk_pinconf_get(dev, selector, buf + pos, size - pos);
+		if (err < 0)
+			return err;
+	}
+
 	return 0;
 }
 
@@ -670,6 +710,58 @@ static int mtk_pinconf_group_set(struct udevice *dev,
 
 	return 0;
 }
+
+int mtk_pinconf_get_pu_pd(struct udevice *dev, u32 pin, char *buf, size_t size)
+{
+	int err, pu, pd;
+
+	err = mtk_hw_get_value(dev, pin, PINCTRL_PIN_REG_PU, &pu);
+	if (err)
+		return err;
+
+	err = mtk_hw_get_value(dev, pin, PINCTRL_PIN_REG_PD, &pd);
+	if (err)
+		return err;
+
+	return snprintf(buf, size, " PU:%d PD:%d", pu, pd);
+}
+
+int mtk_pinconf_get_pupd_r1_r0(struct udevice *dev, u32 pin, char *buf, size_t size)
+{
+	int err, r0, r1, pupd;
+
+	err = mtk_hw_get_value(dev, pin, PINCTRL_PIN_REG_PUPD, &pupd);
+	if (err)
+		return err;
+
+	err = mtk_hw_get_value(dev, pin, PINCTRL_PIN_REG_R1, &r1);
+	if (err)
+		return err;
+
+	err = mtk_hw_get_value(dev, pin, PINCTRL_PIN_REG_R0, &r0);
+	if (err)
+		return err;
+
+	return snprintf(buf, size, " PUPD:%d R1:%d R0:%d", pupd, r1, r0);
+}
+
+int mtk_pinconf_get_pu_pd_rsel(struct udevice *dev, u32 pin, char *buf, size_t size)
+{
+	int pos, err, rsel;
+
+	pos = mtk_pinconf_get_pu_pd(dev, pin, buf, size);
+	if (pos < 0)
+		return pos;
+
+	if (pos >= size)
+		return pos;
+
+	err = mtk_hw_get_value(dev, pin, PINCTRL_PIN_REG_RSEL, &rsel);
+	if (err)
+		return err;
+
+	return pos + snprintf(buf + pos, size - pos, " RSEL:%d", rsel);
+}
 #endif
 
 static int mtk_pinctrl_pinmux_property_set(struct udevice *dev, u32 pinmux_group)
diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common.h b/drivers/pinctrl/mediatek/pinctrl-mtk-common.h
index 1215fb7094b..bd17964090a 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.h
+++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.h
@@ -204,6 +204,7 @@ struct mtk_io_type_desc {
 			bool pullup, u32 val);
 	int (*drive_set)(struct udevice *dev, u32 pin, u32 arg);
 	int (*input_enable)(struct udevice *dev, u32 pin, u32 arg);
+	int (*get_pinconf)(struct udevice *dev, u32 pin, char *buf, size_t size);
 #endif
 };
 
@@ -263,6 +264,9 @@ int mtk_pinconf_bias_set_v1(struct udevice *dev, u32 pin, bool disable,
 int mtk_pinconf_input_enable_v1(struct udevice *dev, u32 pin, u32 arg);
 int mtk_pinconf_drive_set_v0(struct udevice *dev, u32 pin, u32 arg);
 int mtk_pinconf_drive_set_v1(struct udevice *dev, u32 pin, u32 arg);
+int mtk_pinconf_get_pu_pd(struct udevice *dev, u32 pin, char *buf, size_t size);
+int mtk_pinconf_get_pupd_r1_r0(struct udevice *dev, u32 pin, char *buf, size_t size);
+int mtk_pinconf_get_pu_pd_rsel(struct udevice *dev, u32 pin, char *buf, size_t size);
 
 #endif
 

-- 
2.43.0



More information about the U-Boot mailing list