From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>,
Magnus Damm <damm+renesas@opensource.se>,
Ulrich Hecht <ulrich.hecht+renesas@gmail.com>,
Michael Turquette <mturquette@baylibre.com>,
Stephen Boyd <sboyd@codeaurora.org>,
linux-clk@vger.kernel.org,
Linux PM list <linux-pm@vger.kernel.org>,
"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
Linux-sh list <linux-sh@vger.kernel.org>
Subject: Re: Renesas CPG/MSTP DT Binding Proposal
Date: Mon, 22 Jun 2015 23:36:39 +0300 [thread overview]
Message-ID: <1880823.RNAtaAaRWG@avalon> (raw)
In-Reply-To: <CAMuHMdU3SkrOUfUwPg_sK=9os_60Emt9--rVjNoWv4NDxLAeaA@mail.gmail.com>
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 linux-sh" in
next prev parent reply other threads:[~2015-06-22 20:36 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-22 19:49 Renesas CPG/MSTP DT Binding Proposal Geert Uytterhoeven
2015-06-22 20:36 ` Laurent Pinchart [this message]
2015-06-23 8:33 ` Geert Uytterhoeven
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1880823.RNAtaAaRWG@avalon \
--to=laurent.pinchart@ideasonboard.com \
--cc=damm+renesas@opensource.se \
--cc=devicetree@vger.kernel.org \
--cc=geert@linux-m68k.org \
--cc=laurent.pinchart+renesas@ideasonboard.com \
--cc=linux-clk@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-sh@vger.kernel.org \
--cc=mturquette@baylibre.com \
--cc=sboyd@codeaurora.org \
--cc=ulrich.hecht+renesas@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).