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

For the clock type, perhaps combine that in the clock cell with the
resource ID such as using the upper 8-bits.

> +- clock-output-names:  Shall be the corresponding names of the outputs.
> +- power-domains:       Should contain the power domain used by this SCU clock.
> +
> +Optional properties:
> +- clocks:              Shall be the input parent clock(s) phandle for the clock.
> +                       For multiplexed clocks, the list order must match the hardware
> +                       programming order.
> +
> +Legacy Clock binding (No sub-nodes which is DEPRECATED):
>  - #clock-cells:                Should be 1. Contains the Clock ID value.
>  - clocks:              List of clock specifiers, must contain an entry for
>                         each required entry in clock-names
> @@ -144,6 +165,21 @@ lsio_mu1: mailbox@5d1c0000 {
>         #mbox-cells = <2>;
>  };
>
> +conn-scu-clock-controller {
> +       compatible = "fsl,imx8qxp-clk", "fsl,scu-clk";
> +       #address-cells = <1>;
> +       #size-cells = <0>;
> +
> +       uart0_clk: clock-scu@57 {
> +               reg = <57>;
> +               #clock-cells = <1>;
> +               clock-indices = <IMX_SC_PM_CLK_PER>;
> +               clock-output-names = "uart0_clk";
> +               power-domains = <&pd IMX_SC_R_UART_0>;
> +       };
> +       ...
> +}
> +
>  firmware {
>         scu {
>                 compatible = "fsl,imx-scu";
> @@ -160,11 +196,6 @@ firmware {
>                           &lsio_mu1 1 3
>                           &lsio_mu1 3 3>;
>
> -               clk: clk {
> -                       compatible = "fsl,imx8qxp-clk", "fsl,scu-clk";
> -                       #clock-cells = <1>;
> -               };
> -
>                 iomuxc {
>                         compatible = "fsl,imx8qxp-iomuxc";
>
> @@ -192,8 +223,6 @@ serial@5a060000 {
>         ...
>         pinctrl-names = "default";
>         pinctrl-0 = <&pinctrl_lpuart0>;
> -       clocks = <&clk IMX8QXP_UART0_CLK>,
> -                <&clk IMX8QXP_UART0_IPG_CLK>;
> -       clock-names = "per", "ipg";
> +       clocks = <&uart0_clk IMX_SC_PM_CLK_PER>;
>         power-domains = <&pd IMX_SC_R_UART_0>;
>  };
> diff --git a/include/dt-bindings/firmware/imx/rsrc.h b/include/dt-bindings/firmware/imx/rsrc.h
> index 4e61f64..fbeaca7 100644
> --- a/include/dt-bindings/firmware/imx/rsrc.h
> +++ b/include/dt-bindings/firmware/imx/rsrc.h
> @@ -547,4 +547,21 @@
>  #define IMX_SC_R_ATTESTATION           545
>  #define IMX_SC_R_LAST                  546
>
> +/*
> + * Defines for SC PM CLK
> + */
> +#define IMX_SC_PM_CLK_SLV_BUS          0       /* Slave bus clock */
> +#define IMX_SC_PM_CLK_MST_BUS          1       /* Master bus clock */
> +#define IMX_SC_PM_CLK_PER              2       /* Peripheral clock */
> +#define IMX_SC_PM_CLK_PHY              3       /* Phy clock */
> +#define IMX_SC_PM_CLK_MISC             4       /* Misc clock */
> +#define IMX_SC_PM_CLK_MISC0            0       /* Misc 0 clock */
> +#define IMX_SC_PM_CLK_MISC1            1       /* Misc 1 clock */
> +#define IMX_SC_PM_CLK_MISC2            2       /* Misc 2 clock */
> +#define IMX_SC_PM_CLK_MISC3            3       /* Misc 3 clock */
> +#define IMX_SC_PM_CLK_MISC4            4       /* Misc 4 clock */
> +#define IMX_SC_PM_CLK_CPU              2       /* CPU clock */
> +#define IMX_SC_PM_CLK_PLL              4       /* PLL */
> +#define IMX_SC_PM_CLK_BYPASS           4       /* Bypass clock */

I don't understand how these work with overlapping numbers.

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