[PATCH 1/3] pinctrl: mediatek: support mediatek,pctl-regmap property
David Lechner
dlechner at baylibre.com
Thu Jan 8 00:15:58 CET 2026
On 1/6/26 4:05 PM, David Lechner wrote:
> Add support for the mediatek,pctl-regmap devicetree property to the
> common MediaTek pinctrl driver.
>
> In upstream devicetrees from Linux, the pinctrl nodes may be on the
> interrupt controller register address space rather than the pinctrl
> register address space. In this case, there is a syscon node linking to
> the actual pinctrl registers. This uses a common property name of
> mediatek,pctl-regmap for the phandle to the syscon node.
>
> The logic here is that if this property is present, we look up the
> syscon node and use it's address as the base address of the pinctrl
> registers and ignore the pinctrl node's own reg property. (Support
> for interrupts could be added later if needed.)
>
> There is also at least one SoC in Linux that has two syscon phandles
> in this property. This implementation support parsing this, but doesn't
> do anything with the second syscon yet (the 2nd syscon is for interrupts
> which we are saving for later).
>
> Signed-off-by: David Lechner <dlechner at baylibre.com>
> ---
> drivers/pinctrl/mediatek/pinctrl-mtk-common.c | 38 +++++++++++++++++++++++++++
> 1 file changed, 38 insertions(+)
>
> diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
> index 4aecb84504a..0483d532800 100644
> --- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
> +++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
> @@ -809,9 +809,47 @@ int mtk_pinctrl_common_probe(struct udevice *dev,
> fdt_addr_t addr;
> u32 base_calc = soc->base_calc;
> u32 nbase_names = soc->nbase_names;
> + int num_regmaps;
>
> priv->soc = soc;
>
> + /*
> + * Some controllers have 1 or 2 syscon nodes where the actual pinctl
> + * registers reside. In this case, dev is an interrupt controller which
> + * isn't supported at this time. The optional 2nd syscon node is also
> + * 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);
I did not realize that this is not robust against probe order. I got
lucky during initial testing, but it is failing now that I am working
on something else. So I will need to find a solution and send a v2.
> + 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;
> + }
> +
> + return 0;
> + }
> +
> if (!base_calc)
> nbase_names = 1;
>
>
More information about the U-Boot
mailing list