Re: Renesas CPG/MSTP DT Binding Proposal

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

 




Hi Geert,

On Monday 22 June 2015 21:49:23 Geert Uytterhoeven wrote:
> Introduction
> ------------
> 
> On Renesas SoCs (SH/R-Mobile, R-Car, RZ), the CPG (Clock Pulse Generator),
> MSTP (Module Standby and Software Reset), and APMU (Advanced Power
> Management Unit for AP-System Core) blocks are very intimately tied.
> 
>   - The CPG clock generates various clocks for LSI internal generation,
>   - The MSTP block provides two functions:
>       1. Module Standby: "Clock supply to specified modules is stopped by
>          setting the module stop control register bits."
>          However, the clock supply to a module is not stopped until all CPUs
>          in the SoC agree.  Indeed, there are separate MSTP registers for
>          application (Cortex-A) and real-time (SH and/or Cortex-R) cores.
>       2. Reset Control. to perform a software reset of a specific module.
>   - The APMU controls power and clock supply to the AP-system core (e.g.
>   CA7, CA15, SCU).
> 
> MSTP and CPG registers are mixed in one register block.
> The APMU has one or two separate register blocks.
> 
> The current DT bindings are split across 4 different binding documents:
>   1. Renesas SoC-specific "core" CPG clocks that cannot be represented
> easily in DT in another way (cfr. [1]),
>   2. Renesas-specific MSTP "Module Standby" clocks (cfr. [2]),
>   3. Renesas-specific "div6" variable factor clocks, also generated by the
> CPG (cfr. [3]).
>   3. Generic "fixed-factor-clock" clocks, generated by the CPG, but
> represented in DT using the generic ""fixed-factor-clock" bindings (cfr.
> [4]),
> 
> Note that currently the Reset Control function of the MSTP block is not
> supported by DT nor Linux, and that there are no DT bindings for the APMU
> block yet.
> 
> 
> Issues with current bindings
> ----------------------------
> 
> General:
>   - Tight coupling of CPG and MSTP is not represented in DT:
>       - There's one CPG node, and separate MSTP nodes (one for each block of
>         up to 32 possible MSTP clocks) next to it,
>       - CPG Clock Domain requires "power-domain = <...>" properties linking
>         individual device nodes to the "CPG/MSTP" clock domain provider.
>         For now I use a link to the (single) CPG device node, while the
>         clock provider (mostly) controls the (multiple) MSTP clocks (cfr.
>         [6]).
>       - On R-Car Gen3, any CPG/MSTP (and APMU) register write access
>         requires writing a special value to a specific "Write Protect
>         Register" inside the CPG first. Exact details and impact are still
>         under investigation (cfr. [7]).
> 
> MSTP-specific:
>   - The clock hierarchy (parent-child relationship) is represented in a flat
>     structure,

What do you mean exactly here ?

>   - Multiple arrays have to be kept in sync:
>       - "clocks" (parents),
>       - "clock-indices" (sparse bit index inside register),
>       - "clock-output-names",
>   - MSTP clocks are referred to using a reference to a device node and a bit
>     index:
>        - Bit index definitions in include/dt-bindings/clock/<soc>-clock.h
>          are separated from the .dtsi file,
>        - There's no protection against using a bit index definition for a
>          different MSTP register, e.g.
>            - clocks = <&mstp8_clks R8A7791_CLK_QSPI_MOD> (wrong),
>            - clocks = <&mstp9_clks R8A7791_CLK_QSPI_MOD> (correct),

If this concerns you, we could add the MSTP number to the macro name, making 
it easier to catch such issues.

>    - The "reg" properties contain only the SMSTPCRx (control register for
>      System CPU) and MSTPSRx (optional status register) registers only.
>      However, in reality there are many more registers:
>        - Separate control registers for application (Cortex-A, supported)
>          and real-time (SH and/or Cortex-R, not supported) cores,
>        - Software reset registers (not supported).
>      To make matters more complicated:
>        - Many registers are optional.
>          The current bindings just support one control register and one
>          optional status register, but this doesn't scale to more register
>          sets,

We could just use named registers for that.

>        - Register sets are not linear and not contiguous in the register
>          space. I.e. it's not possible to derive the address of SMSTPCRx
>          from the address of SMSTPCRy, or the address of MSTPSRx from the
>          address of SMSTPCRx.

When the hardware is to be blamed we seem to all agree easily :-)

> Proposal
> --------
> 
> I'd like to propose the following, to resolve (most of) the issues with the
> current bindings:
> 
>   - Get rid of the "clocks" node.
>     IIRC grouping all clocks under a "clock" node was deprecated, but I
>     can't find the email anymore?
>       - "fixed-clock" clocks are now at the root node level,

I wonder whether we should move all clocks to a separate .dtsi, they take 
quite a bit of space.

>       - The CPG node is now at the root node level,

The CPG node should actually be a child of a bus, not a child of the root 
node. That's a separate issue though.

>   - CPG node:
>       - Use e.g. "renesas,r8a7791-cpg" as compatible value,
>   - MSTP clocks:
>       - All MSTP clocks are now grouped inside the CPG node, under a new
>         "mstp" subnode, without compatible values,

We've discussed this several times in the past and agreed, the MSTP nodes 
should be subnodes of the CPG node.

>       - Each individual MSTP clock has its own subnode, referring to the
>         MSTP clock number, instead of using one node per register, and
>         arrays of "clocks", "clock-output-names", and "clock-indices"
>         properties.

That I don't really like. It would result in more than a hundred of clock 
nodes. I have discussed this option with Mike when designing the clock DT 
bindings and he didn't like it either.

>       - The list of available registers is maintained as arrays inside the
>         unified CPG/MSTP driver, e.g.
> 
>         struct cpg {
>                 void __iomem *base;
>                 unsigned int n_mstp;    /* Size of a register set */
>                 /*
>                  * Optional arrays of register offsets for the various
>                  * register sets:
>                  *   - Array pointer may be NULL, if not supported */
>                  *   - Array element may be ~0, if not supported */
>                  */
>                 u16 *smstp;             /* System CPU control registers */
>                 u16 *rmstp;             /* Realtime CPU control registers */
>                 u16 *mstpsr;            /* Status registers */
>                 u16 *srcr;              /* Reset registers */
>                 ...

I'd create a struct to group smstp, rmstp, mstpsr, srcr & co and have a single 
array of those structures.

>         };
> 
> 
> Short example
> -------------
> 
> (from Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt)
> 
> For the MSTP part:
> 
>         #include <dt-bindings/clock/r8a7790-clock.h>
> 
>         mstp3_clks: mstp3_clks@e615013c {
>                 compatible = "renesas,r8a7790-mstp-clocks",
>                              "renesas,cpg-mstp-clocks";
>                 reg = <0 0xe615013c 0 4>, <0 0xe6150048 0 4>;
>                 clocks = <&cp_clk>, <&mmc1_clk>, <&sd3_clk>, <&sd2_clk>,
>                          <&cpg_clocks R8A7790_CLK_SD1>,
>                          <&cpg_clocks R8A7790_CLK_SD0>, <&mmc0_clk>;
>                 #clock-cells = <1>;
>                 clock-output-names =
>                         "tpu0", "mmcif1", "sdhi3", "sdhi2",
>                          "sdhi1", "sdhi0", "mmcif0";
>                 clock-indices = <
>                         R8A7790_CLK_TPU0 R8A7790_CLK_MMCIF1
> R8A7790_CLK_SDHI3 R8A7790_CLK_SDHI2 R8A7790_CLK_SDHI1 R8A7790_CLK_SDHI0
> R8A7790_CLK_MMCIF0
> 
>                 >;
> 
>         };
> 
> would become:
> 
>         mstp {
>                 #address-cells = <1>;
>                 #size-cells = <0>;
>                 ...
> 
>                 /* MSTP3 */
>                 tpu0_clk: clock@304 {
>                         reg = <304>;
>                         clocks = <&cp_clk>;
>                         clock-output-names = "tpu0";
>                 };
>                 mmcif1_clk: clock@305 {
>                         reg = <305>;
>                         clocks = <&mmc1_clk>;
>                         clock-output-names = "mmcif1";
>                 };
>                 sdhi3_clk: clock@311 {
>                         reg = <311>;
>                         clocks = <&sd3_clk>;
>                         clock-output-names = "sdhi3";
>                 };
>                 sdhi2_clk: clock@312 {
>                         reg = <312>;
>                         clocks = <&sd2_clk>;
>                         clock-output-names = "sdhi2";
>                 };
>                 sdhi1_clk: clock@313 {
>                         reg = <313>;
>                         clocks = <&cpg_clocks R8A7790_CLK_SD1>;
>                         clock-output-names = "sdhi1";
>                 };
>                 sdhi0_clk: clock@314 {
>                         reg = <314>;
>                         clocks = <&cpg_clocks R8A7790_CLK_SD0>;
>                         clock-output-names = "sdhi0";
>                 };
>                 mmcif0_clk: clock@315 {
>                         reg = <315>;
>                         clocks = <&mmc0_clk>;
>                         clock-output-names = "mmcif0";
>                 };
> 
>                 ...
>         }
> 
> Devices would no longer use e.g. "clocks = <&mstp3_clks
> R8A7790_CLK_MMCIF1>", but "clocks = <&mmcif1_clk>".
> 
> 
> Questions/alternatives
> ----------------------
> 
>   - Should the subnode be called "mssr" (Module Standby and Software Reset)
>     instead of "mstp"?
>   - What with "renesas,*-cpg-clocks" clocks?
>       - Should we keep on using "#clock-cells = <1>" and <SOC>_CLK_<NAME>
>         indices, or switch to a less error-prone "#clock-cells = <0>"?
>   - What with "renesas,cpg-div6-clock" clocks?
>       - For now I kept them as a subnode of cpg_clocks, as their registers
>         are a subset of the CPG registers.

If you want to keep DT nodes for them I see no other location. The other 
option would be to merge them into the CPG node and add them to the list of 
clocks exposed by the CPG.

>       - This also means I had to keep the "#address-cells = <2>",
>         "#size-cells = <2>", and "ranges" properties under the CPG node.
>   - The MSTP number could be split in register and bit offset (and thus use
>     "#address-cells = <2>"), e.g.:
> 
>                 mmcif1_clk: clock@3,5 {
>                         reg = <3 5>;
>                         clocks = <&mmc1_clk>;
>                         clock-output-names = "mmcif1";
>                 };
> 
>         vs.
> 
>                 mmcif1_clk: clock@305 {
>                         reg = <305>;
>                         clocks = <&mmc1_clk>;
>                         clock-output-names = "mmcif1";
>                 };
> 
>     I don't think it's clearer, as the datasheet refers to e.g. "MSTP305".

You forgot the favourite topic of DT maintainers : how will this handle 
backward compatibility ?

> Thanks for your comments!
> 
> 
> Long example
> ------------
> 
> All r8a7791 clocks:
> 
>         /* External root clock */
>         extal_clk: extal_clk {
>                 compatible = "fixed-clock";
>                 #clock-cells = <0>;
>                 /* This value must be overriden by the board. */
>                 clock-frequency = <0>;
>                 clock-output-names = "extal";
>         };
> 
>         /*
>          * The external audio clocks are configured as 0 Hz fixed
> frequency clocks by
>          * default. Boards that provide audio clocks should override them.
>          */
>         audio_clk_a: audio_clk_a {
>                 compatible = "fixed-clock";
>                 #clock-cells = <0>;
>                 clock-frequency = <0>;
>                 clock-output-names = "audio_clk_a";
>         };
>         audio_clk_b: audio_clk_b {
>                 compatible = "fixed-clock";
>                 #clock-cells = <0>;
>                 clock-frequency = <0>;
>                 clock-output-names = "audio_clk_b";
>         };
>         audio_clk_c: audio_clk_c {
>                 compatible = "fixed-clock";
>                 #clock-cells = <0>;
>                 clock-frequency = <0>;
>                 clock-output-names = "audio_clk_c";
>         };
> 
>         /* External PCIe clock - can be overridden by the board */
>         pcie_bus_clk: pcie_bus_clk {
>                 compatible = "fixed-clock";
>                 #clock-cells = <0>;
>                 clock-frequency = <100000000>;
>                 clock-output-names = "pcie_bus";
>                 status = "disabled";
>         };
> 
>         /* External USB clock - can be overridden by the board */
>         usb_extal_clk: usb_extal_clk {
>                 compatible = "fixed-clock";
>                 #clock-cells = <0>;
>                 clock-frequency = <48000000>;
>                 clock-output-names = "usb_extal";
>         };
> 
>         /* External CAN clock */
>         can_clk: can_clk {
>                 compatible = "fixed-clock";
>                 #clock-cells = <0>;
>                 /* This value must be overridden by the board. */
>                 clock-frequency = <0>;
>                 clock-output-names = "can_clk";
>                 status = "disabled";
>         };
> 
>         /* Fixed factor clocks */
>         pll1_div2_clk: pll1_div2_clk {
>                 compatible = "fixed-factor-clock";
>                 clocks = <&cpg_clocks R8A7791_CLK_PLL1>;
>                 #clock-cells = <0>;
>                 clock-div = <2>;
>                 clock-mult = <1>;
>                 clock-output-names = "pll1_div2";
>         };
>         zg_clk: zg_clk {
>                 compatible = "fixed-factor-clock";
>                 clocks = <&cpg_clocks R8A7791_CLK_PLL1>;
>                 #clock-cells = <0>;
>                 clock-div = <3>;
>                 clock-mult = <1>;
>                 clock-output-names = "zg";
>         };
>         zx_clk: zx_clk {
>                 compatible = "fixed-factor-clock";
>                 clocks = <&cpg_clocks R8A7791_CLK_PLL1>;
>                 #clock-cells = <0>;
>                 clock-div = <3>;
>                 clock-mult = <1>;
>                 clock-output-names = "zx";
>         };
>         zs_clk: zs_clk {
>                 compatible = "fixed-factor-clock";
>                 clocks = <&cpg_clocks R8A7791_CLK_PLL1>;
>                 #clock-cells = <0>;
>                 clock-div = <6>;
>                 clock-mult = <1>;
>                 clock-output-names = "zs";
>         };
>         hp_clk: hp_clk {
>                 compatible = "fixed-factor-clock";
>                 clocks = <&cpg_clocks R8A7791_CLK_PLL1>;
>                 #clock-cells = <0>;
>                 clock-div = <12>;
>                 clock-mult = <1>;
>                 clock-output-names = "hp";
>         };
>         i_clk: i_clk {
>                 compatible = "fixed-factor-clock";
>                 clocks = <&cpg_clocks R8A7791_CLK_PLL1>;
>                 #clock-cells = <0>;
>                 clock-div = <2>;
>                 clock-mult = <1>;
>                 clock-output-names = "i";
>         };
>         b_clk: b_clk {
>                 compatible = "fixed-factor-clock";
>                 clocks = <&cpg_clocks R8A7791_CLK_PLL1>;
>                 #clock-cells = <0>;
>                 clock-div = <12>;
>                 clock-mult = <1>;
>                 clock-output-names = "b";
>         };
>         p_clk: p_clk {
>                 compatible = "fixed-factor-clock";
>                 clocks = <&cpg_clocks R8A7791_CLK_PLL1>;
>                 #clock-cells = <0>;
>                 clock-div = <24>;
>                 clock-mult = <1>;
>                 clock-output-names = "p";
>         };
>         cl_clk: cl_clk {
>                 compatible = "fixed-factor-clock";
>                 clocks = <&cpg_clocks R8A7791_CLK_PLL1>;
>                 #clock-cells = <0>;
>                 clock-div = <48>;
>                 clock-mult = <1>;
>                 clock-output-names = "cl";
>         };
>         m2_clk: m2_clk {
>                 compatible = "fixed-factor-clock";
>                 clocks = <&cpg_clocks R8A7791_CLK_PLL1>;
>                 #clock-cells = <0>;
>                 clock-div = <8>;
>                 clock-mult = <1>;
>                 clock-output-names = "m2";
>         };
>         imp_clk: imp_clk {
>                 compatible = "fixed-factor-clock";
>                 clocks = <&cpg_clocks R8A7791_CLK_PLL1>;
>                 #clock-cells = <0>;
>                 clock-div = <4>;
>                 clock-mult = <1>;
>                 clock-output-names = "imp";
>         };
>         rclk_clk: rclk_clk {
>                 compatible = "fixed-factor-clock";
>                 clocks = <&cpg_clocks R8A7791_CLK_PLL1>;
>                 #clock-cells = <0>;
>                 clock-div = <(48 * 1024)>;
>                 clock-mult = <1>;
>                 clock-output-names = "rclk";
>         };
>         oscclk_clk: oscclk_clk {
>                 compatible = "fixed-factor-clock";
>                 clocks = <&cpg_clocks R8A7791_CLK_PLL1>;
>                 #clock-cells = <0>;
>                 clock-div = <(12 * 1024)>;
>                 clock-mult = <1>;
>                 clock-output-names = "oscclk";
>         };
>         zb3_clk: zb3_clk {
>                 compatible = "fixed-factor-clock";
>                 clocks = <&cpg_clocks R8A7791_CLK_PLL3>;
>                 #clock-cells = <0>;
>                 clock-div = <4>;
>                 clock-mult = <1>;
>                 clock-output-names = "zb3";
>         };
>         zb3d2_clk: zb3d2_clk {
>                 compatible = "fixed-factor-clock";
>                 clocks = <&cpg_clocks R8A7791_CLK_PLL3>;
>                 #clock-cells = <0>;
>                 clock-div = <8>;
>                 clock-mult = <1>;
>                 clock-output-names = "zb3d2";
>         };
>         ddr_clk: ddr_clk {
>                 compatible = "fixed-factor-clock";
>                 clocks = <&cpg_clocks R8A7791_CLK_PLL3>;
>                 #clock-cells = <0>;
>                 clock-div = <8>;
>                 clock-mult = <1>;
>                 clock-output-names = "ddr";
>         };
>         mp_clk: mp_clk {
>                 compatible = "fixed-factor-clock";
>                 clocks = <&pll1_div2_clk>;
>                 #clock-cells = <0>;
>                 clock-div = <15>;
>                 clock-mult = <1>;
>                 clock-output-names = "mp";
>         };
>         cp_clk: cp_clk {
>                 compatible = "fixed-factor-clock";
>                 clocks = <&extal_clk>;
>                 #clock-cells = <0>;
>                 clock-div = <2>;
>                 clock-mult = <1>;
>                 clock-output-names = "cp";
>         };
> 
>         /* Special CPG clocks */
>         cpg_clocks: cpg_clocks@e6150000 {
>                 #address-cells = <2>;
>                 #size-cells = <2>;
>                 ranges;
> 
>                 compatible = "renesas,r8a7791-cpg",
>                 reg = <0 0xe6150000 0 0x1000>;
>                 clocks = <&extal_clk &usb_extal_clk>;
>                 #clock-cells = <1>;
>                 clock-output-names = "main", "pll0", "pll1", "pll3",
>                                      "lb", "qspi", "sdh", "sd0", "z",
>                                      "rcan", "adsp";
>                 #power-domain-cells = <0>;
> 
>                 /* Variable factor clocks */
>                 sd2_clk: sd2_clk@e6150078 {
>                         compatible = "renesas,r8a7791-div6-clock",
>                                      "renesas,cpg-div6-clock";
>                         reg = <0 0xe6150078 0 4>;
>                         clocks = <&pll1_div2_clk>;
>                         #clock-cells = <0>;
>                         clock-output-names = "sd2";
>                 };
>                 sd3_clk: sd3_clk@e615026c {
>                         compatible = "renesas,r8a7791-div6-clock",
>                                      "renesas,cpg-div6-clock";
>                         reg = <0 0xe615026c 0 4>;
>                         clocks = <&pll1_div2_clk>;
>                         #clock-cells = <0>;
>                         clock-output-names = "sd3";
>                 };
>                 mmc0_clk: mmc0_clk@e6150240 {
>                         compatible = "renesas,r8a7791-div6-clock",
>                                      "renesas,cpg-div6-clock";
>                         reg = <0 0xe6150240 0 4>;
>                         clocks = <&pll1_div2_clk>;
>                         #clock-cells = <0>;
>                         clock-output-names = "mmc0";
>                 };
>                 ssp_clk: ssp_clk@e6150248 {
>                         compatible = "renesas,r8a7791-div6-clock",
>                                      "renesas,cpg-div6-clock";
>                         reg = <0 0xe6150248 0 4>;
>                         clocks = <&pll1_div2_clk>;
>                         #clock-cells = <0>;
>                         clock-output-names = "ssp";
>                 };
>                 ssprs_clk: ssprs_clk@e615024c {
>                         compatible = "renesas,r8a7791-div6-clock",
>                                      "renesas,cpg-div6-clock";
>                         reg = <0 0xe615024c 0 4>;
>                         clocks = <&pll1_div2_clk>;
>                         #clock-cells = <0>;
>                         clock-output-names = "ssprs";
>                 };
> 
>                 /* Module Standby and Software Reset */
>                 mstp {
>                         #address-cells = <1>;
>                         #size-cells = <0>;
> 
>                         /* MSTP0 */
>                         msiof0_clk: clock@000 {
>                                 reg = <000>;
>                                 clocks = <&mp_clk>;
>                                 clock-output-names = "msiof0";
>                         };
> 
>                         /* MSTP1 */
>                         vcp0_clk: clock@101 {
>                                 reg = <101>;
>                                 clocks = <&zs_clk>;
>                                 clock-output-names = "vcp0";
>                         };
>                         vpc0_clk: clock@103 {
>                                 reg = <103>;
>                                 clocks = <&zs_clk>;
>                                 clock-output-names = "vpc0";
>                         };
>                         jpu_clk: clock@106 {
>                                 reg = <106>;
>                                 clocks = <&m2_clk>;
>                                 clock-output-names = "jpu";
>                         };
>                         ssp1_clk: clock@109 {
>                                 reg = <109>;
>                                 clocks = <&zs_clk>;
>                                 clock-output-names = "ssp1";
>                         };
>                         tmu1_clk: clock@111 {
>                                 reg = <111>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "tmu1";
>                         };
>                         threedg_clk: clock@112 {
>                                 reg = <112>;
>                                 clocks = <&zg_clk>;
>                                 clock-output-names = "3dg";
>                         };
>                         twoddmac_clk: clock@115 {
>                                 reg = <115>;
>                                 clocks = <&zs_clk>;
>                                 clock-output-names = "2ddmac";
>                         };
>                         fdp1_1_clk: clock@118 {
>                                 reg = <118>;
>                                 clocks = <&zs_clk>;
>                                 clock-output-names = "fdp1-1";
>                         };
>                         fdp1_0_clk: clock@119 {
>                                 reg = <119>;
>                                 clocks = <&zs_clk>;
>                                 clock-output-names = "fdp1-0";
>                         };
>                         tmu3_clk: clock@121 {
>                                 reg = <121>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "tmu3";
>                         };
>                         tmu2_clk: clock@122 {
>                                 reg = <122>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "tmu2";
>                         };
>                         cmt0_clk: clock@124 {
>                                 reg = <124>;
>                                 clocks = <&rclk_clk>;
>                                 clock-output-names = "cmt0";
>                         };
>                         tmu0_clk: clock@125 {
>                                 reg = <125>;
>                                 clocks = <&cp_clk>;
>                                 clock-output-names = "tmu0";
>                         };
>                         vsp1_du1_clk: clock@127 {
>                                 reg = <127>;
>                                 clocks = <&zs_clk>;
>                                 clock-output-names = "vsp1-du1";
>                         };
>                         vsp1_du0_clk: clock@128 {
>                                 reg = <128>;
>                                 clocks = <&zs_clk>;
>                                 clock-output-names = "vsp1-du0";
>                         };
>                         vsp1_sy_clk: clock@131 {
>                                 reg = <131>;
>                                 clocks = <&zs_clk>;
>                                 clock-output-names = "vsp1-sy";
>                         };
> 
>                         /* MSTP2 */
>                         scifa2_clk: clock@202 {
>                                 reg = <202>;
>                                 clocks = <&mp_clk>;
>                                 clock-output-names = "scifa2";
>                         };
>                         scifa1_clk: clock@203 {
>                                 reg = <203>;
>                                 clocks = <&mp_clk>;
>                                 clock-output-names = "scifa1";
>                         };
>                         scifa0_clk: clock@204 {
>                                 reg = <204>;
>                                 clocks = <&mp_clk>;
>                                 clock-output-names = "scifa0";
>                         };
>                         msiof2_clk: clock@205 {
>                                 reg = <205>;
>                                 clocks = <&mp_clk>;
>                                 clock-output-names = "msiof2";
>                         };
>                         scifb0_clk: clock@206 {
>                                 reg = <206>;
>                                 clocks = <&mp_clk>;
>                                 clock-output-names = "scifb0";
>                         };
>                         scifb1_clk: clock@207 {
>                                 reg = <207>;
>                                 clocks = <&mp_clk>;
>                                 clock-output-names = "scifb1";
>                         };
>                         msiof1_clk: clock@208 {
>                                 reg = <208>;
>                                 clocks = <&mp_clk>;
>                                 clock-output-names = "msiof1";
>                         };
>                         scifb2_clk: clock@216 {
>                                 reg = <216>;
>                                 clocks = <&mp_clk>;
>                                 clock-output-names = "scifb2";
>                         };
>                         sys_dmac1_clk: clock@218 {
>                                 reg = <218>;
>                                 clocks = <&zs_clk>;
>                                 clock-output-names = "sys-dmac1";
>                         };
>                         sys_dmac0_clk: clock@219 {
>                                 reg = <219>;
>                                 clocks = <&zs_clk>;
>                                 clock-output-names = "sys-dmac0";
>                         };
> 
>                         /* MSTP3 */
>                         tpu0_clk: clock@304 {
>                                 reg = <304>;
>                                 clocks = <&cp_clk>;
>                                 clock-output-names = "tpu0";
>                         };
>                         sdhi2_clk: clock@311 {
>                                 reg = <311>;
>                                 clocks = <&sd3_clk>;
>                                 clock-output-names = "sdhi2";
>                         };
>                         sdhi1_clk: clock@312 {
>                                 reg = <312>;
>                                 clocks = <&sd2_clk>;
>                                 clock-output-names = "sdhi1";
>                         };
>                         sdhi0_clk: clock@314 {
>                                 reg = <314>;
>                                 clocks = <&cpg_clocks R8A7791_CLK_SD0>;
>                                 clock-output-names = "sdhi0";
>                         };
>                         mmcif0_clk: clock@315 {
>                                 reg = <315>;
>                                 clocks = <&mmc0_clk>;
>                                 clock-output-names = "mmcif0";
>                         };
>                         i2c7_clk: clock@318 {
>                                 reg = <318>;
>                                 clocks = <&hp_clk>;
>                                 clock-output-names = "i2c7";
>                         };
>                         pciec_clk: clock@319 {
>                                 reg = <319>;
>                                 clocks = <&mp_clk>;
>                                 clock-output-names = "pciec";
>                         };
>                         i2c8_clk: clock@323 {
>                                 reg = <323>;
>                                 clocks = <&hp_clk>;
>                                 clock-output-names = "i2c8";
>                         };
>                         ssusb_clk: clock@328 {
>                                 reg = <328>;
>                                 clocks = <&mp_clk>;
>                                 clock-output-names = "ssusb";
>                         };
>                         cmt1_clk: clock@329 {
>                                 reg = <329>;
>                                 clocks = <&rclk_clk>;
>                                 clock-output-names = "cmt1";
>                         };
>                         usbdmac0_clk: clock@330 {
>                                 reg = <330>;
>                                 clocks = <&hp_clk>;
>                                 clock-output-names = "usbdmac0";
>                         };
>                         usbdmac1_clk: clock@331 {
>                                 reg = <331>;
>                                 clocks = <&hp_clk>;
>                                 clock-output-names = "usbdmac1";
>                         };
> 
>                         /* MSTP4 */
>                         irqc_clk: clock@407 {
>                                 reg = <407>;
>                                 clocks = <&cp_clk>;
>                                 clock-output-names = "irqc";
>                         };
>                         intc_sys_clk: clock@408 {
>                                 reg = <408>;
>                                 clocks = <&zs_clk>;
>                                 clock-output-names = "intc-sys";
>                         };
> 
>                         /* MSTP5 */
>                         audmac1_clk: clock@501 {
>                                 reg = <501>;
>                                 clocks = <&hp_clk>;
>                                 clock-output-names = "audmac1";
>                         };
>                         audmac0_clk: clock@502 {
>                                 reg = <502>;
>                                 clocks = <&hp_clk>;
>                                 clock-output-names = "audmac0";
>                         };
>                         adsp_mod_clk: clock@506 {
>                                 reg = <506>;
>                                 clocks = <&cpg_clocks R8A7791_CLK_ADSP>;
>                                 clock-output-names = "adsp_mod";
>                         };
>                         thermal_clk: clock@522 {
>                                 reg = <522>;
>                                 clocks = <&extal_clk>;
>                                 clock-output-names = "thermal";
>                         };
>                         pwm_clk: clock@523 {
>                                 reg = <523>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "pwm";
>                         };
> 
>                         /* MSTP7 */
>                         ehci_clk: clock@703 {
>                                 reg = <703>;
>                                 clocks = <&mp_clk>;
>                                 clock-output-names = "ehci";
>                         };
>                         hsusb_clk: clock@704 {
>                                 reg = <704>;
>                                 clocks = <&hp_clk>;
>                                 clock-output-names = "hsusb";
>                         };
>                         hscif2_clk: clock@713 {
>                                 reg = <713>;
>                                 clocks = <&zs_clk>;
>                                 clock-output-names = "hscif2";
>                         };
>                         scif5_clk: clock@714 {
>                                 reg = <714>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "scif5";
>                         };
>                         scif4_clk: clock@715 {
>                                 reg = <715>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "scif4";
>                         };
>                         hscif1_clk: clock@716 {
>                                 reg = <716>;
>                                 clocks = <&zs_clk>;
>                                 clock-output-names = "hscif1";
>                         };
>                         hscif0_clk: clock@717 {
>                                 reg = <717>;
>                                 clocks = <&zs_clk>;
>                                 clock-output-names = "hscif0";
>                         };
>                         scif3_clk: clock@718 {
>                                 reg = <718>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "scif3";
>                         };
>                         scif2_clk: clock@719 {
>                                 reg = <719>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "scif2";
>                         };
>                         scif1_clk: clock@720 {
>                                 reg = <720>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "scif1";
>                         };
>                         scif0_clk: clock@721 {
>                                 reg = <721>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "scif0";
>                         };
>                         du1_clk: clock@723 {
>                                 reg = <723>;
>                                 clocks = <&zx_clk>;
>                                 clock-output-names = "du1";
>                         };
>                         du0_clk: clock@724 {
>                                 reg = <724>;
>                                 clocks = <&zx_clk>;
>                                 clock-output-names = "du0";
>                         };
>                         lvds0_clk: clock@726 {
>                                 reg = <726>;
>                                 clocks = <&zx_clk>;
>                                 clock-output-names = "lvds0";
>                         };
> 
>                         /* MSTP8 */
>                         ipmmu_sgx_clk: clock@800 {
>                                 reg = <800>;
>                                 clocks = <&zx_clk>;
>                                 clock-output-names = "ipmmu_sgx";
>                         };
>                         mlb_clk: clock@802 {
>                                 reg = <802>;
>                                 clocks = <&hp_clk>;
>                                 clock-output-names = "mlb";
>                         };
>                         vin2_clk: clock@809 {
>                                 reg = <809>;
>                                 clocks = <&zg_clk>;
>                                 clock-output-names = "vin2";
>                         };
>                         vin1_clk: clock@810 {
>                                 reg = <810>;
>                                 clocks = <&zg_clk>;
>                                 clock-output-names = "vin1";
>                         };
>                         vin0_clk: clock@811 {
>                                 reg = <811>;
>                                 clocks = <&zg_clk>;
>                                 clock-output-names = "vin0";
>                         };
>                         ether_clk: clock@813 {
>                                 reg = <813>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "ether";
>                         };
>                         sata1_clk: clock@814 {
>                                 reg = <814>;
>                                 clocks = <&zs_clk>;
>                                 clock-output-names = "sata1";
>                         };
>                         sata0_clk: clock@815 {
>                                 reg = <815>;
>                                 clocks = <&zs_clk>;
>                                 clock-output-names = "sata0";
>                         };
> 
>                         /* MSTP9 */
>                         gpio7_clk: clock@904 {
>                                 reg = <904>;
>                                 clocks = <&cp_clk>;
>                                 clock-output-names = "gpio7";
>                         };
>                         gpio6_clk: clock@905 {
>                                 reg = <905>;
>                                 clocks = <&cp_clk>;
>                                 clock-output-names = "gpio6";
>                         };
>                         gpio5_clk: clock@907 {
>                                 reg = <907>;
>                                 clocks = <&cp_clk>;
>                                 clock-output-names = "gpio5";
>                         };
>                         gpio4_clk: clock@908 {
>                                 reg = <908>;
>                                 clocks = <&cp_clk>;
>                                 clock-output-names = "gpio4";
>                         };
>                         gpio3_clk: clock@909 {
>                                 reg = <909>;
>                                 clocks = <&cp_clk>;
>                                 clock-output-names = "gpio3";
>                         };
>                         gpio2_clk: clock@910 {
>                                 reg = <910>;
>                                 clocks = <&cp_clk>;
>                                 clock-output-names = "gpio2";
>                         };
>                         gpio1_clk: clock@911 {
>                                 reg = <911>;
>                                 clocks = <&cp_clk>;
>                                 clock-output-names = "gpio1";
>                         };
>                         gpio0_clk: clock@912 {
>                                 reg = <912>;
>                                 clocks = <&cp_clk>;
>                                 clock-output-names = "gpio0";
>                         };
>                         rcan1_clk: clock@915 {
>                                 reg = <915>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "rcan1";
>                         };
>                         rcan0_clk: clock@916 {
>                                 reg = <916>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "rcan0";
>                         };
>                         qspi_mod_clk: clock@917 {
>                                 reg = <917>;
>                                 clocks = <&cpg_clocks R8A7791_CLK_QSPI>;
>                                 clock-output-names = "qspi_mod";
>                         };
>                         i2c5_clk: clock@925 {
>                                 reg = <925>;
>                                 clocks = <&hp_clk>;
>                                 clock-output-names = "i2c5";
>                         };
>                         i2c6_clk: clock@926 {
>                                 reg = <926>;
>                                 clocks = <&cp_clk>;
>                                 clock-output-names = "i2c6";
>                         };
>                         i2c4_clk: clock@927 {
>                                 reg = <927>;
>                                 clocks = <&hp_clk>;
>                                 clock-output-names = "i2c4";
>                         };
>                         i2c3_clk: clock@928 {
>                                 reg = <928>;
>                                 clocks = <&hp_clk>;
>                                 clock-output-names = "i2c3";
>                         };
>                         i2c2_clk: clock@929 {
>                                 reg = <929>;
>                                 clocks = <&hp_clk>;
>                                 clock-output-names = "i2c2";
>                         };
>                         i2c1_clk: clock@930 {
>                                 reg = <930>;
>                                 clocks = <&hp_clk>;
>                                 clock-output-names = "i2c1";
>                         };
>                         i2c0_clk: clock@931 {
>                                 reg = <931>;
>                                 clocks = <&hp_clk>;
>                                 clock-output-names = "i2c0";
>                         };
> 
>                         /* MSTP10 */
>                         ssi_all_clk: clock@1005 {
>                                 reg = <1005>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "ssi-all";
>                         };
>                         ssi9_clk: clock@1006 {
>                                 reg = <1006>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "ssi9";
>                         };
>                         ssi8_clk: clock@1007 {
>                                 reg = <1007>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "ssi8";
>                         };
>                         ssi7_clk: clock@1008 {
>                                 reg = <1008>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "ssi7";
>                         };
>                         ssi6_clk: clock@1009 {
>                                 reg = <1009>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "ssi6";
>                         };
>                         ssi5_clk: clock@1010 {
>                                 reg = <1010>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "ssi5";
>                         };
>                         ssi4_clk: clock@1011 {
>                                 reg = <1011>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "ssi4";
>                         };
>                         ssi3_clk: clock@1012 {
>                                 reg = <1012>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "ssi3";
>                         };
>                         ssi2_clk: clock@1013 {
>                                 reg = <1013>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "ssi2";
>                         };
>                         ssi1_clk: clock@1014 {
>                                 reg = <1014>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "ssi1";
>                         };
>                         ssi0_clk: clock@1015 {
>                                 reg = <1015>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "ssi0";
>                         };
>                         scu_all_clk: clock@1017 {
>                                 reg = <1017>;
>                                 clocks = <&p_clk>;
>                                 clock-output-names = "scu-all";
>                         };
>                         scu_dvc1_clk: clock@1018 {
>                                 reg = <1018>;
>                                 clocks = <&scu_all_clk>;
>                                 clock-output-names = "scu-dvc1";
>                         };
>                         scu_dvc0_clk: clock@1019 {
>                                 reg = <1019>;
>                                 clocks = <&scu_all_clk>;
>                                 clock-output-names = "scu-dvc0";
>                         };
>                         scu_src9_clk: clock@1022 {
>                                 reg = <1022>;
>                                 clocks = <&scu_all_clk>;
>                                 clock-output-names = "scu-src9";
>                         };
>                         scu_src8_clk: clock@1023 {
>                                 reg = <1023>;
>                                 clocks = <&scu_all_clk>;
>                                 clock-output-names = "scu-src8";
>                         };
>                         scu_src7_clk: clock@1024 {
>                                 reg = <1024>;
>                                 clocks = <&scu_all_clk>;
>                                 clock-output-names = "scu-src7";
>                         };
>                         scu_src6_clk: clock@1025 {
>                                 reg = <1025>;
>                                 clocks = <&scu_all_clk>;
>                                 clock-output-names = "scu-src6";
>                         };
>                         scu_src5_clk: clock@1026 {
>                                 reg = <1026>;
>                                 clocks = <&scu_all_clk>;
>                                 clock-output-names = "scu-src5";
>                         };
>                         scu_src4_clk: clock@1027 {
>                                 reg = <1027>;
>                                 clocks = <&scu_all_clk>;
>                                 clock-output-names = "scu-src4";
>                         };
>                         scu_src3_clk: clock@1028 {
>                                 reg = <1028>;
>                                 clocks = <&scu_all_clk>;
>                                 clock-output-names = "scu-src3";
>                         };
>                         scu_src2_clk: clock@1029 {
>                                 reg = <1029>;
>                                 clocks = <&scu_all_clk>;
>                                 clock-output-names = "scu-src2";
>                         };
>                         scu_src1_clk: clock@1030 {
>                                 reg = <1030>;
>                                 clocks = <&scu_all_clk>;
>                                 clock-output-names = "scu-src1";
>                         };
>                         scu_src0_clk: clock@1031 {
>                                 reg = <1031>;
>                                 clocks = <&scu_all_clk>;
>                                 clock-output-names = "scu-src0";
>                         };
> 
>                         /* MSTP11 */
>                         scifa3_clk: clock@1106 {
>                                 reg = <1106>;
>                                 clocks = <&mp_clk>;
>                                 clock-output-names = "scifa3";
>                         };
>                         scifa4_clk: clock@1107 {
>                                 reg = <1107>;
>                                 clocks = <&mp_clk>;
>                                 clock-output-names = "scifa4";
>                         };
>                         scifa5_clk: clock@1108 {
>                                 reg = <1108>;
>                                 clocks = <&mp_clk>;
>                                 clock-output-names = "scifa5";
>                         };
>                 };
>         };
> 
> 
> References
> ----------
> 
>   [1] Documentation/devicetree/bindings/clock/renesas,<SoC>-cpg-clocks.txt
>       where <SoC> is a single SoC name or a family of SoCs
>   [2] Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt
>   [3] Documentation/devicetree/bindings/clock/renesas,cpg-div6-clocks.txt
>   [4] Documentation/devicetree/bindings/clock/fixed-factor-clock.txt
>   [5] arch/arm/boot/dts/{sh7,r7,r8}*.dtsi
>   [6] Series "[PATCH v2 00/14] ARM: shmobile: Add CPG Clock Domains"
>       (https://lkml.org/lkml/2015/5/28/590,
>        http://lkml.iu.edu/hypermail/linux/kernel/1505.3/03336.html)
>   [7] Series "[PATCH 0/6][RFC] arm64: Renesas Gen3 initial patch"
>       (http://www.spinics.net/lists/linux-sh/msg42683.html)

-- 
Regards,

Laurent Pinchart

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in




[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