[PATCH v2 5/7] pinctrl: at91: Bind GPIO driver to the pinctrl DT node

Eugen Hristev eugen.hristev at linaro.org
Fri Jan 31 10:46:58 CET 2025



On 1/30/25 05:51, Manikandan Muralidharan wrote:
> In Linux DT,the pinctrl node acts as parent nodes with all other
> gpio banks as child nodes and a single driver in Linux handles both
> pinctrl settings and gpio requests.Current U-Boot DT maintains both
> pinctrl and gpio nodes as separate nodes and offers two different class
> of U-Boot drivers: UCLASS_PINCTRL which handles pin functions and
> UCLASS_GPIO which handles gpio requests. In order to align the DT
> of U-Boot with the DT of Linux, a hook is been added in the pinctrl
> driver to bind the gpio driver with the pinctrl driver so that
> when adding gpio nodes as subnodes to pinctrl node (as per the Linux ABI),
> the corresponding APIs will be redirected and handled by valid
> drivers attached to the pinctrl driver.
> 
> Signed-off-by: Manikandan Muralidharan <manikandan.m at microchip.com>
> ---
>  drivers/pinctrl/pinctrl-at91.c | 15 +++++++++++++++
>  1 file changed, 15 insertions(+)
> 
> diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c
> index 5038cb535e3..2b871143fc0 100644
> --- a/drivers/pinctrl/pinctrl-at91.c
> +++ b/drivers/pinctrl/pinctrl-at91.c
> @@ -9,6 +9,8 @@
>  #include <dm.h>
>  #include <log.h>
>  #include <asm/global_data.h>
> +#include <dm/device-internal.h>
> +#include <dm/lists.h>
>  #include <dm/pinctrl.h>
>  #include <asm/hardware.h>
>  #include <linux/bitops.h>
> @@ -492,6 +494,18 @@ const struct pinctrl_ops at91_pinctrl_ops  = {
>  	.set_state = at91_pinctrl_set_state,
>  };
>  
> +static int at91_pinctrl_bind(struct udevice *dev)
> +{

Can you add a small comment to explain why this bind is required and its
purpose please ?

> +	ofnode gpio_node;
> +	struct udevice *gpio;
> +
> +	ofnode_for_each_subnode(gpio_node, dev_ofnode(dev)) {
> +		lists_bind_fdt(dev, gpio_node, &gpio, NULL, false);
> +	}
> +
> +	return 0;
> +}
> +
>  static int at91_pinctrl_probe(struct udevice *dev)
>  {
>  	struct at91_pinctrl_priv *priv = dev_get_priv(dev);
> @@ -524,6 +538,7 @@ U_BOOT_DRIVER(atmel_sama5d3_pinctrl) = {
>  	.id = UCLASS_PINCTRL,
>  	.of_match = at91_pinctrl_match,
>  	.probe = at91_pinctrl_probe,
> +	.bind = at91_pinctrl_bind,
>  	.priv_auto	= sizeof(struct at91_pinctrl_priv),
>  	.ops = &at91_pinctrl_ops,
>  };



More information about the U-Boot mailing list