[PATCH 3/4] pinctrl: mediatek: print bias info along with pinmux
Julien Stephan
jstephan at baylibre.com
Mon Mar 30 16:51:20 CEST 2026
Le ven. 13 mars 2026 à 22:56, David Lechner <dlechner at baylibre.com> a écrit :
>
> 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);
why += ? pos is initialized to 0. Same why buf +pos? and size - pos?
> + 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;
Can't this be removed?
> + }
> + }
> +
> + 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)) {
You can drop this if, since you already define an empty
mtk_pinconf_get() if PINCONF is not enabled
> + 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;
nit: Can we merge this with previous if() ?
Or use intermediate err value as you do in mtk_pinconf_get() ?
> +
> + 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