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

Yang, Wenyou Wenyou.Yang at atmel.com
Fri Jun 17 07:05:51 CEST 2016


HI Simon,

> -----Original Message-----
> From: sjg at google.com [mailto:sjg at google.com] On Behalf Of Simon Glass
> Sent: 2016年6月16日 10:44
> To: Yang, Wenyou <Wenyou.Yang at atmel.com>
> Cc: U-Boot Mailing List <u-boot at lists.denx.de>; Andreas Bießmann
> <andreas at biessmann.org>
> Subject: Re: [PATCH v2 1/2] clk: clk-uclass: Add post binding for CLK uclass
> 
> Hi Wenyou,
> 
> On 15 June 2016 at 19:08, Yang, Wenyou <Wenyou.Yang at atmel.com> wrote:
> >
> >
> >> -----Original Message-----
> >> From: sjg at google.com [mailto:sjg at google.com] On Behalf Of Simon Glass
> >> Sent: 2016年6月10日 8:34
> >> To: Yang, Wenyou <Wenyou.Yang at atmel.com>
> >> Cc: U-Boot Mailing List <u-boot at lists.denx.de>; Andreas Bießmann
> >> <andreas at biessmann.org>
> >> Subject: Re: [PATCH v2 1/2] clk: clk-uclass: Add post binding for CLK
> >> uclass
> >>
> >> 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.
> >
> > Yes, for pheriph32ck node have a lot of child nodes with no compatible strings.
> > This patch purpose is to bind these children nodes. Otherwise these nodes will
> not be bound.
> >
> > For example,
> >
> > ---8<----
> >         ahb {
> >                 apb {
> >                         pmc: pmc at f0014000 {
> >
> >                                 [snip]
> >
> >                                 periph32ck {
> >                                         compatible = "atmel,at91sam9x5-clk-peripheral";
> >                                         #address-cells = <1>;
> >                                         #size-cells = <0>;
> >                                         clocks = <&h32ck>;
> >
> >                                         macb0_clk: macb0_clk {
> >                                                 #clock-cells = <0>;
> >                                                 reg = <5>;
> >                                                 atmel,clk-output-range = <0 83000000>;
> >                                         };
> >
> >                                         [snip]
> >
> >                                         pioA_clk: pioA_clk {
> >                                                 #clock-cells = <0>;
> >                                                 reg = <18>;
> >                                                 atmel,clk-output-range = <0 83000000>;
> >                                         };
> >
> >                                         [snip]
> >
> >                                         spi0_clk: spi0_clk {
> >                                                 #clock-cells = <0>;
> >                                                 reg = <33>;
> >                                                 atmel,clk-output-range = <0 83000000>;
> >                                         };
> >
> >                                         [snip]
> >                                 };
> >                         };
> >
> >                         spi0: spi at f8000000 {
> >                                 compatible = "atmel,at91rm9200-spi";
> >                                 reg = <0xf8000000 0x100>;
> >                                 clocks = <&spi0_clk>;
> >                                 clock-names = "spi_clk";
> >                                 #address-cells = <1>;
> >                                 #size-cells = <0>;
> >                                 status = "disabled";
> >                         };
> >
> >                         macb0: ethernet at f8008000 {
> >                                 compatible = "cdns,macb";
> >                                 reg = <0xf8008000 0x1000>;
> >                                 #address-cells = <1>;
> >                                 #size-cells = <0>;
> >                                 clocks = <&macb0_clk>, <&macb0_clk>;
> >                                 clock-names = "hclk", "pclk";
> >                                 status = "disabled";
> >                         };
> >
> >                         [snip]
> >
> >                         pioA: gpio at fc038000 {
> >                                 compatible = "atmel,sama5d2-gpio";
> >                                 reg = <0xfc038000 0x600>;
> >                                 clocks = <&pioA_clk>;
> >                                 gpio-controller;
> >                                 #gpio-cells = <2>;
> >
> >                                 pinctrl {
> >                                         compatible = "atmel,sama5d2-pinctrl";
> >                                 };
> >                         };
> >                 };
> >         };
> >
> > ---->8-----
> >
> 
> In that case I think your clock driver should handle this in its
> bind() method. It can scan the device tree and create the devices as needed. I
> don't think this feature should go into generic code, at least not yet.

Okay, I will move it to our clock driver.

> 
> Also please see Stephen Warren's clock patch, which supports multiple clock IDs
> per clock device. Assuming he respins this soon I will be applying it to dm/master.
> 
> http://patchwork.ozlabs.org/patch/625342/

Thank you for your reminder.

> 
> >>
> >> >
> >> > 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

Best Regards,
Wenyou Yang


More information about the U-Boot mailing list