[U-Boot] [PATCH v2 1/2] clk: clk-uclass: Add post binding for CLK uclass

Simon Glass sjg at chromium.org
Fri Jun 10 02:34:19 CEST 2016


Hi Wenyou,

On 7 June 2016 at 01:11, Wenyou Yang <wenyou.yang at atmel.com> wrote:
> Add post binding support for CLK uclass to recursively bind
> its children as clk devices.
>
> Signed-off-by: Wenyou Yang <wenyou.yang at atmel.com>
> ---
>
> Changes in v2: None
>
>  drivers/clk/clk-uclass.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 51 insertions(+)


Can you please explain what this is for? We would normally call
dm_scan_fdt_node() for this, but it seems that you are specifically to
create drivers for things with no compatible strings.

>
> diff --git a/drivers/clk/clk-uclass.c b/drivers/clk/clk-uclass.c
> index b483c1e..ee568e4 100644
> --- a/drivers/clk/clk-uclass.c
> +++ b/drivers/clk/clk-uclass.c
> @@ -106,7 +106,58 @@ int clk_get_by_index(struct udevice *dev, int index, struct udevice **clk_devp)
>  }
>  #endif
>
> +/**
> + * clk_post-bind() - post binding for CLK uclass
> + * Recursively bind its children as clk devices.
> + *
> + * @dev: clk device
> + * @return: 0 on success, or negative error code on failure
> + */
> +static int clk_post_bind(struct udevice *dev)
> +{
> +       const void *fdt = gd->fdt_blob;
> +       int offset = dev->of_offset;
> +       bool pre_reloc_only = !(gd->flags & GD_FLG_RELOC);
> +       const char *name;
> +       int ret;
> +
> +       for (offset = fdt_first_subnode(fdt, offset);
> +            offset > 0;
> +            offset = fdt_next_subnode(fdt, offset)) {
> +               if (pre_reloc_only &&
> +                   !fdt_getprop(fdt, offset, "u-boot,dm-pre-reloc", NULL))
> +                       continue;
> +               /*
> +                * If this node has "compatible" property, this is not a clk
> +                * node, but a normal device. skip.
> +                */
> +               fdt_get_property(fdt, offset, "compatible", &ret);
> +               if (ret >= 0)
> +                       continue;
> +
> +               if (ret != -FDT_ERR_NOTFOUND)
> +                       return ret;
> +
> +               name = fdt_get_name(fdt, offset, NULL);
> +               if (!name)
> +                       return -EINVAL;
> +
> +               ret = device_bind_driver_to_node(dev, "clk", name,
> +                                                offset, NULL);
> +               if (ret)
> +                       return ret;
> +       }
> +
> +       return 0;
> +}
> +
>  UCLASS_DRIVER(clk) = {
>         .id             = UCLASS_CLK,
> +       .post_bind      = clk_post_bind,
>         .name           = "clk",
>  };
> +
> +U_BOOT_DRIVER(clk_generic) = {
> +       .id     = UCLASS_CLK,
> +       .name   = "clk",
> +};
> --
> 2.7.4
>

Regards,
Simon


More information about the U-Boot mailing list