Re: [PATCH V2 1/2] dt-bindings: firmware: imx-scu: new binding to parse clocks from device tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, May 4, 2019 at 7:19 AM Aisheng Dong <aisheng.dong@xxxxxxx> wrote:
>
> > From: Rob Herring [mailto:robh+dt@xxxxxxxxxx]
> > Sent: Friday, May 3, 2019 10:53 PM
> > Subject: Re: [PATCH V2 1/2] dt-bindings: firmware: imx-scu: new binding to
> > parse clocks from device tree
> >
> > On Thu, May 2, 2019 at 8:34 PM Aisheng Dong <aisheng.dong@xxxxxxx>
> > wrote:
> >
> > > There's a few limitations on the original one cell clock binding
> > > (#clock-cells = <1>) that we have to define all clock IDs for device
> > > tree to reference. This may cause troubles if we want to use common
> > > clock IDs for multi platforms support when the clock of those
> > > platforms are mostly the same.
> > > e.g. Current clock IDs name are defined with SS prefix.
> > >
> > > However the device may reside in different SS across CPUs, that means
> > > the SS prefix may not valid anymore for a new SoC. Furthermore, the
> > > device availability of those clocks may also vary a bit.
> > >
> > > For such situation, We formerly planned to add all new IDs for each SS
> > > and dynamically check availability for different SoC in driver. That
> > > can be done but that may involve a lot effort and may result in more
> > > changes and duplicated code in driver, also make device tree
> > > upstreaming hard which depends on Clock IDs.
> > >
> > > To relief this situation, we want to move the clock definition into
> > > device tree which can fully decouple the dependency of Clock ID
> > > definition from device tree. This can make us write a full generic
> > > clock driver for SCU based SoCs. No more frequent changes needed in
> > > clock driver any more.
> > >
> > > In the meanwhile, we can also use the existence of clock nodes in
> > > device tree to address the device and clock availability differences
> > > across different SoCs.
> > >
> > > For SCU clocks, only two params required. The first one is resource id
> > > which is encoded in reg property and the second is clock type index
> > > which is encoded in generic clock-indices property they're not continuously.
> > >
> > > And as we also want to support clock set parent function, 'clocks'
> > > property is also used to pass all the possible input parents.
> > >
> > > Cc: Rob Herring <robh+dt@xxxxxxxxxx>
> > > Cc: Stephen Boyd <sboyd@xxxxxxxxxx>
> > > Cc: Shawn Guo <shawnguo@xxxxxxxxxx>
> > > Cc: Sascha Hauer <kernel@xxxxxxxxxxxxxx>
> > > Cc: Michael Turquette <mturquette@xxxxxxxxxxxx>
> > > Cc: devicetree@xxxxxxxxxxxxxxx
> > > Signed-off-by: Dong Aisheng <aisheng.dong@xxxxxxx>
> > > ---
> > > ChangeLog:
> > > v1->v2:
> > >  * changed to one cell binding inspired by arm,scpi.txt
> > >    Documentation/devicetree/bindings/arm/arm,scpi.txt
> > >    Resource ID is encoded in 'reg' property.
> > >    Clock type is encoded in generic clock-indices property.
> > >    Then we don't have to search all the DT nodes to fetch
> > >    those two value to construct clocks which is relatively
> > >    low efficiency.
> > >  * Add required power-domain property as well.
> > > ---
> > >  .../devicetree/bindings/arm/freescale/fsl,scu.txt  | 45
> > ++++++++++++++++++----
> > >  include/dt-bindings/firmware/imx/rsrc.h            | 17 ++++++++
> > >  2 files changed, 54 insertions(+), 8 deletions(-)
> > >
> > > diff --git
> > > a/Documentation/devicetree/bindings/arm/freescale/fsl,scu.txt
> > > b/Documentation/devicetree/bindings/arm/freescale/fsl,scu.txt
> > > index 5d7dbab..2f46e89 100644
> > > --- a/Documentation/devicetree/bindings/arm/freescale/fsl,scu.txt
> > > +++ b/Documentation/devicetree/bindings/arm/freescale/fsl,scu.txt
> > > @@ -89,6 +89,27 @@ Required properties:
> > >                           "fsl,imx8qm-clock"
> > >                           "fsl,imx8qxp-clock"
> > >                         followed by "fsl,scu-clk"
> > > +- #address-cells:      Should be 1.
> > > +- #size-cells:         Should be 0.
> > > +
> > > +Sub nodes are required to represent all available SCU clocks within
> > > +this hardware subsystem and the following properties are needed:
> > > +
> > > +- reg:                 Should contain the Resource ID of this SCU clock.
> > > +- #clock-cells:                Should be 1.
> > > +- clock-indices:       Index of all clock types supported by this SCU clock.
> > > +                       The order should match the clock-output-names
> > array.
> > > +                       Refer to
> > <include/dt-bindings/firmware/imx/rsrc.h> for
> > > +                       available clock types supported by SCU.
> >
> > I would have expected the clock cell to contain the Resource ID.
> >
> > Also, this still has one clock per node which you should avoid unless there's
> > only a small number of clocks (say ~20). Move this all to a single node with the
> > list of clock IDs in clock-indices and other properties like power-domains can
> > match up with clock-indices. IOW, both should have the same length (in
> > elements).
> >
>
> Do you mean something like this?
>
> #define IMX_SCU_CLK_ID(rsrc, type)      (type << 16 | rsrc)
> scu_clk: scu-clock-controller {
>         compatible = "fsl,imx8qxp-scu-clk", "fsl,scu-clk";
>         #clock-cells = <1>;
>         clock-indices = <IMX_SCU_CLK_ID(IMX_SC_R_ENET_0, IMX_SC_PM_CLK_PER)>,
>                         <IMX_SCU_CLK_ID(IMX_SC_R_ENET_0, IMX_SC_PM_CLK_BYPASS)>,
>                         <IMX_SCU_CLK_ID(IMX_SC_R_ENET_0, IMX_SC_PM_CLK_MISC0)>,
>                         <IMX_SCU_CLK_ID(IMX_SC_R_UART_0, IMX_SC_PM_CLK_PER)>,
>                         ...
>
>         clock-output-names = "enet0_clk",
>                              "enet0_bypass_clk",
>                              "enet0_rgmii_clk",
>                              "uart0_clk",
>                              ...
>
>         power-domains = <&pd IMX_SC_R_ENET_0>,
>                         <&pd IMX_SC_R_ENET_0>,
>                         <&pd IMX_SC_R_ENET_0>,
>                         <&pd IMX_SC_R_UART_0>,
>                         ...
> };

Yes, but...

> serial@5a060000 {
>         ...
>         clocks = <&scu_clk IMX_SCU_CLK_ID(IMX_SC_R_UART_0, IMX_SC_PM_CLK_PER)>;

I thought devices got clocks from the LPCG?

>         power-domains = <&pd IMX_SC_R_UART_0>;
> };
>
> I wonder moving all clock resources into a single clock controller node may result in losing
> the configuration granularity of individual clocks from device tree.
>
> For SCU based platforms, the resource availability (e.g. device/clocks/power) are
> configurable by SCU firmware according to the different SW execution partition configuration.
> e.g. According to customer's requirements, we may allocate some resources to M4 partition
> like some I2C, CAN, audio resources which can't be accessed by A core.
> And we may allocate even more for virtual machines running at another CPU core.
> Thus, defining all the clock sources (fixed) in device tree for A core seems to be a little bit
> meaningless and it also causes us hard to extend for a new SoC.

I'm not suggesting that. It's really just re-arranging all the same
data from a bunch of child nodes to a single node. Granted, it may be
easier to add/delete nodes than add/delete elements from an array of
property values, but really that's just a tooling problem

> E.g. MX8QM has more clocks than QXP in different SS.
> That's why we want the per clock source node definition in DT.
> Then we can configure the clock sources conveniently according to different partition
> setting and new SoC property.
>
> Furthermore, per clock resource node also makes us more easily to handle power domain
> In a more standard way and do state save&restore during system suspend/resume due to
> the clock state will be lost when the power is off.
>
> Another important thing is that MX8 is consisted of a number of HW subsystem while each
> Subsystem has separate clock controllers (both SCU clock controllers and LPCG clock controllers).
> I believe this is different from other vendor like TI and ARM Juno which might make us feel we should
> use the same way as theirs at the first glance. But we're different.
>
> That's why I use per clock resource node as it seems to be better for i.MX special characteristic.
>
> Considering all above requirements, how would you suggest us to do?
>
> > For the clock type, perhaps combine that in the clock cell with the resource ID
> > such as using the upper 8-bits.
> >
>
> It seems we must combine them because current clock-indices binding does not
> support two cells index which seems a drawback from user point of view.
> e.g.
> clocks = <&scu_clk IMX_SCU_CLK_ID(IMX_SC_R_UART_0, IMX_SC_PM_CLK_PER)>;

That was my original thought, but we could just say the clock-indices
element size is equal to the #clock-cells size and use 2 cells.

Rob



[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]


  Powered by Linux