Merge branches 'clk-fixed-rate-remove' and 'clk-qcom-cleanup' into clk-next
authorStephen Boyd <sboyd@kernel.org>
Thu, 18 Oct 2018 22:44:13 +0000 (15:44 -0700)
committerStephen Boyd <sboyd@kernel.org>
Thu, 18 Oct 2018 22:44:13 +0000 (15:44 -0700)
* clk-fixed-rate-remove:
  clk: fixed-rate: fix of_node_get-put imbalance

* clk-qcom-cleanup:
  clk: qcom: Remove unused arrays in SDM845 GCC

294 files changed:
Documentation/devicetree/bindings/arm/msm/qcom,kpss-acc.txt
Documentation/devicetree/bindings/arm/msm/qcom,kpss-gcc.txt [new file with mode: 0644]
Documentation/devicetree/bindings/clock/actions,owl-cmu.txt
Documentation/devicetree/bindings/clock/at91-clock.txt
Documentation/devicetree/bindings/clock/hi3670-clock.txt [new file with mode: 0644]
Documentation/devicetree/bindings/clock/ingenic,cgu.txt
Documentation/devicetree/bindings/clock/qcom,camcc.txt [new file with mode: 0644]
Documentation/devicetree/bindings/clock/qcom,gcc.txt
Documentation/devicetree/bindings/clock/qcom,hfpll.txt [new file with mode: 0644]
Documentation/devicetree/bindings/clock/qcom,krait-cc.txt [new file with mode: 0644]
Documentation/devicetree/bindings/clock/renesas,cpg-mssr.txt
arch/arm/common/Kconfig
arch/arm/common/Makefile
arch/arm/common/krait-l2-accessors.c [new file with mode: 0644]
arch/arm/include/asm/krait-l2-accessors.h [new file with mode: 0644]
arch/arm/mach-davinci/include/mach/clock.h [deleted file]
drivers/clk/Kconfig
drivers/clk/Makefile
drivers/clk/actions/Kconfig
drivers/clk/actions/Makefile
drivers/clk/actions/owl-common.c
drivers/clk/actions/owl-common.h
drivers/clk/actions/owl-reset.c [new file with mode: 0644]
drivers/clk/actions/owl-reset.h [new file with mode: 0644]
drivers/clk/actions/owl-s700.c
drivers/clk/actions/owl-s900.c
drivers/clk/at91/Makefile
drivers/clk/at91/at91sam9260.c [new file with mode: 0644]
drivers/clk/at91/at91sam9rl.c [new file with mode: 0644]
drivers/clk/at91/at91sam9x5.c [new file with mode: 0644]
drivers/clk/at91/clk-audio-pll.c
drivers/clk/at91/clk-generated.c
drivers/clk/at91/clk-h32mx.c
drivers/clk/at91/clk-i2s-mux.c
drivers/clk/at91/clk-main.c
drivers/clk/at91/clk-master.c
drivers/clk/at91/clk-peripheral.c
drivers/clk/at91/clk-pll.c
drivers/clk/at91/clk-plldiv.c
drivers/clk/at91/clk-programmable.c
drivers/clk/at91/clk-slow.c
drivers/clk/at91/clk-smd.c
drivers/clk/at91/clk-system.c
drivers/clk/at91/clk-usb.c
drivers/clk/at91/clk-utmi.c
drivers/clk/at91/dt-compat.c [new file with mode: 0644]
drivers/clk/at91/pmc.c
drivers/clk/at91/pmc.h
drivers/clk/at91/sama5d2.c [new file with mode: 0644]
drivers/clk/at91/sama5d4.c [new file with mode: 0644]
drivers/clk/axs10x/pll_clock.c
drivers/clk/bcm/clk-kona-setup.c
drivers/clk/clk-asm9260.c
drivers/clk/clk-bulk.c
drivers/clk/clk-cdce925.c
drivers/clk/clk-devres.c
drivers/clk/clk-fixed-factor.c
drivers/clk/clk-fixed-rate.c
drivers/clk/clk-gpio.c
drivers/clk/clk-hsdk-pll.c
drivers/clk/clk-max77686.c
drivers/clk/clk-nomadik.c
drivers/clk/clk-npcm7xx.c
drivers/clk/clk-palmas.c
drivers/clk/clk-qoriq.c
drivers/clk/clk-s2mps11.c
drivers/clk/clk-scmi.c
drivers/clk/clk-scpi.c
drivers/clk/clk-si5351.c
drivers/clk/clk-stm32f4.c
drivers/clk/clk-stm32h7.c
drivers/clk/clk-stm32mp1.c
drivers/clk/clk-tango4.c
drivers/clk/clk.c
drivers/clk/davinci/psc.c
drivers/clk/hisilicon/Kconfig
drivers/clk/hisilicon/Makefile
drivers/clk/hisilicon/clk-hi3670.c [new file with mode: 0644]
drivers/clk/hisilicon/reset.c
drivers/clk/imx/clk-cpu.c
drivers/clk/imx/clk-imx6q.c
drivers/clk/imx/clk-imx6sl.c
drivers/clk/imx/clk-imx6sll.c
drivers/clk/imx/clk-imx6sx.c
drivers/clk/imx/clk-imx6ul.c
drivers/clk/imx/clk-imx7d.c
drivers/clk/imx/clk.h
drivers/clk/ingenic/Kconfig [new file with mode: 0644]
drivers/clk/ingenic/Makefile
drivers/clk/ingenic/jz4725b-cgu.c [new file with mode: 0644]
drivers/clk/keystone/Kconfig
drivers/clk/keystone/gate.c
drivers/clk/keystone/pll.c
drivers/clk/mediatek/clk-mt2701.c
drivers/clk/meson/axg-audio.c
drivers/clk/meson/axg.c
drivers/clk/meson/axg.h
drivers/clk/meson/clk-pll.c
drivers/clk/meson/clkc.h
drivers/clk/meson/gxbb.c
drivers/clk/meson/gxbb.h
drivers/clk/meson/meson8b.c
drivers/clk/meson/meson8b.h
drivers/clk/mmp/clk-of-mmp2.c
drivers/clk/mvebu/ap806-system-controller.c
drivers/clk/mvebu/armada-370.c
drivers/clk/mvebu/armada-375.c
drivers/clk/mvebu/armada-37xx-periph.c
drivers/clk/mvebu/armada-37xx-tbg.c
drivers/clk/mvebu/armada-37xx-xtal.c
drivers/clk/mvebu/armada-38x.c
drivers/clk/mvebu/armada-39x.c
drivers/clk/mvebu/armada-xp.c
drivers/clk/mvebu/clk-corediv.c
drivers/clk/mvebu/clk-cpu.c
drivers/clk/mvebu/common.c
drivers/clk/mvebu/common.h
drivers/clk/mvebu/cp110-system-controller.c
drivers/clk/mvebu/dove.c
drivers/clk/mvebu/kirkwood.c
drivers/clk/mvebu/mv98dx3236.c
drivers/clk/mvebu/orion.c
drivers/clk/qcom/Kconfig
drivers/clk/qcom/Makefile
drivers/clk/qcom/camcc-sdm845.c [new file with mode: 0644]
drivers/clk/qcom/clk-alpha-pll.c
drivers/clk/qcom/clk-branch.c
drivers/clk/qcom/clk-hfpll.c [new file with mode: 0644]
drivers/clk/qcom/clk-hfpll.h [new file with mode: 0644]
drivers/clk/qcom/clk-krait.c [new file with mode: 0644]
drivers/clk/qcom/clk-krait.h [new file with mode: 0644]
drivers/clk/qcom/clk-rcg.h
drivers/clk/qcom/clk-rcg2.c
drivers/clk/qcom/gcc-ipq806x.c
drivers/clk/qcom/gcc-msm8960.c
drivers/clk/qcom/gcc-msm8996.c
drivers/clk/qcom/gcc-qcs404.c [new file with mode: 0644]
drivers/clk/qcom/gcc-sdm660.c [new file with mode: 0644]
drivers/clk/qcom/gcc-sdm845.c
drivers/clk/qcom/hfpll.c [new file with mode: 0644]
drivers/clk/qcom/kpss-xcc.c [new file with mode: 0644]
drivers/clk/qcom/krait-cc.c [new file with mode: 0644]
drivers/clk/renesas/Kconfig
drivers/clk/renesas/Makefile
drivers/clk/renesas/clk-div6.c
drivers/clk/renesas/clk-emev2.c
drivers/clk/renesas/clk-mstp.c
drivers/clk/renesas/clk-r8a73a4.c
drivers/clk/renesas/clk-r8a7740.c
drivers/clk/renesas/clk-r8a7778.c
drivers/clk/renesas/clk-r8a7779.c
drivers/clk/renesas/clk-rcar-gen2.c
drivers/clk/renesas/clk-rz.c
drivers/clk/renesas/clk-sh73a0.c
drivers/clk/renesas/r7s9210-cpg-mssr.c [new file with mode: 0644]
drivers/clk/renesas/r8a7743-cpg-mssr.c
drivers/clk/renesas/r8a7745-cpg-mssr.c
drivers/clk/renesas/r8a774a1-cpg-mssr.c [new file with mode: 0644]
drivers/clk/renesas/r8a774c0-cpg-mssr.c [new file with mode: 0644]
drivers/clk/renesas/r8a7790-cpg-mssr.c
drivers/clk/renesas/r8a7791-cpg-mssr.c
drivers/clk/renesas/r8a7792-cpg-mssr.c
drivers/clk/renesas/r8a7794-cpg-mssr.c
drivers/clk/renesas/r8a7795-cpg-mssr.c
drivers/clk/renesas/r8a7796-cpg-mssr.c
drivers/clk/renesas/r8a77965-cpg-mssr.c
drivers/clk/renesas/r8a77970-cpg-mssr.c
drivers/clk/renesas/r8a77980-cpg-mssr.c
drivers/clk/renesas/r8a77990-cpg-mssr.c
drivers/clk/renesas/r8a77995-cpg-mssr.c
drivers/clk/renesas/r9a06g032-clocks.c
drivers/clk/renesas/rcar-gen2-cpg.c
drivers/clk/renesas/rcar-gen2-cpg.h
drivers/clk/renesas/rcar-gen3-cpg.c
drivers/clk/renesas/rcar-gen3-cpg.h
drivers/clk/renesas/rcar-usb2-clock-sel.c
drivers/clk/renesas/renesas-cpg-mssr.c
drivers/clk/renesas/renesas-cpg-mssr.h
drivers/clk/rockchip/clk-ddr.c
drivers/clk/rockchip/clk-rk3188.c
drivers/clk/rockchip/clk-rk3288.c
drivers/clk/rockchip/clk-rk3328.c
drivers/clk/samsung/clk-cpu.c
drivers/clk/samsung/clk-cpu.h
drivers/clk/samsung/clk-exynos-audss.c
drivers/clk/samsung/clk-exynos3250.c
drivers/clk/samsung/clk-exynos4.c
drivers/clk/samsung/clk-exynos5250.c
drivers/clk/samsung/clk-exynos5420.c
drivers/clk/samsung/clk-exynos5433.c
drivers/clk/samsung/clk-s3c2410.c
drivers/clk/samsung/clk-s3c2412.c
drivers/clk/samsung/clk-s3c2443.c
drivers/clk/samsung/clk-s3c64xx.c
drivers/clk/samsung/clk-s5pv210.c
drivers/clk/samsung/clk.c
drivers/clk/samsung/clk.h
drivers/clk/st/clkgen-fsyn.c
drivers/clk/sunxi-ng/ccu-sun50i-a64.c
drivers/clk/sunxi-ng/ccu-sun50i-a64.h
drivers/clk/sunxi-ng/ccu-sun50i-h6.c
drivers/clk/sunxi-ng/ccu-sun8i-a83t.c
drivers/clk/sunxi-ng/ccu-sun8i-h3.c
drivers/clk/sunxi-ng/ccu-sun8i-r40.c
drivers/clk/sunxi-ng/ccu_nkmp.c
drivers/clk/sunxi-ng/ccu_nkmp.h
drivers/clk/sunxi-ng/ccu_nm.c
drivers/clk/sunxi-ng/ccu_nm.h
drivers/clk/sunxi/clk-mod0.c
drivers/clk/sunxi/clk-sun9i-core.c
drivers/clk/sunxi/clk-sunxi.c
drivers/clk/tegra/clk-dfll.c
drivers/clk/tegra/clk-tegra210.c
drivers/clk/ti/Makefile
drivers/clk/ti/apll.c
drivers/clk/ti/clk-33xx-compat.c [new file with mode: 0644]
drivers/clk/ti/clk-33xx.c
drivers/clk/ti/clk-43xx-compat.c [new file with mode: 0644]
drivers/clk/ti/clk-43xx.c
drivers/clk/ti/clk-7xx-compat.c [new file with mode: 0644]
drivers/clk/ti/clk-7xx.c
drivers/clk/ti/clk-dra7-atl.c
drivers/clk/ti/clk.c
drivers/clk/ti/clkctrl.c
drivers/clk/ti/clock.h
drivers/clk/ti/composite.c
drivers/clk/ti/divider.c
drivers/clk/ti/dpll.c
drivers/clk/ti/dpll3xxx.c
drivers/clk/ti/fapll.c
drivers/clk/ti/fixed-factor.c
drivers/clk/ti/gate.c
drivers/clk/ti/interface.c
drivers/clk/ti/mux.c
drivers/clk/zynq/clkc.c
include/dt-bindings/clock/am3.h
include/dt-bindings/clock/am4.h
include/dt-bindings/clock/at91.h
include/dt-bindings/clock/dra7.h
include/dt-bindings/clock/exynos3250.h
include/dt-bindings/clock/exynos4.h
include/dt-bindings/clock/exynos5250.h
include/dt-bindings/clock/exynos5260-clk.h
include/dt-bindings/clock/exynos5410.h
include/dt-bindings/clock/exynos5420.h
include/dt-bindings/clock/exynos5433.h
include/dt-bindings/clock/exynos7-clk.h
include/dt-bindings/clock/hi3670-clock.h [new file with mode: 0644]
include/dt-bindings/clock/imx6qdl-clock.h
include/dt-bindings/clock/imx6sl-clock.h
include/dt-bindings/clock/imx6sll-clock.h
include/dt-bindings/clock/imx6sx-clock.h
include/dt-bindings/clock/imx6ul-clock.h
include/dt-bindings/clock/jz4725b-cgu.h [new file with mode: 0644]
include/dt-bindings/clock/maxim,max77686.h
include/dt-bindings/clock/maxim,max77802.h
include/dt-bindings/clock/qcom,camcc-sdm845.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,gcc-msm8960.h
include/dt-bindings/clock/qcom,gcc-msm8996.h
include/dt-bindings/clock/qcom,gcc-qcs404.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,gcc-sdm660.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,gcc-sdm845.h
include/dt-bindings/clock/r7s72100-clock.h
include/dt-bindings/clock/r7s9210-cpg-mssr.h [new file with mode: 0644]
include/dt-bindings/clock/r8a7743-cpg-mssr.h
include/dt-bindings/clock/r8a7744-cpg-mssr.h [new file with mode: 0644]
include/dt-bindings/clock/r8a7745-cpg-mssr.h
include/dt-bindings/clock/r8a774a1-cpg-mssr.h [new file with mode: 0644]
include/dt-bindings/clock/r8a774c0-cpg-mssr.h [new file with mode: 0644]
include/dt-bindings/clock/r8a7790-cpg-mssr.h
include/dt-bindings/clock/r8a7791-cpg-mssr.h
include/dt-bindings/clock/r8a7792-cpg-mssr.h
include/dt-bindings/clock/r8a7793-clock.h
include/dt-bindings/clock/r8a7793-cpg-mssr.h
include/dt-bindings/clock/r8a7794-clock.h
include/dt-bindings/clock/r8a7794-cpg-mssr.h
include/dt-bindings/clock/r8a7795-cpg-mssr.h
include/dt-bindings/clock/r8a7796-cpg-mssr.h
include/dt-bindings/clock/r8a77970-cpg-mssr.h
include/dt-bindings/clock/r8a77995-cpg-mssr.h
include/dt-bindings/clock/renesas-cpg-mssr.h
include/dt-bindings/clock/rk3188-cru-common.h
include/dt-bindings/clock/s3c2410.h
include/dt-bindings/clock/s3c2412.h
include/dt-bindings/clock/s3c2443.h
include/dt-bindings/clock/samsung,s2mps11.h
include/dt-bindings/clock/samsung,s3c64xx-clock.h
include/dt-bindings/clock/sun50i-a64-ccu.h
include/dt-bindings/reset/actions,s700-reset.h [new file with mode: 0644]
include/dt-bindings/reset/actions,s900-reset.h [new file with mode: 0644]
include/linux/clk-provider.h
include/linux/clk.h
include/linux/clk/renesas.h
include/linux/clk/ti.h

index 1333db9acfee11aa47b9972ac9e41b0e081966ec..7f696362a4a1da1274f244745997bf89b13b8a10 100644 (file)
@@ -21,10 +21,29 @@ PROPERTIES
                    the register region. An optional second element specifies
                    the base address and size of the alias register region.
 
+- clocks:
+        Usage: required
+        Value type: <prop-encoded-array>
+        Definition: reference to the pll parents.
+
+- clock-names:
+        Usage: required
+        Value type: <stringlist>
+        Definition: must be "pll8_vote", "pxo".
+
+- clock-output-names:
+       Usage: optional
+       Value type: <string>
+       Definition: Name of the output clock. Typically acpuX_aux where X is a
+                   CPU number starting at 0.
+
 Example:
 
        clock-controller@2088000 {
                compatible = "qcom,kpss-acc-v2";
                reg = <0x02088000 0x1000>,
                      <0x02008000 0x1000>;
+               clocks = <&gcc PLL8_VOTE>, <&gcc PXO_SRC>;
+               clock-names = "pll8_vote", "pxo";
+               clock-output-names = "acpu0_aux";
        };
diff --git a/Documentation/devicetree/bindings/arm/msm/qcom,kpss-gcc.txt b/Documentation/devicetree/bindings/arm/msm/qcom,kpss-gcc.txt
new file mode 100644 (file)
index 0000000..e628758
--- /dev/null
@@ -0,0 +1,44 @@
+Krait Processor Sub-system (KPSS) Global Clock Controller (GCC)
+
+PROPERTIES
+
+- compatible:
+       Usage: required
+       Value type: <string>
+       Definition: should be one of the following. The generic compatible
+                       "qcom,kpss-gcc" should also be included.
+                       "qcom,kpss-gcc-ipq8064", "qcom,kpss-gcc"
+                       "qcom,kpss-gcc-apq8064", "qcom,kpss-gcc"
+                       "qcom,kpss-gcc-msm8974", "qcom,kpss-gcc"
+                       "qcom,kpss-gcc-msm8960", "qcom,kpss-gcc"
+
+- reg:
+       Usage: required
+       Value type: <prop-encoded-array>
+       Definition: base address and size of the register region
+
+- clocks:
+       Usage: required
+       Value type: <prop-encoded-array>
+       Definition: reference to the pll parents.
+
+- clock-names:
+       Usage: required
+       Value type: <stringlist>
+       Definition: must be "pll8_vote", "pxo".
+
+- clock-output-names:
+       Usage: required
+       Value type: <string>
+       Definition: Name of the output clock. Typically acpu_l2_aux indicating
+                   an L2 cache auxiliary clock.
+
+Example:
+
+       l2cc: clock-controller@2011000 {
+               compatible = "qcom,kpss-gcc-ipq8064", "qcom,kpss-gcc";
+               reg = <0x2011000 0x1000>;
+               clocks = <&gcc PLL8_VOTE>, <&gcc PXO_SRC>;
+               clock-names = "pll8_vote", "pxo";
+               clock-output-names = "acpu_l2_aux";
+       };
index d1e60d2973874b9ffbc140cee9e7f34c2cfbe9d4..2ef86ae96df8cb1ad98b39d92f8b7e7213a67134 100644 (file)
@@ -13,6 +13,7 @@ Required Properties:
   region.
 - clocks: Reference to the parent clocks ("hosc", "losc")
 - #clock-cells: should be 1.
+- #reset-cells: should be 1.
 
 Each clock is assigned an identifier, and client nodes can use this identifier
 to specify the clock which they consume.
@@ -36,6 +37,7 @@ Example: Clock Management Unit node:
                 reg = <0x0 0xe0160000 0x0 0x1000>;
                 clocks = <&hosc>, <&losc>;
                 #clock-cells = <1>;
+                #reset-cells = <1>;
         };
 
 Example: UART controller node that consumes clock generated by the clock
index 8f8f95056f3d4d456fd62726055052a1e60277d5..e9f70fcdfe804bd6d85dffb9627e0d7eef41be7d 100644 (file)
@@ -4,6 +4,8 @@ This binding uses the common clock binding[1].
 
 [1] Documentation/devicetree/bindings/clock/clock-bindings.txt
 
+Slow Clock controller:
+
 Required properties:
 - compatible : shall be one of the following:
        "atmel,at91sam9x5-sckc" or
@@ -16,84 +18,6 @@ Required properties:
 
        "atmel,at91sam9x5-clk-slow-rc-osc":
                at91 internal slow RC oscillator
-
-       "atmel,<chip>-pmc":
-               at91 PMC (Power Management Controller)
-               All at91 specific clocks (clocks defined below) must be child
-               node of the PMC node.
-               <chip> can be: at91rm9200, at91sam9260, at91sam9261,
-               at91sam9263, at91sam9g45, at91sam9n12, at91sam9rl, at91sam9x5,
-               sama5d2, sama5d3 or sama5d4.
-
-       "atmel,at91sam9x5-clk-slow" (under sckc node)
-       or
-       "atmel,at91sam9260-clk-slow" (under pmc node):
-               at91 slow clk
-
-       "atmel,at91rm9200-clk-main-osc"
-       "atmel,at91sam9x5-clk-main-rc-osc"
-               at91 main clk sources
-
-       "atmel,at91sam9x5-clk-main"
-       "atmel,at91rm9200-clk-main":
-               at91 main clock
-
-       "atmel,at91rm9200-clk-master" or
-       "atmel,at91sam9x5-clk-master":
-               at91 master clock
-
-       "atmel,at91sam9x5-clk-peripheral" or
-       "atmel,at91rm9200-clk-peripheral":
-               at91 peripheral clocks
-
-       "atmel,at91rm9200-clk-pll" or
-       "atmel,at91sam9g45-clk-pll" or
-       "atmel,at91sam9g20-clk-pllb" or
-       "atmel,sama5d3-clk-pll":
-               at91 pll clocks
-
-       "atmel,at91sam9x5-clk-plldiv":
-               at91 plla divisor
-
-       "atmel,at91rm9200-clk-programmable" or
-       "atmel,at91sam9g45-clk-programmable" or
-       "atmel,at91sam9x5-clk-programmable":
-               at91 programmable clocks
-
-       "atmel,at91sam9x5-clk-smd":
-               at91 SMD (Soft Modem) clock
-
-       "atmel,at91rm9200-clk-system":
-               at91 system clocks
-
-       "atmel,at91rm9200-clk-usb" or
-       "atmel,at91sam9x5-clk-usb" or
-       "atmel,at91sam9n12-clk-usb":
-               at91 usb clock
-
-       "atmel,at91sam9x5-clk-utmi":
-               at91 utmi clock
-
-       "atmel,sama5d4-clk-h32mx":
-               at91 h32mx clock
-
-       "atmel,sama5d2-clk-generated":
-               at91 generated clock
-
-       "atmel,sama5d2-clk-audio-pll-frac":
-               at91 audio fractional pll
-
-       "atmel,sama5d2-clk-audio-pll-pad":
-               at91 audio pll CLK_AUDIO output pin
-
-       "atmel,sama5d2-clk-audio-pll-pmc"
-               at91 audio pll output on AUDIOPLLCLK that feeds the PMC
-               and can be used by peripheral clock or generic clock
-
-       "atmel,sama5d2-clk-i2s-mux" (under pmc node):
-               at91 I2S clock source selection
-
-Required properties for SCKC node:
 - reg : defines the IO memory reserved for the SCKC.
 - #size-cells : shall be 0 (reg is used to encode clk id).
 - #address-cells : shall be 1 (reg is used to encode clk id).
@@ -109,428 +33,30 @@ For example:
                /* put at91 slow clocks here */
        };
 
+Power Management Controller (PMC):
 
-Required properties for internal slow RC oscillator:
-- #clock-cells : from common clock binding; shall be set to 0.
-- clock-frequency : define the internal RC oscillator frequency.
-
-Optional properties:
-- clock-accuracy : define the internal RC oscillator accuracy.
-
-For example:
-       slow_rc_osc: slow_rc_osc {
-               compatible = "atmel,at91sam9x5-clk-slow-rc-osc";
-               clock-frequency = <32768>;
-               clock-accuracy = <50000000>;
-       };
-
-Required properties for slow oscillator:
-- #clock-cells : from common clock binding; shall be set to 0.
-- clocks : shall encode the main osc source clk sources (see atmel datasheet).
+Required properties:
+- compatible : shall be "atmel,<chip>-pmc", "syscon":
+       <chip> can be: at91rm9200, at91sam9260, at91sam9261,
+       at91sam9263, at91sam9g45, at91sam9n12, at91sam9rl, at91sam9g15,
+       at91sam9g25, at91sam9g35, at91sam9x25, at91sam9x35, at91sam9x5,
+       sama5d2, sama5d3 or sama5d4.
+- #clock-cells : from common clock binding; shall be set to 2. The first entry
+  is the type of the clock (core, system, peripheral or generated) and the
+  second entry its index as provided by the datasheet
+- clocks : Must contain an entry for each entry in clock-names.
+- clock-names: Must include the following entries: "slow_clk", "main_xtal"
 
 Optional properties:
 - atmel,osc-bypass : boolean property. Set this when a clock signal is directly
   provided on XIN.
 
 For example:
-       slow_osc: slow_osc {
-               compatible = "atmel,at91rm9200-clk-slow-osc";
-               #clock-cells = <0>;
-               clocks = <&slow_xtal>;
-       };
-
-Required properties for slow clock:
-- #clock-cells : from common clock binding; shall be set to 0.
-- clocks : shall encode the slow clk sources (see atmel datasheet).
-
-For example:
-       clk32k: slck {
-               compatible = "atmel,at91sam9x5-clk-slow";
-               #clock-cells = <0>;
-               clocks = <&slow_rc_osc &slow_osc>;
-       };
-
-Required properties for PMC node:
-- reg : defines the IO memory reserved for the PMC.
-- #size-cells : shall be 0 (reg is used to encode clk id).
-- #address-cells : shall be 1 (reg is used to encode clk id).
-- interrupts : shall be set to PMC interrupt line.
-- interrupt-controller : tell that the PMC is an interrupt controller.
-- #interrupt-cells : must be set to 1. The first cell encodes the interrupt id,
-       and reflect the bit position in the PMC_ER/DR/SR registers.
-       You can use the dt macros defined in dt-bindings/clock/at91.h.
-       0 (AT91_PMC_MOSCS) -> main oscillator ready
-       1 (AT91_PMC_LOCKA) -> PLL A ready
-       2 (AT91_PMC_LOCKB) -> PLL B ready
-       3 (AT91_PMC_MCKRDY) -> master clock ready
-       6 (AT91_PMC_LOCKU) -> UTMI PLL clock ready
-       8 .. 15 (AT91_PMC_PCKRDY(id)) -> programmable clock ready
-       16 (AT91_PMC_MOSCSELS) -> main oscillator selected
-       17 (AT91_PMC_MOSCRCS) -> RC main oscillator stabilized
-       18 (AT91_PMC_CFDEV) -> clock failure detected
-
-For example:
-       pmc: pmc@fffffc00 {
-               compatible = "atmel,sama5d3-pmc";
-               interrupts = <1 4 7>;
-               interrupt-controller;
-               #interrupt-cells = <2>;
-               #size-cells = <0>;
-               #address-cells = <1>;
-
-               /* put at91 clocks here */
-       };
-
-Required properties for main clock internal RC oscillator:
-- interrupts : shall be set to "<0>".
-- clock-frequency : define the internal RC oscillator frequency.
-
-Optional properties:
-- clock-accuracy : define the internal RC oscillator accuracy.
-
-For example:
-       main_rc_osc: main_rc_osc {
-               compatible = "atmel,at91sam9x5-clk-main-rc-osc";
-               interrupt-parent = <&pmc>;
-               interrupts = <0>;
-               clock-frequency = <12000000>;
-               clock-accuracy = <50000000>;
-       };
-
-Required properties for main clock oscillator:
-- interrupts : shall be set to "<0>".
-- #clock-cells : from common clock binding; shall be set to 0.
-- clocks : shall encode the main osc source clk sources (see atmel datasheet).
-
-Optional properties:
-- atmel,osc-bypass : boolean property. Specified if a clock signal is provided
-  on XIN.
-
-  clock signal is directly provided on XIN pin.
-
-For example:
-       main_osc: main_osc {
-               compatible = "atmel,at91rm9200-clk-main-osc";
-               interrupt-parent = <&pmc>;
-               interrupts = <0>;
-               #clock-cells = <0>;
-               clocks = <&main_xtal>;
-       };
-
-Required properties for main clock:
-- interrupts : shall be set to "<0>".
-- #clock-cells : from common clock binding; shall be set to 0.
-- clocks : shall encode the main clk sources (see atmel datasheet).
-
-For example:
-       main: mainck {
-               compatible = "atmel,at91sam9x5-clk-main";
-               interrupt-parent = <&pmc>;
-               interrupts = <0>;
-               #clock-cells = <0>;
-               clocks = <&main_rc_osc &main_osc>;
-       };
-
-Required properties for master clock:
-- interrupts : shall be set to "<3>".
-- #clock-cells : from common clock binding; shall be set to 0.
-- clocks : shall be the master clock sources (see atmel datasheet) phandles.
-       e.g. "<&ck32k>, <&main>, <&plla>, <&pllb>".
-- atmel,clk-output-range : minimum and maximum clock frequency (two u32
-                          fields).
-          e.g. output = <0 133000000>; <=> 0 to 133MHz.
-- atmel,clk-divisors : master clock divisors table (four u32 fields).
-               0 <=> reserved value.
-               e.g. divisors = <1 2 4 6>;
-- atmel,master-clk-have-div3-pres : some SoC use the reserved value 7 in the
-                                   PRES field as CLOCK_DIV3 (e.g sam9x5).
-
-For example:
-       mck: mck {
-               compatible = "atmel,at91rm9200-clk-master";
-               interrupt-parent = <&pmc>;
-               interrupts = <3>;
-               #clock-cells = <0>;
-               atmel,clk-output-range = <0 133000000>;
-               atmel,clk-divisors = <1 2 4 0>;
-       };
-
-Required properties for peripheral clocks:
-- #size-cells : shall be 0 (reg is used to encode clk id).
-- #address-cells : shall be 1 (reg is used to encode clk id).
-- clocks : shall be the master clock phandle.
-       e.g. clocks = <&mck>;
-- name: device tree node describing a specific peripheral clock.
-       * #clock-cells : from common clock binding; shall be set to 0.
-       * reg: peripheral id. See Atmel's datasheets to get a full
-         list of peripheral ids.
-       * atmel,clk-output-range : minimum and maximum clock frequency
-         (two u32 fields). Only valid on at91sam9x5-clk-peripheral
-         compatible IPs.
-
-For example:
-       periph: periphck {
-               compatible = "atmel,at91sam9x5-clk-peripheral";
-               #size-cells = <0>;
-               #address-cells = <1>;
-               clocks = <&mck>;
-
-               ssc0_clk {
-                       #clock-cells = <0>;
-                       reg = <2>;
-                       atmel,clk-output-range = <0 133000000>;
-               };
-
-               usart0_clk {
-                       #clock-cells = <0>;
-                       reg = <3>;
-                       atmel,clk-output-range = <0 66000000>;
-               };
-       };
-
-
-Required properties for pll clocks:
-- interrupts : shall be set to "<1>".
-- #clock-cells : from common clock binding; shall be set to 0.
-- clocks : shall be the main clock phandle.
-- reg : pll id.
-       0 -> PLL A
-       1 -> PLL B
-- atmel,clk-input-range : minimum and maximum source clock frequency (two u32
-                         fields).
-         e.g. input = <1 32000000>; <=> 1 to 32MHz.
-- #atmel,pll-clk-output-range-cells : number of cells reserved for pll output
-                                     range description. Sould be set to 2, 3
-                                     or 4.
-       * 1st and 2nd cells represent the frequency range (min-max).
-       * 3rd cell is optional and represents the OUT field value for the given
-         range.
-       * 4th cell is optional and represents the ICPLL field (PLLICPR
-         register)
-- atmel,pll-clk-output-ranges : pll output frequency ranges + optional parameter
-                               depending on #atmel,pll-output-range-cells
-                               property value.
-
-For example:
-       plla: pllack {
-               compatible = "atmel,at91sam9g45-clk-pll";
-               interrupt-parent = <&pmc>;
-               interrupts = <1>;
-               #clock-cells = <0>;
-               clocks = <&main>;
-               reg = <0>;
-               atmel,clk-input-range = <2000000 32000000>;
-               #atmel,pll-clk-output-range-cells = <4>;
-               atmel,pll-clk-output-ranges = <74500000 800000000 0 0
-                                              69500000 750000000 1 0
-                                              64500000 700000000 2 0
-                                              59500000 650000000 3 0
-                                              54500000 600000000 0 1
-                                              49500000 550000000 1 1
-                                              44500000 500000000 2 1
-                                              40000000 450000000 3 1>;
-       };
-
-Required properties for plldiv clocks (plldiv = pll / 2):
-- #clock-cells : from common clock binding; shall be set to 0.
-- clocks : shall be the plla clock phandle.
-
-The pll divisor is equal to 2 and cannot be changed.
-
-For example:
-       plladiv: plladivck {
-               compatible = "atmel,at91sam9x5-clk-plldiv";
-               #clock-cells = <0>;
-               clocks = <&plla>;
-       };
-
-Required properties for programmable clocks:
-- #size-cells : shall be 0 (reg is used to encode clk id).
-- #address-cells : shall be 1 (reg is used to encode clk id).
-- clocks : shall be the programmable clock source phandles.
-       e.g. clocks = <&clk32k>, <&main>, <&plla>, <&pllb>;
-- name: device tree node describing a specific prog clock.
-       * #clock-cells : from common clock binding; shall be set to 0.
-       * reg : programmable clock id (register offset from  PCKx
-                        register).
-       * interrupts : shall be set to "<(8 + id)>".
-
-For example:
-       prog: progck {
-               compatible = "atmel,at91sam9g45-clk-programmable";
-               #size-cells = <0>;
-               #address-cells = <1>;
-               interrupt-parent = <&pmc>;
-               clocks = <&clk32k>, <&main>, <&plladiv>, <&utmi>, <&mck>;
-
-               prog0 {
-                       #clock-cells = <0>;
-                       reg = <0>;
-                       interrupts = <8>;
-               };
-
-               prog1 {
-                       #clock-cells = <0>;
-                       reg = <1>;
-                       interrupts = <9>;
-               };
-       };
-
-
-Required properties for smd clock:
-- #clock-cells : from common clock binding; shall be set to 0.
-- clocks : shall be the smd clock source phandles.
-       e.g. clocks = <&plladiv>, <&utmi>;
-
-For example:
-       smd: smdck {
-               compatible = "atmel,at91sam9x5-clk-smd";
-               #clock-cells = <0>;
-               clocks = <&plladiv>, <&utmi>;
-       };
-
-Required properties for system clocks:
-- #size-cells : shall be 0 (reg is used to encode clk id).
-- #address-cells : shall be 1 (reg is used to encode clk id).
-- name: device tree node describing a specific system clock.
-       * #clock-cells : from common clock binding; shall be set to 0.
-       * reg: system clock id (bit position in SCER/SCDR/SCSR registers).
-             See Atmel's datasheet to get a full list of system clock ids.
-
-For example:
-       system: systemck {
-               compatible = "atmel,at91rm9200-clk-system";
-               #address-cells = <1>;
-               #size-cells = <0>;
-
-               ddrck {
-                       #clock-cells = <0>;
-                       reg = <2>;
-                       clocks = <&mck>;
-               };
-
-               uhpck {
-                       #clock-cells = <0>;
-                       reg = <6>;
-                       clocks = <&usb>;
-               };
-
-               udpck {
-                       #clock-cells = <0>;
-                       reg = <7>;
-                       clocks = <&usb>;
-               };
-       };
-
-
-Required properties for usb clock:
-- #clock-cells : from common clock binding; shall be set to 0.
-- clocks : shall be the smd clock source phandles.
-       e.g. clocks = <&pllb>;
-- atmel,clk-divisors (only available for "atmel,at91rm9200-clk-usb"):
-       usb clock divisor table.
-       e.g. divisors = <1 2 4 0>;
-
-For example:
-       usb: usbck {
-               compatible = "atmel,at91sam9x5-clk-usb";
-               #clock-cells = <0>;
-               clocks = <&plladiv>, <&utmi>;
-       };
-
-       usb: usbck {
-               compatible = "atmel,at91rm9200-clk-usb";
-               #clock-cells = <0>;
-               clocks = <&pllb>;
-               atmel,clk-divisors = <1 2 4 0>;
-       };
-
-
-Required properties for utmi clock:
-- interrupts : shall be set to "<AT91_PMC_LOCKU IRQ_TYPE_LEVEL_HIGH>".
-- #clock-cells : from common clock binding; shall be set to 0.
-- clocks : shall be the main clock source phandle.
-
-For example:
-       utmi: utmick {
-               compatible = "atmel,at91sam9x5-clk-utmi";
-               interrupt-parent = <&pmc>;
-               interrupts = <AT91_PMC_LOCKU IRQ_TYPE_LEVEL_HIGH>;
-               #clock-cells = <0>;
-               clocks = <&main>;
-       };
-
-Required properties for 32 bits bus Matrix clock (h32mx clock):
-- #clock-cells : from common clock binding; shall be set to 0.
-- clocks : shall be the master clock source phandle.
-
-For example:
-       h32ck: h32mxck {
-               #clock-cells = <0>;
-               compatible = "atmel,sama5d4-clk-h32mx";
-               clocks = <&mck>;
-       };
-
-Required properties for generated clocks:
-- #size-cells : shall be 0 (reg is used to encode clk id).
-- #address-cells : shall be 1 (reg is used to encode clk id).
-- clocks : shall be the generated clock source phandles.
-       e.g. clocks = <&clk32k>, <&main>, <&plladiv>, <&utmi>, <&mck>, <&audio_pll_pmc>;
-- name: device tree node describing a specific generated clock.
-       * #clock-cells : from common clock binding; shall be set to 0.
-       * reg: peripheral id. See Atmel's datasheets to get a full
-         list of peripheral ids.
-       * atmel,clk-output-range : minimum and maximum clock frequency
-         (two u32 fields).
-
-For example:
-       gck {
-               compatible = "atmel,sama5d2-clk-generated";
-               #address-cells = <1>;
-               #size-cells = <0>;
-               clocks = <&clk32k>, <&main>, <&plladiv>, <&utmi>, <&mck>, <&audio_pll_pmc>;
-
-               tcb0_gclk: tcb0_gclk {
-                       #clock-cells = <0>;
-                       reg = <35>;
-                       atmel,clk-output-range = <0 83000000>;
-               };
-
-               pwm_gclk: pwm_gclk {
-                       #clock-cells = <0>;
-                       reg = <38>;
-                       atmel,clk-output-range = <0 83000000>;
-               };
-       };
-
-Required properties for I2S mux clocks:
-- #size-cells : shall be 0 (reg is used to encode I2S bus id).
-- #address-cells : shall be 1 (reg is used to encode I2S bus id).
-- name: device tree node describing a specific mux clock.
-       * #clock-cells : from common clock binding; shall be set to 0.
-       * clocks : shall be the mux clock parent phandles; shall be 2 phandles:
-         peripheral and generated clock; the first phandle shall belong to the
-         peripheral clock and the second one shall belong to the generated
-         clock; "clock-indices" property can be user to specify
-         the correct order.
-       * reg: I2S bus id of the corresponding mux clock.
-         e.g. reg = <0>; for i2s0, reg = <1>; for i2s1
-
-For example:
-       i2s_clkmux {
-               compatible = "atmel,sama5d2-clk-i2s-mux";
-               #address-cells = <1>;
-               #size-cells = <0>;
-
-               i2s0muxck: i2s0_muxclk {
-                       clocks = <&i2s0_clk>, <&i2s0_gclk>;
-                       #clock-cells = <0>;
-                       reg = <0>;
-               };
-
-               i2s1muxck: i2s1_muxclk {
-                       clocks = <&i2s1_clk>, <&i2s1_gclk>;
-                       #clock-cells = <0>;
-                       reg = <1>;
-               };
+       pmc: pmc@f0018000 {
+               compatible = "atmel,sama5d4-pmc", "syscon";
+               reg = <0xf0018000 0x120>;
+               interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
+               #clock-cells = <2>;
+               clocks = <&clk32k>, <&main_xtal>;
+               clock-names = "slow_clk", "main_xtal";
        };
diff --git a/Documentation/devicetree/bindings/clock/hi3670-clock.txt b/Documentation/devicetree/bindings/clock/hi3670-clock.txt
new file mode 100644 (file)
index 0000000..66f3697
--- /dev/null
@@ -0,0 +1,43 @@
+* Hisilicon Hi3670 Clock Controller
+
+The Hi3670 clock controller generates and supplies clock to various
+controllers within the Hi3670 SoC.
+
+Required Properties:
+
+- compatible: the compatible should be one of the following strings to
+       indicate the clock controller functionality.
+
+       - "hisilicon,hi3670-crgctrl"
+       - "hisilicon,hi3670-pctrl"
+       - "hisilicon,hi3670-pmuctrl"
+       - "hisilicon,hi3670-sctrl"
+       - "hisilicon,hi3670-iomcu"
+       - "hisilicon,hi3670-media1-crg"
+       - "hisilicon,hi3670-media2-crg"
+
+- reg: physical base address of the controller and length of memory mapped
+  region.
+
+- #clock-cells: should be 1.
+
+Each clock is assigned an identifier and client nodes use this identifier
+to specify the clock which they consume.
+
+All these identifier could be found in <dt-bindings/clock/hi3670-clock.h>.
+
+Examples:
+       crg_ctrl: clock-controller@fff35000 {
+               compatible = "hisilicon,hi3670-crgctrl", "syscon";
+               reg = <0x0 0xfff35000 0x0 0x1000>;
+               #clock-cells = <1>;
+       };
+
+       uart0: serial@fdf02000 {
+               compatible = "arm,pl011", "arm,primecell";
+               reg = <0x0 0xfdf02000 0x0 0x1000>;
+               interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&crg_ctrl HI3670_CLK_GATE_UART0>,
+                        <&crg_ctrl HI3670_PCLK>;
+               clock-names = "uartclk", "apb_pclk";
+       };
index f8d4134ae4095682182be5313148ddb2394ec017..ba5a442026b71d65e7bda99bd801ec35bc5fed57 100644 (file)
@@ -6,8 +6,11 @@ to provide many different clock signals derived from only 2 external source
 clocks.
 
 Required properties:
-- compatible : Should be "ingenic,<soctype>-cgu".
-  For example "ingenic,jz4740-cgu" or "ingenic,jz4780-cgu".
+- compatible : Should be one of:
+  * ingenic,jz4740-cgu
+  * ingenic,jz4725b-cgu
+  * ingenic,jz4770-cgu
+  * ingenic,jz4780-cgu
 - reg : The address & length of the CGU registers.
 - clocks : List of phandle & clock specifiers for clocks external to the CGU.
   Two such external clocks should be specified - first the external crystal
diff --git a/Documentation/devicetree/bindings/clock/qcom,camcc.txt b/Documentation/devicetree/bindings/clock/qcom,camcc.txt
new file mode 100644 (file)
index 0000000..c5eb669
--- /dev/null
@@ -0,0 +1,18 @@
+Qualcomm Camera Clock & Reset Controller Binding
+------------------------------------------------
+
+Required properties :
+- compatible : shall contain "qcom,sdm845-camcc".
+- reg : shall contain base register location and length.
+- #clock-cells : from common clock binding, shall contain 1.
+- #reset-cells : from common reset binding, shall contain 1.
+- #power-domain-cells : from generic power domain binding, shall contain 1.
+
+Example:
+       camcc: clock-controller@ad00000 {
+               compatible = "qcom,sdm845-camcc";
+               reg = <0xad00000 0x10000>;
+               #clock-cells = <1>;
+               #reset-cells = <1>;
+               #power-domain-cells = <1>;
+       };
index 664ea1fd6c76a18ce158b4fc01b536ba31dfeeda..52d9345c9927b80c40acba737f20f83f4fcbc8e7 100644 (file)
@@ -19,6 +19,9 @@ Required properties :
                        "qcom,gcc-msm8996"
                        "qcom,gcc-msm8998"
                        "qcom,gcc-mdm9615"
+                       "qcom,gcc-qcs404"
+                       "qcom,gcc-sdm630"
+                       "qcom,gcc-sdm660"
                        "qcom,gcc-sdm845"
 
 - reg : shall contain base register location and length
diff --git a/Documentation/devicetree/bindings/clock/qcom,hfpll.txt b/Documentation/devicetree/bindings/clock/qcom,hfpll.txt
new file mode 100644 (file)
index 0000000..ec02a02
--- /dev/null
@@ -0,0 +1,60 @@
+High-Frequency PLL (HFPLL)
+
+PROPERTIES
+
+- compatible:
+       Usage: required
+       Value type: <string>:
+               shall contain only one of the following. The generic
+               compatible "qcom,hfpll" should be also included.
+
+                        "qcom,hfpll-ipq8064", "qcom,hfpll"
+                        "qcom,hfpll-apq8064", "qcom,hfpll"
+                        "qcom,hfpll-msm8974", "qcom,hfpll"
+                        "qcom,hfpll-msm8960", "qcom,hfpll"
+
+- reg:
+       Usage: required
+       Value type: <prop-encoded-array>
+       Definition: address and size of HPLL registers. An optional second
+                   element specifies the address and size of the alias
+                   register region.
+
+- clocks:
+       Usage: required
+       Value type: <prop-encoded-array>
+       Definition: reference to the xo clock.
+
+- clock-names:
+       Usage: required
+       Value type: <stringlist>
+       Definition: must be "xo".
+
+- clock-output-names:
+       Usage: required
+       Value type: <string>
+       Definition: Name of the PLL. Typically hfpllX where X is a CPU number
+                   starting at 0. Otherwise hfpll_Y where Y is more specific
+                   such as "l2".
+
+Example:
+
+1) An HFPLL for the L2 cache.
+
+       clock-controller@f9016000 {
+               compatible = "qcom,hfpll-ipq8064", "qcom,hfpll";
+               reg = <0xf9016000 0x30>;
+               clocks = <&xo_board>;
+               clock-names = "xo";
+               clock-output-names = "hfpll_l2";
+       };
+
+2) An HFPLL for CPU0. This HFPLL has the alias register region.
+
+       clock-controller@f908a000 {
+               compatible = "qcom,hfpll-ipq8064", "qcom,hfpll";
+               reg = <0xf908a000 0x30>, <0xf900a000 0x30>;
+               clocks = <&xo_board>;
+               clock-names = "xo";
+               clock-output-names = "hfpll0";
+       };
diff --git a/Documentation/devicetree/bindings/clock/qcom,krait-cc.txt b/Documentation/devicetree/bindings/clock/qcom,krait-cc.txt
new file mode 100644 (file)
index 0000000..030ba60
--- /dev/null
@@ -0,0 +1,34 @@
+Krait Clock Controller
+
+PROPERTIES
+
+- compatible:
+       Usage: required
+       Value type: <string>
+       Definition: must be one of:
+                       "qcom,krait-cc-v1"
+                       "qcom,krait-cc-v2"
+
+- #clock-cells:
+       Usage: required
+       Value type: <u32>
+       Definition: must be 1
+
+- clocks:
+       Usage: required
+       Value type: <prop-encoded-array>
+       Definition: reference to the clock parents of hfpll, secondary muxes.
+
+- clock-names:
+       Usage: required
+       Value type: <stringlist>
+       Definition: must be "hfpll0", "hfpll1", "acpu0_aux", "acpu1_aux", "qsb".
+
+Example:
+
+       kraitcc: clock-controller {
+               compatible = "qcom,krait-cc-v1";
+               clocks = <&hfpll0>, <&hfpll1>, <&acpu0_aux>, <&acpu1_aux>, <qsb>;
+               clock-names = "hfpll0", "hfpll1", "acpu0_aux", "acpu1_aux", "qsb";
+               #clock-cells = <1>;
+       };
index db542abadb75bf0ca395ac0910506bce458fecee..916a601b76a7704931df7797e48f52276e4fd674 100644 (file)
@@ -13,9 +13,13 @@ They provide the following functionalities:
 
 Required Properties:
   - compatible: Must be one of:
+      - "renesas,r7s9210-cpg-mssr" for the r7s9210 SoC (RZ/A2)
       - "renesas,r8a7743-cpg-mssr" for the r8a7743 SoC (RZ/G1M)
+      - "renesas,r8a7744-cpg-mssr" for the r8a7744 SoC (RZ/G1N)
       - "renesas,r8a7745-cpg-mssr" for the r8a7745 SoC (RZ/G1E)
       - "renesas,r8a77470-cpg-mssr" for the r8a77470 SoC (RZ/G1C)
+      - "renesas,r8a774a1-cpg-mssr" for the r8a774a1 SoC (RZ/G2M)
+      - "renesas,r8a774c0-cpg-mssr" for the r8a774c0 SoC (RZ/G2E)
       - "renesas,r8a7790-cpg-mssr" for the r8a7790 SoC (R-Car H2)
       - "renesas,r8a7791-cpg-mssr" for the r8a7791 SoC (R-Car M2-W)
       - "renesas,r8a7792-cpg-mssr" for the r8a7792 SoC (R-Car V2H)
@@ -35,12 +39,13 @@ Required Properties:
   - clocks: References to external parent clocks, one entry for each entry in
     clock-names
   - clock-names: List of external parent clock names. Valid names are:
-      - "extal" (r8a7743, r8a7745, r8a77470, r8a7790, r8a7791, r8a7792,
-                r8a7793, r8a7794, r8a7795, r8a7796, r8a77965, r8a77970,
-                r8a77980, r8a77990, r8a77995)
-      - "extalr" (r8a7795, r8a7796, r8a77965, r8a77970, r8a77980)
-      - "usb_extal" (r8a7743, r8a7745, r8a77470, r8a7790, r8a7791, r8a7793,
-                    r8a7794)
+      - "extal" (r7s9210, r8a7743, r8a7744, r8a7745, r8a77470, r8a774a1,
+                r8a774c0, r8a7790, r8a7791, r8a7792, r8a7793, r8a7794,
+                r8a7795, r8a7796, r8a77965, r8a77970, r8a77980, r8a77990,
+                r8a77995)
+      - "extalr" (r8a774a1, r8a7795, r8a7796, r8a77965, r8a77970, r8a77980)
+      - "usb_extal" (r8a7743, r8a7744, r8a7745, r8a77470, r8a7790, r8a7791,
+                    r8a7793, r8a7794)
 
   - #clock-cells: Must be 2
       - For CPG core clocks, the two clock specifier cells must be "CPG_CORE"
index e5ad0708849a2f57d14d6e1f8141f6469d44aeeb..c8e198631d4182511d1bb3dee008ceae4c01f4d2 100644 (file)
@@ -7,6 +7,9 @@ config DMABOUNCE
        bool
        select ZONE_DMA
 
+config KRAIT_L2_ACCESSORS
+       bool
+
 config SHARP_LOCOMO
        bool
 
index 3157be413297e5d22ad3174e2082b5199fc3083c..219a260bbe5f78abec23091e7ad07a7b1e992624 100644 (file)
@@ -7,6 +7,7 @@ obj-y                           += firmware.o
 
 obj-$(CONFIG_SA1111)           += sa1111.o
 obj-$(CONFIG_DMABOUNCE)                += dmabounce.o
+obj-$(CONFIG_KRAIT_L2_ACCESSORS) += krait-l2-accessors.o
 obj-$(CONFIG_SHARP_LOCOMO)     += locomo.o
 obj-$(CONFIG_SHARP_PARAM)      += sharpsl_param.o
 obj-$(CONFIG_SHARP_SCOOP)      += scoop.o
diff --git a/arch/arm/common/krait-l2-accessors.c b/arch/arm/common/krait-l2-accessors.c
new file mode 100644 (file)
index 0000000..9a97dda
--- /dev/null
@@ -0,0 +1,48 @@
+// SPDX-License-Identifier: GPL-2.0
+// Copyright (c) 2018, The Linux Foundation. All rights reserved.
+
+#include <linux/spinlock.h>
+#include <linux/export.h>
+
+#include <asm/barrier.h>
+#include <asm/krait-l2-accessors.h>
+
+static DEFINE_RAW_SPINLOCK(krait_l2_lock);
+
+void krait_set_l2_indirect_reg(u32 addr, u32 val)
+{
+       unsigned long flags;
+
+       raw_spin_lock_irqsave(&krait_l2_lock, flags);
+       /*
+        * Select the L2 window by poking l2cpselr, then write to the window
+        * via l2cpdr.
+        */
+       asm volatile ("mcr p15, 3, %0, c15, c0, 6 @ l2cpselr" : : "r" (addr));
+       isb();
+       asm volatile ("mcr p15, 3, %0, c15, c0, 7 @ l2cpdr" : : "r" (val));
+       isb();
+
+       raw_spin_unlock_irqrestore(&krait_l2_lock, flags);
+}
+EXPORT_SYMBOL(krait_set_l2_indirect_reg);
+
+u32 krait_get_l2_indirect_reg(u32 addr)
+{
+       u32 val;
+       unsigned long flags;
+
+       raw_spin_lock_irqsave(&krait_l2_lock, flags);
+       /*
+        * Select the L2 window by poking l2cpselr, then read from the window
+        * via l2cpdr.
+        */
+       asm volatile ("mcr p15, 3, %0, c15, c0, 6 @ l2cpselr" : : "r" (addr));
+       isb();
+       asm volatile ("mrc p15, 3, %0, c15, c0, 7 @ l2cpdr" : "=r" (val));
+
+       raw_spin_unlock_irqrestore(&krait_l2_lock, flags);
+
+       return val;
+}
+EXPORT_SYMBOL(krait_get_l2_indirect_reg);
diff --git a/arch/arm/include/asm/krait-l2-accessors.h b/arch/arm/include/asm/krait-l2-accessors.h
new file mode 100644 (file)
index 0000000..a5f2cdd
--- /dev/null
@@ -0,0 +1,9 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef __ASMARM_KRAIT_L2_ACCESSORS_H
+#define __ASMARM_KRAIT_L2_ACCESSORS_H
+
+extern void krait_set_l2_indirect_reg(u32 addr, u32 val);
+extern u32 krait_get_l2_indirect_reg(u32 addr);
+
+#endif
diff --git a/arch/arm/mach-davinci/include/mach/clock.h b/arch/arm/mach-davinci/include/mach/clock.h
deleted file mode 100644 (file)
index 42ed4f2..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * arch/arm/mach-davinci/include/mach/clock.h
- *
- * Clock control driver for DaVinci - header file
- *
- * Authors: Vladimir Barinov <source@mvista.com>
- *
- * 2007 (c) MontaVista Software, Inc. This file is licensed under
- * the terms of the GNU General Public License version 2. This program
- * is licensed "as is" without any warranty of any kind, whether express
- * or implied.
- */
-#ifndef __ASM_ARCH_DAVINCI_CLOCK_H
-#define __ASM_ARCH_DAVINCI_CLOCK_H
-
-struct clk;
-
-int davinci_clk_reset_assert(struct clk *c);
-int davinci_clk_reset_deassert(struct clk *c);
-
-#endif
index 292056bbb30e91a39d6e0f2d27b41e4f0e907c8c..cd9b1d0cb23b5fd80f629fc34f9769df929ee5a5 100644 (file)
@@ -287,6 +287,7 @@ source "drivers/clk/actions/Kconfig"
 source "drivers/clk/bcm/Kconfig"
 source "drivers/clk/hisilicon/Kconfig"
 source "drivers/clk/imgtec/Kconfig"
+source "drivers/clk/ingenic/Kconfig"
 source "drivers/clk/keystone/Kconfig"
 source "drivers/clk/mediatek/Kconfig"
 source "drivers/clk/meson/Kconfig"
index a84c5573cabeae1ede83c2e597e8d310bc98d307..b49d54fc05997ee1bf41ca01a45c00a8c7956cae 100644 (file)
@@ -72,7 +72,8 @@ obj-$(CONFIG_H8300)                   += h8300/
 obj-$(CONFIG_ARCH_HISI)                        += hisilicon/
 obj-y                                  += imgtec/
 obj-$(CONFIG_ARCH_MXC)                 += imx/
-obj-$(CONFIG_MACH_INGENIC)             += ingenic/
+obj-y                                  += ingenic/
+obj-$(CONFIG_ARCH_K3)                  += keystone/
 obj-$(CONFIG_ARCH_KEYSTONE)            += keystone/
 obj-$(CONFIG_MACH_LOONGSON32)          += loongson1/
 obj-y                                  += mediatek/
index dc38c85a48339cb49325029b4ac2a1f9b9268bbe..04f0a6355726f0503cfd0c4f84747b02a7d06089 100644 (file)
@@ -2,6 +2,7 @@ config CLK_ACTIONS
        bool "Clock driver for Actions Semi SoCs"
        depends on ARCH_ACTIONS || COMPILE_TEST
        select REGMAP_MMIO
+       select RESET_CONTROLLER
        default ARCH_ACTIONS
 
 if CLK_ACTIONS
index 78c17d56f9913c80c778a649ee4ae9b023b6327e..ccfdf9781ceffd65be8a45a12b6321afe9a60e14 100644 (file)
@@ -7,6 +7,7 @@ clk-owl-y                       += owl-divider.o
 clk-owl-y                      += owl-factor.o
 clk-owl-y                      += owl-composite.o
 clk-owl-y                      += owl-pll.o
+clk-owl-y                      += owl-reset.o
 
 # SoC support
 obj-$(CONFIG_CLK_OWL_S700)     += owl-s700.o
index 61c1071b5180a8168cff7382e31f1d81ee536b49..32dd29e0a37e18ea2e160816e618fe58403db097 100644 (file)
@@ -39,7 +39,7 @@ static void owl_clk_set_regmap(const struct owl_clk_desc *desc,
 }
 
 int owl_clk_regmap_init(struct platform_device *pdev,
-                        const struct owl_clk_desc *desc)
+                       struct owl_clk_desc *desc)
 {
        void __iomem *base;
        struct regmap *regmap;
@@ -57,6 +57,7 @@ int owl_clk_regmap_init(struct platform_device *pdev,
        }
 
        owl_clk_set_regmap(desc, regmap);
+       desc->regmap = regmap;
 
        return 0;
 }
index 4fd726ec54a6c1f2e8a48ad8c38d59514aed5393..5a866a8b913dbca3b6f07389ecb540fa039ecdfc 100644 (file)
@@ -26,6 +26,9 @@ struct owl_clk_desc {
        struct owl_clk_common           **clks;
        unsigned long                   num_clks;
        struct clk_hw_onecell_data      *hw_clks;
+       const struct owl_reset_map      *resets;
+       unsigned long                   num_resets;
+       struct regmap                   *regmap;
 };
 
 static inline struct owl_clk_common *
@@ -35,7 +38,7 @@ static inline struct owl_clk_common *
 }
 
 int owl_clk_regmap_init(struct platform_device *pdev,
-                        const struct owl_clk_desc *desc);
+                       struct owl_clk_desc *desc);
 int owl_clk_probe(struct device *dev, struct clk_hw_onecell_data *hw_clks);
 
 #endif /* _OWL_COMMON_H_ */
diff --git a/drivers/clk/actions/owl-reset.c b/drivers/clk/actions/owl-reset.c
new file mode 100644 (file)
index 0000000..203f8f3
--- /dev/null
@@ -0,0 +1,66 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+//
+// Actions Semi Owl SoCs Reset Management Unit driver
+//
+// Copyright (c) 2018 Linaro Ltd.
+// Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
+
+#include <linux/delay.h>
+#include <linux/regmap.h>
+#include <linux/reset-controller.h>
+
+#include "owl-reset.h"
+
+static int owl_reset_assert(struct reset_controller_dev *rcdev,
+                           unsigned long id)
+{
+       struct owl_reset *reset = to_owl_reset(rcdev);
+       const struct owl_reset_map *map = &reset->reset_map[id];
+
+       return regmap_update_bits(reset->regmap, map->reg, map->bit, 0);
+}
+
+static int owl_reset_deassert(struct reset_controller_dev *rcdev,
+                             unsigned long id)
+{
+       struct owl_reset *reset = to_owl_reset(rcdev);
+       const struct owl_reset_map *map = &reset->reset_map[id];
+
+       return regmap_update_bits(reset->regmap, map->reg, map->bit, map->bit);
+}
+
+static int owl_reset_reset(struct reset_controller_dev *rcdev,
+                          unsigned long id)
+{
+       owl_reset_assert(rcdev, id);
+       udelay(1);
+       owl_reset_deassert(rcdev, id);
+
+       return 0;
+}
+
+static int owl_reset_status(struct reset_controller_dev *rcdev,
+                           unsigned long id)
+{
+       struct owl_reset *reset = to_owl_reset(rcdev);
+       const struct owl_reset_map *map = &reset->reset_map[id];
+       u32 reg;
+       int ret;
+
+       ret = regmap_read(reset->regmap, map->reg, &reg);
+       if (ret)
+               return ret;
+
+       /*
+        * The reset control API expects 0 if reset is not asserted,
+        * which is the opposite of what our hardware uses.
+        */
+       return !(map->bit & reg);
+}
+
+const struct reset_control_ops owl_reset_ops = {
+       .assert         = owl_reset_assert,
+       .deassert       = owl_reset_deassert,
+       .reset          = owl_reset_reset,
+       .status         = owl_reset_status,
+};
diff --git a/drivers/clk/actions/owl-reset.h b/drivers/clk/actions/owl-reset.h
new file mode 100644 (file)
index 0000000..10f5774
--- /dev/null
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+//
+// Actions Semi Owl SoCs Reset Management Unit driver
+//
+// Copyright (c) 2018 Linaro Ltd.
+// Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
+
+#ifndef _OWL_RESET_H_
+#define _OWL_RESET_H_
+
+#include <linux/reset-controller.h>
+
+struct owl_reset_map {
+       u32     reg;
+       u32     bit;
+};
+
+struct owl_reset {
+       struct reset_controller_dev     rcdev;
+       const struct owl_reset_map      *reset_map;
+       struct regmap                   *regmap;
+};
+
+static inline struct owl_reset *to_owl_reset(struct reset_controller_dev *rcdev)
+{
+       return container_of(rcdev, struct owl_reset, rcdev);
+}
+
+extern const struct reset_control_ops owl_reset_ops;
+
+#endif /* _OWL_RESET_H_ */
index 5e9531392ee57cb03a2bb22dbb5e91ac058d7e20..a2f34d13fb54304357eed076ceb11e31863e76d2 100644 (file)
 #include "owl-gate.h"
 #include "owl-mux.h"
 #include "owl-pll.h"
+#include "owl-reset.h"
 
 #include <dt-bindings/clock/actions,s700-cmu.h>
+#include <dt-bindings/reset/actions,s700-reset.h>
 
 #define CMU_COREPLL            (0x0000)
 #define CMU_DEVPLL             (0x0004)
@@ -569,20 +571,69 @@ static struct clk_hw_onecell_data s700_hw_clks = {
                .num    = CLK_NR_CLKS,
 };
 
-static const struct owl_clk_desc s700_clk_desc = {
+static const struct owl_reset_map s700_resets[] = {
+       [RESET_DE]      = { CMU_DEVRST0, BIT(0) },
+       [RESET_LCD0]    = { CMU_DEVRST0, BIT(1) },
+       [RESET_DSI]     = { CMU_DEVRST0, BIT(2) },
+       [RESET_CSI]     = { CMU_DEVRST0, BIT(13) },
+       [RESET_SI]      = { CMU_DEVRST0, BIT(14) },
+       [RESET_I2C0]    = { CMU_DEVRST1, BIT(0) },
+       [RESET_I2C1]    = { CMU_DEVRST1, BIT(1) },
+       [RESET_I2C2]    = { CMU_DEVRST1, BIT(2) },
+       [RESET_I2C3]    = { CMU_DEVRST1, BIT(3) },
+       [RESET_SPI0]    = { CMU_DEVRST1, BIT(4) },
+       [RESET_SPI1]    = { CMU_DEVRST1, BIT(5) },
+       [RESET_SPI2]    = { CMU_DEVRST1, BIT(6) },
+       [RESET_SPI3]    = { CMU_DEVRST1, BIT(7) },
+       [RESET_UART0]   = { CMU_DEVRST1, BIT(8) },
+       [RESET_UART1]   = { CMU_DEVRST1, BIT(9) },
+       [RESET_UART2]   = { CMU_DEVRST1, BIT(10) },
+       [RESET_UART3]   = { CMU_DEVRST1, BIT(11) },
+       [RESET_UART4]   = { CMU_DEVRST1, BIT(12) },
+       [RESET_UART5]   = { CMU_DEVRST1, BIT(13) },
+       [RESET_UART6]   = { CMU_DEVRST1, BIT(14) },
+       [RESET_KEY]     = { CMU_DEVRST1, BIT(24) },
+       [RESET_GPIO]    = { CMU_DEVRST1, BIT(25) },
+       [RESET_AUDIO]   = { CMU_DEVRST1, BIT(29) },
+};
+
+static struct owl_clk_desc s700_clk_desc = {
        .clks       = s700_clks,
        .num_clks   = ARRAY_SIZE(s700_clks),
 
        .hw_clks    = &s700_hw_clks,
+
+       .resets     = s700_resets,
+       .num_resets = ARRAY_SIZE(s700_resets),
 };
 
 static int s700_clk_probe(struct platform_device *pdev)
 {
-       const struct owl_clk_desc *desc;
+       struct owl_clk_desc *desc;
+       struct owl_reset *reset;
+       int ret;
 
        desc = &s700_clk_desc;
        owl_clk_regmap_init(pdev, desc);
 
+       /*
+        * FIXME: Reset controller registration should be moved to
+        * common code, once all SoCs of Owl family supports it.
+        */
+       reset = devm_kzalloc(&pdev->dev, sizeof(*reset), GFP_KERNEL);
+       if (!reset)
+               return -ENOMEM;
+
+       reset->rcdev.of_node = pdev->dev.of_node;
+       reset->rcdev.ops = &owl_reset_ops;
+       reset->rcdev.nr_resets = desc->num_resets;
+       reset->reset_map = desc->resets;
+       reset->regmap = desc->regmap;
+
+       ret = devm_reset_controller_register(&pdev->dev, &reset->rcdev);
+       if (ret)
+               dev_err(&pdev->dev, "Failed to register reset controller\n");
+
        return owl_clk_probe(&pdev->dev, desc->hw_clks);
 }
 
index 7f60ed6afe639e159c5bf771bfe5cbfccd0e669b..790890978424a241c8229c7592c2843b1fdb694d 100644 (file)
 #include "owl-gate.h"
 #include "owl-mux.h"
 #include "owl-pll.h"
+#include "owl-reset.h"
 
 #include <dt-bindings/clock/actions,s900-cmu.h>
+#include <dt-bindings/reset/actions,s900-reset.h>
 
 #define CMU_COREPLL            (0x0000)
 #define CMU_DEVPLL             (0x0004)
@@ -684,20 +686,100 @@ static struct clk_hw_onecell_data s900_hw_clks = {
        .num    = CLK_NR_CLKS,
 };
 
-static const struct owl_clk_desc s900_clk_desc = {
+static const struct owl_reset_map s900_resets[] = {
+       [RESET_DMAC]            = { CMU_DEVRST0, BIT(0) },
+       [RESET_SRAMI]           = { CMU_DEVRST0, BIT(1) },
+       [RESET_DDR_CTL_PHY]     = { CMU_DEVRST0, BIT(2) },
+       [RESET_NANDC0]          = { CMU_DEVRST0, BIT(3) },
+       [RESET_SD0]             = { CMU_DEVRST0, BIT(4) },
+       [RESET_SD1]             = { CMU_DEVRST0, BIT(5) },
+       [RESET_PCM1]            = { CMU_DEVRST0, BIT(6) },
+       [RESET_DE]              = { CMU_DEVRST0, BIT(7) },
+       [RESET_LVDS]            = { CMU_DEVRST0, BIT(8) },
+       [RESET_SD2]             = { CMU_DEVRST0, BIT(9) },
+       [RESET_DSI]             = { CMU_DEVRST0, BIT(10) },
+       [RESET_CSI0]            = { CMU_DEVRST0, BIT(11) },
+       [RESET_BISP_AXI]        = { CMU_DEVRST0, BIT(12) },
+       [RESET_CSI1]            = { CMU_DEVRST0, BIT(13) },
+       [RESET_GPIO]            = { CMU_DEVRST0, BIT(15) },
+       [RESET_EDP]             = { CMU_DEVRST0, BIT(16) },
+       [RESET_AUDIO]           = { CMU_DEVRST0, BIT(17) },
+       [RESET_PCM0]            = { CMU_DEVRST0, BIT(18) },
+       [RESET_HDE]             = { CMU_DEVRST0, BIT(21) },
+       [RESET_GPU3D_PA]        = { CMU_DEVRST0, BIT(22) },
+       [RESET_IMX]             = { CMU_DEVRST0, BIT(23) },
+       [RESET_SE]              = { CMU_DEVRST0, BIT(24) },
+       [RESET_NANDC1]          = { CMU_DEVRST0, BIT(25) },
+       [RESET_SD3]             = { CMU_DEVRST0, BIT(26) },
+       [RESET_GIC]             = { CMU_DEVRST0, BIT(27) },
+       [RESET_GPU3D_PB]        = { CMU_DEVRST0, BIT(28) },
+       [RESET_DDR_CTL_PHY_AXI] = { CMU_DEVRST0, BIT(29) },
+       [RESET_CMU_DDR]         = { CMU_DEVRST0, BIT(30) },
+       [RESET_DMM]             = { CMU_DEVRST0, BIT(31) },
+       [RESET_USB2HUB]         = { CMU_DEVRST1, BIT(0) },
+       [RESET_USB2HSIC]        = { CMU_DEVRST1, BIT(1) },
+       [RESET_HDMI]            = { CMU_DEVRST1, BIT(2) },
+       [RESET_HDCP2TX]         = { CMU_DEVRST1, BIT(3) },
+       [RESET_UART6]           = { CMU_DEVRST1, BIT(4) },
+       [RESET_UART0]           = { CMU_DEVRST1, BIT(5) },
+       [RESET_UART1]           = { CMU_DEVRST1, BIT(6) },
+       [RESET_UART2]           = { CMU_DEVRST1, BIT(7) },
+       [RESET_SPI0]            = { CMU_DEVRST1, BIT(8) },
+       [RESET_SPI1]            = { CMU_DEVRST1, BIT(9) },
+       [RESET_SPI2]            = { CMU_DEVRST1, BIT(10) },
+       [RESET_SPI3]            = { CMU_DEVRST1, BIT(11) },
+       [RESET_I2C0]            = { CMU_DEVRST1, BIT(12) },
+       [RESET_I2C1]            = { CMU_DEVRST1, BIT(13) },
+       [RESET_USB3]            = { CMU_DEVRST1, BIT(14) },
+       [RESET_UART3]           = { CMU_DEVRST1, BIT(15) },
+       [RESET_UART4]           = { CMU_DEVRST1, BIT(16) },
+       [RESET_UART5]           = { CMU_DEVRST1, BIT(17) },
+       [RESET_I2C2]            = { CMU_DEVRST1, BIT(18) },
+       [RESET_I2C3]            = { CMU_DEVRST1, BIT(19) },
+       [RESET_ETHERNET]        = { CMU_DEVRST1, BIT(20) },
+       [RESET_CHIPID]          = { CMU_DEVRST1, BIT(21) },
+       [RESET_I2C4]            = { CMU_DEVRST1, BIT(22) },
+       [RESET_I2C5]            = { CMU_DEVRST1, BIT(23) },
+       [RESET_CPU_SCNT]        = { CMU_DEVRST1, BIT(30) }
+};
+
+static struct owl_clk_desc s900_clk_desc = {
        .clks       = s900_clks,
        .num_clks   = ARRAY_SIZE(s900_clks),
 
        .hw_clks    = &s900_hw_clks,
+
+       .resets     = s900_resets,
+       .num_resets = ARRAY_SIZE(s900_resets),
 };
 
 static int s900_clk_probe(struct platform_device *pdev)
 {
-       const struct owl_clk_desc *desc;
+       struct owl_clk_desc *desc;
+       struct owl_reset *reset;
+       int ret;
 
        desc = &s900_clk_desc;
        owl_clk_regmap_init(pdev, desc);
 
+       /*
+        * FIXME: Reset controller registration should be moved to
+        * common code, once all SoCs of Owl family supports it.
+        */
+       reset = devm_kzalloc(&pdev->dev, sizeof(*reset), GFP_KERNEL);
+       if (!reset)
+               return -ENOMEM;
+
+       reset->rcdev.of_node = pdev->dev.of_node;
+       reset->rcdev.ops = &owl_reset_ops;
+       reset->rcdev.nr_resets = desc->num_resets;
+       reset->reset_map = desc->resets;
+       reset->regmap = desc->regmap;
+
+       ret = devm_reset_controller_register(&pdev->dev, &reset->rcdev);
+       if (ret)
+               dev_err(&pdev->dev, "Failed to register reset controller\n");
+
        return owl_clk_probe(&pdev->dev, desc->hw_clks);
 }
 
index facc169ebb68a256366d93dd9c217549be0da5ad..c75df1cad60e646294a1f5e44871a8c82b2ff6e3 100644 (file)
@@ -3,7 +3,7 @@
 # Makefile for at91 specific clk
 #
 
-obj-y += pmc.o sckc.o
+obj-y += pmc.o sckc.o dt-compat.o
 obj-y += clk-slow.o clk-main.o clk-pll.o clk-plldiv.o clk-master.o
 obj-y += clk-system.o clk-peripheral.o clk-programmable.o
 
@@ -14,3 +14,6 @@ obj-$(CONFIG_HAVE_AT91_SMD)           += clk-smd.o
 obj-$(CONFIG_HAVE_AT91_H32MX)          += clk-h32mx.o
 obj-$(CONFIG_HAVE_AT91_GENERATED_CLK)  += clk-generated.o
 obj-$(CONFIG_HAVE_AT91_I2S_MUX_CLK)    += clk-i2s-mux.o
+obj-$(CONFIG_SOC_AT91SAM9) += at91sam9260.o at91sam9rl.o at91sam9x5.o
+obj-$(CONFIG_SOC_SAMA5D4) += sama5d4.o
+obj-$(CONFIG_SOC_SAMA5D2) += sama5d2.o
diff --git a/drivers/clk/at91/at91sam9260.c b/drivers/clk/at91/at91sam9260.c
new file mode 100644 (file)
index 0000000..b1af5a3
--- /dev/null
@@ -0,0 +1,494 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/clk-provider.h>
+#include <linux/mfd/syscon.h>
+#include <linux/slab.h>
+
+#include <dt-bindings/clock/at91.h>
+
+#include "pmc.h"
+
+struct sck {
+       char *n;
+       char *p;
+       u8 id;
+};
+
+struct pck {
+       char *n;
+       u8 id;
+};
+
+struct at91sam926x_data {
+       const struct clk_pll_layout *plla_layout;
+       const struct clk_pll_characteristics *plla_characteristics;
+       const struct clk_pll_layout *pllb_layout;
+       const struct clk_pll_characteristics *pllb_characteristics;
+       const struct clk_master_characteristics *mck_characteristics;
+       const struct sck *sck;
+       const struct pck *pck;
+       u8 num_sck;
+       u8 num_pck;
+       u8 num_progck;
+       bool has_slck;
+};
+
+static const struct clk_master_characteristics sam9260_mck_characteristics = {
+       .output = { .min = 0, .max = 105000000 },
+       .divisors = { 1, 2, 4, 0 },
+};
+
+static u8 sam9260_plla_out[] = { 0, 2 };
+
+static u16 sam9260_plla_icpll[] = { 1, 1 };
+
+static struct clk_range sam9260_plla_outputs[] = {
+       { .min = 80000000, .max = 160000000 },
+       { .min = 150000000, .max = 240000000 },
+};
+
+static const struct clk_pll_characteristics sam9260_plla_characteristics = {
+       .input = { .min = 1000000, .max = 32000000 },
+       .num_output = ARRAY_SIZE(sam9260_plla_outputs),
+       .output = sam9260_plla_outputs,
+       .icpll = sam9260_plla_icpll,
+       .out = sam9260_plla_out,
+};
+
+static u8 sam9260_pllb_out[] = { 1 };
+
+static u16 sam9260_pllb_icpll[] = { 1 };
+
+static struct clk_range sam9260_pllb_outputs[] = {
+       { .min = 70000000, .max = 130000000 },
+};
+
+static const struct clk_pll_characteristics sam9260_pllb_characteristics = {
+       .input = { .min = 1000000, .max = 5000000 },
+       .num_output = ARRAY_SIZE(sam9260_pllb_outputs),
+       .output = sam9260_pllb_outputs,
+       .icpll = sam9260_pllb_icpll,
+       .out = sam9260_pllb_out,
+};
+
+static const struct sck at91sam9260_systemck[] = {
+       { .n = "uhpck", .p = "usbck",    .id = 6 },
+       { .n = "udpck", .p = "usbck",    .id = 7 },
+       { .n = "pck0",  .p = "prog0",    .id = 8 },
+       { .n = "pck1",  .p = "prog1",    .id = 9 },
+};
+
+static const struct pck at91sam9260_periphck[] = {
+       { .n = "pioA_clk",   .id = 2 },
+       { .n = "pioB_clk",   .id = 3 },
+       { .n = "pioC_clk",   .id = 4 },
+       { .n = "adc_clk",    .id = 5 },
+       { .n = "usart0_clk", .id = 6 },
+       { .n = "usart1_clk", .id = 7 },
+       { .n = "usart2_clk", .id = 8 },
+       { .n = "mci0_clk",   .id = 9 },
+       { .n = "udc_clk",    .id = 10 },
+       { .n = "twi0_clk",   .id = 11 },
+       { .n = "spi0_clk",   .id = 12 },
+       { .n = "spi1_clk",   .id = 13 },
+       { .n = "ssc0_clk",   .id = 14 },
+       { .n = "tc0_clk",    .id = 17 },
+       { .n = "tc1_clk",    .id = 18 },
+       { .n = "tc2_clk",    .id = 19 },
+       { .n = "ohci_clk",   .id = 20 },
+       { .n = "macb0_clk",  .id = 21 },
+       { .n = "isi_clk",    .id = 22 },
+       { .n = "usart3_clk", .id = 23 },
+       { .n = "uart0_clk",  .id = 24 },
+       { .n = "uart1_clk",  .id = 25 },
+       { .n = "tc3_clk",    .id = 26 },
+       { .n = "tc4_clk",    .id = 27 },
+       { .n = "tc5_clk",    .id = 28 },
+};
+
+static struct at91sam926x_data at91sam9260_data = {
+       .plla_layout = &at91rm9200_pll_layout,
+       .plla_characteristics = &sam9260_plla_characteristics,
+       .pllb_layout = &at91rm9200_pll_layout,
+       .pllb_characteristics = &sam9260_pllb_characteristics,
+       .mck_characteristics = &sam9260_mck_characteristics,
+       .sck = at91sam9260_systemck,
+       .num_sck = ARRAY_SIZE(at91sam9260_systemck),
+       .pck = at91sam9260_periphck,
+       .num_pck = ARRAY_SIZE(at91sam9260_periphck),
+       .num_progck = 2,
+       .has_slck = true,
+};
+
+static const struct clk_master_characteristics sam9g20_mck_characteristics = {
+       .output = { .min = 0, .max = 133000000 },
+       .divisors = { 1, 2, 4, 6 },
+};
+
+static u8 sam9g20_plla_out[] = { 0, 1, 2, 3, 0, 1, 2, 3 };
+
+static u16 sam9g20_plla_icpll[] = { 0, 0, 0, 0, 1, 1, 1, 1 };
+
+static struct clk_range sam9g20_plla_outputs[] = {
+       { .min = 745000000, .max = 800000000 },
+       { .min = 695000000, .max = 750000000 },
+       { .min = 645000000, .max = 700000000 },
+       { .min = 595000000, .max = 650000000 },
+       { .min = 545000000, .max = 600000000 },
+       { .min = 495000000, .max = 550000000 },
+       { .min = 445000000, .max = 500000000 },
+       { .min = 400000000, .max = 450000000 },
+};
+
+static const struct clk_pll_characteristics sam9g20_plla_characteristics = {
+       .input = { .min = 2000000, .max = 32000000 },
+       .num_output = ARRAY_SIZE(sam9g20_plla_outputs),
+       .output = sam9g20_plla_outputs,
+       .icpll = sam9g20_plla_icpll,
+       .out = sam9g20_plla_out,
+};
+
+static u8 sam9g20_pllb_out[] = { 0 };
+
+static u16 sam9g20_pllb_icpll[] = { 0 };
+
+static struct clk_range sam9g20_pllb_outputs[] = {
+       { .min = 30000000, .max = 100000000 },
+};
+
+static const struct clk_pll_characteristics sam9g20_pllb_characteristics = {
+       .input = { .min = 2000000, .max = 32000000 },
+       .num_output = ARRAY_SIZE(sam9g20_pllb_outputs),
+       .output = sam9g20_pllb_outputs,
+       .icpll = sam9g20_pllb_icpll,
+       .out = sam9g20_pllb_out,
+};
+
+static struct at91sam926x_data at91sam9g20_data = {
+       .plla_layout = &at91sam9g45_pll_layout,
+       .plla_characteristics = &sam9g20_plla_characteristics,
+       .pllb_layout = &at91sam9g20_pllb_layout,
+       .pllb_characteristics = &sam9g20_pllb_characteristics,
+       .mck_characteristics = &sam9g20_mck_characteristics,
+       .sck = at91sam9260_systemck,
+       .num_sck = ARRAY_SIZE(at91sam9260_systemck),
+       .pck = at91sam9260_periphck,
+       .num_pck = ARRAY_SIZE(at91sam9260_periphck),
+       .num_progck = 2,
+       .has_slck = true,
+};
+
+static const struct clk_master_characteristics sam9261_mck_characteristics = {
+       .output = { .min = 0, .max = 94000000 },
+       .divisors = { 1, 2, 4, 0 },
+};
+
+static struct clk_range sam9261_plla_outputs[] = {
+       { .min = 80000000, .max = 200000000 },
+       { .min = 190000000, .max = 240000000 },
+};
+
+static const struct clk_pll_characteristics sam9261_plla_characteristics = {
+       .input = { .min = 1000000, .max = 32000000 },
+       .num_output = ARRAY_SIZE(sam9261_plla_outputs),
+       .output = sam9261_plla_outputs,
+       .icpll = sam9260_plla_icpll,
+       .out = sam9260_plla_out,
+};
+
+static u8 sam9261_pllb_out[] = { 1 };
+
+static u16 sam9261_pllb_icpll[] = { 1 };
+
+static struct clk_range sam9261_pllb_outputs[] = {
+       { .min = 70000000, .max = 130000000 },
+};
+
+static const struct clk_pll_characteristics sam9261_pllb_characteristics = {
+       .input = { .min = 1000000, .max = 5000000 },
+       .num_output = ARRAY_SIZE(sam9261_pllb_outputs),
+       .output = sam9261_pllb_outputs,
+       .icpll = sam9261_pllb_icpll,
+       .out = sam9261_pllb_out,
+};
+
+static const struct sck at91sam9261_systemck[] = {
+       { .n = "uhpck", .p = "usbck",    .id = 6 },
+       { .n = "udpck", .p = "usbck",    .id = 7 },
+       { .n = "pck0",  .p = "prog0",    .id = 8 },
+       { .n = "pck1",  .p = "prog1",    .id = 9 },
+       { .n = "pck2",  .p = "prog2",    .id = 10 },
+       { .n = "pck3",  .p = "prog3",    .id = 11 },
+       { .n = "hclk0", .p = "masterck", .id = 16 },
+       { .n = "hclk1", .p = "masterck", .id = 17 },
+};
+
+static const struct pck at91sam9261_periphck[] = {
+       { .n = "pioA_clk",   .id = 2, },
+       { .n = "pioB_clk",   .id = 3, },
+       { .n = "pioC_clk",   .id = 4, },
+       { .n = "usart0_clk", .id = 6, },
+       { .n = "usart1_clk", .id = 7, },
+       { .n = "usart2_clk", .id = 8, },
+       { .n = "mci0_clk",   .id = 9, },
+       { .n = "udc_clk",    .id = 10, },
+       { .n = "twi0_clk",   .id = 11, },
+       { .n = "spi0_clk",   .id = 12, },
+       { .n = "spi1_clk",   .id = 13, },
+       { .n = "ssc0_clk",   .id = 14, },
+       { .n = "ssc1_clk",   .id = 15, },
+       { .n = "ssc2_clk",   .id = 16, },
+       { .n = "tc0_clk",    .id = 17, },
+       { .n = "tc1_clk",    .id = 18, },
+       { .n = "tc2_clk",    .id = 19, },
+       { .n = "ohci_clk",   .id = 20, },
+       { .n = "lcd_clk",    .id = 21, },
+};
+
+static struct at91sam926x_data at91sam9261_data = {
+       .plla_layout = &at91rm9200_pll_layout,
+       .plla_characteristics = &sam9261_plla_characteristics,
+       .pllb_layout = &at91rm9200_pll_layout,
+       .pllb_characteristics = &sam9261_pllb_characteristics,
+       .mck_characteristics = &sam9261_mck_characteristics,
+       .sck = at91sam9261_systemck,
+       .num_sck = ARRAY_SIZE(at91sam9261_systemck),
+       .pck = at91sam9261_periphck,
+       .num_pck = ARRAY_SIZE(at91sam9261_periphck),
+       .num_progck = 4,
+};
+
+static const struct clk_master_characteristics sam9263_mck_characteristics = {
+       .output = { .min = 0, .max = 120000000 },
+       .divisors = { 1, 2, 4, 0 },
+};
+
+static struct clk_range sam9263_pll_outputs[] = {
+       { .min = 80000000, .max = 200000000 },
+       { .min = 190000000, .max = 240000000 },
+};
+
+static const struct clk_pll_characteristics sam9263_pll_characteristics = {
+       .input = { .min = 1000000, .max = 32000000 },
+       .num_output = ARRAY_SIZE(sam9263_pll_outputs),
+       .output = sam9263_pll_outputs,
+       .icpll = sam9260_plla_icpll,
+       .out = sam9260_plla_out,
+};
+
+static const struct sck at91sam9263_systemck[] = {
+       { .n = "uhpck", .p = "usbck",    .id = 6 },
+       { .n = "udpck", .p = "usbck",    .id = 7 },
+       { .n = "pck0",  .p = "prog0",    .id = 8 },
+       { .n = "pck1",  .p = "prog1",    .id = 9 },
+       { .n = "pck2",  .p = "prog2",    .id = 10 },
+       { .n = "pck3",  .p = "prog3",    .id = 11 },
+};
+
+static const struct pck at91sam9263_periphck[] = {
+       { .n = "pioA_clk",   .id = 2, },
+       { .n = "pioB_clk",   .id = 3, },
+       { .n = "pioCDE_clk", .id = 4, },
+       { .n = "usart0_clk", .id = 7, },
+       { .n = "usart1_clk", .id = 8, },
+       { .n = "usart2_clk", .id = 9, },
+       { .n = "mci0_clk",   .id = 10, },
+       { .n = "mci1_clk",   .id = 11, },
+       { .n = "can_clk",    .id = 12, },
+       { .n = "twi0_clk",   .id = 13, },
+       { .n = "spi0_clk",   .id = 14, },
+       { .n = "spi1_clk",   .id = 15, },
+       { .n = "ssc0_clk",   .id = 16, },
+       { .n = "ssc1_clk",   .id = 17, },
+       { .n = "ac97_clk",   .id = 18, },
+       { .n = "tcb_clk",    .id = 19, },
+       { .n = "pwm_clk",    .id = 20, },
+       { .n = "macb0_clk",  .id = 21, },
+       { .n = "g2de_clk",   .id = 23, },
+       { .n = "udc_clk",    .id = 24, },
+       { .n = "isi_clk",    .id = 25, },
+       { .n = "lcd_clk",    .id = 26, },
+       { .n = "dma_clk",    .id = 27, },
+       { .n = "ohci_clk",   .id = 29, },
+};
+
+static struct at91sam926x_data at91sam9263_data = {
+       .plla_layout = &at91rm9200_pll_layout,
+       .plla_characteristics = &sam9263_pll_characteristics,
+       .pllb_layout = &at91rm9200_pll_layout,
+       .pllb_characteristics = &sam9263_pll_characteristics,
+       .mck_characteristics = &sam9263_mck_characteristics,
+       .sck = at91sam9263_systemck,
+       .num_sck = ARRAY_SIZE(at91sam9263_systemck),
+       .pck = at91sam9263_periphck,
+       .num_pck = ARRAY_SIZE(at91sam9263_periphck),
+       .num_progck = 4,
+};
+
+static void __init at91sam926x_pmc_setup(struct device_node *np,
+                                        struct at91sam926x_data *data)
+{
+       const char *slowxtal_name, *mainxtal_name;
+       struct pmc_data *at91sam9260_pmc;
+       u32 usb_div[] = { 1, 2, 4, 0 };
+       const char *parent_names[6];
+       const char *slck_name;
+       struct regmap *regmap;
+       struct clk_hw *hw;
+       int i;
+       bool bypass;
+
+       i = of_property_match_string(np, "clock-names", "slow_xtal");
+       if (i < 0)
+               return;
+
+       slowxtal_name = of_clk_get_parent_name(np, i);
+
+       i = of_property_match_string(np, "clock-names", "main_xtal");
+       if (i < 0)
+               return;
+       mainxtal_name = of_clk_get_parent_name(np, i);
+
+       regmap = syscon_node_to_regmap(np);
+       if (IS_ERR(regmap))
+               return;
+
+       at91sam9260_pmc = pmc_data_allocate(PMC_MAIN + 1,
+                                           ndck(data->sck, data->num_sck),
+                                           ndck(data->pck, data->num_pck), 0);
+       if (!at91sam9260_pmc)
+               return;
+
+       bypass = of_property_read_bool(np, "atmel,osc-bypass");
+
+       hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name,
+                                       bypass);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       hw = at91_clk_register_rm9200_main(regmap, "mainck", "main_osc");
+       if (IS_ERR(hw))
+               goto err_free;
+
+       at91sam9260_pmc->chws[PMC_MAIN] = hw;
+
+       if (data->has_slck) {
+               hw = clk_hw_register_fixed_rate_with_accuracy(NULL,
+                                                             "slow_rc_osc",
+                                                             NULL, 0, 32768,
+                                                             50000000);
+               if (IS_ERR(hw))
+                       goto err_free;
+
+               parent_names[0] = "slow_rc_osc";
+               parent_names[1] = "slow_xtal";
+               hw = at91_clk_register_sam9260_slow(regmap, "slck",
+                                                   parent_names, 2);
+               if (IS_ERR(hw))
+                       goto err_free;
+
+               at91sam9260_pmc->chws[PMC_SLOW] = hw;
+               slck_name = "slck";
+       } else {
+               slck_name = slowxtal_name;
+       }
+
+       hw = at91_clk_register_pll(regmap, "pllack", "mainck", 0,
+                                  data->plla_layout,
+                                  data->plla_characteristics);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       hw = at91_clk_register_pll(regmap, "pllbck", "mainck", 1,
+                                  data->pllb_layout,
+                                  data->pllb_characteristics);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       parent_names[0] = slck_name;
+       parent_names[1] = "mainck";
+       parent_names[2] = "pllack";
+       parent_names[3] = "pllbck";
+       hw = at91_clk_register_master(regmap, "masterck", 4, parent_names,
+                                     &at91rm9200_master_layout,
+                                     data->mck_characteristics);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       at91sam9260_pmc->chws[PMC_MCK] = hw;
+
+       hw = at91rm9200_clk_register_usb(regmap, "usbck", "pllbck", usb_div);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       parent_names[0] = slck_name;
+       parent_names[1] = "mainck";
+       parent_names[2] = "pllack";
+       parent_names[3] = "pllbck";
+       for (i = 0; i < data->num_progck; i++) {
+               char name[6];
+
+               snprintf(name, sizeof(name), "prog%d", i);
+
+               hw = at91_clk_register_programmable(regmap, name,
+                                                   parent_names, 4, i,
+                                                   &at91rm9200_programmable_layout);
+               if (IS_ERR(hw))
+                       goto err_free;
+       }
+
+       for (i = 0; i < data->num_sck; i++) {
+               hw = at91_clk_register_system(regmap, data->sck[i].n,
+                                             data->sck[i].p,
+                                             data->sck[i].id);
+               if (IS_ERR(hw))
+                       goto err_free;
+
+               at91sam9260_pmc->shws[data->sck[i].id] = hw;
+       }
+
+       for (i = 0; i < data->num_pck; i++) {
+               hw = at91_clk_register_peripheral(regmap,
+                                                 data->pck[i].n,
+                                                 "masterck",
+                                                 data->pck[i].id);
+               if (IS_ERR(hw))
+                       goto err_free;
+
+               at91sam9260_pmc->phws[data->pck[i].id] = hw;
+       }
+
+       of_clk_add_hw_provider(np, of_clk_hw_pmc_get, at91sam9260_pmc);
+
+       return;
+
+err_free:
+       pmc_data_free(at91sam9260_pmc);
+}
+
+static void __init at91sam9260_pmc_setup(struct device_node *np)
+{
+       at91sam926x_pmc_setup(np, &at91sam9260_data);
+}
+CLK_OF_DECLARE_DRIVER(at91sam9260_pmc, "atmel,at91sam9260-pmc",
+                     at91sam9260_pmc_setup);
+
+static void __init at91sam9261_pmc_setup(struct device_node *np)
+{
+       at91sam926x_pmc_setup(np, &at91sam9261_data);
+}
+CLK_OF_DECLARE_DRIVER(at91sam9261_pmc, "atmel,at91sam9261-pmc",
+                     at91sam9261_pmc_setup);
+
+static void __init at91sam9263_pmc_setup(struct device_node *np)
+{
+       at91sam926x_pmc_setup(np, &at91sam9263_data);
+}
+CLK_OF_DECLARE_DRIVER(at91sam9263_pmc, "atmel,at91sam9263-pmc",
+                     at91sam9263_pmc_setup);
+
+static void __init at91sam9g20_pmc_setup(struct device_node *np)
+{
+       at91sam926x_pmc_setup(np, &at91sam9g20_data);
+}
+CLK_OF_DECLARE_DRIVER(at91sam9g20_pmc, "atmel,at91sam9g20-pmc",
+                     at91sam9g20_pmc_setup);
diff --git a/drivers/clk/at91/at91sam9rl.c b/drivers/clk/at91/at91sam9rl.c
new file mode 100644 (file)
index 0000000..5aeef68
--- /dev/null
@@ -0,0 +1,171 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/clk-provider.h>
+#include <linux/mfd/syscon.h>
+#include <linux/slab.h>
+
+#include <dt-bindings/clock/at91.h>
+
+#include "pmc.h"
+
+static const struct clk_master_characteristics sam9rl_mck_characteristics = {
+       .output = { .min = 0, .max = 94000000 },
+       .divisors = { 1, 2, 4, 0 },
+};
+
+static u8 sam9rl_plla_out[] = { 0, 2 };
+
+static struct clk_range sam9rl_plla_outputs[] = {
+       { .min = 80000000, .max = 200000000 },
+       { .min = 190000000, .max = 240000000 },
+};
+
+static const struct clk_pll_characteristics sam9rl_plla_characteristics = {
+       .input = { .min = 1000000, .max = 32000000 },
+       .num_output = ARRAY_SIZE(sam9rl_plla_outputs),
+       .output = sam9rl_plla_outputs,
+       .out = sam9rl_plla_out,
+};
+
+static const struct {
+       char *n;
+       char *p;
+       u8 id;
+} at91sam9rl_systemck[] = {
+       { .n = "pck0",  .p = "prog0",    .id = 8 },
+       { .n = "pck1",  .p = "prog1",    .id = 9 },
+};
+
+static const struct {
+       char *n;
+       u8 id;
+} at91sam9rl_periphck[] = {
+       { .n = "pioA_clk",   .id = 2, },
+       { .n = "pioB_clk",   .id = 3, },
+       { .n = "pioC_clk",   .id = 4, },
+       { .n = "pioD_clk",   .id = 5, },
+       { .n = "usart0_clk", .id = 6, },
+       { .n = "usart1_clk", .id = 7, },
+       { .n = "usart2_clk", .id = 8, },
+       { .n = "usart3_clk", .id = 9, },
+       { .n = "mci0_clk",   .id = 10, },
+       { .n = "twi0_clk",   .id = 11, },
+       { .n = "twi1_clk",   .id = 12, },
+       { .n = "spi0_clk",   .id = 13, },
+       { .n = "ssc0_clk",   .id = 14, },
+       { .n = "ssc1_clk",   .id = 15, },
+       { .n = "tc0_clk",    .id = 16, },
+       { .n = "tc1_clk",    .id = 17, },
+       { .n = "tc2_clk",    .id = 18, },
+       { .n = "pwm_clk",    .id = 19, },
+       { .n = "adc_clk",    .id = 20, },
+       { .n = "dma0_clk",   .id = 21, },
+       { .n = "udphs_clk",  .id = 22, },
+       { .n = "lcd_clk",    .id = 23, },
+};
+
+static void __init at91sam9rl_pmc_setup(struct device_node *np)
+{
+       const char *slck_name, *mainxtal_name;
+       struct pmc_data *at91sam9rl_pmc;
+       const char *parent_names[6];
+       struct regmap *regmap;
+       struct clk_hw *hw;
+       int i;
+
+       i = of_property_match_string(np, "clock-names", "slow_clk");
+       if (i < 0)
+               return;
+
+       slck_name = of_clk_get_parent_name(np, i);
+
+       i = of_property_match_string(np, "clock-names", "main_xtal");
+       if (i < 0)
+               return;
+       mainxtal_name = of_clk_get_parent_name(np, i);
+
+       regmap = syscon_node_to_regmap(np);
+       if (IS_ERR(regmap))
+               return;
+
+       at91sam9rl_pmc = pmc_data_allocate(PMC_MAIN + 1,
+                                          nck(at91sam9rl_systemck),
+                                          nck(at91sam9rl_periphck), 0);
+       if (!at91sam9rl_pmc)
+               return;
+
+       hw = at91_clk_register_rm9200_main(regmap, "mainck", mainxtal_name);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       at91sam9rl_pmc->chws[PMC_MAIN] = hw;
+
+       hw = at91_clk_register_pll(regmap, "pllack", "mainck", 0,
+                                  &at91rm9200_pll_layout,
+                                  &sam9rl_plla_characteristics);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       hw = at91_clk_register_utmi(regmap, NULL, "utmick", "mainck");
+       if (IS_ERR(hw))
+               goto err_free;
+
+       at91sam9rl_pmc->chws[PMC_UTMI] = hw;
+
+       parent_names[0] = slck_name;
+       parent_names[1] = "mainck";
+       parent_names[2] = "pllack";
+       parent_names[3] = "utmick";
+       hw = at91_clk_register_master(regmap, "masterck", 4, parent_names,
+                                     &at91rm9200_master_layout,
+                                     &sam9rl_mck_characteristics);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       at91sam9rl_pmc->chws[PMC_MCK] = hw;
+
+       parent_names[0] = slck_name;
+       parent_names[1] = "mainck";
+       parent_names[2] = "pllack";
+       parent_names[3] = "utmick";
+       parent_names[4] = "masterck";
+       for (i = 0; i < 2; i++) {
+               char name[6];
+
+               snprintf(name, sizeof(name), "prog%d", i);
+
+               hw = at91_clk_register_programmable(regmap, name,
+                                                   parent_names, 5, i,
+                                                   &at91rm9200_programmable_layout);
+               if (IS_ERR(hw))
+                       goto err_free;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(at91sam9rl_systemck); i++) {
+               hw = at91_clk_register_system(regmap, at91sam9rl_systemck[i].n,
+                                             at91sam9rl_systemck[i].p,
+                                             at91sam9rl_systemck[i].id);
+               if (IS_ERR(hw))
+                       goto err_free;
+
+               at91sam9rl_pmc->shws[at91sam9rl_systemck[i].id] = hw;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(at91sam9rl_periphck); i++) {
+               hw = at91_clk_register_peripheral(regmap,
+                                                 at91sam9rl_periphck[i].n,
+                                                 "masterck",
+                                                 at91sam9rl_periphck[i].id);
+               if (IS_ERR(hw))
+                       goto err_free;
+
+               at91sam9rl_pmc->phws[at91sam9rl_periphck[i].id] = hw;
+       }
+
+       of_clk_add_hw_provider(np, of_clk_hw_pmc_get, at91sam9rl_pmc);
+
+       return;
+
+err_free:
+       pmc_data_free(at91sam9rl_pmc);
+}
+CLK_OF_DECLARE_DRIVER(at91sam9rl_pmc, "atmel,at91sam9rl-pmc", at91sam9rl_pmc_setup);
diff --git a/drivers/clk/at91/at91sam9x5.c b/drivers/clk/at91/at91sam9x5.c
new file mode 100644 (file)
index 0000000..2fe225a
--- /dev/null
@@ -0,0 +1,309 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/clk-provider.h>
+#include <linux/mfd/syscon.h>
+#include <linux/slab.h>
+
+#include <dt-bindings/clock/at91.h>
+
+#include "pmc.h"
+
+static const struct clk_master_characteristics mck_characteristics = {
+       .output = { .min = 0, .max = 133333333 },
+       .divisors = { 1, 2, 4, 3 },
+       .have_div3_pres = 1,
+};
+
+static u8 plla_out[] = { 0, 1, 2, 3, 0, 1, 2, 3 };
+
+static u16 plla_icpll[] = { 0, 0, 0, 0, 1, 1, 1, 1 };
+
+static struct clk_range plla_outputs[] = {
+       { .min = 745000000, .max = 800000000 },
+       { .min = 695000000, .max = 750000000 },
+       { .min = 645000000, .max = 700000000 },
+       { .min = 595000000, .max = 650000000 },
+       { .min = 545000000, .max = 600000000 },
+       { .min = 495000000, .max = 555000000 },
+       { .min = 445000000, .max = 500000000 },
+       { .min = 400000000, .max = 450000000 },
+};
+
+static const struct clk_pll_characteristics plla_characteristics = {
+       .input = { .min = 2000000, .max = 32000000 },
+       .num_output = ARRAY_SIZE(plla_outputs),
+       .output = plla_outputs,
+       .icpll = plla_icpll,
+       .out = plla_out,
+};
+
+static const struct {
+       char *n;
+       char *p;
+       u8 id;
+} at91sam9x5_systemck[] = {
+       { .n = "ddrck", .p = "masterck", .id = 2 },
+       { .n = "smdck", .p = "smdclk",   .id = 4 },
+       { .n = "uhpck", .p = "usbck",    .id = 6 },
+       { .n = "udpck", .p = "usbck",    .id = 7 },
+       { .n = "pck0",  .p = "prog0",    .id = 8 },
+       { .n = "pck1",  .p = "prog1",    .id = 9 },
+};
+
+struct pck {
+       char *n;
+       u8 id;
+};
+
+static const struct pck at91sam9x5_periphck[] = {
+       { .n = "pioAB_clk",  .id = 2, },
+       { .n = "pioCD_clk",  .id = 3, },
+       { .n = "smd_clk",    .id = 4, },
+       { .n = "usart0_clk", .id = 5, },
+       { .n = "usart1_clk", .id = 6, },
+       { .n = "usart2_clk", .id = 7, },
+       { .n = "twi0_clk",   .id = 9, },
+       { .n = "twi1_clk",   .id = 10, },
+       { .n = "twi2_clk",   .id = 11, },
+       { .n = "mci0_clk",   .id = 12, },
+       { .n = "spi0_clk",   .id = 13, },
+       { .n = "spi1_clk",   .id = 14, },
+       { .n = "uart0_clk",  .id = 15, },
+       { .n = "uart1_clk",  .id = 16, },
+       { .n = "tcb0_clk",   .id = 17, },
+       { .n = "pwm_clk",    .id = 18, },
+       { .n = "adc_clk",    .id = 19, },
+       { .n = "dma0_clk",   .id = 20, },
+       { .n = "dma1_clk",   .id = 21, },
+       { .n = "uhphs_clk",  .id = 22, },
+       { .n = "udphs_clk",  .id = 23, },
+       { .n = "mci1_clk",   .id = 26, },
+       { .n = "ssc0_clk",   .id = 28, },
+};
+
+static const struct pck at91sam9g15_periphck[] = {
+       { .n = "lcdc_clk", .id = 25, },
+       { /* sentinel */}
+};
+
+static const struct pck at91sam9g25_periphck[] = {
+       { .n = "usart3_clk", .id = 8, },
+       { .n = "macb0_clk", .id = 24, },
+       { .n = "isi_clk", .id = 25, },
+       { /* sentinel */}
+};
+
+static const struct pck at91sam9g35_periphck[] = {
+       { .n = "macb0_clk", .id = 24, },
+       { .n = "lcdc_clk", .id = 25, },
+       { /* sentinel */}
+};
+
+static const struct pck at91sam9x25_periphck[] = {
+       { .n = "usart3_clk", .id = 8, },
+       { .n = "macb0_clk", .id = 24, },
+       { .n = "macb1_clk", .id = 27, },
+       { .n = "can0_clk", .id = 29, },
+       { .n = "can1_clk", .id = 30, },
+       { /* sentinel */}
+};
+
+static const struct pck at91sam9x35_periphck[] = {
+       { .n = "macb0_clk", .id = 24, },
+       { .n = "lcdc_clk", .id = 25, },
+       { .n = "can0_clk", .id = 29, },
+       { .n = "can1_clk", .id = 30, },
+       { /* sentinel */}
+};
+
+static void __init at91sam9x5_pmc_setup(struct device_node *np,
+                                       const struct pck *extra_pcks,
+                                       bool has_lcdck)
+{
+       struct clk_range range = CLK_RANGE(0, 0);
+       const char *slck_name, *mainxtal_name;
+       struct pmc_data *at91sam9x5_pmc;
+       const char *parent_names[6];
+       struct regmap *regmap;
+       struct clk_hw *hw;
+       int i;
+       bool bypass;
+
+       i = of_property_match_string(np, "clock-names", "slow_clk");
+       if (i < 0)
+               return;
+
+       slck_name = of_clk_get_parent_name(np, i);
+
+       i = of_property_match_string(np, "clock-names", "main_xtal");
+       if (i < 0)
+               return;
+       mainxtal_name = of_clk_get_parent_name(np, i);
+
+       regmap = syscon_node_to_regmap(np);
+       if (IS_ERR(regmap))
+               return;
+
+       at91sam9x5_pmc = pmc_data_allocate(PMC_MAIN + 1,
+                                          nck(at91sam9x5_systemck),
+                                          nck(at91sam9x35_periphck), 0);
+       if (!at91sam9x5_pmc)
+               return;
+
+       hw = at91_clk_register_main_rc_osc(regmap, "main_rc_osc", 12000000,
+                                          50000000);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       bypass = of_property_read_bool(np, "atmel,osc-bypass");
+
+       hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name,
+                                       bypass);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       parent_names[0] = "main_rc_osc";
+       parent_names[1] = "main_osc";
+       hw = at91_clk_register_sam9x5_main(regmap, "mainck", parent_names, 2);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       at91sam9x5_pmc->chws[PMC_MAIN] = hw;
+
+       hw = at91_clk_register_pll(regmap, "pllack", "mainck", 0,
+                                  &at91rm9200_pll_layout, &plla_characteristics);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       hw = at91_clk_register_plldiv(regmap, "plladivck", "pllack");
+       if (IS_ERR(hw))
+               goto err_free;
+
+       hw = at91_clk_register_utmi(regmap, NULL, "utmick", "mainck");
+       if (IS_ERR(hw))
+               goto err_free;
+
+       at91sam9x5_pmc->chws[PMC_UTMI] = hw;
+
+       parent_names[0] = slck_name;
+       parent_names[1] = "mainck";
+       parent_names[2] = "plladivck";
+       parent_names[3] = "utmick";
+       hw = at91_clk_register_master(regmap, "masterck", 4, parent_names,
+                                     &at91sam9x5_master_layout,
+                                     &mck_characteristics);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       at91sam9x5_pmc->chws[PMC_MCK] = hw;
+
+       parent_names[0] = "plladivck";
+       parent_names[1] = "utmick";
+       hw = at91sam9x5_clk_register_usb(regmap, "usbck", parent_names, 2);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       hw = at91sam9x5_clk_register_smd(regmap, "smdclk", parent_names, 2);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       parent_names[0] = slck_name;
+       parent_names[1] = "mainck";
+       parent_names[2] = "plladivck";
+       parent_names[3] = "utmick";
+       parent_names[4] = "mck";
+       for (i = 0; i < 2; i++) {
+               char name[6];
+
+               snprintf(name, sizeof(name), "prog%d", i);
+
+               hw = at91_clk_register_programmable(regmap, name,
+                                                   parent_names, 5, i,
+                                                   &at91sam9x5_programmable_layout);
+               if (IS_ERR(hw))
+                       goto err_free;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(at91sam9x5_systemck); i++) {
+               hw = at91_clk_register_system(regmap, at91sam9x5_systemck[i].n,
+                                             at91sam9x5_systemck[i].p,
+                                             at91sam9x5_systemck[i].id);
+               if (IS_ERR(hw))
+                       goto err_free;
+
+               at91sam9x5_pmc->shws[at91sam9x5_systemck[i].id] = hw;
+       }
+
+       if (has_lcdck) {
+               hw = at91_clk_register_system(regmap, "lcdck", "masterck", 3);
+               if (IS_ERR(hw))
+                       goto err_free;
+
+               at91sam9x5_pmc->shws[3] = hw;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(at91sam9x5_periphck); i++) {
+               hw = at91_clk_register_sam9x5_peripheral(regmap, &pmc_pcr_lock,
+                                                        at91sam9x5_periphck[i].n,
+                                                        "masterck",
+                                                        at91sam9x5_periphck[i].id,
+                                                        &range);
+               if (IS_ERR(hw))
+                       goto err_free;
+
+               at91sam9x5_pmc->phws[at91sam9x5_periphck[i].id] = hw;
+       }
+
+       for (i = 0; extra_pcks[i].id; i++) {
+               hw = at91_clk_register_sam9x5_peripheral(regmap, &pmc_pcr_lock,
+                                                        extra_pcks[i].n,
+                                                        "masterck",
+                                                        extra_pcks[i].id,
+                                                        &range);
+               if (IS_ERR(hw))
+                       goto err_free;
+
+               at91sam9x5_pmc->phws[extra_pcks[i].id] = hw;
+       }
+
+       of_clk_add_hw_provider(np, of_clk_hw_pmc_get, at91sam9x5_pmc);
+
+       return;
+
+err_free:
+       pmc_data_free(at91sam9x5_pmc);
+}
+
+static void __init at91sam9g15_pmc_setup(struct device_node *np)
+{
+       at91sam9x5_pmc_setup(np, at91sam9g15_periphck, true);
+}
+CLK_OF_DECLARE_DRIVER(at91sam9g15_pmc, "atmel,at91sam9g15-pmc",
+                     at91sam9g15_pmc_setup);
+
+static void __init at91sam9g25_pmc_setup(struct device_node *np)
+{
+       at91sam9x5_pmc_setup(np, at91sam9g25_periphck, false);
+}
+CLK_OF_DECLARE_DRIVER(at91sam9g25_pmc, "atmel,at91sam9g25-pmc",
+                     at91sam9g25_pmc_setup);
+
+static void __init at91sam9g35_pmc_setup(struct device_node *np)
+{
+       at91sam9x5_pmc_setup(np, at91sam9g35_periphck, true);
+}
+CLK_OF_DECLARE_DRIVER(at91sam9g35_pmc, "atmel,at91sam9g35-pmc",
+                     at91sam9g35_pmc_setup);
+
+static void __init at91sam9x25_pmc_setup(struct device_node *np)
+{
+       at91sam9x5_pmc_setup(np, at91sam9x25_periphck, false);
+}
+CLK_OF_DECLARE_DRIVER(at91sam9x25_pmc, "atmel,at91sam9x25-pmc",
+                     at91sam9x25_pmc_setup);
+
+static void __init at91sam9x35_pmc_setup(struct device_node *np)
+{
+       at91sam9x5_pmc_setup(np, at91sam9x35_periphck, true);
+}
+CLK_OF_DECLARE_DRIVER(at91sam9x35_pmc, "atmel,at91sam9x35-pmc",
+                     at91sam9x35_pmc_setup);
index da7bafcfbe706cef631e86f3df8dc86536f5900c..36d77146a3bd428c3f42aa5b73c3e69253fd58ea 100644 (file)
@@ -43,6 +43,8 @@
 #include <linux/regmap.h>
 #include <linux/slab.h>
 
+#include "pmc.h"
+
 #define AUDIO_PLL_DIV_FRAC     BIT(22)
 #define AUDIO_PLL_ND_MAX       (AT91_PMC_AUDIO_PLL_ND_MASK >> \
                                        AT91_PMC_AUDIO_PLL_ND_OFFSET)
@@ -444,93 +446,94 @@ static const struct clk_ops audio_pll_pmc_ops = {
        .set_rate = clk_audio_pll_pmc_set_rate,
 };
 
-static int of_sama5d2_clk_audio_pll_setup(struct device_node *np,
-                                         struct clk_init_data *init,
-                                         struct clk_hw *hw,
-                                         struct regmap **clk_audio_regmap)
-{
-       struct regmap *regmap;
-       const char *parent_names[1];
-       int ret;
-
-       regmap = syscon_node_to_regmap(of_get_parent(np));
-       if (IS_ERR(regmap))
-               return PTR_ERR(regmap);
-
-       init->name = np->name;
-       of_clk_parent_fill(np, parent_names, 1);
-       init->parent_names = parent_names;
-       init->num_parents = 1;
-
-       hw->init = init;
-       *clk_audio_regmap = regmap;
-
-       ret = clk_hw_register(NULL, hw);
-       if (ret)
-               return ret;
-
-       return of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
-}
-
-static void __init of_sama5d2_clk_audio_pll_frac_setup(struct device_node *np)
+struct clk_hw * __init
+at91_clk_register_audio_pll_frac(struct regmap *regmap, const char *name,
+                                const char *parent_name)
 {
        struct clk_audio_frac *frac_ck;
        struct clk_init_data init = {};
+       int ret;
 
        frac_ck = kzalloc(sizeof(*frac_ck), GFP_KERNEL);
        if (!frac_ck)
-               return;
+               return ERR_PTR(-ENOMEM);
 
+       init.name = name;
        init.ops = &audio_pll_frac_ops;
+       init.parent_names = &parent_name;
+       init.num_parents = 1;
        init.flags = CLK_SET_RATE_GATE;
 
-       if (of_sama5d2_clk_audio_pll_setup(np, &init, &frac_ck->hw,
-                                          &frac_ck->regmap))
+       frac_ck->hw.init = &init;
+       frac_ck->regmap = regmap;
+
+       ret = clk_hw_register(NULL, &frac_ck->hw);
+       if (ret) {
                kfree(frac_ck);
+               return ERR_PTR(ret);
+       }
+
+       return &frac_ck->hw;
 }
 
-static void __init of_sama5d2_clk_audio_pll_pad_setup(struct device_node *np)
+struct clk_hw * __init
+at91_clk_register_audio_pll_pad(struct regmap *regmap, const char *name,
+                               const char *parent_name)
 {
        struct clk_audio_pad *apad_ck;
-       struct clk_init_data init = {};
+       struct clk_init_data init;
+       int ret;
 
        apad_ck = kzalloc(sizeof(*apad_ck), GFP_KERNEL);
        if (!apad_ck)
-               return;
+               return ERR_PTR(-ENOMEM);
 
+       init.name = name;
        init.ops = &audio_pll_pad_ops;
+       init.parent_names = &parent_name;
+       init.num_parents = 1;
        init.flags = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
                CLK_SET_RATE_PARENT;
 
-       if (of_sama5d2_clk_audio_pll_setup(np, &init, &apad_ck->hw,
-                                          &apad_ck->regmap))
+       apad_ck->hw.init = &init;
+       apad_ck->regmap = regmap;
+
+       ret = clk_hw_register(NULL, &apad_ck->hw);
+       if (ret) {
                kfree(apad_ck);
+               return ERR_PTR(ret);
+       }
+
+       return &apad_ck->hw;
 }
 
-static void __init of_sama5d2_clk_audio_pll_pmc_setup(struct device_node *np)
+struct clk_hw * __init
+at91_clk_register_audio_pll_pmc(struct regmap *regmap, const char *name,
+                               const char *parent_name)
 {
-       struct clk_audio_pad *apmc_ck;
-       struct clk_init_data init = {};
+       struct clk_audio_pmc *apmc_ck;
+       struct clk_init_data init;
+       int ret;
 
        apmc_ck = kzalloc(sizeof(*apmc_ck), GFP_KERNEL);
        if (!apmc_ck)
-               return;
+               return ERR_PTR(-ENOMEM);
 
+       init.name = name;
        init.ops = &audio_pll_pmc_ops;
+       init.parent_names = &parent_name;
+       init.num_parents = 1;
        init.flags = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
                CLK_SET_RATE_PARENT;
 
-       if (of_sama5d2_clk_audio_pll_setup(np, &init, &apmc_ck->hw,
-                                          &apmc_ck->regmap))
+       apmc_ck->hw.init = &init;
+       apmc_ck->regmap = regmap;
+
+       ret = clk_hw_register(NULL, &apmc_ck->hw);
+       if (ret) {
                kfree(apmc_ck);
-}
+               return ERR_PTR(ret);
+       }
 
-CLK_OF_DECLARE(of_sama5d2_clk_audio_pll_frac_setup,
-              "atmel,sama5d2-clk-audio-pll-frac",
-              of_sama5d2_clk_audio_pll_frac_setup);
-CLK_OF_DECLARE(of_sama5d2_clk_audio_pll_pad_setup,
-              "atmel,sama5d2-clk-audio-pll-pad",
-              of_sama5d2_clk_audio_pll_pad_setup);
-CLK_OF_DECLARE(of_sama5d2_clk_audio_pll_pmc_setup,
-              "atmel,sama5d2-clk-audio-pll-pmc",
-              of_sama5d2_clk_audio_pll_pmc_setup);
+       return &apmc_ck->hw;
+}
index 33481368740e7dc038fe1e32065e2659d8cec730..66e7f7baf9580fe6b6ac7ec837581fb3c0b60d27 100644 (file)
 
 #include "pmc.h"
 
-#define PERIPHERAL_MAX         64
-#define PERIPHERAL_ID_MIN      2
-
-#define GENERATED_SOURCE_MAX   6
 #define GENERATED_MAX_DIV      255
 
-#define GCK_ID_SSC0            43
-#define GCK_ID_SSC1            44
-#define GCK_ID_I2S0            54
-#define GCK_ID_I2S1            55
-#define GCK_ID_CLASSD          59
 #define GCK_INDEX_DT_AUDIO_PLL 5
 
 struct clk_generated {
@@ -279,10 +270,10 @@ static void clk_generated_startup(struct clk_generated *gck)
                                        >> AT91_PMC_PCR_GCKDIV_OFFSET;
 }
 
-static struct clk_hw * __init
+struct clk_hw * __init
 at91_clk_register_generated(struct regmap *regmap, spinlock_t *lock,
                            const char *name, const char **parent_names,
-                           u8 num_parents, u8 id,
+                           u8 num_parents, u8 id, bool pll_audio,
                            const struct clk_range *range)
 {
        struct clk_generated *gck;
@@ -306,6 +297,7 @@ at91_clk_register_generated(struct regmap *regmap, spinlock_t *lock,
        gck->regmap = regmap;
        gck->lock = lock;
        gck->range = *range;
+       gck->audio_pll_allowed = pll_audio;
 
        clk_generated_startup(gck);
        hw = &gck->hw;
@@ -319,70 +311,3 @@ at91_clk_register_generated(struct regmap *regmap, spinlock_t *lock,
 
        return hw;
 }
-
-static void __init of_sama5d2_clk_generated_setup(struct device_node *np)
-{
-       int num;
-       u32 id;
-       const char *name;
-       struct clk_hw *hw;
-       unsigned int num_parents;
-       const char *parent_names[GENERATED_SOURCE_MAX];
-       struct device_node *gcknp;
-       struct clk_range range = CLK_RANGE(0, 0);
-       struct regmap *regmap;
-       struct clk_generated *gck;
-
-       num_parents = of_clk_get_parent_count(np);
-       if (num_parents == 0 || num_parents > GENERATED_SOURCE_MAX)
-               return;
-
-       of_clk_parent_fill(np, parent_names, num_parents);
-
-       num = of_get_child_count(np);
-       if (!num || num > PERIPHERAL_MAX)
-               return;
-
-       regmap = syscon_node_to_regmap(of_get_parent(np));
-       if (IS_ERR(regmap))
-               return;
-
-       for_each_child_of_node(np, gcknp) {
-               if (of_property_read_u32(gcknp, "reg", &id))
-                       continue;
-
-               if (id < PERIPHERAL_ID_MIN || id >= PERIPHERAL_MAX)
-                       continue;
-
-               if (of_property_read_string(np, "clock-output-names", &name))
-                       name = gcknp->name;
-
-               of_at91_get_clk_range(gcknp, "atmel,clk-output-range",
-                                     &range);
-
-               hw = at91_clk_register_generated(regmap, &pmc_pcr_lock, name,
-                                                 parent_names, num_parents,
-                                                 id, &range);
-
-               gck = to_clk_generated(hw);
-
-               if (of_device_is_compatible(np,
-                                           "atmel,sama5d2-clk-generated")) {
-                       if (gck->id == GCK_ID_SSC0 || gck->id == GCK_ID_SSC1 ||
-                           gck->id == GCK_ID_I2S0 || gck->id == GCK_ID_I2S1 ||
-                           gck->id == GCK_ID_CLASSD)
-                               gck->audio_pll_allowed = true;
-                       else
-                               gck->audio_pll_allowed = false;
-               } else {
-                       gck->audio_pll_allowed = false;
-               }
-
-               if (IS_ERR(hw))
-                       continue;
-
-               of_clk_add_hw_provider(gcknp, of_clk_hw_simple_get, hw);
-       }
-}
-CLK_OF_DECLARE(of_sama5d2_clk_generated_setup, "atmel,sama5d2-clk-generated",
-              of_sama5d2_clk_generated_setup);
index e0daa4a31f881c7b253a2bbc1e97e25f96c8219b..f0a2c6baab37312c365b424daf721e2ecb854c99 100644 (file)
@@ -86,25 +86,19 @@ static const struct clk_ops h32mx_ops = {
        .set_rate = clk_sama5d4_h32mx_set_rate,
 };
 
-static void __init of_sama5d4_clk_h32mx_setup(struct device_node *np)
+struct clk_hw * __init
+at91_clk_register_h32mx(struct regmap *regmap, const char *name,
+                       const char *parent_name)
 {
        struct clk_sama5d4_h32mx *h32mxclk;
        struct clk_init_data init;
-       const char *parent_name;
-       struct regmap *regmap;
        int ret;
 
-       regmap = syscon_node_to_regmap(of_get_parent(np));
-       if (IS_ERR(regmap))
-               return;
-
        h32mxclk = kzalloc(sizeof(*h32mxclk), GFP_KERNEL);
        if (!h32mxclk)
-               return;
-
-       parent_name = of_clk_get_parent_name(np, 0);
+               return ERR_PTR(-ENOMEM);
 
-       init.name = np->name;
+       init.name = name;
        init.ops = &h32mx_ops;
        init.parent_names = parent_name ? &parent_name : NULL;
        init.num_parents = parent_name ? 1 : 0;
@@ -116,10 +110,8 @@ static void __init of_sama5d4_clk_h32mx_setup(struct device_node *np)
        ret = clk_hw_register(NULL, &h32mxclk->hw);
        if (ret) {
                kfree(h32mxclk);
-               return;
+               return ERR_PTR(ret);
        }
 
-       of_clk_add_hw_provider(np, of_clk_hw_simple_get, &h32mxclk->hw);
+       return &h32mxclk->hw;
 }
-CLK_OF_DECLARE(of_sama5d4_clk_h32mx_setup, "atmel,sama5d4-clk-h32mx",
-              of_sama5d4_clk_h32mx_setup);
index f0c3c3079f042acec6c8ca84bdcb51449daa4252..fe6ce172b8b069a001c5f659a1adf05b418aca28 100644 (file)
@@ -14,7 +14,7 @@
 
 #include <soc/at91/atmel-sfr.h>
 
-#define        I2S_BUS_NR      2
+#include "pmc.h"
 
 struct clk_i2s_mux {
        struct clk_hw hw;
@@ -48,7 +48,7 @@ static const struct clk_ops clk_i2s_mux_ops = {
        .determine_rate = __clk_mux_determine_rate,
 };
 
-static struct clk_hw * __init
+struct clk_hw * __init
 at91_clk_i2s_mux_register(struct regmap *regmap, const char *name,
                          const char * const *parent_names,
                          unsigned int num_parents, u8 bus_id)
@@ -78,39 +78,3 @@ at91_clk_i2s_mux_register(struct regmap *regmap, const char *name,
 
        return &i2s_ck->hw;
 }
-
-static void __init of_sama5d2_clk_i2s_mux_setup(struct device_node *np)
-{
-       struct regmap *regmap_sfr;
-       u8 bus_id;
-       const char *parent_names[2];
-       struct device_node *i2s_mux_np;
-       struct clk_hw *hw;
-       int ret;
-
-       regmap_sfr = syscon_regmap_lookup_by_compatible("atmel,sama5d2-sfr");
-       if (IS_ERR(regmap_sfr))
-               return;
-
-       for_each_child_of_node(np, i2s_mux_np) {
-               if (of_property_read_u8(i2s_mux_np, "reg", &bus_id))
-                       continue;
-
-               if (bus_id > I2S_BUS_NR)
-                       continue;
-
-               ret = of_clk_parent_fill(i2s_mux_np, parent_names, 2);
-               if (ret != 2)
-                       continue;
-
-               hw = at91_clk_i2s_mux_register(regmap_sfr, i2s_mux_np->name,
-                                              parent_names, 2, bus_id);
-               if (IS_ERR(hw))
-                       continue;
-
-               of_clk_add_hw_provider(i2s_mux_np, of_clk_hw_simple_get, hw);
-       }
-}
-
-CLK_OF_DECLARE(sama5d2_clk_i2s_mux, "atmel,sama5d2-clk-i2s-mux",
-              of_sama5d2_clk_i2s_mux_setup);
index c813c27f2e58c6f8e62c523a1a9a8b1d212a96d8..7ac0facdb28b1b0e76f476da9e7faf54997bae33 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/clkdev.h>
 #include <linux/clk/at91_pmc.h>
 #include <linux/delay.h>
-#include <linux/of.h>
 #include <linux/mfd/syscon.h>
 #include <linux/regmap.h>
 
@@ -128,7 +127,7 @@ static const struct clk_ops main_osc_ops = {
        .is_prepared = clk_main_osc_is_prepared,
 };
 
-static struct clk_hw * __init
+struct clk_hw * __init
 at91_clk_register_main_osc(struct regmap *regmap,
                           const char *name,
                           const char *parent_name,
@@ -171,31 +170,6 @@ at91_clk_register_main_osc(struct regmap *regmap,
        return hw;
 }
 
-static void __init of_at91rm9200_clk_main_osc_setup(struct device_node *np)
-{
-       struct clk_hw *hw;
-       const char *name = np->name;
-       const char *parent_name;
-       struct regmap *regmap;
-       bool bypass;
-
-       of_property_read_string(np, "clock-output-names", &name);
-       bypass = of_property_read_bool(np, "atmel,osc-bypass");
-       parent_name = of_clk_get_parent_name(np, 0);
-
-       regmap = syscon_node_to_regmap(of_get_parent(np));
-       if (IS_ERR(regmap))
-               return;
-
-       hw = at91_clk_register_main_osc(regmap, name, parent_name, bypass);
-       if (IS_ERR(hw))
-               return;
-
-       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
-}
-CLK_OF_DECLARE(at91rm9200_clk_main_osc, "atmel,at91rm9200-clk-main-osc",
-              of_at91rm9200_clk_main_osc_setup);
-
 static bool clk_main_rc_osc_ready(struct regmap *regmap)
 {
        unsigned int status;
@@ -275,7 +249,7 @@ static const struct clk_ops main_rc_osc_ops = {
        .recalc_accuracy = clk_main_rc_osc_recalc_accuracy,
 };
 
-static struct clk_hw * __init
+struct clk_hw * __init
 at91_clk_register_main_rc_osc(struct regmap *regmap,
                              const char *name,
                              u32 frequency, u32 accuracy)
@@ -313,32 +287,6 @@ at91_clk_register_main_rc_osc(struct regmap *regmap,
        return hw;
 }
 
-static void __init of_at91sam9x5_clk_main_rc_osc_setup(struct device_node *np)
-{
-       struct clk_hw *hw;
-       u32 frequency = 0;
-       u32 accuracy = 0;
-       const char *name = np->name;
-       struct regmap *regmap;
-
-       of_property_read_string(np, "clock-output-names", &name);
-       of_property_read_u32(np, "clock-frequency", &frequency);
-       of_property_read_u32(np, "clock-accuracy", &accuracy);
-
-       regmap = syscon_node_to_regmap(of_get_parent(np));
-       if (IS_ERR(regmap))
-               return;
-
-       hw = at91_clk_register_main_rc_osc(regmap, name, frequency, accuracy);
-       if (IS_ERR(hw))
-               return;
-
-       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
-}
-CLK_OF_DECLARE(at91sam9x5_clk_main_rc_osc, "atmel,at91sam9x5-clk-main-rc-osc",
-              of_at91sam9x5_clk_main_rc_osc_setup);
-
-
 static int clk_main_probe_frequency(struct regmap *regmap)
 {
        unsigned long prep_time, timeout;
@@ -403,7 +351,7 @@ static const struct clk_ops rm9200_main_ops = {
        .recalc_rate = clk_rm9200_main_recalc_rate,
 };
 
-static struct clk_hw * __init
+struct clk_hw * __init
 at91_clk_register_rm9200_main(struct regmap *regmap,
                              const char *name,
                              const char *parent_name)
@@ -442,29 +390,6 @@ at91_clk_register_rm9200_main(struct regmap *regmap,
        return hw;
 }
 
-static void __init of_at91rm9200_clk_main_setup(struct device_node *np)
-{
-       struct clk_hw *hw;
-       const char *parent_name;
-       const char *name = np->name;
-       struct regmap *regmap;
-
-       parent_name = of_clk_get_parent_name(np, 0);
-       of_property_read_string(np, "clock-output-names", &name);
-
-       regmap = syscon_node_to_regmap(of_get_parent(np));
-       if (IS_ERR(regmap))
-               return;
-
-       hw = at91_clk_register_rm9200_main(regmap, name, parent_name);
-       if (IS_ERR(hw))
-               return;
-
-       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
-}
-CLK_OF_DECLARE(at91rm9200_clk_main, "atmel,at91rm9200-clk-main",
-              of_at91rm9200_clk_main_setup);
-
 static inline bool clk_sam9x5_main_ready(struct regmap *regmap)
 {
        unsigned int status;
@@ -541,7 +466,7 @@ static const struct clk_ops sam9x5_main_ops = {
        .get_parent = clk_sam9x5_main_get_parent,
 };
 
-static struct clk_hw * __init
+struct clk_hw * __init
 at91_clk_register_sam9x5_main(struct regmap *regmap,
                              const char *name,
                              const char **parent_names,
@@ -583,32 +508,3 @@ at91_clk_register_sam9x5_main(struct regmap *regmap,
 
        return hw;
 }
-
-static void __init of_at91sam9x5_clk_main_setup(struct device_node *np)
-{
-       struct clk_hw *hw;
-       const char *parent_names[2];
-       unsigned int num_parents;
-       const char *name = np->name;
-       struct regmap *regmap;
-
-       num_parents = of_clk_get_parent_count(np);
-       if (num_parents == 0 || num_parents > 2)
-               return;
-
-       of_clk_parent_fill(np, parent_names, num_parents);
-       regmap = syscon_node_to_regmap(of_get_parent(np));
-       if (IS_ERR(regmap))
-               return;
-
-       of_property_read_string(np, "clock-output-names", &name);
-
-       hw = at91_clk_register_sam9x5_main(regmap, name, parent_names,
-                                           num_parents);
-       if (IS_ERR(hw))
-               return;
-
-       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
-}
-CLK_OF_DECLARE(at91sam9x5_clk_main, "atmel,at91sam9x5-clk-main",
-              of_at91sam9x5_clk_main_setup);
index e9cba9fc26d706181ea0e73406cd8e60997fde82..eb53b4a8fab635476d6f84449ca7696d006a464a 100644 (file)
 
 #include "pmc.h"
 
-#define MASTER_SOURCE_MAX      4
-
 #define MASTER_PRES_MASK       0x7
 #define MASTER_PRES_MAX                MASTER_PRES_MASK
 #define MASTER_DIV_SHIFT       8
 #define MASTER_DIV_MASK                0x3
 
-struct clk_master_characteristics {
-       struct clk_range output;
-       u32 divisors[4];
-       u8 have_div3_pres;
-};
-
-struct clk_master_layout {
-       u32 mask;
-       u8 pres_shift;
-};
-
 #define to_clk_master(hw) container_of(hw, struct clk_master, hw)
 
 struct clk_master {
@@ -120,7 +107,7 @@ static const struct clk_ops master_ops = {
        .get_parent = clk_master_get_parent,
 };
 
-static struct clk_hw * __init
+struct clk_hw * __init
 at91_clk_register_master(struct regmap *regmap,
                const char *name, int num_parents,
                const char **parent_names,
@@ -161,92 +148,12 @@ at91_clk_register_master(struct regmap *regmap,
 }
 
 
-static const struct clk_master_layout at91rm9200_master_layout = {
+const struct clk_master_layout at91rm9200_master_layout = {
        .mask = 0x31F,
        .pres_shift = 2,
 };
 
-static const struct clk_master_layout at91sam9x5_master_layout = {
+const struct clk_master_layout at91sam9x5_master_layout = {
        .mask = 0x373,
        .pres_shift = 4,
 };
-
-
-static struct clk_master_characteristics * __init
-of_at91_clk_master_get_characteristics(struct device_node *np)
-{
-       struct clk_master_characteristics *characteristics;
-
-       characteristics = kzalloc(sizeof(*characteristics), GFP_KERNEL);
-       if (!characteristics)
-               return NULL;
-
-       if (of_at91_get_clk_range(np, "atmel,clk-output-range", &characteristics->output))
-               goto out_free_characteristics;
-
-       of_property_read_u32_array(np, "atmel,clk-divisors",
-                                  characteristics->divisors, 4);
-
-       characteristics->have_div3_pres =
-               of_property_read_bool(np, "atmel,master-clk-have-div3-pres");
-
-       return characteristics;
-
-out_free_characteristics:
-       kfree(characteristics);
-       return NULL;
-}
-
-static void __init
-of_at91_clk_master_setup(struct device_node *np,
-                        const struct clk_master_layout *layout)
-{
-       struct clk_hw *hw;
-       unsigned int num_parents;
-       const char *parent_names[MASTER_SOURCE_MAX];
-       const char *name = np->name;
-       struct clk_master_characteristics *characteristics;
-       struct regmap *regmap;
-
-       num_parents = of_clk_get_parent_count(np);
-       if (num_parents == 0 || num_parents > MASTER_SOURCE_MAX)
-               return;
-
-       of_clk_parent_fill(np, parent_names, num_parents);
-
-       of_property_read_string(np, "clock-output-names", &name);
-
-       characteristics = of_at91_clk_master_get_characteristics(np);
-       if (!characteristics)
-               return;
-
-       regmap = syscon_node_to_regmap(of_get_parent(np));
-       if (IS_ERR(regmap))
-               return;
-
-       hw = at91_clk_register_master(regmap, name, num_parents,
-                                      parent_names, layout,
-                                      characteristics);
-       if (IS_ERR(hw))
-               goto out_free_characteristics;
-
-       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
-       return;
-
-out_free_characteristics:
-       kfree(characteristics);
-}
-
-static void __init of_at91rm9200_clk_master_setup(struct device_node *np)
-{
-       of_at91_clk_master_setup(np, &at91rm9200_master_layout);
-}
-CLK_OF_DECLARE(at91rm9200_clk_master, "atmel,at91rm9200-clk-master",
-              of_at91rm9200_clk_master_setup);
-
-static void __init of_at91sam9x5_clk_master_setup(struct device_node *np)
-{
-       of_at91_clk_master_setup(np, &at91sam9x5_master_layout);
-}
-CLK_OF_DECLARE(at91sam9x5_clk_master, "atmel,at91sam9x5-clk-master",
-              of_at91sam9x5_clk_master_setup);
index 7701183692308e8870a669658e8c24b4d14700e4..65c1defa78e4a136c1ddcd0f04d8e2c5882b6811 100644 (file)
 
 DEFINE_SPINLOCK(pmc_pcr_lock);
 
-#define PERIPHERAL_MAX         64
-
-#define PERIPHERAL_AT91RM9200  0
-#define PERIPHERAL_AT91SAM9X5  1
-
 #define PERIPHERAL_ID_MIN      2
 #define PERIPHERAL_ID_MAX      31
 #define PERIPHERAL_MASK(id)    (1 << ((id) & PERIPHERAL_ID_MAX))
@@ -104,7 +99,7 @@ static const struct clk_ops peripheral_ops = {
        .is_enabled = clk_peripheral_is_enabled,
 };
 
-static struct clk_hw * __init
+struct clk_hw * __init
 at91_clk_register_peripheral(struct regmap *regmap, const char *name,
                             const char *parent_name, u32 id)
 {
@@ -331,7 +326,7 @@ static const struct clk_ops sam9x5_peripheral_ops = {
        .set_rate = clk_sam9x5_peripheral_set_rate,
 };
 
-static struct clk_hw * __init
+struct clk_hw * __init
 at91_clk_register_sam9x5_peripheral(struct regmap *regmap, spinlock_t *lock,
                                    const char *name, const char *parent_name,
                                    u32 id, const struct clk_range *range)
@@ -374,75 +369,3 @@ at91_clk_register_sam9x5_peripheral(struct regmap *regmap, spinlock_t *lock,
 
        return hw;
 }
-
-static void __init
-of_at91_clk_periph_setup(struct device_node *np, u8 type)
-{
-       int num;
-       u32 id;
-       struct clk_hw *hw;
-       const char *parent_name;
-       const char *name;
-       struct device_node *periphclknp;
-       struct regmap *regmap;
-
-       parent_name = of_clk_get_parent_name(np, 0);
-       if (!parent_name)
-               return;
-
-       num = of_get_child_count(np);
-       if (!num || num > PERIPHERAL_MAX)
-               return;
-
-       regmap = syscon_node_to_regmap(of_get_parent(np));
-       if (IS_ERR(regmap))
-               return;
-
-       for_each_child_of_node(np, periphclknp) {
-               if (of_property_read_u32(periphclknp, "reg", &id))
-                       continue;
-
-               if (id >= PERIPHERAL_MAX)
-                       continue;
-
-               if (of_property_read_string(np, "clock-output-names", &name))
-                       name = periphclknp->name;
-
-               if (type == PERIPHERAL_AT91RM9200) {
-                       hw = at91_clk_register_peripheral(regmap, name,
-                                                          parent_name, id);
-               } else {
-                       struct clk_range range = CLK_RANGE(0, 0);
-
-                       of_at91_get_clk_range(periphclknp,
-                                             "atmel,clk-output-range",
-                                             &range);
-
-                       hw = at91_clk_register_sam9x5_peripheral(regmap,
-                                                                 &pmc_pcr_lock,
-                                                                 name,
-                                                                 parent_name,
-                                                                 id, &range);
-               }
-
-               if (IS_ERR(hw))
-                       continue;
-
-               of_clk_add_hw_provider(periphclknp, of_clk_hw_simple_get, hw);
-       }
-}
-
-static void __init of_at91rm9200_clk_periph_setup(struct device_node *np)
-{
-       of_at91_clk_periph_setup(np, PERIPHERAL_AT91RM9200);
-}
-CLK_OF_DECLARE(at91rm9200_clk_periph, "atmel,at91rm9200-clk-peripheral",
-              of_at91rm9200_clk_periph_setup);
-
-static void __init of_at91sam9x5_clk_periph_setup(struct device_node *np)
-{
-       of_at91_clk_periph_setup(np, PERIPHERAL_AT91SAM9X5);
-}
-CLK_OF_DECLARE(at91sam9x5_clk_periph, "atmel,at91sam9x5-clk-peripheral",
-              of_at91sam9x5_clk_periph_setup);
-
index 72b6091eb7b944f50b6a2e3d9ceafa8077a851d2..b4138fcacf495156a5a14d684cc2e66309b9be6f 100644 (file)
 #define PLL_OUT_SHIFT          14
 #define PLL_MAX_ID             1
 
-struct clk_pll_characteristics {
-       struct clk_range input;
-       int num_output;
-       struct clk_range *output;
-       u16 *icpll;
-       u8 *out;
-};
-
-struct clk_pll_layout {
-       u32 pllr_mask;
-       u16 mul_mask;
-       u8 mul_shift;
-};
-
 #define to_clk_pll(hw) container_of(hw, struct clk_pll, hw)
 
 struct clk_pll {
@@ -133,6 +119,9 @@ static unsigned long clk_pll_recalc_rate(struct clk_hw *hw,
 {
        struct clk_pll *pll = to_clk_pll(hw);
 
+       if (!pll->div || !pll->mul)
+               return 0;
+
        return (parent_rate / pll->div) * (pll->mul + 1);
 }
 
@@ -285,7 +274,7 @@ static const struct clk_ops pll_ops = {
        .set_rate = clk_pll_set_rate,
 };
 
-static struct clk_hw * __init
+struct clk_hw * __init
 at91_clk_register_pll(struct regmap *regmap, const char *name,
                      const char *parent_name, u8 id,
                      const struct clk_pll_layout *layout,
@@ -331,189 +320,26 @@ at91_clk_register_pll(struct regmap *regmap, const char *name,
 }
 
 
-static const struct clk_pll_layout at91rm9200_pll_layout = {
+const struct clk_pll_layout at91rm9200_pll_layout = {
        .pllr_mask = 0x7FFFFFF,
        .mul_shift = 16,
        .mul_mask = 0x7FF,
 };
 
-static const struct clk_pll_layout at91sam9g45_pll_layout = {
+const struct clk_pll_layout at91sam9g45_pll_layout = {
        .pllr_mask = 0xFFFFFF,
        .mul_shift = 16,
        .mul_mask = 0xFF,
 };
 
-static const struct clk_pll_layout at91sam9g20_pllb_layout = {
+const struct clk_pll_layout at91sam9g20_pllb_layout = {
        .pllr_mask = 0x3FFFFF,
        .mul_shift = 16,
        .mul_mask = 0x3F,
 };
 
-static const struct clk_pll_layout sama5d3_pll_layout = {
+const struct clk_pll_layout sama5d3_pll_layout = {
        .pllr_mask = 0x1FFFFFF,
        .mul_shift = 18,
        .mul_mask = 0x7F,
 };
-
-
-static struct clk_pll_characteristics * __init
-of_at91_clk_pll_get_characteristics(struct device_node *np)
-{
-       int i;
-       int offset;
-       u32 tmp;
-       int num_output;
-       u32 num_cells;
-       struct clk_range input;
-       struct clk_range *output;
-       u8 *out = NULL;
-       u16 *icpll = NULL;
-       struct clk_pll_characteristics *characteristics;
-
-       if (of_at91_get_clk_range(np, "atmel,clk-input-range", &input))
-               return NULL;
-
-       if (of_property_read_u32(np, "#atmel,pll-clk-output-range-cells",
-                                &num_cells))
-               return NULL;
-
-       if (num_cells < 2 || num_cells > 4)
-               return NULL;
-
-       if (!of_get_property(np, "atmel,pll-clk-output-ranges", &tmp))
-               return NULL;
-       num_output = tmp / (sizeof(u32) * num_cells);
-
-       characteristics = kzalloc(sizeof(*characteristics), GFP_KERNEL);
-       if (!characteristics)
-               return NULL;
-
-       output = kcalloc(num_output, sizeof(*output), GFP_KERNEL);
-       if (!output)
-               goto out_free_characteristics;
-
-       if (num_cells > 2) {
-               out = kcalloc(num_output, sizeof(*out), GFP_KERNEL);
-               if (!out)
-                       goto out_free_output;
-       }
-
-       if (num_cells > 3) {
-               icpll = kcalloc(num_output, sizeof(*icpll), GFP_KERNEL);
-               if (!icpll)
-                       goto out_free_output;
-       }
-
-       for (i = 0; i < num_output; i++) {
-               offset = i * num_cells;
-               if (of_property_read_u32_index(np,
-                                              "atmel,pll-clk-output-ranges",
-                                              offset, &tmp))
-                       goto out_free_output;
-               output[i].min = tmp;
-               if (of_property_read_u32_index(np,
-                                              "atmel,pll-clk-output-ranges",
-                                              offset + 1, &tmp))
-                       goto out_free_output;
-               output[i].max = tmp;
-
-               if (num_cells == 2)
-                       continue;
-
-               if (of_property_read_u32_index(np,
-                                              "atmel,pll-clk-output-ranges",
-                                              offset + 2, &tmp))
-                       goto out_free_output;
-               out[i] = tmp;
-
-               if (num_cells == 3)
-                       continue;
-
-               if (of_property_read_u32_index(np,
-                                              "atmel,pll-clk-output-ranges",
-                                              offset + 3, &tmp))
-                       goto out_free_output;
-               icpll[i] = tmp;
-       }
-
-       characteristics->input = input;
-       characteristics->num_output = num_output;
-       characteristics->output = output;
-       characteristics->out = out;
-       characteristics->icpll = icpll;
-       return characteristics;
-
-out_free_output:
-       kfree(icpll);
-       kfree(out);
-       kfree(output);
-out_free_characteristics:
-       kfree(characteristics);
-       return NULL;
-}
-
-static void __init
-of_at91_clk_pll_setup(struct device_node *np,
-                     const struct clk_pll_layout *layout)
-{
-       u32 id;
-       struct clk_hw *hw;
-       struct regmap *regmap;
-       const char *parent_name;
-       const char *name = np->name;
-       struct clk_pll_characteristics *characteristics;
-
-       if (of_property_read_u32(np, "reg", &id))
-               return;
-
-       parent_name = of_clk_get_parent_name(np, 0);
-
-       of_property_read_string(np, "clock-output-names", &name);
-
-       regmap = syscon_node_to_regmap(of_get_parent(np));
-       if (IS_ERR(regmap))
-               return;
-
-       characteristics = of_at91_clk_pll_get_characteristics(np);
-       if (!characteristics)
-               return;
-
-       hw = at91_clk_register_pll(regmap, name, parent_name, id, layout,
-                                   characteristics);
-       if (IS_ERR(hw))
-               goto out_free_characteristics;
-
-       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
-       return;
-
-out_free_characteristics:
-       kfree(characteristics);
-}
-
-static void __init of_at91rm9200_clk_pll_setup(struct device_node *np)
-{
-       of_at91_clk_pll_setup(np, &at91rm9200_pll_layout);
-}
-CLK_OF_DECLARE(at91rm9200_clk_pll, "atmel,at91rm9200-clk-pll",
-              of_at91rm9200_clk_pll_setup);
-
-static void __init of_at91sam9g45_clk_pll_setup(struct device_node *np)
-{
-       of_at91_clk_pll_setup(np, &at91sam9g45_pll_layout);
-}
-CLK_OF_DECLARE(at91sam9g45_clk_pll, "atmel,at91sam9g45-clk-pll",
-              of_at91sam9g45_clk_pll_setup);
-
-static void __init of_at91sam9g20_clk_pllb_setup(struct device_node *np)
-{
-       of_at91_clk_pll_setup(np, &at91sam9g20_pllb_layout);
-}
-CLK_OF_DECLARE(at91sam9g20_clk_pllb, "atmel,at91sam9g20-clk-pllb",
-              of_at91sam9g20_clk_pllb_setup);
-
-static void __init of_sama5d3_clk_pll_setup(struct device_node *np)
-{
-       of_at91_clk_pll_setup(np, &sama5d3_pll_layout);
-}
-CLK_OF_DECLARE(sama5d3_clk_pll, "atmel,sama5d3-clk-pll",
-              of_sama5d3_clk_pll_setup);
index b4afaf22f3fdc93277582746976b4d3ff0af5267..e8c4f8b02f28085a11fb215d3a39f0429e5f4fdc 100644 (file)
@@ -75,7 +75,7 @@ static const struct clk_ops plldiv_ops = {
        .set_rate = clk_plldiv_set_rate,
 };
 
-static struct clk_hw * __init
+struct clk_hw * __init
 at91_clk_register_plldiv(struct regmap *regmap, const char *name,
                         const char *parent_name)
 {
@@ -106,28 +106,3 @@ at91_clk_register_plldiv(struct regmap *regmap, const char *name,
 
        return hw;
 }
-
-static void __init
-of_at91sam9x5_clk_plldiv_setup(struct device_node *np)
-{
-       struct clk_hw *hw;
-       const char *parent_name;
-       const char *name = np->name;
-       struct regmap *regmap;
-
-       parent_name = of_clk_get_parent_name(np, 0);
-
-       of_property_read_string(np, "clock-output-names", &name);
-
-       regmap = syscon_node_to_regmap(of_get_parent(np));
-       if (IS_ERR(regmap))
-               return;
-
-       hw = at91_clk_register_plldiv(regmap, name, parent_name);
-       if (IS_ERR(hw))
-               return;
-
-       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
-}
-CLK_OF_DECLARE(at91sam9x5_clk_plldiv, "atmel,at91sam9x5-clk-plldiv",
-              of_at91sam9x5_clk_plldiv_setup);
index 0e6aab1252fc40dc6a4896abe875f51d9c9b8eb6..5bc68b9c5498496b6f6af33ad87422804dd62ef4 100644 (file)
@@ -17,7 +17,6 @@
 
 #include "pmc.h"
 
-#define PROG_SOURCE_MAX                5
 #define PROG_ID_MAX            7
 
 #define PROG_STATUS_MASK(id)   (1 << ((id) + 8))
 #define PROG_PRES(layout, pckr)        ((pckr >> layout->pres_shift) & PROG_PRES_MASK)
 #define PROG_MAX_RM9200_CSS    3
 
-struct clk_programmable_layout {
-       u8 pres_shift;
-       u8 css_mask;
-       u8 have_slck_mck;
-};
-
 struct clk_programmable {
        struct clk_hw hw;
        struct regmap *regmap;
@@ -170,7 +163,7 @@ static const struct clk_ops programmable_ops = {
        .set_rate = clk_programmable_set_rate,
 };
 
-static struct clk_hw * __init
+struct clk_hw * __init
 at91_clk_register_programmable(struct regmap *regmap,
                               const char *name, const char **parent_names,
                               u8 num_parents, u8 id,
@@ -211,86 +204,20 @@ at91_clk_register_programmable(struct regmap *regmap,
        return hw;
 }
 
-static const struct clk_programmable_layout at91rm9200_programmable_layout = {
+const struct clk_programmable_layout at91rm9200_programmable_layout = {
        .pres_shift = 2,
        .css_mask = 0x3,
        .have_slck_mck = 0,
 };
 
-static const struct clk_programmable_layout at91sam9g45_programmable_layout = {
+const struct clk_programmable_layout at91sam9g45_programmable_layout = {
        .pres_shift = 2,
        .css_mask = 0x3,
        .have_slck_mck = 1,
 };
 
-static const struct clk_programmable_layout at91sam9x5_programmable_layout = {
+const struct clk_programmable_layout at91sam9x5_programmable_layout = {
        .pres_shift = 4,
        .css_mask = 0x7,
        .have_slck_mck = 0,
 };
-
-static void __init
-of_at91_clk_prog_setup(struct device_node *np,
-                      const struct clk_programmable_layout *layout)
-{
-       int num;
-       u32 id;
-       struct clk_hw *hw;
-       unsigned int num_parents;
-       const char *parent_names[PROG_SOURCE_MAX];
-       const char *name;
-       struct device_node *progclknp;
-       struct regmap *regmap;
-
-       num_parents = of_clk_get_parent_count(np);
-       if (num_parents == 0 || num_parents > PROG_SOURCE_MAX)
-               return;
-
-       of_clk_parent_fill(np, parent_names, num_parents);
-
-       num = of_get_child_count(np);
-       if (!num || num > (PROG_ID_MAX + 1))
-               return;
-
-       regmap = syscon_node_to_regmap(of_get_parent(np));
-       if (IS_ERR(regmap))
-               return;
-
-       for_each_child_of_node(np, progclknp) {
-               if (of_property_read_u32(progclknp, "reg", &id))
-                       continue;
-
-               if (of_property_read_string(np, "clock-output-names", &name))
-                       name = progclknp->name;
-
-               hw = at91_clk_register_programmable(regmap, name,
-                                                    parent_names, num_parents,
-                                                    id, layout);
-               if (IS_ERR(hw))
-                       continue;
-
-               of_clk_add_hw_provider(progclknp, of_clk_hw_simple_get, hw);
-       }
-}
-
-
-static void __init of_at91rm9200_clk_prog_setup(struct device_node *np)
-{
-       of_at91_clk_prog_setup(np, &at91rm9200_programmable_layout);
-}
-CLK_OF_DECLARE(at91rm9200_clk_prog, "atmel,at91rm9200-clk-programmable",
-              of_at91rm9200_clk_prog_setup);
-
-static void __init of_at91sam9g45_clk_prog_setup(struct device_node *np)
-{
-       of_at91_clk_prog_setup(np, &at91sam9g45_programmable_layout);
-}
-CLK_OF_DECLARE(at91sam9g45_clk_prog, "atmel,at91sam9g45-clk-programmable",
-              of_at91sam9g45_clk_prog_setup);
-
-static void __init of_at91sam9x5_clk_prog_setup(struct device_node *np)
-{
-       of_at91_clk_prog_setup(np, &at91sam9x5_programmable_layout);
-}
-CLK_OF_DECLARE(at91sam9x5_clk_prog, "atmel,at91sam9x5-clk-programmable",
-              of_at91sam9x5_clk_prog_setup);
index 560a8b9abf9312bd921311bcf88d121727750c83..cbb146912f7af0b542bb836398b5f7b1d6eafd6f 100644 (file)
@@ -40,7 +40,7 @@ static const struct clk_ops sam9260_slow_ops = {
        .get_parent = clk_sam9260_slow_get_parent,
 };
 
-static struct clk_hw * __init
+struct clk_hw * __init
 at91_clk_register_sam9260_slow(struct regmap *regmap,
                               const char *name,
                               const char **parent_names,
@@ -79,33 +79,3 @@ at91_clk_register_sam9260_slow(struct regmap *regmap,
 
        return hw;
 }
-
-static void __init of_at91sam9260_clk_slow_setup(struct device_node *np)
-{
-       struct clk_hw *hw;
-       const char *parent_names[2];
-       unsigned int num_parents;
-       const char *name = np->name;
-       struct regmap *regmap;
-
-       num_parents = of_clk_get_parent_count(np);
-       if (num_parents != 2)
-               return;
-
-       of_clk_parent_fill(np, parent_names, num_parents);
-       regmap = syscon_node_to_regmap(of_get_parent(np));
-       if (IS_ERR(regmap))
-               return;
-
-       of_property_read_string(np, "clock-output-names", &name);
-
-       hw = at91_clk_register_sam9260_slow(regmap, name, parent_names,
-                                            num_parents);
-       if (IS_ERR(hw))
-               return;
-
-       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
-}
-
-CLK_OF_DECLARE(at91sam9260_clk_slow, "atmel,at91sam9260-clk-slow",
-              of_at91sam9260_clk_slow_setup);
index 965c662b90a5ab6f3dfdcd5b4cd2382d79f4422e..75679fd8a9c742e387103296c9e8ee3fd6418881 100644 (file)
@@ -17,8 +17,6 @@
 
 #include "pmc.h"
 
-#define SMD_SOURCE_MAX         2
-
 #define SMD_DIV_SHIFT          8
 #define SMD_MAX_DIV            0xf
 
@@ -111,7 +109,7 @@ static const struct clk_ops at91sam9x5_smd_ops = {
        .set_rate = at91sam9x5_clk_smd_set_rate,
 };
 
-static struct clk_hw * __init
+struct clk_hw * __init
 at91sam9x5_clk_register_smd(struct regmap *regmap, const char *name,
                            const char **parent_names, u8 num_parents)
 {
@@ -142,33 +140,3 @@ at91sam9x5_clk_register_smd(struct regmap *regmap, const char *name,
 
        return hw;
 }
-
-static void __init of_at91sam9x5_clk_smd_setup(struct device_node *np)
-{
-       struct clk_hw *hw;
-       unsigned int num_parents;
-       const char *parent_names[SMD_SOURCE_MAX];
-       const char *name = np->name;
-       struct regmap *regmap;
-
-       num_parents = of_clk_get_parent_count(np);
-       if (num_parents == 0 || num_parents > SMD_SOURCE_MAX)
-               return;
-
-       of_clk_parent_fill(np, parent_names, num_parents);
-
-       of_property_read_string(np, "clock-output-names", &name);
-
-       regmap = syscon_node_to_regmap(of_get_parent(np));
-       if (IS_ERR(regmap))
-               return;
-
-       hw = at91sam9x5_clk_register_smd(regmap, name, parent_names,
-                                         num_parents);
-       if (IS_ERR(hw))
-               return;
-
-       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
-}
-CLK_OF_DECLARE(at91sam9x5_clk_smd, "atmel,at91sam9x5-clk-smd",
-              of_at91sam9x5_clk_smd_setup);
index 86a36809765de84c94b9e29e55e129b2905b65ae..47bfca93340320130ca50386764bce6e975ea2cf 100644 (file)
@@ -88,7 +88,7 @@ static const struct clk_ops system_ops = {
        .is_prepared = clk_system_is_prepared,
 };
 
-static struct clk_hw * __init
+struct clk_hw * __init
 at91_clk_register_system(struct regmap *regmap, const char *name,
                         const char *parent_name, u8 id)
 {
@@ -123,40 +123,3 @@ at91_clk_register_system(struct regmap *regmap, const char *name,
 
        return hw;
 }
-
-static void __init of_at91rm9200_clk_sys_setup(struct device_node *np)
-{
-       int num;
-       u32 id;
-       struct clk_hw *hw;
-       const char *name;
-       struct device_node *sysclknp;
-       const char *parent_name;
-       struct regmap *regmap;
-
-       num = of_get_child_count(np);
-       if (num > (SYSTEM_MAX_ID + 1))
-               return;
-
-       regmap = syscon_node_to_regmap(of_get_parent(np));
-       if (IS_ERR(regmap))
-               return;
-
-       for_each_child_of_node(np, sysclknp) {
-               if (of_property_read_u32(sysclknp, "reg", &id))
-                       continue;
-
-               if (of_property_read_string(np, "clock-output-names", &name))
-                       name = sysclknp->name;
-
-               parent_name = of_clk_get_parent_name(sysclknp, 0);
-
-               hw = at91_clk_register_system(regmap, name, parent_name, id);
-               if (IS_ERR(hw))
-                       continue;
-
-               of_clk_add_hw_provider(sysclknp, of_clk_hw_simple_get, hw);
-       }
-}
-CLK_OF_DECLARE(at91rm9200_clk_sys, "atmel,at91rm9200-clk-system",
-              of_at91rm9200_clk_sys_setup);
index 791770a563fcce83d5538a52b5cc86bcc7a925c7..79ee1c760f2a5ba41a7cfaf3a7d748b30ef11f8c 100644 (file)
@@ -17,8 +17,6 @@
 
 #include "pmc.h"
 
-#define USB_SOURCE_MAX         2
-
 #define SAM9X5_USB_DIV_SHIFT   8
 #define SAM9X5_USB_MAX_DIV     0xf
 
@@ -192,7 +190,7 @@ static const struct clk_ops at91sam9n12_usb_ops = {
        .set_rate = at91sam9x5_clk_usb_set_rate,
 };
 
-static struct clk_hw * __init
+struct clk_hw * __init
 at91sam9x5_clk_register_usb(struct regmap *regmap, const char *name,
                            const char **parent_names, u8 num_parents)
 {
@@ -225,7 +223,7 @@ at91sam9x5_clk_register_usb(struct regmap *regmap, const char *name,
        return hw;
 }
 
-static struct clk_hw * __init
+struct clk_hw * __init
 at91sam9n12_clk_register_usb(struct regmap *regmap, const char *name,
                             const char *parent_name)
 {
@@ -342,7 +340,7 @@ static const struct clk_ops at91rm9200_usb_ops = {
        .set_rate = at91rm9200_clk_usb_set_rate,
 };
 
-static struct clk_hw * __init
+struct clk_hw * __init
 at91rm9200_clk_register_usb(struct regmap *regmap, const char *name,
                            const char *parent_name, const u32 *divisors)
 {
@@ -374,89 +372,3 @@ at91rm9200_clk_register_usb(struct regmap *regmap, const char *name,
 
        return hw;
 }
-
-static void __init of_at91sam9x5_clk_usb_setup(struct device_node *np)
-{
-       struct clk_hw *hw;
-       unsigned int num_parents;
-       const char *parent_names[USB_SOURCE_MAX];
-       const char *name = np->name;
-       struct regmap *regmap;
-
-       num_parents = of_clk_get_parent_count(np);
-       if (num_parents == 0 || num_parents > USB_SOURCE_MAX)
-               return;
-
-       of_clk_parent_fill(np, parent_names, num_parents);
-
-       of_property_read_string(np, "clock-output-names", &name);
-
-       regmap = syscon_node_to_regmap(of_get_parent(np));
-       if (IS_ERR(regmap))
-               return;
-
-       hw = at91sam9x5_clk_register_usb(regmap, name, parent_names,
-                                        num_parents);
-       if (IS_ERR(hw))
-               return;
-
-       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
-}
-CLK_OF_DECLARE(at91sam9x5_clk_usb, "atmel,at91sam9x5-clk-usb",
-              of_at91sam9x5_clk_usb_setup);
-
-static void __init of_at91sam9n12_clk_usb_setup(struct device_node *np)
-{
-       struct clk_hw *hw;
-       const char *parent_name;
-       const char *name = np->name;
-       struct regmap *regmap;
-
-       parent_name = of_clk_get_parent_name(np, 0);
-       if (!parent_name)
-               return;
-
-       of_property_read_string(np, "clock-output-names", &name);
-
-       regmap = syscon_node_to_regmap(of_get_parent(np));
-       if (IS_ERR(regmap))
-               return;
-
-       hw = at91sam9n12_clk_register_usb(regmap, name, parent_name);
-       if (IS_ERR(hw))
-               return;
-
-       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
-}
-CLK_OF_DECLARE(at91sam9n12_clk_usb, "atmel,at91sam9n12-clk-usb",
-              of_at91sam9n12_clk_usb_setup);
-
-static void __init of_at91rm9200_clk_usb_setup(struct device_node *np)
-{
-       struct clk_hw *hw;
-       const char *parent_name;
-       const char *name = np->name;
-       u32 divisors[4] = {0, 0, 0, 0};
-       struct regmap *regmap;
-
-       parent_name = of_clk_get_parent_name(np, 0);
-       if (!parent_name)
-               return;
-
-       of_property_read_u32_array(np, "atmel,clk-divisors", divisors, 4);
-       if (!divisors[0])
-               return;
-
-       of_property_read_string(np, "clock-output-names", &name);
-
-       regmap = syscon_node_to_regmap(of_get_parent(np));
-       if (IS_ERR(regmap))
-               return;
-       hw = at91rm9200_clk_register_usb(regmap, name, parent_name, divisors);
-       if (IS_ERR(hw))
-               return;
-
-       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
-}
-CLK_OF_DECLARE(at91rm9200_clk_usb, "atmel,at91rm9200-clk-usb",
-              of_at91rm9200_clk_usb_setup);
index cd8d689138ff9917822aec3416a101bd0eb665c6..9a970abf34898963e9c689868aa7d9857de22559 100644 (file)
@@ -125,7 +125,7 @@ static const struct clk_ops utmi_ops = {
        .recalc_rate = clk_utmi_recalc_rate,
 };
 
-static struct clk_hw * __init
+struct clk_hw * __init
 at91_clk_register_utmi(struct regmap *regmap_pmc, struct regmap *regmap_sfr,
                       const char *name, const char *parent_name)
 {
@@ -157,46 +157,3 @@ at91_clk_register_utmi(struct regmap *regmap_pmc, struct regmap *regmap_sfr,
 
        return hw;
 }
-
-static void __init of_at91sam9x5_clk_utmi_setup(struct device_node *np)
-{
-       struct clk_hw *hw;
-       const char *parent_name;
-       const char *name = np->name;
-       struct regmap *regmap_pmc, *regmap_sfr;
-
-       parent_name = of_clk_get_parent_name(np, 0);
-
-       of_property_read_string(np, "clock-output-names", &name);
-
-       regmap_pmc = syscon_node_to_regmap(of_get_parent(np));
-       if (IS_ERR(regmap_pmc))
-               return;
-
-       /*
-        * If the device supports different mainck rates, this value has to be
-        * set in the UTMI Clock Trimming register.
-        * - 9x5: mainck supports several rates but it is indicated that a
-        *   12 MHz is needed in case of USB.
-        * - sama5d3 and sama5d2: mainck supports several rates. Configuring
-        *   the FREQ field of the UTMI Clock Trimming register is mandatory.
-        * - sama5d4: mainck is at 12 MHz.
-        *
-        * We only need to retrieve sama5d3 or sama5d2 sfr regmap.
-        */
-       regmap_sfr = syscon_regmap_lookup_by_compatible("atmel,sama5d3-sfr");
-       if (IS_ERR(regmap_sfr)) {
-               regmap_sfr = syscon_regmap_lookup_by_compatible("atmel,sama5d2-sfr");
-               if (IS_ERR(regmap_sfr))
-                       regmap_sfr = NULL;
-       }
-
-       hw = at91_clk_register_utmi(regmap_pmc, regmap_sfr, name, parent_name);
-       if (IS_ERR(hw))
-               return;
-
-       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
-       return;
-}
-CLK_OF_DECLARE(at91sam9x5_clk_utmi, "atmel,at91sam9x5-clk-utmi",
-              of_at91sam9x5_clk_utmi_setup);
diff --git a/drivers/clk/at91/dt-compat.c b/drivers/clk/at91/dt-compat.c
new file mode 100644 (file)
index 0000000..b95bb4e
--- /dev/null
@@ -0,0 +1,961 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/clk-provider.h>
+#include <linux/clk/at91_pmc.h>
+#include <linux/of.h>
+#include <linux/mfd/syscon.h>
+#include <linux/regmap.h>
+#include <linux/slab.h>
+
+#include "pmc.h"
+
+#define MASTER_SOURCE_MAX      4
+
+#define PERIPHERAL_AT91RM9200  0
+#define PERIPHERAL_AT91SAM9X5  1
+
+#define PERIPHERAL_MAX         64
+
+#define PERIPHERAL_ID_MIN      2
+
+#define PROG_SOURCE_MAX                5
+#define PROG_ID_MAX            7
+
+#define SYSTEM_MAX_ID          31
+
+#ifdef CONFIG_HAVE_AT91_AUDIO_PLL
+static void __init of_sama5d2_clk_audio_pll_frac_setup(struct device_node *np)
+{
+       struct clk_hw *hw;
+       const char *name = np->name;
+       const char *parent_name;
+       struct regmap *regmap;
+
+       regmap = syscon_node_to_regmap(of_get_parent(np));
+       if (IS_ERR(regmap))
+               return;
+
+       parent_name = of_clk_get_parent_name(np, 0);
+
+       hw = at91_clk_register_audio_pll_frac(regmap, name, parent_name);
+       if (IS_ERR(hw))
+               return;
+
+       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
+}
+CLK_OF_DECLARE(of_sama5d2_clk_audio_pll_frac_setup,
+              "atmel,sama5d2-clk-audio-pll-frac",
+              of_sama5d2_clk_audio_pll_frac_setup);
+
+static void __init of_sama5d2_clk_audio_pll_pad_setup(struct device_node *np)
+{
+       struct clk_hw *hw;
+       const char *name = np->name;
+       const char *parent_name;
+       struct regmap *regmap;
+
+       regmap = syscon_node_to_regmap(of_get_parent(np));
+       if (IS_ERR(regmap))
+               return;
+
+       parent_name = of_clk_get_parent_name(np, 0);
+
+       hw = at91_clk_register_audio_pll_pad(regmap, name, parent_name);
+       if (IS_ERR(hw))
+               return;
+
+       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
+}
+CLK_OF_DECLARE(of_sama5d2_clk_audio_pll_pad_setup,
+              "atmel,sama5d2-clk-audio-pll-pad",
+              of_sama5d2_clk_audio_pll_pad_setup);
+
+static void __init of_sama5d2_clk_audio_pll_pmc_setup(struct device_node *np)
+{
+       struct clk_hw *hw;
+       const char *name = np->name;
+       const char *parent_name;
+       struct regmap *regmap;
+
+       regmap = syscon_node_to_regmap(of_get_parent(np));
+       if (IS_ERR(regmap))
+               return;
+
+       parent_name = of_clk_get_parent_name(np, 0);
+
+       hw = at91_clk_register_audio_pll_pmc(regmap, name, parent_name);
+       if (IS_ERR(hw))
+               return;
+
+       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
+}
+CLK_OF_DECLARE(of_sama5d2_clk_audio_pll_pmc_setup,
+              "atmel,sama5d2-clk-audio-pll-pmc",
+              of_sama5d2_clk_audio_pll_pmc_setup);
+#endif /* CONFIG_HAVE_AT91_AUDIO_PLL */
+
+#ifdef CONFIG_HAVE_AT91_GENERATED_CLK
+#define GENERATED_SOURCE_MAX   6
+
+#define GCK_ID_I2S0            54
+#define GCK_ID_I2S1            55
+#define GCK_ID_CLASSD          59
+
+static void __init of_sama5d2_clk_generated_setup(struct device_node *np)
+{
+       int num;
+       u32 id;
+       const char *name;
+       struct clk_hw *hw;
+       unsigned int num_parents;
+       const char *parent_names[GENERATED_SOURCE_MAX];
+       struct device_node *gcknp;
+       struct clk_range range = CLK_RANGE(0, 0);
+       struct regmap *regmap;
+
+       num_parents = of_clk_get_parent_count(np);
+       if (num_parents == 0 || num_parents > GENERATED_SOURCE_MAX)
+               return;
+
+       of_clk_parent_fill(np, parent_names, num_parents);
+
+       num = of_get_child_count(np);
+       if (!num || num > PERIPHERAL_MAX)
+               return;
+
+       regmap = syscon_node_to_regmap(of_get_parent(np));
+       if (IS_ERR(regmap))
+               return;
+
+       for_each_child_of_node(np, gcknp) {
+               bool pll_audio = false;
+
+               if (of_property_read_u32(gcknp, "reg", &id))
+                       continue;
+
+               if (id < PERIPHERAL_ID_MIN || id >= PERIPHERAL_MAX)
+                       continue;
+
+               if (of_property_read_string(np, "clock-output-names", &name))
+                       name = gcknp->name;
+
+               of_at91_get_clk_range(gcknp, "atmel,clk-output-range",
+                                     &range);
+
+               if (of_device_is_compatible(np, "atmel,sama5d2-clk-generated") &&
+                   (id == GCK_ID_I2S0 || id == GCK_ID_I2S1 ||
+                    id == GCK_ID_CLASSD))
+                       pll_audio = true;
+
+               hw = at91_clk_register_generated(regmap, &pmc_pcr_lock, name,
+                                                parent_names, num_parents,
+                                                id, pll_audio, &range);
+               if (IS_ERR(hw))
+                       continue;
+
+               of_clk_add_hw_provider(gcknp, of_clk_hw_simple_get, hw);
+       }
+}
+CLK_OF_DECLARE(of_sama5d2_clk_generated_setup, "atmel,sama5d2-clk-generated",
+              of_sama5d2_clk_generated_setup);
+#endif /* CONFIG_HAVE_AT91_GENERATED_CLK */
+
+#ifdef CONFIG_HAVE_AT91_H32MX
+static void __init of_sama5d4_clk_h32mx_setup(struct device_node *np)
+{
+       struct clk_hw *hw;
+       const char *name = np->name;
+       const char *parent_name;
+       struct regmap *regmap;
+
+       regmap = syscon_node_to_regmap(of_get_parent(np));
+       if (IS_ERR(regmap))
+               return;
+
+       parent_name = of_clk_get_parent_name(np, 0);
+
+       hw = at91_clk_register_h32mx(regmap, name, parent_name);
+       if (IS_ERR(hw))
+               return;
+
+       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
+}
+CLK_OF_DECLARE(of_sama5d4_clk_h32mx_setup, "atmel,sama5d4-clk-h32mx",
+              of_sama5d4_clk_h32mx_setup);
+#endif /* CONFIG_HAVE_AT91_H32MX */
+
+#ifdef CONFIG_HAVE_AT91_I2S_MUX_CLK
+#define        I2S_BUS_NR      2
+
+static void __init of_sama5d2_clk_i2s_mux_setup(struct device_node *np)
+{
+       struct regmap *regmap_sfr;
+       u8 bus_id;
+       const char *parent_names[2];
+       struct device_node *i2s_mux_np;
+       struct clk_hw *hw;
+       int ret;
+
+       regmap_sfr = syscon_regmap_lookup_by_compatible("atmel,sama5d2-sfr");
+       if (IS_ERR(regmap_sfr))
+               return;
+
+       for_each_child_of_node(np, i2s_mux_np) {
+               if (of_property_read_u8(i2s_mux_np, "reg", &bus_id))
+                       continue;
+
+               if (bus_id > I2S_BUS_NR)
+                       continue;
+
+               ret = of_clk_parent_fill(i2s_mux_np, parent_names, 2);
+               if (ret != 2)
+                       continue;
+
+               hw = at91_clk_i2s_mux_register(regmap_sfr, i2s_mux_np->name,
+                                              parent_names, 2, bus_id);
+               if (IS_ERR(hw))
+                       continue;
+
+               of_clk_add_hw_provider(i2s_mux_np, of_clk_hw_simple_get, hw);
+       }
+}
+CLK_OF_DECLARE(sama5d2_clk_i2s_mux, "atmel,sama5d2-clk-i2s-mux",
+              of_sama5d2_clk_i2s_mux_setup);
+#endif /* CONFIG_HAVE_AT91_I2S_MUX_CLK */
+
+static void __init of_at91rm9200_clk_main_osc_setup(struct device_node *np)
+{
+       struct clk_hw *hw;
+       const char *name = np->name;
+       const char *parent_name;
+       struct regmap *regmap;
+       bool bypass;
+
+       of_property_read_string(np, "clock-output-names", &name);
+       bypass = of_property_read_bool(np, "atmel,osc-bypass");
+       parent_name = of_clk_get_parent_name(np, 0);
+
+       regmap = syscon_node_to_regmap(of_get_parent(np));
+       if (IS_ERR(regmap))
+               return;
+
+       hw = at91_clk_register_main_osc(regmap, name, parent_name, bypass);
+       if (IS_ERR(hw))
+               return;
+
+       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
+}
+CLK_OF_DECLARE(at91rm9200_clk_main_osc, "atmel,at91rm9200-clk-main-osc",
+              of_at91rm9200_clk_main_osc_setup);
+
+static void __init of_at91sam9x5_clk_main_rc_osc_setup(struct device_node *np)
+{
+       struct clk_hw *hw;
+       u32 frequency = 0;
+       u32 accuracy = 0;
+       const char *name = np->name;
+       struct regmap *regmap;
+
+       of_property_read_string(np, "clock-output-names", &name);
+       of_property_read_u32(np, "clock-frequency", &frequency);
+       of_property_read_u32(np, "clock-accuracy", &accuracy);
+
+       regmap = syscon_node_to_regmap(of_get_parent(np));
+       if (IS_ERR(regmap))
+               return;
+
+       hw = at91_clk_register_main_rc_osc(regmap, name, frequency, accuracy);
+       if (IS_ERR(hw))
+               return;
+
+       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
+}
+CLK_OF_DECLARE(at91sam9x5_clk_main_rc_osc, "atmel,at91sam9x5-clk-main-rc-osc",
+              of_at91sam9x5_clk_main_rc_osc_setup);
+
+static void __init of_at91rm9200_clk_main_setup(struct device_node *np)
+{
+       struct clk_hw *hw;
+       const char *parent_name;
+       const char *name = np->name;
+       struct regmap *regmap;
+
+       parent_name = of_clk_get_parent_name(np, 0);
+       of_property_read_string(np, "clock-output-names", &name);
+
+       regmap = syscon_node_to_regmap(of_get_parent(np));
+       if (IS_ERR(regmap))
+               return;
+
+       hw = at91_clk_register_rm9200_main(regmap, name, parent_name);
+       if (IS_ERR(hw))
+               return;
+
+       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
+}
+CLK_OF_DECLARE(at91rm9200_clk_main, "atmel,at91rm9200-clk-main",
+              of_at91rm9200_clk_main_setup);
+
+static void __init of_at91sam9x5_clk_main_setup(struct device_node *np)
+{
+       struct clk_hw *hw;
+       const char *parent_names[2];
+       unsigned int num_parents;
+       const char *name = np->name;
+       struct regmap *regmap;
+
+       num_parents = of_clk_get_parent_count(np);
+       if (num_parents == 0 || num_parents > 2)
+               return;
+
+       of_clk_parent_fill(np, parent_names, num_parents);
+       regmap = syscon_node_to_regmap(of_get_parent(np));
+       if (IS_ERR(regmap))
+               return;
+
+       of_property_read_string(np, "clock-output-names", &name);
+
+       hw = at91_clk_register_sam9x5_main(regmap, name, parent_names,
+                                          num_parents);
+       if (IS_ERR(hw))
+               return;
+
+       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
+}
+CLK_OF_DECLARE(at91sam9x5_clk_main, "atmel,at91sam9x5-clk-main",
+              of_at91sam9x5_clk_main_setup);
+
+static struct clk_master_characteristics * __init
+of_at91_clk_master_get_characteristics(struct device_node *np)
+{
+       struct clk_master_characteristics *characteristics;
+
+       characteristics = kzalloc(sizeof(*characteristics), GFP_KERNEL);
+       if (!characteristics)
+               return NULL;
+
+       if (of_at91_get_clk_range(np, "atmel,clk-output-range", &characteristics->output))
+               goto out_free_characteristics;
+
+       of_property_read_u32_array(np, "atmel,clk-divisors",
+                                  characteristics->divisors, 4);
+
+       characteristics->have_div3_pres =
+               of_property_read_bool(np, "atmel,master-clk-have-div3-pres");
+
+       return characteristics;
+
+out_free_characteristics:
+       kfree(characteristics);
+       return NULL;
+}
+
+static void __init
+of_at91_clk_master_setup(struct device_node *np,
+                        const struct clk_master_layout *layout)
+{
+       struct clk_hw *hw;
+       unsigned int num_parents;
+       const char *parent_names[MASTER_SOURCE_MAX];
+       const char *name = np->name;
+       struct clk_master_characteristics *characteristics;
+       struct regmap *regmap;
+
+       num_parents = of_clk_get_parent_count(np);
+       if (num_parents == 0 || num_parents > MASTER_SOURCE_MAX)
+               return;
+
+       of_clk_parent_fill(np, parent_names, num_parents);
+
+       of_property_read_string(np, "clock-output-names", &name);
+
+       characteristics = of_at91_clk_master_get_characteristics(np);
+       if (!characteristics)
+               return;
+
+       regmap = syscon_node_to_regmap(of_get_parent(np));
+       if (IS_ERR(regmap))
+               return;
+
+       hw = at91_clk_register_master(regmap, name, num_parents,
+                                     parent_names, layout,
+                                     characteristics);
+       if (IS_ERR(hw))
+               goto out_free_characteristics;
+
+       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
+       return;
+
+out_free_characteristics:
+       kfree(characteristics);
+}
+
+static void __init of_at91rm9200_clk_master_setup(struct device_node *np)
+{
+       of_at91_clk_master_setup(np, &at91rm9200_master_layout);
+}
+CLK_OF_DECLARE(at91rm9200_clk_master, "atmel,at91rm9200-clk-master",
+              of_at91rm9200_clk_master_setup);
+
+static void __init of_at91sam9x5_clk_master_setup(struct device_node *np)
+{
+       of_at91_clk_master_setup(np, &at91sam9x5_master_layout);
+}
+CLK_OF_DECLARE(at91sam9x5_clk_master, "atmel,at91sam9x5-clk-master",
+              of_at91sam9x5_clk_master_setup);
+
+static void __init
+of_at91_clk_periph_setup(struct device_node *np, u8 type)
+{
+       int num;
+       u32 id;
+       struct clk_hw *hw;
+       const char *parent_name;
+       const char *name;
+       struct device_node *periphclknp;
+       struct regmap *regmap;
+
+       parent_name = of_clk_get_parent_name(np, 0);
+       if (!parent_name)
+               return;
+
+       num = of_get_child_count(np);
+       if (!num || num > PERIPHERAL_MAX)
+               return;
+
+       regmap = syscon_node_to_regmap(of_get_parent(np));
+       if (IS_ERR(regmap))
+               return;
+
+       for_each_child_of_node(np, periphclknp) {
+               if (of_property_read_u32(periphclknp, "reg", &id))
+                       continue;
+
+               if (id >= PERIPHERAL_MAX)
+                       continue;
+
+               if (of_property_read_string(np, "clock-output-names", &name))
+                       name = periphclknp->name;
+
+               if (type == PERIPHERAL_AT91RM9200) {
+                       hw = at91_clk_register_peripheral(regmap, name,
+                                                         parent_name, id);
+               } else {
+                       struct clk_range range = CLK_RANGE(0, 0);
+
+                       of_at91_get_clk_range(periphclknp,
+                                             "atmel,clk-output-range",
+                                             &range);
+
+                       hw = at91_clk_register_sam9x5_peripheral(regmap,
+                                                                &pmc_pcr_lock,
+                                                                name,
+                                                                parent_name,
+                                                                id, &range);
+               }
+
+               if (IS_ERR(hw))
+                       continue;
+
+               of_clk_add_hw_provider(periphclknp, of_clk_hw_simple_get, hw);
+       }
+}
+
+static void __init of_at91rm9200_clk_periph_setup(struct device_node *np)
+{
+       of_at91_clk_periph_setup(np, PERIPHERAL_AT91RM9200);
+}
+CLK_OF_DECLARE(at91rm9200_clk_periph, "atmel,at91rm9200-clk-peripheral",
+              of_at91rm9200_clk_periph_setup);
+
+static void __init of_at91sam9x5_clk_periph_setup(struct device_node *np)
+{
+       of_at91_clk_periph_setup(np, PERIPHERAL_AT91SAM9X5);
+}
+CLK_OF_DECLARE(at91sam9x5_clk_periph, "atmel,at91sam9x5-clk-peripheral",
+              of_at91sam9x5_clk_periph_setup);
+
+static struct clk_pll_characteristics * __init
+of_at91_clk_pll_get_characteristics(struct device_node *np)
+{
+       int i;
+       int offset;
+       u32 tmp;
+       int num_output;
+       u32 num_cells;
+       struct clk_range input;
+       struct clk_range *output;
+       u8 *out = NULL;
+       u16 *icpll = NULL;
+       struct clk_pll_characteristics *characteristics;
+
+       if (of_at91_get_clk_range(np, "atmel,clk-input-range", &input))
+               return NULL;
+
+       if (of_property_read_u32(np, "#atmel,pll-clk-output-range-cells",
+                                &num_cells))
+               return NULL;
+
+       if (num_cells < 2 || num_cells > 4)
+               return NULL;
+
+       if (!of_get_property(np, "atmel,pll-clk-output-ranges", &tmp))
+               return NULL;
+       num_output = tmp / (sizeof(u32) * num_cells);
+
+       characteristics = kzalloc(sizeof(*characteristics), GFP_KERNEL);
+       if (!characteristics)
+               return NULL;
+
+       output = kcalloc(num_output, sizeof(*output), GFP_KERNEL);
+       if (!output)
+               goto out_free_characteristics;
+
+       if (num_cells > 2) {
+               out = kcalloc(num_output, sizeof(*out), GFP_KERNEL);
+               if (!out)
+                       goto out_free_output;
+       }
+
+       if (num_cells > 3) {
+               icpll = kcalloc(num_output, sizeof(*icpll), GFP_KERNEL);
+               if (!icpll)
+                       goto out_free_output;
+       }
+
+       for (i = 0; i < num_output; i++) {
+               offset = i * num_cells;
+               if (of_property_read_u32_index(np,
+                                              "atmel,pll-clk-output-ranges",
+                                              offset, &tmp))
+                       goto out_free_output;
+               output[i].min = tmp;
+               if (of_property_read_u32_index(np,
+                                              "atmel,pll-clk-output-ranges",
+                                              offset + 1, &tmp))
+                       goto out_free_output;
+               output[i].max = tmp;
+
+               if (num_cells == 2)
+                       continue;
+
+               if (of_property_read_u32_index(np,
+                                              "atmel,pll-clk-output-ranges",
+                                              offset + 2, &tmp))
+                       goto out_free_output;
+               out[i] = tmp;
+
+               if (num_cells == 3)
+                       continue;
+
+               if (of_property_read_u32_index(np,
+                                              "atmel,pll-clk-output-ranges",
+                                              offset + 3, &tmp))
+                       goto out_free_output;
+               icpll[i] = tmp;
+       }
+
+       characteristics->input = input;
+       characteristics->num_output = num_output;
+       characteristics->output = output;
+       characteristics->out = out;
+       characteristics->icpll = icpll;
+       return characteristics;
+
+out_free_output:
+       kfree(icpll);
+       kfree(out);
+       kfree(output);
+out_free_characteristics:
+       kfree(characteristics);
+       return NULL;
+}
+
+static void __init
+of_at91_clk_pll_setup(struct device_node *np,
+                     const struct clk_pll_layout *layout)
+{
+       u32 id;
+       struct clk_hw *hw;
+       struct regmap *regmap;
+       const char *parent_name;
+       const char *name = np->name;
+       struct clk_pll_characteristics *characteristics;
+
+       if (of_property_read_u32(np, "reg", &id))
+               return;
+
+       parent_name = of_clk_get_parent_name(np, 0);
+
+       of_property_read_string(np, "clock-output-names", &name);
+
+       regmap = syscon_node_to_regmap(of_get_parent(np));
+       if (IS_ERR(regmap))
+               return;
+
+       characteristics = of_at91_clk_pll_get_characteristics(np);
+       if (!characteristics)
+               return;
+
+       hw = at91_clk_register_pll(regmap, name, parent_name, id, layout,
+                                  characteristics);
+       if (IS_ERR(hw))
+               goto out_free_characteristics;
+
+       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
+       return;
+
+out_free_characteristics:
+       kfree(characteristics);
+}
+
+static void __init of_at91rm9200_clk_pll_setup(struct device_node *np)
+{
+       of_at91_clk_pll_setup(np, &at91rm9200_pll_layout);
+}
+CLK_OF_DECLARE(at91rm9200_clk_pll, "atmel,at91rm9200-clk-pll",
+              of_at91rm9200_clk_pll_setup);
+
+static void __init of_at91sam9g45_clk_pll_setup(struct device_node *np)
+{
+       of_at91_clk_pll_setup(np, &at91sam9g45_pll_layout);
+}
+CLK_OF_DECLARE(at91sam9g45_clk_pll, "atmel,at91sam9g45-clk-pll",
+              of_at91sam9g45_clk_pll_setup);
+
+static void __init of_at91sam9g20_clk_pllb_setup(struct device_node *np)
+{
+       of_at91_clk_pll_setup(np, &at91sam9g20_pllb_layout);
+}
+CLK_OF_DECLARE(at91sam9g20_clk_pllb, "atmel,at91sam9g20-clk-pllb",
+              of_at91sam9g20_clk_pllb_setup);
+
+static void __init of_sama5d3_clk_pll_setup(struct device_node *np)
+{
+       of_at91_clk_pll_setup(np, &sama5d3_pll_layout);
+}
+CLK_OF_DECLARE(sama5d3_clk_pll, "atmel,sama5d3-clk-pll",
+              of_sama5d3_clk_pll_setup);
+
+static void __init
+of_at91sam9x5_clk_plldiv_setup(struct device_node *np)
+{
+       struct clk_hw *hw;
+       const char *parent_name;
+       const char *name = np->name;
+       struct regmap *regmap;
+
+       parent_name = of_clk_get_parent_name(np, 0);
+
+       of_property_read_string(np, "clock-output-names", &name);
+
+       regmap = syscon_node_to_regmap(of_get_parent(np));
+       if (IS_ERR(regmap))
+               return;
+
+       hw = at91_clk_register_plldiv(regmap, name, parent_name);
+       if (IS_ERR(hw))
+               return;
+
+       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
+}
+CLK_OF_DECLARE(at91sam9x5_clk_plldiv, "atmel,at91sam9x5-clk-plldiv",
+              of_at91sam9x5_clk_plldiv_setup);
+
+static void __init
+of_at91_clk_prog_setup(struct device_node *np,
+                      const struct clk_programmable_layout *layout)
+{
+       int num;
+       u32 id;
+       struct clk_hw *hw;
+       unsigned int num_parents;
+       const char *parent_names[PROG_SOURCE_MAX];
+       const char *name;
+       struct device_node *progclknp;
+       struct regmap *regmap;
+
+       num_parents = of_clk_get_parent_count(np);
+       if (num_parents == 0 || num_parents > PROG_SOURCE_MAX)
+               return;
+
+       of_clk_parent_fill(np, parent_names, num_parents);
+
+       num = of_get_child_count(np);
+       if (!num || num > (PROG_ID_MAX + 1))
+               return;
+
+       regmap = syscon_node_to_regmap(of_get_parent(np));
+       if (IS_ERR(regmap))
+               return;
+
+       for_each_child_of_node(np, progclknp) {
+               if (of_property_read_u32(progclknp, "reg", &id))
+                       continue;
+
+               if (of_property_read_string(np, "clock-output-names", &name))
+                       name = progclknp->name;
+
+               hw = at91_clk_register_programmable(regmap, name,
+                                                   parent_names, num_parents,
+                                                   id, layout);
+               if (IS_ERR(hw))
+                       continue;
+
+               of_clk_add_hw_provider(progclknp, of_clk_hw_simple_get, hw);
+       }
+}
+
+static void __init of_at91rm9200_clk_prog_setup(struct device_node *np)
+{
+       of_at91_clk_prog_setup(np, &at91rm9200_programmable_layout);
+}
+CLK_OF_DECLARE(at91rm9200_clk_prog, "atmel,at91rm9200-clk-programmable",
+              of_at91rm9200_clk_prog_setup);
+
+static void __init of_at91sam9g45_clk_prog_setup(struct device_node *np)
+{
+       of_at91_clk_prog_setup(np, &at91sam9g45_programmable_layout);
+}
+CLK_OF_DECLARE(at91sam9g45_clk_prog, "atmel,at91sam9g45-clk-programmable",
+              of_at91sam9g45_clk_prog_setup);
+
+static void __init of_at91sam9x5_clk_prog_setup(struct device_node *np)
+{
+       of_at91_clk_prog_setup(np, &at91sam9x5_programmable_layout);
+}
+CLK_OF_DECLARE(at91sam9x5_clk_prog, "atmel,at91sam9x5-clk-programmable",
+              of_at91sam9x5_clk_prog_setup);
+
+static void __init of_at91sam9260_clk_slow_setup(struct device_node *np)
+{
+       struct clk_hw *hw;
+       const char *parent_names[2];
+       unsigned int num_parents;
+       const char *name = np->name;
+       struct regmap *regmap;
+
+       num_parents = of_clk_get_parent_count(np);
+       if (num_parents != 2)
+               return;
+
+       of_clk_parent_fill(np, parent_names, num_parents);
+       regmap = syscon_node_to_regmap(of_get_parent(np));
+       if (IS_ERR(regmap))
+               return;
+
+       of_property_read_string(np, "clock-output-names", &name);
+
+       hw = at91_clk_register_sam9260_slow(regmap, name, parent_names,
+                                           num_parents);
+       if (IS_ERR(hw))
+               return;
+
+       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
+}
+CLK_OF_DECLARE(at91sam9260_clk_slow, "atmel,at91sam9260-clk-slow",
+              of_at91sam9260_clk_slow_setup);
+
+#ifdef CONFIG_HAVE_AT91_SMD
+#define SMD_SOURCE_MAX         2
+
+static void __init of_at91sam9x5_clk_smd_setup(struct device_node *np)
+{
+       struct clk_hw *hw;
+       unsigned int num_parents;
+       const char *parent_names[SMD_SOURCE_MAX];
+       const char *name = np->name;
+       struct regmap *regmap;
+
+       num_parents = of_clk_get_parent_count(np);
+       if (num_parents == 0 || num_parents > SMD_SOURCE_MAX)
+               return;
+
+       of_clk_parent_fill(np, parent_names, num_parents);
+
+       of_property_read_string(np, "clock-output-names", &name);
+
+       regmap = syscon_node_to_regmap(of_get_parent(np));
+       if (IS_ERR(regmap))
+               return;
+
+       hw = at91sam9x5_clk_register_smd(regmap, name, parent_names,
+                                        num_parents);
+       if (IS_ERR(hw))
+               return;
+
+       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
+}
+CLK_OF_DECLARE(at91sam9x5_clk_smd, "atmel,at91sam9x5-clk-smd",
+              of_at91sam9x5_clk_smd_setup);
+#endif /* CONFIG_HAVE_AT91_SMD */
+
+static void __init of_at91rm9200_clk_sys_setup(struct device_node *np)
+{
+       int num;
+       u32 id;
+       struct clk_hw *hw;
+       const char *name;
+       struct device_node *sysclknp;
+       const char *parent_name;
+       struct regmap *regmap;
+
+       num = of_get_child_count(np);
+       if (num > (SYSTEM_MAX_ID + 1))
+               return;
+
+       regmap = syscon_node_to_regmap(of_get_parent(np));
+       if (IS_ERR(regmap))
+               return;
+
+       for_each_child_of_node(np, sysclknp) {
+               if (of_property_read_u32(sysclknp, "reg", &id))
+                       continue;
+
+               if (of_property_read_string(np, "clock-output-names", &name))
+                       name = sysclknp->name;
+
+               parent_name = of_clk_get_parent_name(sysclknp, 0);
+
+               hw = at91_clk_register_system(regmap, name, parent_name, id);
+               if (IS_ERR(hw))
+                       continue;
+
+               of_clk_add_hw_provider(sysclknp, of_clk_hw_simple_get, hw);
+       }
+}
+CLK_OF_DECLARE(at91rm9200_clk_sys, "atmel,at91rm9200-clk-system",
+              of_at91rm9200_clk_sys_setup);
+
+#ifdef CONFIG_HAVE_AT91_USB_CLK
+#define USB_SOURCE_MAX         2
+
+static void __init of_at91sam9x5_clk_usb_setup(struct device_node *np)
+{
+       struct clk_hw *hw;
+       unsigned int num_parents;
+       const char *parent_names[USB_SOURCE_MAX];
+       const char *name = np->name;
+       struct regmap *regmap;
+
+       num_parents = of_clk_get_parent_count(np);
+       if (num_parents == 0 || num_parents > USB_SOURCE_MAX)
+               return;
+
+       of_clk_parent_fill(np, parent_names, num_parents);
+
+       of_property_read_string(np, "clock-output-names", &name);
+
+       regmap = syscon_node_to_regmap(of_get_parent(np));
+       if (IS_ERR(regmap))
+               return;
+
+       hw = at91sam9x5_clk_register_usb(regmap, name, parent_names,
+                                        num_parents);
+       if (IS_ERR(hw))
+               return;
+
+       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
+}
+CLK_OF_DECLARE(at91sam9x5_clk_usb, "atmel,at91sam9x5-clk-usb",
+              of_at91sam9x5_clk_usb_setup);
+
+static void __init of_at91sam9n12_clk_usb_setup(struct device_node *np)
+{
+       struct clk_hw *hw;
+       const char *parent_name;
+       const char *name = np->name;
+       struct regmap *regmap;
+
+       parent_name = of_clk_get_parent_name(np, 0);
+       if (!parent_name)
+               return;
+
+       of_property_read_string(np, "clock-output-names", &name);
+
+       regmap = syscon_node_to_regmap(of_get_parent(np));
+       if (IS_ERR(regmap))
+               return;
+
+       hw = at91sam9n12_clk_register_usb(regmap, name, parent_name);
+       if (IS_ERR(hw))
+               return;
+
+       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
+}
+CLK_OF_DECLARE(at91sam9n12_clk_usb, "atmel,at91sam9n12-clk-usb",
+              of_at91sam9n12_clk_usb_setup);
+
+static void __init of_at91rm9200_clk_usb_setup(struct device_node *np)
+{
+       struct clk_hw *hw;
+       const char *parent_name;
+       const char *name = np->name;
+       u32 divisors[4] = {0, 0, 0, 0};
+       struct regmap *regmap;
+
+       parent_name = of_clk_get_parent_name(np, 0);
+       if (!parent_name)
+               return;
+
+       of_property_read_u32_array(np, "atmel,clk-divisors", divisors, 4);
+       if (!divisors[0])
+               return;
+
+       of_property_read_string(np, "clock-output-names", &name);
+
+       regmap = syscon_node_to_regmap(of_get_parent(np));
+       if (IS_ERR(regmap))
+               return;
+       hw = at91rm9200_clk_register_usb(regmap, name, parent_name, divisors);
+       if (IS_ERR(hw))
+               return;
+
+       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
+}
+CLK_OF_DECLARE(at91rm9200_clk_usb, "atmel,at91rm9200-clk-usb",
+              of_at91rm9200_clk_usb_setup);
+#endif /* CONFIG_HAVE_AT91_USB_CLK */
+
+#ifdef CONFIG_HAVE_AT91_UTMI
+static void __init of_at91sam9x5_clk_utmi_setup(struct device_node *np)
+{
+       struct clk_hw *hw;
+       const char *parent_name;
+       const char *name = np->name;
+       struct regmap *regmap_pmc, *regmap_sfr;
+
+       parent_name = of_clk_get_parent_name(np, 0);
+
+       of_property_read_string(np, "clock-output-names", &name);
+
+       regmap_pmc = syscon_node_to_regmap(of_get_parent(np));
+       if (IS_ERR(regmap_pmc))
+               return;
+
+       /*
+        * If the device supports different mainck rates, this value has to be
+        * set in the UTMI Clock Trimming register.
+        * - 9x5: mainck supports several rates but it is indicated that a
+        *   12 MHz is needed in case of USB.
+        * - sama5d3 and sama5d2: mainck supports several rates. Configuring
+        *   the FREQ field of the UTMI Clock Trimming register is mandatory.
+        * - sama5d4: mainck is at 12 MHz.
+        *
+        * We only need to retrieve sama5d3 or sama5d2 sfr regmap.
+        */
+       regmap_sfr = syscon_regmap_lookup_by_compatible("atmel,sama5d3-sfr");
+       if (IS_ERR(regmap_sfr)) {
+               regmap_sfr = syscon_regmap_lookup_by_compatible("atmel,sama5d2-sfr");
+               if (IS_ERR(regmap_sfr))
+                       regmap_sfr = NULL;
+       }
+
+       hw = at91_clk_register_utmi(regmap_pmc, regmap_sfr, name, parent_name);
+       if (IS_ERR(hw))
+               return;
+
+       of_clk_add_hw_provider(np, of_clk_hw_simple_get, hw);
+}
+CLK_OF_DECLARE(at91sam9x5_clk_utmi, "atmel,at91sam9x5-clk-utmi",
+              of_at91sam9x5_clk_utmi_setup);
+#endif /* CONFIG_HAVE_AT91_UTMI */
index 1fa27f4ea5386304841317fedadca3fd1ab6dd33..db24539d57405253d26c4d4ebc3b6626045d0517 100644 (file)
@@ -19,6 +19,8 @@
 
 #include <asm/proc-fns.h>
 
+#include <dt-bindings/clock/at91.h>
+
 #include "pmc.h"
 
 #define PMC_MAX_IDS 128
@@ -47,6 +49,82 @@ int of_at91_get_clk_range(struct device_node *np, const char *propname,
 }
 EXPORT_SYMBOL_GPL(of_at91_get_clk_range);
 
+struct clk_hw *of_clk_hw_pmc_get(struct of_phandle_args *clkspec, void *data)
+{
+       unsigned int type = clkspec->args[0];
+       unsigned int idx = clkspec->args[1];
+       struct pmc_data *pmc_data = data;
+
+       switch (type) {
+       case PMC_TYPE_CORE:
+               if (idx < pmc_data->ncore)
+                       return pmc_data->chws[idx];
+               break;
+       case PMC_TYPE_SYSTEM:
+               if (idx < pmc_data->nsystem)
+                       return pmc_data->shws[idx];
+               break;
+       case PMC_TYPE_PERIPHERAL:
+               if (idx < pmc_data->nperiph)
+                       return pmc_data->phws[idx];
+               break;
+       case PMC_TYPE_GCK:
+               if (idx < pmc_data->ngck)
+                       return pmc_data->ghws[idx];
+               break;
+       default:
+               break;
+       }
+
+       pr_err("%s: invalid type (%u) or index (%u)\n", __func__, type, idx);
+
+       return ERR_PTR(-EINVAL);
+}
+
+void pmc_data_free(struct pmc_data *pmc_data)
+{
+       kfree(pmc_data->chws);
+       kfree(pmc_data->shws);
+       kfree(pmc_data->phws);
+       kfree(pmc_data->ghws);
+}
+
+struct pmc_data *pmc_data_allocate(unsigned int ncore, unsigned int nsystem,
+                                  unsigned int nperiph, unsigned int ngck)
+{
+       struct pmc_data *pmc_data = kzalloc(sizeof(*pmc_data), GFP_KERNEL);
+
+       if (!pmc_data)
+               return NULL;
+
+       pmc_data->ncore = ncore;
+       pmc_data->chws = kcalloc(ncore, sizeof(struct clk_hw *), GFP_KERNEL);
+       if (!pmc_data->chws)
+               goto err;
+
+       pmc_data->nsystem = nsystem;
+       pmc_data->shws = kcalloc(nsystem, sizeof(struct clk_hw *), GFP_KERNEL);
+       if (!pmc_data->shws)
+               goto err;
+
+       pmc_data->nperiph = nperiph;
+       pmc_data->phws = kcalloc(nperiph, sizeof(struct clk_hw *), GFP_KERNEL);
+       if (!pmc_data->phws)
+               goto err;
+
+       pmc_data->ngck = ngck;
+       pmc_data->ghws = kcalloc(ngck, sizeof(struct clk_hw *), GFP_KERNEL);
+       if (!pmc_data->ghws)
+               goto err;
+
+       return pmc_data;
+
+err:
+       pmc_data_free(pmc_data);
+
+       return NULL;
+}
+
 #ifdef CONFIG_PM
 static struct regmap *pmcreg;
 
index d22b1fa9ecdce8fa621dc3d7eaa66a4580585911..672a79bda88c960d7655a600834705152f5a4eaf 100644 (file)
 
 extern spinlock_t pmc_pcr_lock;
 
+struct pmc_data {
+       unsigned int ncore;
+       struct clk_hw **chws;
+       unsigned int nsystem;
+       struct clk_hw **shws;
+       unsigned int nperiph;
+       struct clk_hw **phws;
+       unsigned int ngck;
+       struct clk_hw **ghws;
+};
+
 struct clk_range {
        unsigned long min;
        unsigned long max;
@@ -26,9 +37,157 @@ struct clk_range {
 
 #define CLK_RANGE(MIN, MAX) {.min = MIN, .max = MAX,}
 
+struct clk_master_layout {
+       u32 mask;
+       u8 pres_shift;
+};
+
+extern const struct clk_master_layout at91rm9200_master_layout;
+extern const struct clk_master_layout at91sam9x5_master_layout;
+
+struct clk_master_characteristics {
+       struct clk_range output;
+       u32 divisors[4];
+       u8 have_div3_pres;
+};
+
+struct clk_pll_layout {
+       u32 pllr_mask;
+       u16 mul_mask;
+       u8 mul_shift;
+};
+
+extern const struct clk_pll_layout at91rm9200_pll_layout;
+extern const struct clk_pll_layout at91sam9g45_pll_layout;
+extern const struct clk_pll_layout at91sam9g20_pllb_layout;
+extern const struct clk_pll_layout sama5d3_pll_layout;
+
+struct clk_pll_characteristics {
+       struct clk_range input;
+       int num_output;
+       struct clk_range *output;
+       u16 *icpll;
+       u8 *out;
+};
+
+struct clk_programmable_layout {
+       u8 pres_shift;
+       u8 css_mask;
+       u8 have_slck_mck;
+};
+
+extern const struct clk_programmable_layout at91rm9200_programmable_layout;
+extern const struct clk_programmable_layout at91sam9g45_programmable_layout;
+extern const struct clk_programmable_layout at91sam9x5_programmable_layout;
+
+#define ndck(a, s) (a[s - 1].id + 1)
+#define nck(a) (a[ARRAY_SIZE(a) - 1].id + 1)
+struct pmc_data *pmc_data_allocate(unsigned int ncore, unsigned int nsystem,
+                                  unsigned int nperiph, unsigned int ngck);
+void pmc_data_free(struct pmc_data *pmc_data);
+
 int of_at91_get_clk_range(struct device_node *np, const char *propname,
                          struct clk_range *range);
 
+struct clk_hw *of_clk_hw_pmc_get(struct of_phandle_args *clkspec, void *data);
+
+struct clk_hw * __init
+at91_clk_register_audio_pll_frac(struct regmap *regmap, const char *name,
+                                const char *parent_name);
+
+struct clk_hw * __init
+at91_clk_register_audio_pll_pad(struct regmap *regmap, const char *name,
+                               const char *parent_name);
+
+struct clk_hw * __init
+at91_clk_register_audio_pll_pmc(struct regmap *regmap, const char *name,
+                               const char *parent_name);
+
+struct clk_hw * __init
+at91_clk_register_generated(struct regmap *regmap, spinlock_t *lock,
+                           const char *name, const char **parent_names,
+                           u8 num_parents, u8 id, bool pll_audio,
+                           const struct clk_range *range);
+
+struct clk_hw * __init
+at91_clk_register_h32mx(struct regmap *regmap, const char *name,
+                       const char *parent_name);
+
+struct clk_hw * __init
+at91_clk_i2s_mux_register(struct regmap *regmap, const char *name,
+                         const char * const *parent_names,
+                         unsigned int num_parents, u8 bus_id);
+
+struct clk_hw * __init
+at91_clk_register_main_rc_osc(struct regmap *regmap, const char *name,
+                             u32 frequency, u32 accuracy);
+struct clk_hw * __init
+at91_clk_register_main_osc(struct regmap *regmap, const char *name,
+                          const char *parent_name, bool bypass);
+struct clk_hw * __init
+at91_clk_register_rm9200_main(struct regmap *regmap,
+                             const char *name,
+                             const char *parent_name);
+struct clk_hw * __init
+at91_clk_register_sam9x5_main(struct regmap *regmap, const char *name,
+                             const char **parent_names, int num_parents);
+
+struct clk_hw * __init
+at91_clk_register_master(struct regmap *regmap, const char *name,
+                        int num_parents, const char **parent_names,
+                        const struct clk_master_layout *layout,
+                        const struct clk_master_characteristics *characteristics);
+
+struct clk_hw * __init
+at91_clk_register_peripheral(struct regmap *regmap, const char *name,
+                            const char *parent_name, u32 id);
+struct clk_hw * __init
+at91_clk_register_sam9x5_peripheral(struct regmap *regmap, spinlock_t *lock,
+                                   const char *name, const char *parent_name,
+                                   u32 id, const struct clk_range *range);
+
+struct clk_hw * __init
+at91_clk_register_pll(struct regmap *regmap, const char *name,
+                     const char *parent_name, u8 id,
+                     const struct clk_pll_layout *layout,
+                     const struct clk_pll_characteristics *characteristics);
+struct clk_hw * __init
+at91_clk_register_plldiv(struct regmap *regmap, const char *name,
+                        const char *parent_name);
+
+struct clk_hw * __init
+at91_clk_register_programmable(struct regmap *regmap, const char *name,
+                              const char **parent_names, u8 num_parents, u8 id,
+                              const struct clk_programmable_layout *layout);
+
+struct clk_hw * __init
+at91_clk_register_sam9260_slow(struct regmap *regmap,
+                              const char *name,
+                              const char **parent_names,
+                              int num_parents);
+
+struct clk_hw * __init
+at91sam9x5_clk_register_smd(struct regmap *regmap, const char *name,
+                           const char **parent_names, u8 num_parents);
+
+struct clk_hw * __init
+at91_clk_register_system(struct regmap *regmap, const char *name,
+                        const char *parent_name, u8 id);
+
+struct clk_hw * __init
+at91sam9x5_clk_register_usb(struct regmap *regmap, const char *name,
+                           const char **parent_names, u8 num_parents);
+struct clk_hw * __init
+at91sam9n12_clk_register_usb(struct regmap *regmap, const char *name,
+                            const char *parent_name);
+struct clk_hw * __init
+at91rm9200_clk_register_usb(struct regmap *regmap, const char *name,
+                           const char *parent_name, const u32 *divisors);
+
+struct clk_hw * __init
+at91_clk_register_utmi(struct regmap *regmap_pmc, struct regmap *regmap_sfr,
+                      const char *name, const char *parent_name);
+
 #ifdef CONFIG_PM
 void pmc_register_id(u8 id);
 void pmc_register_pck(u8 pck);
diff --git a/drivers/clk/at91/sama5d2.c b/drivers/clk/at91/sama5d2.c
new file mode 100644 (file)
index 0000000..d69ad96
--- /dev/null
@@ -0,0 +1,336 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/clk-provider.h>
+#include <linux/mfd/syscon.h>
+#include <linux/slab.h>
+
+#include <dt-bindings/clock/at91.h>
+
+#include "pmc.h"
+
+static const struct clk_master_characteristics mck_characteristics = {
+       .output = { .min = 124000000, .max = 166000000 },
+       .divisors = { 1, 2, 4, 3 },
+};
+
+static u8 plla_out[] = { 0 };
+
+static u16 plla_icpll[] = { 0 };
+
+static struct clk_range plla_outputs[] = {
+       { .min = 600000000, .max = 1200000000 },
+};
+
+static const struct clk_pll_characteristics plla_characteristics = {
+       .input = { .min = 12000000, .max = 12000000 },
+       .num_output = ARRAY_SIZE(plla_outputs),
+       .output = plla_outputs,
+       .icpll = plla_icpll,
+       .out = plla_out,
+};
+
+static const struct {
+       char *n;
+       char *p;
+       u8 id;
+} sama5d2_systemck[] = {
+       { .n = "ddrck", .p = "masterck", .id = 2 },
+       { .n = "lcdck", .p = "masterck", .id = 3 },
+       { .n = "uhpck", .p = "usbck",    .id = 6 },
+       { .n = "udpck", .p = "usbck",    .id = 7 },
+       { .n = "pck0",  .p = "prog0",    .id = 8 },
+       { .n = "pck1",  .p = "prog1",    .id = 9 },
+       { .n = "pck2",  .p = "prog2",    .id = 10 },
+       { .n = "iscck", .p = "masterck", .id = 18 },
+};
+
+static const struct {
+       char *n;
+       u8 id;
+       struct clk_range r;
+} sama5d2_periph32ck[] = {
+       { .n = "macb0_clk",   .id = 5,  .r = { .min = 0, .max = 83000000 }, },
+       { .n = "tdes_clk",    .id = 11, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "matrix1_clk", .id = 14, },
+       { .n = "hsmc_clk",    .id = 17, },
+       { .n = "pioA_clk",    .id = 18, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "flx0_clk",    .id = 19, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "flx1_clk",    .id = 20, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "flx2_clk",    .id = 21, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "flx3_clk",    .id = 22, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "flx4_clk",    .id = 23, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "uart0_clk",   .id = 24, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "uart1_clk",   .id = 25, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "uart2_clk",   .id = 26, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "uart3_clk",   .id = 27, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "uart4_clk",   .id = 28, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "twi0_clk",    .id = 29, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "twi1_clk",    .id = 30, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "spi0_clk",    .id = 33, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "spi1_clk",    .id = 34, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "tcb0_clk",    .id = 35, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "tcb1_clk",    .id = 36, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "pwm_clk",     .id = 38, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "adc_clk",     .id = 40, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "uhphs_clk",   .id = 41, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "udphs_clk",   .id = 42, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "ssc0_clk",    .id = 43, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "ssc1_clk",    .id = 44, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "trng_clk",    .id = 47, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "pdmic_clk",   .id = 48, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "securam_clk", .id = 51, },
+       { .n = "i2s0_clk",    .id = 54, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "i2s1_clk",    .id = 55, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "can0_clk",    .id = 56, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "can1_clk",    .id = 57, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "classd_clk",  .id = 59, .r = { .min = 0, .max = 83000000 }, },
+};
+
+static const struct {
+       char *n;
+       u8 id;
+} sama5d2_periphck[] = {
+       { .n = "dma0_clk",    .id = 6, },
+       { .n = "dma1_clk",    .id = 7, },
+       { .n = "aes_clk",     .id = 9, },
+       { .n = "aesb_clk",    .id = 10, },
+       { .n = "sha_clk",     .id = 12, },
+       { .n = "mpddr_clk",   .id = 13, },
+       { .n = "matrix0_clk", .id = 15, },
+       { .n = "sdmmc0_hclk", .id = 31, },
+       { .n = "sdmmc1_hclk", .id = 32, },
+       { .n = "lcdc_clk",    .id = 45, },
+       { .n = "isc_clk",     .id = 46, },
+       { .n = "qspi0_clk",   .id = 52, },
+       { .n = "qspi1_clk",   .id = 53, },
+};
+
+static const struct {
+       char *n;
+       u8 id;
+       struct clk_range r;
+       bool pll;
+} sama5d2_gck[] = {
+       { .n = "sdmmc0_gclk", .id = 31, },
+       { .n = "sdmmc1_gclk", .id = 32, },
+       { .n = "tcb0_gclk",   .id = 35, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "tcb1_gclk",   .id = 36, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "pwm_gclk",    .id = 38, .r = { .min = 0, .max = 83000000 }, },
+       { .n = "isc_gclk",    .id = 46, },
+       { .n = "pdmic_gclk",  .id = 48, },
+       { .n = "i2s0_gclk",   .id = 54, .pll = true },
+       { .n = "i2s1_gclk",   .id = 55, .pll = true },
+       { .n = "can0_gclk",   .id = 56, .r = { .min = 0, .max = 80000000 }, },
+       { .n = "can1_gclk",   .id = 57, .r = { .min = 0, .max = 80000000 }, },
+       { .n = "classd_gclk", .id = 59, .r = { .min = 0, .max = 100000000 },
+         .pll = true },
+};
+
+static void __init sama5d2_pmc_setup(struct device_node *np)
+{
+       struct clk_range range = CLK_RANGE(0, 0);
+       const char *slck_name, *mainxtal_name;
+       struct pmc_data *sama5d2_pmc;
+       const char *parent_names[6];
+       struct regmap *regmap, *regmap_sfr;
+       struct clk_hw *hw;
+       int i;
+       bool bypass;
+
+       i = of_property_match_string(np, "clock-names", "slow_clk");
+       if (i < 0)
+               return;
+
+       slck_name = of_clk_get_parent_name(np, i);
+
+       i = of_property_match_string(np, "clock-names", "main_xtal");
+       if (i < 0)
+               return;
+       mainxtal_name = of_clk_get_parent_name(np, i);
+
+       regmap = syscon_node_to_regmap(np);
+       if (IS_ERR(regmap))
+               return;
+
+       sama5d2_pmc = pmc_data_allocate(PMC_I2S1_MUX + 1,
+                                       nck(sama5d2_systemck),
+                                       nck(sama5d2_periph32ck),
+                                       nck(sama5d2_gck));
+       if (!sama5d2_pmc)
+               return;
+
+       hw = at91_clk_register_main_rc_osc(regmap, "main_rc_osc", 12000000,
+                                          100000000);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       bypass = of_property_read_bool(np, "atmel,osc-bypass");
+
+       hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name,
+                                       bypass);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       parent_names[0] = "main_rc_osc";
+       parent_names[1] = "main_osc";
+       hw = at91_clk_register_sam9x5_main(regmap, "mainck", parent_names, 2);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       sama5d2_pmc->chws[PMC_MAIN] = hw;
+
+       hw = at91_clk_register_pll(regmap, "pllack", "mainck", 0,
+                                  &sama5d3_pll_layout, &plla_characteristics);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       hw = at91_clk_register_plldiv(regmap, "plladivck", "pllack");
+       if (IS_ERR(hw))
+               goto err_free;
+
+       hw = at91_clk_register_audio_pll_frac(regmap, "audiopll_fracck",
+                                             "mainck");
+       if (IS_ERR(hw))
+               goto err_free;
+
+       hw = at91_clk_register_audio_pll_pad(regmap, "audiopll_padck",
+                                            "audiopll_fracck");
+       if (IS_ERR(hw))
+               goto err_free;
+
+       hw = at91_clk_register_audio_pll_pmc(regmap, "audiopll_pmcck",
+                                            "audiopll_fracck");
+       if (IS_ERR(hw))
+               goto err_free;
+
+       regmap_sfr = syscon_regmap_lookup_by_compatible("atmel,sama5d2-sfr");
+       if (IS_ERR(regmap_sfr))
+               regmap_sfr = NULL;
+
+       hw = at91_clk_register_utmi(regmap, regmap_sfr, "utmick", "mainck");
+       if (IS_ERR(hw))
+               goto err_free;
+
+       sama5d2_pmc->chws[PMC_UTMI] = hw;
+
+       parent_names[0] = slck_name;
+       parent_names[1] = "mainck";
+       parent_names[2] = "plladivck";
+       parent_names[3] = "utmick";
+       hw = at91_clk_register_master(regmap, "masterck", 4, parent_names,
+                                     &at91sam9x5_master_layout,
+                                     &mck_characteristics);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       sama5d2_pmc->chws[PMC_MCK] = hw;
+
+       hw = at91_clk_register_h32mx(regmap, "h32mxck", "masterck");
+       if (IS_ERR(hw))
+               goto err_free;
+
+       sama5d2_pmc->chws[PMC_MCK2] = hw;
+
+       parent_names[0] = "plladivck";
+       parent_names[1] = "utmick";
+       hw = at91sam9x5_clk_register_usb(regmap, "usbck", parent_names, 2);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       parent_names[0] = slck_name;
+       parent_names[1] = "mainck";
+       parent_names[2] = "plladivck";
+       parent_names[3] = "utmick";
+       parent_names[4] = "mck";
+       for (i = 0; i < 3; i++) {
+               char name[6];
+
+               snprintf(name, sizeof(name), "prog%d", i);
+
+               hw = at91_clk_register_programmable(regmap, name,
+                                                   parent_names, 5, i,
+                                                   &at91sam9x5_programmable_layout);
+               if (IS_ERR(hw))
+                       goto err_free;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(sama5d2_systemck); i++) {
+               hw = at91_clk_register_system(regmap, sama5d2_systemck[i].n,
+                                             sama5d2_systemck[i].p,
+                                             sama5d2_systemck[i].id);
+               if (IS_ERR(hw))
+                       goto err_free;
+
+               sama5d2_pmc->shws[sama5d2_systemck[i].id] = hw;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(sama5d2_periphck); i++) {
+               hw = at91_clk_register_sam9x5_peripheral(regmap, &pmc_pcr_lock,
+                                                        sama5d2_periphck[i].n,
+                                                        "masterck",
+                                                        sama5d2_periphck[i].id,
+                                                        &range);
+               if (IS_ERR(hw))
+                       goto err_free;
+
+               sama5d2_pmc->phws[sama5d2_periphck[i].id] = hw;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(sama5d2_periph32ck); i++) {
+               hw = at91_clk_register_sam9x5_peripheral(regmap, &pmc_pcr_lock,
+                                                        sama5d2_periph32ck[i].n,
+                                                        "h32mxck",
+                                                        sama5d2_periph32ck[i].id,
+                                                        &sama5d2_periph32ck[i].r);
+               if (IS_ERR(hw))
+                       goto err_free;
+
+               sama5d2_pmc->phws[sama5d2_periph32ck[i].id] = hw;
+       }
+
+       parent_names[0] = slck_name;
+       parent_names[1] = "mainck";
+       parent_names[2] = "plladivck";
+       parent_names[3] = "utmick";
+       parent_names[4] = "mck";
+       parent_names[5] = "audiopll_pmcck";
+       for (i = 0; i < ARRAY_SIZE(sama5d2_gck); i++) {
+               hw = at91_clk_register_generated(regmap, &pmc_pcr_lock,
+                                                sama5d2_gck[i].n,
+                                                parent_names, 6,
+                                                sama5d2_gck[i].id,
+                                                sama5d2_gck[i].pll,
+                                                &sama5d2_gck[i].r);
+               if (IS_ERR(hw))
+                       goto err_free;
+
+               sama5d2_pmc->ghws[sama5d2_gck[i].id] = hw;
+       }
+
+       if (regmap_sfr) {
+               parent_names[0] = "i2s0_clk";
+               parent_names[1] = "i2s0_gclk";
+               hw = at91_clk_i2s_mux_register(regmap_sfr, "i2s0_muxclk",
+                                              parent_names, 2, 0);
+               if (IS_ERR(hw))
+                       goto err_free;
+
+               sama5d2_pmc->chws[PMC_I2S0_MUX] = hw;
+
+               parent_names[0] = "i2s1_clk";
+               parent_names[1] = "i2s1_gclk";
+               hw = at91_clk_i2s_mux_register(regmap_sfr, "i2s1_muxclk",
+                                              parent_names, 2, 1);
+               if (IS_ERR(hw))
+                       goto err_free;
+
+               sama5d2_pmc->chws[PMC_I2S1_MUX] = hw;
+       }
+
+       of_clk_add_hw_provider(np, of_clk_hw_pmc_get, sama5d2_pmc);
+
+       return;
+
+err_free:
+       pmc_data_free(sama5d2_pmc);
+}
+CLK_OF_DECLARE_DRIVER(sama5d2_pmc, "atmel,sama5d2-pmc", sama5d2_pmc_setup);
diff --git a/drivers/clk/at91/sama5d4.c b/drivers/clk/at91/sama5d4.c
new file mode 100644 (file)
index 0000000..e358be7
--- /dev/null
@@ -0,0 +1,264 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/clk-provider.h>
+#include <linux/mfd/syscon.h>
+#include <linux/slab.h>
+
+#include <dt-bindings/clock/at91.h>
+
+#include "pmc.h"
+
+static const struct clk_master_characteristics mck_characteristics = {
+       .output = { .min = 125000000, .max = 200000000 },
+       .divisors = { 1, 2, 4, 3 },
+};
+
+static u8 plla_out[] = { 0 };
+
+static u16 plla_icpll[] = { 0 };
+
+static struct clk_range plla_outputs[] = {
+       { .min = 600000000, .max = 1200000000 },
+};
+
+static const struct clk_pll_characteristics plla_characteristics = {
+       .input = { .min = 12000000, .max = 12000000 },
+       .num_output = ARRAY_SIZE(plla_outputs),
+       .output = plla_outputs,
+       .icpll = plla_icpll,
+       .out = plla_out,
+};
+
+static const struct {
+       char *n;
+       char *p;
+       u8 id;
+} sama5d4_systemck[] = {
+       { .n = "ddrck", .p = "masterck", .id = 2 },
+       { .n = "lcdck", .p = "masterck", .id = 3 },
+       { .n = "smdck", .p = "smdclk",   .id = 4 },
+       { .n = "uhpck", .p = "usbck",    .id = 6 },
+       { .n = "udpck", .p = "usbck",    .id = 7 },
+       { .n = "pck0",  .p = "prog0",    .id = 8 },
+       { .n = "pck1",  .p = "prog1",    .id = 9 },
+       { .n = "pck2",  .p = "prog2",    .id = 10 },
+};
+
+static const struct {
+       char *n;
+       u8 id;
+} sama5d4_periph32ck[] = {
+       { .n = "pioD_clk", .id = 5 },
+       { .n = "usart0_clk", .id = 6 },
+       { .n = "usart1_clk", .id = 7 },
+       { .n = "icm_clk", .id = 9 },
+       { .n = "aes_clk", .id = 12 },
+       { .n = "tdes_clk", .id = 14 },
+       { .n = "sha_clk", .id = 15 },
+       { .n = "matrix1_clk", .id = 17 },
+       { .n = "hsmc_clk", .id = 22 },
+       { .n = "pioA_clk", .id = 23 },
+       { .n = "pioB_clk", .id = 24 },
+       { .n = "pioC_clk", .id = 25 },
+       { .n = "pioE_clk", .id = 26 },
+       { .n = "uart0_clk", .id = 27 },
+       { .n = "uart1_clk", .id = 28 },
+       { .n = "usart2_clk", .id = 29 },
+       { .n = "usart3_clk", .id = 30 },
+       { .n = "usart4_clk", .id = 31 },
+       { .n = "twi0_clk", .id = 32 },
+       { .n = "twi1_clk", .id = 33 },
+       { .n = "twi2_clk", .id = 34 },
+       { .n = "mci0_clk", .id = 35 },
+       { .n = "mci1_clk", .id = 36 },
+       { .n = "spi0_clk", .id = 37 },
+       { .n = "spi1_clk", .id = 38 },
+       { .n = "spi2_clk", .id = 39 },
+       { .n = "tcb0_clk", .id = 40 },
+       { .n = "tcb1_clk", .id = 41 },
+       { .n = "tcb2_clk", .id = 42 },
+       { .n = "pwm_clk", .id = 43 },
+       { .n = "adc_clk", .id = 44 },
+       { .n = "dbgu_clk", .id = 45 },
+       { .n = "uhphs_clk", .id = 46 },
+       { .n = "udphs_clk", .id = 47 },
+       { .n = "ssc0_clk", .id = 48 },
+       { .n = "ssc1_clk", .id = 49 },
+       { .n = "trng_clk", .id = 53 },
+       { .n = "macb0_clk", .id = 54 },
+       { .n = "macb1_clk", .id = 55 },
+       { .n = "fuse_clk", .id = 57 },
+       { .n = "securam_clk", .id = 59 },
+       { .n = "smd_clk", .id = 61 },
+       { .n = "twi3_clk", .id = 62 },
+       { .n = "catb_clk", .id = 63 },
+};
+
+static const struct {
+       char *n;
+       u8 id;
+} sama5d4_periphck[] = {
+       { .n = "dma0_clk", .id = 8 },
+       { .n = "cpkcc_clk", .id = 10 },
+       { .n = "aesb_clk", .id = 13 },
+       { .n = "mpddr_clk", .id = 16 },
+       { .n = "matrix0_clk", .id = 18 },
+       { .n = "vdec_clk", .id = 19 },
+       { .n = "dma1_clk", .id = 50 },
+       { .n = "lcdc_clk", .id = 51 },
+       { .n = "isi_clk", .id = 52 },
+};
+
+static void __init sama5d4_pmc_setup(struct device_node *np)
+{
+       struct clk_range range = CLK_RANGE(0, 0);
+       const char *slck_name, *mainxtal_name;
+       struct pmc_data *sama5d4_pmc;
+       const char *parent_names[5];
+       struct regmap *regmap;
+       struct clk_hw *hw;
+       int i;
+       bool bypass;
+
+       i = of_property_match_string(np, "clock-names", "slow_clk");
+       if (i < 0)
+               return;
+
+       slck_name = of_clk_get_parent_name(np, i);
+
+       i = of_property_match_string(np, "clock-names", "main_xtal");
+       if (i < 0)
+               return;
+       mainxtal_name = of_clk_get_parent_name(np, i);
+
+       regmap = syscon_node_to_regmap(np);
+       if (IS_ERR(regmap))
+               return;
+
+       sama5d4_pmc = pmc_data_allocate(PMC_MCK2 + 1,
+                                       nck(sama5d4_systemck),
+                                       nck(sama5d4_periph32ck), 0);
+       if (!sama5d4_pmc)
+               return;
+
+       hw = at91_clk_register_main_rc_osc(regmap, "main_rc_osc", 12000000,
+                                          100000000);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       bypass = of_property_read_bool(np, "atmel,osc-bypass");
+
+       hw = at91_clk_register_main_osc(regmap, "main_osc", mainxtal_name,
+                                       bypass);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       parent_names[0] = "main_rc_osc";
+       parent_names[1] = "main_osc";
+       hw = at91_clk_register_sam9x5_main(regmap, "mainck", parent_names, 2);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       hw = at91_clk_register_pll(regmap, "pllack", "mainck", 0,
+                                  &sama5d3_pll_layout, &plla_characteristics);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       hw = at91_clk_register_plldiv(regmap, "plladivck", "pllack");
+       if (IS_ERR(hw))
+               goto err_free;
+
+       hw = at91_clk_register_utmi(regmap, NULL, "utmick", "mainck");
+       if (IS_ERR(hw))
+               goto err_free;
+
+       sama5d4_pmc->chws[PMC_UTMI] = hw;
+
+       parent_names[0] = slck_name;
+       parent_names[1] = "mainck";
+       parent_names[2] = "plladivck";
+       parent_names[3] = "utmick";
+       hw = at91_clk_register_master(regmap, "masterck", 4, parent_names,
+                                     &at91sam9x5_master_layout,
+                                     &mck_characteristics);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       sama5d4_pmc->chws[PMC_MCK] = hw;
+
+       hw = at91_clk_register_h32mx(regmap, "h32mxck", "masterck");
+       if (IS_ERR(hw))
+               goto err_free;
+
+       sama5d4_pmc->chws[PMC_MCK2] = hw;
+
+       parent_names[0] = "plladivck";
+       parent_names[1] = "utmick";
+       hw = at91sam9x5_clk_register_usb(regmap, "usbck", parent_names, 2);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       parent_names[0] = "plladivck";
+       parent_names[1] = "utmick";
+       hw = at91sam9x5_clk_register_smd(regmap, "smdclk", parent_names, 2);
+       if (IS_ERR(hw))
+               goto err_free;
+
+       parent_names[0] = slck_name;
+       parent_names[1] = "mainck";
+       parent_names[2] = "plladivck";
+       parent_names[3] = "utmick";
+       parent_names[4] = "mck";
+       for (i = 0; i < 3; i++) {
+               char name[6];
+
+               snprintf(name, sizeof(name), "prog%d", i);
+
+               hw = at91_clk_register_programmable(regmap, name,
+                                                   parent_names, 5, i,
+                                                   &at91sam9x5_programmable_layout);
+               if (IS_ERR(hw))
+                       goto err_free;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(sama5d4_systemck); i++) {
+               hw = at91_clk_register_system(regmap, sama5d4_systemck[i].n,
+                                             sama5d4_systemck[i].p,
+                                             sama5d4_systemck[i].id);
+               if (IS_ERR(hw))
+                       goto err_free;
+
+               sama5d4_pmc->shws[sama5d4_systemck[i].id] = hw;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(sama5d4_periphck); i++) {
+               hw = at91_clk_register_sam9x5_peripheral(regmap, &pmc_pcr_lock,
+                                                        sama5d4_periphck[i].n,
+                                                        "masterck",
+                                                        sama5d4_periphck[i].id,
+                                                        &range);
+               if (IS_ERR(hw))
+                       goto err_free;
+
+               sama5d4_pmc->phws[sama5d4_periphck[i].id] = hw;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(sama5d4_periph32ck); i++) {
+               hw = at91_clk_register_sam9x5_peripheral(regmap, &pmc_pcr_lock,
+                                                        sama5d4_periph32ck[i].n,
+                                                        "h32mxck",
+                                                        sama5d4_periph32ck[i].id,
+                                                        &range);
+               if (IS_ERR(hw))
+                       goto err_free;
+
+               sama5d4_pmc->phws[sama5d4_periph32ck[i].id] = hw;
+       }
+
+       of_clk_add_hw_provider(np, of_clk_hw_pmc_get, sama5d4_pmc);
+
+       return;
+
+err_free:
+       pmc_data_free(sama5d4_pmc);
+}
+CLK_OF_DECLARE_DRIVER(sama5d4_pmc, "atmel,sama5d4-pmc", sama5d4_pmc_setup);
index 25d8c240ddfb0f5d2fc61847f11b35badc69d441..c68dada973168474ff063b2eba98a11bfec5556e 100644 (file)
@@ -301,13 +301,13 @@ static void __init of_axs10x_pll_clk_setup(struct device_node *node)
 
        ret = clk_hw_register(NULL, &pll_clk->hw);
        if (ret) {
-               pr_err("failed to register %s clock\n", node->name);
+               pr_err("failed to register %pOFn clock\n", node);
                goto err_unmap_lock;
        }
 
        ret = of_clk_add_hw_provider(node, of_clk_hw_simple_get, &pll_clk->hw);
        if (ret) {
-               pr_err("failed to add hw provider for %s clock\n", node->name);
+               pr_err("failed to add hw provider for %pOFn clock\n", node);
                goto err_unregister_clk;
        }
 
index 281f4322355c135eded2fc5533a54498a0f0f49f..e65eeef9cbaf16ad3ba4238f0f17a12e70eb6915 100644 (file)
@@ -808,29 +808,29 @@ void __init kona_dt_ccu_setup(struct ccu_data *ccu,
 
        ret = of_address_to_resource(node, 0, &res);
        if (ret) {
-               pr_err("%s: no valid CCU registers found for %s\n", __func__,
-                       node->name);
+               pr_err("%s: no valid CCU registers found for %pOFn\n", __func__,
+                       node);
                goto out_err;
        }
 
        range = resource_size(&res);
        if (range > (resource_size_t)U32_MAX) {
-               pr_err("%s: address range too large for %s\n", __func__,
-                       node->name);
+               pr_err("%s: address range too large for %pOFn\n", __func__,
+                       node);
                goto out_err;
        }
 
        ccu->range = (u32)range;
 
        if (!ccu_data_valid(ccu)) {
-               pr_err("%s: ccu data not valid for %s\n", __func__, node->name);
+               pr_err("%s: ccu data not valid for %pOFn\n", __func__, node);
                goto out_err;
        }
 
        ccu->base = ioremap(res.start, ccu->range);
        if (!ccu->base) {
-               pr_err("%s: unable to map CCU registers for %s\n", __func__,
-                       node->name);
+               pr_err("%s: unable to map CCU registers for %pOFn\n", __func__,
+                       node);
                goto out_err;
        }
        ccu->node = of_node_get(node);
@@ -848,16 +848,16 @@ void __init kona_dt_ccu_setup(struct ccu_data *ccu,
 
        ret = of_clk_add_hw_provider(node, of_clk_kona_onecell_get, ccu);
        if (ret) {
-               pr_err("%s: error adding ccu %s as provider (%d)\n", __func__,
-                               node->name, ret);
+               pr_err("%s: error adding ccu %pOFn as provider (%d)\n", __func__,
+                               node, ret);
                goto out_err;
        }
 
        if (!kona_ccu_init(ccu))
-               pr_err("Broadcom %s initialization had errors\n", node->name);
+               pr_err("Broadcom %pOFn initialization had errors\n", node);
 
        return;
 out_err:
        kona_ccu_teardown(ccu);
-       pr_err("Broadcom %s setup aborted\n", node->name);
+       pr_err("Broadcom %pOFn setup aborted\n", node);
 }
index 44b5441571210468e99cce9d9269dfc57c4bca46..d571a00b5282d2b18774efc21c3d6aea0c660e09 100644 (file)
@@ -281,7 +281,7 @@ static void __init asm9260_acc_init(struct device_node *np)
 
        base = of_io_request_and_map(np, 0, np->name);
        if (IS_ERR(base))
-               panic("%s: unable to map resource", np->name);
+               panic("%pOFn: unable to map resource", np);
 
        /* register pll */
        rate = (ioread32(base + HW_SYSPLLCTRL) & 0xffff) * 1000000;
@@ -292,7 +292,7 @@ static void __init asm9260_acc_init(struct device_node *np)
                        ref_clk, 0, rate, accuracy);
 
        if (IS_ERR(hw))
-               panic("%s: can't register REFCLK. Check DT!", np->name);
+               panic("%pOFn: can't register REFCLK. Check DT!", np);
 
        for (n = 0; n < ARRAY_SIZE(asm9260_mux_clks); n++) {
                const struct asm9260_mux_clock *mc = &asm9260_mux_clks[n];
index 6904ed6da504b0690b3e0a3525370848d080f566..6a7118d4250a6a0409a1d080936e1d1e74bbfb42 100644 (file)
  */
 
 #include <linux/clk.h>
+#include <linux/clk-provider.h>
 #include <linux/device.h>
 #include <linux/export.h>
+#include <linux/of.h>
+#include <linux/slab.h>
+
+static int __must_check of_clk_bulk_get(struct device_node *np, int num_clks,
+                                       struct clk_bulk_data *clks)
+{
+       int ret;
+       int i;
+
+       for (i = 0; i < num_clks; i++)
+               clks[i].clk = NULL;
+
+       for (i = 0; i < num_clks; i++) {
+               clks[i].clk = of_clk_get(np, i);
+               if (IS_ERR(clks[i].clk)) {
+                       ret = PTR_ERR(clks[i].clk);
+                       pr_err("%pOF: Failed to get clk index: %d ret: %d\n",
+                              np, i, ret);
+                       clks[i].clk = NULL;
+                       goto err;
+               }
+       }
+
+       return 0;
+
+err:
+       clk_bulk_put(i, clks);
+
+       return ret;
+}
+
+static int __must_check of_clk_bulk_get_all(struct device_node *np,
+                                           struct clk_bulk_data **clks)
+{
+       struct clk_bulk_data *clk_bulk;
+       int num_clks;
+       int ret;
+
+       num_clks = of_clk_get_parent_count(np);
+       if (!num_clks)
+               return 0;
+
+       clk_bulk = kmalloc_array(num_clks, sizeof(*clk_bulk), GFP_KERNEL);
+       if (!clk_bulk)
+               return -ENOMEM;
+
+       ret = of_clk_bulk_get(np, num_clks, clk_bulk);
+       if (ret) {
+               kfree(clk_bulk);
+               return ret;
+       }
+
+       *clks = clk_bulk;
+
+       return num_clks;
+}
 
 void clk_bulk_put(int num_clks, struct clk_bulk_data *clks)
 {
@@ -59,6 +116,29 @@ err:
 }
 EXPORT_SYMBOL(clk_bulk_get);
 
+void clk_bulk_put_all(int num_clks, struct clk_bulk_data *clks)
+{
+       if (IS_ERR_OR_NULL(clks))
+               return;
+
+       clk_bulk_put(num_clks, clks);
+
+       kfree(clks);
+}
+EXPORT_SYMBOL(clk_bulk_put_all);
+
+int __must_check clk_bulk_get_all(struct device *dev,
+                                 struct clk_bulk_data **clks)
+{
+       struct device_node *np = dev_of_node(dev);
+
+       if (!np)
+               return 0;
+
+       return of_clk_bulk_get_all(np, clks);
+}
+EXPORT_SYMBOL(clk_bulk_get_all);
+
 #ifdef CONFIG_HAVE_CLK_PREPARE
 
 /**
index 0a7e7d5a750605c5be12d953ac912f3fb9105962..23c9326ea48c5ef0bc3b5ef00bf9fbbd67e166c8 100644 (file)
@@ -669,8 +669,8 @@ static int cdce925_probe(struct i2c_client *client,
 
        /* Register PLL clocks */
        for (i = 0; i < data->chip_info->num_plls; ++i) {
-               pll_clk_name[i] = kasprintf(GFP_KERNEL, "%s.pll%d",
-                       client->dev.of_node->name, i);
+               pll_clk_name[i] = kasprintf(GFP_KERNEL, "%pOFn.pll%d",
+                       client->dev.of_node, i);
                init.name = pll_clk_name[i];
                data->pll[i].chip = data;
                data->pll[i].hw.init = &init;
@@ -703,6 +703,7 @@ static int cdce925_probe(struct i2c_client *client,
                                0x12 + (i*CDCE925_OFFSET_PLL),
                                0x07, value & 0x07);
                }
+               of_node_put(np_output);
        }
 
        /* Register output clock Y1 */
@@ -710,7 +711,7 @@ static int cdce925_probe(struct i2c_client *client,
        init.flags = 0;
        init.num_parents = 1;
        init.parent_names = &parent_name; /* Mux Y1 to input */
-       init.name = kasprintf(GFP_KERNEL, "%s.Y1", client->dev.of_node->name);
+       init.name = kasprintf(GFP_KERNEL, "%pOFn.Y1", client->dev.of_node);
        data->clk[0].chip = data;
        data->clk[0].hw.init = &init;
        data->clk[0].index = 0;
@@ -727,8 +728,8 @@ static int cdce925_probe(struct i2c_client *client,
        init.flags = CLK_SET_RATE_PARENT;
        init.num_parents = 1;
        for (i = 1; i < data->chip_info->num_outputs; ++i) {
-               init.name = kasprintf(GFP_KERNEL, "%s.Y%d",
-                       client->dev.of_node->name, i+1);
+               init.name = kasprintf(GFP_KERNEL, "%pOFn.Y%d",
+                       client->dev.of_node, i+1);
                data->clk[i].chip = data;
                data->clk[i].hw.init = &init;
                data->clk[i].index = i;
index d854e26a8ddbca3dfb96aad123e974f2175cc455..12c87457eca1e73d4c568bc34a98296c961c6c3c 100644 (file)
@@ -70,6 +70,30 @@ int __must_check devm_clk_bulk_get(struct device *dev, int num_clks,
 }
 EXPORT_SYMBOL_GPL(devm_clk_bulk_get);
 
+int __must_check devm_clk_bulk_get_all(struct device *dev,
+                                      struct clk_bulk_data **clks)
+{
+       struct clk_bulk_devres *devres;
+       int ret;
+
+       devres = devres_alloc(devm_clk_bulk_release,
+                             sizeof(*devres), GFP_KERNEL);
+       if (!devres)
+               return -ENOMEM;
+
+       ret = clk_bulk_get_all(dev, &devres->clks);
+       if (ret > 0) {
+               *clks = devres->clks;
+               devres->num_clks = ret;
+               devres_add(dev, devres);
+       } else {
+               devres_free(devres);
+       }
+
+       return ret;
+}
+EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all);
+
 static int devm_clk_match(struct device *dev, void *res, void *data)
 {
        struct clk **c = res;
index 20724abd38bd132205713cce2e7960324652d12b..ef0ca9414f371bc3275b7afce529029e10b49f68 100644 (file)
@@ -158,14 +158,14 @@ static struct clk *_of_fixed_factor_clk_setup(struct device_node *node)
        int ret;
 
        if (of_property_read_u32(node, "clock-div", &div)) {
-               pr_err("%s Fixed factor clock <%s> must have a clock-div property\n",
-                       __func__, node->name);
+               pr_err("%s Fixed factor clock <%pOFn> must have a clock-div property\n",
+                       __func__, node);
                return ERR_PTR(-EIO);
        }
 
        if (of_property_read_u32(node, "clock-mult", &mult)) {
-               pr_err("%s Fixed factor clock <%s> must have a clock-mult property\n",
-                       __func__, node->name);
+               pr_err("%s Fixed factor clock <%pOFn> must have a clock-mult property\n",
+                       __func__, node);
                return ERR_PTR(-EIO);
        }
 
index b5c46b3f8764d491da0f8586de8b18eb6d6f4527..6d6475c32ee51612df97f7fcce8c952a004ccdeb 100644 (file)
@@ -200,6 +200,7 @@ static int of_fixed_clk_remove(struct platform_device *pdev)
 {
        struct clk *clk = platform_get_drvdata(pdev);
 
+       of_clk_del_provider(pdev->dev.of_node);
        clk_unregister_fixed_rate(clk);
 
        return 0;
index 40af4fbab4d23f24acda1ab07fe1df887131c243..6a43ce420492f143be8eee203633d2faa2b7942e 100644 (file)
@@ -233,11 +233,11 @@ static int gpio_clk_driver_probe(struct platform_device *pdev)
        if (IS_ERR(gpiod)) {
                ret = PTR_ERR(gpiod);
                if (ret == -EPROBE_DEFER)
-                       pr_debug("%s: %s: GPIOs not yet available, retry later\n",
-                                       node->name, __func__);
+                       pr_debug("%pOFn: %s: GPIOs not yet available, retry later\n",
+                                       node, __func__);
                else
-                       pr_err("%s: %s: Can't get '%s' named GPIO property\n",
-                                       node->name, __func__,
+                       pr_err("%pOFn: %s: Can't get '%s' named GPIO property\n",
+                                       node, __func__,
                                        gpio_name);
                return ret;
        }
index c4ee280f454d9213b2bd1a82ac576e7fd790fb42..a47c2b600f20c188fde5c037321afe960dbcd7d9 100644 (file)
@@ -390,13 +390,13 @@ static void __init of_hsdk_pll_clk_setup(struct device_node *node)
 
        ret = clk_hw_register(NULL, &pll_clk->hw);
        if (ret) {
-               pr_err("failed to register %s clock\n", node->name);
+               pr_err("failed to register %pOFn clock\n", node);
                goto err_unmap_spec_regs;
        }
 
        ret = of_clk_add_hw_provider(node, of_clk_hw_simple_get, &pll_clk->hw);
        if (ret) {
-               pr_err("failed to add hw provider for %s clock\n", node->name);
+               pr_err("failed to add hw provider for %pOFn clock\n", node);
                goto err_unmap_spec_regs;
        }
 
index eb953d3b0b69bef048312fe9b6ec3c2678d815bb..02551fe4b87c5461c69d88a66b5b2f5b8fefbd6d 100644 (file)
@@ -1,24 +1,9 @@
-/*
- * clk-max77686.c - Clock driver for Maxim 77686/MAX77802
- *
- * Copyright (C) 2012 Samsung Electornics
- * Jonghwa Lee <jonghwa3.lee@samsung.com>
- *
- * This program is free software; you can redistribute  it and/or modify it
- * under  the terms of  the GNU General  Public License as published by the
- * Free Software Foundation;  either version 2 of the  License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- */
+// SPDX-License-Identifier: GPL-2.0+
+//
+// clk-max77686.c - Clock driver for Maxim 77686/MAX77802
+//
+// Copyright (C) 2012 Samsung Electornics
+// Jonghwa Lee <jonghwa3.lee@samsung.com>
 
 #include <linux/kernel.h>
 #include <linux/slab.h>
index 13ad6d1e509082f12b0466acb127c3cffc858cba..84a24875c6298a3e6ee1ba9688bcef826056e3ca 100644 (file)
@@ -97,8 +97,8 @@ static void __init nomadik_src_init(void)
        }
        src_base = of_iomap(np, 0);
        if (!src_base) {
-               pr_err("%s: must have src parent node with REGS (%s)\n",
-                      __func__, np->name);
+               pr_err("%s: must have src parent node with REGS (%pOFn)\n",
+                      __func__, np);
                return;
        }
 
index 740af90a950820055d9934f66e080c338f0cf143..afb0eb1069530798ad9c00c46094d108cb833b4b 100644 (file)
@@ -549,7 +549,7 @@ static void __init npcm7xx_clk_init(struct device_node *clk_np)
 
        ret = of_address_to_resource(clk_np, 0, &res);
        if (ret) {
-               pr_err("%s: failed to get resource, ret %d\n", clk_np->name,
+               pr_err("%pOFn: failed to get resource, ret %d\n", clk_np,
                        ret);
                return;
        }
index 7f51c01085abee76a30828f08b52bac935f172d5..e9612e7068e9e80175e81645d8641b898c68d358 100644 (file)
@@ -195,8 +195,8 @@ static void palmas_clks_get_clk_data(struct platform_device *pdev,
                prop = PALMAS_EXT_CONTROL_NSLEEP;
                break;
        default:
-               dev_warn(&pdev->dev, "%s: Invalid ext control option: %u\n",
-                        node->name, prop);
+               dev_warn(&pdev->dev, "%pOFn: Invalid ext control option: %u\n",
+                        node, prop);
                prop = 0;
                break;
        }
index 3a1812f65e5d823242d4428672736ce04f865a33..4c30b6e799ed1ea1e22dcc8f920ec54309a024f6 100644 (file)
@@ -945,8 +945,8 @@ static void __init core_mux_init(struct device_node *np)
 
        rc = of_clk_add_provider(np, of_clk_src_simple_get, clk);
        if (rc) {
-               pr_err("%s: Couldn't register clk provider for node %s: %d\n",
-                      __func__, np->name, rc);
+               pr_err("%s: Couldn't register clk provider for node %pOFn: %d\n",
+                      __func__, np, rc);
                return;
        }
 }
@@ -1199,8 +1199,8 @@ static void __init legacy_pll_init(struct device_node *np, int idx)
 
        rc = of_clk_add_provider(np, of_clk_src_onecell_get, onecell_data);
        if (rc) {
-               pr_err("%s: Couldn't register clk provider for node %s: %d\n",
-                      __func__, np->name, rc);
+               pr_err("%s: Couldn't register clk provider for node %pOFn: %d\n",
+                      __func__, np, rc);
                goto err_cell;
        }
 
@@ -1360,7 +1360,7 @@ static void __init clockgen_init(struct device_node *np)
                is_old_ls1021a = true;
        }
        if (!clockgen.regs) {
-               pr_err("%s(): %s: of_iomap() failed\n", __func__, np->name);
+               pr_err("%s(): %pOFn: of_iomap() failed\n", __func__, np);
                return;
        }
 
@@ -1406,8 +1406,8 @@ static void __init clockgen_init(struct device_node *np)
 
        ret = of_clk_add_provider(np, clockgen_clk_get, &clockgen);
        if (ret) {
-               pr_err("%s: Couldn't register clk provider for node %s: %d\n",
-                      __func__, np->name, ret);
+               pr_err("%s: Couldn't register clk provider for node %pOFn: %d\n",
+                      __func__, np, ret);
        }
 
        return;
index d44e0eea31ec6de81e471469eee884f37a559fca..5b419b82f7ca1c57d8e687c459f33753b7014f7a 100644 (file)
@@ -1,19 +1,8 @@
-/*
- * clk-s2mps11.c - Clock driver for S2MPS11.
- *
- * Copyright (C) 2013,2014 Samsung Electornics
- *
- * This program is free software; you can redistribute  it and/or modify it
- * under  the terms of  the GNU General  Public License as published by the
- * Free Software Foundation;  either version 2 of the  License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- */
+// SPDX-License-Identifier: GPL-2.0+
+//
+// clk-s2mps11.c - Clock driver for S2MPS11.
+//
+// Copyright (C) 2013,2014 Samsung Electornics
 
 #include <linux/module.h>
 #include <linux/err.h>
 #include <linux/mfd/samsung/s5m8767.h>
 #include <linux/mfd/samsung/core.h>
 
-enum {
-       S2MPS11_CLK_AP = 0,
-       S2MPS11_CLK_CP,
-       S2MPS11_CLK_BT,
-       S2MPS11_CLKS_NUM,
-};
+#include <dt-bindings/clock/samsung,s2mps11.h>
 
 struct s2mps11_clk {
        struct sec_pmic_dev *iodev;
@@ -245,6 +229,36 @@ static const struct platform_device_id s2mps11_clk_id[] = {
 };
 MODULE_DEVICE_TABLE(platform, s2mps11_clk_id);
 
+#ifdef CONFIG_OF
+/*
+ * Device is instantiated through parent MFD device and device matching is done
+ * through platform_device_id.
+ *
+ * However if device's DT node contains proper clock compatible and driver is
+ * built as a module, then the *module* matching will be done trough DT aliases.
+ * This requires of_device_id table.  In the same time this will not change the
+ * actual *device* matching so do not add .of_match_table.
+ */
+static const struct of_device_id s2mps11_dt_match[] __used = {
+       {
+               .compatible = "samsung,s2mps11-clk",
+               .data = (void *)S2MPS11X,
+       }, {
+               .compatible = "samsung,s2mps13-clk",
+               .data = (void *)S2MPS13X,
+       }, {
+               .compatible = "samsung,s2mps14-clk",
+               .data = (void *)S2MPS14X,
+       }, {
+               .compatible = "samsung,s5m8767-clk",
+               .data = (void *)S5M8767X,
+       }, {
+               /* Sentinel */
+       },
+};
+MODULE_DEVICE_TABLE(of, s2mps11_dt_match);
+#endif
+
 static struct platform_driver s2mps11_clk_driver = {
        .driver = {
                .name  = "s2mps11-clk",
index a985bf5e1ac61e6df1a56e153ed75640e0161072..a2287c770d5c07408365b89a49450c554f48d55a 100644 (file)
@@ -132,7 +132,7 @@ static int scmi_clocks_probe(struct scmi_device *sdev)
 
        count = handle->clk_ops->count_get(handle);
        if (count < 0) {
-               dev_err(dev, "%s: invalid clock output count\n", np->name);
+               dev_err(dev, "%pOFn: invalid clock output count\n", np);
                return -EINVAL;
        }
 
index 25854722810ed7791afd9830de51794e20ad676f..d3ccc1cfccd5e10619acb4056d40c5b1fe963b56 100644 (file)
@@ -207,7 +207,7 @@ static int scpi_clk_add(struct device *dev, struct device_node *np,
 
        count = of_property_count_strings(np, "clock-output-names");
        if (count < 0) {
-               dev_err(dev, "%s: invalid clock output count\n", np->name);
+               dev_err(dev, "%pOFn: invalid clock output count\n", np);
                return -EINVAL;
        }
 
@@ -232,13 +232,13 @@ static int scpi_clk_add(struct device *dev, struct device_node *np,
 
                if (of_property_read_string_index(np, "clock-output-names",
                                                  idx, &name)) {
-                       dev_err(dev, "invalid clock name @ %s\n", np->name);
+                       dev_err(dev, "invalid clock name @ %pOFn\n", np);
                        return -EINVAL;
                }
 
                if (of_property_read_u32_index(np, "clock-indices",
                                               idx, &val)) {
-                       dev_err(dev, "invalid clock index @ %s\n", np->name);
+                       dev_err(dev, "invalid clock index @ %pOFn\n", np);
                        return -EINVAL;
                }
 
index 50e7c341e97e91c6faaaef55bbdd27645248679c..8bdf91b560125afb47b0afc20b72c3373aa917d0 100644 (file)
@@ -1215,8 +1215,8 @@ static int si5351_dt_parse(struct i2c_client *client,
        /* per clkout properties */
        for_each_child_of_node(np, child) {
                if (of_property_read_u32(child, "reg", &num)) {
-                       dev_err(&client->dev, "missing reg property of %s\n",
-                               child->name);
+                       dev_err(&client->dev, "missing reg property of %pOFn\n",
+                               child);
                        goto put_child;
                }
 
index 294850bdc195d7923f684dd5d5f17eb7f883ed68..cdaa567c8042eea0e5ee29ec7775bdc97e295a3d 100644 (file)
@@ -1433,7 +1433,7 @@ static void __init stm32f4_rcc_init(struct device_node *np)
 
        base = of_iomap(np, 0);
        if (!base) {
-               pr_err("%s: unable to map resource\n", np->name);
+               pr_err("%pOFn: unable to map resource\n", np);
                return;
        }
 
index d3271eca3779026d3a0316c381de13ca2d10411e..0ea7261d15e07ca0b7d859b29412f62a323d3e4f 100644 (file)
@@ -1216,7 +1216,7 @@ static void __init stm32h7_rcc_init(struct device_node *np)
        /* get RCC base @ from DT */
        base = of_iomap(np, 0);
        if (!base) {
-               pr_err("%s: unable to map resource", np->name);
+               pr_err("%pOFn: unable to map resource", np);
                goto err_free_clks;
        }
 
index a907555b2a3d8f5c7882e5be1e080eed5fda1767..4f48342bc2802bd7a9c9402594e035a1c97ad91a 100644 (file)
@@ -2088,7 +2088,7 @@ static void stm32mp1_rcc_init(struct device_node *np)
 
        base = of_iomap(np, 0);
        if (!base) {
-               pr_err("%s: unable to map resource", np->name);
+               pr_err("%pOFn: unable to map resource", np);
                of_node_put(np);
                return;
        }
index 34b22b7930fbc0483611c8e752fb93db30e64b8d..fe12a43f7a4008011aa9c8af774150abbeb19354 100644 (file)
@@ -54,13 +54,13 @@ static void __init tango4_clkgen_setup(struct device_node *np)
        const char *parent = of_clk_get_parent_name(np, 0);
 
        if (!base)
-               panic("%s: invalid address\n", np->name);
+               panic("%pOFn: invalid address\n", np);
 
        if (readl(base + CPUCLK_DIV) & DIV_BYPASS)
-               panic("%s: unsupported cpuclk setup\n", np->name);
+               panic("%pOFn: unsupported cpuclk setup\n", np);
 
        if (readl(base + SYSCLK_DIV) & DIV_BYPASS)
-               panic("%s: unsupported sysclk setup\n", np->name);
+               panic("%pOFn: unsupported sysclk setup\n", np);
 
        writel(0x100, base + CPUCLK_DIV); /* disable frequency ramping */
 
@@ -77,9 +77,9 @@ static void __init tango4_clkgen_setup(struct device_node *np)
        pp[3] = clk_register_fixed_factor(NULL, "sdio_clk", "cd6", 0, 1, 2);
 
        if (IS_ERR(pp[0]) || IS_ERR(pp[1]) || IS_ERR(pp[2]) || IS_ERR(pp[3]))
-               panic("%s: clk registration failed\n", np->name);
+               panic("%pOFn: clk registration failed\n", np);
 
        if (of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data))
-               panic("%s: clk provider registration failed\n", np->name);
+               panic("%pOFn: clk provider registration failed\n", np);
 }
 CLK_OF_DECLARE(tango4_clkgen, "sigma,tango4-clkgen", tango4_clkgen_setup);
index d31055ae6ec6f94c23409df9f47936f09b54c1bf..af011974d4ecbf1226fa0d4ecb3db66bf2514afc 100644 (file)
@@ -923,6 +923,101 @@ static int clk_core_enable_lock(struct clk_core *core)
        return ret;
 }
 
+/**
+ * clk_gate_restore_context - restore context for poweroff
+ * @hw: the clk_hw pointer of clock whose state is to be restored
+ *
+ * The clock gate restore context function enables or disables
+ * the gate clocks based on the enable_count. This is done in cases
+ * where the clock context is lost and based on the enable_count
+ * the clock either needs to be enabled/disabled. This
+ * helps restore the state of gate clocks.
+ */
+void clk_gate_restore_context(struct clk_hw *hw)
+{
+       struct clk_core *core = hw->core;
+
+       if (core->enable_count)
+               core->ops->enable(hw);
+       else
+               core->ops->disable(hw);
+}
+EXPORT_SYMBOL_GPL(clk_gate_restore_context);
+
+static int clk_core_save_context(struct clk_core *core)
+{
+       struct clk_core *child;
+       int ret = 0;
+
+       hlist_for_each_entry(child, &core->children, child_node) {
+               ret = clk_core_save_context(child);
+               if (ret < 0)
+                       return ret;
+       }
+
+       if (core->ops && core->ops->save_context)
+               ret = core->ops->save_context(core->hw);
+
+       return ret;
+}
+
+static void clk_core_restore_context(struct clk_core *core)
+{
+       struct clk_core *child;
+
+       if (core->ops && core->ops->restore_context)
+               core->ops->restore_context(core->hw);
+
+       hlist_for_each_entry(child, &core->children, child_node)
+               clk_core_restore_context(child);
+}
+
+/**
+ * clk_save_context - save clock context for poweroff
+ *
+ * Saves the context of the clock register for powerstates in which the
+ * contents of the registers will be lost. Occurs deep within the suspend
+ * code.  Returns 0 on success.
+ */
+int clk_save_context(void)
+{
+       struct clk_core *clk;
+       int ret;
+
+       hlist_for_each_entry(clk, &clk_root_list, child_node) {
+               ret = clk_core_save_context(clk);
+               if (ret < 0)
+                       return ret;
+       }
+
+       hlist_for_each_entry(clk, &clk_orphan_list, child_node) {
+               ret = clk_core_save_context(clk);
+               if (ret < 0)
+                       return ret;
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(clk_save_context);
+
+/**
+ * clk_restore_context - restore clock context after poweroff
+ *
+ * Restore the saved clock context upon resume.
+ *
+ */
+void clk_restore_context(void)
+{
+       struct clk_core *core;
+
+       hlist_for_each_entry(core, &clk_root_list, child_node)
+               clk_core_restore_context(core);
+
+       hlist_for_each_entry(core, &clk_orphan_list, child_node)
+               clk_core_restore_context(core);
+}
+EXPORT_SYMBOL_GPL(clk_restore_context);
+
 /**
  * clk_enable - ungate a clock
  * @clk: the clk being ungated
index fffbed5e263ba6d4ce851793d1ac4150e10fcddf..5b69e24a224f4797c263bcf3e43115fa09513bc1 100644 (file)
@@ -303,24 +303,6 @@ static int davinci_lpsc_clk_reset(struct clk *clk, bool reset)
        return 0;
 }
 
-/*
- * REVISIT: These exported functions can be removed after a non-DT lookup is
- * added to the reset controller framework and the davinci-rproc driver is
- * updated to use the generic reset controller framework.
- */
-
-int davinci_clk_reset_assert(struct clk *clk)
-{
-       return davinci_lpsc_clk_reset(clk, true);
-}
-EXPORT_SYMBOL(davinci_clk_reset_assert);
-
-int davinci_clk_reset_deassert(struct clk *clk)
-{
-       return davinci_lpsc_clk_reset(clk, false);
-}
-EXPORT_SYMBOL(davinci_clk_reset_deassert);
-
 static int davinci_psc_reset_assert(struct reset_controller_dev *rcdev,
                                    unsigned long id)
 {
index becdb1dd21b5c66b18e112083ab7b6941820ff0f..30fad7ab0d886b68008d80e103826209f49e1d90 100644 (file)
@@ -21,6 +21,13 @@ config COMMON_CLK_HI3660
        help
          Build the clock driver for hi3660.
 
+config COMMON_CLK_HI3670
+       bool "Hi3670 Clock Driver"
+       depends on ARCH_HISI || COMPILE_TEST
+       default ARCH_HISI
+       help
+         Build the clock driver for hi3670.
+
 config COMMON_CLK_HI3798CV200
        tristate "Hi3798CV200 Clock Driver"
        depends on ARCH_HISI || COMPILE_TEST
index 2a714c0f965786f74bd1f3e671cb9d1d8fec4e1a..b2441b99f3d596ac4a36855a57c763ec552787df 100644 (file)
@@ -11,6 +11,7 @@ obj-$(CONFIG_ARCH_HIX5HD2)    += clk-hix5hd2.o
 obj-$(CONFIG_COMMON_CLK_HI3516CV300)   += crg-hi3516cv300.o
 obj-$(CONFIG_COMMON_CLK_HI3519)        += clk-hi3519.o
 obj-$(CONFIG_COMMON_CLK_HI3660) += clk-hi3660.o
+obj-$(CONFIG_COMMON_CLK_HI3670) += clk-hi3670.o
 obj-$(CONFIG_COMMON_CLK_HI3798CV200)   += crg-hi3798cv200.o
 obj-$(CONFIG_COMMON_CLK_HI6220)        += clk-hi6220.o
 obj-$(CONFIG_RESET_HISI)       += reset.o
diff --git a/drivers/clk/hisilicon/clk-hi3670.c b/drivers/clk/hisilicon/clk-hi3670.c
new file mode 100644 (file)
index 0000000..fd8c837
--- /dev/null
@@ -0,0 +1,1016 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2001-2021, Huawei Tech. Co., Ltd.
+ * Author: chenjun <chenjun14@huawei.com>
+ *
+ * Copyright (c) 2018, Linaro Ltd.
+ * Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
+ */
+
+#include <dt-bindings/clock/hi3670-clock.h>
+#include <linux/clk-provider.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include "clk.h"
+
+static const struct hisi_fixed_rate_clock hi3670_fixed_rate_clks[] = {
+       { HI3670_CLKIN_SYS, "clkin_sys", NULL, 0, 19200000, },
+       { HI3670_CLKIN_REF, "clkin_ref", NULL, 0, 32764, },
+       { HI3670_CLK_FLL_SRC, "clk_fll_src", NULL, 0, 134400000, },
+       { HI3670_CLK_PPLL0, "clk_ppll0", NULL, 0, 1660000000, },
+       { HI3670_CLK_PPLL1, "clk_ppll1", NULL, 0, 1866000000, },
+       { HI3670_CLK_PPLL2, "clk_ppll2", NULL, 0, 1920000000, },
+       { HI3670_CLK_PPLL3, "clk_ppll3", NULL, 0, 1200000000, },
+       { HI3670_CLK_PPLL4, "clk_ppll4", NULL, 0, 900000000, },
+       { HI3670_CLK_PPLL6, "clk_ppll6", NULL, 0, 393216000, },
+       { HI3670_CLK_PPLL7, "clk_ppll7", NULL, 0, 1008000000, },
+       { HI3670_CLK_PPLL_PCIE, "clk_ppll_pcie", NULL, 0, 100000000, },
+       { HI3670_CLK_PCIEPLL_REV, "clk_pciepll_rev", NULL, 0, 100000000, },
+       { HI3670_CLK_SCPLL, "clk_scpll", NULL, 0, 245760000, },
+       { HI3670_PCLK, "pclk", NULL, 0, 20000000, },
+       { HI3670_CLK_UART0_DBG, "clk_uart0_dbg", NULL, 0, 19200000, },
+       { HI3670_CLK_UART6, "clk_uart6", NULL, 0, 19200000, },
+       { HI3670_OSC32K, "osc32k", NULL, 0, 32764, },
+       { HI3670_OSC19M, "osc19m", NULL, 0, 19200000, },
+       { HI3670_CLK_480M, "clk_480m", NULL, 0, 480000000, },
+       { HI3670_CLK_INVALID, "clk_invalid", NULL, 0, 10000000, },
+};
+
+/* crgctrl */
+static const struct hisi_fixed_factor_clock hi3670_crg_fixed_factor_clks[] = {
+       { HI3670_CLK_DIV_SYSBUS, "clk_div_sysbus", "clk_mux_sysbus",
+         1, 7, 0, },
+       { HI3670_CLK_FACTOR_MMC, "clk_factor_mmc", "clkin_sys",
+         1, 6, 0, },
+       { HI3670_CLK_SD_SYS, "clk_sd_sys", "clk_sd_sys_gt",
+         1, 6, 0, },
+       { HI3670_CLK_SDIO_SYS, "clk_sdio_sys", "clk_sdio_sys_gt",
+         1, 6, 0, },
+       { HI3670_CLK_DIV_A53HPM, "clk_div_a53hpm", "clk_a53hpm_andgt",
+         1, 4, 0, },
+       { HI3670_CLK_DIV_320M, "clk_div_320m", "clk_320m_pll_gt",
+         1, 5, 0, },
+       { HI3670_PCLK_GATE_UART0, "pclk_gate_uart0", "clk_mux_uartl",
+         1, 1, 0, },
+       { HI3670_CLK_FACTOR_UART0, "clk_factor_uart0", "clk_mux_uart0",
+         1, 1, 0, },
+       { HI3670_CLK_FACTOR_USB3PHY_PLL, "clk_factor_usb3phy_pll", "clk_ppll0",
+         1, 60, 0, },
+       { HI3670_CLK_GATE_ABB_USB, "clk_gate_abb_usb", "clk_gate_usb_tcxo_en",
+         1, 1, 0, },
+       { HI3670_CLK_GATE_UFSPHY_REF, "clk_gate_ufsphy_ref", "clkin_sys",
+         1, 1, 0, },
+       { HI3670_ICS_VOLT_HIGH, "ics_volt_high", "peri_volt_hold",
+         1, 1, 0, },
+       { HI3670_ICS_VOLT_MIDDLE, "ics_volt_middle", "peri_volt_middle",
+         1, 1, 0, },
+       { HI3670_VENC_VOLT_HOLD, "venc_volt_hold", "peri_volt_hold",
+         1, 1, 0, },
+       { HI3670_VDEC_VOLT_HOLD, "vdec_volt_hold", "peri_volt_hold",
+         1, 1, 0, },
+       { HI3670_EDC_VOLT_HOLD, "edc_volt_hold", "peri_volt_hold",
+         1, 1, 0, },
+       { HI3670_CLK_ISP_SNCLK_FAC, "clk_isp_snclk_fac", "clk_isp_snclk_angt",
+         1, 10, 0, },
+       { HI3670_CLK_FACTOR_RXDPHY, "clk_factor_rxdphy", "clk_andgt_rxdphy",
+         1, 6, 0, },
+};
+
+static const struct hisi_gate_clock hi3670_crgctrl_gate_sep_clks[] = {
+       { HI3670_PPLL1_EN_ACPU, "ppll1_en_acpu", "clk_ppll1",
+         CLK_SET_RATE_PARENT, 0x0, 0, 0, },
+       { HI3670_PPLL2_EN_ACPU, "ppll2_en_acpu", "clk_ppll2",
+         CLK_SET_RATE_PARENT, 0x0, 3, 0, },
+       { HI3670_PPLL3_EN_ACPU, "ppll3_en_acpu", "clk_ppll3",
+         CLK_SET_RATE_PARENT, 0x0, 27, 0, },
+       { HI3670_PPLL1_GT_CPU, "ppll1_gt_cpu", "clk_ppll1",
+         CLK_SET_RATE_PARENT, 0x460, 16, 0, },
+       { HI3670_PPLL2_GT_CPU, "ppll2_gt_cpu", "clk_ppll2",
+         CLK_SET_RATE_PARENT, 0x460, 18, 0, },
+       { HI3670_PPLL3_GT_CPU, "ppll3_gt_cpu", "clk_ppll3",
+         CLK_SET_RATE_PARENT, 0x460, 20, 0, },
+       { HI3670_CLK_GATE_PPLL2_MEDIA, "clk_gate_ppll2_media", "clk_ppll2",
+         CLK_SET_RATE_PARENT, 0x410, 27, 0, },
+       { HI3670_CLK_GATE_PPLL3_MEDIA, "clk_gate_ppll3_media", "clk_ppll3",
+         CLK_SET_RATE_PARENT, 0x410, 28, 0, },
+       { HI3670_CLK_GATE_PPLL4_MEDIA, "clk_gate_ppll4_media", "clk_ppll4",
+         CLK_SET_RATE_PARENT, 0x410, 26, 0, },
+       { HI3670_CLK_GATE_PPLL6_MEDIA, "clk_gate_ppll6_media", "clk_ppll6",
+         CLK_SET_RATE_PARENT, 0x410, 30, 0, },
+       { HI3670_CLK_GATE_PPLL7_MEDIA, "clk_gate_ppll7_media", "clk_ppll7",
+         CLK_SET_RATE_PARENT, 0x410, 29, 0, },
+       { HI3670_PCLK_GPIO0, "pclk_gpio0", "clk_div_cfgbus",
+         CLK_SET_RATE_PARENT, 0x10, 0, 0, },
+       { HI3670_PCLK_GPIO1, "pclk_gpio1", "clk_div_cfgbus",
+         CLK_SET_RATE_PARENT, 0x10, 1, 0, },
+       { HI3670_PCLK_GPIO2, "pclk_gpio2", "clk_div_cfgbus",
+         CLK_SET_RATE_PARENT, 0x10, 2, 0, },
+       { HI3670_PCLK_GPIO3, "pclk_gpio3", "clk_div_cfgbus",
+         CLK_SET_RATE_PARENT, 0x10, 3, 0, },
+       { HI3670_PCLK_GPIO4, "pclk_gpio4", "clk_div_cfgbus",
+         CLK_SET_RATE_PARENT, 0x10, 4, 0, },
+       { HI3670_PCLK_GPIO5, "pclk_gpio5", "clk_div_cfgbus",
+         CLK_SET_RATE_PARENT, 0x10, 5, 0, },
+       { HI3670_PCLK_GPIO6, "pclk_gpio6", "clk_div_cfgbus",
+         CLK_SET_RATE_PARENT, 0x10, 6, 0, },
+       { HI3670_PCLK_GPIO7, "pclk_gpio7", "clk_div_cfgbus",
+         CLK_SET_RATE_PARENT, 0x10, 7, 0, },
+       { HI3670_PCLK_GPIO8, "pclk_gpio8", "clk_div_cfgbus",
+         CLK_SET_RATE_PARENT, 0x10, 8, 0, },
+       { HI3670_PCLK_GPIO9, "pclk_gpio9", "clk_div_cfgbus",
+         CLK_SET_RATE_PARENT, 0x10, 9, 0, },
+       { HI3670_PCLK_GPIO10, "pclk_gpio10", "clk_div_cfgbus",
+         CLK_SET_RATE_PARENT, 0x10, 10, 0, },
+       { HI3670_PCLK_GPIO11, "pclk_gpio11", "clk_div_cfgbus",
+         CLK_SET_RATE_PARENT, 0x10, 11, 0, },
+       { HI3670_PCLK_GPIO12, "pclk_gpio12", "clk_div_cfgbus",
+         CLK_SET_RATE_PARENT, 0x10, 12, 0, },
+       { HI3670_PCLK_GPIO13, "pclk_gpio13", "clk_div_cfgbus",
+         CLK_SET_RATE_PARENT, 0x10, 13, 0, },
+       { HI3670_PCLK_GPIO14, "pclk_gpio14", "clk_div_cfgbus",
+         CLK_SET_RATE_PARENT, 0x10, 14, 0, },
+       { HI3670_PCLK_GPIO15, "pclk_gpio15", "clk_div_cfgbus",
+         CLK_SET_RATE_PARENT, 0x10, 15, 0, },
+       { HI3670_PCLK_GPIO16, "pclk_gpio16", "clk_div_cfgbus",
+         CLK_SET_RATE_PARENT, 0x10, 16, 0, },
+       { HI3670_PCLK_GPIO17, "pclk_gpio17", "clk_div_cfgbus",
+         CLK_SET_RATE_PARENT, 0x10, 17, 0, },
+       { HI3670_PCLK_GPIO20, "pclk_gpio20", "clk_div_cfgbus",
+         CLK_SET_RATE_PARENT, 0x10, 20, 0, },
+       { HI3670_PCLK_GPIO21, "pclk_gpio21", "clk_div_cfgbus",
+         CLK_SET_RATE_PARENT, 0x10, 21, 0, },
+       { HI3670_PCLK_GATE_DSI0, "pclk_gate_dsi0", "clk_div_cfgbus",
+         CLK_SET_RATE_PARENT, 0x50, 28, 0, },
+       { HI3670_PCLK_GATE_DSI1, "pclk_gate_dsi1", "clk_div_cfgbus",
+         CLK_SET_RATE_PARENT, 0x50, 29, 0, },
+       { HI3670_HCLK_GATE_USB3OTG, "hclk_gate_usb3otg", "clk_div_sysbus",
+         CLK_SET_RATE_PARENT, 0x0, 25, 0, },
+       { HI3670_ACLK_GATE_USB3DVFS, "aclk_gate_usb3dvfs", "autodiv_emmc0bus",
+         CLK_SET_RATE_PARENT, 0x40, 1, 0, },
+       { HI3670_HCLK_GATE_SDIO, "hclk_gate_sdio", "clk_div_sysbus",
+         CLK_SET_RATE_PARENT, 0x0, 21, 0, },
+       { HI3670_PCLK_GATE_PCIE_SYS, "pclk_gate_pcie_sys", "clk_div_mmc1bus",
+         CLK_SET_RATE_PARENT, 0x420, 7, 0, },
+       { HI3670_PCLK_GATE_PCIE_PHY, "pclk_gate_pcie_phy", "pclk_gate_mmc1_pcie",
+         CLK_SET_RATE_PARENT, 0x420, 9, 0, },
+       { HI3670_PCLK_GATE_MMC1_PCIE, "pclk_gate_mmc1_pcie", "pclk_div_mmc1_pcie",
+         CLK_SET_RATE_PARENT, 0x30, 12, 0, },
+       { HI3670_PCLK_GATE_MMC0_IOC, "pclk_gate_mmc0_ioc", "clk_div_mmc0bus",
+         CLK_SET_RATE_PARENT, 0x40, 13, 0, },
+       { HI3670_PCLK_GATE_MMC1_IOC, "pclk_gate_mmc1_ioc", "clk_div_mmc1bus",
+         CLK_SET_RATE_PARENT, 0x420, 21, 0, },
+       { HI3670_CLK_GATE_DMAC, "clk_gate_dmac", "clk_div_sysbus",
+         CLK_SET_RATE_PARENT, 0x30, 1, 0, },
+       { HI3670_CLK_GATE_VCODECBUS2DDR, "clk_gate_vcodecbus2ddr", "clk_div_vcodecbus",
+         CLK_SET_RATE_PARENT, 0x0, 5, 0, },
+       { HI3670_CLK_CCI400_BYPASS, "clk_cci400_bypass", "clk_ddrc_freq",
+         CLK_SET_RATE_PARENT, 0x22C, 28, 0, },
+       { HI3670_CLK_GATE_CCI400, "clk_gate_cci400", "clk_ddrc_freq",
+         CLK_SET_RATE_PARENT, 0x50, 14, 0, },
+       { HI3670_CLK_GATE_SD, "clk_gate_sd", "clk_mux_sd_sys",
+         CLK_SET_RATE_PARENT, 0x40, 17, 0, },
+       { HI3670_HCLK_GATE_SD, "hclk_gate_sd", "clk_div_sysbus",
+         CLK_SET_RATE_PARENT, 0x0, 30, 0, },
+       { HI3670_CLK_GATE_SDIO, "clk_gate_sdio", "clk_mux_sdio_sys",
+         CLK_SET_RATE_PARENT, 0x40, 19, 0, },
+       { HI3670_CLK_GATE_A57HPM, "clk_gate_a57hpm", "clk_div_a53hpm",
+         CLK_SET_RATE_PARENT, 0x050, 9, 0, },
+       { HI3670_CLK_GATE_A53HPM, "clk_gate_a53hpm", "clk_div_a53hpm",
+         CLK_SET_RATE_PARENT, 0x050, 13, 0, },
+       { HI3670_CLK_GATE_PA_A53, "clk_gate_pa_a53", "clk_div_a53hpm",
+         CLK_SET_RATE_PARENT, 0x480, 10, 0, },
+       { HI3670_CLK_GATE_PA_A57, "clk_gate_pa_a57", "clk_div_a53hpm",
+         CLK_SET_RATE_PARENT, 0x480, 9, 0, },
+       { HI3670_CLK_GATE_PA_G3D, "clk_gate_pa_g3d", "clk_div_a53hpm",
+         CLK_SET_RATE_PARENT, 0x480, 15, 0, },
+       { HI3670_CLK_GATE_GPUHPM, "clk_gate_gpuhpm", "clk_div_a53hpm",
+         CLK_SET_RATE_PARENT, 0x050, 15, 0, },
+       { HI3670_CLK_GATE_PERIHPM, "clk_gate_perihpm", "clk_div_a53hpm",
+         CLK_SET_RATE_PARENT, 0x050, 12, 0, },
+       { HI3670_CLK_GATE_AOHPM, "clk_gate_aohpm", "clk_div_a53hpm",
+         CLK_SET_RATE_PARENT, 0x050, 11, 0, },
+       { HI3670_CLK_GATE_UART1, "clk_gate_uart1", "clk_mux_uarth",
+         CLK_SET_RATE_PARENT, 0x20, 11, 0, },
+       { HI3670_CLK_GATE_UART4, "clk_gate_uart4", "clk_mux_uarth",
+         CLK_SET_RATE_PARENT, 0x20, 14, 0, },
+       { HI3670_PCLK_GATE_UART1, "pclk_gate_uart1", "clk_mux_uarth",
+         CLK_SET_RATE_PARENT, 0x20, 11, 0, },
+       { HI3670_PCLK_GATE_UART4, "pclk_gate_uart4", "clk_mux_uarth",
+         CLK_SET_RATE_PARENT, 0x20, 14, 0, },
+       { HI3670_CLK_GATE_UART2, "clk_gate_uart2", "clk_mux_uartl",
+         CLK_SET_RATE_PARENT, 0x20, 12, 0, },
+       { HI3670_CLK_GATE_UART5, "clk_gate_uart5", "clk_mux_uartl",
+         CLK_SET_RATE_PARENT, 0x20, 15, 0, },
+       { HI3670_PCLK_GATE_UART2, "pclk_gate_uart2", "clk_mux_uartl",
+         CLK_SET_RATE_PARENT, 0x20, 12, 0, },
+       { HI3670_PCLK_GATE_UART5, "pclk_gate_uart5", "clk_mux_uartl",
+         CLK_SET_RATE_PARENT, 0x20, 15, 0, },
+       { HI3670_CLK_GATE_UART0, "clk_gate_uart0", "clk_mux_uart0",
+         CLK_SET_RATE_PARENT, 0x20, 10, 0, },
+       { HI3670_CLK_GATE_I2C3, "clk_gate_i2c3", "clk_mux_i2c",
+         CLK_SET_RATE_PARENT, 0x20, 7, 0, },
+       { HI3670_CLK_GATE_I2C4, "clk_gate_i2c4", "clk_mux_i2c",
+         CLK_SET_RATE_PARENT, 0x20, 27, 0, },
+       { HI3670_CLK_GATE_I2C7, "clk_gate_i2c7", "clk_mux_i2c",
+         CLK_SET_RATE_PARENT, 0x10, 31, 0, },
+       { HI3670_PCLK_GATE_I2C3, "pclk_gate_i2c3", "clk_mux_i2c",
+         CLK_SET_RATE_PARENT, 0x20, 7, 0, },
+       { HI3670_PCLK_GATE_I2C4, "pclk_gate_i2c4", "clk_mux_i2c",
+         CLK_SET_RATE_PARENT, 0x20, 27, 0, },
+       { HI3670_PCLK_GATE_I2C7, "pclk_gate_i2c7", "clk_mux_i2c",
+         CLK_SET_RATE_PARENT, 0x10, 31, 0, },
+       { HI3670_CLK_GATE_SPI1, "clk_gate_spi1", "clk_mux_spi",
+         CLK_SET_RATE_PARENT, 0x20, 9, 0, },
+       { HI3670_CLK_GATE_SPI4, "clk_gate_spi4", "clk_mux_spi",
+         CLK_SET_RATE_PARENT, 0x40, 4, 0, },
+       { HI3670_PCLK_GATE_SPI1, "pclk_gate_spi1", "clk_mux_spi",
+         CLK_SET_RATE_PARENT, 0x20, 9, 0, },
+       { HI3670_PCLK_GATE_SPI4, "pclk_gate_spi4", "clk_mux_spi",
+         CLK_SET_RATE_PARENT, 0x40, 4, 0, },
+       { HI3670_CLK_GATE_USB3OTG_REF, "clk_gate_usb3otg_ref", "clkin_sys",
+         CLK_SET_RATE_PARENT, 0x40, 0, 0, },
+       { HI3670_CLK_GATE_USB2PHY_REF, "clk_gate_usb2phy_ref", "clkin_sys",
+         CLK_SET_RATE_PARENT, 0x410, 19, 0, },
+       { HI3670_CLK_GATE_PCIEAUX, "clk_gate_pcieaux", "clkin_sys",
+         CLK_SET_RATE_PARENT, 0x420, 8, 0, },
+       { HI3670_ACLK_GATE_PCIE, "aclk_gate_pcie", "clk_gate_mmc1_pcieaxi",
+         CLK_SET_RATE_PARENT, 0x420, 5, 0, },
+       { HI3670_CLK_GATE_MMC1_PCIEAXI, "clk_gate_mmc1_pcieaxi", "clk_div_pcieaxi",
+         CLK_SET_RATE_PARENT, 0x050, 4, 0, },
+       { HI3670_CLK_GATE_PCIEPHY_REF, "clk_gate_pciephy_ref", "clk_ppll_pcie",
+         CLK_SET_RATE_PARENT, 0x470, 14, 0, },
+       { HI3670_CLK_GATE_PCIE_DEBOUNCE, "clk_gate_pcie_debounce", "clk_ppll_pcie",
+         CLK_SET_RATE_PARENT, 0x470, 12, 0, },
+       { HI3670_CLK_GATE_PCIEIO, "clk_gate_pcieio", "clk_ppll_pcie",
+         CLK_SET_RATE_PARENT, 0x470, 13, 0, },
+       { HI3670_CLK_GATE_PCIE_HP, "clk_gate_pcie_hp", "clk_ppll_pcie",
+         CLK_SET_RATE_PARENT, 0x470, 15, 0, },
+       { HI3670_CLK_GATE_AO_ASP, "clk_gate_ao_asp", "clk_div_ao_asp",
+         CLK_SET_RATE_PARENT, 0x0, 26, 0, },
+       { HI3670_PCLK_GATE_PCTRL, "pclk_gate_pctrl", "clk_div_ptp",
+         CLK_SET_RATE_PARENT, 0x20, 31, 0, },
+       { HI3670_CLK_CSI_TRANS_GT, "clk_csi_trans_gt", "clk_div_csi_trans",
+         CLK_SET_RATE_PARENT, 0x30, 24, 0, },
+       { HI3670_CLK_DSI_TRANS_GT, "clk_dsi_trans_gt", "clk_div_dsi_trans",
+         CLK_SET_RATE_PARENT, 0x30, 25, 0, },
+       { HI3670_CLK_GATE_PWM, "clk_gate_pwm", "clk_div_ptp",
+         CLK_SET_RATE_PARENT, 0x20, 0, 0, },
+       { HI3670_ABB_AUDIO_EN0, "abb_audio_en0", "clk_gate_abb_192",
+         CLK_SET_RATE_PARENT, 0x30, 8, 0, },
+       { HI3670_ABB_AUDIO_EN1, "abb_audio_en1", "clk_gate_abb_192",
+         CLK_SET_RATE_PARENT, 0x30, 9, 0, },
+       { HI3670_ABB_AUDIO_GT_EN0, "abb_audio_gt_en0", "abb_audio_en0",
+         CLK_SET_RATE_PARENT, 0x30, 19, 0, },
+       { HI3670_ABB_AUDIO_GT_EN1, "abb_audio_gt_en1", "abb_audio_en1",
+         CLK_SET_RATE_PARENT, 0x40, 20, 0, },
+       { HI3670_CLK_GATE_DP_AUDIO_PLL_AO, "clk_gate_dp_audio_pll_ao", "clkdiv_dp_audio_pll_ao",
+         CLK_SET_RATE_PARENT, 0x00, 13, 0, },
+       { HI3670_PERI_VOLT_HOLD, "peri_volt_hold", "clkin_sys",
+         CLK_SET_RATE_PARENT, 0, 1, 0, },
+       { HI3670_PERI_VOLT_MIDDLE, "peri_volt_middle", "clkin_sys",
+         CLK_SET_RATE_PARENT, 0, 1, 0, },
+       { HI3670_CLK_GATE_ISP_SNCLK0, "clk_gate_isp_snclk0", "clk_isp_snclk_mux0",
+         CLK_SET_RATE_PARENT, 0x50, 16, 0, },
+       { HI3670_CLK_GATE_ISP_SNCLK1, "clk_gate_isp_snclk1", "clk_isp_snclk_mux1",
+         CLK_SET_RATE_PARENT, 0x50, 17, 0, },
+       { HI3670_CLK_GATE_ISP_SNCLK2, "clk_gate_isp_snclk2", "clk_isp_snclk_mux2",
+         CLK_SET_RATE_PARENT, 0x50, 18, 0, },
+       { HI3670_CLK_GATE_RXDPHY0_CFG, "clk_gate_rxdphy0_cfg", "clk_mux_rxdphy_cfg",
+         CLK_SET_RATE_PARENT, 0x030, 20, 0, },
+       { HI3670_CLK_GATE_RXDPHY1_CFG, "clk_gate_rxdphy1_cfg", "clk_mux_rxdphy_cfg",
+         CLK_SET_RATE_PARENT, 0x030, 21, 0, },
+       { HI3670_CLK_GATE_RXDPHY2_CFG, "clk_gate_rxdphy2_cfg", "clk_mux_rxdphy_cfg",
+         CLK_SET_RATE_PARENT, 0x030, 22, 0, },
+       { HI3670_CLK_GATE_TXDPHY0_CFG, "clk_gate_txdphy0_cfg", "clkin_sys",
+         CLK_SET_RATE_PARENT, 0x030, 28, 0, },
+       { HI3670_CLK_GATE_TXDPHY0_REF, "clk_gate_txdphy0_ref", "clkin_sys",
+         CLK_SET_RATE_PARENT, 0x030, 29, 0, },
+       { HI3670_CLK_GATE_TXDPHY1_CFG, "clk_gate_txdphy1_cfg", "clkin_sys",
+         CLK_SET_RATE_PARENT, 0x030, 30, 0, },
+       { HI3670_CLK_GATE_TXDPHY1_REF, "clk_gate_txdphy1_ref", "clkin_sys",
+         CLK_SET_RATE_PARENT, 0x030, 31, 0, },
+       { HI3670_CLK_GATE_MEDIA_TCXO, "clk_gate_media_tcxo", "clkin_sys",
+         CLK_SET_RATE_PARENT, 0x40, 6, 0, },
+};
+
+static const struct hisi_gate_clock hi3670_crgctrl_gate_clks[] = {
+       { HI3670_AUTODIV_SYSBUS, "autodiv_sysbus", "clk_div_sysbus",
+         CLK_SET_RATE_PARENT, 0x404, 5, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_AUTODIV_EMMC0BUS, "autodiv_emmc0bus", "autodiv_sysbus",
+         CLK_SET_RATE_PARENT, 0x404, 1, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_PCLK_ANDGT_MMC1_PCIE, "pclk_andgt_mmc1_pcie", "clk_div_320m",
+         CLK_SET_RATE_PARENT, 0xf8, 13, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_GATE_VCODECBUS_GT, "clk_gate_vcodecbus_gt", "clk_mux_vcodecbus",
+         CLK_SET_RATE_PARENT, 0x0F0, 8, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_ANDGT_SD, "clk_andgt_sd", "clk_mux_sd_pll",
+         CLK_SET_RATE_PARENT, 0xF4, 3, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_SD_SYS_GT, "clk_sd_sys_gt", "clkin_sys",
+         CLK_SET_RATE_PARENT, 0xF4, 5, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_ANDGT_SDIO, "clk_andgt_sdio", "clk_mux_sdio_pll",
+         CLK_SET_RATE_PARENT, 0xF4, 8, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_SDIO_SYS_GT, "clk_sdio_sys_gt", "clkin_sys",
+         CLK_SET_RATE_PARENT, 0xF4, 6, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_A53HPM_ANDGT, "clk_a53hpm_andgt", "clk_mux_a53hpm",
+         CLK_SET_RATE_PARENT, 0x0F4, 7, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_320M_PLL_GT, "clk_320m_pll_gt", "clk_mux_320m",
+         CLK_SET_RATE_PARENT, 0xF8, 10, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_ANDGT_UARTH, "clk_andgt_uarth", "clk_div_320m",
+         CLK_SET_RATE_PARENT, 0xF4, 11, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_ANDGT_UARTL, "clk_andgt_uartl", "clk_div_320m",
+         CLK_SET_RATE_PARENT, 0xF4, 10, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_ANDGT_UART0, "clk_andgt_uart0", "clk_div_320m",
+         CLK_SET_RATE_PARENT, 0xF4, 9, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_ANDGT_SPI, "clk_andgt_spi", "clk_div_320m",
+         CLK_SET_RATE_PARENT, 0xF4, 13, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_ANDGT_PCIEAXI, "clk_andgt_pcieaxi", "clk_mux_pcieaxi",
+         CLK_SET_RATE_PARENT, 0xfc, 15, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_AO_ASP_GT, "clk_div_ao_asp_gt", "clk_mux_ao_asp",
+         CLK_SET_RATE_PARENT, 0xF4, 4, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_GATE_CSI_TRANS, "clk_gate_csi_trans", "clk_ppll2",
+         CLK_SET_RATE_PARENT, 0xF4, 14, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_GATE_DSI_TRANS, "clk_gate_dsi_trans", "clk_ppll2",
+         CLK_SET_RATE_PARENT, 0xF4, 1, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_ANDGT_PTP, "clk_andgt_ptp", "clk_div_320m",
+         CLK_SET_RATE_PARENT, 0xF8, 5, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_ANDGT_OUT0, "clk_andgt_out0", "clk_ppll0",
+         CLK_SET_RATE_PARENT, 0xF0, 10, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_ANDGT_OUT1, "clk_andgt_out1", "clk_ppll0",
+         CLK_SET_RATE_PARENT, 0xF0, 11, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLKGT_DP_AUDIO_PLL_AO, "clkgt_dp_audio_pll_ao", "clk_ppll6",
+         CLK_SET_RATE_PARENT, 0xF8, 15, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_ANDGT_VDEC, "clk_andgt_vdec", "clk_mux_vdec",
+         CLK_SET_RATE_PARENT, 0xF0, 13, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_ANDGT_VENC, "clk_andgt_venc", "clk_mux_venc",
+         CLK_SET_RATE_PARENT, 0xF0, 9, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_ISP_SNCLK_ANGT, "clk_isp_snclk_angt", "clk_div_a53hpm",
+         CLK_SET_RATE_PARENT, 0x108, 2, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_ANDGT_RXDPHY, "clk_andgt_rxdphy", "clk_div_a53hpm",
+         CLK_SET_RATE_PARENT, 0x0F0, 12, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_ANDGT_ICS, "clk_andgt_ics", "clk_mux_ics",
+         CLK_SET_RATE_PARENT, 0xf0, 14, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_AUTODIV_DMABUS, "autodiv_dmabus", "autodiv_sysbus",
+         CLK_SET_RATE_PARENT, 0x404, 3, CLK_GATE_HIWORD_MASK, 0, },
+};
+
+static const char *const
+clk_mux_sysbus_p[] = { "clk_ppll1", "clk_ppll0", };
+static const char *const
+clk_mux_vcodecbus_p[] = { "clk_invalid", "clk_ppll4", "clk_ppll0",
+                         "clk_invalid", "clk_ppll2", "clk_invalid",
+                         "clk_invalid", "clk_invalid", "clk_ppll3",
+                         "clk_invalid", "clk_invalid", "clk_invalid",
+                         "clk_invalid", "clk_invalid", "clk_invalid",
+                         "clk_invalid", };
+static const char *const
+clk_mux_sd_sys_p[] = { "clk_sd_sys", "clk_div_sd", };
+static const char *const
+clk_mux_sd_pll_p[] = { "clk_ppll0", "clk_ppll3", "clk_ppll2", "clk_ppll2", };
+static const char *const
+clk_mux_sdio_sys_p[] = { "clk_sdio_sys", "clk_div_sdio", };
+static const char *const
+clk_mux_sdio_pll_p[] = { "clk_ppll0", "clk_ppll3", "clk_ppll2", "clk_ppll2", };
+static const char *const
+clk_mux_a53hpm_p[] = { "clk_ppll0", "clk_ppll2", };
+static const char *const
+clk_mux_320m_p[] = { "clk_ppll2", "clk_ppll0", };
+static const char *const
+clk_mux_uarth_p[] = { "clkin_sys", "clk_div_uarth", };
+static const char *const
+clk_mux_uartl_p[] = { "clkin_sys", "clk_div_uartl", };
+static const char *const
+clk_mux_uart0_p[] = { "clkin_sys", "clk_div_uart0", };
+static const char *const
+clk_mux_i2c_p[] = { "clkin_sys", "clk_div_i2c", };
+static const char *const
+clk_mux_spi_p[] = { "clkin_sys", "clk_div_spi", };
+static const char *const
+clk_mux_pcieaxi_p[] = { "clkin_sys", "clk_ppll0", };
+static const char *const
+clk_mux_ao_asp_p[] = { "clk_ppll2", "clk_ppll3", };
+static const char *const
+clk_mux_vdec_p[] = { "clk_invalid", "clk_ppll4", "clk_ppll0", "clk_invalid",
+                    "clk_invalid", "clk_invalid", "clk_invalid", "clk_invalid",
+                    "clk_invalid", "clk_invalid", "clk_invalid", "clk_invalid",
+                    "clk_invalid", "clk_invalid", "clk_invalid",
+                    "clk_invalid", };
+static const char *const
+clk_mux_venc_p[] = { "clk_invalid", "clk_ppll4", "clk_ppll0", "clk_invalid",
+                    "clk_invalid", "clk_invalid", "clk_invalid", "clk_invalid",
+                    "clk_invalid", "clk_invalid", "clk_invalid", "clk_invalid",
+                    "clk_invalid", "clk_invalid", "clk_invalid",
+                    "clk_invalid", };
+static const char *const
+clk_isp_snclk_mux0_p[] = { "clkin_sys", "clk_isp_snclk_div0", };
+static const char *const
+clk_isp_snclk_mux1_p[] = { "clkin_sys", "clk_isp_snclk_div1", };
+static const char *const
+clk_isp_snclk_mux2_p[] = { "clkin_sys", "clk_isp_snclk_div2", };
+static const char *const
+clk_mux_rxdphy_cfg_p[] = { "clk_factor_rxdphy", "clkin_sys", };
+static const char *const
+clk_mux_ics_p[] = { "clk_invalid", "clk_ppll4", "clk_ppll0", "clk_invalid",
+                   "clk_ppll2", "clk_invalid", "clk_invalid", "clk_invalid",
+                   "clk_ppll3", "clk_invalid", "clk_invalid", "clk_invalid",
+                   "clk_invalid", "clk_invalid", "clk_invalid",
+                   "clk_invalid", };
+
+static const struct hisi_mux_clock hi3670_crgctrl_mux_clks[] = {
+       { HI3670_CLK_MUX_SYSBUS, "clk_mux_sysbus", clk_mux_sysbus_p,
+         ARRAY_SIZE(clk_mux_sysbus_p), CLK_SET_RATE_PARENT,
+         0xAC, 0, 1, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_VCODECBUS, "clk_mux_vcodecbus", clk_mux_vcodecbus_p,
+         ARRAY_SIZE(clk_mux_vcodecbus_p), CLK_SET_RATE_PARENT,
+         0x0C8, 0, 4, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_SD_SYS, "clk_mux_sd_sys", clk_mux_sd_sys_p,
+         ARRAY_SIZE(clk_mux_sd_sys_p), CLK_SET_RATE_PARENT,
+         0x0B8, 6, 1, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_SD_PLL, "clk_mux_sd_pll", clk_mux_sd_pll_p,
+         ARRAY_SIZE(clk_mux_sd_pll_p), CLK_SET_RATE_PARENT,
+         0x0B8, 4, 2, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_SDIO_SYS, "clk_mux_sdio_sys", clk_mux_sdio_sys_p,
+         ARRAY_SIZE(clk_mux_sdio_sys_p), CLK_SET_RATE_PARENT,
+         0x0C0, 6, 1, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_SDIO_PLL, "clk_mux_sdio_pll", clk_mux_sdio_pll_p,
+         ARRAY_SIZE(clk_mux_sdio_pll_p), CLK_SET_RATE_PARENT,
+         0x0C0, 4, 2, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_A53HPM, "clk_mux_a53hpm", clk_mux_a53hpm_p,
+         ARRAY_SIZE(clk_mux_a53hpm_p), CLK_SET_RATE_PARENT,
+         0x0D4, 9, 1, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_320M, "clk_mux_320m", clk_mux_320m_p,
+         ARRAY_SIZE(clk_mux_320m_p), CLK_SET_RATE_PARENT,
+         0x100, 0, 1, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_UARTH, "clk_mux_uarth", clk_mux_uarth_p,
+         ARRAY_SIZE(clk_mux_uarth_p), CLK_SET_RATE_PARENT,
+         0xAC, 4, 1, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_UARTL, "clk_mux_uartl", clk_mux_uartl_p,
+         ARRAY_SIZE(clk_mux_uartl_p), CLK_SET_RATE_PARENT,
+         0xAC, 3, 1, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_UART0, "clk_mux_uart0", clk_mux_uart0_p,
+         ARRAY_SIZE(clk_mux_uart0_p), CLK_SET_RATE_PARENT,
+         0xAC, 2, 1, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_I2C, "clk_mux_i2c", clk_mux_i2c_p,
+         ARRAY_SIZE(clk_mux_i2c_p), CLK_SET_RATE_PARENT,
+         0xAC, 13, 1, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_SPI, "clk_mux_spi", clk_mux_spi_p,
+         ARRAY_SIZE(clk_mux_spi_p), CLK_SET_RATE_PARENT,
+         0xAC, 8, 1, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_PCIEAXI, "clk_mux_pcieaxi", clk_mux_pcieaxi_p,
+         ARRAY_SIZE(clk_mux_pcieaxi_p), CLK_SET_RATE_PARENT,
+         0xb4, 5, 1, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_AO_ASP, "clk_mux_ao_asp", clk_mux_ao_asp_p,
+         ARRAY_SIZE(clk_mux_ao_asp_p), CLK_SET_RATE_PARENT,
+         0x100, 6, 1, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_VDEC, "clk_mux_vdec", clk_mux_vdec_p,
+         ARRAY_SIZE(clk_mux_vdec_p), CLK_SET_RATE_PARENT,
+         0xC8, 8, 4, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_VENC, "clk_mux_venc", clk_mux_venc_p,
+         ARRAY_SIZE(clk_mux_venc_p), CLK_SET_RATE_PARENT,
+         0xC8, 4, 4, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_ISP_SNCLK_MUX0, "clk_isp_snclk_mux0", clk_isp_snclk_mux0_p,
+         ARRAY_SIZE(clk_isp_snclk_mux0_p), CLK_SET_RATE_PARENT,
+         0x108, 3, 1, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_ISP_SNCLK_MUX1, "clk_isp_snclk_mux1", clk_isp_snclk_mux1_p,
+         ARRAY_SIZE(clk_isp_snclk_mux1_p), CLK_SET_RATE_PARENT,
+         0x10C, 13, 1, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_ISP_SNCLK_MUX2, "clk_isp_snclk_mux2", clk_isp_snclk_mux2_p,
+         ARRAY_SIZE(clk_isp_snclk_mux2_p), CLK_SET_RATE_PARENT,
+         0x10C, 10, 1, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_RXDPHY_CFG, "clk_mux_rxdphy_cfg", clk_mux_rxdphy_cfg_p,
+         ARRAY_SIZE(clk_mux_rxdphy_cfg_p), CLK_SET_RATE_PARENT,
+         0x0C4, 8, 1, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_ICS, "clk_mux_ics", clk_mux_ics_p,
+         ARRAY_SIZE(clk_mux_ics_p), CLK_SET_RATE_PARENT,
+         0xc8, 12, 4, CLK_MUX_HIWORD_MASK, },
+};
+
+static const struct hisi_divider_clock hi3670_crgctrl_divider_clks[] = {
+       { HI3670_CLK_DIV_CFGBUS, "clk_div_cfgbus", "clk_div_sysbus",
+         CLK_SET_RATE_PARENT, 0xEC, 0, 2, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_MMC0BUS, "clk_div_mmc0bus", "autodiv_emmc0bus",
+         CLK_SET_RATE_PARENT, 0x0EC, 2, 1, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_MMC1BUS, "clk_div_mmc1bus", "clk_div_sysbus",
+         CLK_SET_RATE_PARENT, 0x0EC, 3, 1, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_PCLK_DIV_MMC1_PCIE, "pclk_div_mmc1_pcie", "pclk_andgt_mmc1_pcie",
+         CLK_SET_RATE_PARENT, 0xb4, 6, 4, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_VCODECBUS, "clk_div_vcodecbus", "clk_gate_vcodecbus_gt",
+         CLK_SET_RATE_PARENT, 0x0BC, 0, 6, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_SD, "clk_div_sd", "clk_andgt_sd",
+         CLK_SET_RATE_PARENT, 0xB8, 0, 4, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_SDIO, "clk_div_sdio", "clk_andgt_sdio",
+         CLK_SET_RATE_PARENT, 0xC0, 0, 4, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_UARTH, "clk_div_uarth", "clk_andgt_uarth",
+         CLK_SET_RATE_PARENT, 0xB0, 12, 4, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_UARTL, "clk_div_uartl", "clk_andgt_uartl",
+         CLK_SET_RATE_PARENT, 0xB0, 8, 4, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_UART0, "clk_div_uart0", "clk_andgt_uart0",
+         CLK_SET_RATE_PARENT, 0xB0, 4, 4, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_I2C, "clk_div_i2c", "clk_div_320m",
+         CLK_SET_RATE_PARENT, 0xE8, 4, 4, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_SPI, "clk_div_spi", "clk_andgt_spi",
+         CLK_SET_RATE_PARENT, 0xC4, 12, 4, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_PCIEAXI, "clk_div_pcieaxi", "clk_andgt_pcieaxi",
+         CLK_SET_RATE_PARENT, 0xb4, 0, 5, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_AO_ASP, "clk_div_ao_asp", "clk_div_ao_asp_gt",
+         CLK_SET_RATE_PARENT, 0x108, 6, 4, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_CSI_TRANS, "clk_div_csi_trans", "clk_gate_csi_trans",
+         CLK_SET_RATE_PARENT, 0xD4, 0, 5, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_DSI_TRANS, "clk_div_dsi_trans", "clk_gate_dsi_trans",
+         CLK_SET_RATE_PARENT, 0xD4, 10, 5, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_PTP, "clk_div_ptp", "clk_andgt_ptp",
+         CLK_SET_RATE_PARENT, 0xD8, 0, 4, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_CLKOUT0_PLL, "clk_div_clkout0_pll", "clk_andgt_out0",
+         CLK_SET_RATE_PARENT, 0xe0, 4, 6, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_CLKOUT1_PLL, "clk_div_clkout1_pll", "clk_andgt_out1",
+         CLK_SET_RATE_PARENT, 0xe0, 10, 6, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLKDIV_DP_AUDIO_PLL_AO, "clkdiv_dp_audio_pll_ao", "clkgt_dp_audio_pll_ao",
+         CLK_SET_RATE_PARENT, 0xBC, 11, 4, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_VDEC, "clk_div_vdec", "clk_andgt_vdec",
+         CLK_SET_RATE_PARENT, 0xC4, 0, 6, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_VENC, "clk_div_venc", "clk_andgt_venc",
+         CLK_SET_RATE_PARENT, 0xC0, 8, 6, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_ISP_SNCLK_DIV0, "clk_isp_snclk_div0", "clk_isp_snclk_fac",
+         CLK_SET_RATE_PARENT, 0x108, 0, 2, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_ISP_SNCLK_DIV1, "clk_isp_snclk_div1", "clk_isp_snclk_fac",
+         CLK_SET_RATE_PARENT, 0x10C, 14, 2, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_ISP_SNCLK_DIV2, "clk_isp_snclk_div2", "clk_isp_snclk_fac",
+         CLK_SET_RATE_PARENT, 0x10C, 11, 2, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_ICS, "clk_div_ics", "clk_andgt_ics",
+         CLK_SET_RATE_PARENT, 0xE4, 9, 6, CLK_DIVIDER_HIWORD_MASK, 0, },
+};
+
+/* clk_pmuctrl */
+static const struct hisi_gate_clock hi3670_pmu_gate_clks[] = {
+       { HI3670_GATE_ABB_192, "clk_gate_abb_192", "clkin_sys",
+         CLK_SET_RATE_PARENT, (0x037 << 2), 0, 0, },
+};
+
+/* clk_pctrl */
+static const struct hisi_gate_clock hi3670_pctrl_gate_clks[] = {
+       { HI3670_GATE_UFS_TCXO_EN, "clk_gate_ufs_tcxo_en", "clk_gate_abb_192",
+         CLK_SET_RATE_PARENT, 0x10, 0, CLK_GATE_HIWORD_MASK, },
+       { HI3670_GATE_USB_TCXO_EN, "clk_gate_usb_tcxo_en", "clk_gate_abb_192",
+         CLK_SET_RATE_PARENT, 0x10, 1, CLK_GATE_HIWORD_MASK, },
+};
+
+/* clk_sctrl */
+static const struct hisi_gate_clock hi3670_sctrl_gate_sep_clks[] = {
+       { HI3670_PPLL0_EN_ACPU, "ppll0_en_acpu", "clk_ppll0",
+         CLK_SET_RATE_PARENT, 0x190, 26, 0, },
+       { HI3670_PPLL0_GT_CPU, "ppll0_gt_cpu", "clk_ppll0",
+         CLK_SET_RATE_PARENT, 0x190, 15, 0, },
+       { HI3670_CLK_GATE_PPLL0_MEDIA, "clk_gate_ppll0_media", "clk_ppll0",
+         CLK_SET_RATE_PARENT, 0x1b0, 6, 0, },
+       { HI3670_PCLK_GPIO18, "pclk_gpio18", "clk_div_aobus",
+         CLK_SET_RATE_PARENT, 0x1B0, 9, 0, },
+       { HI3670_PCLK_GPIO19, "pclk_gpio19", "clk_div_aobus",
+         CLK_SET_RATE_PARENT, 0x1B0, 8, 0, },
+       { HI3670_CLK_GATE_SPI, "clk_gate_spi", "clk_div_ioperi",
+         CLK_SET_RATE_PARENT, 0x1B0, 10, 0, },
+       { HI3670_PCLK_GATE_SPI, "pclk_gate_spi", "clk_div_ioperi",
+         CLK_SET_RATE_PARENT, 0x1B0, 10, 0, },
+       { HI3670_CLK_GATE_UFS_SUBSYS, "clk_gate_ufs_subsys", "clk_div_ufs_subsys",
+         CLK_SET_RATE_PARENT, 0x1B0, 14, 0, },
+       { HI3670_CLK_GATE_UFSIO_REF, "clk_gate_ufsio_ref", "clkin_sys",
+         CLK_SET_RATE_PARENT, 0x1b0, 12, 0, },
+       { HI3670_PCLK_AO_GPIO0, "pclk_ao_gpio0", "clk_div_aobus",
+         CLK_SET_RATE_PARENT, 0x160, 11, 0, },
+       { HI3670_PCLK_AO_GPIO1, "pclk_ao_gpio1", "clk_div_aobus",
+         CLK_SET_RATE_PARENT, 0x160, 12, 0, },
+       { HI3670_PCLK_AO_GPIO2, "pclk_ao_gpio2", "clk_div_aobus",
+         CLK_SET_RATE_PARENT, 0x160, 13, 0, },
+       { HI3670_PCLK_AO_GPIO3, "pclk_ao_gpio3", "clk_div_aobus",
+         CLK_SET_RATE_PARENT, 0x160, 14, 0, },
+       { HI3670_PCLK_AO_GPIO4, "pclk_ao_gpio4", "clk_div_aobus",
+         CLK_SET_RATE_PARENT, 0x160, 21, 0, },
+       { HI3670_PCLK_AO_GPIO5, "pclk_ao_gpio5", "clk_div_aobus",
+         CLK_SET_RATE_PARENT, 0x160, 22, 0, },
+       { HI3670_PCLK_AO_GPIO6, "pclk_ao_gpio6", "clk_div_aobus",
+         CLK_SET_RATE_PARENT, 0x160, 25, 0, },
+       { HI3670_CLK_GATE_OUT0, "clk_gate_out0", "clk_mux_clkout0",
+         CLK_SET_RATE_PARENT, 0x160, 16, 0, },
+       { HI3670_CLK_GATE_OUT1, "clk_gate_out1", "clk_mux_clkout1",
+         CLK_SET_RATE_PARENT, 0x160, 17, 0, },
+       { HI3670_PCLK_GATE_SYSCNT, "pclk_gate_syscnt", "clk_div_aobus",
+         CLK_SET_RATE_PARENT, 0x160, 19, 0, },
+       { HI3670_CLK_GATE_SYSCNT, "clk_gate_syscnt", "clkin_sys",
+         CLK_SET_RATE_PARENT, 0x160, 20, 0, },
+       { HI3670_CLK_GATE_ASP_SUBSYS_PERI, "clk_gate_asp_subsys_peri",
+         "clk_mux_asp_subsys_peri",
+         CLK_SET_RATE_PARENT, 0x170, 6, 0, },
+       { HI3670_CLK_GATE_ASP_SUBSYS, "clk_gate_asp_subsys", "clk_mux_asp_pll",
+         CLK_SET_RATE_PARENT, 0x170, 4, 0, },
+       { HI3670_CLK_GATE_ASP_TCXO, "clk_gate_asp_tcxo", "clkin_sys",
+         CLK_SET_RATE_PARENT, 0x160, 27, 0, },
+       { HI3670_CLK_GATE_DP_AUDIO_PLL, "clk_gate_dp_audio_pll",
+         "clk_gate_dp_audio_pll_ao",
+         CLK_SET_RATE_PARENT, 0x1B0, 7, 0, },
+};
+
+static const struct hisi_gate_clock hi3670_sctrl_gate_clks[] = {
+       { HI3670_CLK_ANDGT_IOPERI, "clk_andgt_ioperi", "clk_ppll0",
+         CLK_SET_RATE_PARENT, 0x270, 6, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLKANDGT_ASP_SUBSYS_PERI, "clkandgt_asp_subsys_peri",
+         "clk_ppll0",
+         CLK_SET_RATE_PARENT, 0x268, 3, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_ANGT_ASP_SUBSYS, "clk_angt_asp_subsys", "clk_ppll0",
+         CLK_SET_RATE_PARENT, 0x258, 0, CLK_GATE_HIWORD_MASK, 0, },
+};
+
+static const char *const
+clk_mux_ufs_subsys_p[] = { "clkin_sys", "clk_ppll0", };
+static const char *const
+clk_mux_clkout0_p[] = { "clkin_ref", "clk_div_clkout0_tcxo",
+                       "clk_div_clkout0_pll", "clk_div_clkout0_pll", };
+static const char *const
+clk_mux_clkout1_p[] = { "clkin_ref", "clk_div_clkout1_tcxo",
+                       "clk_div_clkout1_pll", "clk_div_clkout1_pll", };
+static const char *const
+clk_mux_asp_subsys_peri_p[] = { "clk_ppll0", "clk_fll_src", };
+static const char *const
+clk_mux_asp_pll_p[] = { "clk_ppll0", "clk_fll_src", "clk_gate_ao_asp",
+                       "clk_pciepll_rev", };
+
+static const struct hisi_mux_clock hi3670_sctrl_mux_clks[] = {
+       { HI3670_CLK_MUX_UFS_SUBSYS, "clk_mux_ufs_subsys", clk_mux_ufs_subsys_p,
+         ARRAY_SIZE(clk_mux_ufs_subsys_p), CLK_SET_RATE_PARENT,
+         0x274, 8, 1, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_CLKOUT0, "clk_mux_clkout0", clk_mux_clkout0_p,
+         ARRAY_SIZE(clk_mux_clkout0_p), CLK_SET_RATE_PARENT,
+         0x254, 12, 2, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_CLKOUT1, "clk_mux_clkout1", clk_mux_clkout1_p,
+         ARRAY_SIZE(clk_mux_clkout1_p), CLK_SET_RATE_PARENT,
+         0x254, 14, 2, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_ASP_SUBSYS_PERI, "clk_mux_asp_subsys_peri",
+         clk_mux_asp_subsys_peri_p, ARRAY_SIZE(clk_mux_asp_subsys_peri_p),
+         CLK_SET_RATE_PARENT, 0x268, 8, 1, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_ASP_PLL, "clk_mux_asp_pll", clk_mux_asp_pll_p,
+         ARRAY_SIZE(clk_mux_asp_pll_p), CLK_SET_RATE_PARENT,
+         0x268, 9, 2, CLK_MUX_HIWORD_MASK, },
+};
+
+static const struct hisi_divider_clock hi3670_sctrl_divider_clks[] = {
+       { HI3670_CLK_DIV_AOBUS, "clk_div_aobus", "clk_ppll0",
+         CLK_SET_RATE_PARENT, 0x254, 0, 6, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_UFS_SUBSYS, "clk_div_ufs_subsys", "clk_mux_ufs_subsys",
+         CLK_SET_RATE_PARENT, 0x274, 0, 6, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_IOPERI, "clk_div_ioperi", "clk_andgt_ioperi",
+         CLK_SET_RATE_PARENT, 0x270, 0, 6, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_CLKOUT0_TCXO, "clk_div_clkout0_tcxo", "clkin_sys",
+         CLK_SET_RATE_PARENT, 0x254, 6, 3, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_CLKOUT1_TCXO, "clk_div_clkout1_tcxo", "clkin_sys",
+         CLK_SET_RATE_PARENT, 0x254, 9, 3, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_ASP_SUBSYS_PERI_DIV, "clk_asp_subsys_peri_div", "clkandgt_asp_subsys_peri",
+         CLK_SET_RATE_PARENT, 0x268, 0, 3, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_ASP_SUBSYS, "clk_div_asp_subsys", "clk_angt_asp_subsys",
+         CLK_SET_RATE_PARENT, 0x250, 0, 3, CLK_DIVIDER_HIWORD_MASK, 0, },
+};
+
+/* clk_iomcu */
+static const struct hisi_fixed_factor_clock hi3670_iomcu_fixed_factor_clks[] = {
+       { HI3670_CLK_GATE_I2C0, "clk_gate_i2c0", "clk_i2c0_gate_iomcu", 1, 4, 0, },
+       { HI3670_CLK_GATE_I2C1, "clk_gate_i2c1", "clk_i2c1_gate_iomcu", 1, 4, 0, },
+       { HI3670_CLK_GATE_I2C2, "clk_gate_i2c2", "clk_i2c2_gate_iomcu", 1, 4, 0, },
+       { HI3670_CLK_GATE_SPI0, "clk_gate_spi0", "clk_spi0_gate_iomcu", 1, 1, 0, },
+       { HI3670_CLK_GATE_SPI2, "clk_gate_spi2", "clk_spi2_gate_iomcu", 1, 1, 0, },
+       { HI3670_CLK_GATE_UART3, "clk_gate_uart3", "clk_uart3_gate_iomcu", 1, 16, 0, },
+};
+
+static const struct hisi_gate_clock hi3670_iomcu_gate_sep_clks[] = {
+       { HI3670_CLK_I2C0_GATE_IOMCU, "clk_i2c0_gate_iomcu", "clk_fll_src",
+         CLK_SET_RATE_PARENT, 0x10, 3, 0, },
+       { HI3670_CLK_I2C1_GATE_IOMCU, "clk_i2c1_gate_iomcu", "clk_fll_src",
+         CLK_SET_RATE_PARENT, 0x10, 4, 0, },
+       { HI3670_CLK_I2C2_GATE_IOMCU, "clk_i2c2_gate_iomcu", "clk_fll_src",
+         CLK_SET_RATE_PARENT, 0x10, 5, 0, },
+       { HI3670_CLK_SPI0_GATE_IOMCU, "clk_spi0_gate_iomcu", "clk_fll_src",
+         CLK_SET_RATE_PARENT, 0x10, 10, 0, },
+       { HI3670_CLK_SPI2_GATE_IOMCU, "clk_spi2_gate_iomcu", "clk_fll_src",
+         CLK_SET_RATE_PARENT, 0x10, 30, 0, },
+       { HI3670_CLK_UART3_GATE_IOMCU, "clk_uart3_gate_iomcu", "clk_gate_iomcu_peri0",
+         CLK_SET_RATE_PARENT, 0x10, 11, 0, },
+       { HI3670_CLK_GATE_PERI0_IOMCU, "clk_gate_iomcu_peri0", "clk_ppll0",
+         CLK_SET_RATE_PARENT, 0x90, 0, 0, },
+};
+
+/* clk_media1 */
+static const struct hisi_gate_clock hi3670_media1_gate_sep_clks[] = {
+       { HI3670_ACLK_GATE_NOC_DSS, "aclk_gate_noc_dss", "aclk_gate_disp_noc_subsys",
+         CLK_SET_RATE_PARENT, 0x10, 21, 0, },
+       { HI3670_PCLK_GATE_NOC_DSS_CFG, "pclk_gate_noc_dss_cfg", "pclk_gate_disp_noc_subsys",
+         CLK_SET_RATE_PARENT, 0x10, 22, 0, },
+       { HI3670_PCLK_GATE_MMBUF_CFG, "pclk_gate_mmbuf_cfg", "pclk_gate_disp_noc_subsys",
+         CLK_SET_RATE_PARENT, 0x20, 5, 0, },
+       { HI3670_PCLK_GATE_DISP_NOC_SUBSYS, "pclk_gate_disp_noc_subsys", "clk_div_sysbus",
+         CLK_SET_RATE_PARENT, 0x10, 18, 0, },
+       { HI3670_ACLK_GATE_DISP_NOC_SUBSYS, "aclk_gate_disp_noc_subsys", "clk_gate_vivobusfreq",
+         CLK_SET_RATE_PARENT, 0x10, 17, 0, },
+       { HI3670_PCLK_GATE_DSS, "pclk_gate_dss", "pclk_gate_disp_noc_subsys",
+         CLK_SET_RATE_PARENT, 0x00, 14, 0, },
+       { HI3670_ACLK_GATE_DSS, "aclk_gate_dss", "aclk_gate_disp_noc_subsys",
+         CLK_SET_RATE_PARENT, 0x00, 19, 0, },
+       { HI3670_CLK_GATE_VIVOBUSFREQ, "clk_gate_vivobusfreq", "clk_div_vivobus",
+         CLK_SET_RATE_PARENT, 0x00, 18, 0, },
+       { HI3670_CLK_GATE_EDC0, "clk_gate_edc0", "clk_div_edc0",
+         CLK_SET_RATE_PARENT, 0x00, 15, 0, },
+       { HI3670_CLK_GATE_LDI0, "clk_gate_ldi0", "clk_div_ldi0",
+         CLK_SET_RATE_PARENT, 0x00, 16, 0, },
+       { HI3670_CLK_GATE_LDI1FREQ, "clk_gate_ldi1freq", "clk_div_ldi1",
+         CLK_SET_RATE_PARENT, 0x00, 17, 0, },
+       { HI3670_CLK_GATE_BRG, "clk_gate_brg", "clk_media_common_div",
+         CLK_SET_RATE_PARENT, 0x00, 29, 0, },
+       { HI3670_ACLK_GATE_ASC, "aclk_gate_asc", "clk_gate_mmbuf",
+         CLK_SET_RATE_PARENT, 0x20, 3, 0, },
+       { HI3670_CLK_GATE_DSS_AXI_MM, "clk_gate_dss_axi_mm", "clk_gate_mmbuf",
+         CLK_SET_RATE_PARENT, 0x20, 4, 0, },
+       { HI3670_CLK_GATE_MMBUF, "clk_gate_mmbuf", "aclk_div_mmbuf",
+         CLK_SET_RATE_PARENT, 0x20, 0, 0, },
+       { HI3670_PCLK_GATE_MMBUF, "pclk_gate_mmbuf", "pclk_div_mmbuf",
+         CLK_SET_RATE_PARENT, 0x20, 1, 0, },
+       { HI3670_CLK_GATE_ATDIV_VIVO, "clk_gate_atdiv_vivo", "clk_div_vivobus",
+         CLK_SET_RATE_PARENT, 0x010, 1, 0, },
+};
+
+static const struct hisi_gate_clock hi3670_media1_gate_clks[] = {
+       { HI3670_CLK_GATE_VIVOBUS_ANDGT, "clk_gate_vivobus_andgt", "clk_mux_vivobus",
+         CLK_SET_RATE_PARENT, 0x84, 3, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_ANDGT_EDC0, "clk_andgt_edc0", "clk_mux_edc0",
+         CLK_SET_RATE_PARENT, 0x84, 7, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_ANDGT_LDI0, "clk_andgt_ldi0", "clk_mux_ldi0",
+         CLK_SET_RATE_PARENT, 0x84, 9, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_ANDGT_LDI1, "clk_andgt_ldi1", "clk_mux_ldi1",
+         CLK_SET_RATE_PARENT, 0x84, 8, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_CLK_MMBUF_PLL_ANDGT, "clk_mmbuf_pll_andgt", "clk_sw_mmbuf",
+         CLK_SET_RATE_PARENT, 0x84, 14, CLK_GATE_HIWORD_MASK, 0, },
+       { HI3670_PCLK_MMBUF_ANDGT, "pclk_mmbuf_andgt", "aclk_div_mmbuf",
+         CLK_SET_RATE_PARENT, 0x84, 15, CLK_GATE_HIWORD_MASK, 0, },
+};
+
+static const char *const
+clk_mux_vivobus_p[] = { "clk_invalid", "clk_invalid", "clk_gate_ppll0_media",
+                       "clk_invalid", "clk_gate_ppll2_media", "clk_invalid",
+                       "clk_invalid", "clk_invalid", "clk_gate_ppll3_media",
+                       "clk_invalid", "clk_invalid", "clk_invalid",
+                       "clk_invalid", "clk_invalid", "clk_invalid",
+                       "clk_invalid", };
+static const char *const
+clk_mux_edc0_p[] = { "clk_invalid", "clk_invalid", "clk_gate_ppll0_media",
+                    "clk_invalid", "clk_gate_ppll2_media", "clk_invalid",
+                    "clk_invalid", "clk_invalid", "clk_gate_ppll3_media",
+                    "clk_invalid", "clk_invalid", "clk_invalid", "clk_invalid",
+                    "clk_invalid", "clk_invalid", "clk_invalid", };
+static const char *const
+clk_mux_ldi0_p[] = { "clk_invalid", "clk_gate_ppll7_media",
+                    "clk_gate_ppll0_media", "clk_invalid",
+                    "clk_gate_ppll2_media", "clk_invalid", "clk_invalid",
+                    "clk_invalid", "clk_gate_ppll3_media", "clk_invalid",
+                    "clk_invalid", "clk_invalid", "clk_invalid", "clk_invalid",
+                    "clk_invalid", "clk_invalid", };
+static const char *const
+clk_mux_ldi1_p[] = { "clk_invalid", "clk_gate_ppll7_media",
+                    "clk_gate_ppll0_media", "clk_invalid",
+                    "clk_gate_ppll2_media", "clk_invalid", "clk_invalid",
+                    "clk_invalid", "clk_gate_ppll3_media", "clk_invalid",
+                    "clk_invalid", "clk_invalid", "clk_invalid", "clk_invalid",
+                    "clk_invalid", "clk_invalid", };
+static const char *const
+clk_sw_mmbuf_p[] = { "clk_invalid", "clk_invalid", "clk_gate_ppll0_media",
+                    "clk_invalid", "clk_gate_ppll2_media", "clk_invalid",
+                    "clk_invalid", "clk_invalid", "clk_gate_ppll3_media",
+                    "clk_invalid", "clk_invalid", "clk_invalid", "clk_invalid",
+                    "clk_invalid", "clk_invalid", "clk_invalid", };
+
+static const struct hisi_mux_clock hi3670_media1_mux_clks[] = {
+       { HI3670_CLK_MUX_VIVOBUS, "clk_mux_vivobus", clk_mux_vivobus_p,
+         ARRAY_SIZE(clk_mux_vivobus_p), CLK_SET_RATE_PARENT,
+         0x74, 6, 4, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_EDC0, "clk_mux_edc0", clk_mux_edc0_p,
+         ARRAY_SIZE(clk_mux_edc0_p), CLK_SET_RATE_PARENT,
+         0x68, 6, 4, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_LDI0, "clk_mux_ldi0", clk_mux_ldi0_p,
+         ARRAY_SIZE(clk_mux_ldi0_p), CLK_SET_RATE_PARENT,
+         0x60, 6, 4, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_MUX_LDI1, "clk_mux_ldi1", clk_mux_ldi1_p,
+         ARRAY_SIZE(clk_mux_ldi1_p), CLK_SET_RATE_PARENT,
+         0x64, 6, 4, CLK_MUX_HIWORD_MASK, },
+       { HI3670_CLK_SW_MMBUF, "clk_sw_mmbuf", clk_sw_mmbuf_p,
+         ARRAY_SIZE(clk_sw_mmbuf_p), CLK_SET_RATE_PARENT,
+         0x88, 0, 4, CLK_MUX_HIWORD_MASK, },
+};
+
+static const struct hisi_divider_clock hi3670_media1_divider_clks[] = {
+       { HI3670_CLK_DIV_VIVOBUS, "clk_div_vivobus", "clk_gate_vivobus_andgt",
+         CLK_SET_RATE_PARENT, 0x74, 0, 6, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_EDC0, "clk_div_edc0", "clk_andgt_edc0",
+         CLK_SET_RATE_PARENT, 0x68, 0, 6, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_LDI0, "clk_div_ldi0", "clk_andgt_ldi0",
+         CLK_SET_RATE_PARENT, 0x60, 0, 6, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_CLK_DIV_LDI1, "clk_div_ldi1", "clk_andgt_ldi1",
+         CLK_SET_RATE_PARENT, 0x64, 0, 6, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_ACLK_DIV_MMBUF, "aclk_div_mmbuf", "clk_mmbuf_pll_andgt",
+         CLK_SET_RATE_PARENT, 0x7C, 10, 6, CLK_DIVIDER_HIWORD_MASK, 0, },
+       { HI3670_PCLK_DIV_MMBUF, "pclk_div_mmbuf", "pclk_mmbuf_andgt",
+         CLK_SET_RATE_PARENT, 0x78, 0, 2, CLK_DIVIDER_HIWORD_MASK, 0, },
+};
+
+/* clk_media2 */
+static const struct hisi_gate_clock hi3670_media2_gate_sep_clks[] = {
+       { HI3670_CLK_GATE_VDECFREQ, "clk_gate_vdecfreq", "clk_div_vdec",
+         CLK_SET_RATE_PARENT, 0x00, 8, 0, },
+       { HI3670_CLK_GATE_VENCFREQ, "clk_gate_vencfreq", "clk_div_venc",
+         CLK_SET_RATE_PARENT, 0x00, 5, 0, },
+       { HI3670_CLK_GATE_ICSFREQ, "clk_gate_icsfreq", "clk_div_ics",
+         CLK_SET_RATE_PARENT, 0x00, 2, 0, },
+};
+
+static void hi3670_clk_crgctrl_init(struct device_node *np)
+{
+       struct hisi_clock_data *clk_data;
+
+       int nr = ARRAY_SIZE(hi3670_fixed_rate_clks) +
+                ARRAY_SIZE(hi3670_crgctrl_gate_sep_clks) +
+                ARRAY_SIZE(hi3670_crgctrl_gate_clks) +
+                ARRAY_SIZE(hi3670_crgctrl_mux_clks) +
+                ARRAY_SIZE(hi3670_crg_fixed_factor_clks) +
+                ARRAY_SIZE(hi3670_crgctrl_divider_clks);
+
+       clk_data = hisi_clk_init(np, nr);
+       if (!clk_data)
+               return;
+
+       hisi_clk_register_fixed_rate(hi3670_fixed_rate_clks,
+                                    ARRAY_SIZE(hi3670_fixed_rate_clks),
+                                    clk_data);
+       hisi_clk_register_gate_sep(hi3670_crgctrl_gate_sep_clks,
+                                  ARRAY_SIZE(hi3670_crgctrl_gate_sep_clks),
+                                  clk_data);
+       hisi_clk_register_gate(hi3670_crgctrl_gate_clks,
+                              ARRAY_SIZE(hi3670_crgctrl_gate_clks),
+                              clk_data);
+       hisi_clk_register_mux(hi3670_crgctrl_mux_clks,
+                             ARRAY_SIZE(hi3670_crgctrl_mux_clks),
+                             clk_data);
+       hisi_clk_register_fixed_factor(hi3670_crg_fixed_factor_clks,
+                                      ARRAY_SIZE(hi3670_crg_fixed_factor_clks),
+                                      clk_data);
+       hisi_clk_register_divider(hi3670_crgctrl_divider_clks,
+                                 ARRAY_SIZE(hi3670_crgctrl_divider_clks),
+                                 clk_data);
+}
+
+static void hi3670_clk_pctrl_init(struct device_node *np)
+{
+       struct hisi_clock_data *clk_data;
+       int nr = ARRAY_SIZE(hi3670_pctrl_gate_clks);
+
+       clk_data = hisi_clk_init(np, nr);
+       if (!clk_data)
+               return;
+       hisi_clk_register_gate(hi3670_pctrl_gate_clks,
+                              ARRAY_SIZE(hi3670_pctrl_gate_clks), clk_data);
+}
+
+static void hi3670_clk_pmuctrl_init(struct device_node *np)
+{
+       struct hisi_clock_data *clk_data;
+       int nr = ARRAY_SIZE(hi3670_pmu_gate_clks);
+
+       clk_data = hisi_clk_init(np, nr);
+       if (!clk_data)
+               return;
+
+       hisi_clk_register_gate(hi3670_pmu_gate_clks,
+                              ARRAY_SIZE(hi3670_pmu_gate_clks), clk_data);
+}
+
+static void hi3670_clk_sctrl_init(struct device_node *np)
+{
+       struct hisi_clock_data *clk_data;
+       int nr = ARRAY_SIZE(hi3670_sctrl_gate_sep_clks) +
+                ARRAY_SIZE(hi3670_sctrl_gate_clks) +
+                ARRAY_SIZE(hi3670_sctrl_mux_clks) +
+                ARRAY_SIZE(hi3670_sctrl_divider_clks);
+
+       clk_data = hisi_clk_init(np, nr);
+       if (!clk_data)
+               return;
+
+       hisi_clk_register_gate_sep(hi3670_sctrl_gate_sep_clks,
+                                  ARRAY_SIZE(hi3670_sctrl_gate_sep_clks),
+                                  clk_data);
+       hisi_clk_register_gate(hi3670_sctrl_gate_clks,
+                              ARRAY_SIZE(hi3670_sctrl_gate_clks),
+                              clk_data);
+       hisi_clk_register_mux(hi3670_sctrl_mux_clks,
+                             ARRAY_SIZE(hi3670_sctrl_mux_clks),
+                             clk_data);
+       hisi_clk_register_divider(hi3670_sctrl_divider_clks,
+                                 ARRAY_SIZE(hi3670_sctrl_divider_clks),
+                                 clk_data);
+}
+
+static void hi3670_clk_iomcu_init(struct device_node *np)
+{
+       struct hisi_clock_data *clk_data;
+       int nr = ARRAY_SIZE(hi3670_iomcu_gate_sep_clks) +
+                       ARRAY_SIZE(hi3670_iomcu_fixed_factor_clks);
+
+       clk_data = hisi_clk_init(np, nr);
+       if (!clk_data)
+               return;
+
+       hisi_clk_register_gate(hi3670_iomcu_gate_sep_clks,
+                              ARRAY_SIZE(hi3670_iomcu_gate_sep_clks), clk_data);
+
+       hisi_clk_register_fixed_factor(hi3670_iomcu_fixed_factor_clks,
+                                      ARRAY_SIZE(hi3670_iomcu_fixed_factor_clks),
+                                      clk_data);
+}
+
+static void hi3670_clk_media1_init(struct device_node *np)
+{
+       struct hisi_clock_data *clk_data;
+
+       int nr = ARRAY_SIZE(hi3670_media1_gate_sep_clks) +
+                ARRAY_SIZE(hi3670_media1_gate_clks) +
+                ARRAY_SIZE(hi3670_media1_mux_clks) +
+                ARRAY_SIZE(hi3670_media1_divider_clks);
+
+       clk_data = hisi_clk_init(np, nr);
+       if (!clk_data)
+               return;
+
+       hisi_clk_register_gate_sep(hi3670_media1_gate_sep_clks,
+                                  ARRAY_SIZE(hi3670_media1_gate_sep_clks),
+                                  clk_data);
+       hisi_clk_register_gate(hi3670_media1_gate_clks,
+                              ARRAY_SIZE(hi3670_media1_gate_clks),
+                              clk_data);
+       hisi_clk_register_mux(hi3670_media1_mux_clks,
+                             ARRAY_SIZE(hi3670_media1_mux_clks),
+                             clk_data);
+       hisi_clk_register_divider(hi3670_media1_divider_clks,
+                                 ARRAY_SIZE(hi3670_media1_divider_clks),
+                                 clk_data);
+}
+
+static void hi3670_clk_media2_init(struct device_node *np)
+{
+       struct hisi_clock_data *clk_data;
+
+       int nr = ARRAY_SIZE(hi3670_media2_gate_sep_clks);
+
+       clk_data = hisi_clk_init(np, nr);
+       if (!clk_data)
+               return;
+
+       hisi_clk_register_gate_sep(hi3670_media2_gate_sep_clks,
+                                  ARRAY_SIZE(hi3670_media2_gate_sep_clks),
+                                  clk_data);
+}
+
+static const struct of_device_id hi3670_clk_match_table[] = {
+       { .compatible = "hisilicon,hi3670-crgctrl",
+         .data = hi3670_clk_crgctrl_init },
+       { .compatible = "hisilicon,hi3670-pctrl",
+         .data = hi3670_clk_pctrl_init },
+       { .compatible = "hisilicon,hi3670-pmuctrl",
+         .data = hi3670_clk_pmuctrl_init },
+       { .compatible = "hisilicon,hi3670-sctrl",
+         .data = hi3670_clk_sctrl_init },
+       { .compatible = "hisilicon,hi3670-iomcu",
+         .data = hi3670_clk_iomcu_init },
+       { .compatible = "hisilicon,hi3670-media1-crg",
+         .data = hi3670_clk_media1_init },
+       { .compatible = "hisilicon,hi3670-media2-crg",
+         .data = hi3670_clk_media2_init },
+       { }
+};
+
+static int hi3670_clk_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *np = pdev->dev.of_node;
+       void (*init_func)(struct device_node *np);
+
+       init_func = of_device_get_match_data(dev);
+       if (!init_func)
+               return -ENODEV;
+
+       init_func(np);
+
+       return 0;
+}
+
+static struct platform_driver hi3670_clk_driver = {
+       .probe          = hi3670_clk_probe,
+       .driver         = {
+               .name   = "hi3670-clk",
+               .of_match_table = hi3670_clk_match_table,
+       },
+};
+
+static int __init hi3670_clk_init(void)
+{
+       return platform_driver_register(&hi3670_clk_driver);
+}
+core_initcall(hi3670_clk_init);
index 2a5015c736ce6d604d371c0bcd2a894d1ae4015f..43e82fa644226894bb520f4134740f98577ac297 100644 (file)
@@ -109,9 +109,8 @@ struct hisi_reset_controller *hisi_reset_init(struct platform_device *pdev)
                return NULL;
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       rstc->membase = devm_ioremap(&pdev->dev,
-                               res->start, resource_size(res));
-       if (!rstc->membase)
+       rstc->membase = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(rstc->membase))
                return NULL;
 
        spin_lock_init(&rstc->lock);
index 9d46eac87f45e7f4ec0e2f72aba0b179b574b9a6..ed1b7e97a0d351cb8519986117857e4d9e1b9141 100644 (file)
@@ -94,7 +94,7 @@ struct clk *imx_clk_cpu(const char *name, const char *parent_name,
 
        init.name = name;
        init.ops = &clk_cpu_ops;
-       init.flags = 0;
+       init.flags = CLK_IS_CRITICAL;
        init.parent_names = &parent_name;
        init.num_parents = 1;
 
index 8c7c2fcb8d9495a6597fa7020d3b297278ec961e..bbe0c60f4d09f868a0a5c7d5cca22d72e66e0013 100644 (file)
@@ -789,6 +789,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
                clk[IMX6QDL_CLK_MLB] = imx_clk_gate2("mlb",            "axi",               base + 0x74, 18);
        clk[IMX6QDL_CLK_MMDC_CH0_AXI] = imx_clk_gate2_flags("mmdc_ch0_axi",  "mmdc_ch0_axi_podf", base + 0x74, 20, CLK_IS_CRITICAL);
        clk[IMX6QDL_CLK_MMDC_CH1_AXI] = imx_clk_gate2("mmdc_ch1_axi",  "mmdc_ch1_axi_podf", base + 0x74, 22);
+       clk[IMX6QDL_CLK_MMDC_P0_IPG]  = imx_clk_gate2_flags("mmdc_p0_ipg",   "ipg",         base + 0x74, 24, CLK_IS_CRITICAL);
        clk[IMX6QDL_CLK_OCRAM]        = imx_clk_gate2("ocram",         "ahb",               base + 0x74, 28);
        clk[IMX6QDL_CLK_OPENVG_AXI]   = imx_clk_gate2("openvg_axi",    "axi",               base + 0x74, 30);
        clk[IMX6QDL_CLK_PCIE_AXI]     = imx_clk_gate2("pcie_axi",      "pcie_axi_sel",      base + 0x78, 0);
index eb6bcbf345a3bac4686f57343555a258f036e09b..6fcfbbd907a56fe0907f971f2a5c258b6f4c47d7 100644 (file)
@@ -386,6 +386,8 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node)
        clks[IMX6SL_CLK_LCDIF_AXI]    = imx_clk_gate2("lcdif_axi",    "lcdif_axi_podf",    base + 0x74, 6);
        clks[IMX6SL_CLK_LCDIF_PIX]    = imx_clk_gate2("lcdif_pix",    "lcdif_pix_podf",    base + 0x74, 8);
        clks[IMX6SL_CLK_EPDC_PIX]     = imx_clk_gate2("epdc_pix",     "epdc_pix_podf",     base + 0x74, 10);
+       clks[IMX6SL_CLK_MMDC_P0_IPG]  = imx_clk_gate2_flags("mmdc_p0_ipg",  "ipg",         base + 0x74, 24, CLK_IS_CRITICAL);
+       clks[IMX6SL_CLK_MMDC_P1_IPG]  = imx_clk_gate2("mmdc_p1_ipg",  "ipg",               base + 0x74, 26);
        clks[IMX6SL_CLK_OCRAM]        = imx_clk_gate2("ocram",        "ocram_podf",        base + 0x74, 28);
        clks[IMX6SL_CLK_PWM1]         = imx_clk_gate2("pwm1",         "perclk",            base + 0x78, 16);
        clks[IMX6SL_CLK_PWM2]         = imx_clk_gate2("pwm2",         "perclk",            base + 0x78, 18);
index 52379ee49aece91fdd7fb5cd1ae1740f8732787c..3bd2044cf25c2618869f50d0aa17faa63ac1213e 100644 (file)
@@ -293,6 +293,7 @@ static void __init imx6sll_clocks_init(struct device_node *ccm_node)
        clks[IMX6SLL_CLK_WDOG1]         = imx_clk_gate2("wdog1",        "ipg",          base + 0x74, 16);
        clks[IMX6SLL_CLK_MMDC_P0_FAST]  = imx_clk_gate_flags("mmdc_p0_fast", "mmdc_podf",  base + 0x74, 20, CLK_IS_CRITICAL);
        clks[IMX6SLL_CLK_MMDC_P0_IPG]   = imx_clk_gate2_flags("mmdc_p0_ipg", "ipg",        base + 0x74, 24, CLK_IS_CRITICAL);
+       clks[IMX6SLL_CLK_MMDC_P1_IPG]   = imx_clk_gate2("mmdc_p1_ipg", "ipg",      base + 0x74, 26);
        clks[IMX6SLL_CLK_OCRAM]         = imx_clk_gate_flags("ocram","ahb",                base + 0x74, 28, CLK_IS_CRITICAL);
 
        /* CCGR4 */
index d9f2890ffe62bea5a42c2c3a485285e002cbc613..18527a335ace30c1c8b308085578561b4f61f483 100644 (file)
@@ -431,6 +431,7 @@ static void __init imx6sx_clocks_init(struct device_node *ccm_node)
        clks[IMX6SX_CLK_MLB]          = imx_clk_gate2("mlb",           "ahb",               base + 0x74, 18);
        clks[IMX6SX_CLK_MMDC_P0_FAST] = imx_clk_gate2_flags("mmdc_p0_fast", "mmdc_podf", base + 0x74, 20, CLK_IS_CRITICAL);
        clks[IMX6SX_CLK_MMDC_P0_IPG]  = imx_clk_gate2_flags("mmdc_p0_ipg", "ipg", base + 0x74, 24, CLK_IS_CRITICAL);
+       clks[IMX6SX_CLK_MMDC_P1_IPG]  = imx_clk_gate2("mmdc_p1_ipg", "ipg", base + 0x74, 26);
        clks[IMX6SX_CLK_OCRAM]        = imx_clk_gate2_flags("ocram", "ocram_podf", base + 0x74, 28, CLK_IS_CRITICAL);
 
        /* CCGR4 */
index 361b43f9742e752c9d742e61416301be6e33e22a..fd60d1549f719076d05df587d21ca686d0ba7261 100644 (file)
@@ -408,6 +408,7 @@ static void __init imx6ul_clocks_init(struct device_node *ccm_node)
        clks[IMX6UL_CLK_WDOG1]          = imx_clk_gate2("wdog1",        "ipg",          base + 0x74,    16);
        clks[IMX6UL_CLK_MMDC_P0_FAST]   = imx_clk_gate_flags("mmdc_p0_fast", "mmdc_podf", base + 0x74,  20, CLK_IS_CRITICAL);
        clks[IMX6UL_CLK_MMDC_P0_IPG]    = imx_clk_gate2_flags("mmdc_p0_ipg",    "ipg",          base + 0x74,    24, CLK_IS_CRITICAL);
+       clks[IMX6UL_CLK_MMDC_P1_IPG]    = imx_clk_gate2("mmdc_p1_ipg",  "ipg",          base + 0x74,    26);
        clks[IMX6UL_CLK_AXI]            = imx_clk_gate_flags("axi",     "axi_podf",     base + 0x74,    28, CLK_IS_CRITICAL);
 
        /* CCGR4 */
index 881b772c4ac9708c20371d8276475e55997cee85..adb08f64c6918f040f3f9ef1e074fd4ba28da77f 100644 (file)
@@ -379,14 +379,6 @@ static const char *pll_enet_bypass_sel[] = { "pll_enet_main", "pll_enet_main_src
 static const char *pll_audio_bypass_sel[] = { "pll_audio_main", "pll_audio_main_src", };
 static const char *pll_video_bypass_sel[] = { "pll_video_main", "pll_video_main_src", };
 
-static int const clks_init_on[] __initconst = {
-       IMX7D_ARM_A7_ROOT_CLK, IMX7D_MAIN_AXI_ROOT_CLK,
-       IMX7D_PLL_SYS_MAIN_480M_CLK, IMX7D_NAND_USDHC_BUS_ROOT_CLK,
-       IMX7D_DRAM_PHYM_ROOT_CLK, IMX7D_DRAM_ROOT_CLK,
-       IMX7D_DRAM_PHYM_ALT_ROOT_CLK, IMX7D_DRAM_ALT_ROOT_CLK,
-       IMX7D_AHB_CHANNEL_ROOT_CLK, IMX7D_IPG_ROOT_CLK,
-};
-
 static struct clk_onecell_data clk_data;
 
 static struct clk ** const uart_clks[] __initconst = {
@@ -404,7 +396,6 @@ static void __init imx7d_clocks_init(struct device_node *ccm_node)
 {
        struct device_node *np;
        void __iomem *base;
-       int i;
 
        clks[IMX7D_CLK_DUMMY] = imx_clk_fixed("dummy", 0);
        clks[IMX7D_OSC_24M_CLK] = of_clk_get_by_name(ccm_node, "osc");
@@ -467,7 +458,7 @@ static void __init imx7d_clocks_init(struct device_node *ccm_node)
        clks[IMX7D_PLL_SYS_MAIN_120M] = imx_clk_fixed_factor("pll_sys_main_120m", "pll_sys_main_clk", 1, 4);
        clks[IMX7D_PLL_DRAM_MAIN_533M] = imx_clk_fixed_factor("pll_dram_533m", "pll_dram_main_clk", 1, 2);
 
-       clks[IMX7D_PLL_SYS_MAIN_480M_CLK] = imx_clk_gate_dis("pll_sys_main_480m_clk", "pll_sys_main_480m", base + 0xb0, 4);
+       clks[IMX7D_PLL_SYS_MAIN_480M_CLK] = imx_clk_gate_dis_flags("pll_sys_main_480m_clk", "pll_sys_main_480m", base + 0xb0, 4, CLK_IS_CRITICAL);
        clks[IMX7D_PLL_SYS_MAIN_240M_CLK] = imx_clk_gate_dis("pll_sys_main_240m_clk", "pll_sys_main_240m", base + 0xb0, 5);
        clks[IMX7D_PLL_SYS_MAIN_120M_CLK] = imx_clk_gate_dis("pll_sys_main_120m_clk", "pll_sys_main_120m", base + 0xb0, 6);
        clks[IMX7D_PLL_DRAM_MAIN_533M_CLK] = imx_clk_gate("pll_dram_533m_clk", "pll_dram_533m", base + 0x70, 12);
@@ -720,7 +711,7 @@ static void __init imx7d_clocks_init(struct device_node *ccm_node)
        clks[IMX7D_ENET_AXI_ROOT_DIV] = imx_clk_divider2("enet_axi_post_div", "enet_axi_pre_div", base + 0x8900, 0, 6);
        clks[IMX7D_NAND_USDHC_BUS_ROOT_CLK] = imx_clk_divider2("nand_usdhc_root_clk", "nand_usdhc_pre_div", base + 0x8980, 0, 6);
        clks[IMX7D_AHB_CHANNEL_ROOT_DIV] = imx_clk_divider2("ahb_root_clk", "ahb_pre_div", base + 0x9000, 0, 6);
-       clks[IMX7D_IPG_ROOT_CLK] = imx_clk_divider2("ipg_root_clk", "ahb_root_clk", base + 0x9080, 0, 2);
+       clks[IMX7D_IPG_ROOT_CLK] = imx_clk_divider_flags("ipg_root_clk", "ahb_root_clk", base + 0x9080, 0, 2, CLK_IS_CRITICAL | CLK_OPS_PARENT_ENABLE | CLK_SET_RATE_PARENT);
        clks[IMX7D_DRAM_ROOT_DIV] = imx_clk_divider2("dram_post_div", "dram_cg", base + 0x9880, 0, 3);
        clks[IMX7D_DRAM_PHYM_ALT_ROOT_DIV] = imx_clk_divider2("dram_phym_alt_post_div", "dram_phym_alt_pre_div", base + 0xa000, 0, 3);
        clks[IMX7D_DRAM_ALT_ROOT_DIV] = imx_clk_divider2("dram_alt_post_div", "dram_alt_pre_div", base + 0xa080, 0, 3);
@@ -784,17 +775,17 @@ static void __init imx7d_clocks_init(struct device_node *ccm_node)
        clks[IMX7D_CLKO1_ROOT_DIV] = imx_clk_divider2("clko1_post_div", "clko1_pre_div", base + 0xbd80, 0, 6);
        clks[IMX7D_CLKO2_ROOT_DIV] = imx_clk_divider2("clko2_post_div", "clko2_pre_div", base + 0xbe00, 0, 6);
 
-       clks[IMX7D_ARM_A7_ROOT_CLK] = imx_clk_gate4("arm_a7_root_clk", "arm_a7_div", base + 0x4000, 0);
+       clks[IMX7D_ARM_A7_ROOT_CLK] = imx_clk_gate2_flags("arm_a7_root_clk", "arm_a7_div", base + 0x4000, 0, CLK_OPS_PARENT_ENABLE);
        clks[IMX7D_ARM_M4_ROOT_CLK] = imx_clk_gate4("arm_m4_root_clk", "arm_m4_div", base + 0x4010, 0);
-       clks[IMX7D_MAIN_AXI_ROOT_CLK] = imx_clk_gate4("main_axi_root_clk", "axi_post_div", base + 0x4040, 0);
+       clks[IMX7D_MAIN_AXI_ROOT_CLK] = imx_clk_gate2_flags("main_axi_root_clk", "axi_post_div", base + 0x4040, 0, CLK_IS_CRITICAL | CLK_OPS_PARENT_ENABLE);
        clks[IMX7D_DISP_AXI_ROOT_CLK] = imx_clk_gate4("disp_axi_root_clk", "disp_axi_post_div", base + 0x4050, 0);
        clks[IMX7D_ENET_AXI_ROOT_CLK] = imx_clk_gate4("enet_axi_root_clk", "enet_axi_post_div", base + 0x4060, 0);
        clks[IMX7D_OCRAM_CLK] = imx_clk_gate4("ocram_clk", "main_axi_root_clk", base + 0x4110, 0);
        clks[IMX7D_OCRAM_S_CLK] = imx_clk_gate4("ocram_s_clk", "ahb_root_clk", base + 0x4120, 0);
-       clks[IMX7D_DRAM_ROOT_CLK] = imx_clk_gate4("dram_root_clk", "dram_post_div", base + 0x4130, 0);
-       clks[IMX7D_DRAM_PHYM_ROOT_CLK] = imx_clk_gate4("dram_phym_root_clk", "dram_phym_cg", base + 0x4130, 0);
-       clks[IMX7D_DRAM_PHYM_ALT_ROOT_CLK] = imx_clk_gate4("dram_phym_alt_root_clk", "dram_phym_alt_post_div", base + 0x4130, 0);
-       clks[IMX7D_DRAM_ALT_ROOT_CLK] = imx_clk_gate4("dram_alt_root_clk", "dram_alt_post_div", base + 0x4130, 0);
+       clks[IMX7D_DRAM_ROOT_CLK] = imx_clk_gate2_flags("dram_root_clk", "dram_post_div", base + 0x4130, 0, CLK_IS_CRITICAL | CLK_OPS_PARENT_ENABLE);
+       clks[IMX7D_DRAM_PHYM_ROOT_CLK] = imx_clk_gate2_flags("dram_phym_root_clk", "dram_phym_cg", base + 0x4130, 0, CLK_IS_CRITICAL | CLK_OPS_PARENT_ENABLE);
+       clks[IMX7D_DRAM_PHYM_ALT_ROOT_CLK] = imx_clk_gate2_flags("dram_phym_alt_root_clk", "dram_phym_alt_post_div", base + 0x4130, 0, CLK_IS_CRITICAL | CLK_OPS_PARENT_ENABLE);
+       clks[IMX7D_DRAM_ALT_ROOT_CLK] = imx_clk_gate2_flags("dram_alt_root_clk", "dram_alt_post_div", base + 0x4130, 0, CLK_IS_CRITICAL | CLK_OPS_PARENT_ENABLE);
        clks[IMX7D_OCOTP_CLK] = imx_clk_gate4("ocotp_clk", "ipg_root_clk", base + 0x4230, 0);
        clks[IMX7D_SNVS_CLK] = imx_clk_gate4("snvs_clk", "ipg_root_clk", base + 0x4250, 0);
        clks[IMX7D_MU_ROOT_CLK] = imx_clk_gate4("mu_root_clk", "ipg_root_clk", base + 0x4270, 0);
@@ -883,9 +874,6 @@ static void __init imx7d_clocks_init(struct device_node *ccm_node)
        clk_data.clk_num = ARRAY_SIZE(clks);
        of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
 
-       for (i = 0; i < ARRAY_SIZE(clks_init_on); i++)
-               clk_prepare_enable(clks[clks_init_on[i]]);
-
        clk_set_parent(clks[IMX7D_PLL_ARM_MAIN_BYPASS], clks[IMX7D_PLL_ARM_MAIN]);
        clk_set_parent(clks[IMX7D_PLL_DRAM_MAIN_BYPASS], clks[IMX7D_PLL_DRAM_MAIN]);
        clk_set_parent(clks[IMX7D_PLL_SYS_MAIN_BYPASS], clks[IMX7D_PLL_SYS_MAIN]);
index 8076ec040f375f2715c227d64f909e562ae178b5..5895e2237b6c2eee26d619ad77bc1baceb4afecb 100644 (file)
@@ -137,6 +137,13 @@ static inline struct clk *imx_clk_gate_dis(const char *name, const char *parent,
                        shift, CLK_GATE_SET_TO_DISABLE, &imx_ccm_lock);
 }
 
+static inline struct clk *imx_clk_gate_dis_flags(const char *name, const char *parent,
+               void __iomem *reg, u8 shift, unsigned long flags)
+{
+       return clk_register_gate(NULL, name, parent, flags | CLK_SET_RATE_PARENT, reg,
+                       shift, CLK_GATE_SET_TO_DISABLE, &imx_ccm_lock);
+}
+
 static inline struct clk *imx_clk_gate2(const char *name, const char *parent,
                void __iomem *reg, u8 shift)
 {
diff --git a/drivers/clk/ingenic/Kconfig b/drivers/clk/ingenic/Kconfig
new file mode 100644 (file)
index 0000000..34dc0da
--- /dev/null
@@ -0,0 +1,47 @@
+menu "Ingenic JZ47xx CGU drivers"
+       depends on MIPS
+
+config INGENIC_CGU_COMMON
+       bool
+
+config INGENIC_CGU_JZ4740
+       bool "Ingenic JZ4740 CGU driver"
+       default MACH_JZ4740
+       select INGENIC_CGU_COMMON
+       help
+         Support the clocks provided by the CGU hardware on Ingenic JZ4740
+         and compatible SoCs.
+
+         If building for a JZ4740 SoC, you want to say Y here.
+
+config INGENIC_CGU_JZ4725B
+       bool "Ingenic JZ4725B CGU driver"
+       default MACH_JZ4725B
+       select INGENIC_CGU_COMMON
+       help
+         Support the clocks provided by the CGU hardware on Ingenic JZ4725B
+         and compatible SoCs.
+
+         If building for a JZ4725B SoC, you want to say Y here.
+
+config INGENIC_CGU_JZ4770
+       bool "Ingenic JZ4770 CGU driver"
+       default MACH_JZ4770
+       select INGENIC_CGU_COMMON
+       help
+         Support the clocks provided by the CGU hardware on Ingenic JZ4770
+         and compatible SoCs.
+
+         If building for a JZ4770 SoC, you want to say Y here.
+
+config INGENIC_CGU_JZ4780
+       bool "Ingenic JZ4780 CGU driver"
+       default MACH_JZ4780
+       select INGENIC_CGU_COMMON
+       help
+         Support the clocks provided by the CGU hardware on Ingenic JZ4780
+         and compatible SoCs.
+
+         If building for a JZ4780 SoC, you want to say Y here.
+
+endmenu
index 1456e4cdb5622faf68bc7a4f331e433057c5d0f4..00a79b2fba1083044eaa88fd20da115d0d609e99 100644 (file)
@@ -1,4 +1,5 @@
-obj-y                          += cgu.o
-obj-$(CONFIG_MACH_JZ4740)      += jz4740-cgu.o
-obj-$(CONFIG_MACH_JZ4770)      += jz4770-cgu.o
-obj-$(CONFIG_MACH_JZ4780)      += jz4780-cgu.o
+obj-$(CONFIG_INGENIC_CGU_COMMON)       += cgu.o
+obj-$(CONFIG_INGENIC_CGU_JZ4740)       += jz4740-cgu.o
+obj-$(CONFIG_INGENIC_CGU_JZ4725B)      += jz4725b-cgu.o
+obj-$(CONFIG_INGENIC_CGU_JZ4770)       += jz4770-cgu.o
+obj-$(CONFIG_INGENIC_CGU_JZ4780)       += jz4780-cgu.o
diff --git a/drivers/clk/ingenic/jz4725b-cgu.c b/drivers/clk/ingenic/jz4725b-cgu.c
new file mode 100644 (file)
index 0000000..584ff4f
--- /dev/null
@@ -0,0 +1,225 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Ingenic JZ4725B SoC CGU driver
+ *
+ * Copyright (C) 2018 Paul Cercueil
+ * Author: Paul Cercueil <paul@crapouillou.net>
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/delay.h>
+#include <linux/of.h>
+#include <dt-bindings/clock/jz4725b-cgu.h>
+#include "cgu.h"
+
+/* CGU register offsets */
+#define CGU_REG_CPCCR          0x00
+#define CGU_REG_LCR            0x04
+#define CGU_REG_CPPCR          0x10
+#define CGU_REG_CLKGR          0x20
+#define CGU_REG_OPCR           0x24
+#define CGU_REG_I2SCDR         0x60
+#define CGU_REG_LPCDR          0x64
+#define CGU_REG_MSCCDR         0x68
+#define CGU_REG_SSICDR         0x74
+#define CGU_REG_CIMCDR         0x78
+
+/* bits within the LCR register */
+#define LCR_SLEEP              BIT(0)
+
+static struct ingenic_cgu *cgu;
+
+static const s8 pll_od_encoding[4] = {
+       0x0, 0x1, -1, 0x3,
+};
+
+static const struct ingenic_cgu_clk_info jz4725b_cgu_clocks[] = {
+
+       /* External clocks */
+
+       [JZ4725B_CLK_EXT] = { "ext", CGU_CLK_EXT },
+       [JZ4725B_CLK_OSC32K] = { "osc32k", CGU_CLK_EXT },
+
+       [JZ4725B_CLK_PLL] = {
+               "pll", CGU_CLK_PLL,
+               .parents = { JZ4725B_CLK_EXT, -1, -1, -1 },
+               .pll = {
+                       .reg = CGU_REG_CPPCR,
+                       .m_shift = 23,
+                       .m_bits = 9,
+                       .m_offset = 2,
+                       .n_shift = 18,
+                       .n_bits = 5,
+                       .n_offset = 2,
+                       .od_shift = 16,
+                       .od_bits = 2,
+                       .od_max = 4,
+                       .od_encoding = pll_od_encoding,
+                       .stable_bit = 10,
+                       .bypass_bit = 9,
+                       .enable_bit = 8,
+               },
+       },
+
+       /* Muxes & dividers */
+
+       [JZ4725B_CLK_PLL_HALF] = {
+               "pll half", CGU_CLK_DIV,
+               .parents = { JZ4725B_CLK_PLL, -1, -1, -1 },
+               .div = { CGU_REG_CPCCR, 21, 1, 1, -1, -1, -1 },
+       },
+
+       [JZ4725B_CLK_CCLK] = {
+               "cclk", CGU_CLK_DIV,
+               .parents = { JZ4725B_CLK_PLL, -1, -1, -1 },
+               .div = { CGU_REG_CPCCR, 0, 1, 4, 22, -1, -1 },
+       },
+
+       [JZ4725B_CLK_HCLK] = {
+               "hclk", CGU_CLK_DIV,
+               .parents = { JZ4725B_CLK_PLL, -1, -1, -1 },
+               .div = { CGU_REG_CPCCR, 4, 1, 4, 22, -1, -1 },
+       },
+
+       [JZ4725B_CLK_PCLK] = {
+               "pclk", CGU_CLK_DIV,
+               .parents = { JZ4725B_CLK_PLL, -1, -1, -1 },
+               .div = { CGU_REG_CPCCR, 8, 1, 4, 22, -1, -1 },
+       },
+
+       [JZ4725B_CLK_MCLK] = {
+               "mclk", CGU_CLK_DIV,
+               .parents = { JZ4725B_CLK_PLL, -1, -1, -1 },
+               .div = { CGU_REG_CPCCR, 12, 1, 4, 22, -1, -1 },
+       },
+
+       [JZ4725B_CLK_IPU] = {
+               "ipu", CGU_CLK_DIV | CGU_CLK_GATE,
+               .parents = { JZ4725B_CLK_PLL, -1, -1, -1 },
+               .div = { CGU_REG_CPCCR, 16, 1, 4, 22, -1, -1 },
+               .gate = { CGU_REG_CLKGR, 13 },
+       },
+
+       [JZ4725B_CLK_LCD] = {
+               "lcd", CGU_CLK_DIV | CGU_CLK_GATE,
+               .parents = { JZ4725B_CLK_PLL_HALF, -1, -1, -1 },
+               .div = { CGU_REG_LPCDR, 0, 1, 11, -1, -1, -1 },
+               .gate = { CGU_REG_CLKGR, 9 },
+       },
+
+       [JZ4725B_CLK_I2S] = {
+               "i2s", CGU_CLK_MUX | CGU_CLK_DIV | CGU_CLK_GATE,
+               .parents = { JZ4725B_CLK_EXT, JZ4725B_CLK_PLL_HALF, -1, -1 },
+               .mux = { CGU_REG_CPCCR, 31, 1 },
+               .div = { CGU_REG_I2SCDR, 0, 1, 9, -1, -1, -1 },
+               .gate = { CGU_REG_CLKGR, 6 },
+       },
+
+       [JZ4725B_CLK_SPI] = {
+               "spi", CGU_CLK_MUX | CGU_CLK_DIV | CGU_CLK_GATE,
+               .parents = { JZ4725B_CLK_EXT, JZ4725B_CLK_PLL, -1, -1 },
+               .mux = { CGU_REG_SSICDR, 31, 1 },
+               .div = { CGU_REG_SSICDR, 0, 1, 4, -1, -1, -1 },
+               .gate = { CGU_REG_CLKGR, 4 },
+       },
+
+       [JZ4725B_CLK_MMC_MUX] = {
+               "mmc_mux", CGU_CLK_DIV,
+               .parents = { JZ4725B_CLK_PLL_HALF, -1, -1, -1 },
+               .div = { CGU_REG_MSCCDR, 0, 1, 5, -1, -1, -1 },
+       },
+
+       [JZ4725B_CLK_UDC] = {
+               "udc", CGU_CLK_MUX | CGU_CLK_DIV,
+               .parents = { JZ4725B_CLK_EXT, JZ4725B_CLK_PLL_HALF, -1, -1 },
+               .mux = { CGU_REG_CPCCR, 29, 1 },
+               .div = { CGU_REG_CPCCR, 23, 1, 6, -1, -1, -1 },
+       },
+
+       /* Gate-only clocks */
+
+       [JZ4725B_CLK_UART] = {
+               "uart", CGU_CLK_GATE,
+               .parents = { JZ4725B_CLK_EXT, -1, -1, -1 },
+               .gate = { CGU_REG_CLKGR, 0 },
+       },
+
+       [JZ4725B_CLK_DMA] = {
+               "dma", CGU_CLK_GATE,
+               .parents = { JZ4725B_CLK_PCLK, -1, -1, -1 },
+               .gate = { CGU_REG_CLKGR, 12 },
+       },
+
+       [JZ4725B_CLK_ADC] = {
+               "adc", CGU_CLK_GATE,
+               .parents = { JZ4725B_CLK_EXT, -1, -1, -1 },
+               .gate = { CGU_REG_CLKGR, 7 },
+       },
+
+       [JZ4725B_CLK_I2C] = {
+               "i2c", CGU_CLK_GATE,
+               .parents = { JZ4725B_CLK_EXT, -1, -1, -1 },
+               .gate = { CGU_REG_CLKGR, 3 },
+       },
+
+       [JZ4725B_CLK_AIC] = {
+               "aic", CGU_CLK_GATE,
+               .parents = { JZ4725B_CLK_EXT, -1, -1, -1 },
+               .gate = { CGU_REG_CLKGR, 5 },
+       },
+
+       [JZ4725B_CLK_MMC0] = {
+               "mmc0", CGU_CLK_GATE,
+               .parents = { JZ4725B_CLK_MMC_MUX, -1, -1, -1 },
+               .gate = { CGU_REG_CLKGR, 6 },
+       },
+
+       [JZ4725B_CLK_MMC1] = {
+               "mmc1", CGU_CLK_GATE,
+               .parents = { JZ4725B_CLK_MMC_MUX, -1, -1, -1 },
+               .gate = { CGU_REG_CLKGR, 16 },
+       },
+
+       [JZ4725B_CLK_BCH] = {
+               "bch", CGU_CLK_GATE,
+               .parents = { JZ4725B_CLK_MCLK/* not sure */, -1, -1, -1 },
+               .gate = { CGU_REG_CLKGR, 11 },
+       },
+
+       [JZ4725B_CLK_TCU] = {
+               "tcu", CGU_CLK_GATE,
+               .parents = { JZ4725B_CLK_EXT/* not sure */, -1, -1, -1 },
+               .gate = { CGU_REG_CLKGR, 1 },
+       },
+
+       [JZ4725B_CLK_EXT512] = {
+               "ext/512", CGU_CLK_FIXDIV,
+               .parents = { JZ4725B_CLK_EXT },
+
+               /* Doc calls it EXT512, but it seems to be /256... */
+               .fixdiv = { 256 },
+       },
+
+       [JZ4725B_CLK_RTC] = {
+               "rtc", CGU_CLK_MUX,
+               .parents = { JZ4725B_CLK_EXT512, JZ4725B_CLK_OSC32K, -1, -1 },
+               .mux = { CGU_REG_OPCR, 2, 1},
+       },
+};
+
+static void __init jz4725b_cgu_init(struct device_node *np)
+{
+       int retval;
+
+       cgu = ingenic_cgu_new(jz4725b_cgu_clocks,
+                             ARRAY_SIZE(jz4725b_cgu_clocks), np);
+       if (!cgu) {
+               pr_err("%s: failed to initialise CGU\n", __func__);
+               return;
+       }
+
+       retval = ingenic_cgu_register_clocks(cgu);
+       if (retval)
+               pr_err("%s: failed to register CGU Clocks\n", __func__);
+}
+CLK_OF_DECLARE(jz4725b_cgu, "ingenic,jz4725b-cgu", jz4725b_cgu_init);
index 7e9f0176578a6d09e2170105943d0c6505602f69..b04927d06cd1033924483ff33318d1e82f439f98 100644 (file)
@@ -7,7 +7,7 @@ config COMMON_CLK_KEYSTONE
 
 config TI_SCI_CLK
        tristate "TI System Control Interface clock drivers"
-       depends on (ARCH_KEYSTONE || COMPILE_TEST) && OF
+       depends on (ARCH_KEYSTONE || ARCH_K3 || COMPILE_TEST) && OF
        depends on TI_SCI_PROTOCOL
        default ARCH_KEYSTONE
        ---help---
index aed5af23895be786db801a2d11360fa3e4a63f2b..4ed9b29ba438a8d83aa5b8e6f34e578d05d178c9 100644 (file)
@@ -245,7 +245,7 @@ static void __init of_psc_clk_init(struct device_node *node, spinlock_t *lock)
                return;
        }
 
-       pr_err("%s: error registering clk %s\n", __func__, node->name);
+       pr_err("%s: error registering clk %pOFn\n", __func__, node);
 
 unmap_domain:
        iounmap(data->domain_base);
@@ -266,3 +266,8 @@ static void __init of_keystone_psc_clk_init(struct device_node *node)
 }
 CLK_OF_DECLARE(keystone_gate_clk, "ti,keystone,psc-clock",
                                        of_keystone_psc_clk_init);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Clock driver for Keystone 2 based devices");
+MODULE_AUTHOR("Murali Karicheri <m-karicheri2@ti.com>");
+MODULE_AUTHOR("Santosh Shilimkar <santosh.shilimkar@ti.com>");
index e7e840fb74eaf7cf58da79d31fbf8d2dd9daeea2..349540469fc085fb09dd13848b6e44ead0fada1c 100644 (file)
@@ -219,7 +219,7 @@ static void __init _of_pll_clk_init(struct device_node *node, bool pllctrl)
        }
 
 out:
-       pr_err("%s: error initializing pll %s\n", __func__, node->name);
+       pr_err("%s: error initializing pll %pOFn\n", __func__, node);
        kfree(pll_data);
 }
 
@@ -338,3 +338,8 @@ static void __init of_pll_mux_clk_init(struct device_node *node)
                pr_err("%s: error registering mux %s\n", __func__, clk_name);
 }
 CLK_OF_DECLARE(pll_mux_clock, "ti,keystone,pll-mux-clock", of_pll_mux_clk_init);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("PLL clock driver for Keystone devices");
+MODULE_AUTHOR("Murali Karicheri <m-karicheri2@ti.com>");
+MODULE_AUTHOR("Santosh Shilimkar <santosh.shilimkar@ti.com>");
index 4dda8988b2f091a665860ae5b2f5dc4cc0492a23..ab6ab07f53e64b79cc7133929ebd3efb9bb1f71f 100644 (file)
@@ -249,11 +249,6 @@ static const char * const msdc30_parents[] = {
        "univpll2_d4"
 };
 
-static const char * const audio_parents[] = {
-       "clk26m",
-       "syspll1_d16"
-};
-
 static const char * const aud_intbus_parents[] = {
        "clk26m",
        "syspll1_d4",
index a0ed41e73bdef7a62b1995e62104d89d3341852f..5f6c860aa122c3a55882f04efbc7d30249453861 100644 (file)
@@ -101,10 +101,16 @@ static const char * const mst_mux_parent_names[] = {
        "axg_mst_in4", "axg_mst_in5", "axg_mst_in6", "axg_mst_in7",
 };
 
-#define AXG_MST_MCLK_MUX(_name, _reg)                                  \
-       AXG_AUD_MUX(_name##_sel, _reg, 0x7, 24, CLK_MUX_ROUND_CLOSEST, \
+#define AXG_MST_MUX(_name, _reg, _flag)                                \
+       AXG_AUD_MUX(_name##_sel, _reg, 0x7, 24, _flag,          \
                    mst_mux_parent_names, CLK_SET_RATE_PARENT)
 
+#define AXG_MST_MCLK_MUX(_name, _reg)                          \
+       AXG_MST_MUX(_name, _reg, CLK_MUX_ROUND_CLOSEST)
+
+#define AXG_MST_SYS_MUX(_name, _reg)                           \
+       AXG_MST_MUX(_name, _reg, 0)
+
 static AXG_MST_MCLK_MUX(mst_a_mclk,   AUDIO_MCLK_A_CTRL);
 static AXG_MST_MCLK_MUX(mst_b_mclk,   AUDIO_MCLK_B_CTRL);
 static AXG_MST_MCLK_MUX(mst_c_mclk,   AUDIO_MCLK_C_CTRL);
@@ -112,13 +118,19 @@ static AXG_MST_MCLK_MUX(mst_d_mclk,   AUDIO_MCLK_D_CTRL);
 static AXG_MST_MCLK_MUX(mst_e_mclk,   AUDIO_MCLK_E_CTRL);
 static AXG_MST_MCLK_MUX(mst_f_mclk,   AUDIO_MCLK_F_CTRL);
 static AXG_MST_MCLK_MUX(spdifout_clk, AUDIO_CLK_SPDIFOUT_CTRL);
-static AXG_MST_MCLK_MUX(spdifin_clk,  AUDIO_CLK_SPDIFIN_CTRL);
 static AXG_MST_MCLK_MUX(pdm_dclk,     AUDIO_CLK_PDMIN_CTRL0);
-static AXG_MST_MCLK_MUX(pdm_sysclk,   AUDIO_CLK_PDMIN_CTRL1);
+static AXG_MST_SYS_MUX(spdifin_clk,   AUDIO_CLK_SPDIFIN_CTRL);
+static AXG_MST_SYS_MUX(pdm_sysclk,    AUDIO_CLK_PDMIN_CTRL1);
+
+#define AXG_MST_DIV(_name, _reg, _flag)                                \
+       AXG_AUD_DIV(_name##_div, _reg, 0, 16, _flag,            \
+                   "axg_"#_name"_sel", CLK_SET_RATE_PARENT)    \
+
+#define AXG_MST_MCLK_DIV(_name, _reg)                          \
+       AXG_MST_DIV(_name, _reg, CLK_DIVIDER_ROUND_CLOSEST)
 
-#define AXG_MST_MCLK_DIV(_name, _reg)                                  \
-       AXG_AUD_DIV(_name##_div, _reg, 0, 16, CLK_DIVIDER_ROUND_CLOSEST, \
-                   "axg_"#_name"_sel", CLK_SET_RATE_PARENT)            \
+#define AXG_MST_SYS_DIV(_name, _reg)                           \
+       AXG_MST_DIV(_name, _reg, 0)
 
 static AXG_MST_MCLK_DIV(mst_a_mclk,   AUDIO_MCLK_A_CTRL);
 static AXG_MST_MCLK_DIV(mst_b_mclk,   AUDIO_MCLK_B_CTRL);
@@ -127,12 +139,12 @@ static AXG_MST_MCLK_DIV(mst_d_mclk,   AUDIO_MCLK_D_CTRL);
 static AXG_MST_MCLK_DIV(mst_e_mclk,   AUDIO_MCLK_E_CTRL);
 static AXG_MST_MCLK_DIV(mst_f_mclk,   AUDIO_MCLK_F_CTRL);
 static AXG_MST_MCLK_DIV(spdifout_clk, AUDIO_CLK_SPDIFOUT_CTRL);
-static AXG_MST_MCLK_DIV(spdifin_clk,  AUDIO_CLK_SPDIFIN_CTRL);
 static AXG_MST_MCLK_DIV(pdm_dclk,     AUDIO_CLK_PDMIN_CTRL0);
-static AXG_MST_MCLK_DIV(pdm_sysclk,   AUDIO_CLK_PDMIN_CTRL1);
+static AXG_MST_SYS_DIV(spdifin_clk,   AUDIO_CLK_SPDIFIN_CTRL);
+static AXG_MST_SYS_DIV(pdm_sysclk,    AUDIO_CLK_PDMIN_CTRL1);
 
-#define AXG_MST_MCLK_GATE(_name, _reg)                                 \
-       AXG_AUD_GATE(_name, _reg, 31,  "axg_"#_name"_div",              \
+#define AXG_MST_MCLK_GATE(_name, _reg)                         \
+       AXG_AUD_GATE(_name, _reg, 31,  "axg_"#_name"_div",      \
                     CLK_SET_RATE_PARENT)
 
 static AXG_MST_MCLK_GATE(mst_a_mclk,   AUDIO_MCLK_A_CTRL);
index 00ce62ad6416cb5514d792db648e90e42c76e764..c981159b02c0f09c604a78005f26103c75962e9c 100644 (file)
 
 static DEFINE_SPINLOCK(meson_clk_lock);
 
-static struct clk_regmap axg_fixed_pll = {
+static struct clk_regmap axg_fixed_pll_dco = {
        .data = &(struct meson_clk_pll_data){
+               .en = {
+                       .reg_off = HHI_MPLL_CNTL,
+                       .shift   = 30,
+                       .width   = 1,
+               },
                .m = {
                        .reg_off = HHI_MPLL_CNTL,
                        .shift   = 0,
@@ -34,11 +39,6 @@ static struct clk_regmap axg_fixed_pll = {
                        .shift   = 9,
                        .width   = 5,
                },
-               .od = {
-                       .reg_off = HHI_MPLL_CNTL,
-                       .shift   = 16,
-                       .width   = 2,
-               },
                .frac = {
                        .reg_off = HHI_MPLL_CNTL2,
                        .shift   = 0,
@@ -56,15 +56,39 @@ static struct clk_regmap axg_fixed_pll = {
                },
        },
        .hw.init = &(struct clk_init_data){
-               .name = "fixed_pll",
+               .name = "fixed_pll_dco",
                .ops = &meson_clk_pll_ro_ops,
                .parent_names = (const char *[]){ "xtal" },
                .num_parents = 1,
        },
 };
 
-static struct clk_regmap axg_sys_pll = {
+static struct clk_regmap axg_fixed_pll = {
+       .data = &(struct clk_regmap_div_data){
+               .offset = HHI_MPLL_CNTL,
+               .shift = 16,
+               .width = 2,
+               .flags = CLK_DIVIDER_POWER_OF_TWO,
+       },
+       .hw.init = &(struct clk_init_data){
+               .name = "fixed_pll",
+               .ops = &clk_regmap_divider_ro_ops,
+               .parent_names = (const char *[]){ "fixed_pll_dco" },
+               .num_parents = 1,
+               /*
+                * This clock won't ever change at runtime so
+                * CLK_SET_RATE_PARENT is not required
+                */
+       },
+};
+
+static struct clk_regmap axg_sys_pll_dco = {
        .data = &(struct meson_clk_pll_data){
+               .en = {
+                       .reg_off = HHI_SYS_PLL_CNTL,
+                       .shift   = 30,
+                       .width   = 1,
+               },
                .m = {
                        .reg_off = HHI_SYS_PLL_CNTL,
                        .shift   = 0,
@@ -75,11 +99,6 @@ static struct clk_regmap axg_sys_pll = {
                        .shift   = 9,
                        .width   = 5,
                },
-               .od = {
-                       .reg_off = HHI_SYS_PLL_CNTL,
-                       .shift   = 16,
-                       .width   = 2,
-               },
                .l = {
                        .reg_off = HHI_SYS_PLL_CNTL,
                        .shift   = 31,
@@ -92,102 +111,59 @@ static struct clk_regmap axg_sys_pll = {
                },
        },
        .hw.init = &(struct clk_init_data){
-               .name = "sys_pll",
+               .name = "sys_pll_dco",
                .ops = &meson_clk_pll_ro_ops,
                .parent_names = (const char *[]){ "xtal" },
                .num_parents = 1,
-               .flags = CLK_GET_RATE_NOCACHE,
        },
 };
 
-static const struct pll_rate_table axg_gp0_pll_rate_table[] = {
-       PLL_RATE(240000000, 40, 1, 2),
-       PLL_RATE(246000000, 41, 1, 2),
-       PLL_RATE(252000000, 42, 1, 2),
-       PLL_RATE(258000000, 43, 1, 2),
-       PLL_RATE(264000000, 44, 1, 2),
-       PLL_RATE(270000000, 45, 1, 2),
-       PLL_RATE(276000000, 46, 1, 2),
-       PLL_RATE(282000000, 47, 1, 2),
-       PLL_RATE(288000000, 48, 1, 2),
-       PLL_RATE(294000000, 49, 1, 2),
-       PLL_RATE(300000000, 50, 1, 2),
-       PLL_RATE(306000000, 51, 1, 2),
-       PLL_RATE(312000000, 52, 1, 2),
-       PLL_RATE(318000000, 53, 1, 2),
-       PLL_RATE(324000000, 54, 1, 2),
-       PLL_RATE(330000000, 55, 1, 2),
-       PLL_RATE(336000000, 56, 1, 2),
-       PLL_RATE(342000000, 57, 1, 2),
-       PLL_RATE(348000000, 58, 1, 2),
-       PLL_RATE(354000000, 59, 1, 2),
-       PLL_RATE(360000000, 60, 1, 2),
-       PLL_RATE(366000000, 61, 1, 2),
-       PLL_RATE(372000000, 62, 1, 2),
-       PLL_RATE(378000000, 63, 1, 2),
-       PLL_RATE(384000000, 64, 1, 2),
-       PLL_RATE(390000000, 65, 1, 3),
-       PLL_RATE(396000000, 66, 1, 3),
-       PLL_RATE(402000000, 67, 1, 3),
-       PLL_RATE(408000000, 68, 1, 3),
-       PLL_RATE(480000000, 40, 1, 1),
-       PLL_RATE(492000000, 41, 1, 1),
-       PLL_RATE(504000000, 42, 1, 1),
-       PLL_RATE(516000000, 43, 1, 1),
-       PLL_RATE(528000000, 44, 1, 1),
-       PLL_RATE(540000000, 45, 1, 1),
-       PLL_RATE(552000000, 46, 1, 1),
-       PLL_RATE(564000000, 47, 1, 1),
-       PLL_RATE(576000000, 48, 1, 1),
-       PLL_RATE(588000000, 49, 1, 1),
-       PLL_RATE(600000000, 50, 1, 1),
-       PLL_RATE(612000000, 51, 1, 1),
-       PLL_RATE(624000000, 52, 1, 1),
-       PLL_RATE(636000000, 53, 1, 1),
-       PLL_RATE(648000000, 54, 1, 1),
-       PLL_RATE(660000000, 55, 1, 1),
-       PLL_RATE(672000000, 56, 1, 1),
-       PLL_RATE(684000000, 57, 1, 1),
-       PLL_RATE(696000000, 58, 1, 1),
-       PLL_RATE(708000000, 59, 1, 1),
-       PLL_RATE(720000000, 60, 1, 1),
-       PLL_RATE(732000000, 61, 1, 1),
-       PLL_RATE(744000000, 62, 1, 1),
-       PLL_RATE(756000000, 63, 1, 1),
-       PLL_RATE(768000000, 64, 1, 1),
-       PLL_RATE(780000000, 65, 1, 1),
-       PLL_RATE(792000000, 66, 1, 1),
-       PLL_RATE(804000000, 67, 1, 1),
-       PLL_RATE(816000000, 68, 1, 1),
-       PLL_RATE(960000000, 40, 1, 0),
-       PLL_RATE(984000000, 41, 1, 0),
-       PLL_RATE(1008000000, 42, 1, 0),
-       PLL_RATE(1032000000, 43, 1, 0),
-       PLL_RATE(1056000000, 44, 1, 0),
-       PLL_RATE(1080000000, 45, 1, 0),
-       PLL_RATE(1104000000, 46, 1, 0),
-       PLL_RATE(1128000000, 47, 1, 0),
-       PLL_RATE(1152000000, 48, 1, 0),
-       PLL_RATE(1176000000, 49, 1, 0),
-       PLL_RATE(1200000000, 50, 1, 0),
-       PLL_RATE(1224000000, 51, 1, 0),
-       PLL_RATE(1248000000, 52, 1, 0),
-       PLL_RATE(1272000000, 53, 1, 0),
-       PLL_RATE(1296000000, 54, 1, 0),
-       PLL_RATE(1320000000, 55, 1, 0),
-       PLL_RATE(1344000000, 56, 1, 0),
-       PLL_RATE(1368000000, 57, 1, 0),
-       PLL_RATE(1392000000, 58, 1, 0),
-       PLL_RATE(1416000000, 59, 1, 0),
-       PLL_RATE(1440000000, 60, 1, 0),
-       PLL_RATE(1464000000, 61, 1, 0),
-       PLL_RATE(1488000000, 62, 1, 0),
-       PLL_RATE(1512000000, 63, 1, 0),
-       PLL_RATE(1536000000, 64, 1, 0),
-       PLL_RATE(1560000000, 65, 1, 0),
-       PLL_RATE(1584000000, 66, 1, 0),
-       PLL_RATE(1608000000, 67, 1, 0),
-       PLL_RATE(1632000000, 68, 1, 0),
+static struct clk_regmap axg_sys_pll = {
+       .data = &(struct clk_regmap_div_data){
+               .offset = HHI_SYS_PLL_CNTL,
+               .shift = 16,
+               .width = 2,
+               .flags = CLK_DIVIDER_POWER_OF_TWO,
+       },
+       .hw.init = &(struct clk_init_data){
+               .name = "sys_pll",
+               .ops = &clk_regmap_divider_ro_ops,
+               .parent_names = (const char *[]){ "sys_pll_dco" },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
+static const struct pll_params_table axg_gp0_pll_params_table[] = {
+       PLL_PARAMS(40, 1),
+       PLL_PARAMS(41, 1),
+       PLL_PARAMS(42, 1),
+       PLL_PARAMS(43, 1),
+       PLL_PARAMS(44, 1),
+       PLL_PARAMS(45, 1),
+       PLL_PARAMS(46, 1),
+       PLL_PARAMS(47, 1),
+       PLL_PARAMS(48, 1),
+       PLL_PARAMS(49, 1),
+       PLL_PARAMS(50, 1),
+       PLL_PARAMS(51, 1),
+       PLL_PARAMS(52, 1),
+       PLL_PARAMS(53, 1),
+       PLL_PARAMS(54, 1),
+       PLL_PARAMS(55, 1),
+       PLL_PARAMS(56, 1),
+       PLL_PARAMS(57, 1),
+       PLL_PARAMS(58, 1),
+       PLL_PARAMS(59, 1),
+       PLL_PARAMS(60, 1),
+       PLL_PARAMS(61, 1),
+       PLL_PARAMS(62, 1),
+       PLL_PARAMS(63, 1),
+       PLL_PARAMS(64, 1),
+       PLL_PARAMS(65, 1),
+       PLL_PARAMS(66, 1),
+       PLL_PARAMS(67, 1),
+       PLL_PARAMS(68, 1),
        { /* sentinel */ },
 };
 
@@ -197,11 +173,15 @@ static const struct reg_sequence axg_gp0_init_regs[] = {
        { .reg = HHI_GP0_PLL_CNTL3,     .def = 0x0a59a288 },
        { .reg = HHI_GP0_PLL_CNTL4,     .def = 0xc000004d },
        { .reg = HHI_GP0_PLL_CNTL5,     .def = 0x00078000 },
-       { .reg = HHI_GP0_PLL_CNTL,      .def = 0x40010250 },
 };
 
-static struct clk_regmap axg_gp0_pll = {
+static struct clk_regmap axg_gp0_pll_dco = {
        .data = &(struct meson_clk_pll_data){
+               .en = {
+                       .reg_off = HHI_GP0_PLL_CNTL,
+                       .shift   = 30,
+                       .width   = 1,
+               },
                .m = {
                        .reg_off = HHI_GP0_PLL_CNTL,
                        .shift   = 0,
@@ -212,11 +192,6 @@ static struct clk_regmap axg_gp0_pll = {
                        .shift   = 9,
                        .width   = 5,
                },
-               .od = {
-                       .reg_off = HHI_GP0_PLL_CNTL,
-                       .shift   = 16,
-                       .width   = 2,
-               },
                .frac = {
                        .reg_off = HHI_GP0_PLL_CNTL1,
                        .shift   = 0,
@@ -232,29 +207,49 @@ static struct clk_regmap axg_gp0_pll = {
                        .shift   = 29,
                        .width   = 1,
                },
-               .table = axg_gp0_pll_rate_table,
+               .table = axg_gp0_pll_params_table,
                .init_regs = axg_gp0_init_regs,
                .init_count = ARRAY_SIZE(axg_gp0_init_regs),
        },
        .hw.init = &(struct clk_init_data){
-               .name = "gp0_pll",
+               .name = "gp0_pll_dco",
                .ops = &meson_clk_pll_ops,
                .parent_names = (const char *[]){ "xtal" },
                .num_parents = 1,
        },
 };
 
+static struct clk_regmap axg_gp0_pll = {
+       .data = &(struct clk_regmap_div_data){
+               .offset = HHI_GP0_PLL_CNTL,
+               .shift = 16,
+               .width = 2,
+               .flags = CLK_DIVIDER_POWER_OF_TWO,
+       },
+       .hw.init = &(struct clk_init_data){
+               .name = "gp0_pll",
+               .ops = &clk_regmap_divider_ops,
+               .parent_names = (const char *[]){ "gp0_pll_dco" },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
 static const struct reg_sequence axg_hifi_init_regs[] = {
        { .reg = HHI_HIFI_PLL_CNTL1,    .def = 0xc084b000 },
        { .reg = HHI_HIFI_PLL_CNTL2,    .def = 0xb75020be },
        { .reg = HHI_HIFI_PLL_CNTL3,    .def = 0x0a6a3a88 },
        { .reg = HHI_HIFI_PLL_CNTL4,    .def = 0xc000004d },
        { .reg = HHI_HIFI_PLL_CNTL5,    .def = 0x00058000 },
-       { .reg = HHI_HIFI_PLL_CNTL,     .def = 0x40010250 },
 };
 
-static struct clk_regmap axg_hifi_pll = {
+static struct clk_regmap axg_hifi_pll_dco = {
        .data = &(struct meson_clk_pll_data){
+               .en = {
+                       .reg_off = HHI_HIFI_PLL_CNTL,
+                       .shift   = 30,
+                       .width   = 1,
+               },
                .m = {
                        .reg_off = HHI_HIFI_PLL_CNTL,
                        .shift   = 0,
@@ -265,11 +260,6 @@ static struct clk_regmap axg_hifi_pll = {
                        .shift   = 9,
                        .width   = 5,
                },
-               .od = {
-                       .reg_off = HHI_HIFI_PLL_CNTL,
-                       .shift   = 16,
-                       .width   = 2,
-               },
                .frac = {
                        .reg_off = HHI_HIFI_PLL_CNTL5,
                        .shift   = 0,
@@ -285,19 +275,35 @@ static struct clk_regmap axg_hifi_pll = {
                        .shift   = 29,
                        .width   = 1,
                },
-               .table = axg_gp0_pll_rate_table,
+               .table = axg_gp0_pll_params_table,
                .init_regs = axg_hifi_init_regs,
                .init_count = ARRAY_SIZE(axg_hifi_init_regs),
                .flags = CLK_MESON_PLL_ROUND_CLOSEST,
        },
        .hw.init = &(struct clk_init_data){
-               .name = "hifi_pll",
+               .name = "hifi_pll_dco",
                .ops = &meson_clk_pll_ops,
                .parent_names = (const char *[]){ "xtal" },
                .num_parents = 1,
        },
 };
 
+static struct clk_regmap axg_hifi_pll = {
+       .data = &(struct clk_regmap_div_data){
+               .offset = HHI_HIFI_PLL_CNTL,
+               .shift = 16,
+               .width = 2,
+               .flags = CLK_DIVIDER_POWER_OF_TWO,
+       },
+       .hw.init = &(struct clk_init_data){
+               .name = "hifi_pll",
+               .ops = &clk_regmap_divider_ops,
+               .parent_names = (const char *[]){ "hifi_pll_dco" },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
 static struct clk_fixed_factor axg_fclk_div2_div = {
        .mult = 1,
        .div = 2,
@@ -625,29 +631,31 @@ static struct clk_regmap axg_mpll3 = {
        },
 };
 
-static const struct pll_rate_table axg_pcie_pll_rate_table[] = {
+static const struct pll_params_table axg_pcie_pll_params_table[] = {
        {
-               .rate   = 100000000,
-               .m      = 200,
-               .n      = 3,
-               .od     = 1,
-               .od2    = 3,
+               .m = 200,
+               .n = 3,
        },
        { /* sentinel */ },
 };
 
 static const struct reg_sequence axg_pcie_init_regs[] = {
-       { .reg = HHI_PCIE_PLL_CNTL,     .def = 0x400106c8 },
        { .reg = HHI_PCIE_PLL_CNTL1,    .def = 0x0084a2aa },
        { .reg = HHI_PCIE_PLL_CNTL2,    .def = 0xb75020be },
        { .reg = HHI_PCIE_PLL_CNTL3,    .def = 0x0a47488e },
        { .reg = HHI_PCIE_PLL_CNTL4,    .def = 0xc000004d },
        { .reg = HHI_PCIE_PLL_CNTL5,    .def = 0x00078000 },
        { .reg = HHI_PCIE_PLL_CNTL6,    .def = 0x002323c6 },
+       { .reg = HHI_PCIE_PLL_CNTL,     .def = 0x400106c8 },
 };
 
-static struct clk_regmap axg_pcie_pll = {
+static struct clk_regmap axg_pcie_pll_dco = {
        .data = &(struct meson_clk_pll_data){
+               .en = {
+                       .reg_off = HHI_PCIE_PLL_CNTL,
+                       .shift   = 30,
+                       .width   = 1,
+               },
                .m = {
                        .reg_off = HHI_PCIE_PLL_CNTL,
                        .shift   = 0,
@@ -658,16 +666,6 @@ static struct clk_regmap axg_pcie_pll = {
                        .shift   = 9,
                        .width   = 5,
                },
-               .od = {
-                       .reg_off = HHI_PCIE_PLL_CNTL,
-                       .shift   = 16,
-                       .width   = 2,
-               },
-               .od2 = {
-                       .reg_off = HHI_PCIE_PLL_CNTL6,
-                       .shift   = 6,
-                       .width   = 2,
-               },
                .frac = {
                        .reg_off = HHI_PCIE_PLL_CNTL1,
                        .shift   = 0,
@@ -683,29 +681,63 @@ static struct clk_regmap axg_pcie_pll = {
                        .shift   = 29,
                        .width   = 1,
                },
-               .table = axg_pcie_pll_rate_table,
+               .table = axg_pcie_pll_params_table,
                .init_regs = axg_pcie_init_regs,
                .init_count = ARRAY_SIZE(axg_pcie_init_regs),
        },
        .hw.init = &(struct clk_init_data){
-               .name = "pcie_pll",
+               .name = "pcie_pll_dco",
                .ops = &meson_clk_pll_ops,
                .parent_names = (const char *[]){ "xtal" },
                .num_parents = 1,
        },
 };
 
+static struct clk_regmap axg_pcie_pll_od = {
+       .data = &(struct clk_regmap_div_data){
+               .offset = HHI_PCIE_PLL_CNTL,
+               .shift = 16,
+               .width = 2,
+               .flags = CLK_DIVIDER_POWER_OF_TWO,
+       },
+       .hw.init = &(struct clk_init_data){
+               .name = "pcie_pll_od",
+               .ops = &clk_regmap_divider_ops,
+               .parent_names = (const char *[]){ "pcie_pll_dco" },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
+static struct clk_regmap axg_pcie_pll = {
+       .data = &(struct clk_regmap_div_data){
+               .offset = HHI_PCIE_PLL_CNTL6,
+               .shift = 6,
+               .width = 2,
+               .flags = CLK_DIVIDER_POWER_OF_TWO,
+       },
+       .hw.init = &(struct clk_init_data){
+               .name = "pcie_pll",
+               .ops = &clk_regmap_divider_ops,
+               .parent_names = (const char *[]){ "pcie_pll_od" },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
 static struct clk_regmap axg_pcie_mux = {
        .data = &(struct clk_regmap_mux_data){
                .offset = HHI_PCIE_PLL_CNTL6,
                .mask = 0x1,
                .shift = 2,
+               /* skip the parent mpll3, reserved for debug */
+               .table = (u32[]){ 1 },
        },
        .hw.init = &(struct clk_init_data){
                .name = "pcie_mux",
                .ops = &clk_regmap_mux_ops,
-               .parent_names = (const char *[]){ "mpll3", "pcie_pll" },
-               .num_parents = 2,
+               .parent_names = (const char *[]){ "pcie_pll" },
+               .num_parents = 1,
                .flags = CLK_SET_RATE_PARENT,
        },
 };
@@ -1107,6 +1139,12 @@ static struct clk_hw_onecell_data axg_hw_onecell_data = {
                [CLKID_GEN_CLK_SEL]             = &axg_gen_clk_sel.hw,
                [CLKID_GEN_CLK_DIV]             = &axg_gen_clk_div.hw,
                [CLKID_GEN_CLK]                 = &axg_gen_clk.hw,
+               [CLKID_SYS_PLL_DCO]             = &axg_sys_pll_dco.hw,
+               [CLKID_FIXED_PLL_DCO]           = &axg_fixed_pll_dco.hw,
+               [CLKID_GP0_PLL_DCO]             = &axg_gp0_pll_dco.hw,
+               [CLKID_HIFI_PLL_DCO]            = &axg_hifi_pll_dco.hw,
+               [CLKID_PCIE_PLL_DCO]            = &axg_pcie_pll_dco.hw,
+               [CLKID_PCIE_PLL_OD]             = &axg_pcie_pll_od.hw,
                [NR_CLKS]                       = NULL,
        },
        .num = NR_CLKS,
@@ -1185,6 +1223,8 @@ static struct clk_regmap *const axg_clk_regmaps[] = {
        &axg_fclk_div4,
        &axg_fclk_div5,
        &axg_fclk_div7,
+       &axg_pcie_pll_dco,
+       &axg_pcie_pll_od,
        &axg_pcie_pll,
        &axg_pcie_mux,
        &axg_pcie_ref,
@@ -1194,6 +1234,12 @@ static struct clk_regmap *const axg_clk_regmaps[] = {
        &axg_gen_clk_sel,
        &axg_gen_clk_div,
        &axg_gen_clk,
+       &axg_fixed_pll_dco,
+       &axg_sys_pll_dco,
+       &axg_gp0_pll_dco,
+       &axg_hifi_pll_dco,
+       &axg_pcie_pll_dco,
+       &axg_pcie_pll_od,
 };
 
 static const struct of_device_id clkc_match_table[] = {
index 1d04144a1b2cc2caee16096530719e45e86a6eba..0431dabac6294e43e29adf38dcbe3cfd77a8a685 100644 (file)
 #define CLKID_PCIE_REF                         78
 #define CLKID_GEN_CLK_SEL                      82
 #define CLKID_GEN_CLK_DIV                      83
+#define CLKID_SYS_PLL_DCO                      85
+#define CLKID_FIXED_PLL_DCO                    86
+#define CLKID_GP0_PLL_DCO                      87
+#define CLKID_HIFI_PLL_DCO                     88
+#define CLKID_PCIE_PLL_DCO                     89
+#define CLKID_PCIE_PLL_OD                      90
 
-#define NR_CLKS                                        85
+#define NR_CLKS                                        91
 
 /* include the CLKIDs that have been made part of the DT binding */
 #include <dt-bindings/clock/axg-clkc.h>
index 3e04617ac47f6f0f39d5bee94a06bbc026c7ca62..f5b5b3fabe3cbe48606565a77e947f82496b8b88 100644 (file)
  * In the most basic form, a Meson PLL is composed as follows:
  *
  *                     PLL
- *      +------------------------------+
- *      |                              |
- * in -----[ /N ]---[ *M ]---[ >>OD ]----->> out
- *      |         ^        ^           |
- *      +------------------------------+
- *                |        |
- *               FREF     VCO
+ *        +--------------------------------+
+ *        |                                |
+ *        |             +--+               |
+ *  in >>-----[ /N ]--->|  |      +-----+  |
+ *        |             |  |------| DCO |---->> out
+ *        |  +--------->|  |      +--v--+  |
+ *        |  |          +--+         |     |
+ *        |  |                       |     |
+ *        |  +--[ *(M + (F/Fmax) ]<--+     |
+ *        |                                |
+ *        +--------------------------------+
  *
- * out = in * (m + frac / frac_max) / (n << sum(ods))
+ * out = in * (m + frac / frac_max) / n
  */
 
 #include <linux/clk-provider.h>
@@ -41,12 +45,11 @@ meson_clk_pll_data(struct clk_regmap *clk)
 }
 
 static unsigned long __pll_params_to_rate(unsigned long parent_rate,
-                                         const struct pll_rate_table *pllt,
+                                         const struct pll_params_table *pllt,
                                          u16 frac,
                                          struct meson_clk_pll_data *pll)
 {
        u64 rate = (u64)parent_rate * pllt->m;
-       unsigned int od = pllt->od + pllt->od2 + pllt->od3;
 
        if (frac && MESON_PARM_APPLICABLE(&pll->frac)) {
                u64 frac_rate = (u64)parent_rate * frac;
@@ -55,7 +58,7 @@ static unsigned long __pll_params_to_rate(unsigned long parent_rate,
                                         (1 << pll->frac.width));
        }
 
-       return DIV_ROUND_UP_ULL(rate, pllt->n << od);
+       return DIV_ROUND_UP_ULL(rate, pllt->n);
 }
 
 static unsigned long meson_clk_pll_recalc_rate(struct clk_hw *hw,
@@ -63,20 +66,11 @@ static unsigned long meson_clk_pll_recalc_rate(struct clk_hw *hw,
 {
        struct clk_regmap *clk = to_clk_regmap(hw);
        struct meson_clk_pll_data *pll = meson_clk_pll_data(clk);
-       struct pll_rate_table pllt;
+       struct pll_params_table pllt;
        u16 frac;
 
        pllt.n = meson_parm_read(clk->map, &pll->n);
        pllt.m = meson_parm_read(clk->map, &pll->m);
-       pllt.od = meson_parm_read(clk->map, &pll->od);
-
-       pllt.od2 = MESON_PARM_APPLICABLE(&pll->od2) ?
-               meson_parm_read(clk->map, &pll->od2) :
-               0;
-
-       pllt.od3 = MESON_PARM_APPLICABLE(&pll->od3) ?
-               meson_parm_read(clk->map, &pll->od3) :
-               0;
 
        frac = MESON_PARM_APPLICABLE(&pll->frac) ?
                meson_parm_read(clk->map, &pll->frac) :
@@ -87,14 +81,12 @@ static unsigned long meson_clk_pll_recalc_rate(struct clk_hw *hw,
 
 static u16 __pll_params_with_frac(unsigned long rate,
                                  unsigned long parent_rate,
-                                 const struct pll_rate_table *pllt,
+                                 const struct pll_params_table *pllt,
                                  struct meson_clk_pll_data *pll)
 {
        u16 frac_max = (1 << pll->frac.width);
        u64 val = (u64)rate * pllt->n;
 
-       val <<= pllt->od + pllt->od2 + pllt->od3;
-
        if (pll->flags & CLK_MESON_PLL_ROUND_CLOSEST)
                val = DIV_ROUND_CLOSEST_ULL(val * frac_max, parent_rate);
        else
@@ -105,29 +97,50 @@ static u16 __pll_params_with_frac(unsigned long rate,
        return min((u16)val, (u16)(frac_max - 1));
 }
 
-static const struct pll_rate_table *
+static bool meson_clk_pll_is_better(unsigned long rate,
+                                   unsigned long best,
+                                   unsigned long now,
+                                   struct meson_clk_pll_data *pll)
+{
+       if (!(pll->flags & CLK_MESON_PLL_ROUND_CLOSEST) ||
+           MESON_PARM_APPLICABLE(&pll->frac)) {
+               /* Round down */
+               if (now < rate && best < now)
+                       return true;
+       } else {
+               /* Round Closest */
+               if (abs(now - rate) < abs(best - rate))
+                       return true;
+       }
+
+       return false;
+}
+
+static const struct pll_params_table *
 meson_clk_get_pll_settings(unsigned long rate,
+                          unsigned long parent_rate,
                           struct meson_clk_pll_data *pll)
 {
-       const struct pll_rate_table *table = pll->table;
-       unsigned int i = 0;
+       const struct pll_params_table *table = pll->table;
+       unsigned long best = 0, now = 0;
+       unsigned int i, best_i = 0;
 
        if (!table)
                return NULL;
 
-       /* Find the first table element exceeding rate */
-       while (table[i].rate && table[i].rate <= rate)
-               i++;
+       for (i = 0; table[i].n; i++) {
+               now = __pll_params_to_rate(parent_rate, &table[i], 0, pll);
 
-       if (i != 0) {
-               if (MESON_PARM_APPLICABLE(&pll->frac) ||
-                   !(pll->flags & CLK_MESON_PLL_ROUND_CLOSEST) ||
-                   (abs(rate - table[i - 1].rate) <
-                    abs(rate - table[i].rate)))
-                       i--;
+               /* If we get an exact match, don't bother any further */
+               if (now == rate) {
+                       return &table[i];
+               } else if (meson_clk_pll_is_better(rate, best, now, pll)) {
+                       best = now;
+                       best_i = i;
+               }
        }
 
-       return (struct pll_rate_table *)&table[i];
+       return (struct pll_params_table *)&table[best_i];
 }
 
 static long meson_clk_pll_round_rate(struct clk_hw *hw, unsigned long rate,
@@ -135,16 +148,18 @@ static long meson_clk_pll_round_rate(struct clk_hw *hw, unsigned long rate,
 {
        struct clk_regmap *clk = to_clk_regmap(hw);
        struct meson_clk_pll_data *pll = meson_clk_pll_data(clk);
-       const struct pll_rate_table *pllt =
-               meson_clk_get_pll_settings(rate, pll);
+       const struct pll_params_table *pllt =
+               meson_clk_get_pll_settings(rate, *parent_rate, pll);
+       unsigned long round;
        u16 frac;
 
        if (!pllt)
                return meson_clk_pll_recalc_rate(hw, *parent_rate);
 
-       if (!MESON_PARM_APPLICABLE(&pll->frac)
-           || rate == pllt->rate)
-               return pllt->rate;
+       round = __pll_params_to_rate(*parent_rate, pllt, 0, pll);
+
+       if (!MESON_PARM_APPLICABLE(&pll->frac) || rate == round)
+               return round;
 
        /*
         * The rate provided by the setting is not an exact match, let's
@@ -185,12 +200,45 @@ static void meson_clk_pll_init(struct clk_hw *hw)
        }
 }
 
+static int meson_clk_pll_enable(struct clk_hw *hw)
+{
+       struct clk_regmap *clk = to_clk_regmap(hw);
+       struct meson_clk_pll_data *pll = meson_clk_pll_data(clk);
+
+       /* Make sure the pll is in reset */
+       meson_parm_write(clk->map, &pll->rst, 1);
+
+       /* Enable the pll */
+       meson_parm_write(clk->map, &pll->en, 1);
+
+       /* Take the pll out reset */
+       meson_parm_write(clk->map, &pll->rst, 0);
+
+       if (meson_clk_pll_wait_lock(hw))
+               return -EIO;
+
+       return 0;
+}
+
+static void meson_clk_pll_disable(struct clk_hw *hw)
+{
+       struct clk_regmap *clk = to_clk_regmap(hw);
+       struct meson_clk_pll_data *pll = meson_clk_pll_data(clk);
+
+       /* Put the pll is in reset */
+       meson_parm_write(clk->map, &pll->rst, 1);
+
+       /* Disable the pll */
+       meson_parm_write(clk->map, &pll->en, 0);
+}
+
 static int meson_clk_pll_set_rate(struct clk_hw *hw, unsigned long rate,
                                  unsigned long parent_rate)
 {
        struct clk_regmap *clk = to_clk_regmap(hw);
        struct meson_clk_pll_data *pll = meson_clk_pll_data(clk);
-       const struct pll_rate_table *pllt;
+       const struct pll_params_table *pllt;
+       unsigned int enabled;
        unsigned long old_rate;
        u16 frac = 0;
 
@@ -199,32 +247,28 @@ static int meson_clk_pll_set_rate(struct clk_hw *hw, unsigned long rate,
 
        old_rate = rate;
 
-       pllt = meson_clk_get_pll_settings(rate, pll);
+       pllt = meson_clk_get_pll_settings(rate, parent_rate, pll);
        if (!pllt)
                return -EINVAL;
 
-       /* Put the pll in reset to write the params */
-       meson_parm_write(clk->map, &pll->rst, 1);
+       enabled = meson_parm_read(clk->map, &pll->en);
+       if (enabled)
+               meson_clk_pll_disable(hw);
 
        meson_parm_write(clk->map, &pll->n, pllt->n);
        meson_parm_write(clk->map, &pll->m, pllt->m);
-       meson_parm_write(clk->map, &pll->od, pllt->od);
 
-       if (MESON_PARM_APPLICABLE(&pll->od2))
-               meson_parm_write(clk->map, &pll->od2, pllt->od2);
-
-       if (MESON_PARM_APPLICABLE(&pll->od3))
-               meson_parm_write(clk->map, &pll->od3, pllt->od3);
 
        if (MESON_PARM_APPLICABLE(&pll->frac)) {
                frac = __pll_params_with_frac(rate, parent_rate, pllt, pll);
                meson_parm_write(clk->map, &pll->frac, frac);
        }
 
-       /* make sure the reset is cleared at this point */
-       meson_parm_write(clk->map, &pll->rst, 0);
+       /* If the pll is stopped, bail out now */
+       if (!enabled)
+               return 0;
 
-       if (meson_clk_pll_wait_lock(hw)) {
+       if (meson_clk_pll_enable(hw)) {
                pr_warn("%s: pll did not lock, trying to restore old rate %lu\n",
                        __func__, old_rate);
                /*
@@ -244,6 +288,8 @@ const struct clk_ops meson_clk_pll_ops = {
        .recalc_rate    = meson_clk_pll_recalc_rate,
        .round_rate     = meson_clk_pll_round_rate,
        .set_rate       = meson_clk_pll_set_rate,
+       .enable         = meson_clk_pll_enable,
+       .disable        = meson_clk_pll_disable
 };
 
 const struct clk_ops meson_clk_pll_ro_ops = {
index 24cec16b603868fc1040c699f88b916d10ff0f8d..6b96d55c047d69aae1732c75c0b9f3ee0f9b6197 100644 (file)
@@ -43,37 +43,29 @@ static inline void meson_parm_write(struct regmap *map, struct parm *p,
 }
 
 
-struct pll_rate_table {
-       unsigned long   rate;
+struct pll_params_table {
        u16             m;
        u16             n;
-       u16             od;
-       u16             od2;
-       u16             od3;
 };
 
-#define PLL_RATE(_r, _m, _n, _od)                                      \
+#define PLL_PARAMS(_m, _n)                                             \
        {                                                               \
-               .rate           = (_r),                                 \
                .m              = (_m),                                 \
                .n              = (_n),                                 \
-               .od             = (_od),                                \
        }
 
 #define CLK_MESON_PLL_ROUND_CLOSEST    BIT(0)
 
 struct meson_clk_pll_data {
+       struct parm en;
        struct parm m;
        struct parm n;
        struct parm frac;
-       struct parm od;
-       struct parm od2;
-       struct parm od3;
        struct parm l;
        struct parm rst;
        const struct reg_sequence *init_regs;
        unsigned int init_count;
-       const struct pll_rate_table *table;
+       const struct pll_params_table *table;
        u8 flags;
 };
 
index 86d3ae58e84c280c8ba982cf52e6848fd743db4e..9309cfaaa464ebd5f3e7d26e174c3c8449e16208 100644 (file)
 
 static DEFINE_SPINLOCK(meson_clk_lock);
 
-static const struct pll_rate_table gxbb_gp0_pll_rate_table[] = {
-       PLL_RATE(96000000, 32, 1, 3),
-       PLL_RATE(99000000, 33, 1, 3),
-       PLL_RATE(102000000, 34, 1, 3),
-       PLL_RATE(105000000, 35, 1, 3),
-       PLL_RATE(108000000, 36, 1, 3),
-       PLL_RATE(111000000, 37, 1, 3),
-       PLL_RATE(114000000, 38, 1, 3),
-       PLL_RATE(117000000, 39, 1, 3),
-       PLL_RATE(120000000, 40, 1, 3),
-       PLL_RATE(123000000, 41, 1, 3),
-       PLL_RATE(126000000, 42, 1, 3),
-       PLL_RATE(129000000, 43, 1, 3),
-       PLL_RATE(132000000, 44, 1, 3),
-       PLL_RATE(135000000, 45, 1, 3),
-       PLL_RATE(138000000, 46, 1, 3),
-       PLL_RATE(141000000, 47, 1, 3),
-       PLL_RATE(144000000, 48, 1, 3),
-       PLL_RATE(147000000, 49, 1, 3),
-       PLL_RATE(150000000, 50, 1, 3),
-       PLL_RATE(153000000, 51, 1, 3),
-       PLL_RATE(156000000, 52, 1, 3),
-       PLL_RATE(159000000, 53, 1, 3),
-       PLL_RATE(162000000, 54, 1, 3),
-       PLL_RATE(165000000, 55, 1, 3),
-       PLL_RATE(168000000, 56, 1, 3),
-       PLL_RATE(171000000, 57, 1, 3),
-       PLL_RATE(174000000, 58, 1, 3),
-       PLL_RATE(177000000, 59, 1, 3),
-       PLL_RATE(180000000, 60, 1, 3),
-       PLL_RATE(183000000, 61, 1, 3),
-       PLL_RATE(186000000, 62, 1, 3),
-       PLL_RATE(192000000, 32, 1, 2),
-       PLL_RATE(198000000, 33, 1, 2),
-       PLL_RATE(204000000, 34, 1, 2),
-       PLL_RATE(210000000, 35, 1, 2),
-       PLL_RATE(216000000, 36, 1, 2),
-       PLL_RATE(222000000, 37, 1, 2),
-       PLL_RATE(228000000, 38, 1, 2),
-       PLL_RATE(234000000, 39, 1, 2),
-       PLL_RATE(240000000, 40, 1, 2),
-       PLL_RATE(246000000, 41, 1, 2),
-       PLL_RATE(252000000, 42, 1, 2),
-       PLL_RATE(258000000, 43, 1, 2),
-       PLL_RATE(264000000, 44, 1, 2),
-       PLL_RATE(270000000, 45, 1, 2),
-       PLL_RATE(276000000, 46, 1, 2),
-       PLL_RATE(282000000, 47, 1, 2),
-       PLL_RATE(288000000, 48, 1, 2),
-       PLL_RATE(294000000, 49, 1, 2),
-       PLL_RATE(300000000, 50, 1, 2),
-       PLL_RATE(306000000, 51, 1, 2),
-       PLL_RATE(312000000, 52, 1, 2),
-       PLL_RATE(318000000, 53, 1, 2),
-       PLL_RATE(324000000, 54, 1, 2),
-       PLL_RATE(330000000, 55, 1, 2),
-       PLL_RATE(336000000, 56, 1, 2),
-       PLL_RATE(342000000, 57, 1, 2),
-       PLL_RATE(348000000, 58, 1, 2),
-       PLL_RATE(354000000, 59, 1, 2),
-       PLL_RATE(360000000, 60, 1, 2),
-       PLL_RATE(366000000, 61, 1, 2),
-       PLL_RATE(372000000, 62, 1, 2),
-       PLL_RATE(384000000, 32, 1, 1),
-       PLL_RATE(396000000, 33, 1, 1),
-       PLL_RATE(408000000, 34, 1, 1),
-       PLL_RATE(420000000, 35, 1, 1),
-       PLL_RATE(432000000, 36, 1, 1),
-       PLL_RATE(444000000, 37, 1, 1),
-       PLL_RATE(456000000, 38, 1, 1),
-       PLL_RATE(468000000, 39, 1, 1),
-       PLL_RATE(480000000, 40, 1, 1),
-       PLL_RATE(492000000, 41, 1, 1),
-       PLL_RATE(504000000, 42, 1, 1),
-       PLL_RATE(516000000, 43, 1, 1),
-       PLL_RATE(528000000, 44, 1, 1),
-       PLL_RATE(540000000, 45, 1, 1),
-       PLL_RATE(552000000, 46, 1, 1),
-       PLL_RATE(564000000, 47, 1, 1),
-       PLL_RATE(576000000, 48, 1, 1),
-       PLL_RATE(588000000, 49, 1, 1),
-       PLL_RATE(600000000, 50, 1, 1),
-       PLL_RATE(612000000, 51, 1, 1),
-       PLL_RATE(624000000, 52, 1, 1),
-       PLL_RATE(636000000, 53, 1, 1),
-       PLL_RATE(648000000, 54, 1, 1),
-       PLL_RATE(660000000, 55, 1, 1),
-       PLL_RATE(672000000, 56, 1, 1),
-       PLL_RATE(684000000, 57, 1, 1),
-       PLL_RATE(696000000, 58, 1, 1),
-       PLL_RATE(708000000, 59, 1, 1),
-       PLL_RATE(720000000, 60, 1, 1),
-       PLL_RATE(732000000, 61, 1, 1),
-       PLL_RATE(744000000, 62, 1, 1),
-       PLL_RATE(768000000, 32, 1, 0),
-       PLL_RATE(792000000, 33, 1, 0),
-       PLL_RATE(816000000, 34, 1, 0),
-       PLL_RATE(840000000, 35, 1, 0),
-       PLL_RATE(864000000, 36, 1, 0),
-       PLL_RATE(888000000, 37, 1, 0),
-       PLL_RATE(912000000, 38, 1, 0),
-       PLL_RATE(936000000, 39, 1, 0),
-       PLL_RATE(960000000, 40, 1, 0),
-       PLL_RATE(984000000, 41, 1, 0),
-       PLL_RATE(1008000000, 42, 1, 0),
-       PLL_RATE(1032000000, 43, 1, 0),
-       PLL_RATE(1056000000, 44, 1, 0),
-       PLL_RATE(1080000000, 45, 1, 0),
-       PLL_RATE(1104000000, 46, 1, 0),
-       PLL_RATE(1128000000, 47, 1, 0),
-       PLL_RATE(1152000000, 48, 1, 0),
-       PLL_RATE(1176000000, 49, 1, 0),
-       PLL_RATE(1200000000, 50, 1, 0),
-       PLL_RATE(1224000000, 51, 1, 0),
-       PLL_RATE(1248000000, 52, 1, 0),
-       PLL_RATE(1272000000, 53, 1, 0),
-       PLL_RATE(1296000000, 54, 1, 0),
-       PLL_RATE(1320000000, 55, 1, 0),
-       PLL_RATE(1344000000, 56, 1, 0),
-       PLL_RATE(1368000000, 57, 1, 0),
-       PLL_RATE(1392000000, 58, 1, 0),
-       PLL_RATE(1416000000, 59, 1, 0),
-       PLL_RATE(1440000000, 60, 1, 0),
-       PLL_RATE(1464000000, 61, 1, 0),
-       PLL_RATE(1488000000, 62, 1, 0),
+static const struct pll_params_table gxbb_gp0_pll_params_table[] = {
+       PLL_PARAMS(32, 1),
+       PLL_PARAMS(33, 1),
+       PLL_PARAMS(34, 1),
+       PLL_PARAMS(35, 1),
+       PLL_PARAMS(36, 1),
+       PLL_PARAMS(37, 1),
+       PLL_PARAMS(38, 1),
+       PLL_PARAMS(39, 1),
+       PLL_PARAMS(40, 1),
+       PLL_PARAMS(41, 1),
+       PLL_PARAMS(42, 1),
+       PLL_PARAMS(43, 1),
+       PLL_PARAMS(44, 1),
+       PLL_PARAMS(45, 1),
+       PLL_PARAMS(46, 1),
+       PLL_PARAMS(47, 1),
+       PLL_PARAMS(48, 1),
+       PLL_PARAMS(49, 1),
+       PLL_PARAMS(50, 1),
+       PLL_PARAMS(51, 1),
+       PLL_PARAMS(52, 1),
+       PLL_PARAMS(53, 1),
+       PLL_PARAMS(54, 1),
+       PLL_PARAMS(55, 1),
+       PLL_PARAMS(56, 1),
+       PLL_PARAMS(57, 1),
+       PLL_PARAMS(58, 1),
+       PLL_PARAMS(59, 1),
+       PLL_PARAMS(60, 1),
+       PLL_PARAMS(61, 1),
+       PLL_PARAMS(62, 1),
        { /* sentinel */ },
 };
 
-static const struct pll_rate_table gxl_gp0_pll_rate_table[] = {
-       PLL_RATE(504000000, 42, 1, 1),
-       PLL_RATE(516000000, 43, 1, 1),
-       PLL_RATE(528000000, 44, 1, 1),
-       PLL_RATE(540000000, 45, 1, 1),
-       PLL_RATE(552000000, 46, 1, 1),
-       PLL_RATE(564000000, 47, 1, 1),
-       PLL_RATE(576000000, 48, 1, 1),
-       PLL_RATE(588000000, 49, 1, 1),
-       PLL_RATE(600000000, 50, 1, 1),
-       PLL_RATE(612000000, 51, 1, 1),
-       PLL_RATE(624000000, 52, 1, 1),
-       PLL_RATE(636000000, 53, 1, 1),
-       PLL_RATE(648000000, 54, 1, 1),
-       PLL_RATE(660000000, 55, 1, 1),
-       PLL_RATE(672000000, 56, 1, 1),
-       PLL_RATE(684000000, 57, 1, 1),
-       PLL_RATE(696000000, 58, 1, 1),
-       PLL_RATE(708000000, 59, 1, 1),
-       PLL_RATE(720000000, 60, 1, 1),
-       PLL_RATE(732000000, 61, 1, 1),
-       PLL_RATE(744000000, 62, 1, 1),
-       PLL_RATE(756000000, 63, 1, 1),
-       PLL_RATE(768000000, 64, 1, 1),
-       PLL_RATE(780000000, 65, 1, 1),
-       PLL_RATE(792000000, 66, 1, 1),
+static const struct pll_params_table gxl_gp0_pll_params_table[] = {
+       PLL_PARAMS(42, 1),
+       PLL_PARAMS(43, 1),
+       PLL_PARAMS(44, 1),
+       PLL_PARAMS(45, 1),
+       PLL_PARAMS(46, 1),
+       PLL_PARAMS(47, 1),
+       PLL_PARAMS(48, 1),
+       PLL_PARAMS(49, 1),
+       PLL_PARAMS(50, 1),
+       PLL_PARAMS(51, 1),
+       PLL_PARAMS(52, 1),
+       PLL_PARAMS(53, 1),
+       PLL_PARAMS(54, 1),
+       PLL_PARAMS(55, 1),
+       PLL_PARAMS(56, 1),
+       PLL_PARAMS(57, 1),
+       PLL_PARAMS(58, 1),
+       PLL_PARAMS(59, 1),
+       PLL_PARAMS(60, 1),
+       PLL_PARAMS(61, 1),
+       PLL_PARAMS(62, 1),
+       PLL_PARAMS(63, 1),
+       PLL_PARAMS(64, 1),
+       PLL_PARAMS(65, 1),
+       PLL_PARAMS(66, 1),
        { /* sentinel */ },
 };
 
-static struct clk_regmap gxbb_fixed_pll = {
+static struct clk_regmap gxbb_fixed_pll_dco = {
        .data = &(struct meson_clk_pll_data){
+               .en = {
+                       .reg_off = HHI_MPLL_CNTL,
+                       .shift   = 30,
+                       .width   = 1,
+               },
                .m = {
                        .reg_off = HHI_MPLL_CNTL,
                        .shift   = 0,
@@ -187,11 +99,6 @@ static struct clk_regmap gxbb_fixed_pll = {
                        .shift   = 9,
                        .width   = 5,
                },
-               .od = {
-                       .reg_off = HHI_MPLL_CNTL,
-                       .shift   = 16,
-                       .width   = 2,
-               },
                .frac = {
                        .reg_off = HHI_MPLL_CNTL2,
                        .shift   = 0,
@@ -209,11 +116,29 @@ static struct clk_regmap gxbb_fixed_pll = {
                },
        },
        .hw.init = &(struct clk_init_data){
-               .name = "fixed_pll",
+               .name = "fixed_pll_dco",
                .ops = &meson_clk_pll_ro_ops,
                .parent_names = (const char *[]){ "xtal" },
                .num_parents = 1,
-               .flags = CLK_GET_RATE_NOCACHE,
+       },
+};
+
+static struct clk_regmap gxbb_fixed_pll = {
+       .data = &(struct clk_regmap_div_data){
+               .offset = HHI_MPLL_CNTL,
+               .shift = 16,
+               .width = 2,
+               .flags = CLK_DIVIDER_POWER_OF_TWO,
+       },
+       .hw.init = &(struct clk_init_data){
+               .name = "fixed_pll",
+               .ops = &clk_regmap_divider_ro_ops,
+               .parent_names = (const char *[]){ "fixed_pll_dco" },
+               .num_parents = 1,
+               /*
+                * This clock won't ever change at runtime so
+                * CLK_SET_RATE_PARENT is not required
+                */
        },
 };
 
@@ -228,8 +153,13 @@ static struct clk_fixed_factor gxbb_hdmi_pll_pre_mult = {
        },
 };
 
-static struct clk_regmap gxbb_hdmi_pll = {
+static struct clk_regmap gxbb_hdmi_pll_dco = {
        .data = &(struct meson_clk_pll_data){
+               .en = {
+                       .reg_off = HHI_HDMI_PLL_CNTL,
+                       .shift   = 30,
+                       .width   = 1,
+               },
                .m = {
                        .reg_off = HHI_HDMI_PLL_CNTL,
                        .shift   = 0,
@@ -245,21 +175,6 @@ static struct clk_regmap gxbb_hdmi_pll = {
                        .shift   = 0,
                        .width   = 12,
                },
-               .od = {
-                       .reg_off = HHI_HDMI_PLL_CNTL2,
-                       .shift   = 16,
-                       .width   = 2,
-               },
-               .od2 = {
-                       .reg_off = HHI_HDMI_PLL_CNTL2,
-                       .shift   = 22,
-                       .width   = 2,
-               },
-               .od3 = {
-                       .reg_off = HHI_HDMI_PLL_CNTL2,
-                       .shift   = 18,
-                       .width   = 2,
-               },
                .l = {
                        .reg_off = HHI_HDMI_PLL_CNTL,
                        .shift   = 31,
@@ -272,74 +187,121 @@ static struct clk_regmap gxbb_hdmi_pll = {
                },
        },
        .hw.init = &(struct clk_init_data){
-               .name = "hdmi_pll",
+               .name = "hdmi_pll_dco",
                .ops = &meson_clk_pll_ro_ops,
                .parent_names = (const char *[]){ "hdmi_pll_pre_mult" },
                .num_parents = 1,
+               /*
+                * Display directly handle hdmi pll registers ATM, we need
+                * NOCACHE to keep our view of the clock as accurate as possible
+                */
                .flags = CLK_GET_RATE_NOCACHE,
        },
 };
 
+static struct clk_regmap gxbb_hdmi_pll_od = {
+       .data = &(struct clk_regmap_div_data){
+               .offset = HHI_HDMI_PLL_CNTL2,
+               .shift = 16,
+               .width = 2,
+               .flags = CLK_DIVIDER_POWER_OF_TWO,
+       },
+       .hw.init = &(struct clk_init_data){
+               .name = "hdmi_pll_od",
+               .ops = &clk_regmap_divider_ro_ops,
+               .parent_names = (const char *[]){ "hdmi_pll_dco" },
+               .num_parents = 1,
+               .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+       },
+};
+
+static struct clk_regmap gxbb_hdmi_pll_od2 = {
+       .data = &(struct clk_regmap_div_data){
+               .offset = HHI_HDMI_PLL_CNTL2,
+               .shift = 22,
+               .width = 2,
+               .flags = CLK_DIVIDER_POWER_OF_TWO,
+       },
+       .hw.init = &(struct clk_init_data){
+               .name = "hdmi_pll_od2",
+               .ops = &clk_regmap_divider_ro_ops,
+               .parent_names = (const char *[]){ "hdmi_pll_od" },
+               .num_parents = 1,
+               .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+       },
+};
+
+static struct clk_regmap gxbb_hdmi_pll = {
+       .data = &(struct clk_regmap_div_data){
+               .offset = HHI_HDMI_PLL_CNTL2,
+               .shift = 18,
+               .width = 2,
+               .flags = CLK_DIVIDER_POWER_OF_TWO,
+       },
+       .hw.init = &(struct clk_init_data){
+               .name = "hdmi_pll",
+               .ops = &clk_regmap_divider_ro_ops,
+               .parent_names = (const char *[]){ "hdmi_pll_od2" },
+               .num_parents = 1,
+               .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+       },
+};
+
+static struct clk_regmap gxl_hdmi_pll_od = {
+       .data = &(struct clk_regmap_div_data){
+               .offset = HHI_HDMI_PLL_CNTL + 8,
+               .shift = 21,
+               .width = 2,
+               .flags = CLK_DIVIDER_POWER_OF_TWO,
+       },
+       .hw.init = &(struct clk_init_data){
+               .name = "hdmi_pll_od",
+               .ops = &clk_regmap_divider_ro_ops,
+               .parent_names = (const char *[]){ "hdmi_pll_dco" },
+               .num_parents = 1,
+               .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+       },
+};
+
+static struct clk_regmap gxl_hdmi_pll_od2 = {
+       .data = &(struct clk_regmap_div_data){
+               .offset = HHI_HDMI_PLL_CNTL + 8,
+               .shift = 23,
+               .width = 2,
+               .flags = CLK_DIVIDER_POWER_OF_TWO,
+       },
+       .hw.init = &(struct clk_init_data){
+               .name = "hdmi_pll_od2",
+               .ops = &clk_regmap_divider_ro_ops,
+               .parent_names = (const char *[]){ "hdmi_pll_od" },
+               .num_parents = 1,
+               .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
+       },
+};
+
 static struct clk_regmap gxl_hdmi_pll = {
-       .data = &(struct meson_clk_pll_data){
-               .m = {
-                       .reg_off = HHI_HDMI_PLL_CNTL,
-                       .shift   = 0,
-                       .width   = 9,
-               },
-               .n = {
-                       .reg_off = HHI_HDMI_PLL_CNTL,
-                       .shift   = 9,
-                       .width   = 5,
-               },
-               .frac = {
-                       /*
-                        * On gxl, there is a register shift due to
-                        * HHI_HDMI_PLL_CNTL1 which does not exist on gxbb,
-                        * so we compute the register offset based on the PLL
-                        * base to get it right
-                        */
-                       .reg_off = HHI_HDMI_PLL_CNTL + 4,
-                       .shift   = 0,
-                       .width   = 12,
-               },
-               .od = {
-                       .reg_off = HHI_HDMI_PLL_CNTL + 8,
-                       .shift   = 21,
-                       .width   = 2,
-               },
-               .od2 = {
-                       .reg_off = HHI_HDMI_PLL_CNTL + 8,
-                       .shift   = 23,
-                       .width   = 2,
-               },
-               .od3 = {
-                       .reg_off = HHI_HDMI_PLL_CNTL + 8,
-                       .shift   = 19,
-                       .width   = 2,
-               },
-               .l = {
-                       .reg_off = HHI_HDMI_PLL_CNTL,
-                       .shift   = 31,
-                       .width   = 1,
-               },
-               .rst = {
-                       .reg_off = HHI_HDMI_PLL_CNTL,
-                       .shift   = 29,
-                       .width   = 1,
-               },
+       .data = &(struct clk_regmap_div_data){
+               .offset = HHI_HDMI_PLL_CNTL + 8,
+               .shift = 19,
+               .width = 2,
+               .flags = CLK_DIVIDER_POWER_OF_TWO,
        },
        .hw.init = &(struct clk_init_data){
                .name = "hdmi_pll",
-               .ops = &meson_clk_pll_ro_ops,
-               .parent_names = (const char *[]){ "xtal" },
+               .ops = &clk_regmap_divider_ro_ops,
+               .parent_names = (const char *[]){ "hdmi_pll_od2" },
                .num_parents = 1,
-               .flags = CLK_GET_RATE_NOCACHE,
+               .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
        },
 };
 
-static struct clk_regmap gxbb_sys_pll = {
+static struct clk_regmap gxbb_sys_pll_dco = {
        .data = &(struct meson_clk_pll_data){
+               .en = {
+                       .reg_off = HHI_SYS_PLL_CNTL,
+                       .shift   = 30,
+                       .width   = 1,
+               },
                .m = {
                        .reg_off = HHI_SYS_PLL_CNTL,
                        .shift   = 0,
@@ -350,11 +312,6 @@ static struct clk_regmap gxbb_sys_pll = {
                        .shift   = 9,
                        .width   = 5,
                },
-               .od = {
-                       .reg_off = HHI_SYS_PLL_CNTL,
-                       .shift   = 10,
-                       .width   = 2,
-               },
                .l = {
                        .reg_off = HHI_SYS_PLL_CNTL,
                        .shift   = 31,
@@ -367,11 +324,26 @@ static struct clk_regmap gxbb_sys_pll = {
                },
        },
        .hw.init = &(struct clk_init_data){
-               .name = "sys_pll",
+               .name = "sys_pll_dco",
                .ops = &meson_clk_pll_ro_ops,
                .parent_names = (const char *[]){ "xtal" },
                .num_parents = 1,
-               .flags = CLK_GET_RATE_NOCACHE,
+       },
+};
+
+static struct clk_regmap gxbb_sys_pll = {
+       .data = &(struct clk_regmap_div_data){
+               .offset = HHI_SYS_PLL_CNTL,
+               .shift = 10,
+               .width = 2,
+               .flags = CLK_DIVIDER_POWER_OF_TWO,
+       },
+       .hw.init = &(struct clk_init_data){
+               .name = "sys_pll",
+               .ops = &clk_regmap_divider_ro_ops,
+               .parent_names = (const char *[]){ "sys_pll_dco" },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
        },
 };
 
@@ -379,11 +351,15 @@ static const struct reg_sequence gxbb_gp0_init_regs[] = {
        { .reg = HHI_GP0_PLL_CNTL2,     .def = 0x69c80000 },
        { .reg = HHI_GP0_PLL_CNTL3,     .def = 0x0a5590c4 },
        { .reg = HHI_GP0_PLL_CNTL4,     .def = 0x0000500d },
-       { .reg = HHI_GP0_PLL_CNTL,      .def = 0x4a000228 },
 };
 
-static struct clk_regmap gxbb_gp0_pll = {
+static struct clk_regmap gxbb_gp0_pll_dco = {
        .data = &(struct meson_clk_pll_data){
+               .en = {
+                       .reg_off = HHI_GP0_PLL_CNTL,
+                       .shift   = 30,
+                       .width   = 1,
+               },
                .m = {
                        .reg_off = HHI_GP0_PLL_CNTL,
                        .shift   = 0,
@@ -394,11 +370,6 @@ static struct clk_regmap gxbb_gp0_pll = {
                        .shift   = 9,
                        .width   = 5,
                },
-               .od = {
-                       .reg_off = HHI_GP0_PLL_CNTL,
-                       .shift   = 16,
-                       .width   = 2,
-               },
                .l = {
                        .reg_off = HHI_GP0_PLL_CNTL,
                        .shift   = 31,
@@ -409,16 +380,15 @@ static struct clk_regmap gxbb_gp0_pll = {
                        .shift   = 29,
                        .width   = 1,
                },
-               .table = gxbb_gp0_pll_rate_table,
+               .table = gxbb_gp0_pll_params_table,
                .init_regs = gxbb_gp0_init_regs,
                .init_count = ARRAY_SIZE(gxbb_gp0_init_regs),
        },
        .hw.init = &(struct clk_init_data){
-               .name = "gp0_pll",
+               .name = "gp0_pll_dco",
                .ops = &meson_clk_pll_ops,
                .parent_names = (const char *[]){ "xtal" },
                .num_parents = 1,
-               .flags = CLK_GET_RATE_NOCACHE,
        },
 };
 
@@ -428,11 +398,15 @@ static const struct reg_sequence gxl_gp0_init_regs[] = {
        { .reg = HHI_GP0_PLL_CNTL3,     .def = 0x0a59a288 },
        { .reg = HHI_GP0_PLL_CNTL4,     .def = 0xc000004d },
        { .reg = HHI_GP0_PLL_CNTL5,     .def = 0x00078000 },
-       { .reg = HHI_GP0_PLL_CNTL,      .def = 0x40010250 },
 };
 
-static struct clk_regmap gxl_gp0_pll = {
+static struct clk_regmap gxl_gp0_pll_dco = {
        .data = &(struct meson_clk_pll_data){
+               .en = {
+                       .reg_off = HHI_GP0_PLL_CNTL,
+                       .shift   = 30,
+                       .width   = 1,
+               },
                .m = {
                        .reg_off = HHI_GP0_PLL_CNTL,
                        .shift   = 0,
@@ -443,11 +417,6 @@ static struct clk_regmap gxl_gp0_pll = {
                        .shift   = 9,
                        .width   = 5,
                },
-               .od = {
-                       .reg_off = HHI_GP0_PLL_CNTL,
-                       .shift   = 16,
-                       .width   = 2,
-               },
                .frac = {
                        .reg_off = HHI_GP0_PLL_CNTL1,
                        .shift   = 0,
@@ -463,16 +432,31 @@ static struct clk_regmap gxl_gp0_pll = {
                        .shift   = 29,
                        .width   = 1,
                },
-               .table = gxl_gp0_pll_rate_table,
+               .table = gxl_gp0_pll_params_table,
                .init_regs = gxl_gp0_init_regs,
                .init_count = ARRAY_SIZE(gxl_gp0_init_regs),
        },
        .hw.init = &(struct clk_init_data){
-               .name = "gp0_pll",
+               .name = "gp0_pll_dco",
                .ops = &meson_clk_pll_ops,
                .parent_names = (const char *[]){ "xtal" },
                .num_parents = 1,
-               .flags = CLK_GET_RATE_NOCACHE,
+       },
+};
+
+static struct clk_regmap gxbb_gp0_pll = {
+       .data = &(struct clk_regmap_div_data){
+               .offset = HHI_GP0_PLL_CNTL,
+               .shift = 16,
+               .width = 2,
+               .flags = CLK_DIVIDER_POWER_OF_TWO,
+       },
+       .hw.init = &(struct clk_init_data){
+               .name = "gp0_pll",
+               .ops = &clk_regmap_divider_ops,
+               .parent_names = (const char *[]){ "gp0_pll_dco" },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
        },
 };
 
@@ -1933,6 +1917,12 @@ static struct clk_hw_onecell_data gxbb_hw_onecell_data = {
                [CLKID_GEN_CLK_SEL]         = &gxbb_gen_clk_sel.hw,
                [CLKID_GEN_CLK_DIV]         = &gxbb_gen_clk_div.hw,
                [CLKID_GEN_CLK]             = &gxbb_gen_clk.hw,
+               [CLKID_FIXED_PLL_DCO]       = &gxbb_fixed_pll_dco.hw,
+               [CLKID_HDMI_PLL_DCO]        = &gxbb_hdmi_pll_dco.hw,
+               [CLKID_HDMI_PLL_OD]         = &gxbb_hdmi_pll_od.hw,
+               [CLKID_HDMI_PLL_OD2]        = &gxbb_hdmi_pll_od2.hw,
+               [CLKID_SYS_PLL_DCO]         = &gxbb_sys_pll_dco.hw,
+               [CLKID_GP0_PLL_DCO]         = &gxbb_gp0_pll_dco.hw,
                [NR_CLKS]                   = NULL,
        },
        .num = NR_CLKS,
@@ -1948,7 +1938,7 @@ static struct clk_hw_onecell_data gxl_hw_onecell_data = {
                [CLKID_FCLK_DIV4]           = &gxbb_fclk_div4.hw,
                [CLKID_FCLK_DIV5]           = &gxbb_fclk_div5.hw,
                [CLKID_FCLK_DIV7]           = &gxbb_fclk_div7.hw,
-               [CLKID_GP0_PLL]             = &gxl_gp0_pll.hw,
+               [CLKID_GP0_PLL]             = &gxbb_gp0_pll.hw,
                [CLKID_MPEG_SEL]            = &gxbb_mpeg_clk_sel.hw,
                [CLKID_MPEG_DIV]            = &gxbb_mpeg_clk_div.hw,
                [CLKID_CLK81]               = &gxbb_clk81.hw,
@@ -2098,19 +2088,29 @@ static struct clk_hw_onecell_data gxl_hw_onecell_data = {
                [CLKID_GEN_CLK_SEL]         = &gxbb_gen_clk_sel.hw,
                [CLKID_GEN_CLK_DIV]         = &gxbb_gen_clk_div.hw,
                [CLKID_GEN_CLK]             = &gxbb_gen_clk.hw,
+               [CLKID_FIXED_PLL_DCO]       = &gxbb_fixed_pll_dco.hw,
+               [CLKID_HDMI_PLL_DCO]        = &gxbb_hdmi_pll_dco.hw,
+               [CLKID_HDMI_PLL_OD]         = &gxl_hdmi_pll_od.hw,
+               [CLKID_HDMI_PLL_OD2]        = &gxl_hdmi_pll_od2.hw,
+               [CLKID_SYS_PLL_DCO]         = &gxbb_sys_pll_dco.hw,
+               [CLKID_GP0_PLL_DCO]         = &gxl_gp0_pll_dco.hw,
                [NR_CLKS]                   = NULL,
        },
        .num = NR_CLKS,
 };
 
 static struct clk_regmap *const gxbb_clk_regmaps[] = {
-       &gxbb_gp0_pll,
+       &gxbb_gp0_pll_dco,
        &gxbb_hdmi_pll,
+       &gxbb_hdmi_pll_od,
+       &gxbb_hdmi_pll_od2,
 };
 
 static struct clk_regmap *const gxl_clk_regmaps[] = {
-       &gxl_gp0_pll,
+       &gxl_gp0_pll_dco,
        &gxl_hdmi_pll,
+       &gxl_hdmi_pll_od,
+       &gxl_hdmi_pll_od2,
 };
 
 static struct clk_regmap *const gx_clk_regmaps[] = {
@@ -2265,6 +2265,10 @@ static struct clk_regmap *const gx_clk_regmaps[] = {
        &gxbb_gen_clk_sel,
        &gxbb_gen_clk_div,
        &gxbb_gen_clk,
+       &gxbb_fixed_pll_dco,
+       &gxbb_hdmi_pll_dco,
+       &gxbb_sys_pll_dco,
+       &gxbb_gp0_pll,
 };
 
 struct clkc_data {
index 20dfb1daf5b83c988b9b98974dbc27a97906af22..72bc077d96639c0d2e98d5ac4b3b161ceda3f691 100644 (file)
 #define CLKID_VDEC_HEVC_DIV      155
 #define CLKID_GEN_CLK_SEL        157
 #define CLKID_GEN_CLK_DIV        158
-
-#define NR_CLKS                          160
+#define CLKID_FIXED_PLL_DCO      160
+#define CLKID_HDMI_PLL_DCO       161
+#define CLKID_HDMI_PLL_OD        162
+#define CLKID_HDMI_PLL_OD2       163
+#define CLKID_SYS_PLL_DCO        164
+#define CLKID_GP0_PLL_DCO        165
+
+#define NR_CLKS                          166
 
 /* include the CLKIDs that have been made part of the DT binding */
 #include <dt-bindings/clock/gxbb-clkc.h>
index 7447d96a265f72e7d4b4277c29f5839df3ff43b6..346b9e165b7a9d55903d45839467349ca1bb3613 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/clk-provider.h>
 #include <linux/init.h>
 #include <linux/of_address.h>
-#include <linux/platform_device.h>
 #include <linux/reset-controller.h>
 #include <linux/slab.h>
 #include <linux/regmap.h>
 
 static DEFINE_SPINLOCK(meson_clk_lock);
 
-static void __iomem *clk_base;
-
 struct meson8b_clk_reset {
        struct reset_controller_dev reset;
-       void __iomem *base;
+       struct regmap *regmap;
 };
 
-static const struct pll_rate_table sys_pll_rate_table[] = {
-       PLL_RATE(312000000, 52, 1, 2),
-       PLL_RATE(336000000, 56, 1, 2),
-       PLL_RATE(360000000, 60, 1, 2),
-       PLL_RATE(384000000, 64, 1, 2),
-       PLL_RATE(408000000, 68, 1, 2),
-       PLL_RATE(432000000, 72, 1, 2),
-       PLL_RATE(456000000, 76, 1, 2),
-       PLL_RATE(480000000, 80, 1, 2),
-       PLL_RATE(504000000, 84, 1, 2),
-       PLL_RATE(528000000, 88, 1, 2),
-       PLL_RATE(552000000, 92, 1, 2),
-       PLL_RATE(576000000, 96, 1, 2),
-       PLL_RATE(600000000, 50, 1, 1),
-       PLL_RATE(624000000, 52, 1, 1),
-       PLL_RATE(648000000, 54, 1, 1),
-       PLL_RATE(672000000, 56, 1, 1),
-       PLL_RATE(696000000, 58, 1, 1),
-       PLL_RATE(720000000, 60, 1, 1),
-       PLL_RATE(744000000, 62, 1, 1),
-       PLL_RATE(768000000, 64, 1, 1),
-       PLL_RATE(792000000, 66, 1, 1),
-       PLL_RATE(816000000, 68, 1, 1),
-       PLL_RATE(840000000, 70, 1, 1),
-       PLL_RATE(864000000, 72, 1, 1),
-       PLL_RATE(888000000, 74, 1, 1),
-       PLL_RATE(912000000, 76, 1, 1),
-       PLL_RATE(936000000, 78, 1, 1),
-       PLL_RATE(960000000, 80, 1, 1),
-       PLL_RATE(984000000, 82, 1, 1),
-       PLL_RATE(1008000000, 84, 1, 1),
-       PLL_RATE(1032000000, 86, 1, 1),
-       PLL_RATE(1056000000, 88, 1, 1),
-       PLL_RATE(1080000000, 90, 1, 1),
-       PLL_RATE(1104000000, 92, 1, 1),
-       PLL_RATE(1128000000, 94, 1, 1),
-       PLL_RATE(1152000000, 96, 1, 1),
-       PLL_RATE(1176000000, 98, 1, 1),
-       PLL_RATE(1200000000, 50, 1, 0),
-       PLL_RATE(1224000000, 51, 1, 0),
-       PLL_RATE(1248000000, 52, 1, 0),
-       PLL_RATE(1272000000, 53, 1, 0),
-       PLL_RATE(1296000000, 54, 1, 0),
-       PLL_RATE(1320000000, 55, 1, 0),
-       PLL_RATE(1344000000, 56, 1, 0),
-       PLL_RATE(1368000000, 57, 1, 0),
-       PLL_RATE(1392000000, 58, 1, 0),
-       PLL_RATE(1416000000, 59, 1, 0),
-       PLL_RATE(1440000000, 60, 1, 0),
-       PLL_RATE(1464000000, 61, 1, 0),
-       PLL_RATE(1488000000, 62, 1, 0),
-       PLL_RATE(1512000000, 63, 1, 0),
-       PLL_RATE(1536000000, 64, 1, 0),
+static const struct pll_params_table sys_pll_params_table[] = {
+       PLL_PARAMS(50, 1),
+       PLL_PARAMS(51, 1),
+       PLL_PARAMS(52, 1),
+       PLL_PARAMS(53, 1),
+       PLL_PARAMS(54, 1),
+       PLL_PARAMS(55, 1),
+       PLL_PARAMS(56, 1),
+       PLL_PARAMS(57, 1),
+       PLL_PARAMS(58, 1),
+       PLL_PARAMS(59, 1),
+       PLL_PARAMS(60, 1),
+       PLL_PARAMS(61, 1),
+       PLL_PARAMS(62, 1),
+       PLL_PARAMS(63, 1),
+       PLL_PARAMS(64, 1),
        { /* sentinel */ },
 };
 
@@ -94,8 +54,13 @@ static struct clk_fixed_rate meson8b_xtal = {
        },
 };
 
-static struct clk_regmap meson8b_fixed_pll = {
+static struct clk_regmap meson8b_fixed_pll_dco = {
        .data = &(struct meson_clk_pll_data){
+               .en = {
+                       .reg_off = HHI_MPLL_CNTL,
+                       .shift   = 30,
+                       .width   = 1,
+               },
                .m = {
                        .reg_off = HHI_MPLL_CNTL,
                        .shift   = 0,
@@ -106,11 +71,6 @@ static struct clk_regmap meson8b_fixed_pll = {
                        .shift   = 9,
                        .width   = 5,
                },
-               .od = {
-                       .reg_off = HHI_MPLL_CNTL,
-                       .shift   = 16,
-                       .width   = 2,
-               },
                .frac = {
                        .reg_off = HHI_MPLL_CNTL2,
                        .shift   = 0,
@@ -128,16 +88,39 @@ static struct clk_regmap meson8b_fixed_pll = {
                },
        },
        .hw.init = &(struct clk_init_data){
-               .name = "fixed_pll",
+               .name = "fixed_pll_dco",
                .ops = &meson_clk_pll_ro_ops,
                .parent_names = (const char *[]){ "xtal" },
                .num_parents = 1,
-               .flags = CLK_GET_RATE_NOCACHE,
        },
 };
 
-static struct clk_regmap meson8b_vid_pll = {
+static struct clk_regmap meson8b_fixed_pll = {
+       .data = &(struct clk_regmap_div_data){
+               .offset = HHI_MPLL_CNTL,
+               .shift = 16,
+               .width = 2,
+               .flags = CLK_DIVIDER_POWER_OF_TWO,
+       },
+       .hw.init = &(struct clk_init_data){
+               .name = "fixed_pll",
+               .ops = &clk_regmap_divider_ro_ops,
+               .parent_names = (const char *[]){ "fixed_pll_dco" },
+               .num_parents = 1,
+               /*
+                * This clock won't ever change at runtime so
+                * CLK_SET_RATE_PARENT is not required
+                */
+       },
+};
+
+static struct clk_regmap meson8b_vid_pll_dco = {
        .data = &(struct meson_clk_pll_data){
+               .en = {
+                       .reg_off = HHI_VID_PLL_CNTL,
+                       .shift   = 30,
+                       .width   = 1,
+               },
                .m = {
                        .reg_off = HHI_VID_PLL_CNTL,
                        .shift   = 0,
@@ -148,11 +131,6 @@ static struct clk_regmap meson8b_vid_pll = {
                        .shift   = 9,
                        .width   = 5,
                },
-               .od = {
-                       .reg_off = HHI_VID_PLL_CNTL,
-                       .shift   = 16,
-                       .width   = 2,
-               },
                .l = {
                        .reg_off = HHI_VID_PLL_CNTL,
                        .shift   = 31,
@@ -165,16 +143,36 @@ static struct clk_regmap meson8b_vid_pll = {
                },
        },
        .hw.init = &(struct clk_init_data){
-               .name = "vid_pll",
+               .name = "vid_pll_dco",
                .ops = &meson_clk_pll_ro_ops,
                .parent_names = (const char *[]){ "xtal" },
                .num_parents = 1,
-               .flags = CLK_GET_RATE_NOCACHE,
        },
 };
 
-static struct clk_regmap meson8b_sys_pll = {
+static struct clk_regmap meson8b_vid_pll = {
+       .data = &(struct clk_regmap_div_data){
+               .offset = HHI_VID_PLL_CNTL,
+               .shift = 16,
+               .width = 2,
+               .flags = CLK_DIVIDER_POWER_OF_TWO,
+       },
+       .hw.init = &(struct clk_init_data){
+               .name = "vid_pll",
+               .ops = &clk_regmap_divider_ro_ops,
+               .parent_names = (const char *[]){ "vid_pll_dco" },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
+static struct clk_regmap meson8b_sys_pll_dco = {
        .data = &(struct meson_clk_pll_data){
+               .en = {
+                       .reg_off = HHI_SYS_PLL_CNTL,
+                       .shift   = 30,
+                       .width   = 1,
+               },
                .m = {
                        .reg_off = HHI_SYS_PLL_CNTL,
                        .shift   = 0,
@@ -185,11 +183,6 @@ static struct clk_regmap meson8b_sys_pll = {
                        .shift   = 9,
                        .width   = 5,
                },
-               .od = {
-                       .reg_off = HHI_SYS_PLL_CNTL,
-                       .shift   = 16,
-                       .width   = 2,
-               },
                .l = {
                        .reg_off = HHI_SYS_PLL_CNTL,
                        .shift   = 31,
@@ -200,14 +193,29 @@ static struct clk_regmap meson8b_sys_pll = {
                        .shift   = 29,
                        .width   = 1,
                },
-               .table = sys_pll_rate_table,
+               .table = sys_pll_params_table,
        },
        .hw.init = &(struct clk_init_data){
-               .name = "sys_pll",
+               .name = "sys_pll_dco",
                .ops = &meson_clk_pll_ro_ops,
                .parent_names = (const char *[]){ "xtal" },
                .num_parents = 1,
-               .flags = CLK_GET_RATE_NOCACHE,
+       },
+};
+
+static struct clk_regmap meson8b_sys_pll = {
+       .data = &(struct clk_regmap_div_data){
+               .offset = HHI_SYS_PLL_CNTL,
+               .shift = 16,
+               .width = 2,
+               .flags = CLK_DIVIDER_POWER_OF_TWO,
+       },
+       .hw.init = &(struct clk_init_data){
+               .name = "sys_pll",
+               .ops = &clk_regmap_divider_ro_ops,
+               .parent_names = (const char *[]){ "sys_pll_dco" },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
        },
 };
 
@@ -879,6 +887,9 @@ static struct clk_hw_onecell_data meson8b_hw_onecell_data = {
                [CLKID_NAND_SEL]            = &meson8b_nand_clk_sel.hw,
                [CLKID_NAND_DIV]            = &meson8b_nand_clk_div.hw,
                [CLKID_NAND_CLK]            = &meson8b_nand_clk_gate.hw,
+               [CLKID_PLL_FIXED_DCO]       = &meson8b_fixed_pll_dco.hw,
+               [CLKID_PLL_VID_DCO]         = &meson8b_vid_pll_dco.hw,
+               [CLKID_PLL_SYS_DCO]         = &meson8b_sys_pll_dco.hw,
                [CLK_NR_CLKS]               = NULL,
        },
        .num = CLK_NR_CLKS,
@@ -987,6 +998,9 @@ static struct clk_regmap *const meson8b_clk_regmaps[] = {
        &meson8b_nand_clk_sel,
        &meson8b_nand_clk_div,
        &meson8b_nand_clk_gate,
+       &meson8b_fixed_pll_dco,
+       &meson8b_vid_pll_dco,
+       &meson8b_sys_pll_dco,
 };
 
 static const struct meson8b_clk_reset_line {
@@ -1050,7 +1064,6 @@ static int meson8b_clk_reset_update(struct reset_controller_dev *rcdev,
                container_of(rcdev, struct meson8b_clk_reset, reset);
        unsigned long flags;
        const struct meson8b_clk_reset_line *reset;
-       u32 val;
 
        if (id >= ARRAY_SIZE(meson8b_clk_reset_bits))
                return -EINVAL;
@@ -1059,12 +1072,12 @@ static int meson8b_clk_reset_update(struct reset_controller_dev *rcdev,
 
        spin_lock_irqsave(&meson_clk_lock, flags);
 
-       val = readl(meson8b_clk_reset->base + reset->reg);
        if (assert)
-               val |= BIT(reset->bit_idx);
+               regmap_update_bits(meson8b_clk_reset->regmap, reset->reg,
+                                  BIT(reset->bit_idx), BIT(reset->bit_idx));
        else
-               val &= ~BIT(reset->bit_idx);
-       writel(val, meson8b_clk_reset->base + reset->reg);
+               regmap_update_bits(meson8b_clk_reset->regmap, reset->reg,
+                                  BIT(reset->bit_idx), 0);
 
        spin_unlock_irqrestore(&meson_clk_lock, flags);
 
@@ -1094,62 +1107,12 @@ static const struct regmap_config clkc_regmap_config = {
        .reg_stride     = 4,
 };
 
-static int meson8b_clkc_probe(struct platform_device *pdev)
-{
-       int ret, i;
-       struct device *dev = &pdev->dev;
-       struct regmap *map;
-
-       if (!clk_base)
-               return -ENXIO;
-
-       map = devm_regmap_init_mmio(dev, clk_base, &clkc_regmap_config);
-       if (IS_ERR(map))
-               return PTR_ERR(map);
-
-       /* Populate regmap for the regmap backed clocks */
-       for (i = 0; i < ARRAY_SIZE(meson8b_clk_regmaps); i++)
-               meson8b_clk_regmaps[i]->map = map;
-
-       /*
-        * register all clks
-        * CLKID_UNUSED = 0, so skip it and start with CLKID_XTAL = 1
-        */
-       for (i = CLKID_XTAL; i < CLK_NR_CLKS; i++) {
-               /* array might be sparse */
-               if (!meson8b_hw_onecell_data.hws[i])
-                       continue;
-
-               ret = devm_clk_hw_register(dev, meson8b_hw_onecell_data.hws[i]);
-               if (ret)
-                       return ret;
-       }
-
-       return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get,
-                                          &meson8b_hw_onecell_data);
-}
-
-static const struct of_device_id meson8b_clkc_match_table[] = {
-       { .compatible = "amlogic,meson8-clkc" },
-       { .compatible = "amlogic,meson8b-clkc" },
-       { .compatible = "amlogic,meson8m2-clkc" },
-       { }
-};
-
-static struct platform_driver meson8b_driver = {
-       .probe          = meson8b_clkc_probe,
-       .driver         = {
-               .name   = "meson8b-clkc",
-               .of_match_table = meson8b_clkc_match_table,
-       },
-};
-
-builtin_platform_driver(meson8b_driver);
-
-static void __init meson8b_clkc_reset_init(struct device_node *np)
+static void __init meson8b_clkc_init(struct device_node *np)
 {
        struct meson8b_clk_reset *rstc;
-       int ret;
+       void __iomem *clk_base;
+       struct regmap *map;
+       int i, ret;
 
        /* Generic clocks, PLLs and some of the reset-bits */
        clk_base = of_iomap(np, 1);
@@ -1158,12 +1121,16 @@ static void __init meson8b_clkc_reset_init(struct device_node *np)
                return;
        }
 
+       map = regmap_init_mmio(NULL, clk_base, &clkc_regmap_config);
+       if (IS_ERR(map))
+               return;
+
        rstc = kzalloc(sizeof(*rstc), GFP_KERNEL);
        if (!rstc)
                return;
 
        /* Reset Controller */
-       rstc->base = clk_base;
+       rstc->regmap = map;
        rstc->reset.ops = &meson8b_clk_reset_ops;
        rstc->reset.nr_resets = ARRAY_SIZE(meson8b_clk_reset_bits);
        rstc->reset.of_node = np;
@@ -1173,11 +1140,34 @@ static void __init meson8b_clkc_reset_init(struct device_node *np)
                       __func__, ret);
                return;
        }
+
+       /* Populate regmap for the regmap backed clocks */
+       for (i = 0; i < ARRAY_SIZE(meson8b_clk_regmaps); i++)
+               meson8b_clk_regmaps[i]->map = map;
+
+       /*
+        * register all clks
+        * CLKID_UNUSED = 0, so skip it and start with CLKID_XTAL = 1
+        */
+       for (i = CLKID_XTAL; i < CLK_NR_CLKS; i++) {
+               /* array might be sparse */
+               if (!meson8b_hw_onecell_data.hws[i])
+                       continue;
+
+               ret = clk_hw_register(NULL, meson8b_hw_onecell_data.hws[i]);
+               if (ret)
+                       return;
+       }
+
+       ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get,
+                                    &meson8b_hw_onecell_data);
+       if (ret)
+               pr_err("%s: failed to register clock provider\n", __func__);
 }
 
 CLK_OF_DECLARE_DRIVER(meson8_clkc, "amlogic,meson8-clkc",
-                     meson8b_clkc_reset_init);
+                     meson8b_clkc_init);
 CLK_OF_DECLARE_DRIVER(meson8b_clkc, "amlogic,meson8b-clkc",
-                     meson8b_clkc_reset_init);
+                     meson8b_clkc_init);
 CLK_OF_DECLARE_DRIVER(meson8m2_clkc, "amlogic,meson8m2-clkc",
-                     meson8b_clkc_reset_init);
+                     meson8b_clkc_init);
index 5d09412b5084760460850550d9b1e85c8a7fe5f6..1c6fb180e6a29777e12b22ba60af7c7969009ad4 100644 (file)
 #define CLKID_FCLK_DIV7_DIV    109
 #define CLKID_NAND_SEL         110
 #define CLKID_NAND_DIV         111
+#define CLKID_PLL_FIXED_DCO    113
+#define CLKID_PLL_VID_DCO      114
+#define CLKID_PLL_SYS_DCO      115
 
-#define CLK_NR_CLKS            113
+#define CLK_NR_CLKS            116
 
 /*
  * include the CLKID and RESETID that have
index 0fc75c39595708f0d5c6296fcbeea4e3d61f5731..d083b860f08333ad1caf8082664efdeaf1e0099d 100644 (file)
@@ -227,8 +227,8 @@ static struct mmp_param_gate_clk apmu_gate_clks[] = {
        /* The gate clocks has mux parent. */
        {MMP2_CLK_SDH0, "sdh0_clk", "sdh_mix_clk", CLK_SET_RATE_PARENT, APMU_SDH0, 0x1b, 0x1b, 0x0, 0, &sdh_lock},
        {MMP2_CLK_SDH1, "sdh1_clk", "sdh_mix_clk", CLK_SET_RATE_PARENT, APMU_SDH1, 0x1b, 0x1b, 0x0, 0, &sdh_lock},
-       {MMP2_CLK_SDH1, "sdh2_clk", "sdh_mix_clk", CLK_SET_RATE_PARENT, APMU_SDH2, 0x1b, 0x1b, 0x0, 0, &sdh_lock},
-       {MMP2_CLK_SDH1, "sdh3_clk", "sdh_mix_clk", CLK_SET_RATE_PARENT, APMU_SDH3, 0x1b, 0x1b, 0x0, 0, &sdh_lock},
+       {MMP2_CLK_SDH2, "sdh2_clk", "sdh_mix_clk", CLK_SET_RATE_PARENT, APMU_SDH2, 0x1b, 0x1b, 0x0, 0, &sdh_lock},
+       {MMP2_CLK_SDH3, "sdh3_clk", "sdh_mix_clk", CLK_SET_RATE_PARENT, APMU_SDH3, 0x1b, 0x1b, 0x0, 0, &sdh_lock},
        {MMP2_CLK_DISP0, "disp0_clk", "disp0_div", CLK_SET_RATE_PARENT, APMU_DISP0, 0x1b, 0x1b, 0x0, 0, &disp0_lock},
        {MMP2_CLK_DISP0_SPHY, "disp0_sphy_clk", "disp0_sphy_div", CLK_SET_RATE_PARENT, APMU_DISP0, 0x1024, 0x1024, 0x0, 0, &disp0_lock},
        {MMP2_CLK_DISP1, "disp1_clk", "disp1_div", CLK_SET_RATE_PARENT, APMU_DISP1, 0x1b, 0x1b, 0x0, 0, &disp1_lock},
index fa2fbd2cef4a343b50ccec04224c7dfc07dd6c52..ea54a874bbdadd0a58843a637ef0885a1f65a02d 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Marvell Armada AP806 System Controller
  *
@@ -5,9 +6,6 @@
  *
  * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
  *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
  */
 
 #define pr_fmt(fmt) "ap806-system-controller: " fmt
@@ -155,7 +153,6 @@ static int ap806_syscon_common_probe(struct platform_device *pdev,
                goto fail4;
        }
 
-       of_clk_add_provider(np, of_clk_src_onecell_get, &ap806_clk_data);
        ret = of_clk_add_provider(np, of_clk_src_onecell_get, &ap806_clk_data);
        if (ret)
                goto fail_clk_add;
index 2c7c1085f88300ca84ac529831876af25376a047..7dedfaa6e152033bd3f5e1e60dec8c28c86edfe9 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Marvell Armada 370 SoC clocks
  *
@@ -7,9 +8,6 @@
  * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
  * Andrew Lunn <andrew@lunn.ch>
  *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
  */
 
 #include <linux/kernel.h>
index c7af2242b796866a9367b02c0a74827499901a1f..a7157c69023861c644173291cdd0ec89f8e0b99f 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Marvell Armada 375 SoC clocks
  *
@@ -7,9 +8,6 @@
  * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
  * Andrew Lunn <andrew@lunn.ch>
  *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
  */
 
 #include <linux/kernel.h>
index 499f5962c8b062d70d40d36d3aadfc23cfeb43a2..1f1cff428d7888eb61a2e8e1a046f6d4b6847105 100644 (file)
 struct clk_periph_driver_data {
        struct clk_hw_onecell_data *hw_data;
        spinlock_t lock;
+       void __iomem *reg;
+
+       /* Storage registers for suspend/resume operations */
+       u32 tbg_sel;
+       u32 div_sel0;
+       u32 div_sel1;
+       u32 div_sel2;
+       u32 clk_sel;
+       u32 clk_dis;
 };
 
 struct clk_double_div {
@@ -672,6 +681,40 @@ static int armada_3700_add_composite_clk(const struct clk_periph_data *data,
        return PTR_ERR_OR_ZERO(*hw);
 }
 
+static int __maybe_unused armada_3700_periph_clock_suspend(struct device *dev)
+{
+       struct clk_periph_driver_data *data = dev_get_drvdata(dev);
+
+       data->tbg_sel = readl(data->reg + TBG_SEL);
+       data->div_sel0 = readl(data->reg + DIV_SEL0);
+       data->div_sel1 = readl(data->reg + DIV_SEL1);
+       data->div_sel2 = readl(data->reg + DIV_SEL2);
+       data->clk_sel = readl(data->reg + CLK_SEL);
+       data->clk_dis = readl(data->reg + CLK_DIS);
+
+       return 0;
+}
+
+static int __maybe_unused armada_3700_periph_clock_resume(struct device *dev)
+{
+       struct clk_periph_driver_data *data = dev_get_drvdata(dev);
+
+       /* Follow the same order than what the Cortex-M3 does (ATF code) */
+       writel(data->clk_dis, data->reg + CLK_DIS);
+       writel(data->div_sel0, data->reg + DIV_SEL0);
+       writel(data->div_sel1, data->reg + DIV_SEL1);
+       writel(data->div_sel2, data->reg + DIV_SEL2);
+       writel(data->tbg_sel, data->reg + TBG_SEL);
+       writel(data->clk_sel, data->reg + CLK_SEL);
+
+       return 0;
+}
+
+static const struct dev_pm_ops armada_3700_periph_clock_pm_ops = {
+       SET_SYSTEM_SLEEP_PM_OPS(armada_3700_periph_clock_suspend,
+                               armada_3700_periph_clock_resume)
+};
+
 static int armada_3700_periph_clock_probe(struct platform_device *pdev)
 {
        struct clk_periph_driver_data *driver_data;
@@ -680,7 +723,6 @@ static int armada_3700_periph_clock_probe(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        int num_periph = 0, i, ret;
        struct resource *res;
-       void __iomem *reg;
 
        data = of_device_get_match_data(dev);
        if (!data)
@@ -689,11 +731,6 @@ static int armada_3700_periph_clock_probe(struct platform_device *pdev)
        while (data[num_periph].name)
                num_periph++;
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       reg = devm_ioremap_resource(dev, res);
-       if (IS_ERR(reg))
-               return PTR_ERR(reg);
-
        driver_data = devm_kzalloc(dev, sizeof(*driver_data), GFP_KERNEL);
        if (!driver_data)
                return -ENOMEM;
@@ -706,12 +743,16 @@ static int armada_3700_periph_clock_probe(struct platform_device *pdev)
                return -ENOMEM;
        driver_data->hw_data->num = num_periph;
 
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       driver_data->reg = devm_ioremap_resource(dev, res);
+       if (IS_ERR(driver_data->reg))
+               return PTR_ERR(driver_data->reg);
+
        spin_lock_init(&driver_data->lock);
 
        for (i = 0; i < num_periph; i++) {
                struct clk_hw **hw = &driver_data->hw_data->hws[i];
-
-               if (armada_3700_add_composite_clk(&data[i], reg,
+               if (armada_3700_add_composite_clk(&data[i], driver_data->reg,
                                                  &driver_data->lock, dev, hw))
                        dev_err(dev, "Can't register periph clock %s\n",
                                data[i].name);
@@ -749,6 +790,7 @@ static struct platform_driver armada_3700_periph_clock_driver = {
        .driver         = {
                .name   = "marvell-armada-3700-periph-clock",
                .of_match_table = armada_3700_periph_clock_of_match,
+               .pm     = &armada_3700_periph_clock_pm_ops,
        },
 };
 
index 7ff041f73b5530b1bff020d9ad21c32b3f808050..ee272d4d8c24ffd6637944dafeaa8f875b53a269 100644 (file)
@@ -1,13 +1,10 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Marvell Armada 37xx SoC Time Base Generator clocks
  *
  * Copyright (C) 2016 Marvell
  *
  * Gregory CLEMENT <gregory.clement@free-electrons.com>
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2 or later. This program is licensed "as is"
- * without any warranty of any kind, whether express or implied.
  */
 
 #include <linux/clk-provider.h>
@@ -99,12 +96,13 @@ static int armada_3700_tbg_clock_probe(struct platform_device *pdev)
        hw_tbg_data->num = NUM_TBG;
        platform_set_drvdata(pdev, hw_tbg_data);
 
-       parent = devm_clk_get(dev, NULL);
+       parent = clk_get(dev, NULL);
        if (IS_ERR(parent)) {
                dev_err(dev, "Could get the clock parent\n");
                return -EINVAL;
        }
        parent_name = __clk_get_name(parent);
+       clk_put(parent);
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        reg = devm_ioremap_resource(dev, res);
index 612d65ede10a0d2e0efc2e07954855972e35572a..e9e306d4e9af9d440f9f0e94f1f2977e23ce68cd 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Marvell Armada 37xx SoC xtal clocks
  *
@@ -5,9 +6,6 @@
  *
  * Gregory CLEMENT <gregory.clement@free-electrons.com>
  *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
  */
 
 #include <linux/clk-provider.h>
index 9ff4ea63932d507c9a5b7289e34eddf125193652..ef2ab81f087dfd348ec3629ff985c3ad88642c5f 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Marvell Armada 380/385 SoC clocks
  *
@@ -7,9 +8,6 @@
  * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
  * Andrew Lunn <andrew@lunn.ch>
  *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
  */
 
 #include <linux/kernel.h>
index 4fdfd32247a9cba1fbf3d855919fccacb02b0334..674ccfd6236e895cea2092d67f6f18cf3bee63f6 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Marvell Armada 39x SoC clocks
  *
@@ -8,9 +9,6 @@
  * Andrew Lunn <andrew@lunn.ch>
  * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
  *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
  */
 
 #include <linux/kernel.h>
index 0ec44ae9a2a2676ea383925d3841cffa0dd93a67..e8f03293ec833a97886269f21c648dff00f9d6fb 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Marvell Armada XP SoC clocks
  *
@@ -7,9 +8,6 @@
  * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
  * Andrew Lunn <andrew@lunn.ch>
  *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
  */
 
 #include <linux/kernel.h>
index 68f05c53d40e1a67c77ea1a49d1f6d4fe53cbe01..1fc84b0e72eec18ef5cddd7c3ba6d9ff4ea5e70c 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * MVEBU Core divider clock
  *
@@ -5,9 +6,6 @@
  *
  * Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
  *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
  */
 
 #include <linux/kernel.h>
index 072aa38374ce9a2db26103b4ed83cfa8bcb70434..d1a71576736426eca55b4ca4fc291b017aa47231 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Marvell MVEBU CPU clock handling.
  *
@@ -5,9 +6,6 @@
  *
  * Gregory CLEMENT <gregory.clement@free-electrons.com>
  *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
  */
 #include <linux/kernel.h>
 #include <linux/slab.h>
index 472c88b90256945e1d70b7c5574a6b38a237c432..6ab3c2e627c715fa99a219b19c178e264bd1f8e7 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Marvell EBU SoC common clock handling
  *
@@ -7,9 +8,6 @@
  * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
  * Andrew Lunn <andrew@lunn.ch>
  *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
  */
 
 #include <linux/kernel.h>
index f0de6c8a494a3ca65e18d340c3918e0b4396a43c..d1ab79b43105c007db9ff1aedf78cd312b9552dd 100644 (file)
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  * Marvell EBU SoC common clock handling
  *
@@ -7,9 +8,6 @@
  * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
  * Andrew Lunn <andrew@lunn.ch>
  *
- * This file is licensed under the terms of the GNU General Public
- * License version 2. This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
  */
 
 #ifndef __CLK_MVEBU_COMMON_H_
index 75bf7b8f282fc4e4cc0e342e16d5594b7cba1274..9781b1bf599884d6ae37b06dea03453dc8caac35 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Marvell Armada CP110 System Controller
  *
@@ -5,9 +6,6 @@
  *
  * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
  *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
  */
 
 /*
index 59fad9546c847946d71bd8348dcff615f936e0e4..e0dd99f36bf43dcdd8788e4e97c474a944daaa0b 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Marvell Dove SoC clocks
  *
@@ -7,9 +8,6 @@
  * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
  * Andrew Lunn <andrew@lunn.ch>
  *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
  */
 
 #include <linux/kernel.h>
index a2a8d614039da91a1b3f99272aa98e5952b79037..6f784167bda4a84c902b4f835070aa55cdd88b17 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Marvell Kirkwood SoC clocks
  *
@@ -7,9 +8,6 @@
  * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
  * Andrew Lunn <andrew@lunn.ch>
  *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
  */
 
 #include <linux/kernel.h>
index 6e203af73cac1dff2fd409c7700a02376186085a..0a74cf7a7725a01bcd647752c7d14656bc1c79ad 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Marvell MV98DX3236 SoC clocks
  *
@@ -7,9 +8,6 @@
  * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
  * Andrew Lunn <andrew@lunn.ch>
  *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
  */
 
 #include <linux/kernel.h>
index a6e5bee233855fcdc230480027ab071bec2f1275..f681a65be20a8651d4e94703d62e1134f6788be5 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Marvell Orion SoC clocks
  *
@@ -5,9 +6,6 @@
  *
  * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
  *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
  */
 
 #include <linux/kernel.h>
index 064768699fe734f6c142499f29ad2875151507dc..a611531df115e42ffd4840023c5ee6d5c2899d17 100644 (file)
@@ -1,3 +1,7 @@
+config KRAIT_CLOCKS
+       bool
+       select KRAIT_L2_ACCESSORS
+
 config QCOM_GDSC
        bool
        select PM_GENERIC_DOMAINS if PM
@@ -235,6 +239,31 @@ config MSM_GCC_8998
          Say Y if you want to use peripheral devices such as UART, SPI,
          i2c, USB, UFS, SD/eMMC, PCIe, etc.
 
+config QCS_GCC_404
+       tristate "QCS404 Global Clock Controller"
+       depends on COMMON_CLK_QCOM
+       help
+         Support for the global clock controller on QCS404 devices.
+         Say Y if you want to use multimedia devices or peripheral
+         devices such as UART, SPI, I2C, USB, SD/eMMC, PCIe etc.
+
+config SDM_CAMCC_845
+       tristate "SDM845 Camera Clock Controller"
+       depends on COMMON_CLK_QCOM
+       select SDM_GCC_845
+       help
+         Support for the camera clock controller on SDM845 devices.
+         Say Y if you want to support camera devices and camera functionality.
+
+config SDM_GCC_660
+       tristate "SDM660 Global Clock Controller"
+       select QCOM_GDSC
+       depends on COMMON_CLK_QCOM
+       help
+         Support for the global clock controller on SDM660 devices.
+         Say Y if you want to use peripheral devices such as UART, SPI,
+         i2C, USB, UFS, SDDC, PCIe, etc.
+
 config SDM_GCC_845
        tristate "SDM845 Global Clock Controller"
        select QCOM_GDSC
@@ -272,3 +301,27 @@ config SPMI_PMIC_CLKDIV
          Technologies, Inc. SPMI PMIC. It configures the frequency of
          clkdiv outputs of the PMIC. These clocks are typically wired
          through alternate functions on GPIO pins.
+
+config QCOM_HFPLL
+       tristate "High-Frequency PLL (HFPLL) Clock Controller"
+       depends on COMMON_CLK_QCOM
+       help
+         Support for the high-frequency PLLs present on Qualcomm devices.
+         Say Y if you want to support CPU frequency scaling on devices
+         such as MSM8974, APQ8084, etc.
+
+config KPSS_XCC
+       tristate "KPSS Clock Controller"
+       depends on COMMON_CLK_QCOM
+       help
+         Support for the Krait ACC and GCC clock controllers. Say Y
+         if you want to support CPU frequency scaling on devices such
+         as MSM8960, APQ8064, etc.
+
+config KRAITCC
+       tristate "Krait Clock Controller"
+       depends on COMMON_CLK_QCOM && ARM
+       select KRAIT_CLOCKS
+       help
+         Support for the Krait CPU clocks on Qualcomm devices.
+         Say Y if you want to support CPU frequency scaling.
index 21a45035930d04531d39f0ece1ea9df490e2a3a2..981882e16189ae61334b98806ae4e40b32a6e7ba 100644 (file)
@@ -11,6 +11,8 @@ clk-qcom-y += clk-branch.o
 clk-qcom-y += clk-regmap-divider.o
 clk-qcom-y += clk-regmap-mux.o
 clk-qcom-y += clk-regmap-mux-div.o
+clk-qcom-$(CONFIG_KRAIT_CLOCKS) += clk-krait.o
+clk-qcom-y += clk-hfpll.o
 clk-qcom-y += reset.o
 clk-qcom-$(CONFIG_QCOM_GDSC) += gdsc.o
 
@@ -39,7 +41,13 @@ obj-$(CONFIG_QCOM_CLK_APCS_MSM8916) += apcs-msm8916.o
 obj-$(CONFIG_QCOM_CLK_RPM) += clk-rpm.o
 obj-$(CONFIG_QCOM_CLK_RPMH) += clk-rpmh.o
 obj-$(CONFIG_QCOM_CLK_SMD_RPM) += clk-smd-rpm.o
+obj-$(CONFIG_QCS_GCC_404) += gcc-qcs404.o
+obj-$(CONFIG_SDM_CAMCC_845) += camcc-sdm845.o
 obj-$(CONFIG_SDM_DISPCC_845) += dispcc-sdm845.o
+obj-$(CONFIG_SDM_GCC_660) += gcc-sdm660.o
 obj-$(CONFIG_SDM_GCC_845) += gcc-sdm845.o
 obj-$(CONFIG_SDM_VIDEOCC_845) += videocc-sdm845.o
 obj-$(CONFIG_SPMI_PMIC_CLKDIV) += clk-spmi-pmic-div.o
+obj-$(CONFIG_KPSS_XCC) += kpss-xcc.o
+obj-$(CONFIG_QCOM_HFPLL) += hfpll.o
+obj-$(CONFIG_KRAITCC) += krait-cc.o
diff --git a/drivers/clk/qcom/camcc-sdm845.c b/drivers/clk/qcom/camcc-sdm845.c
new file mode 100644 (file)
index 0000000..1b2cefe
--- /dev/null
@@ -0,0 +1,1745 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2018, The Linux Foundation. All rights reserved.
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+
+#include <dt-bindings/clock/qcom,camcc-sdm845.h>
+
+#include "common.h"
+#include "clk-alpha-pll.h"
+#include "clk-branch.h"
+#include "clk-rcg.h"
+#include "clk-regmap.h"
+#include "gdsc.h"
+
+enum {
+       P_BI_TCXO,
+       P_CAM_CC_PLL0_OUT_EVEN,
+       P_CAM_CC_PLL1_OUT_EVEN,
+       P_CAM_CC_PLL2_OUT_EVEN,
+       P_CAM_CC_PLL3_OUT_EVEN,
+       P_CORE_BI_PLL_TEST_SE,
+};
+
+static const struct parent_map cam_cc_parent_map_0[] = {
+       { P_BI_TCXO, 0 },
+       { P_CAM_CC_PLL2_OUT_EVEN, 1 },
+       { P_CAM_CC_PLL1_OUT_EVEN, 2 },
+       { P_CAM_CC_PLL3_OUT_EVEN, 5 },
+       { P_CAM_CC_PLL0_OUT_EVEN, 6 },
+       { P_CORE_BI_PLL_TEST_SE, 7 },
+};
+
+static const char * const cam_cc_parent_names_0[] = {
+       "bi_tcxo",
+       "cam_cc_pll2_out_even",
+       "cam_cc_pll1_out_even",
+       "cam_cc_pll3_out_even",
+       "cam_cc_pll0_out_even",
+       "core_bi_pll_test_se",
+};
+
+static struct clk_alpha_pll cam_cc_pll0 = {
+       .offset = 0x0,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
+       .clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_pll0",
+                       .parent_names = (const char *[]){ "bi_tcxo" },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_fabia_ops,
+               },
+       },
+};
+
+static const struct clk_div_table post_div_table_fabia_even[] = {
+       { 0x0, 1 },
+       { 0x1, 2 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv cam_cc_pll0_out_even = {
+       .offset = 0x0,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_fabia_even,
+       .num_post_div = ARRAY_SIZE(post_div_table_fabia_even),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_pll0_out_even",
+               .parent_names = (const char *[]){ "cam_cc_pll0" },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_fabia_ops,
+       },
+};
+
+static struct clk_alpha_pll cam_cc_pll1 = {
+       .offset = 0x1000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
+       .clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_pll1",
+                       .parent_names = (const char *[]){ "bi_tcxo" },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_fabia_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll_postdiv cam_cc_pll1_out_even = {
+       .offset = 0x1000,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_fabia_even,
+       .num_post_div = ARRAY_SIZE(post_div_table_fabia_even),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_pll1_out_even",
+               .parent_names = (const char *[]){ "cam_cc_pll1" },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_fabia_ops,
+       },
+};
+
+static struct clk_alpha_pll cam_cc_pll2 = {
+       .offset = 0x2000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
+       .clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_pll2",
+                       .parent_names = (const char *[]){ "bi_tcxo" },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_fabia_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll_postdiv cam_cc_pll2_out_even = {
+       .offset = 0x2000,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_fabia_even,
+       .num_post_div = ARRAY_SIZE(post_div_table_fabia_even),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_pll2_out_even",
+               .parent_names = (const char *[]){ "cam_cc_pll2" },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_fabia_ops,
+       },
+};
+
+static struct clk_alpha_pll cam_cc_pll3 = {
+       .offset = 0x3000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
+       .clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_pll3",
+                       .parent_names = (const char *[]){ "bi_tcxo" },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_fabia_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll_postdiv cam_cc_pll3_out_even = {
+       .offset = 0x3000,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_fabia_even,
+       .num_post_div = ARRAY_SIZE(post_div_table_fabia_even),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_pll3_out_even",
+               .parent_names = (const char *[]){ "cam_cc_pll3" },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_fabia_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_cam_cc_bps_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(100000000, P_CAM_CC_PLL0_OUT_EVEN, 6, 0, 0),
+       F(200000000, P_CAM_CC_PLL0_OUT_EVEN, 3, 0, 0),
+       F(404000000, P_CAM_CC_PLL1_OUT_EVEN, 2, 0, 0),
+       F(480000000, P_CAM_CC_PLL2_OUT_EVEN, 1, 0, 0),
+       F(600000000, P_CAM_CC_PLL0_OUT_EVEN, 1, 0, 0),
+       { }
+};
+
+/*
+ * As per HW design, some of the CAMCC RCGs needs to
+ * move to XO clock during their clock disable so using
+ * clk_rcg2_shared_ops for such RCGs. This is required
+ * to power down the camera memories gracefully.
+ * Also, use CLK_SET_RATE_PARENT flag for the RCGs which
+ * have CAM_CC_PLL2_OUT_EVEN PLL as parent in frequency
+ * table and requires reconfiguration of the PLL frequency.
+ */
+static struct clk_rcg2 cam_cc_bps_clk_src = {
+       .cmd_rcgr = 0x600c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_bps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_bps_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_cam_cc_cci_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(37500000, P_CAM_CC_PLL0_OUT_EVEN, 16, 0, 0),
+       F(50000000, P_CAM_CC_PLL0_OUT_EVEN, 12, 0, 0),
+       F(100000000, P_CAM_CC_PLL0_OUT_EVEN, 6, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_cci_clk_src = {
+       .cmd_rcgr = 0xb0d8,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_cci_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_cci_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_cam_cc_cphy_rx_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(384000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_cphy_rx_clk_src = {
+       .cmd_rcgr = 0x9060,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_cphy_rx_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_cphy_rx_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_cam_cc_csi0phytimer_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(240000000, P_CAM_CC_PLL2_OUT_EVEN, 2, 0, 0),
+       F(269333333, P_CAM_CC_PLL1_OUT_EVEN, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_csi0phytimer_clk_src = {
+       .cmd_rcgr = 0x5004,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_csi0phytimer_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_csi1phytimer_clk_src = {
+       .cmd_rcgr = 0x5028,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_csi1phytimer_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_csi2phytimer_clk_src = {
+       .cmd_rcgr = 0x504c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_csi2phytimer_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_csi3phytimer_clk_src = {
+       .cmd_rcgr = 0x5070,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_csi3phytimer_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_cam_cc_fast_ahb_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(50000000, P_CAM_CC_PLL0_OUT_EVEN, 12, 0, 0),
+       F(100000000, P_CAM_CC_PLL0_OUT_EVEN, 6, 0, 0),
+       F(200000000, P_CAM_CC_PLL0_OUT_EVEN, 3, 0, 0),
+       F(300000000, P_CAM_CC_PLL0_OUT_EVEN, 2, 0, 0),
+       F(400000000, P_CAM_CC_PLL0_OUT_EVEN, 1.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_fast_ahb_clk_src = {
+       .cmd_rcgr = 0x6038,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_fast_ahb_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_fast_ahb_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_cam_cc_fd_core_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(384000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0),
+       F(400000000, P_CAM_CC_PLL0_OUT_EVEN, 1.5, 0, 0),
+       F(538666667, P_CAM_CC_PLL1_OUT_EVEN, 1.5, 0, 0),
+       F(600000000, P_CAM_CC_PLL0_OUT_EVEN, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_fd_core_clk_src = {
+       .cmd_rcgr = 0xb0b0,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_fd_core_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_fd_core_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_cam_cc_icp_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(384000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0),
+       F(400000000, P_CAM_CC_PLL0_OUT_EVEN, 1.5, 0, 0),
+       F(538666667, P_CAM_CC_PLL1_OUT_EVEN, 1.5, 0, 0),
+       F(600000000, P_CAM_CC_PLL0_OUT_EVEN, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_icp_clk_src = {
+       .cmd_rcgr = 0xb088,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_icp_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_icp_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_cam_cc_ife_0_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(100000000, P_CAM_CC_PLL0_OUT_EVEN, 6, 0, 0),
+       F(320000000, P_CAM_CC_PLL2_OUT_EVEN, 1.5, 0, 0),
+       F(404000000, P_CAM_CC_PLL1_OUT_EVEN, 2, 0, 0),
+       F(480000000, P_CAM_CC_PLL2_OUT_EVEN, 1, 0, 0),
+       F(600000000, P_CAM_CC_PLL0_OUT_EVEN, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_ife_0_clk_src = {
+       .cmd_rcgr = 0x900c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_ife_0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_ife_0_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_cam_cc_ife_0_csid_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(75000000, P_CAM_CC_PLL0_OUT_EVEN, 8, 0, 0),
+       F(384000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0),
+       F(538666667, P_CAM_CC_PLL1_OUT_EVEN, 1.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_ife_0_csid_clk_src = {
+       .cmd_rcgr = 0x9038,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_ife_0_csid_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_ife_0_csid_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_ife_1_clk_src = {
+       .cmd_rcgr = 0xa00c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_ife_0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_ife_1_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_ife_1_csid_clk_src = {
+       .cmd_rcgr = 0xa030,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_ife_0_csid_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_ife_1_csid_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_ife_lite_clk_src = {
+       .cmd_rcgr = 0xb004,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_ife_0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_ife_lite_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_ife_lite_csid_clk_src = {
+       .cmd_rcgr = 0xb024,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_ife_0_csid_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_ife_lite_csid_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_cam_cc_ipe_0_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(100000000, P_CAM_CC_PLL0_OUT_EVEN, 6, 0, 0),
+       F(240000000, P_CAM_CC_PLL0_OUT_EVEN, 2.5, 0, 0),
+       F(404000000, P_CAM_CC_PLL1_OUT_EVEN, 2, 0, 0),
+       F(480000000, P_CAM_CC_PLL2_OUT_EVEN, 1, 0, 0),
+       F(538666667, P_CAM_CC_PLL1_OUT_EVEN, 1.5, 0, 0),
+       F(600000000, P_CAM_CC_PLL0_OUT_EVEN, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_ipe_0_clk_src = {
+       .cmd_rcgr = 0x700c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_ipe_0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_ipe_0_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_ipe_1_clk_src = {
+       .cmd_rcgr = 0x800c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_ipe_0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_ipe_1_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_jpeg_clk_src = {
+       .cmd_rcgr = 0xb04c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_bps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_jpeg_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_cam_cc_lrme_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(100000000, P_CAM_CC_PLL0_OUT_EVEN, 6, 0, 0),
+       F(200000000, P_CAM_CC_PLL0_OUT_EVEN, 3, 0, 0),
+       F(269333333, P_CAM_CC_PLL1_OUT_EVEN, 3, 0, 0),
+       F(320000000, P_CAM_CC_PLL2_OUT_EVEN, 1.5, 0, 0),
+       F(400000000, P_CAM_CC_PLL0_OUT_EVEN, 1.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_lrme_clk_src = {
+       .cmd_rcgr = 0xb0f8,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_lrme_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_lrme_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_cam_cc_mclk0_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(24000000, P_CAM_CC_PLL2_OUT_EVEN, 10, 1, 2),
+       F(33333333, P_CAM_CC_PLL0_OUT_EVEN, 2, 1, 9),
+       F(34285714, P_CAM_CC_PLL2_OUT_EVEN, 14, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_mclk0_clk_src = {
+       .cmd_rcgr = 0x4004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_mclk0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_mclk0_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_mclk1_clk_src = {
+       .cmd_rcgr = 0x4024,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_mclk0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_mclk1_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_mclk2_clk_src = {
+       .cmd_rcgr = 0x4044,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_mclk0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_mclk2_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_mclk3_clk_src = {
+       .cmd_rcgr = 0x4064,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_mclk0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_mclk3_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_cam_cc_slow_ahb_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(60000000, P_CAM_CC_PLL0_OUT_EVEN, 10, 0, 0),
+       F(66666667, P_CAM_CC_PLL0_OUT_EVEN, 9, 0, 0),
+       F(73846154, P_CAM_CC_PLL2_OUT_EVEN, 6.5, 0, 0),
+       F(80000000, P_CAM_CC_PLL2_OUT_EVEN, 6, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_slow_ahb_clk_src = {
+       .cmd_rcgr = 0x6054,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_slow_ahb_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_slow_ahb_clk_src",
+               .parent_names = cam_cc_parent_names_0,
+               .num_parents = 6,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch cam_cc_bps_ahb_clk = {
+       .halt_reg = 0x606c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x606c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_bps_ahb_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_slow_ahb_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_bps_areg_clk = {
+       .halt_reg = 0x6050,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x6050,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_bps_areg_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_fast_ahb_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_bps_axi_clk = {
+       .halt_reg = 0x6034,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x6034,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_bps_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_bps_clk = {
+       .halt_reg = 0x6024,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x6024,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_bps_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_bps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_camnoc_atb_clk = {
+       .halt_reg = 0xb12c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb12c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_camnoc_atb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_camnoc_axi_clk = {
+       .halt_reg = 0xb124,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb124,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_camnoc_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_cci_clk = {
+       .halt_reg = 0xb0f0,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb0f0,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_cci_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_cci_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_cpas_ahb_clk = {
+       .halt_reg = 0xb11c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb11c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_cpas_ahb_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_slow_ahb_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_csi0phytimer_clk = {
+       .halt_reg = 0x501c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x501c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_csi0phytimer_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_csi0phytimer_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_csi1phytimer_clk = {
+       .halt_reg = 0x5040,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_csi1phytimer_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_csi1phytimer_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_csi2phytimer_clk = {
+       .halt_reg = 0x5064,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5064,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_csi2phytimer_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_csi2phytimer_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_csi3phytimer_clk = {
+       .halt_reg = 0x5088,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5088,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_csi3phytimer_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_csi3phytimer_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_csiphy0_clk = {
+       .halt_reg = 0x5020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5020,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_csiphy0_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_cphy_rx_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_csiphy1_clk = {
+       .halt_reg = 0x5044,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5044,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_csiphy1_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_cphy_rx_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_csiphy2_clk = {
+       .halt_reg = 0x5068,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5068,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_csiphy2_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_cphy_rx_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_csiphy3_clk = {
+       .halt_reg = 0x508c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x508c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_csiphy3_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_cphy_rx_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_fd_core_clk = {
+       .halt_reg = 0xb0c8,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb0c8,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_fd_core_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_fd_core_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_fd_core_uar_clk = {
+       .halt_reg = 0xb0d0,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb0d0,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_fd_core_uar_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_fd_core_clk_src",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_icp_apb_clk = {
+       .halt_reg = 0xb084,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb084,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_icp_apb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_icp_atb_clk = {
+       .halt_reg = 0xb078,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb078,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_icp_atb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_icp_clk = {
+       .halt_reg = 0xb0a0,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb0a0,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_icp_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_icp_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_icp_cti_clk = {
+       .halt_reg = 0xb07c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb07c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_icp_cti_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_icp_ts_clk = {
+       .halt_reg = 0xb080,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb080,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_icp_ts_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_0_axi_clk = {
+       .halt_reg = 0x907c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x907c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_0_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_0_clk = {
+       .halt_reg = 0x9024,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x9024,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_0_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_ife_0_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_0_cphy_rx_clk = {
+       .halt_reg = 0x9078,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x9078,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_0_cphy_rx_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_cphy_rx_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_0_csid_clk = {
+       .halt_reg = 0x9050,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x9050,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_0_csid_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_ife_0_csid_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_0_dsp_clk = {
+       .halt_reg = 0x9034,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x9034,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_0_dsp_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_ife_0_clk_src",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_1_axi_clk = {
+       .halt_reg = 0xa054,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xa054,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_1_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_1_clk = {
+       .halt_reg = 0xa024,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xa024,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_1_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_ife_1_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_1_cphy_rx_clk = {
+       .halt_reg = 0xa050,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xa050,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_1_cphy_rx_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_cphy_rx_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_1_csid_clk = {
+       .halt_reg = 0xa048,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xa048,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_1_csid_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_ife_1_csid_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_1_dsp_clk = {
+       .halt_reg = 0xa02c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xa02c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_1_dsp_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_ife_1_clk_src",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_lite_clk = {
+       .halt_reg = 0xb01c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb01c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_lite_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_ife_lite_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_lite_cphy_rx_clk = {
+       .halt_reg = 0xb044,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb044,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_lite_cphy_rx_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_cphy_rx_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_lite_csid_clk = {
+       .halt_reg = 0xb03c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb03c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_lite_csid_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_ife_lite_csid_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ipe_0_ahb_clk = {
+       .halt_reg = 0x703c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x703c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ipe_0_ahb_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_slow_ahb_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ipe_0_areg_clk = {
+       .halt_reg = 0x7038,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x7038,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ipe_0_areg_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_fast_ahb_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ipe_0_axi_clk = {
+       .halt_reg = 0x7034,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x7034,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ipe_0_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ipe_0_clk = {
+       .halt_reg = 0x7024,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x7024,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ipe_0_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_ipe_0_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ipe_1_ahb_clk = {
+       .halt_reg = 0x803c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x803c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ipe_1_ahb_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_slow_ahb_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ipe_1_areg_clk = {
+       .halt_reg = 0x8038,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8038,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ipe_1_areg_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_fast_ahb_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ipe_1_axi_clk = {
+       .halt_reg = 0x8034,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8034,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ipe_1_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ipe_1_clk = {
+       .halt_reg = 0x8024,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8024,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ipe_1_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_ipe_1_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_jpeg_clk = {
+       .halt_reg = 0xb064,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb064,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_jpeg_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_jpeg_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_lrme_clk = {
+       .halt_reg = 0xb110,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb110,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_lrme_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_lrme_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_mclk0_clk = {
+       .halt_reg = 0x401c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x401c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_mclk0_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_mclk0_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_mclk1_clk = {
+       .halt_reg = 0x403c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x403c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_mclk1_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_mclk1_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_mclk2_clk = {
+       .halt_reg = 0x405c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x405c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_mclk2_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_mclk2_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_mclk3_clk = {
+       .halt_reg = 0x407c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x407c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_mclk3_clk",
+                       .parent_names = (const char *[]){
+                               "cam_cc_mclk3_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_soc_ahb_clk = {
+       .halt_reg = 0xb13c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb13c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_soc_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_sys_tmr_clk = {
+       .halt_reg = 0xb0a8,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb0a8,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_sys_tmr_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct gdsc bps_gdsc = {
+       .gdscr = 0x6004,
+       .pd = {
+               .name = "bps_gdsc",
+       },
+       .flags = HW_CTRL | POLL_CFG_GDSCR,
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc ipe_0_gdsc = {
+       .gdscr = 0x7004,
+       .pd = {
+               .name = "ipe_0_gdsc",
+       },
+       .flags = HW_CTRL | POLL_CFG_GDSCR,
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc ipe_1_gdsc = {
+       .gdscr = 0x8004,
+       .pd = {
+               .name = "ipe_1_gdsc",
+       },
+       .flags = HW_CTRL | POLL_CFG_GDSCR,
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc ife_0_gdsc = {
+       .gdscr = 0x9004,
+       .pd = {
+               .name = "ife_0_gdsc",
+       },
+       .flags = POLL_CFG_GDSCR,
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc ife_1_gdsc = {
+       .gdscr = 0xa004,
+       .pd = {
+               .name = "ife_1_gdsc",
+       },
+       .flags = POLL_CFG_GDSCR,
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc titan_top_gdsc = {
+       .gdscr = 0xb134,
+       .pd = {
+               .name = "titan_top_gdsc",
+       },
+       .flags = POLL_CFG_GDSCR,
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct clk_regmap *cam_cc_sdm845_clocks[] = {
+       [CAM_CC_BPS_AHB_CLK] = &cam_cc_bps_ahb_clk.clkr,
+       [CAM_CC_BPS_AREG_CLK] = &cam_cc_bps_areg_clk.clkr,
+       [CAM_CC_BPS_AXI_CLK] = &cam_cc_bps_axi_clk.clkr,
+       [CAM_CC_BPS_CLK] = &cam_cc_bps_clk.clkr,
+       [CAM_CC_BPS_CLK_SRC] = &cam_cc_bps_clk_src.clkr,
+       [CAM_CC_CAMNOC_ATB_CLK] = &cam_cc_camnoc_atb_clk.clkr,
+       [CAM_CC_CAMNOC_AXI_CLK] = &cam_cc_camnoc_axi_clk.clkr,
+       [CAM_CC_CCI_CLK] = &cam_cc_cci_clk.clkr,
+       [CAM_CC_CCI_CLK_SRC] = &cam_cc_cci_clk_src.clkr,
+       [CAM_CC_CPAS_AHB_CLK] = &cam_cc_cpas_ahb_clk.clkr,
+       [CAM_CC_CPHY_RX_CLK_SRC] = &cam_cc_cphy_rx_clk_src.clkr,
+       [CAM_CC_CSI0PHYTIMER_CLK] = &cam_cc_csi0phytimer_clk.clkr,
+       [CAM_CC_CSI0PHYTIMER_CLK_SRC] = &cam_cc_csi0phytimer_clk_src.clkr,
+       [CAM_CC_CSI1PHYTIMER_CLK] = &cam_cc_csi1phytimer_clk.clkr,
+       [CAM_CC_CSI1PHYTIMER_CLK_SRC] = &cam_cc_csi1phytimer_clk_src.clkr,
+       [CAM_CC_CSI2PHYTIMER_CLK] = &cam_cc_csi2phytimer_clk.clkr,
+       [CAM_CC_CSI2PHYTIMER_CLK_SRC] = &cam_cc_csi2phytimer_clk_src.clkr,
+       [CAM_CC_CSI3PHYTIMER_CLK] = &cam_cc_csi3phytimer_clk.clkr,
+       [CAM_CC_CSI3PHYTIMER_CLK_SRC] = &cam_cc_csi3phytimer_clk_src.clkr,
+       [CAM_CC_CSIPHY0_CLK] = &cam_cc_csiphy0_clk.clkr,
+       [CAM_CC_CSIPHY1_CLK] = &cam_cc_csiphy1_clk.clkr,
+       [CAM_CC_CSIPHY2_CLK] = &cam_cc_csiphy2_clk.clkr,
+       [CAM_CC_CSIPHY3_CLK] = &cam_cc_csiphy3_clk.clkr,
+       [CAM_CC_FAST_AHB_CLK_SRC] = &cam_cc_fast_ahb_clk_src.clkr,
+       [CAM_CC_FD_CORE_CLK] = &cam_cc_fd_core_clk.clkr,
+       [CAM_CC_FD_CORE_CLK_SRC] = &cam_cc_fd_core_clk_src.clkr,
+       [CAM_CC_FD_CORE_UAR_CLK] = &cam_cc_fd_core_uar_clk.clkr,
+       [CAM_CC_ICP_APB_CLK] = &cam_cc_icp_apb_clk.clkr,
+       [CAM_CC_ICP_ATB_CLK] = &cam_cc_icp_atb_clk.clkr,
+       [CAM_CC_ICP_CLK] = &cam_cc_icp_clk.clkr,
+       [CAM_CC_ICP_CLK_SRC] = &cam_cc_icp_clk_src.clkr,
+       [CAM_CC_ICP_CTI_CLK] = &cam_cc_icp_cti_clk.clkr,
+       [CAM_CC_ICP_TS_CLK] = &cam_cc_icp_ts_clk.clkr,
+       [CAM_CC_IFE_0_AXI_CLK] = &cam_cc_ife_0_axi_clk.clkr,
+       [CAM_CC_IFE_0_CLK] = &cam_cc_ife_0_clk.clkr,
+       [CAM_CC_IFE_0_CLK_SRC] = &cam_cc_ife_0_clk_src.clkr,
+       [CAM_CC_IFE_0_CPHY_RX_CLK] = &cam_cc_ife_0_cphy_rx_clk.clkr,
+       [CAM_CC_IFE_0_CSID_CLK] = &cam_cc_ife_0_csid_clk.clkr,
+       [CAM_CC_IFE_0_CSID_CLK_SRC] = &cam_cc_ife_0_csid_clk_src.clkr,
+       [CAM_CC_IFE_0_DSP_CLK] = &cam_cc_ife_0_dsp_clk.clkr,
+       [CAM_CC_IFE_1_AXI_CLK] = &cam_cc_ife_1_axi_clk.clkr,
+       [CAM_CC_IFE_1_CLK] = &cam_cc_ife_1_clk.clkr,
+       [CAM_CC_IFE_1_CLK_SRC] = &cam_cc_ife_1_clk_src.clkr,
+       [CAM_CC_IFE_1_CPHY_RX_CLK] = &cam_cc_ife_1_cphy_rx_clk.clkr,
+       [CAM_CC_IFE_1_CSID_CLK] = &cam_cc_ife_1_csid_clk.clkr,
+       [CAM_CC_IFE_1_CSID_CLK_SRC] = &cam_cc_ife_1_csid_clk_src.clkr,
+       [CAM_CC_IFE_1_DSP_CLK] = &cam_cc_ife_1_dsp_clk.clkr,
+       [CAM_CC_IFE_LITE_CLK] = &cam_cc_ife_lite_clk.clkr,
+       [CAM_CC_IFE_LITE_CLK_SRC] = &cam_cc_ife_lite_clk_src.clkr,
+       [CAM_CC_IFE_LITE_CPHY_RX_CLK] = &cam_cc_ife_lite_cphy_rx_clk.clkr,
+       [CAM_CC_IFE_LITE_CSID_CLK] = &cam_cc_ife_lite_csid_clk.clkr,
+       [CAM_CC_IFE_LITE_CSID_CLK_SRC] = &cam_cc_ife_lite_csid_clk_src.clkr,
+       [CAM_CC_IPE_0_AHB_CLK] = &cam_cc_ipe_0_ahb_clk.clkr,
+       [CAM_CC_IPE_0_AREG_CLK] = &cam_cc_ipe_0_areg_clk.clkr,
+       [CAM_CC_IPE_0_AXI_CLK] = &cam_cc_ipe_0_axi_clk.clkr,
+       [CAM_CC_IPE_0_CLK] = &cam_cc_ipe_0_clk.clkr,
+       [CAM_CC_IPE_0_CLK_SRC] = &cam_cc_ipe_0_clk_src.clkr,
+       [CAM_CC_IPE_1_AHB_CLK] = &cam_cc_ipe_1_ahb_clk.clkr,
+       [CAM_CC_IPE_1_AREG_CLK] = &cam_cc_ipe_1_areg_clk.clkr,
+       [CAM_CC_IPE_1_AXI_CLK] = &cam_cc_ipe_1_axi_clk.clkr,
+       [CAM_CC_IPE_1_CLK] = &cam_cc_ipe_1_clk.clkr,
+       [CAM_CC_IPE_1_CLK_SRC] = &cam_cc_ipe_1_clk_src.clkr,
+       [CAM_CC_JPEG_CLK] = &cam_cc_jpeg_clk.clkr,
+       [CAM_CC_JPEG_CLK_SRC] = &cam_cc_jpeg_clk_src.clkr,
+       [CAM_CC_LRME_CLK] = &cam_cc_lrme_clk.clkr,
+       [CAM_CC_LRME_CLK_SRC] = &cam_cc_lrme_clk_src.clkr,
+       [CAM_CC_MCLK0_CLK] = &cam_cc_mclk0_clk.clkr,
+       [CAM_CC_MCLK0_CLK_SRC] = &cam_cc_mclk0_clk_src.clkr,
+       [CAM_CC_MCLK1_CLK] = &cam_cc_mclk1_clk.clkr,
+       [CAM_CC_MCLK1_CLK_SRC] = &cam_cc_mclk1_clk_src.clkr,
+       [CAM_CC_MCLK2_CLK] = &cam_cc_mclk2_clk.clkr,
+       [CAM_CC_MCLK2_CLK_SRC] = &cam_cc_mclk2_clk_src.clkr,
+       [CAM_CC_MCLK3_CLK] = &cam_cc_mclk3_clk.clkr,
+       [CAM_CC_MCLK3_CLK_SRC] = &cam_cc_mclk3_clk_src.clkr,
+       [CAM_CC_PLL0] = &cam_cc_pll0.clkr,
+       [CAM_CC_PLL0_OUT_EVEN] = &cam_cc_pll0_out_even.clkr,
+       [CAM_CC_PLL1] = &cam_cc_pll1.clkr,
+       [CAM_CC_PLL1_OUT_EVEN] = &cam_cc_pll1_out_even.clkr,
+       [CAM_CC_PLL2] = &cam_cc_pll2.clkr,
+       [CAM_CC_PLL2_OUT_EVEN] = &cam_cc_pll2_out_even.clkr,
+       [CAM_CC_PLL3] = &cam_cc_pll3.clkr,
+       [CAM_CC_PLL3_OUT_EVEN] = &cam_cc_pll3_out_even.clkr,
+       [CAM_CC_SLOW_AHB_CLK_SRC] = &cam_cc_slow_ahb_clk_src.clkr,
+       [CAM_CC_SOC_AHB_CLK] = &cam_cc_soc_ahb_clk.clkr,
+       [CAM_CC_SYS_TMR_CLK] = &cam_cc_sys_tmr_clk.clkr,
+};
+
+static struct gdsc *cam_cc_sdm845_gdscs[] = {
+       [BPS_GDSC] = &bps_gdsc,
+       [IPE_0_GDSC] = &ipe_0_gdsc,
+       [IPE_1_GDSC] = &ipe_1_gdsc,
+       [IFE_0_GDSC] = &ife_0_gdsc,
+       [IFE_1_GDSC] = &ife_1_gdsc,
+       [TITAN_TOP_GDSC] = &titan_top_gdsc,
+};
+
+static const struct regmap_config cam_cc_sdm845_regmap_config = {
+       .reg_bits       = 32,
+       .reg_stride     = 4,
+       .val_bits       = 32,
+       .max_register   = 0xd004,
+       .fast_io        = true,
+};
+
+static const struct qcom_cc_desc cam_cc_sdm845_desc = {
+       .config = &cam_cc_sdm845_regmap_config,
+       .clks = cam_cc_sdm845_clocks,
+       .num_clks = ARRAY_SIZE(cam_cc_sdm845_clocks),
+       .gdscs = cam_cc_sdm845_gdscs,
+       .num_gdscs = ARRAY_SIZE(cam_cc_sdm845_gdscs),
+};
+
+static const struct of_device_id cam_cc_sdm845_match_table[] = {
+       { .compatible = "qcom,sdm845-camcc" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, cam_cc_sdm845_match_table);
+
+static int cam_cc_sdm845_probe(struct platform_device *pdev)
+{
+       struct regmap *regmap;
+       struct alpha_pll_config cam_cc_pll_config = { };
+
+       regmap = qcom_cc_map(pdev, &cam_cc_sdm845_desc);
+       if (IS_ERR(regmap))
+               return PTR_ERR(regmap);
+
+       cam_cc_pll_config.l = 0x1f;
+       cam_cc_pll_config.alpha = 0x4000;
+       clk_fabia_pll_configure(&cam_cc_pll0, regmap, &cam_cc_pll_config);
+
+       cam_cc_pll_config.l = 0x2a;
+       cam_cc_pll_config.alpha = 0x1556;
+       clk_fabia_pll_configure(&cam_cc_pll1, regmap, &cam_cc_pll_config);
+
+       cam_cc_pll_config.l = 0x32;
+       cam_cc_pll_config.alpha = 0x0;
+       clk_fabia_pll_configure(&cam_cc_pll2, regmap, &cam_cc_pll_config);
+
+       cam_cc_pll_config.l = 0x14;
+       clk_fabia_pll_configure(&cam_cc_pll3, regmap, &cam_cc_pll_config);
+
+       return qcom_cc_really_probe(pdev, &cam_cc_sdm845_desc, regmap);
+}
+
+static struct platform_driver cam_cc_sdm845_driver = {
+       .probe  = cam_cc_sdm845_probe,
+       .driver = {
+               .name = "sdm845-camcc",
+               .of_match_table = cam_cc_sdm845_match_table,
+       },
+};
+
+static int __init cam_cc_sdm845_init(void)
+{
+       return platform_driver_register(&cam_cc_sdm845_driver);
+}
+subsys_initcall(cam_cc_sdm845_init);
+
+static void __exit cam_cc_sdm845_exit(void)
+{
+       platform_driver_unregister(&cam_cc_sdm845_driver);
+}
+module_exit(cam_cc_sdm845_exit);
+
+MODULE_DESCRIPTION("QTI CAM_CC SDM845 Driver");
+MODULE_LICENSE("GPL v2");
index a91d97cecbad0b554ebbdfd70df628c236dfd91c..0ced4a5a9a171e9025fc9696833fca1f9f3db82d 100644 (file)
@@ -220,6 +220,7 @@ void clk_alpha_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
        if (pll->flags & SUPPORTS_FSM_MODE)
                qcom_pll_set_fsm_mode(regmap, PLL_MODE(pll), 6, 0);
 }
+EXPORT_SYMBOL_GPL(clk_alpha_pll_configure);
 
 static int clk_alpha_pll_hwfsm_enable(struct clk_hw *hw)
 {
index bc2205c450b641c35194fc8d1b4b12b19ee072fc..99446bf630aaad4282669c25c73cf85fcd4f549a 100644 (file)
@@ -18,7 +18,7 @@ static bool clk_branch_in_hwcg_mode(const struct clk_branch *br)
        u32 val;
 
        if (!br->hwcg_reg)
-               return 0;
+               return false;
 
        regmap_read(br->clkr.regmap, br->hwcg_reg, &val);
 
diff --git a/drivers/clk/qcom/clk-hfpll.c b/drivers/clk/qcom/clk-hfpll.c
new file mode 100644 (file)
index 0000000..3c04805
--- /dev/null
@@ -0,0 +1,244 @@
+// SPDX-License-Identifier: GPL-2.0
+// Copyright (c) 2018, The Linux Foundation. All rights reserved.
+
+#include <linux/kernel.h>
+#include <linux/export.h>
+#include <linux/regmap.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/clk-provider.h>
+#include <linux/spinlock.h>
+
+#include "clk-regmap.h"
+#include "clk-hfpll.h"
+
+#define PLL_OUTCTRL    BIT(0)
+#define PLL_BYPASSNL   BIT(1)
+#define PLL_RESET_N    BIT(2)
+
+/* Initialize a HFPLL at a given rate and enable it. */
+static void __clk_hfpll_init_once(struct clk_hw *hw)
+{
+       struct clk_hfpll *h = to_clk_hfpll(hw);
+       struct hfpll_data const *hd = h->d;
+       struct regmap *regmap = h->clkr.regmap;
+
+       if (likely(h->init_done))
+               return;
+
+       /* Configure PLL parameters for integer mode. */
+       if (hd->config_val)
+               regmap_write(regmap, hd->config_reg, hd->config_val);
+       regmap_write(regmap, hd->m_reg, 0);
+       regmap_write(regmap, hd->n_reg, 1);
+
+       if (hd->user_reg) {
+               u32 regval = hd->user_val;
+               unsigned long rate;
+
+               rate = clk_hw_get_rate(hw);
+
+               /* Pick the right VCO. */
+               if (hd->user_vco_mask && rate > hd->low_vco_max_rate)
+                       regval |= hd->user_vco_mask;
+               regmap_write(regmap, hd->user_reg, regval);
+       }
+
+       if (hd->droop_reg)
+               regmap_write(regmap, hd->droop_reg, hd->droop_val);
+
+       h->init_done = true;
+}
+
+static void __clk_hfpll_enable(struct clk_hw *hw)
+{
+       struct clk_hfpll *h = to_clk_hfpll(hw);
+       struct hfpll_data const *hd = h->d;
+       struct regmap *regmap = h->clkr.regmap;
+       u32 val;
+
+       __clk_hfpll_init_once(hw);
+
+       /* Disable PLL bypass mode. */
+       regmap_update_bits(regmap, hd->mode_reg, PLL_BYPASSNL, PLL_BYPASSNL);
+
+       /*
+        * H/W requires a 5us delay between disabling the bypass and
+        * de-asserting the reset. Delay 10us just to be safe.
+        */
+       udelay(10);
+
+       /* De-assert active-low PLL reset. */
+       regmap_update_bits(regmap, hd->mode_reg, PLL_RESET_N, PLL_RESET_N);
+
+       /* Wait for PLL to lock. */
+       if (hd->status_reg) {
+               do {
+                       regmap_read(regmap, hd->status_reg, &val);
+               } while (!(val & BIT(hd->lock_bit)));
+       } else {
+               udelay(60);
+       }
+
+       /* Enable PLL output. */
+       regmap_update_bits(regmap, hd->mode_reg, PLL_OUTCTRL, PLL_OUTCTRL);
+}
+
+/* Enable an already-configured HFPLL. */
+static int clk_hfpll_enable(struct clk_hw *hw)
+{
+       unsigned long flags;
+       struct clk_hfpll *h = to_clk_hfpll(hw);
+       struct hfpll_data const *hd = h->d;
+       struct regmap *regmap = h->clkr.regmap;
+       u32 mode;
+
+       spin_lock_irqsave(&h->lock, flags);
+       regmap_read(regmap, hd->mode_reg, &mode);
+       if (!(mode & (PLL_BYPASSNL | PLL_RESET_N | PLL_OUTCTRL)))
+               __clk_hfpll_enable(hw);
+       spin_unlock_irqrestore(&h->lock, flags);
+
+       return 0;
+}
+
+static void __clk_hfpll_disable(struct clk_hfpll *h)
+{
+       struct hfpll_data const *hd = h->d;
+       struct regmap *regmap = h->clkr.regmap;
+
+       /*
+        * Disable the PLL output, disable test mode, enable the bypass mode,
+        * and assert the reset.
+        */
+       regmap_update_bits(regmap, hd->mode_reg,
+                          PLL_BYPASSNL | PLL_RESET_N | PLL_OUTCTRL, 0);
+}
+
+static void clk_hfpll_disable(struct clk_hw *hw)
+{
+       struct clk_hfpll *h = to_clk_hfpll(hw);
+       unsigned long flags;
+
+       spin_lock_irqsave(&h->lock, flags);
+       __clk_hfpll_disable(h);
+       spin_unlock_irqrestore(&h->lock, flags);
+}
+
+static long clk_hfpll_round_rate(struct clk_hw *hw, unsigned long rate,
+                                unsigned long *parent_rate)
+{
+       struct clk_hfpll *h = to_clk_hfpll(hw);
+       struct hfpll_data const *hd = h->d;
+       unsigned long rrate;
+
+       rate = clamp(rate, hd->min_rate, hd->max_rate);
+
+       rrate = DIV_ROUND_UP(rate, *parent_rate) * *parent_rate;
+       if (rrate > hd->max_rate)
+               rrate -= *parent_rate;
+
+       return rrate;
+}
+
+/*
+ * For optimization reasons, assumes no downstream clocks are actively using
+ * it.
+ */
+static int clk_hfpll_set_rate(struct clk_hw *hw, unsigned long rate,
+                             unsigned long parent_rate)
+{
+       struct clk_hfpll *h = to_clk_hfpll(hw);
+       struct hfpll_data const *hd = h->d;
+       struct regmap *regmap = h->clkr.regmap;
+       unsigned long flags;
+       u32 l_val, val;
+       bool enabled;
+
+       l_val = rate / parent_rate;
+
+       spin_lock_irqsave(&h->lock, flags);
+
+       enabled = __clk_is_enabled(hw->clk);
+       if (enabled)
+               __clk_hfpll_disable(h);
+
+       /* Pick the right VCO. */
+       if (hd->user_reg && hd->user_vco_mask) {
+               regmap_read(regmap, hd->user_reg, &val);
+               if (rate <= hd->low_vco_max_rate)
+                       val &= ~hd->user_vco_mask;
+               else
+                       val |= hd->user_vco_mask;
+               regmap_write(regmap, hd->user_reg, val);
+       }
+
+       regmap_write(regmap, hd->l_reg, l_val);
+
+       if (enabled)
+               __clk_hfpll_enable(hw);
+
+       spin_unlock_irqrestore(&h->lock, flags);
+
+       return 0;
+}
+
+static unsigned long clk_hfpll_recalc_rate(struct clk_hw *hw,
+                                          unsigned long parent_rate)
+{
+       struct clk_hfpll *h = to_clk_hfpll(hw);
+       struct hfpll_data const *hd = h->d;
+       struct regmap *regmap = h->clkr.regmap;
+       u32 l_val;
+
+       regmap_read(regmap, hd->l_reg, &l_val);
+
+       return l_val * parent_rate;
+}
+
+static void clk_hfpll_init(struct clk_hw *hw)
+{
+       struct clk_hfpll *h = to_clk_hfpll(hw);
+       struct hfpll_data const *hd = h->d;
+       struct regmap *regmap = h->clkr.regmap;
+       u32 mode, status;
+
+       regmap_read(regmap, hd->mode_reg, &mode);
+       if (mode != (PLL_BYPASSNL | PLL_RESET_N | PLL_OUTCTRL)) {
+               __clk_hfpll_init_once(hw);
+               return;
+       }
+
+       if (hd->status_reg) {
+               regmap_read(regmap, hd->status_reg, &status);
+               if (!(status & BIT(hd->lock_bit))) {
+                       WARN(1, "HFPLL %s is ON, but not locked!\n",
+                            __clk_get_name(hw->clk));
+                       clk_hfpll_disable(hw);
+                       __clk_hfpll_init_once(hw);
+               }
+       }
+}
+
+static int hfpll_is_enabled(struct clk_hw *hw)
+{
+       struct clk_hfpll *h = to_clk_hfpll(hw);
+       struct hfpll_data const *hd = h->d;
+       struct regmap *regmap = h->clkr.regmap;
+       u32 mode;
+
+       regmap_read(regmap, hd->mode_reg, &mode);
+       mode &= 0x7;
+       return mode == (PLL_BYPASSNL | PLL_RESET_N | PLL_OUTCTRL);
+}
+
+const struct clk_ops clk_ops_hfpll = {
+       .enable = clk_hfpll_enable,
+       .disable = clk_hfpll_disable,
+       .is_enabled = hfpll_is_enabled,
+       .round_rate = clk_hfpll_round_rate,
+       .set_rate = clk_hfpll_set_rate,
+       .recalc_rate = clk_hfpll_recalc_rate,
+       .init = clk_hfpll_init,
+};
+EXPORT_SYMBOL_GPL(clk_ops_hfpll);
diff --git a/drivers/clk/qcom/clk-hfpll.h b/drivers/clk/qcom/clk-hfpll.h
new file mode 100644 (file)
index 0000000..2a57b2f
--- /dev/null
@@ -0,0 +1,44 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef __QCOM_CLK_HFPLL_H__
+#define __QCOM_CLK_HFPLL_H__
+
+#include <linux/clk-provider.h>
+#include <linux/spinlock.h>
+#include "clk-regmap.h"
+
+struct hfpll_data {
+       u32 mode_reg;
+       u32 l_reg;
+       u32 m_reg;
+       u32 n_reg;
+       u32 user_reg;
+       u32 droop_reg;
+       u32 config_reg;
+       u32 status_reg;
+       u8  lock_bit;
+
+       u32 droop_val;
+       u32 config_val;
+       u32 user_val;
+       u32 user_vco_mask;
+       unsigned long low_vco_max_rate;
+
+       unsigned long min_rate;
+       unsigned long max_rate;
+};
+
+struct clk_hfpll {
+       struct hfpll_data const *d;
+       int init_done;
+
+       struct clk_regmap clkr;
+       spinlock_t lock;
+};
+
+#define to_clk_hfpll(_hw) \
+       container_of(to_clk_regmap(_hw), struct clk_hfpll, clkr)
+
+extern const struct clk_ops clk_ops_hfpll;
+
+#endif
diff --git a/drivers/clk/qcom/clk-krait.c b/drivers/clk/qcom/clk-krait.c
new file mode 100644 (file)
index 0000000..59f1af4
--- /dev/null
@@ -0,0 +1,126 @@
+// SPDX-License-Identifier: GPL-2.0
+// Copyright (c) 2018, The Linux Foundation. All rights reserved.
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/clk-provider.h>
+#include <linux/spinlock.h>
+
+#include <asm/krait-l2-accessors.h>
+
+#include "clk-krait.h"
+
+/* Secondary and primary muxes share the same cp15 register */
+static DEFINE_SPINLOCK(krait_clock_reg_lock);
+
+#define LPL_SHIFT      8
+static void __krait_mux_set_sel(struct krait_mux_clk *mux, int sel)
+{
+       unsigned long flags;
+       u32 regval;
+
+       spin_lock_irqsave(&krait_clock_reg_lock, flags);
+       regval = krait_get_l2_indirect_reg(mux->offset);
+       regval &= ~(mux->mask << mux->shift);
+       regval |= (sel & mux->mask) << mux->shift;
+       if (mux->lpl) {
+               regval &= ~(mux->mask << (mux->shift + LPL_SHIFT));
+               regval |= (sel & mux->mask) << (mux->shift + LPL_SHIFT);
+       }
+       krait_set_l2_indirect_reg(mux->offset, regval);
+       spin_unlock_irqrestore(&krait_clock_reg_lock, flags);
+
+       /* Wait for switch to complete. */
+       mb();
+       udelay(1);
+}
+
+static int krait_mux_set_parent(struct clk_hw *hw, u8 index)
+{
+       struct krait_mux_clk *mux = to_krait_mux_clk(hw);
+       u32 sel;
+
+       sel = clk_mux_index_to_val(mux->parent_map, 0, index);
+       mux->en_mask = sel;
+       /* Don't touch mux if CPU is off as it won't work */
+       if (__clk_is_enabled(hw->clk))
+               __krait_mux_set_sel(mux, sel);
+
+       mux->reparent = true;
+
+       return 0;
+}
+
+static u8 krait_mux_get_parent(struct clk_hw *hw)
+{
+       struct krait_mux_clk *mux = to_krait_mux_clk(hw);
+       u32 sel;
+
+       sel = krait_get_l2_indirect_reg(mux->offset);
+       sel >>= mux->shift;
+       sel &= mux->mask;
+       mux->en_mask = sel;
+
+       return clk_mux_val_to_index(hw, mux->parent_map, 0, sel);
+}
+
+const struct clk_ops krait_mux_clk_ops = {
+       .set_parent = krait_mux_set_parent,
+       .get_parent = krait_mux_get_parent,
+       .determine_rate = __clk_mux_determine_rate_closest,
+};
+EXPORT_SYMBOL_GPL(krait_mux_clk_ops);
+
+/* The divider can divide by 2, 4, 6 and 8. But we only really need div-2. */
+static long krait_div2_round_rate(struct clk_hw *hw, unsigned long rate,
+                                 unsigned long *parent_rate)
+{
+       *parent_rate = clk_hw_round_rate(clk_hw_get_parent(hw), rate * 2);
+       return DIV_ROUND_UP(*parent_rate, 2);
+}
+
+static int krait_div2_set_rate(struct clk_hw *hw, unsigned long rate,
+                              unsigned long parent_rate)
+{
+       struct krait_div2_clk *d = to_krait_div2_clk(hw);
+       unsigned long flags;
+       u32 val;
+       u32 mask = BIT(d->width) - 1;
+
+       if (d->lpl)
+               mask = mask << (d->shift + LPL_SHIFT) | mask << d->shift;
+
+       spin_lock_irqsave(&krait_clock_reg_lock, flags);
+       val = krait_get_l2_indirect_reg(d->offset);
+       val &= ~mask;
+       krait_set_l2_indirect_reg(d->offset, val);
+       spin_unlock_irqrestore(&krait_clock_reg_lock, flags);
+
+       return 0;
+}
+
+static unsigned long
+krait_div2_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
+{
+       struct krait_div2_clk *d = to_krait_div2_clk(hw);
+       u32 mask = BIT(d->width) - 1;
+       u32 div;
+
+       div = krait_get_l2_indirect_reg(d->offset);
+       div >>= d->shift;
+       div &= mask;
+       div = (div + 1) * 2;
+
+       return DIV_ROUND_UP(parent_rate, div);
+}
+
+const struct clk_ops krait_div2_clk_ops = {
+       .round_rate = krait_div2_round_rate,
+       .set_rate = krait_div2_set_rate,
+       .recalc_rate = krait_div2_recalc_rate,
+};
+EXPORT_SYMBOL_GPL(krait_div2_clk_ops);
diff --git a/drivers/clk/qcom/clk-krait.h b/drivers/clk/qcom/clk-krait.h
new file mode 100644 (file)
index 0000000..9120bd2
--- /dev/null
@@ -0,0 +1,40 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef __QCOM_CLK_KRAIT_H
+#define __QCOM_CLK_KRAIT_H
+
+#include <linux/clk-provider.h>
+
+struct krait_mux_clk {
+       unsigned int    *parent_map;
+       u32             offset;
+       u32             mask;
+       u32             shift;
+       u32             en_mask;
+       bool            lpl;
+       u8              safe_sel;
+       u8              old_index;
+       bool            reparent;
+
+       struct clk_hw   hw;
+       struct notifier_block   clk_nb;
+};
+
+#define to_krait_mux_clk(_hw) container_of(_hw, struct krait_mux_clk, hw)
+
+extern const struct clk_ops krait_mux_clk_ops;
+
+struct krait_div2_clk {
+       u32             offset;
+       u8              width;
+       u32             shift;
+       bool            lpl;
+
+       struct clk_hw   hw;
+};
+
+#define to_krait_div2_clk(_hw) container_of(_hw, struct krait_div2_clk, hw)
+
+extern const struct clk_ops krait_div2_clk_ops;
+
+#endif
index dbd5a9e8355416a9edabeb09d474f7e9005a85c4..e5eca8a1abe484a6c5abb30f72e51164b762eaae 100644 (file)
@@ -163,4 +163,15 @@ extern const struct clk_ops clk_pixel_ops;
 extern const struct clk_ops clk_gfx3d_ops;
 extern const struct clk_ops clk_rcg2_shared_ops;
 
+struct clk_rcg_dfs_data {
+       struct clk_rcg2 *rcg;
+       struct clk_init_data *init;
+};
+
+#define DEFINE_RCG_DFS(r) \
+       { .rcg = &r##_src, .init = &r##_init }
+
+extern int qcom_cc_register_rcg_dfs(struct regmap *regmap,
+                                   const struct clk_rcg_dfs_data *rcgs,
+                                   size_t len);
 #endif
index 52208d4165f432ac7398e423139af52f84722844..6e3bd195d012fc17565a17d03b3d7770252d7075 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/delay.h>
 #include <linux/regmap.h>
 #include <linux/math64.h>
+#include <linux/slab.h>
 
 #include <asm/div64.h>
 
 #define N_REG                  0xc
 #define D_REG                  0x10
 
+/* Dynamic Frequency Scaling */
+#define MAX_PERF_LEVEL         8
+#define SE_CMD_DFSR_OFFSET     0x14
+#define SE_CMD_DFS_EN          BIT(0)
+#define SE_PERF_DFSR(level)    (0x1c + 0x4 * (level))
+#define SE_PERF_M_DFSR(level)  (0x5c + 0x4 * (level))
+#define SE_PERF_N_DFSR(level)  (0x9c + 0x4 * (level))
+
 enum freq_policy {
        FLOOR,
        CEIL,
@@ -929,3 +938,189 @@ const struct clk_ops clk_rcg2_shared_ops = {
        .set_rate_and_parent = clk_rcg2_shared_set_rate_and_parent,
 };
 EXPORT_SYMBOL_GPL(clk_rcg2_shared_ops);
+
+/* Common APIs to be used for DFS based RCGR */
+static void clk_rcg2_dfs_populate_freq(struct clk_hw *hw, unsigned int l,
+                                      struct freq_tbl *f)
+{
+       struct clk_rcg2 *rcg = to_clk_rcg2(hw);
+       struct clk_hw *p;
+       unsigned long prate = 0;
+       u32 val, mask, cfg, mode;
+       int i, num_parents;
+
+       regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + SE_PERF_DFSR(l), &cfg);
+
+       mask = BIT(rcg->hid_width) - 1;
+       f->pre_div = 1;
+       if (cfg & mask)
+               f->pre_div = cfg & mask;
+
+       cfg &= CFG_SRC_SEL_MASK;
+       cfg >>= CFG_SRC_SEL_SHIFT;
+
+       num_parents = clk_hw_get_num_parents(hw);
+       for (i = 0; i < num_parents; i++) {
+               if (cfg == rcg->parent_map[i].cfg) {
+                       f->src = rcg->parent_map[i].src;
+                       p = clk_hw_get_parent_by_index(&rcg->clkr.hw, i);
+                       prate = clk_hw_get_rate(p);
+               }
+       }
+
+       mode = cfg & CFG_MODE_MASK;
+       mode >>= CFG_MODE_SHIFT;
+       if (mode) {
+               mask = BIT(rcg->mnd_width) - 1;
+               regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + SE_PERF_M_DFSR(l),
+                           &val);
+               val &= mask;
+               f->m = val;
+
+               regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + SE_PERF_N_DFSR(l),
+                           &val);
+               val = ~val;
+               val &= mask;
+               val += f->m;
+               f->n = val;
+       }
+
+       f->freq = calc_rate(prate, f->m, f->n, mode, f->pre_div);
+}
+
+static int clk_rcg2_dfs_populate_freq_table(struct clk_rcg2 *rcg)
+{
+       struct freq_tbl *freq_tbl;
+       int i;
+
+       /* Allocate space for 1 extra since table is NULL terminated */
+       freq_tbl = kcalloc(MAX_PERF_LEVEL + 1, sizeof(*freq_tbl), GFP_KERNEL);
+       if (!freq_tbl)
+               return -ENOMEM;
+       rcg->freq_tbl = freq_tbl;
+
+       for (i = 0; i < MAX_PERF_LEVEL; i++)
+               clk_rcg2_dfs_populate_freq(&rcg->clkr.hw, i, freq_tbl + i);
+
+       return 0;
+}
+
+static int clk_rcg2_dfs_determine_rate(struct clk_hw *hw,
+                                  struct clk_rate_request *req)
+{
+       struct clk_rcg2 *rcg = to_clk_rcg2(hw);
+       int ret;
+
+       if (!rcg->freq_tbl) {
+               ret = clk_rcg2_dfs_populate_freq_table(rcg);
+               if (ret) {
+                       pr_err("Failed to update DFS tables for %s\n",
+                                       clk_hw_get_name(hw));
+                       return ret;
+               }
+       }
+
+       return clk_rcg2_determine_rate(hw, req);
+}
+
+static unsigned long
+clk_rcg2_dfs_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
+{
+       struct clk_rcg2 *rcg = to_clk_rcg2(hw);
+       u32 level, mask, cfg, m = 0, n = 0, mode, pre_div;
+
+       regmap_read(rcg->clkr.regmap,
+                   rcg->cmd_rcgr + SE_CMD_DFSR_OFFSET, &level);
+       level &= GENMASK(4, 1);
+       level >>= 1;
+
+       if (rcg->freq_tbl)
+               return rcg->freq_tbl[level].freq;
+
+       /*
+        * Assume that parent_rate is actually the parent because
+        * we can't do any better at figuring it out when the table
+        * hasn't been populated yet. We only populate the table
+        * in determine_rate because we can't guarantee the parents
+        * will be registered with the framework until then.
+        */
+       regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + SE_PERF_DFSR(level),
+                   &cfg);
+
+       mask = BIT(rcg->hid_width) - 1;
+       pre_div = 1;
+       if (cfg & mask)
+               pre_div = cfg & mask;
+
+       mode = cfg & CFG_MODE_MASK;
+       mode >>= CFG_MODE_SHIFT;
+       if (mode) {
+               mask = BIT(rcg->mnd_width) - 1;
+               regmap_read(rcg->clkr.regmap,
+                           rcg->cmd_rcgr + SE_PERF_M_DFSR(level), &m);
+               m &= mask;
+
+               regmap_read(rcg->clkr.regmap,
+                           rcg->cmd_rcgr + SE_PERF_N_DFSR(level), &n);
+               n = ~n;
+               n &= mask;
+               n += m;
+       }
+
+       return calc_rate(parent_rate, m, n, mode, pre_div);
+}
+
+static const struct clk_ops clk_rcg2_dfs_ops = {
+       .is_enabled = clk_rcg2_is_enabled,
+       .get_parent = clk_rcg2_get_parent,
+       .determine_rate = clk_rcg2_dfs_determine_rate,
+       .recalc_rate = clk_rcg2_dfs_recalc_rate,
+};
+
+static int clk_rcg2_enable_dfs(const struct clk_rcg_dfs_data *data,
+                              struct regmap *regmap)
+{
+       struct clk_rcg2 *rcg = data->rcg;
+       struct clk_init_data *init = data->init;
+       u32 val;
+       int ret;
+
+       ret = regmap_read(regmap, rcg->cmd_rcgr + SE_CMD_DFSR_OFFSET, &val);
+       if (ret)
+               return -EINVAL;
+
+       if (!(val & SE_CMD_DFS_EN))
+               return 0;
+
+       /*
+        * Rate changes with consumer writing a register in
+        * their own I/O region
+        */
+       init->flags |= CLK_GET_RATE_NOCACHE;
+       init->ops = &clk_rcg2_dfs_ops;
+
+       rcg->freq_tbl = NULL;
+
+       pr_debug("DFS registered for clk %s\n", init->name);
+
+       return 0;
+}
+
+int qcom_cc_register_rcg_dfs(struct regmap *regmap,
+                            const struct clk_rcg_dfs_data *rcgs, size_t len)
+{
+       int i, ret;
+
+       for (i = 0; i < len; i++) {
+               ret = clk_rcg2_enable_dfs(&rcgs[i], regmap);
+               if (ret) {
+                       const char *name = rcgs[i].init->name;
+
+                       pr_err("DFS register failed for clk %s\n", name);
+                       return ret;
+               }
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(qcom_cc_register_rcg_dfs);
index 5f61225657abbe879781ecf09d6cdbe67bb0ed58..33d1bc5c6a4654bae03399718a525a270acd74ba 100644 (file)
@@ -30,6 +30,7 @@
 #include "clk-pll.h"
 #include "clk-rcg.h"
 #include "clk-branch.h"
+#include "clk-hfpll.h"
 #include "reset.h"
 
 static struct clk_pll pll0 = {
@@ -113,6 +114,84 @@ static struct clk_regmap pll8_vote = {
        },
 };
 
+static struct hfpll_data hfpll0_data = {
+       .mode_reg = 0x3200,
+       .l_reg = 0x3208,
+       .m_reg = 0x320c,
+       .n_reg = 0x3210,
+       .config_reg = 0x3204,
+       .status_reg = 0x321c,
+       .config_val = 0x7845c665,
+       .droop_reg = 0x3214,
+       .droop_val = 0x0108c000,
+       .min_rate = 600000000UL,
+       .max_rate = 1800000000UL,
+};
+
+static struct clk_hfpll hfpll0 = {
+       .d = &hfpll0_data,
+       .clkr.hw.init = &(struct clk_init_data){
+               .parent_names = (const char *[]){ "pxo" },
+               .num_parents = 1,
+               .name = "hfpll0",
+               .ops = &clk_ops_hfpll,
+               .flags = CLK_IGNORE_UNUSED,
+       },
+       .lock = __SPIN_LOCK_UNLOCKED(hfpll0.lock),
+};
+
+static struct hfpll_data hfpll1_data = {
+       .mode_reg = 0x3240,
+       .l_reg = 0x3248,
+       .m_reg = 0x324c,
+       .n_reg = 0x3250,
+       .config_reg = 0x3244,
+       .status_reg = 0x325c,
+       .config_val = 0x7845c665,
+       .droop_reg = 0x3314,
+       .droop_val = 0x0108c000,
+       .min_rate = 600000000UL,
+       .max_rate = 1800000000UL,
+};
+
+static struct clk_hfpll hfpll1 = {
+       .d = &hfpll1_data,
+       .clkr.hw.init = &(struct clk_init_data){
+               .parent_names = (const char *[]){ "pxo" },
+               .num_parents = 1,
+               .name = "hfpll1",
+               .ops = &clk_ops_hfpll,
+               .flags = CLK_IGNORE_UNUSED,
+       },
+       .lock = __SPIN_LOCK_UNLOCKED(hfpll1.lock),
+};
+
+static struct hfpll_data hfpll_l2_data = {
+       .mode_reg = 0x3300,
+       .l_reg = 0x3308,
+       .m_reg = 0x330c,
+       .n_reg = 0x3310,
+       .config_reg = 0x3304,
+       .status_reg = 0x331c,
+       .config_val = 0x7845c665,
+       .droop_reg = 0x3314,
+       .droop_val = 0x0108c000,
+       .min_rate = 600000000UL,
+       .max_rate = 1800000000UL,
+};
+
+static struct clk_hfpll hfpll_l2 = {
+       .d = &hfpll_l2_data,
+       .clkr.hw.init = &(struct clk_init_data){
+               .parent_names = (const char *[]){ "pxo" },
+               .num_parents = 1,
+               .name = "hfpll_l2",
+               .ops = &clk_ops_hfpll,
+               .flags = CLK_IGNORE_UNUSED,
+       },
+       .lock = __SPIN_LOCK_UNLOCKED(hfpll_l2.lock),
+};
+
 static struct clk_pll pll14 = {
        .l_reg = 0x31c4,
        .m_reg = 0x31c8,
@@ -2797,6 +2876,9 @@ static struct clk_regmap *gcc_ipq806x_clks[] = {
        [UBI32_CORE2_CLK_SRC] = &ubi32_core2_src_clk.clkr,
        [NSSTCM_CLK_SRC] = &nss_tcm_src.clkr,
        [NSSTCM_CLK] = &nss_tcm_clk.clkr,
+       [PLL9] = &hfpll0.clkr,
+       [PLL10] = &hfpll1.clkr,
+       [PLL12] = &hfpll_l2.clkr,
 };
 
 static const struct qcom_reset_map gcc_ipq806x_resets[] = {
index fd495e0471bb4d9825ba453c235b4e40fb0d6bca..399474755654f3c0809f0d4d8878d007e104a90c 100644 (file)
@@ -30,6 +30,7 @@
 #include "clk-pll.h"
 #include "clk-rcg.h"
 #include "clk-branch.h"
+#include "clk-hfpll.h"
 #include "reset.h"
 
 static struct clk_pll pll3 = {
@@ -86,6 +87,164 @@ static struct clk_regmap pll8_vote = {
        },
 };
 
+static struct hfpll_data hfpll0_data = {
+       .mode_reg = 0x3200,
+       .l_reg = 0x3208,
+       .m_reg = 0x320c,
+       .n_reg = 0x3210,
+       .config_reg = 0x3204,
+       .status_reg = 0x321c,
+       .config_val = 0x7845c665,
+       .droop_reg = 0x3214,
+       .droop_val = 0x0108c000,
+       .min_rate = 600000000UL,
+       .max_rate = 1800000000UL,
+};
+
+static struct clk_hfpll hfpll0 = {
+       .d = &hfpll0_data,
+       .clkr.hw.init = &(struct clk_init_data){
+               .parent_names = (const char *[]){ "pxo" },
+               .num_parents = 1,
+               .name = "hfpll0",
+               .ops = &clk_ops_hfpll,
+               .flags = CLK_IGNORE_UNUSED,
+       },
+       .lock = __SPIN_LOCK_UNLOCKED(hfpll0.lock),
+};
+
+static struct hfpll_data hfpll1_8064_data = {
+       .mode_reg = 0x3240,
+       .l_reg = 0x3248,
+       .m_reg = 0x324c,
+       .n_reg = 0x3250,
+       .config_reg = 0x3244,
+       .status_reg = 0x325c,
+       .config_val = 0x7845c665,
+       .droop_reg = 0x3254,
+       .droop_val = 0x0108c000,
+       .min_rate = 600000000UL,
+       .max_rate = 1800000000UL,
+};
+
+static struct hfpll_data hfpll1_data = {
+       .mode_reg = 0x3300,
+       .l_reg = 0x3308,
+       .m_reg = 0x330c,
+       .n_reg = 0x3310,
+       .config_reg = 0x3304,
+       .status_reg = 0x331c,
+       .config_val = 0x7845c665,
+       .droop_reg = 0x3314,
+       .droop_val = 0x0108c000,
+       .min_rate = 600000000UL,
+       .max_rate = 1800000000UL,
+};
+
+static struct clk_hfpll hfpll1 = {
+       .d = &hfpll1_data,
+       .clkr.hw.init = &(struct clk_init_data){
+               .parent_names = (const char *[]){ "pxo" },
+               .num_parents = 1,
+               .name = "hfpll1",
+               .ops = &clk_ops_hfpll,
+               .flags = CLK_IGNORE_UNUSED,
+       },
+       .lock = __SPIN_LOCK_UNLOCKED(hfpll1.lock),
+};
+
+static struct hfpll_data hfpll2_data = {
+       .mode_reg = 0x3280,
+       .l_reg = 0x3288,
+       .m_reg = 0x328c,
+       .n_reg = 0x3290,
+       .config_reg = 0x3284,
+       .status_reg = 0x329c,
+       .config_val = 0x7845c665,
+       .droop_reg = 0x3294,
+       .droop_val = 0x0108c000,
+       .min_rate = 600000000UL,
+       .max_rate = 1800000000UL,
+};
+
+static struct clk_hfpll hfpll2 = {
+       .d = &hfpll2_data,
+       .clkr.hw.init = &(struct clk_init_data){
+               .parent_names = (const char *[]){ "pxo" },
+               .num_parents = 1,
+               .name = "hfpll2",
+               .ops = &clk_ops_hfpll,
+               .flags = CLK_IGNORE_UNUSED,
+       },
+       .lock = __SPIN_LOCK_UNLOCKED(hfpll2.lock),
+};
+
+static struct hfpll_data hfpll3_data = {
+       .mode_reg = 0x32c0,
+       .l_reg = 0x32c8,
+       .m_reg = 0x32cc,
+       .n_reg = 0x32d0,
+       .config_reg = 0x32c4,
+       .status_reg = 0x32dc,
+       .config_val = 0x7845c665,
+       .droop_reg = 0x32d4,
+       .droop_val = 0x0108c000,
+       .min_rate = 600000000UL,
+       .max_rate = 1800000000UL,
+};
+
+static struct clk_hfpll hfpll3 = {
+       .d = &hfpll3_data,
+       .clkr.hw.init = &(struct clk_init_data){
+               .parent_names = (const char *[]){ "pxo" },
+               .num_parents = 1,
+               .name = "hfpll3",
+               .ops = &clk_ops_hfpll,
+               .flags = CLK_IGNORE_UNUSED,
+       },
+       .lock = __SPIN_LOCK_UNLOCKED(hfpll3.lock),
+};
+
+static struct hfpll_data hfpll_l2_8064_data = {
+       .mode_reg = 0x3300,
+       .l_reg = 0x3308,
+       .m_reg = 0x330c,
+       .n_reg = 0x3310,
+       .config_reg = 0x3304,
+       .status_reg = 0x331c,
+       .config_val = 0x7845c665,
+       .droop_reg = 0x3314,
+       .droop_val = 0x0108c000,
+       .min_rate = 600000000UL,
+       .max_rate = 1800000000UL,
+};
+
+static struct hfpll_data hfpll_l2_data = {
+       .mode_reg = 0x3400,
+       .l_reg = 0x3408,
+       .m_reg = 0x340c,
+       .n_reg = 0x3410,
+       .config_reg = 0x3404,
+       .status_reg = 0x341c,
+       .config_val = 0x7845c665,
+       .droop_reg = 0x3414,
+       .droop_val = 0x0108c000,
+       .min_rate = 600000000UL,
+       .max_rate = 1800000000UL,
+};
+
+static struct clk_hfpll hfpll_l2 = {
+       .d = &hfpll_l2_data,
+       .clkr.hw.init = &(struct clk_init_data){
+               .parent_names = (const char *[]){ "pxo" },
+               .num_parents = 1,
+               .name = "hfpll_l2",
+               .ops = &clk_ops_hfpll,
+               .flags = CLK_IGNORE_UNUSED,
+       },
+       .lock = __SPIN_LOCK_UNLOCKED(hfpll_l2.lock),
+};
+
 static struct clk_pll pll14 = {
        .l_reg = 0x31c4,
        .m_reg = 0x31c8,
@@ -3107,6 +3266,9 @@ static struct clk_regmap *gcc_msm8960_clks[] = {
        [PMIC_ARB1_H_CLK] = &pmic_arb1_h_clk.clkr,
        [PMIC_SSBI2_CLK] = &pmic_ssbi2_clk.clkr,
        [RPM_MSG_RAM_H_CLK] = &rpm_msg_ram_h_clk.clkr,
+       [PLL9] = &hfpll0.clkr,
+       [PLL10] = &hfpll1.clkr,
+       [PLL12] = &hfpll_l2.clkr,
 };
 
 static const struct qcom_reset_map gcc_msm8960_resets[] = {
@@ -3318,6 +3480,11 @@ static struct clk_regmap *gcc_apq8064_clks[] = {
        [PMIC_ARB1_H_CLK] = &pmic_arb1_h_clk.clkr,
        [PMIC_SSBI2_CLK] = &pmic_ssbi2_clk.clkr,
        [RPM_MSG_RAM_H_CLK] = &rpm_msg_ram_h_clk.clkr,
+       [PLL9] = &hfpll0.clkr,
+       [PLL10] = &hfpll1.clkr,
+       [PLL12] = &hfpll_l2.clkr,
+       [PLL16] = &hfpll2.clkr,
+       [PLL17] = &hfpll3.clkr,
 };
 
 static const struct qcom_reset_map gcc_apq8064_resets[] = {
@@ -3477,6 +3644,11 @@ static int gcc_msm8960_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
+       if (match->data == &gcc_apq8064_desc) {
+               hfpll1.d = &hfpll1_8064_data;
+               hfpll_l2.d = &hfpll_l2_8064_data;
+       }
+
        tsens = platform_device_register_data(&pdev->dev, "qcom-tsens", -1,
                                              NULL, 0);
        if (IS_ERR(tsens))
index 9a3290fdd01b18eb0b8eb6a7ab90a16550fd9c3c..9d136172c27ca460172bd913af850ee4a3e32d55 100644 (file)
@@ -260,6 +260,36 @@ static struct clk_alpha_pll_postdiv gpll0 = {
        },
 };
 
+static struct clk_branch gcc_mmss_gpll0_div_clk = {
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mmss_gpll0_div_clk",
+                       .parent_names = (const char *[]){ "gpll0" },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mss_gpll0_div_clk = {
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(2),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mss_gpll0_div_clk",
+                       .parent_names = (const char *[]){ "gpll0" },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops
+               },
+       },
+};
+
 static struct clk_alpha_pll gpll4_early = {
        .offset = 0x77000,
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
@@ -2951,6 +2981,20 @@ static struct clk_branch gcc_smmu_aggre0_ahb_clk = {
        },
 };
 
+static struct clk_branch gcc_aggre1_pnoc_ahb_clk = {
+       .halt_reg = 0x82014,
+       .clkr = {
+               .enable_reg = 0x82014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_aggre1_pnoc_ahb_clk",
+                       .parent_names = (const char *[]){ "periph_noc_clk_src" },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
 static struct clk_branch gcc_aggre2_ufs_axi_clk = {
        .halt_reg = 0x83014,
        .clkr = {
@@ -2981,6 +3025,34 @@ static struct clk_branch gcc_aggre2_usb3_axi_clk = {
        },
 };
 
+static struct clk_branch gcc_dcc_ahb_clk = {
+       .halt_reg = 0x84004,
+       .clkr = {
+               .enable_reg = 0x84004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_dcc_ahb_clk",
+                       .parent_names = (const char *[]){ "config_noc_clk_src" },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_aggre0_noc_mpu_cfg_ahb_clk = {
+       .halt_reg = 0x85000,
+       .clkr = {
+               .enable_reg = 0x85000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_aggre0_noc_mpu_cfg_ahb_clk",
+                       .parent_names = (const char *[]){ "config_noc_clk_src" },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
 static struct clk_branch gcc_qspi_ahb_clk = {
        .halt_reg = 0x8b004,
        .clkr = {
@@ -3039,6 +3111,20 @@ static struct clk_branch gcc_hdmi_clkref_clk = {
        },
 };
 
+static struct clk_branch gcc_edp_clkref_clk = {
+       .halt_reg = 0x88004,
+       .clkr = {
+               .enable_reg = 0x88004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_edp_clkref_clk",
+                       .parent_names = (const char *[]){ "xo" },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
 static struct clk_branch gcc_ufs_clkref_clk = {
        .halt_reg = 0x88008,
        .clkr = {
@@ -3095,6 +3181,62 @@ static struct clk_branch gcc_rx1_usb2_clkref_clk = {
        },
 };
 
+static struct clk_branch gcc_mss_cfg_ahb_clk = {
+       .halt_reg = 0x8a000,
+       .clkr = {
+               .enable_reg = 0x8a000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mss_cfg_ahb_clk",
+                       .parent_names = (const char *[]){ "config_noc_clk_src" },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mss_mnoc_bimc_axi_clk = {
+       .halt_reg = 0x8a004,
+       .clkr = {
+               .enable_reg = 0x8a004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mss_mnoc_bimc_axi_clk",
+                       .parent_names = (const char *[]){ "system_noc_clk_src" },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mss_snoc_axi_clk = {
+       .halt_reg = 0x8a024,
+       .clkr = {
+               .enable_reg = 0x8a024,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mss_snoc_axi_clk",
+                       .parent_names = (const char *[]){ "system_noc_clk_src" },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mss_q6_bimc_axi_clk = {
+       .halt_reg = 0x8a028,
+       .clkr = {
+               .enable_reg = 0x8a028,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mss_q6_bimc_axi_clk",
+                       .parent_names = (const char *[]){ "system_noc_clk_src" },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
 static struct clk_hw *gcc_msm8996_hws[] = {
        &xo.hw,
        &gpll0_early_div.hw,
@@ -3355,6 +3497,7 @@ static struct clk_regmap *gcc_msm8996_clocks[] = {
        [GCC_AGGRE0_CNOC_AHB_CLK] = &gcc_aggre0_cnoc_ahb_clk.clkr,
        [GCC_SMMU_AGGRE0_AXI_CLK] = &gcc_smmu_aggre0_axi_clk.clkr,
        [GCC_SMMU_AGGRE0_AHB_CLK] = &gcc_smmu_aggre0_ahb_clk.clkr,
+       [GCC_AGGRE1_PNOC_AHB_CLK] = &gcc_aggre1_pnoc_ahb_clk.clkr,
        [GCC_AGGRE2_UFS_AXI_CLK] = &gcc_aggre2_ufs_axi_clk.clkr,
        [GCC_AGGRE2_USB3_AXI_CLK] = &gcc_aggre2_usb3_axi_clk.clkr,
        [GCC_QSPI_AHB_CLK] = &gcc_qspi_ahb_clk.clkr,
@@ -3365,6 +3508,15 @@ static struct clk_regmap *gcc_msm8996_clocks[] = {
        [GCC_PCIE_CLKREF_CLK] = &gcc_pcie_clkref_clk.clkr,
        [GCC_RX2_USB2_CLKREF_CLK] = &gcc_rx2_usb2_clkref_clk.clkr,
        [GCC_RX1_USB2_CLKREF_CLK] = &gcc_rx1_usb2_clkref_clk.clkr,
+       [GCC_EDP_CLKREF_CLK] = &gcc_edp_clkref_clk.clkr,
+       [GCC_MSS_CFG_AHB_CLK] = &gcc_mss_cfg_ahb_clk.clkr,
+       [GCC_MSS_Q6_BIMC_AXI_CLK] = &gcc_mss_q6_bimc_axi_clk.clkr,
+       [GCC_MSS_SNOC_AXI_CLK] = &gcc_mss_snoc_axi_clk.clkr,
+       [GCC_MSS_MNOC_BIMC_AXI_CLK] = &gcc_mss_mnoc_bimc_axi_clk.clkr,
+       [GCC_DCC_AHB_CLK] = &gcc_dcc_ahb_clk.clkr,
+       [GCC_AGGRE0_NOC_MPU_CFG_AHB_CLK] = &gcc_aggre0_noc_mpu_cfg_ahb_clk.clkr,
+       [GCC_MMSS_GPLL0_DIV_CLK] = &gcc_mmss_gpll0_div_clk.clkr,
+       [GCC_MSS_GPLL0_DIV_CLK] = &gcc_mss_gpll0_div_clk.clkr,
 };
 
 static struct gdsc *gcc_msm8996_gdscs[] = {
diff --git a/drivers/clk/qcom/gcc-qcs404.c b/drivers/clk/qcom/gcc-qcs404.c
new file mode 100644 (file)
index 0000000..e4ca6a4
--- /dev/null
@@ -0,0 +1,2744 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2018, The Linux Foundation. All rights reserved.
+ */
+
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/clk-provider.h>
+#include <linux/regmap.h>
+#include <linux/reset-controller.h>
+
+#include <dt-bindings/clock/qcom,gcc-qcs404.h>
+
+#include "clk-alpha-pll.h"
+#include "clk-branch.h"
+#include "clk-pll.h"
+#include "clk-rcg.h"
+#include "clk-regmap.h"
+#include "common.h"
+#include "reset.h"
+
+enum {
+       P_CORE_BI_PLL_TEST_SE,
+       P_DSI0_PHY_PLL_OUT_BYTECLK,
+       P_DSI0_PHY_PLL_OUT_DSICLK,
+       P_GPLL0_OUT_AUX,
+       P_GPLL0_OUT_MAIN,
+       P_GPLL1_OUT_MAIN,
+       P_GPLL3_OUT_MAIN,
+       P_GPLL4_OUT_AUX,
+       P_GPLL4_OUT_MAIN,
+       P_GPLL6_OUT_AUX,
+       P_HDMI_PHY_PLL_CLK,
+       P_PCIE_0_PIPE_CLK,
+       P_SLEEP_CLK,
+       P_XO,
+};
+
+static const struct parent_map gcc_parent_map_0[] = {
+       { P_XO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_CORE_BI_PLL_TEST_SE, 7 },
+};
+
+static const char * const gcc_parent_names_0[] = {
+       "cxo",
+       "gpll0_out_main",
+       "core_bi_pll_test_se",
+};
+
+static const char * const gcc_parent_names_ao_0[] = {
+       "cxo",
+       "gpll0_ao_out_main",
+       "core_bi_pll_test_se",
+};
+
+static const struct parent_map gcc_parent_map_1[] = {
+       { P_XO, 0 },
+       { P_CORE_BI_PLL_TEST_SE, 7 },
+};
+
+static const char * const gcc_parent_names_1[] = {
+       "cxo",
+       "core_bi_pll_test_se",
+};
+
+static const struct parent_map gcc_parent_map_2[] = {
+       { P_XO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL6_OUT_AUX, 2 },
+       { P_SLEEP_CLK, 6 },
+};
+
+static const char * const gcc_parent_names_2[] = {
+       "cxo",
+       "gpll0_out_main",
+       "gpll6_out_aux",
+       "sleep_clk",
+};
+
+static const struct parent_map gcc_parent_map_3[] = {
+       { P_XO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL6_OUT_AUX, 2 },
+       { P_CORE_BI_PLL_TEST_SE, 7 },
+};
+
+static const char * const gcc_parent_names_3[] = {
+       "cxo",
+       "gpll0_out_main",
+       "gpll6_out_aux",
+       "core_bi_pll_test_se",
+};
+
+static const struct parent_map gcc_parent_map_4[] = {
+       { P_XO, 0 },
+       { P_GPLL1_OUT_MAIN, 1 },
+       { P_CORE_BI_PLL_TEST_SE, 7 },
+};
+
+static const char * const gcc_parent_names_4[] = {
+       "cxo",
+       "gpll1_out_main",
+       "core_bi_pll_test_se",
+};
+
+static const struct parent_map gcc_parent_map_5[] = {
+       { P_XO, 0 },
+       { P_DSI0_PHY_PLL_OUT_BYTECLK, 1 },
+       { P_GPLL0_OUT_AUX, 2 },
+       { P_CORE_BI_PLL_TEST_SE, 7 },
+};
+
+static const char * const gcc_parent_names_5[] = {
+       "cxo",
+       "dsi0pll_byteclk_src",
+       "gpll0_out_aux",
+       "core_bi_pll_test_se",
+};
+
+static const struct parent_map gcc_parent_map_6[] = {
+       { P_XO, 0 },
+       { P_DSI0_PHY_PLL_OUT_BYTECLK, 2 },
+       { P_GPLL0_OUT_AUX, 3 },
+       { P_CORE_BI_PLL_TEST_SE, 7 },
+};
+
+static const char * const gcc_parent_names_6[] = {
+       "cxo",
+       "dsi0_phy_pll_out_byteclk",
+       "gpll0_out_aux",
+       "core_bi_pll_test_se",
+};
+
+static const struct parent_map gcc_parent_map_7[] = {
+       { P_XO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL3_OUT_MAIN, 2 },
+       { P_GPLL6_OUT_AUX, 3 },
+       { P_GPLL4_OUT_AUX, 4 },
+       { P_CORE_BI_PLL_TEST_SE, 7 },
+};
+
+static const char * const gcc_parent_names_7[] = {
+       "cxo",
+       "gpll0_out_main",
+       "gpll3_out_main",
+       "gpll6_out_aux",
+       "gpll4_out_aux",
+       "core_bi_pll_test_se",
+};
+
+static const struct parent_map gcc_parent_map_8[] = {
+       { P_XO, 0 },
+       { P_HDMI_PHY_PLL_CLK, 1 },
+       { P_CORE_BI_PLL_TEST_SE, 7 },
+};
+
+static const char * const gcc_parent_names_8[] = {
+       "cxo",
+       "hdmi_phy_pll_clk",
+       "core_bi_pll_test_se",
+};
+
+static const struct parent_map gcc_parent_map_9[] = {
+       { P_XO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_DSI0_PHY_PLL_OUT_DSICLK, 2 },
+       { P_GPLL6_OUT_AUX, 3 },
+       { P_CORE_BI_PLL_TEST_SE, 7 },
+};
+
+static const char * const gcc_parent_names_9[] = {
+       "cxo",
+       "gpll0_out_main",
+       "dsi0_phy_pll_out_dsiclk",
+       "gpll6_out_aux",
+       "core_bi_pll_test_se",
+};
+
+static const struct parent_map gcc_parent_map_10[] = {
+       { P_XO, 0 },
+       { P_SLEEP_CLK, 1 },
+       { P_CORE_BI_PLL_TEST_SE, 7 },
+};
+
+static const char * const gcc_parent_names_10[] = {
+       "cxo",
+       "sleep_clk",
+       "core_bi_pll_test_se",
+};
+
+static const struct parent_map gcc_parent_map_11[] = {
+       { P_XO, 0 },
+       { P_PCIE_0_PIPE_CLK, 1 },
+       { P_CORE_BI_PLL_TEST_SE, 7 },
+};
+
+static const char * const gcc_parent_names_11[] = {
+       "cxo",
+       "pcie_0_pipe_clk",
+       "core_bi_pll_test_se",
+};
+
+static const struct parent_map gcc_parent_map_12[] = {
+       { P_XO, 0 },
+       { P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
+       { P_GPLL0_OUT_AUX, 2 },
+       { P_CORE_BI_PLL_TEST_SE, 7 },
+};
+
+static const char * const gcc_parent_names_12[] = {
+       "cxo",
+       "dsi0pll_pclk_src",
+       "gpll0_out_aux",
+       "core_bi_pll_test_se",
+};
+
+static const struct parent_map gcc_parent_map_13[] = {
+       { P_XO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL4_OUT_MAIN, 2 },
+       { P_GPLL6_OUT_AUX, 3 },
+       { P_CORE_BI_PLL_TEST_SE, 7 },
+};
+
+static const char * const gcc_parent_names_13[] = {
+       "cxo",
+       "gpll0_out_main",
+       "gpll4_out_main",
+       "gpll6_out_aux",
+       "core_bi_pll_test_se",
+};
+
+static const struct parent_map gcc_parent_map_14[] = {
+       { P_XO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL4_OUT_AUX, 2 },
+       { P_CORE_BI_PLL_TEST_SE, 7 },
+};
+
+static const char * const gcc_parent_names_14[] = {
+       "cxo",
+       "gpll0_out_main",
+       "gpll4_out_aux",
+       "core_bi_pll_test_se",
+};
+
+static const struct parent_map gcc_parent_map_15[] = {
+       { P_XO, 0 },
+       { P_GPLL0_OUT_AUX, 2 },
+       { P_CORE_BI_PLL_TEST_SE, 7 },
+};
+
+static const char * const gcc_parent_names_15[] = {
+       "cxo",
+       "gpll0_out_aux",
+       "core_bi_pll_test_se",
+};
+
+static struct clk_fixed_factor cxo = {
+       .mult = 1,
+       .div = 1,
+       .hw.init = &(struct clk_init_data){
+               .name = "cxo",
+               .parent_names = (const char *[]){ "xo_board" },
+               .num_parents = 1,
+               .ops = &clk_fixed_factor_ops,
+       },
+};
+
+static struct clk_alpha_pll gpll0_sleep_clk_src = {
+       .offset = 0x21000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .enable_reg = 0x45008,
+               .enable_mask = BIT(23),
+               .enable_is_inverted = true,
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll0_sleep_clk_src",
+                       .parent_names = (const char *[]){ "cxo" },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll gpll0_out_main = {
+       .offset = 0x21000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .flags = SUPPORTS_FSM_MODE,
+       .clkr = {
+               .enable_reg = 0x45000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll0_out_main",
+                       .parent_names = (const char *[])
+                                       { "gpll0_sleep_clk_src" },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll gpll0_ao_out_main = {
+       .offset = 0x21000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .flags = SUPPORTS_FSM_MODE,
+       .clkr = {
+               .enable_reg = 0x45000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll0_ao_out_main",
+                       .parent_names = (const char *[]){ "cxo" },
+                       .num_parents = 1,
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll gpll1_out_main = {
+       .offset = 0x20000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .enable_reg = 0x45000,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll1_out_main",
+                       .parent_names = (const char *[]){ "cxo" },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+/* 930MHz configuration */
+static const struct alpha_pll_config gpll3_config = {
+       .l = 48,
+       .alpha = 0x0,
+       .alpha_en_mask = BIT(24),
+       .post_div_mask = 0xf << 8,
+       .post_div_val = 0x1 << 8,
+       .vco_mask = 0x3 << 20,
+       .main_output_mask = 0x1,
+       .config_ctl_val = 0x4001055b,
+};
+
+static const struct pll_vco gpll3_vco[] = {
+       { 700000000, 1400000000, 0 },
+};
+
+static struct clk_alpha_pll gpll3_out_main = {
+       .offset = 0x22000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .vco_table = gpll3_vco,
+       .num_vco = ARRAY_SIZE(gpll3_vco),
+       .clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll3_out_main",
+                       .parent_names = (const char *[]){ "cxo" },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll gpll4_out_main = {
+       .offset = 0x24000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .enable_reg = 0x45000,
+               .enable_mask = BIT(5),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll4_out_main",
+                       .parent_names = (const char *[]){ "cxo" },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static struct clk_pll gpll6 = {
+       .l_reg = 0x37004,
+       .m_reg = 0x37008,
+       .n_reg = 0x3700C,
+       .config_reg = 0x37014,
+       .mode_reg = 0x37000,
+       .status_reg = 0x3701C,
+       .status_bit = 17,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll6",
+               .parent_names = (const char *[]){ "cxo" },
+               .num_parents = 1,
+               .ops = &clk_pll_ops,
+       },
+};
+
+static struct clk_regmap gpll6_out_aux = {
+       .enable_reg = 0x45000,
+       .enable_mask = BIT(7),
+       .hw.init = &(struct clk_init_data){
+               .name = "gpll6_out_aux",
+               .parent_names = (const char *[]){ "gpll6" },
+               .num_parents = 1,
+               .ops = &clk_pll_vote_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_apss_ahb_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(50000000, P_GPLL0_OUT_MAIN, 16, 0, 0),
+       F(100000000, P_GPLL0_OUT_MAIN, 8, 0, 0),
+       F(133333333, P_GPLL0_OUT_MAIN, 6, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 apss_ahb_clk_src = {
+       .cmd_rcgr = 0x46000,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_apss_ahb_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "apss_ahb_clk_src",
+               .parent_names = gcc_parent_names_ao_0,
+               .num_parents = 3,
+               .flags = CLK_IS_CRITICAL,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_blsp1_qup0_i2c_apps_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(50000000, P_GPLL0_OUT_MAIN, 16, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 blsp1_qup0_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x602c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_blsp1_qup0_i2c_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp1_qup0_i2c_apps_clk_src",
+               .parent_names = gcc_parent_names_0,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_blsp1_qup0_spi_apps_clk_src[] = {
+       F(960000, P_XO, 10, 1, 2),
+       F(4800000, P_XO, 4, 0, 0),
+       F(9600000, P_XO, 2, 0, 0),
+       F(16000000, P_GPLL0_OUT_MAIN, 10, 1, 5),
+       F(19200000, P_XO, 1, 0, 0),
+       F(25000000, P_GPLL0_OUT_MAIN, 16, 1, 2),
+       F(50000000, P_GPLL0_OUT_MAIN, 16, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 blsp1_qup0_spi_apps_clk_src = {
+       .cmd_rcgr = 0x6034,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_blsp1_qup0_spi_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp1_qup0_spi_apps_clk_src",
+               .parent_names = gcc_parent_names_0,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_qup1_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x200c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_blsp1_qup0_i2c_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp1_qup1_i2c_apps_clk_src",
+               .parent_names = gcc_parent_names_0,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_blsp1_qup1_spi_apps_clk_src[] = {
+       F(960000,   P_XO, 10, 1, 2),
+       F(4800000,  P_XO, 4, 0, 0),
+       F(9600000,  P_XO, 2, 0, 0),
+       F(10480000, P_GPLL0_OUT_MAIN, 1, 3, 229),
+       F(16000000, P_GPLL0_OUT_MAIN, 10, 1, 5),
+       F(19200000, P_XO, 1, 0, 0),
+       F(20961000, P_GPLL0_OUT_MAIN, 1, 6, 229),
+       { }
+};
+
+static struct clk_rcg2 blsp1_qup1_spi_apps_clk_src = {
+       .cmd_rcgr = 0x2024,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp1_qup1_spi_apps_clk_src",
+               .parent_names = gcc_parent_names_0,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_qup2_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x3000,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_blsp1_qup0_i2c_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp1_qup2_i2c_apps_clk_src",
+               .parent_names = gcc_parent_names_0,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_blsp1_qup2_spi_apps_clk_src[] = {
+       F(960000,   P_XO, 10, 1, 2),
+       F(4800000,  P_XO, 4, 0, 0),
+       F(9600000,  P_XO, 2, 0, 0),
+       F(15000000, P_GPLL0_OUT_MAIN, 1,  3, 160),
+       F(16000000, P_GPLL0_OUT_MAIN, 10, 1, 5),
+       F(19200000, P_XO, 1, 0, 0),
+       F(25000000, P_GPLL0_OUT_MAIN, 16, 1, 2),
+       F(30000000, P_GPLL0_OUT_MAIN, 1,  3, 80),
+       { }
+};
+
+static struct clk_rcg2 blsp1_qup2_spi_apps_clk_src = {
+       .cmd_rcgr = 0x3014,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_blsp1_qup2_spi_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp1_qup2_spi_apps_clk_src",
+               .parent_names = gcc_parent_names_0,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_qup3_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x4000,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_blsp1_qup0_i2c_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp1_qup3_i2c_apps_clk_src",
+               .parent_names = gcc_parent_names_0,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_qup3_spi_apps_clk_src = {
+       .cmd_rcgr = 0x4024,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_blsp1_qup0_spi_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp1_qup3_spi_apps_clk_src",
+               .parent_names = gcc_parent_names_0,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_qup4_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x5000,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_blsp1_qup0_i2c_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp1_qup4_i2c_apps_clk_src",
+               .parent_names = gcc_parent_names_0,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_qup4_spi_apps_clk_src = {
+       .cmd_rcgr = 0x5024,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_blsp1_qup0_spi_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp1_qup4_spi_apps_clk_src",
+               .parent_names = gcc_parent_names_0,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_blsp1_uart0_apps_clk_src[] = {
+       F(3686400, P_GPLL0_OUT_MAIN, 1, 72, 15625),
+       F(7372800, P_GPLL0_OUT_MAIN, 1, 144, 15625),
+       F(14745600, P_GPLL0_OUT_MAIN, 1, 288, 15625),
+       F(16000000, P_GPLL0_OUT_MAIN, 10, 1, 5),
+       F(19200000, P_XO, 1, 0, 0),
+       F(24000000, P_GPLL0_OUT_MAIN, 1, 3, 100),
+       F(25000000, P_GPLL0_OUT_MAIN, 16, 1, 2),
+       F(32000000, P_GPLL0_OUT_MAIN, 1, 1, 25),
+       F(40000000, P_GPLL0_OUT_MAIN, 1, 1, 20),
+       F(46400000, P_GPLL0_OUT_MAIN, 1, 29, 500),
+       F(48000000, P_GPLL0_OUT_MAIN, 1, 3, 50),
+       F(51200000, P_GPLL0_OUT_MAIN, 1, 8, 125),
+       F(56000000, P_GPLL0_OUT_MAIN, 1, 7, 100),
+       F(58982400, P_GPLL0_OUT_MAIN, 1, 1152, 15625),
+       F(60000000, P_GPLL0_OUT_MAIN, 1, 3, 40),
+       F(64000000, P_GPLL0_OUT_MAIN, 1, 2, 25),
+       { }
+};
+
+static struct clk_rcg2 blsp1_uart0_apps_clk_src = {
+       .cmd_rcgr = 0x600c,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_blsp1_uart0_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp1_uart0_apps_clk_src",
+               .parent_names = gcc_parent_names_0,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_uart1_apps_clk_src = {
+       .cmd_rcgr = 0x2044,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_blsp1_uart0_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp1_uart1_apps_clk_src",
+               .parent_names = gcc_parent_names_0,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_uart2_apps_clk_src = {
+       .cmd_rcgr = 0x3034,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_blsp1_uart0_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp1_uart2_apps_clk_src",
+               .parent_names = gcc_parent_names_0,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_uart3_apps_clk_src = {
+       .cmd_rcgr = 0x4014,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_blsp1_uart0_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp1_uart3_apps_clk_src",
+               .parent_names = gcc_parent_names_0,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp2_qup0_i2c_apps_clk_src = {
+       .cmd_rcgr = 0xc00c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_blsp1_qup0_i2c_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp2_qup0_i2c_apps_clk_src",
+               .parent_names = gcc_parent_names_0,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp2_qup0_spi_apps_clk_src = {
+       .cmd_rcgr = 0xc024,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_blsp1_qup0_spi_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp2_qup0_spi_apps_clk_src",
+               .parent_names = gcc_parent_names_0,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp2_uart0_apps_clk_src = {
+       .cmd_rcgr = 0xc044,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_blsp1_uart0_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp2_uart0_apps_clk_src",
+               .parent_names = gcc_parent_names_0,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 byte0_clk_src = {
+       .cmd_rcgr = 0x4d044,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_5,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "byte0_clk_src",
+               .parent_names = gcc_parent_names_5,
+               .num_parents = 4,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_byte2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_emac_clk_src[] = {
+       F(5000000,   P_GPLL1_OUT_MAIN, 2, 1, 50),
+       F(50000000,  P_GPLL1_OUT_MAIN, 10, 0, 0),
+       F(125000000, P_GPLL1_OUT_MAIN, 4, 0, 0),
+       F(250000000, P_GPLL1_OUT_MAIN, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 emac_clk_src = {
+       .cmd_rcgr = 0x4e01c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_4,
+       .freq_tbl = ftbl_emac_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "emac_clk_src",
+               .parent_names = gcc_parent_names_4,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_emac_ptp_clk_src[] = {
+       F(50000000,  P_GPLL1_OUT_MAIN, 10, 0, 0),
+       F(125000000, P_GPLL1_OUT_MAIN, 4, 0, 0),
+       F(250000000, P_GPLL1_OUT_MAIN, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 emac_ptp_clk_src = {
+       .cmd_rcgr = 0x4e014,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_4,
+       .freq_tbl = ftbl_emac_ptp_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "emac_ptp_clk_src",
+               .parent_names = gcc_parent_names_4,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_esc0_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 esc0_clk_src = {
+       .cmd_rcgr = 0x4d05c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_6,
+       .freq_tbl = ftbl_esc0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "esc0_clk_src",
+               .parent_names = gcc_parent_names_6,
+               .num_parents = 4,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gfx3d_clk_src[] = {
+       F(19200000,  P_XO, 1, 0, 0),
+       F(50000000,  P_GPLL0_OUT_MAIN, 16, 0, 0),
+       F(80000000,  P_GPLL0_OUT_MAIN, 10, 0, 0),
+       F(100000000, P_GPLL0_OUT_MAIN, 8, 0, 0),
+       F(160000000, P_GPLL0_OUT_MAIN, 5, 0, 0),
+       F(200000000, P_GPLL0_OUT_MAIN, 4, 0, 0),
+       F(228571429, P_GPLL0_OUT_MAIN, 3.5, 0, 0),
+       F(240000000, P_GPLL6_OUT_AUX,  4.5, 0, 0),
+       F(266666667, P_GPLL0_OUT_MAIN, 3, 0, 0),
+       F(270000000, P_GPLL6_OUT_AUX,  4, 0, 0),
+       F(320000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0),
+       F(400000000, P_GPLL0_OUT_MAIN, 2, 0, 0),
+       F(484800000, P_GPLL3_OUT_MAIN, 1, 0, 0),
+       F(523200000, P_GPLL3_OUT_MAIN, 1, 0, 0),
+       F(550000000, P_GPLL3_OUT_MAIN, 1, 0, 0),
+       F(598000000, P_GPLL3_OUT_MAIN, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gfx3d_clk_src = {
+       .cmd_rcgr = 0x59000,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_7,
+       .freq_tbl = ftbl_gfx3d_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gfx3d_clk_src",
+               .parent_names = gcc_parent_names_7,
+               .num_parents = 6,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gp1_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(100000000, P_GPLL0_OUT_MAIN, 8, 0, 0),
+       F(200000000, P_GPLL0_OUT_MAIN, 4, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gp1_clk_src = {
+       .cmd_rcgr = 0x8004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_2,
+       .freq_tbl = ftbl_gp1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gp1_clk_src",
+               .parent_names = gcc_parent_names_2,
+               .num_parents = 4,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gp2_clk_src = {
+       .cmd_rcgr = 0x9004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_2,
+       .freq_tbl = ftbl_gp1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gp2_clk_src",
+               .parent_names = gcc_parent_names_2,
+               .num_parents = 4,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gp3_clk_src = {
+       .cmd_rcgr = 0xa004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_2,
+       .freq_tbl = ftbl_gp1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gp3_clk_src",
+               .parent_names = gcc_parent_names_2,
+               .num_parents = 4,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 hdmi_app_clk_src = {
+       .cmd_rcgr = 0x4d0e4,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_1,
+       .freq_tbl = ftbl_esc0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "hdmi_app_clk_src",
+               .parent_names = gcc_parent_names_1,
+               .num_parents = 2,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 hdmi_pclk_clk_src = {
+       .cmd_rcgr = 0x4d0dc,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_8,
+       .freq_tbl = ftbl_esc0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "hdmi_pclk_clk_src",
+               .parent_names = gcc_parent_names_8,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_mdp_clk_src[] = {
+       F(50000000, P_GPLL0_OUT_MAIN, 16, 0, 0),
+       F(80000000, P_GPLL0_OUT_MAIN, 10, 0, 0),
+       F(100000000, P_GPLL0_OUT_MAIN, 8, 0, 0),
+       F(145454545, P_GPLL0_OUT_MAIN, 5.5, 0, 0),
+       F(160000000, P_GPLL0_OUT_MAIN, 5, 0, 0),
+       F(177777778, P_GPLL0_OUT_MAIN, 4.5, 0, 0),
+       F(200000000, P_GPLL0_OUT_MAIN, 4, 0, 0),
+       F(266666667, P_GPLL0_OUT_MAIN, 3, 0, 0),
+       F(320000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 mdp_clk_src = {
+       .cmd_rcgr = 0x4d014,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_9,
+       .freq_tbl = ftbl_mdp_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "mdp_clk_src",
+               .parent_names = gcc_parent_names_9,
+               .num_parents = 5,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_pcie_0_aux_clk_src[] = {
+       F(1200000, P_XO, 16, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 pcie_0_aux_clk_src = {
+       .cmd_rcgr = 0x3e024,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_10,
+       .freq_tbl = ftbl_pcie_0_aux_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "pcie_0_aux_clk_src",
+               .parent_names = gcc_parent_names_10,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_pcie_0_pipe_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(125000000, P_PCIE_0_PIPE_CLK, 2, 0, 0),
+       F(250000000, P_PCIE_0_PIPE_CLK, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 pcie_0_pipe_clk_src = {
+       .cmd_rcgr = 0x3e01c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_11,
+       .freq_tbl = ftbl_pcie_0_pipe_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "pcie_0_pipe_clk_src",
+               .parent_names = gcc_parent_names_11,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 pclk0_clk_src = {
+       .cmd_rcgr = 0x4d000,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_12,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "pclk0_clk_src",
+               .parent_names = gcc_parent_names_12,
+               .num_parents = 4,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_pixel_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_pdm2_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(64000000, P_GPLL0_OUT_MAIN, 12.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 pdm2_clk_src = {
+       .cmd_rcgr = 0x44010,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_pdm2_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "pdm2_clk_src",
+               .parent_names = gcc_parent_names_0,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_sdcc1_apps_clk_src[] = {
+       F(144000, P_XO, 16, 3, 25),
+       F(400000, P_XO, 12, 1, 4),
+       F(20000000, P_GPLL0_OUT_MAIN, 10, 1, 4),
+       F(25000000, P_GPLL0_OUT_MAIN, 16, 1, 2),
+       F(50000000, P_GPLL0_OUT_MAIN, 16, 0, 0),
+       F(100000000, P_GPLL0_OUT_MAIN, 8, 0, 0),
+       F(177777778, P_GPLL0_OUT_MAIN, 4.5, 0, 0),
+       F(192000000, P_GPLL4_OUT_MAIN, 6, 0, 0),
+       F(200000000, P_GPLL0_OUT_MAIN, 4, 0, 0),
+       F(384000000, P_GPLL4_OUT_MAIN, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 sdcc1_apps_clk_src = {
+       .cmd_rcgr = 0x42004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_13,
+       .freq_tbl = ftbl_sdcc1_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "sdcc1_apps_clk_src",
+               .parent_names = gcc_parent_names_13,
+               .num_parents = 5,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_sdcc1_ice_core_clk_src[] = {
+       F(160000000, P_GPLL0_OUT_MAIN, 5, 0, 0),
+       F(266666667, P_GPLL0_OUT_MAIN, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 sdcc1_ice_core_clk_src = {
+       .cmd_rcgr = 0x5d000,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_3,
+       .freq_tbl = ftbl_sdcc1_ice_core_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "sdcc1_ice_core_clk_src",
+               .parent_names = gcc_parent_names_3,
+               .num_parents = 4,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_sdcc2_apps_clk_src[] = {
+       F(144000, P_XO, 16, 3, 25),
+       F(400000, P_XO, 12, 1, 4),
+       F(20000000, P_GPLL0_OUT_MAIN, 10, 1, 4),
+       F(25000000, P_GPLL0_OUT_MAIN, 16, 1, 2),
+       F(50000000, P_GPLL0_OUT_MAIN, 16, 0, 0),
+       F(100000000, P_GPLL0_OUT_MAIN, 8, 0, 0),
+       F(177777778, P_GPLL0_OUT_MAIN, 4.5, 0, 0),
+       F(200000000, P_GPLL0_OUT_MAIN, 4, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 sdcc2_apps_clk_src = {
+       .cmd_rcgr = 0x43004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_14,
+       .freq_tbl = ftbl_sdcc2_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "sdcc2_apps_clk_src",
+               .parent_names = gcc_parent_names_14,
+               .num_parents = 4,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 usb20_mock_utmi_clk_src = {
+       .cmd_rcgr = 0x41048,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_1,
+       .freq_tbl = ftbl_esc0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "usb20_mock_utmi_clk_src",
+               .parent_names = gcc_parent_names_1,
+               .num_parents = 2,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_usb30_master_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(100000000, P_GPLL0_OUT_MAIN, 8, 0, 0),
+       F(200000000, P_GPLL0_OUT_MAIN, 4, 0, 0),
+       F(266666667, P_GPLL0_OUT_MAIN, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 usb30_master_clk_src = {
+       .cmd_rcgr = 0x39028,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_usb30_master_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "usb30_master_clk_src",
+               .parent_names = gcc_parent_names_0,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 usb30_mock_utmi_clk_src = {
+       .cmd_rcgr = 0x3901c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_1,
+       .freq_tbl = ftbl_esc0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "usb30_mock_utmi_clk_src",
+               .parent_names = gcc_parent_names_1,
+               .num_parents = 2,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 usb3_phy_aux_clk_src = {
+       .cmd_rcgr = 0x3903c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_1,
+       .freq_tbl = ftbl_pcie_0_aux_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "usb3_phy_aux_clk_src",
+               .parent_names = gcc_parent_names_1,
+               .num_parents = 2,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_usb_hs_system_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(80000000, P_GPLL0_OUT_MAIN, 10, 0, 0),
+       F(100000000, P_GPLL0_OUT_MAIN, 8, 0, 0),
+       F(133333333, P_GPLL0_OUT_MAIN, 6, 0, 0),
+       F(177777778, P_GPLL0_OUT_MAIN, 4.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 usb_hs_system_clk_src = {
+       .cmd_rcgr = 0x41010,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_3,
+       .freq_tbl = ftbl_usb_hs_system_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "usb_hs_system_clk_src",
+               .parent_names = gcc_parent_names_3,
+               .num_parents = 4,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 vsync_clk_src = {
+       .cmd_rcgr = 0x4d02c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_15,
+       .freq_tbl = ftbl_esc0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "vsync_clk_src",
+               .parent_names = gcc_parent_names_15,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_apss_ahb_clk = {
+       .halt_reg = 0x4601c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(14),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_apss_ahb_clk",
+                       .parent_names = (const char *[]){
+                               "apss_ahb_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_apss_tcu_clk = {
+       .halt_reg = 0x5b004,
+       .halt_check = BRANCH_VOTED,
+       .clkr = {
+               .enable_reg = 0x4500c,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_apss_tcu_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_bimc_gfx_clk = {
+       .halt_reg = 0x59034,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x59034,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_bimc_gfx_clk",
+                       .ops = &clk_branch2_ops,
+                       .parent_names = (const char *[]){
+                               "gcc_apss_tcu_clk",
+                       },
+
+               },
+       },
+};
+
+static struct clk_branch gcc_bimc_gpu_clk = {
+       .halt_reg = 0x59030,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x59030,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_bimc_gpu_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_bimc_mdss_clk = {
+       .halt_reg = 0x31038,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x31038,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_bimc_mdss_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_ahb_clk = {
+       .halt_reg = 0x1008,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(10),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_dcc_clk = {
+       .halt_reg = 0x77004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x77004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_dcc_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_dcc_xo_clk = {
+       .halt_reg = 0x77008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x77008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_dcc_xo_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup0_i2c_apps_clk = {
+       .halt_reg = 0x6028,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x6028,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_qup0_i2c_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp1_qup0_i2c_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup0_spi_apps_clk = {
+       .halt_reg = 0x6024,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x6024,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_qup0_spi_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp1_qup0_spi_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup1_i2c_apps_clk = {
+       .halt_reg = 0x2008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_qup1_i2c_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp1_qup1_i2c_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup1_spi_apps_clk = {
+       .halt_reg = 0x2004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_qup1_spi_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp1_qup1_spi_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup2_i2c_apps_clk = {
+       .halt_reg = 0x3010,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3010,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_qup2_i2c_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp1_qup2_i2c_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup2_spi_apps_clk = {
+       .halt_reg = 0x300c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x300c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_qup2_spi_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp1_qup2_spi_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup3_i2c_apps_clk = {
+       .halt_reg = 0x4020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4020,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_qup3_i2c_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp1_qup3_i2c_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup3_spi_apps_clk = {
+       .halt_reg = 0x401c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x401c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_qup3_spi_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp1_qup3_spi_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup4_i2c_apps_clk = {
+       .halt_reg = 0x5020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5020,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_qup4_i2c_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp1_qup4_i2c_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup4_spi_apps_clk = {
+       .halt_reg = 0x501c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x501c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_qup4_spi_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp1_qup4_spi_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_uart0_apps_clk = {
+       .halt_reg = 0x6004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x6004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_uart0_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp1_uart0_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_uart1_apps_clk = {
+       .halt_reg = 0x203c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x203c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_uart1_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp1_uart1_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_uart2_apps_clk = {
+       .halt_reg = 0x302c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x302c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_uart2_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp1_uart2_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_uart3_apps_clk = {
+       .halt_reg = 0x400c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x400c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_uart3_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp1_uart3_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp2_ahb_clk = {
+       .halt_reg = 0xb008,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(20),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp2_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp2_qup0_i2c_apps_clk = {
+       .halt_reg = 0xc008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xc008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp2_qup0_i2c_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp2_qup0_i2c_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp2_qup0_spi_apps_clk = {
+       .halt_reg = 0xc004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xc004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp2_qup0_spi_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp2_qup0_spi_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp2_uart0_apps_clk = {
+       .halt_reg = 0xc03c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xc03c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp2_uart0_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp2_uart0_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_boot_rom_ahb_clk = {
+       .halt_reg = 0x1300c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(7),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_boot_rom_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_crypto_ahb_clk = {
+       .halt_reg = 0x16024,
+       .halt_check = BRANCH_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_crypto_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_crypto_axi_clk = {
+       .halt_reg = 0x16020,
+       .halt_check = BRANCH_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_crypto_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_crypto_clk = {
+       .halt_reg = 0x1601c,
+       .halt_check = BRANCH_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(2),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_crypto_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_eth_axi_clk = {
+       .halt_reg = 0x4e010,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4e010,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_eth_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_eth_ptp_clk = {
+       .halt_reg = 0x4e004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4e004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_eth_ptp_clk",
+                       .parent_names = (const char *[]){
+                               "emac_ptp_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_eth_rgmii_clk = {
+       .halt_reg = 0x4e008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4e008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_eth_rgmii_clk",
+                       .parent_names = (const char *[]){
+                               "emac_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_eth_slave_ahb_clk = {
+       .halt_reg = 0x4e00c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4e00c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_eth_slave_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_geni_ir_s_clk = {
+       .halt_reg = 0xf008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xf008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_geni_ir_s_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_geni_ir_h_clk = {
+       .halt_reg = 0xf004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xf004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_geni_ir_h_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gfx_tcu_clk = {
+       .halt_reg = 0x12020,
+       .halt_check = BRANCH_VOTED,
+       .clkr = {
+               .enable_reg = 0x4500C,
+               .enable_mask = BIT(2),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gfx_tcu_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gfx_tbu_clk = {
+       .halt_reg = 0x12010,
+       .halt_check = BRANCH_VOTED,
+       .clkr = {
+               .enable_reg = 0x4500C,
+               .enable_mask = BIT(3),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gfx_tbu_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gp1_clk = {
+       .halt_reg = 0x8000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gp1_clk",
+                       .parent_names = (const char *[]){
+                               "gp1_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gp2_clk = {
+       .halt_reg = 0x9000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x9000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gp2_clk",
+                       .parent_names = (const char *[]){
+                               "gp2_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gp3_clk = {
+       .halt_reg = 0xa000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xa000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gp3_clk",
+                       .parent_names = (const char *[]){
+                               "gp3_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gtcu_ahb_clk = {
+       .halt_reg = 0x12044,
+       .halt_check = BRANCH_VOTED,
+       .clkr = {
+               .enable_reg = 0x4500c,
+               .enable_mask = BIT(13),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gtcu_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mdp_tbu_clk = {
+       .halt_reg = 0x1201c,
+       .halt_check = BRANCH_VOTED,
+       .clkr = {
+               .enable_reg = 0x4500c,
+               .enable_mask = BIT(4),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mdp_tbu_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mdss_ahb_clk = {
+       .halt_reg = 0x4d07c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d07c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mdss_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mdss_axi_clk = {
+       .halt_reg = 0x4d080,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d080,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mdss_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mdss_byte0_clk = {
+       .halt_reg = 0x4d094,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d094,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mdss_byte0_clk",
+                       .parent_names = (const char *[]){
+                               "byte0_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mdss_esc0_clk = {
+       .halt_reg = 0x4d098,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d098,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mdss_esc0_clk",
+                       .parent_names = (const char *[]){
+                               "esc0_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mdss_hdmi_app_clk = {
+       .halt_reg = 0x4d0d8,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d0d8,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mdss_hdmi_app_clk",
+                       .parent_names = (const char *[]){
+                               "hdmi_app_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mdss_hdmi_pclk_clk = {
+       .halt_reg = 0x4d0d4,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d0d4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mdss_hdmi_pclk_clk",
+                       .parent_names = (const char *[]){
+                               "hdmi_pclk_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mdss_mdp_clk = {
+       .halt_reg = 0x4d088,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d088,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mdss_mdp_clk",
+                       .parent_names = (const char *[]){
+                               "mdp_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mdss_pclk0_clk = {
+       .halt_reg = 0x4d084,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d084,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mdss_pclk0_clk",
+                       .parent_names = (const char *[]){
+                               "pclk0_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mdss_vsync_clk = {
+       .halt_reg = 0x4d090,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d090,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mdss_vsync_clk",
+                       .parent_names = (const char *[]){
+                               "vsync_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_oxili_ahb_clk = {
+       .halt_reg = 0x59028,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x59028,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_oxili_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_oxili_gfx3d_clk = {
+       .halt_reg = 0x59020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x59020,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_oxili_gfx3d_clk",
+                       .parent_names = (const char *[]){
+                               "gfx3d_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie_0_aux_clk = {
+       .halt_reg = 0x3e014,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(27),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pcie_0_aux_clk",
+                       .parent_names = (const char *[]){
+                               "pcie_0_aux_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie_0_cfg_ahb_clk = {
+       .halt_reg = 0x3e008,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(11),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pcie_0_cfg_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie_0_mstr_axi_clk = {
+       .halt_reg = 0x3e018,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(18),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pcie_0_mstr_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie_0_pipe_clk = {
+       .halt_reg = 0x3e00c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(28),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pcie_0_pipe_clk",
+                       .parent_names = (const char *[]){
+                               "pcie_0_pipe_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie_0_slv_axi_clk = {
+       .halt_reg = 0x3e010,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(22),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pcie_0_slv_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcnoc_usb2_clk = {
+       .halt_reg = 0x27008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x27008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pcnoc_usb2_clk",
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcnoc_usb3_clk = {
+       .halt_reg = 0x2700c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2700c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pcnoc_usb3_clk",
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pdm2_clk = {
+       .halt_reg = 0x4400c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4400c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pdm2_clk",
+                       .parent_names = (const char *[]){
+                               "pdm2_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pdm_ahb_clk = {
+       .halt_reg = 0x44004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x44004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pdm_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_prng_ahb_clk = {
+       .halt_reg = 0x13004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(8),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_prng_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+/* PWM clks do not have XO as parent as src clk is a balance root */
+static struct clk_branch gcc_pwm0_xo512_clk = {
+       .halt_reg = 0x44018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x44018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pwm0_xo512_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pwm1_xo512_clk = {
+       .halt_reg = 0x49004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x49004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pwm1_xo512_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pwm2_xo512_clk = {
+       .halt_reg = 0x4a004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4a004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pwm2_xo512_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qdss_dap_clk = {
+       .halt_reg = 0x29084,
+       .halt_check = BRANCH_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(21),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qdss_dap_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sdcc1_ahb_clk = {
+       .halt_reg = 0x4201c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4201c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_sdcc1_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sdcc1_apps_clk = {
+       .halt_reg = 0x42018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x42018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_sdcc1_apps_clk",
+                       .parent_names = (const char *[]){
+                               "sdcc1_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sdcc1_ice_core_clk = {
+       .halt_reg = 0x5d014,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5d014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_sdcc1_ice_core_clk",
+                       .parent_names = (const char *[]){
+                               "sdcc1_ice_core_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sdcc2_ahb_clk = {
+       .halt_reg = 0x4301c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4301c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_sdcc2_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sdcc2_apps_clk = {
+       .halt_reg = 0x43018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x43018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_sdcc2_apps_clk",
+                       .parent_names = (const char *[]){
+                               "sdcc2_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_smmu_cfg_clk = {
+       .halt_reg = 0x12038,
+       .halt_check = BRANCH_VOTED,
+       .clkr = {
+               .enable_reg = 0x3600C,
+               .enable_mask = BIT(12),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_smmu_cfg_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sys_noc_usb3_clk = {
+       .halt_reg = 0x26014,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x26014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_sys_noc_usb3_clk",
+                       .parent_names = (const char *[]){
+                               "usb30_master_clk_src",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb_hs_inactivity_timers_clk = {
+       .halt_reg = 0x4100C,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4100C,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb_hs_inactivity_timers_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb20_mock_utmi_clk = {
+       .halt_reg = 0x41044,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x41044,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb20_mock_utmi_clk",
+                       .parent_names = (const char *[]){
+                               "usb20_mock_utmi_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb2a_phy_sleep_clk = {
+       .halt_reg = 0x4102c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4102c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb2a_phy_sleep_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb30_master_clk = {
+       .halt_reg = 0x3900c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3900c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb30_master_clk",
+                       .parent_names = (const char *[]){
+                               "usb30_master_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb30_mock_utmi_clk = {
+       .halt_reg = 0x39014,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x39014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb30_mock_utmi_clk",
+                       .parent_names = (const char *[]){
+                               "usb30_mock_utmi_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb30_sleep_clk = {
+       .halt_reg = 0x39010,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x39010,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb30_sleep_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb3_phy_aux_clk = {
+       .halt_reg = 0x39044,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x39044,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb3_phy_aux_clk",
+                       .parent_names = (const char *[]){
+                               "usb3_phy_aux_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb3_phy_pipe_clk = {
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x39018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb3_phy_pipe_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb_hs_phy_cfg_ahb_clk = {
+       .halt_reg = 0x41030,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x41030,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb_hs_phy_cfg_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb_hs_system_clk = {
+       .halt_reg = 0x41004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x41004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb_hs_system_clk",
+                       .parent_names = (const char *[]){
+                               "usb_hs_system_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_hw *gcc_qcs404_hws[] = {
+       &cxo.hw,
+};
+
+static struct clk_regmap *gcc_qcs404_clocks[] = {
+       [GCC_APSS_AHB_CLK_SRC] = &apss_ahb_clk_src.clkr,
+       [GCC_BLSP1_QUP0_I2C_APPS_CLK_SRC] = &blsp1_qup0_i2c_apps_clk_src.clkr,
+       [GCC_BLSP1_QUP0_SPI_APPS_CLK_SRC] = &blsp1_qup0_spi_apps_clk_src.clkr,
+       [GCC_BLSP1_QUP1_I2C_APPS_CLK_SRC] = &blsp1_qup1_i2c_apps_clk_src.clkr,
+       [GCC_BLSP1_QUP1_SPI_APPS_CLK_SRC] = &blsp1_qup1_spi_apps_clk_src.clkr,
+       [GCC_BLSP1_QUP2_I2C_APPS_CLK_SRC] = &blsp1_qup2_i2c_apps_clk_src.clkr,
+       [GCC_BLSP1_QUP2_SPI_APPS_CLK_SRC] = &blsp1_qup2_spi_apps_clk_src.clkr,
+       [GCC_BLSP1_QUP3_I2C_APPS_CLK_SRC] = &blsp1_qup3_i2c_apps_clk_src.clkr,
+       [GCC_BLSP1_QUP3_SPI_APPS_CLK_SRC] = &blsp1_qup3_spi_apps_clk_src.clkr,
+       [GCC_BLSP1_QUP4_I2C_APPS_CLK_SRC] = &blsp1_qup4_i2c_apps_clk_src.clkr,
+       [GCC_BLSP1_QUP4_SPI_APPS_CLK_SRC] = &blsp1_qup4_spi_apps_clk_src.clkr,
+       [GCC_BLSP1_UART0_APPS_CLK_SRC] = &blsp1_uart0_apps_clk_src.clkr,
+       [GCC_BLSP1_UART1_APPS_CLK_SRC] = &blsp1_uart1_apps_clk_src.clkr,
+       [GCC_BLSP1_UART2_APPS_CLK_SRC] = &blsp1_uart2_apps_clk_src.clkr,
+       [GCC_BLSP1_UART3_APPS_CLK_SRC] = &blsp1_uart3_apps_clk_src.clkr,
+       [GCC_BLSP2_QUP0_I2C_APPS_CLK_SRC] = &blsp2_qup0_i2c_apps_clk_src.clkr,
+       [GCC_BLSP2_QUP0_SPI_APPS_CLK_SRC] = &blsp2_qup0_spi_apps_clk_src.clkr,
+       [GCC_BLSP2_UART0_APPS_CLK_SRC] = &blsp2_uart0_apps_clk_src.clkr,
+       [GCC_BYTE0_CLK_SRC] = &byte0_clk_src.clkr,
+       [GCC_EMAC_CLK_SRC] = &emac_clk_src.clkr,
+       [GCC_EMAC_PTP_CLK_SRC] = &emac_ptp_clk_src.clkr,
+       [GCC_ESC0_CLK_SRC] = &esc0_clk_src.clkr,
+       [GCC_APSS_AHB_CLK] = &gcc_apss_ahb_clk.clkr,
+       [GCC_BIMC_GFX_CLK] = &gcc_bimc_gfx_clk.clkr,
+       [GCC_BIMC_MDSS_CLK] = &gcc_bimc_mdss_clk.clkr,
+       [GCC_BLSP1_AHB_CLK] = &gcc_blsp1_ahb_clk.clkr,
+       [GCC_BLSP1_QUP0_I2C_APPS_CLK] = &gcc_blsp1_qup0_i2c_apps_clk.clkr,
+       [GCC_BLSP1_QUP0_SPI_APPS_CLK] = &gcc_blsp1_qup0_spi_apps_clk.clkr,
+       [GCC_BLSP1_QUP1_I2C_APPS_CLK] = &gcc_blsp1_qup1_i2c_apps_clk.clkr,
+       [GCC_BLSP1_QUP1_SPI_APPS_CLK] = &gcc_blsp1_qup1_spi_apps_clk.clkr,
+       [GCC_BLSP1_QUP2_I2C_APPS_CLK] = &gcc_blsp1_qup2_i2c_apps_clk.clkr,
+       [GCC_BLSP1_QUP2_SPI_APPS_CLK] = &gcc_blsp1_qup2_spi_apps_clk.clkr,
+       [GCC_BLSP1_QUP3_I2C_APPS_CLK] = &gcc_blsp1_qup3_i2c_apps_clk.clkr,
+       [GCC_BLSP1_QUP3_SPI_APPS_CLK] = &gcc_blsp1_qup3_spi_apps_clk.clkr,
+       [GCC_BLSP1_QUP4_I2C_APPS_CLK] = &gcc_blsp1_qup4_i2c_apps_clk.clkr,
+       [GCC_BLSP1_QUP4_SPI_APPS_CLK] = &gcc_blsp1_qup4_spi_apps_clk.clkr,
+       [GCC_BLSP1_UART0_APPS_CLK] = &gcc_blsp1_uart0_apps_clk.clkr,
+       [GCC_BLSP1_UART1_APPS_CLK] = &gcc_blsp1_uart1_apps_clk.clkr,
+       [GCC_BLSP1_UART2_APPS_CLK] = &gcc_blsp1_uart2_apps_clk.clkr,
+       [GCC_BLSP1_UART3_APPS_CLK] = &gcc_blsp1_uart3_apps_clk.clkr,
+       [GCC_BLSP2_AHB_CLK] = &gcc_blsp2_ahb_clk.clkr,
+       [GCC_BLSP2_QUP0_I2C_APPS_CLK] = &gcc_blsp2_qup0_i2c_apps_clk.clkr,
+       [GCC_BLSP2_QUP0_SPI_APPS_CLK] = &gcc_blsp2_qup0_spi_apps_clk.clkr,
+       [GCC_BLSP2_UART0_APPS_CLK] = &gcc_blsp2_uart0_apps_clk.clkr,
+       [GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr,
+       [GCC_ETH_AXI_CLK] = &gcc_eth_axi_clk.clkr,
+       [GCC_ETH_PTP_CLK] = &gcc_eth_ptp_clk.clkr,
+       [GCC_ETH_RGMII_CLK] = &gcc_eth_rgmii_clk.clkr,
+       [GCC_ETH_SLAVE_AHB_CLK] = &gcc_eth_slave_ahb_clk.clkr,
+       [GCC_GENI_IR_S_CLK] = &gcc_geni_ir_s_clk.clkr,
+       [GCC_GENI_IR_H_CLK] = &gcc_geni_ir_h_clk.clkr,
+       [GCC_GP1_CLK] = &gcc_gp1_clk.clkr,
+       [GCC_GP2_CLK] = &gcc_gp2_clk.clkr,
+       [GCC_GP3_CLK] = &gcc_gp3_clk.clkr,
+       [GCC_MDSS_AHB_CLK] = &gcc_mdss_ahb_clk.clkr,
+       [GCC_MDSS_AXI_CLK] = &gcc_mdss_axi_clk.clkr,
+       [GCC_MDSS_BYTE0_CLK] = &gcc_mdss_byte0_clk.clkr,
+       [GCC_MDSS_ESC0_CLK] = &gcc_mdss_esc0_clk.clkr,
+       [GCC_MDSS_HDMI_APP_CLK] = &gcc_mdss_hdmi_app_clk.clkr,
+       [GCC_MDSS_HDMI_PCLK_CLK] = &gcc_mdss_hdmi_pclk_clk.clkr,
+       [GCC_MDSS_MDP_CLK] = &gcc_mdss_mdp_clk.clkr,
+       [GCC_MDSS_PCLK0_CLK] = &gcc_mdss_pclk0_clk.clkr,
+       [GCC_MDSS_VSYNC_CLK] = &gcc_mdss_vsync_clk.clkr,
+       [GCC_OXILI_AHB_CLK] = &gcc_oxili_ahb_clk.clkr,
+       [GCC_OXILI_GFX3D_CLK] = &gcc_oxili_gfx3d_clk.clkr,
+       [GCC_PCIE_0_AUX_CLK] = &gcc_pcie_0_aux_clk.clkr,
+       [GCC_PCIE_0_CFG_AHB_CLK] = &gcc_pcie_0_cfg_ahb_clk.clkr,
+       [GCC_PCIE_0_MSTR_AXI_CLK] = &gcc_pcie_0_mstr_axi_clk.clkr,
+       [GCC_PCIE_0_PIPE_CLK] = &gcc_pcie_0_pipe_clk.clkr,
+       [GCC_PCIE_0_SLV_AXI_CLK] = &gcc_pcie_0_slv_axi_clk.clkr,
+       [GCC_PCNOC_USB2_CLK] = &gcc_pcnoc_usb2_clk.clkr,
+       [GCC_PCNOC_USB3_CLK] = &gcc_pcnoc_usb3_clk.clkr,
+       [GCC_PDM2_CLK] = &gcc_pdm2_clk.clkr,
+       [GCC_PDM_AHB_CLK] = &gcc_pdm_ahb_clk.clkr,
+       [GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr,
+       [GCC_PWM0_XO512_CLK] = &gcc_pwm0_xo512_clk.clkr,
+       [GCC_PWM1_XO512_CLK] = &gcc_pwm1_xo512_clk.clkr,
+       [GCC_PWM2_XO512_CLK] = &gcc_pwm2_xo512_clk.clkr,
+       [GCC_SDCC1_AHB_CLK] = &gcc_sdcc1_ahb_clk.clkr,
+       [GCC_SDCC1_APPS_CLK] = &gcc_sdcc1_apps_clk.clkr,
+       [GCC_SDCC1_ICE_CORE_CLK] = &gcc_sdcc1_ice_core_clk.clkr,
+       [GCC_SDCC2_AHB_CLK] = &gcc_sdcc2_ahb_clk.clkr,
+       [GCC_SDCC2_APPS_CLK] = &gcc_sdcc2_apps_clk.clkr,
+       [GCC_SYS_NOC_USB3_CLK] = &gcc_sys_noc_usb3_clk.clkr,
+       [GCC_USB20_MOCK_UTMI_CLK] = &gcc_usb20_mock_utmi_clk.clkr,
+       [GCC_USB2A_PHY_SLEEP_CLK] = &gcc_usb2a_phy_sleep_clk.clkr,
+       [GCC_USB30_MASTER_CLK] = &gcc_usb30_master_clk.clkr,
+       [GCC_USB30_MOCK_UTMI_CLK] = &gcc_usb30_mock_utmi_clk.clkr,
+       [GCC_USB30_SLEEP_CLK] = &gcc_usb30_sleep_clk.clkr,
+       [GCC_USB3_PHY_AUX_CLK] = &gcc_usb3_phy_aux_clk.clkr,
+       [GCC_USB3_PHY_PIPE_CLK] = &gcc_usb3_phy_pipe_clk.clkr,
+       [GCC_USB_HS_PHY_CFG_AHB_CLK] = &gcc_usb_hs_phy_cfg_ahb_clk.clkr,
+       [GCC_USB_HS_SYSTEM_CLK] = &gcc_usb_hs_system_clk.clkr,
+       [GCC_GFX3D_CLK_SRC] = &gfx3d_clk_src.clkr,
+       [GCC_GP1_CLK_SRC] = &gp1_clk_src.clkr,
+       [GCC_GP2_CLK_SRC] = &gp2_clk_src.clkr,
+       [GCC_GP3_CLK_SRC] = &gp3_clk_src.clkr,
+       [GCC_GPLL0_OUT_MAIN] = &gpll0_out_main.clkr,
+       [GCC_GPLL0_AO_OUT_MAIN] = &gpll0_ao_out_main.clkr,
+       [GCC_GPLL0_SLEEP_CLK_SRC] = &gpll0_sleep_clk_src.clkr,
+       [GCC_GPLL1_OUT_MAIN] = &gpll1_out_main.clkr,
+       [GCC_GPLL3_OUT_MAIN] = &gpll3_out_main.clkr,
+       [GCC_GPLL4_OUT_MAIN] = &gpll4_out_main.clkr,
+       [GCC_GPLL6] = &gpll6.clkr,
+       [GCC_GPLL6_OUT_AUX] = &gpll6_out_aux,
+       [GCC_HDMI_APP_CLK_SRC] = &hdmi_app_clk_src.clkr,
+       [GCC_HDMI_PCLK_CLK_SRC] = &hdmi_pclk_clk_src.clkr,
+       [GCC_MDP_CLK_SRC] = &mdp_clk_src.clkr,
+       [GCC_PCIE_0_AUX_CLK_SRC] = &pcie_0_aux_clk_src.clkr,
+       [GCC_PCIE_0_PIPE_CLK_SRC] = &pcie_0_pipe_clk_src.clkr,
+       [GCC_PCLK0_CLK_SRC] = &pclk0_clk_src.clkr,
+       [GCC_PDM2_CLK_SRC] = &pdm2_clk_src.clkr,
+       [GCC_SDCC1_APPS_CLK_SRC] = &sdcc1_apps_clk_src.clkr,
+       [GCC_SDCC1_ICE_CORE_CLK_SRC] = &sdcc1_ice_core_clk_src.clkr,
+       [GCC_SDCC2_APPS_CLK_SRC] = &sdcc2_apps_clk_src.clkr,
+       [GCC_USB20_MOCK_UTMI_CLK_SRC] = &usb20_mock_utmi_clk_src.clkr,
+       [GCC_USB30_MASTER_CLK_SRC] = &usb30_master_clk_src.clkr,
+       [GCC_USB30_MOCK_UTMI_CLK_SRC] = &usb30_mock_utmi_clk_src.clkr,
+       [GCC_USB3_PHY_AUX_CLK_SRC] = &usb3_phy_aux_clk_src.clkr,
+       [GCC_USB_HS_SYSTEM_CLK_SRC] = &usb_hs_system_clk_src.clkr,
+       [GCC_VSYNC_CLK_SRC] = &vsync_clk_src.clkr,
+       [GCC_USB_HS_INACTIVITY_TIMERS_CLK] =
+                       &gcc_usb_hs_inactivity_timers_clk.clkr,
+       [GCC_BIMC_GPU_CLK] = &gcc_bimc_gpu_clk.clkr,
+       [GCC_GTCU_AHB_CLK] = &gcc_gtcu_ahb_clk.clkr,
+       [GCC_GFX_TCU_CLK] = &gcc_gfx_tcu_clk.clkr,
+       [GCC_GFX_TBU_CLK] = &gcc_gfx_tbu_clk.clkr,
+       [GCC_SMMU_CFG_CLK] = &gcc_smmu_cfg_clk.clkr,
+       [GCC_APSS_TCU_CLK] = &gcc_apss_tcu_clk.clkr,
+       [GCC_CRYPTO_AHB_CLK] = &gcc_crypto_ahb_clk.clkr,
+       [GCC_CRYPTO_AXI_CLK] = &gcc_crypto_axi_clk.clkr,
+       [GCC_CRYPTO_CLK] = &gcc_crypto_clk.clkr,
+       [GCC_MDP_TBU_CLK] = &gcc_mdp_tbu_clk.clkr,
+       [GCC_QDSS_DAP_CLK] = &gcc_qdss_dap_clk.clkr,
+       [GCC_DCC_CLK] = &gcc_dcc_clk.clkr,
+       [GCC_DCC_XO_CLK] = &gcc_dcc_xo_clk.clkr,
+};
+
+static const struct qcom_reset_map gcc_qcs404_resets[] = {
+       [GCC_GENI_IR_BCR] = { 0x0F000 },
+       [GCC_USB_HS_BCR] = { 0x41000 },
+       [GCC_USB2_HS_PHY_ONLY_BCR] = { 0x41034 },
+       [GCC_QUSB2_PHY_BCR] = { 0x4103c },
+       [GCC_USB_HS_PHY_CFG_AHB_BCR] = { 0x0000c, 1 },
+       [GCC_USB2A_PHY_BCR] = { 0x0000c, 0 },
+       [GCC_USB3_PHY_BCR] = { 0x39004 },
+       [GCC_USB_30_BCR] = { 0x39000 },
+       [GCC_USB3PHY_PHY_BCR] = { 0x39008 },
+       [GCC_PCIE_0_BCR] = { 0x3e000 },
+       [GCC_PCIE_0_PHY_BCR] = { 0x3e004 },
+       [GCC_PCIE_0_LINK_DOWN_BCR] = { 0x3e038 },
+       [GCC_PCIEPHY_0_PHY_BCR] = { 0x3e03c },
+       [GCC_EMAC_BCR] = { 0x4e000 },
+};
+
+static const struct regmap_config gcc_qcs404_regmap_config = {
+       .reg_bits       = 32,
+       .reg_stride     = 4,
+       .val_bits       = 32,
+       .max_register   = 0x7f000,
+       .fast_io        = true,
+};
+
+static const struct qcom_cc_desc gcc_qcs404_desc = {
+       .config = &gcc_qcs404_regmap_config,
+       .clks = gcc_qcs404_clocks,
+       .num_clks = ARRAY_SIZE(gcc_qcs404_clocks),
+       .resets = gcc_qcs404_resets,
+       .num_resets = ARRAY_SIZE(gcc_qcs404_resets),
+};
+
+static const struct of_device_id gcc_qcs404_match_table[] = {
+       { .compatible = "qcom,gcc-qcs404" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, gcc_qcs404_match_table);
+
+static int gcc_qcs404_probe(struct platform_device *pdev)
+{
+       struct regmap *regmap;
+       int ret, i;
+
+       regmap = qcom_cc_map(pdev, &gcc_qcs404_desc);
+       if (IS_ERR(regmap))
+               return PTR_ERR(regmap);
+
+       clk_alpha_pll_configure(&gpll3_out_main, regmap, &gpll3_config);
+
+       for (i = 0; i < ARRAY_SIZE(gcc_qcs404_hws); i++) {
+               ret = devm_clk_hw_register(&pdev->dev, gcc_qcs404_hws[i]);
+               if (ret)
+                       return ret;
+       }
+
+       return qcom_cc_really_probe(pdev, &gcc_qcs404_desc, regmap);
+}
+
+static struct platform_driver gcc_qcs404_driver = {
+       .probe = gcc_qcs404_probe,
+       .driver = {
+               .name = "gcc-qcs404",
+               .of_match_table = gcc_qcs404_match_table,
+       },
+};
+
+static int __init gcc_qcs404_init(void)
+{
+       return platform_driver_register(&gcc_qcs404_driver);
+}
+subsys_initcall(gcc_qcs404_init);
+
+static void __exit gcc_qcs404_exit(void)
+{
+       platform_driver_unregister(&gcc_qcs404_driver);
+}
+module_exit(gcc_qcs404_exit);
+
+MODULE_DESCRIPTION("Qualcomm GCC QCS404 Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/clk/qcom/gcc-sdm660.c b/drivers/clk/qcom/gcc-sdm660.c
new file mode 100644 (file)
index 0000000..ba239ea
--- /dev/null
@@ -0,0 +1,2480 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2018, Craig Tatlor.
+ */
+
+#include <linux/kernel.h>
+#include <linux/bitops.h>
+#include <linux/err.h>
+#include <linux/platform_device.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/clk-provider.h>
+#include <linux/regmap.h>
+#include <linux/reset-controller.h>
+
+#include <dt-bindings/clock/qcom,gcc-sdm660.h>
+
+#include "common.h"
+#include "clk-regmap.h"
+#include "clk-alpha-pll.h"
+#include "clk-rcg.h"
+#include "clk-branch.h"
+#include "reset.h"
+#include "gdsc.h"
+
+#define F(f, s, h, m, n) { (f), (s), (2 * (h) - 1), (m), (n) }
+
+enum {
+       P_XO,
+       P_SLEEP_CLK,
+       P_GPLL0,
+       P_GPLL1,
+       P_GPLL4,
+       P_GPLL0_EARLY_DIV,
+       P_GPLL1_EARLY_DIV,
+};
+
+static const struct parent_map gcc_parent_map_xo_gpll0_gpll0_early_div[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL0_EARLY_DIV, 6 },
+};
+
+static const char * const gcc_parent_names_xo_gpll0_gpll0_early_div[] = {
+       "xo",
+       "gpll0",
+       "gpll0_early_div",
+};
+
+static const struct parent_map gcc_parent_map_xo_gpll0[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+};
+
+static const char * const gcc_parent_names_xo_gpll0[] = {
+       "xo",
+       "gpll0",
+};
+
+static const struct parent_map gcc_parent_map_xo_gpll0_sleep_clk_gpll0_early_div[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_SLEEP_CLK, 5 },
+       { P_GPLL0_EARLY_DIV, 6 },
+};
+
+static const char * const gcc_parent_names_xo_gpll0_sleep_clk_gpll0_early_div[] = {
+       "xo",
+       "gpll0",
+       "sleep_clk",
+       "gpll0_early_div",
+};
+
+static const struct parent_map gcc_parent_map_xo_sleep_clk[] = {
+       { P_XO, 0 },
+       { P_SLEEP_CLK, 5 },
+};
+
+static const char * const gcc_parent_names_xo_sleep_clk[] = {
+       "xo",
+       "sleep_clk",
+};
+
+static const struct parent_map gcc_parent_map_xo_gpll4[] = {
+       { P_XO, 0 },
+       { P_GPLL4, 5 },
+};
+
+static const char * const gcc_parent_names_xo_gpll4[] = {
+       "xo",
+       "gpll4",
+};
+
+static const struct parent_map gcc_parent_map_xo_gpll0_gpll0_early_div_gpll1_gpll4_gpll1_early_div[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL0_EARLY_DIV, 3 },
+       { P_GPLL1, 4 },
+       { P_GPLL4, 5 },
+       { P_GPLL1_EARLY_DIV, 6 },
+};
+
+static const char * const gcc_parent_names_xo_gpll0_gpll0_early_div_gpll1_gpll4_gpll1_early_div[] = {
+       "xo",
+       "gpll0",
+       "gpll0_early_div",
+       "gpll1",
+       "gpll4",
+       "gpll1_early_div",
+};
+
+static const struct parent_map gcc_parent_map_xo_gpll0_gpll4_gpll0_early_div[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL4, 5 },
+       { P_GPLL0_EARLY_DIV, 6 },
+};
+
+static const char * const gcc_parent_names_xo_gpll0_gpll4_gpll0_early_div[] = {
+       "xo",
+       "gpll0",
+       "gpll4",
+       "gpll0_early_div",
+};
+
+static const struct parent_map gcc_parent_map_xo_gpll0_gpll0_early_div_gpll4[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL0_EARLY_DIV, 2 },
+       { P_GPLL4, 5 },
+};
+
+static const char * const gcc_parent_names_xo_gpll0_gpll0_early_div_gpll4[] = {
+       "xo",
+       "gpll0",
+       "gpll0_early_div",
+       "gpll4",
+};
+
+static struct clk_fixed_factor xo = {
+       .mult = 1,
+       .div = 1,
+       .hw.init = &(struct clk_init_data){
+               .name = "xo",
+               .parent_names = (const char *[]){ "xo_board" },
+               .num_parents = 1,
+               .ops = &clk_fixed_factor_ops,
+       },
+};
+
+static struct clk_alpha_pll gpll0_early = {
+       .offset = 0x0,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .enable_reg = 0x52000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll0_early",
+                       .parent_names = (const char *[]){ "xo" },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static struct clk_fixed_factor gpll0_early_div = {
+       .mult = 1,
+       .div = 2,
+       .hw.init = &(struct clk_init_data){
+               .name = "gpll0_early_div",
+               .parent_names = (const char *[]){ "gpll0_early" },
+               .num_parents = 1,
+               .ops = &clk_fixed_factor_ops,
+       },
+};
+
+static struct clk_alpha_pll_postdiv gpll0 = {
+       .offset = 0x00000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll0",
+               .parent_names = (const char *[]){ "gpll0_early" },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_ops,
+       },
+};
+
+static struct clk_alpha_pll gpll1_early = {
+       .offset = 0x1000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .enable_reg = 0x52000,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll1_early",
+                       .parent_names = (const char *[]){ "xo" },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static struct clk_fixed_factor gpll1_early_div = {
+       .mult = 1,
+       .div = 2,
+       .hw.init = &(struct clk_init_data){
+               .name = "gpll1_early_div",
+               .parent_names = (const char *[]){ "gpll1_early" },
+               .num_parents = 1,
+               .ops = &clk_fixed_factor_ops,
+       },
+};
+
+static struct clk_alpha_pll_postdiv gpll1 = {
+       .offset = 0x1000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll1",
+               .parent_names = (const char *[]){ "gpll1_early" },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_ops,
+       },
+};
+
+static struct clk_alpha_pll gpll4_early = {
+       .offset = 0x77000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .enable_reg = 0x52000,
+               .enable_mask = BIT(4),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll4_early",
+                       .parent_names = (const char *[]){ "xo" },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll_postdiv gpll4 = {
+       .offset = 0x77000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr.hw.init = &(struct clk_init_data)
+       {
+               .name = "gpll4",
+               .parent_names = (const char *[]) { "gpll4_early" },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_blsp1_qup1_i2c_apps_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(50000000, P_GPLL0, 12, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 blsp1_qup1_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x19020,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp1_qup1_i2c_apps_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_blsp1_qup1_spi_apps_clk_src[] = {
+       F(960000, P_XO, 10, 1, 2),
+       F(4800000, P_XO, 4, 0, 0),
+       F(9600000, P_XO, 2, 0, 0),
+       F(15000000, P_GPLL0, 10, 1, 4),
+       F(19200000, P_XO, 1, 0, 0),
+       F(25000000, P_GPLL0, 12, 1, 2),
+       F(50000000, P_GPLL0, 12, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 blsp1_qup1_spi_apps_clk_src = {
+       .cmd_rcgr = 0x1900c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp1_qup1_spi_apps_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_qup2_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x1b020,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp1_qup2_i2c_apps_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_qup2_spi_apps_clk_src = {
+       .cmd_rcgr = 0x1b00c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp1_qup2_spi_apps_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_qup3_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x1d020,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp1_qup3_i2c_apps_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_qup3_spi_apps_clk_src = {
+       .cmd_rcgr = 0x1d00c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp1_qup3_spi_apps_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_qup4_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x1f020,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp1_qup4_i2c_apps_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_qup4_spi_apps_clk_src = {
+       .cmd_rcgr = 0x1f00c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp1_qup4_spi_apps_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_blsp1_uart1_apps_clk_src[] = {
+       F(3686400, P_GPLL0, 1, 96, 15625),
+       F(7372800, P_GPLL0, 1, 192, 15625),
+       F(14745600, P_GPLL0, 1, 384, 15625),
+       F(16000000, P_GPLL0, 5, 2, 15),
+       F(19200000, P_XO, 1, 0, 0),
+       F(24000000, P_GPLL0, 5, 1, 5),
+       F(32000000, P_GPLL0, 1, 4, 75),
+       F(40000000, P_GPLL0, 15, 0, 0),
+       F(46400000, P_GPLL0, 1, 29, 375),
+       F(48000000, P_GPLL0, 12.5, 0, 0),
+       F(51200000, P_GPLL0, 1, 32, 375),
+       F(56000000, P_GPLL0, 1, 7, 75),
+       F(58982400, P_GPLL0, 1, 1536, 15625),
+       F(60000000, P_GPLL0, 10, 0, 0),
+       F(63157895, P_GPLL0, 9.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 blsp1_uart1_apps_clk_src = {
+       .cmd_rcgr = 0x1a00c,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_blsp1_uart1_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp1_uart1_apps_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_uart2_apps_clk_src = {
+       .cmd_rcgr = 0x1c00c,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_blsp1_uart1_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp1_uart2_apps_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp2_qup1_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x26020,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp2_qup1_i2c_apps_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp2_qup1_spi_apps_clk_src = {
+       .cmd_rcgr = 0x2600c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp2_qup1_spi_apps_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp2_qup2_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x28020,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp2_qup2_i2c_apps_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp2_qup2_spi_apps_clk_src = {
+       .cmd_rcgr = 0x2800c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp2_qup2_spi_apps_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp2_qup3_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x2a020,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp2_qup3_i2c_apps_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp2_qup3_spi_apps_clk_src = {
+       .cmd_rcgr = 0x2a00c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp2_qup3_spi_apps_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp2_qup4_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x2c020,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp2_qup4_i2c_apps_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp2_qup4_spi_apps_clk_src = {
+       .cmd_rcgr = 0x2c00c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp2_qup4_spi_apps_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp2_uart1_apps_clk_src = {
+       .cmd_rcgr = 0x2700c,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_blsp1_uart1_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp2_uart1_apps_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp2_uart2_apps_clk_src = {
+       .cmd_rcgr = 0x2900c,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_blsp1_uart1_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "blsp2_uart2_apps_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gp1_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(100000000, P_GPLL0, 6, 0, 0),
+       F(200000000, P_GPLL0, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gp1_clk_src = {
+       .cmd_rcgr = 0x64004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_sleep_clk_gpll0_early_div,
+       .freq_tbl = ftbl_gp1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gp1_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_sleep_clk_gpll0_early_div,
+               .num_parents = 4,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gp2_clk_src = {
+       .cmd_rcgr = 0x65004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_sleep_clk_gpll0_early_div,
+       .freq_tbl = ftbl_gp1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gp2_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_sleep_clk_gpll0_early_div,
+               .num_parents = 4,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gp3_clk_src = {
+       .cmd_rcgr = 0x66004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_sleep_clk_gpll0_early_div,
+       .freq_tbl = ftbl_gp1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gp3_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_sleep_clk_gpll0_early_div,
+               .num_parents = 4,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_hmss_gpll0_clk_src[] = {
+       F(300000000, P_GPLL0, 2, 0, 0),
+       F(600000000, P_GPLL0, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 hmss_gpll0_clk_src = {
+       .cmd_rcgr = 0x4805c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_hmss_gpll0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "hmss_gpll0_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_hmss_gpll4_clk_src[] = {
+       F(384000000, P_GPLL4, 4, 0, 0),
+       F(768000000, P_GPLL4, 2, 0, 0),
+       F(1536000000, P_GPLL4, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 hmss_gpll4_clk_src = {
+       .cmd_rcgr = 0x48074,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll4,
+       .freq_tbl = ftbl_hmss_gpll4_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "hmss_gpll4_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll4,
+               .num_parents = 2,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_hmss_rbcpr_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 hmss_rbcpr_clk_src = {
+       .cmd_rcgr = 0x48044,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_hmss_rbcpr_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "hmss_rbcpr_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0,
+               .num_parents = 2,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_pdm2_clk_src[] = {
+       F(60000000, P_GPLL0, 10, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 pdm2_clk_src = {
+       .cmd_rcgr = 0x33010,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_pdm2_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "pdm2_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_qspi_ser_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(80200000, P_GPLL1_EARLY_DIV, 5, 0, 0),
+       F(160400000, P_GPLL1, 5, 0, 0),
+       F(267333333, P_GPLL1, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 qspi_ser_clk_src = {
+       .cmd_rcgr = 0x4d00c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div_gpll1_gpll4_gpll1_early_div,
+       .freq_tbl = ftbl_qspi_ser_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "qspi_ser_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div_gpll1_gpll4_gpll1_early_div,
+               .num_parents = 6,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_sdcc1_apps_clk_src[] = {
+       F(144000, P_XO, 16, 3, 25),
+       F(400000, P_XO, 12, 1, 4),
+       F(20000000, P_GPLL0_EARLY_DIV, 5, 1, 3),
+       F(25000000, P_GPLL0_EARLY_DIV, 6, 1, 2),
+       F(50000000, P_GPLL0_EARLY_DIV, 6, 0, 0),
+       F(100000000, P_GPLL0, 6, 0, 0),
+       F(192000000, P_GPLL4, 8, 0, 0),
+       F(384000000, P_GPLL4, 4, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 sdcc1_apps_clk_src = {
+       .cmd_rcgr = 0x1602c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll4_gpll0_early_div,
+       .freq_tbl = ftbl_sdcc1_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "sdcc1_apps_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll4_gpll0_early_div,
+               .num_parents = 4,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_sdcc1_ice_core_clk_src[] = {
+       F(75000000, P_GPLL0_EARLY_DIV, 4, 0, 0),
+       F(150000000, P_GPLL0, 4, 0, 0),
+       F(200000000, P_GPLL0, 3, 0, 0),
+       F(300000000, P_GPLL0, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 sdcc1_ice_core_clk_src = {
+       .cmd_rcgr = 0x16010,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_sdcc1_ice_core_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "sdcc1_ice_core_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_sdcc2_apps_clk_src[] = {
+       F(144000, P_XO, 16, 3, 25),
+       F(400000, P_XO, 12, 1, 4),
+       F(20000000, P_GPLL0_EARLY_DIV, 5, 1, 3),
+       F(25000000, P_GPLL0_EARLY_DIV, 6, 1, 2),
+       F(50000000, P_GPLL0_EARLY_DIV, 6, 0, 0),
+       F(100000000, P_GPLL0, 6, 0, 0),
+       F(192000000, P_GPLL4, 8, 0, 0),
+       F(200000000, P_GPLL0, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 sdcc2_apps_clk_src = {
+       .cmd_rcgr = 0x14010,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div_gpll4,
+       .freq_tbl = ftbl_sdcc2_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "sdcc2_apps_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div_gpll4,
+               .num_parents = 4,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_ufs_axi_clk_src[] = {
+       F(50000000, P_GPLL0_EARLY_DIV, 6, 0, 0),
+       F(100000000, P_GPLL0, 6, 0, 0),
+       F(150000000, P_GPLL0, 4, 0, 0),
+       F(200000000, P_GPLL0, 3, 0, 0),
+       F(240000000, P_GPLL0, 2.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 ufs_axi_clk_src = {
+       .cmd_rcgr = 0x75018,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_ufs_axi_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "ufs_axi_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_ufs_ice_core_clk_src[] = {
+       F(75000000, P_GPLL0_EARLY_DIV, 4, 0, 0),
+       F(150000000, P_GPLL0, 4, 0, 0),
+       F(300000000, P_GPLL0, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 ufs_ice_core_clk_src = {
+       .cmd_rcgr = 0x76010,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_ufs_ice_core_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "ufs_ice_core_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 ufs_phy_aux_clk_src = {
+       .cmd_rcgr = 0x76044,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_sleep_clk,
+       .freq_tbl = ftbl_hmss_rbcpr_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "ufs_phy_aux_clk_src",
+               .parent_names = gcc_parent_names_xo_sleep_clk,
+               .num_parents = 2,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_ufs_unipro_core_clk_src[] = {
+       F(37500000, P_GPLL0_EARLY_DIV, 8, 0, 0),
+       F(75000000, P_GPLL0, 8, 0, 0),
+       F(150000000, P_GPLL0, 4, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 ufs_unipro_core_clk_src = {
+       .cmd_rcgr = 0x76028,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_ufs_unipro_core_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "ufs_unipro_core_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_usb20_master_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(60000000, P_GPLL0, 10, 0, 0),
+       F(120000000, P_GPLL0, 5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 usb20_master_clk_src = {
+       .cmd_rcgr = 0x2f010,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_usb20_master_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "usb20_master_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_usb20_mock_utmi_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(60000000, P_GPLL0, 10, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 usb20_mock_utmi_clk_src = {
+       .cmd_rcgr = 0x2f024,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_usb20_mock_utmi_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "usb20_mock_utmi_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_usb30_master_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(66666667, P_GPLL0_EARLY_DIV, 4.5, 0, 0),
+       F(120000000, P_GPLL0, 5, 0, 0),
+       F(133333333, P_GPLL0, 4.5, 0, 0),
+       F(150000000, P_GPLL0, 4, 0, 0),
+       F(200000000, P_GPLL0, 3, 0, 0),
+       F(240000000, P_GPLL0, 2.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 usb30_master_clk_src = {
+       .cmd_rcgr = 0xf014,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_usb30_master_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "usb30_master_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_usb30_mock_utmi_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(40000000, P_GPLL0_EARLY_DIV, 7.5, 0, 0),
+       F(60000000, P_GPLL0, 10, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 usb30_mock_utmi_clk_src = {
+       .cmd_rcgr = 0xf028,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div,
+       .freq_tbl = ftbl_usb30_mock_utmi_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "usb30_mock_utmi_clk_src",
+               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_usb3_phy_aux_clk_src[] = {
+       F(1200000, P_XO, 16, 0, 0),
+       F(19200000, P_XO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 usb3_phy_aux_clk_src = {
+       .cmd_rcgr = 0x5000c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo_sleep_clk,
+       .freq_tbl = ftbl_usb3_phy_aux_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "usb3_phy_aux_clk_src",
+               .parent_names = gcc_parent_names_xo_sleep_clk,
+               .num_parents = 2,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_aggre2_ufs_axi_clk = {
+       .halt_reg = 0x75034,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x75034,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_aggre2_ufs_axi_clk",
+                       .parent_names = (const char *[]){
+                               "ufs_axi_clk_src",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_aggre2_usb3_axi_clk = {
+       .halt_reg = 0xf03c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xf03c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_aggre2_usb3_axi_clk",
+                       .parent_names = (const char *[]){
+                               "usb30_master_clk_src",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_bimc_gfx_clk = {
+       .halt_reg = 0x7106c,
+       .halt_check = BRANCH_VOTED,
+       .clkr = {
+               .enable_reg = 0x7106c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_bimc_gfx_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_bimc_hmss_axi_clk = {
+       .halt_reg = 0x48004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52004,
+               .enable_mask = BIT(22),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_bimc_hmss_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_bimc_mss_q6_axi_clk = {
+       .halt_reg = 0x4401c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4401c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_bimc_mss_q6_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_ahb_clk = {
+       .halt_reg = 0x17004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52004,
+               .enable_mask = BIT(17),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup1_i2c_apps_clk = {
+       .halt_reg = 0x19008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x19008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_qup1_i2c_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp1_qup1_i2c_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup1_spi_apps_clk = {
+       .halt_reg = 0x19004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x19004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_qup1_spi_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp1_qup1_spi_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup2_i2c_apps_clk = {
+       .halt_reg = 0x1b008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1b008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_qup2_i2c_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp1_qup2_i2c_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup2_spi_apps_clk = {
+       .halt_reg = 0x1b004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1b004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_qup2_spi_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp1_qup2_spi_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup3_i2c_apps_clk = {
+       .halt_reg = 0x1d008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1d008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_qup3_i2c_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp1_qup3_i2c_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup3_spi_apps_clk = {
+       .halt_reg = 0x1d004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1d004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_qup3_spi_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp1_qup3_spi_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup4_i2c_apps_clk = {
+       .halt_reg = 0x1f008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1f008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_qup4_i2c_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp1_qup4_i2c_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup4_spi_apps_clk = {
+       .halt_reg = 0x1f004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1f004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_qup4_spi_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp1_qup4_spi_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_uart1_apps_clk = {
+       .halt_reg = 0x1a004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1a004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_uart1_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp1_uart1_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_uart2_apps_clk = {
+       .halt_reg = 0x1c004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1c004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp1_uart2_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp1_uart2_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp2_ahb_clk = {
+       .halt_reg = 0x25004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52004,
+               .enable_mask = BIT(15),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp2_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp2_qup1_i2c_apps_clk = {
+       .halt_reg = 0x26008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x26008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp2_qup1_i2c_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp2_qup1_i2c_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp2_qup1_spi_apps_clk = {
+       .halt_reg = 0x26004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x26004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp2_qup1_spi_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp2_qup1_spi_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp2_qup2_i2c_apps_clk = {
+       .halt_reg = 0x28008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x28008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp2_qup2_i2c_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp2_qup2_i2c_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp2_qup2_spi_apps_clk = {
+       .halt_reg = 0x28004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x28004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp2_qup2_spi_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp2_qup2_spi_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp2_qup3_i2c_apps_clk = {
+       .halt_reg = 0x2a008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2a008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp2_qup3_i2c_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp2_qup3_i2c_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp2_qup3_spi_apps_clk = {
+       .halt_reg = 0x2a004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2a004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp2_qup3_spi_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp2_qup3_spi_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp2_qup4_i2c_apps_clk = {
+       .halt_reg = 0x2c008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2c008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp2_qup4_i2c_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp2_qup4_i2c_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp2_qup4_spi_apps_clk = {
+       .halt_reg = 0x2c004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2c004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp2_qup4_spi_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp2_qup4_spi_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp2_uart1_apps_clk = {
+       .halt_reg = 0x27004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x27004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp2_uart1_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp2_uart1_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp2_uart2_apps_clk = {
+       .halt_reg = 0x29004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x29004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_blsp2_uart2_apps_clk",
+                       .parent_names = (const char *[]){
+                               "blsp2_uart2_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_boot_rom_ahb_clk = {
+       .halt_reg = 0x38004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52004,
+               .enable_mask = BIT(10),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_boot_rom_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_cfg_noc_usb2_axi_clk = {
+       .halt_reg = 0x5058,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5058,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_cfg_noc_usb2_axi_clk",
+                       .parent_names = (const char *[]){
+                               "usb20_master_clk_src",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_cfg_noc_usb3_axi_clk = {
+       .halt_reg = 0x5018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_cfg_noc_usb3_axi_clk",
+                       .parent_names = (const char *[]){
+                               "usb30_master_clk_src",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_dcc_ahb_clk = {
+       .halt_reg = 0x84004,
+       .clkr = {
+               .enable_reg = 0x84004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_dcc_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gp1_clk = {
+       .halt_reg = 0x64000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x64000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gp1_clk",
+                       .parent_names = (const char *[]){
+                               "gp1_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gp2_clk = {
+       .halt_reg = 0x65000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x65000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gp2_clk",
+                       .parent_names = (const char *[]){
+                               "gp2_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gp3_clk = {
+       .halt_reg = 0x66000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x66000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gp3_clk",
+                       .parent_names = (const char *[]){
+                               "gp3_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gpu_bimc_gfx_clk = {
+       .halt_reg = 0x71010,
+       .halt_check = BRANCH_VOTED,
+       .clkr = {
+               .enable_reg = 0x71010,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gpu_bimc_gfx_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gpu_cfg_ahb_clk = {
+       .halt_reg = 0x71004,
+       .halt_check = BRANCH_VOTED,
+       .clkr = {
+               .enable_reg = 0x71004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gpu_cfg_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gpu_gpll0_clk = {
+       .halt_reg = 0x5200c,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(4),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gpu_gpll0_clk",
+                       .parent_names = (const char *[]){
+                               "gpll0",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gpu_gpll0_div_clk = {
+       .halt_reg = 0x5200c,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(3),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gpu_gpll0_div_clk",
+                       .parent_names = (const char *[]){
+                               "gpll0_early_div",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_hmss_dvm_bus_clk = {
+       .halt_reg = 0x4808c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4808c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_hmss_dvm_bus_clk",
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_IGNORE_UNUSED,
+               },
+       },
+};
+
+static struct clk_branch gcc_hmss_rbcpr_clk = {
+       .halt_reg = 0x48008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x48008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_hmss_rbcpr_clk",
+                       .parent_names = (const char *[]){
+                               "hmss_rbcpr_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mmss_gpll0_clk = {
+       .halt_reg = 0x5200c,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mmss_gpll0_clk",
+                       .parent_names = (const char *[]){
+                               "gpll0",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mmss_gpll0_div_clk = {
+       .halt_reg = 0x5200c,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mmss_gpll0_div_clk",
+                       .parent_names = (const char *[]){
+                               "gpll0_early_div",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mmss_noc_cfg_ahb_clk = {
+       .halt_reg = 0x9004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x9004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mmss_noc_cfg_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mmss_sys_noc_axi_clk = {
+       .halt_reg = 0x9000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x9000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mmss_sys_noc_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mss_cfg_ahb_clk = {
+       .halt_reg = 0x8a000,
+       .clkr = {
+               .enable_reg = 0x8a000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mss_cfg_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mss_mnoc_bimc_axi_clk = {
+       .halt_reg = 0x8a004,
+       .clkr = {
+               .enable_reg = 0x8a004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mss_mnoc_bimc_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mss_q6_bimc_axi_clk = {
+       .halt_reg = 0x8a040,
+       .clkr = {
+               .enable_reg = 0x8a040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mss_q6_bimc_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mss_snoc_axi_clk = {
+       .halt_reg = 0x8a03c,
+       .clkr = {
+               .enable_reg = 0x8a03c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mss_snoc_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pdm2_clk = {
+       .halt_reg = 0x3300c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3300c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pdm2_clk",
+                       .parent_names = (const char *[]){
+                               "pdm2_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pdm_ahb_clk = {
+       .halt_reg = 0x33004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x33004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pdm_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_prng_ahb_clk = {
+       .halt_reg = 0x34004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52004,
+               .enable_mask = BIT(13),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_prng_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qspi_ahb_clk = {
+       .halt_reg = 0x4d004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qspi_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qspi_ser_clk = {
+       .halt_reg = 0x4d008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qspi_ser_clk",
+                       .parent_names = (const char *[]){
+                               "qspi_ser_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_rx0_usb2_clkref_clk = {
+       .halt_reg = 0x88018,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x88018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_rx0_usb2_clkref_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_rx1_usb2_clkref_clk = {
+       .halt_reg = 0x88014,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x88014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_rx1_usb2_clkref_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sdcc1_ahb_clk = {
+       .halt_reg = 0x16008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x16008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_sdcc1_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sdcc1_apps_clk = {
+       .halt_reg = 0x16004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x16004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_sdcc1_apps_clk",
+                       .parent_names = (const char *[]){
+                               "sdcc1_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sdcc1_ice_core_clk = {
+       .halt_reg = 0x1600c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1600c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_sdcc1_ice_core_clk",
+                       .parent_names = (const char *[]){
+                               "sdcc1_ice_core_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sdcc2_ahb_clk = {
+       .halt_reg = 0x14008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x14008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_sdcc2_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sdcc2_apps_clk = {
+       .halt_reg = 0x14004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x14004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_sdcc2_apps_clk",
+                       .parent_names = (const char *[]){
+                               "sdcc2_apps_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_ahb_clk = {
+       .halt_reg = 0x7500c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x7500c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_axi_clk = {
+       .halt_reg = 0x75008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x75008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_axi_clk",
+                       .parent_names = (const char *[]){
+                               "ufs_axi_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_clkref_clk = {
+       .halt_reg = 0x88008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x88008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_clkref_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_ice_core_clk = {
+       .halt_reg = 0x7600c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x7600c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_ice_core_clk",
+                       .parent_names = (const char *[]){
+                               "ufs_ice_core_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_aux_clk = {
+       .halt_reg = 0x76040,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x76040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_aux_clk",
+                       .parent_names = (const char *[]){
+                               "ufs_phy_aux_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_rx_symbol_0_clk = {
+       .halt_reg = 0x75014,
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x75014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_rx_symbol_0_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_rx_symbol_1_clk = {
+       .halt_reg = 0x7605c,
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x7605c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_rx_symbol_1_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_tx_symbol_0_clk = {
+       .halt_reg = 0x75010,
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x75010,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_tx_symbol_0_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_unipro_core_clk = {
+       .halt_reg = 0x76008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x76008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_unipro_core_clk",
+                       .parent_names = (const char *[]){
+                               "ufs_unipro_core_clk_src",
+                       },
+                       .flags = CLK_SET_RATE_PARENT,
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb20_master_clk = {
+       .halt_reg = 0x2f004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2f004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb20_master_clk",
+                       .parent_names = (const char *[]){
+                               "usb20_master_clk_src"
+                       },
+                       .flags = CLK_SET_RATE_PARENT,
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb20_mock_utmi_clk = {
+       .halt_reg = 0x2f00c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2f00c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb20_mock_utmi_clk",
+                       .parent_names = (const char *[]){
+                               "usb20_mock_utmi_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb20_sleep_clk = {
+       .halt_reg = 0x2f008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2f008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb20_sleep_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb30_master_clk = {
+       .halt_reg = 0xf008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xf008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb30_master_clk",
+                       .parent_names = (const char *[]){
+                               "usb30_master_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb30_mock_utmi_clk = {
+       .halt_reg = 0xf010,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xf010,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb30_mock_utmi_clk",
+                       .parent_names = (const char *[]){
+                               "usb30_mock_utmi_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb30_sleep_clk = {
+       .halt_reg = 0xf00c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xf00c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb30_sleep_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb3_clkref_clk = {
+       .halt_reg = 0x8800c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8800c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb3_clkref_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb3_phy_aux_clk = {
+       .halt_reg = 0x50000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x50000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb3_phy_aux_clk",
+                       .parent_names = (const char *[]){
+                               "usb3_phy_aux_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb3_phy_pipe_clk = {
+       .halt_reg = 0x50004,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x50004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb3_phy_pipe_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb_phy_cfg_ahb2phy_clk = {
+       .halt_reg = 0x6a004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x6a004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb_phy_cfg_ahb2phy_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct gdsc ufs_gdsc = {
+       .gdscr = 0x75004,
+       .gds_hw_ctrl = 0x0,
+       .pd = {
+               .name = "ufs_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE,
+};
+
+static struct gdsc usb_30_gdsc = {
+       .gdscr = 0xf004,
+       .gds_hw_ctrl = 0x0,
+       .pd = {
+               .name = "usb_30_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE,
+};
+
+static struct gdsc pcie_0_gdsc = {
+       .gdscr = 0x6b004,
+       .gds_hw_ctrl = 0x0,
+       .pd = {
+               .name = "pcie_0_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE,
+};
+
+static struct clk_hw *gcc_sdm660_hws[] = {
+       &xo.hw,
+       &gpll0_early_div.hw,
+       &gpll1_early_div.hw,
+};
+
+static struct clk_regmap *gcc_sdm660_clocks[] = {
+       [BLSP1_QUP1_I2C_APPS_CLK_SRC] = &blsp1_qup1_i2c_apps_clk_src.clkr,
+       [BLSP1_QUP1_SPI_APPS_CLK_SRC] = &blsp1_qup1_spi_apps_clk_src.clkr,
+       [BLSP1_QUP2_I2C_APPS_CLK_SRC] = &blsp1_qup2_i2c_apps_clk_src.clkr,
+       [BLSP1_QUP2_SPI_APPS_CLK_SRC] = &blsp1_qup2_spi_apps_clk_src.clkr,
+       [BLSP1_QUP3_I2C_APPS_CLK_SRC] = &blsp1_qup3_i2c_apps_clk_src.clkr,
+       [BLSP1_QUP3_SPI_APPS_CLK_SRC] = &blsp1_qup3_spi_apps_clk_src.clkr,
+       [BLSP1_QUP4_I2C_APPS_CLK_SRC] = &blsp1_qup4_i2c_apps_clk_src.clkr,
+       [BLSP1_QUP4_SPI_APPS_CLK_SRC] = &blsp1_qup4_spi_apps_clk_src.clkr,
+       [BLSP1_UART1_APPS_CLK_SRC] = &blsp1_uart1_apps_clk_src.clkr,
+       [BLSP1_UART2_APPS_CLK_SRC] = &blsp1_uart2_apps_clk_src.clkr,
+       [BLSP2_QUP1_I2C_APPS_CLK_SRC] = &blsp2_qup1_i2c_apps_clk_src.clkr,
+       [BLSP2_QUP1_SPI_APPS_CLK_SRC] = &blsp2_qup1_spi_apps_clk_src.clkr,
+       [BLSP2_QUP2_I2C_APPS_CLK_SRC] = &blsp2_qup2_i2c_apps_clk_src.clkr,
+       [BLSP2_QUP2_SPI_APPS_CLK_SRC] = &blsp2_qup2_spi_apps_clk_src.clkr,
+       [BLSP2_QUP3_I2C_APPS_CLK_SRC] = &blsp2_qup3_i2c_apps_clk_src.clkr,
+       [BLSP2_QUP3_SPI_APPS_CLK_SRC] = &blsp2_qup3_spi_apps_clk_src.clkr,
+       [BLSP2_QUP4_I2C_APPS_CLK_SRC] = &blsp2_qup4_i2c_apps_clk_src.clkr,
+       [BLSP2_QUP4_SPI_APPS_CLK_SRC] = &blsp2_qup4_spi_apps_clk_src.clkr,
+       [BLSP2_UART1_APPS_CLK_SRC] = &blsp2_uart1_apps_clk_src.clkr,
+       [BLSP2_UART2_APPS_CLK_SRC] = &blsp2_uart2_apps_clk_src.clkr,
+       [GCC_AGGRE2_UFS_AXI_CLK] = &gcc_aggre2_ufs_axi_clk.clkr,
+       [GCC_AGGRE2_USB3_AXI_CLK] = &gcc_aggre2_usb3_axi_clk.clkr,
+       [GCC_BIMC_GFX_CLK] = &gcc_bimc_gfx_clk.clkr,
+       [GCC_BIMC_HMSS_AXI_CLK] = &gcc_bimc_hmss_axi_clk.clkr,
+       [GCC_BIMC_MSS_Q6_AXI_CLK] = &gcc_bimc_mss_q6_axi_clk.clkr,
+       [GCC_BLSP1_AHB_CLK] = &gcc_blsp1_ahb_clk.clkr,
+       [GCC_BLSP1_QUP1_I2C_APPS_CLK] = &gcc_blsp1_qup1_i2c_apps_clk.clkr,
+       [GCC_BLSP1_QUP1_SPI_APPS_CLK] = &gcc_blsp1_qup1_spi_apps_clk.clkr,
+       [GCC_BLSP1_QUP2_I2C_APPS_CLK] = &gcc_blsp1_qup2_i2c_apps_clk.clkr,
+       [GCC_BLSP1_QUP2_SPI_APPS_CLK] = &gcc_blsp1_qup2_spi_apps_clk.clkr,
+       [GCC_BLSP1_QUP3_I2C_APPS_CLK] = &gcc_blsp1_qup3_i2c_apps_clk.clkr,
+       [GCC_BLSP1_QUP3_SPI_APPS_CLK] = &gcc_blsp1_qup3_spi_apps_clk.clkr,
+       [GCC_BLSP1_QUP4_I2C_APPS_CLK] = &gcc_blsp1_qup4_i2c_apps_clk.clkr,
+       [GCC_BLSP1_QUP4_SPI_APPS_CLK] = &gcc_blsp1_qup4_spi_apps_clk.clkr,
+       [GCC_BLSP1_UART1_APPS_CLK] = &gcc_blsp1_uart1_apps_clk.clkr,
+       [GCC_BLSP1_UART2_APPS_CLK] = &gcc_blsp1_uart2_apps_clk.clkr,
+       [GCC_BLSP2_AHB_CLK] = &gcc_blsp2_ahb_clk.clkr,
+       [GCC_BLSP2_QUP1_I2C_APPS_CLK] = &gcc_blsp2_qup1_i2c_apps_clk.clkr,
+       [GCC_BLSP2_QUP1_SPI_APPS_CLK] = &gcc_blsp2_qup1_spi_apps_clk.clkr,
+       [GCC_BLSP2_QUP2_I2C_APPS_CLK] = &gcc_blsp2_qup2_i2c_apps_clk.clkr,
+       [GCC_BLSP2_QUP2_SPI_APPS_CLK] = &gcc_blsp2_qup2_spi_apps_clk.clkr,
+       [GCC_BLSP2_QUP3_I2C_APPS_CLK] = &gcc_blsp2_qup3_i2c_apps_clk.clkr,
+       [GCC_BLSP2_QUP3_SPI_APPS_CLK] = &gcc_blsp2_qup3_spi_apps_clk.clkr,
+       [GCC_BLSP2_QUP4_I2C_APPS_CLK] = &gcc_blsp2_qup4_i2c_apps_clk.clkr,
+       [GCC_BLSP2_QUP4_SPI_APPS_CLK] = &gcc_blsp2_qup4_spi_apps_clk.clkr,
+       [GCC_BLSP2_UART1_APPS_CLK] = &gcc_blsp2_uart1_apps_clk.clkr,
+       [GCC_BLSP2_UART2_APPS_CLK] = &gcc_blsp2_uart2_apps_clk.clkr,
+       [GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr,
+       [GCC_CFG_NOC_USB2_AXI_CLK] = &gcc_cfg_noc_usb2_axi_clk.clkr,
+       [GCC_CFG_NOC_USB3_AXI_CLK] = &gcc_cfg_noc_usb3_axi_clk.clkr,
+       [GCC_DCC_AHB_CLK] = &gcc_dcc_ahb_clk.clkr,
+       [GCC_GP1_CLK] = &gcc_gp1_clk.clkr,
+       [GCC_GP2_CLK] = &gcc_gp2_clk.clkr,
+       [GCC_GP3_CLK] = &gcc_gp3_clk.clkr,
+       [GCC_GPU_BIMC_GFX_CLK] = &gcc_gpu_bimc_gfx_clk.clkr,
+       [GCC_GPU_CFG_AHB_CLK] = &gcc_gpu_cfg_ahb_clk.clkr,
+       [GCC_GPU_GPLL0_CLK] = &gcc_gpu_gpll0_clk.clkr,
+       [GCC_GPU_GPLL0_DIV_CLK] = &gcc_gpu_gpll0_div_clk.clkr,
+       [GCC_HMSS_DVM_BUS_CLK] = &gcc_hmss_dvm_bus_clk.clkr,
+       [GCC_HMSS_RBCPR_CLK] = &gcc_hmss_rbcpr_clk.clkr,
+       [GCC_MMSS_GPLL0_CLK] = &gcc_mmss_gpll0_clk.clkr,
+       [GCC_MMSS_GPLL0_DIV_CLK] = &gcc_mmss_gpll0_div_clk.clkr,
+       [GCC_MMSS_NOC_CFG_AHB_CLK] = &gcc_mmss_noc_cfg_ahb_clk.clkr,
+       [GCC_MMSS_SYS_NOC_AXI_CLK] = &gcc_mmss_sys_noc_axi_clk.clkr,
+       [GCC_MSS_CFG_AHB_CLK] = &gcc_mss_cfg_ahb_clk.clkr,
+       [GCC_MSS_MNOC_BIMC_AXI_CLK] = &gcc_mss_mnoc_bimc_axi_clk.clkr,
+       [GCC_MSS_Q6_BIMC_AXI_CLK] = &gcc_mss_q6_bimc_axi_clk.clkr,
+       [GCC_MSS_SNOC_AXI_CLK] = &gcc_mss_snoc_axi_clk.clkr,
+       [GCC_PDM2_CLK] = &gcc_pdm2_clk.clkr,
+       [GCC_PDM_AHB_CLK] = &gcc_pdm_ahb_clk.clkr,
+       [GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr,
+       [GCC_QSPI_AHB_CLK] = &gcc_qspi_ahb_clk.clkr,
+       [GCC_QSPI_SER_CLK] = &gcc_qspi_ser_clk.clkr,
+       [GCC_RX0_USB2_CLKREF_CLK] = &gcc_rx0_usb2_clkref_clk.clkr,
+       [GCC_RX1_USB2_CLKREF_CLK] = &gcc_rx1_usb2_clkref_clk.clkr,
+       [GCC_SDCC1_AHB_CLK] = &gcc_sdcc1_ahb_clk.clkr,
+       [GCC_SDCC1_APPS_CLK] = &gcc_sdcc1_apps_clk.clkr,
+       [GCC_SDCC1_ICE_CORE_CLK] = &gcc_sdcc1_ice_core_clk.clkr,
+       [GCC_SDCC2_AHB_CLK] = &gcc_sdcc2_ahb_clk.clkr,
+       [GCC_SDCC2_APPS_CLK] = &gcc_sdcc2_apps_clk.clkr,
+       [GCC_UFS_AHB_CLK] = &gcc_ufs_ahb_clk.clkr,
+       [GCC_UFS_AXI_CLK] = &gcc_ufs_axi_clk.clkr,
+       [GCC_UFS_CLKREF_CLK] = &gcc_ufs_clkref_clk.clkr,
+       [GCC_UFS_ICE_CORE_CLK] = &gcc_ufs_ice_core_clk.clkr,
+       [GCC_UFS_PHY_AUX_CLK] = &gcc_ufs_phy_aux_clk.clkr,
+       [GCC_UFS_RX_SYMBOL_0_CLK] = &gcc_ufs_rx_symbol_0_clk.clkr,
+       [GCC_UFS_RX_SYMBOL_1_CLK] = &gcc_ufs_rx_symbol_1_clk.clkr,
+       [GCC_UFS_TX_SYMBOL_0_CLK] = &gcc_ufs_tx_symbol_0_clk.clkr,
+       [GCC_UFS_UNIPRO_CORE_CLK] = &gcc_ufs_unipro_core_clk.clkr,
+       [GCC_USB20_MASTER_CLK] = &gcc_usb20_master_clk.clkr,
+       [GCC_USB20_MOCK_UTMI_CLK] = &gcc_usb20_mock_utmi_clk.clkr,
+       [GCC_USB20_SLEEP_CLK] = &gcc_usb20_sleep_clk.clkr,
+       [GCC_USB30_MASTER_CLK] = &gcc_usb30_master_clk.clkr,
+       [GCC_USB30_MOCK_UTMI_CLK] = &gcc_usb30_mock_utmi_clk.clkr,
+       [GCC_USB30_SLEEP_CLK] = &gcc_usb30_sleep_clk.clkr,
+       [GCC_USB3_CLKREF_CLK] = &gcc_usb3_clkref_clk.clkr,
+       [GCC_USB3_PHY_AUX_CLK] = &gcc_usb3_phy_aux_clk.clkr,
+       [GCC_USB3_PHY_PIPE_CLK] = &gcc_usb3_phy_pipe_clk.clkr,
+       [GCC_USB_PHY_CFG_AHB2PHY_CLK] = &gcc_usb_phy_cfg_ahb2phy_clk.clkr,
+       [GP1_CLK_SRC] = &gp1_clk_src.clkr,
+       [GP2_CLK_SRC] = &gp2_clk_src.clkr,
+       [GP3_CLK_SRC] = &gp3_clk_src.clkr,
+       [GPLL0] = &gpll0.clkr,
+       [GPLL0_EARLY] = &gpll0_early.clkr,
+       [GPLL1] = &gpll1.clkr,
+       [GPLL1_EARLY] = &gpll1_early.clkr,
+       [GPLL4] = &gpll4.clkr,
+       [GPLL4_EARLY] = &gpll4_early.clkr,
+       [HMSS_GPLL0_CLK_SRC] = &hmss_gpll0_clk_src.clkr,
+       [HMSS_GPLL4_CLK_SRC] = &hmss_gpll4_clk_src.clkr,
+       [HMSS_RBCPR_CLK_SRC] = &hmss_rbcpr_clk_src.clkr,
+       [PDM2_CLK_SRC] = &pdm2_clk_src.clkr,
+       [QSPI_SER_CLK_SRC] = &qspi_ser_clk_src.clkr,
+       [SDCC1_APPS_CLK_SRC] = &sdcc1_apps_clk_src.clkr,
+       [SDCC1_ICE_CORE_CLK_SRC] = &sdcc1_ice_core_clk_src.clkr,
+       [SDCC2_APPS_CLK_SRC] = &sdcc2_apps_clk_src.clkr,
+       [UFS_AXI_CLK_SRC] = &ufs_axi_clk_src.clkr,
+       [UFS_ICE_CORE_CLK_SRC] = &ufs_ice_core_clk_src.clkr,
+       [UFS_PHY_AUX_CLK_SRC] = &ufs_phy_aux_clk_src.clkr,
+       [UFS_UNIPRO_CORE_CLK_SRC] = &ufs_unipro_core_clk_src.clkr,
+       [USB20_MASTER_CLK_SRC] = &usb20_master_clk_src.clkr,
+       [USB20_MOCK_UTMI_CLK_SRC] = &usb20_mock_utmi_clk_src.clkr,
+       [USB30_MASTER_CLK_SRC] = &usb30_master_clk_src.clkr,
+       [USB30_MOCK_UTMI_CLK_SRC] = &usb30_mock_utmi_clk_src.clkr,
+       [USB3_PHY_AUX_CLK_SRC] = &usb3_phy_aux_clk_src.clkr,
+};
+
+static struct gdsc *gcc_sdm660_gdscs[] = {
+       [UFS_GDSC] = &ufs_gdsc,
+       [USB_30_GDSC] = &usb_30_gdsc,
+       [PCIE_0_GDSC] = &pcie_0_gdsc,
+};
+
+static const struct qcom_reset_map gcc_sdm660_resets[] = {
+       [GCC_QUSB2PHY_PRIM_BCR] = { 0x12000 },
+       [GCC_QUSB2PHY_SEC_BCR] = { 0x12004 },
+       [GCC_UFS_BCR] = { 0x75000 },
+       [GCC_USB3_DP_PHY_BCR] = { 0x50028 },
+       [GCC_USB3_PHY_BCR] = { 0x50020 },
+       [GCC_USB3PHY_PHY_BCR] = { 0x50024 },
+       [GCC_USB_20_BCR] = { 0x2f000 },
+       [GCC_USB_30_BCR] = { 0xf000 },
+       [GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 },
+};
+
+static const struct regmap_config gcc_sdm660_regmap_config = {
+       .reg_bits       = 32,
+       .reg_stride     = 4,
+       .val_bits       = 32,
+       .max_register   = 0x94000,
+       .fast_io        = true,
+};
+
+static const struct qcom_cc_desc gcc_sdm660_desc = {
+       .config = &gcc_sdm660_regmap_config,
+       .clks = gcc_sdm660_clocks,
+       .num_clks = ARRAY_SIZE(gcc_sdm660_clocks),
+       .resets = gcc_sdm660_resets,
+       .num_resets = ARRAY_SIZE(gcc_sdm660_resets),
+       .gdscs = gcc_sdm660_gdscs,
+       .num_gdscs = ARRAY_SIZE(gcc_sdm660_gdscs),
+};
+
+static const struct of_device_id gcc_sdm660_match_table[] = {
+       { .compatible = "qcom,gcc-sdm630" },
+       { .compatible = "qcom,gcc-sdm660" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, gcc_sdm660_match_table);
+
+static int gcc_sdm660_probe(struct platform_device *pdev)
+{
+       int i, ret;
+       struct regmap *regmap;
+
+       regmap = qcom_cc_map(pdev, &gcc_sdm660_desc);
+       if (IS_ERR(regmap))
+               return PTR_ERR(regmap);
+
+       /*
+        * Set the HMSS_AHB_CLK_SLEEP_ENA bit to allow the hmss_ahb_clk to be
+        * turned off by hardware during certain apps low power modes.
+        */
+       ret = regmap_update_bits(regmap, 0x52008, BIT(21), BIT(21));
+       if (ret)
+               return ret;
+
+       /* Register the hws */
+       for (i = 0; i < ARRAY_SIZE(gcc_sdm660_hws); i++) {
+               ret = devm_clk_hw_register(&pdev->dev, gcc_sdm660_hws[i]);
+               if (ret)
+                       return ret;
+       }
+
+       return qcom_cc_really_probe(pdev, &gcc_sdm660_desc, regmap);
+}
+
+static struct platform_driver gcc_sdm660_driver = {
+       .probe          = gcc_sdm660_probe,
+       .driver         = {
+               .name   = "gcc-sdm660",
+               .of_match_table = gcc_sdm660_match_table,
+       },
+};
+
+static int __init gcc_sdm660_init(void)
+{
+       return platform_driver_register(&gcc_sdm660_driver);
+}
+core_initcall_sync(gcc_sdm660_init);
+
+static void __exit gcc_sdm660_exit(void)
+{
+       platform_driver_unregister(&gcc_sdm660_driver);
+}
+module_exit(gcc_sdm660_exit);
+
+MODULE_LICENSE("GPL v2");
+MODULE_DESCRIPTION("QCOM GCC sdm660 Driver");
index a7e72ebb79ba82da9a30bb504a4c4df120209148..f133b7f5652fbf5ab054379d795d251c58111b92 100644 (file)
@@ -340,6 +340,28 @@ static struct clk_rcg2 gcc_pcie_phy_refgen_clk_src = {
        },
 };
 
+static const struct freq_tbl ftbl_gcc_qspi_core_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0),
+       F(150000000, P_GPLL0_OUT_MAIN, 4, 0, 0),
+       F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_qspi_core_clk_src = {
+       .cmd_rcgr = 0x4b008,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_qspi_core_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_qspi_core_clk_src",
+               .parent_names = gcc_parent_names_0,
+               .num_parents = 4,
+               .ops = &clk_rcg2_floor_ops,
+       },
+};
+
 static const struct freq_tbl ftbl_gcc_pdm2_clk_src[] = {
        F(9600000, P_BI_TCXO, 2, 0, 0),
        F(19200000, P_BI_TCXO, 1, 0, 0),
@@ -380,18 +402,27 @@ static const struct freq_tbl ftbl_gcc_qupv3_wrap0_s0_clk_src[] = {
        { }
 };
 
+static struct clk_init_data gcc_qupv3_wrap0_s0_clk_init = {
+       .name = "gcc_qupv3_wrap0_s0_clk_src",
+       .parent_names = gcc_parent_names_0,
+       .num_parents = 4,
+       .ops = &clk_rcg2_shared_ops,
+};
+
 static struct clk_rcg2 gcc_qupv3_wrap0_s0_clk_src = {
        .cmd_rcgr = 0x17034,
        .mnd_width = 16,
        .hid_width = 5,
        .parent_map = gcc_parent_map_0,
        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "gcc_qupv3_wrap0_s0_clk_src",
-               .parent_names = gcc_parent_names_0,
-               .num_parents = 4,
-               .ops = &clk_rcg2_shared_ops,
-       },
+       .clkr.hw.init = &gcc_qupv3_wrap0_s0_clk_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap0_s1_clk_init = {
+       .name = "gcc_qupv3_wrap0_s1_clk_src",
+       .parent_names = gcc_parent_names_0,
+       .num_parents = 4,
+       .ops = &clk_rcg2_shared_ops,
 };
 
 static struct clk_rcg2 gcc_qupv3_wrap0_s1_clk_src = {
@@ -400,12 +431,14 @@ static struct clk_rcg2 gcc_qupv3_wrap0_s1_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_parent_map_0,
        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "gcc_qupv3_wrap0_s1_clk_src",
-               .parent_names = gcc_parent_names_0,
-               .num_parents = 4,
-               .ops = &clk_rcg2_shared_ops,
-       },
+       .clkr.hw.init = &gcc_qupv3_wrap0_s1_clk_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap0_s2_clk_init = {
+       .name = "gcc_qupv3_wrap0_s2_clk_src",
+       .parent_names = gcc_parent_names_0,
+       .num_parents = 4,
+       .ops = &clk_rcg2_shared_ops,
 };
 
 static struct clk_rcg2 gcc_qupv3_wrap0_s2_clk_src = {
@@ -414,12 +447,14 @@ static struct clk_rcg2 gcc_qupv3_wrap0_s2_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_parent_map_0,
        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "gcc_qupv3_wrap0_s2_clk_src",
-               .parent_names = gcc_parent_names_0,
-               .num_parents = 4,
-               .ops = &clk_rcg2_shared_ops,
-       },
+       .clkr.hw.init = &gcc_qupv3_wrap0_s2_clk_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap0_s3_clk_init = {
+       .name = "gcc_qupv3_wrap0_s3_clk_src",
+       .parent_names = gcc_parent_names_0,
+       .num_parents = 4,
+       .ops = &clk_rcg2_shared_ops,
 };
 
 static struct clk_rcg2 gcc_qupv3_wrap0_s3_clk_src = {
@@ -428,12 +463,14 @@ static struct clk_rcg2 gcc_qupv3_wrap0_s3_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_parent_map_0,
        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "gcc_qupv3_wrap0_s3_clk_src",
-               .parent_names = gcc_parent_names_0,
-               .num_parents = 4,
-               .ops = &clk_rcg2_shared_ops,
-       },
+       .clkr.hw.init = &gcc_qupv3_wrap0_s3_clk_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap0_s4_clk_init = {
+       .name = "gcc_qupv3_wrap0_s4_clk_src",
+       .parent_names = gcc_parent_names_0,
+       .num_parents = 4,
+       .ops = &clk_rcg2_shared_ops,
 };
 
 static struct clk_rcg2 gcc_qupv3_wrap0_s4_clk_src = {
@@ -442,12 +479,14 @@ static struct clk_rcg2 gcc_qupv3_wrap0_s4_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_parent_map_0,
        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "gcc_qupv3_wrap0_s4_clk_src",
-               .parent_names = gcc_parent_names_0,
-               .num_parents = 4,
-               .ops = &clk_rcg2_shared_ops,
-       },
+       .clkr.hw.init = &gcc_qupv3_wrap0_s4_clk_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap0_s5_clk_init = {
+       .name = "gcc_qupv3_wrap0_s5_clk_src",
+       .parent_names = gcc_parent_names_0,
+       .num_parents = 4,
+       .ops = &clk_rcg2_shared_ops,
 };
 
 static struct clk_rcg2 gcc_qupv3_wrap0_s5_clk_src = {
@@ -456,12 +495,14 @@ static struct clk_rcg2 gcc_qupv3_wrap0_s5_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_parent_map_0,
        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "gcc_qupv3_wrap0_s5_clk_src",
-               .parent_names = gcc_parent_names_0,
-               .num_parents = 4,
-               .ops = &clk_rcg2_shared_ops,
-       },
+       .clkr.hw.init = &gcc_qupv3_wrap0_s5_clk_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap0_s6_clk_init = {
+       .name = "gcc_qupv3_wrap0_s6_clk_src",
+       .parent_names = gcc_parent_names_0,
+       .num_parents = 4,
+       .ops = &clk_rcg2_shared_ops,
 };
 
 static struct clk_rcg2 gcc_qupv3_wrap0_s6_clk_src = {
@@ -470,12 +511,14 @@ static struct clk_rcg2 gcc_qupv3_wrap0_s6_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_parent_map_0,
        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "gcc_qupv3_wrap0_s6_clk_src",
-               .parent_names = gcc_parent_names_0,
-               .num_parents = 4,
-               .ops = &clk_rcg2_shared_ops,
-       },
+       .clkr.hw.init = &gcc_qupv3_wrap0_s6_clk_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap0_s7_clk_init = {
+       .name = "gcc_qupv3_wrap0_s7_clk_src",
+       .parent_names = gcc_parent_names_0,
+       .num_parents = 4,
+       .ops = &clk_rcg2_shared_ops,
 };
 
 static struct clk_rcg2 gcc_qupv3_wrap0_s7_clk_src = {
@@ -484,12 +527,14 @@ static struct clk_rcg2 gcc_qupv3_wrap0_s7_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_parent_map_0,
        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "gcc_qupv3_wrap0_s7_clk_src",
-               .parent_names = gcc_parent_names_0,
-               .num_parents = 4,
-               .ops = &clk_rcg2_shared_ops,
-       },
+       .clkr.hw.init = &gcc_qupv3_wrap0_s7_clk_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap1_s0_clk_init = {
+       .name = "gcc_qupv3_wrap1_s0_clk_src",
+       .parent_names = gcc_parent_names_0,
+       .num_parents = 4,
+       .ops = &clk_rcg2_shared_ops,
 };
 
 static struct clk_rcg2 gcc_qupv3_wrap1_s0_clk_src = {
@@ -498,12 +543,14 @@ static struct clk_rcg2 gcc_qupv3_wrap1_s0_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_parent_map_0,
        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "gcc_qupv3_wrap1_s0_clk_src",
-               .parent_names = gcc_parent_names_0,
-               .num_parents = 4,
-               .ops = &clk_rcg2_shared_ops,
-       },
+       .clkr.hw.init = &gcc_qupv3_wrap1_s0_clk_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap1_s1_clk_init = {
+       .name = "gcc_qupv3_wrap1_s1_clk_src",
+       .parent_names = gcc_parent_names_0,
+       .num_parents = 4,
+       .ops = &clk_rcg2_shared_ops,
 };
 
 static struct clk_rcg2 gcc_qupv3_wrap1_s1_clk_src = {
@@ -512,12 +559,14 @@ static struct clk_rcg2 gcc_qupv3_wrap1_s1_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_parent_map_0,
        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "gcc_qupv3_wrap1_s1_clk_src",
-               .parent_names = gcc_parent_names_0,
-               .num_parents = 4,
-               .ops = &clk_rcg2_shared_ops,
-       },
+       .clkr.hw.init = &gcc_qupv3_wrap1_s1_clk_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap1_s2_clk_init = {
+       .name = "gcc_qupv3_wrap1_s2_clk_src",
+       .parent_names = gcc_parent_names_0,
+       .num_parents = 4,
+       .ops = &clk_rcg2_shared_ops,
 };
 
 static struct clk_rcg2 gcc_qupv3_wrap1_s2_clk_src = {
@@ -526,12 +575,14 @@ static struct clk_rcg2 gcc_qupv3_wrap1_s2_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_parent_map_0,
        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "gcc_qupv3_wrap1_s2_clk_src",
-               .parent_names = gcc_parent_names_0,
-               .num_parents = 4,
-               .ops = &clk_rcg2_shared_ops,
-       },
+       .clkr.hw.init = &gcc_qupv3_wrap1_s2_clk_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap1_s3_clk_init = {
+       .name = "gcc_qupv3_wrap1_s3_clk_src",
+       .parent_names = gcc_parent_names_0,
+       .num_parents = 4,
+       .ops = &clk_rcg2_shared_ops,
 };
 
 static struct clk_rcg2 gcc_qupv3_wrap1_s3_clk_src = {
@@ -540,12 +591,14 @@ static struct clk_rcg2 gcc_qupv3_wrap1_s3_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_parent_map_0,
        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "gcc_qupv3_wrap1_s3_clk_src",
-               .parent_names = gcc_parent_names_0,
-               .num_parents = 4,
-               .ops = &clk_rcg2_shared_ops,
-       },
+       .clkr.hw.init = &gcc_qupv3_wrap1_s3_clk_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap1_s4_clk_init = {
+       .name = "gcc_qupv3_wrap1_s4_clk_src",
+       .parent_names = gcc_parent_names_0,
+       .num_parents = 4,
+       .ops = &clk_rcg2_shared_ops,
 };
 
 static struct clk_rcg2 gcc_qupv3_wrap1_s4_clk_src = {
@@ -554,12 +607,14 @@ static struct clk_rcg2 gcc_qupv3_wrap1_s4_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_parent_map_0,
        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "gcc_qupv3_wrap1_s4_clk_src",
-               .parent_names = gcc_parent_names_0,
-               .num_parents = 4,
-               .ops = &clk_rcg2_shared_ops,
-       },
+       .clkr.hw.init = &gcc_qupv3_wrap1_s4_clk_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap1_s5_clk_init = {
+       .name = "gcc_qupv3_wrap1_s5_clk_src",
+       .parent_names = gcc_parent_names_0,
+       .num_parents = 4,
+       .ops = &clk_rcg2_shared_ops,
 };
 
 static struct clk_rcg2 gcc_qupv3_wrap1_s5_clk_src = {
@@ -568,12 +623,14 @@ static struct clk_rcg2 gcc_qupv3_wrap1_s5_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_parent_map_0,
        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "gcc_qupv3_wrap1_s5_clk_src",
-               .parent_names = gcc_parent_names_0,
-               .num_parents = 4,
-               .ops = &clk_rcg2_shared_ops,
-       },
+       .clkr.hw.init = &gcc_qupv3_wrap1_s5_clk_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap1_s6_clk_init = {
+       .name = "gcc_qupv3_wrap1_s6_clk_src",
+       .parent_names = gcc_parent_names_0,
+       .num_parents = 4,
+       .ops = &clk_rcg2_shared_ops,
 };
 
 static struct clk_rcg2 gcc_qupv3_wrap1_s6_clk_src = {
@@ -582,12 +639,14 @@ static struct clk_rcg2 gcc_qupv3_wrap1_s6_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_parent_map_0,
        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "gcc_qupv3_wrap1_s6_clk_src",
-               .parent_names = gcc_parent_names_0,
-               .num_parents = 4,
-               .ops = &clk_rcg2_shared_ops,
-       },
+       .clkr.hw.init = &gcc_qupv3_wrap1_s6_clk_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap1_s7_clk_init = {
+       .name = "gcc_qupv3_wrap1_s7_clk_src",
+       .parent_names = gcc_parent_names_0,
+       .num_parents = 4,
+       .ops = &clk_rcg2_shared_ops,
 };
 
 static struct clk_rcg2 gcc_qupv3_wrap1_s7_clk_src = {
@@ -596,12 +655,7 @@ static struct clk_rcg2 gcc_qupv3_wrap1_s7_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_parent_map_0,
        .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "gcc_qupv3_wrap1_s7_clk_src",
-               .parent_names = gcc_parent_names_0,
-               .num_parents = 4,
-               .ops = &clk_rcg2_shared_ops,
-       },
+       .clkr.hw.init = &gcc_qupv3_wrap1_s7_clk_init,
 };
 
 static const struct freq_tbl ftbl_gcc_sdcc2_apps_clk_src[] = {
@@ -1917,6 +1971,37 @@ static struct clk_branch gcc_qmip_video_ahb_clk = {
        },
 };
 
+static struct clk_branch gcc_qspi_cnoc_periph_ahb_clk = {
+       .halt_reg = 0x4b000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4b000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qspi_cnoc_periph_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qspi_core_clk = {
+       .halt_reg = 0x4b004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4b004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qspi_core_clk",
+                       .parent_names = (const char *[]){
+                               "gcc_qspi_core_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
 static struct clk_branch gcc_qupv3_wrap0_s0_clk = {
        .halt_reg = 0x17030,
        .halt_check = BRANCH_HALT_VOTED,
@@ -3365,6 +3450,9 @@ static struct clk_regmap *gcc_sdm845_clocks[] = {
        [GPLL4] = &gpll4.clkr,
        [GCC_CPUSS_DVM_BUS_CLK] = &gcc_cpuss_dvm_bus_clk.clkr,
        [GCC_CPUSS_GNOC_CLK] = &gcc_cpuss_gnoc_clk.clkr,
+       [GCC_QSPI_CORE_CLK_SRC] = &gcc_qspi_core_clk_src.clkr,
+       [GCC_QSPI_CORE_CLK] = &gcc_qspi_core_clk.clkr,
+       [GCC_QSPI_CNOC_PERIPH_AHB_CLK] = &gcc_qspi_cnoc_periph_ahb_clk.clkr,
 };
 
 static const struct qcom_reset_map gcc_sdm845_resets[] = {
@@ -3442,9 +3530,29 @@ static const struct of_device_id gcc_sdm845_match_table[] = {
 };
 MODULE_DEVICE_TABLE(of, gcc_sdm845_match_table);
 
+static const struct clk_rcg_dfs_data gcc_dfs_clocks[] = {
+       DEFINE_RCG_DFS(gcc_qupv3_wrap0_s0_clk),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap0_s1_clk),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap0_s2_clk),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap0_s3_clk),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap0_s4_clk),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap0_s5_clk),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap0_s6_clk),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap0_s7_clk),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap1_s0_clk),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap1_s1_clk),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap1_s2_clk),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap1_s3_clk),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap1_s4_clk),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap1_s5_clk),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap1_s6_clk),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap1_s7_clk),
+};
+
 static int gcc_sdm845_probe(struct platform_device *pdev)
 {
        struct regmap *regmap;
+       int ret;
 
        regmap = qcom_cc_map(pdev, &gcc_sdm845_desc);
        if (IS_ERR(regmap))
@@ -3454,6 +3562,11 @@ static int gcc_sdm845_probe(struct platform_device *pdev)
        regmap_update_bits(regmap, 0x09ffc, 0x3, 0x3);
        regmap_update_bits(regmap, 0x71028, 0x3, 0x3);
 
+       ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks,
+                                       ARRAY_SIZE(gcc_dfs_clocks));
+       if (ret)
+               return ret;
+
        return qcom_cc_really_probe(pdev, &gcc_sdm845_desc, regmap);
 }
 
diff --git a/drivers/clk/qcom/hfpll.c b/drivers/clk/qcom/hfpll.c
new file mode 100644 (file)
index 0000000..a6de710
--- /dev/null
@@ -0,0 +1,96 @@
+// SPDX-License-Identifier: GPL-2.0
+// Copyright (c) 2018, The Linux Foundation. All rights reserved.
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/of.h>
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/regmap.h>
+
+#include "clk-regmap.h"
+#include "clk-hfpll.h"
+
+static const struct hfpll_data hdata = {
+       .mode_reg = 0x00,
+       .l_reg = 0x04,
+       .m_reg = 0x08,
+       .n_reg = 0x0c,
+       .user_reg = 0x10,
+       .config_reg = 0x14,
+       .config_val = 0x430405d,
+       .status_reg = 0x1c,
+       .lock_bit = 16,
+
+       .user_val = 0x8,
+       .user_vco_mask = 0x100000,
+       .low_vco_max_rate = 1248000000,
+       .min_rate = 537600000UL,
+       .max_rate = 2900000000UL,
+};
+
+static const struct of_device_id qcom_hfpll_match_table[] = {
+       { .compatible = "qcom,hfpll" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, qcom_hfpll_match_table);
+
+static const struct regmap_config hfpll_regmap_config = {
+       .reg_bits       = 32,
+       .reg_stride     = 4,
+       .val_bits       = 32,
+       .max_register   = 0x30,
+       .fast_io        = true,
+};
+
+static int qcom_hfpll_probe(struct platform_device *pdev)
+{
+       struct resource *res;
+       struct device *dev = &pdev->dev;
+       void __iomem *base;
+       struct regmap *regmap;
+       struct clk_hfpll *h;
+       struct clk_init_data init = {
+               .parent_names = (const char *[]){ "xo" },
+               .num_parents = 1,
+               .ops = &clk_ops_hfpll,
+       };
+
+       h = devm_kzalloc(dev, sizeof(*h), GFP_KERNEL);
+       if (!h)
+               return -ENOMEM;
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       base = devm_ioremap_resource(dev, res);
+       if (IS_ERR(base))
+               return PTR_ERR(base);
+
+       regmap = devm_regmap_init_mmio(&pdev->dev, base, &hfpll_regmap_config);
+       if (IS_ERR(regmap))
+               return PTR_ERR(regmap);
+
+       if (of_property_read_string_index(dev->of_node, "clock-output-names",
+                                         0, &init.name))
+               return -ENODEV;
+
+       h->d = &hdata;
+       h->clkr.hw.init = &init;
+       spin_lock_init(&h->lock);
+
+       return devm_clk_register_regmap(&pdev->dev, &h->clkr);
+}
+
+static struct platform_driver qcom_hfpll_driver = {
+       .probe          = qcom_hfpll_probe,
+       .driver         = {
+               .name   = "qcom-hfpll",
+               .of_match_table = qcom_hfpll_match_table,
+       },
+};
+module_platform_driver(qcom_hfpll_driver);
+
+MODULE_DESCRIPTION("QCOM HFPLL Clock Driver");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:qcom-hfpll");
diff --git a/drivers/clk/qcom/kpss-xcc.c b/drivers/clk/qcom/kpss-xcc.c
new file mode 100644 (file)
index 0000000..8590b5e
--- /dev/null
@@ -0,0 +1,87 @@
+// SPDX-License-Identifier: GPL-2.0
+// Copyright (c) 2018, The Linux Foundation. All rights reserved.
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+
+static const char *aux_parents[] = {
+       "pll8_vote",
+       "pxo",
+};
+
+static unsigned int aux_parent_map[] = {
+       3,
+       0,
+};
+
+static const struct of_device_id kpss_xcc_match_table[] = {
+       { .compatible = "qcom,kpss-acc-v1", .data = (void *)1UL },
+       { .compatible = "qcom,kpss-gcc" },
+       {}
+};
+MODULE_DEVICE_TABLE(of, kpss_xcc_match_table);
+
+static int kpss_xcc_driver_probe(struct platform_device *pdev)
+{
+       const struct of_device_id *id;
+       struct clk *clk;
+       struct resource *res;
+       void __iomem *base;
+       const char *name;
+
+       id = of_match_device(kpss_xcc_match_table, &pdev->dev);
+       if (!id)
+               return -ENODEV;
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       base = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(base))
+               return PTR_ERR(base);
+
+       if (id->data) {
+               if (of_property_read_string_index(pdev->dev.of_node,
+                                                 "clock-output-names",
+                                                 0, &name))
+                       return -ENODEV;
+               base += 0x14;
+       } else {
+               name = "acpu_l2_aux";
+               base += 0x28;
+       }
+
+       clk = clk_register_mux_table(&pdev->dev, name, aux_parents,
+                                    ARRAY_SIZE(aux_parents), 0, base, 0, 0x3,
+                                    0, aux_parent_map, NULL);
+
+       platform_set_drvdata(pdev, clk);
+
+       return PTR_ERR_OR_ZERO(clk);
+}
+
+static int kpss_xcc_driver_remove(struct platform_device *pdev)
+{
+       clk_unregister_mux(platform_get_drvdata(pdev));
+       return 0;
+}
+
+static struct platform_driver kpss_xcc_driver = {
+       .probe = kpss_xcc_driver_probe,
+       .remove = kpss_xcc_driver_remove,
+       .driver = {
+               .name = "kpss-xcc",
+               .of_match_table = kpss_xcc_match_table,
+       },
+};
+module_platform_driver(kpss_xcc_driver);
+
+MODULE_DESCRIPTION("Krait Processor Sub System (KPSS) Clock Driver");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:kpss-xcc");
diff --git a/drivers/clk/qcom/krait-cc.c b/drivers/clk/qcom/krait-cc.c
new file mode 100644 (file)
index 0000000..4d4b657
--- /dev/null
@@ -0,0 +1,397 @@
+// SPDX-License-Identifier: GPL-2.0
+// Copyright (c) 2018, The Linux Foundation. All rights reserved.
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/slab.h>
+
+#include "clk-krait.h"
+
+static unsigned int sec_mux_map[] = {
+       2,
+       0,
+};
+
+static unsigned int pri_mux_map[] = {
+       1,
+       2,
+       0,
+};
+
+/*
+ * Notifier function for switching the muxes to safe parent
+ * while the hfpll is getting reprogrammed.
+ */
+static int krait_notifier_cb(struct notifier_block *nb,
+                            unsigned long event,
+                            void *data)
+{
+       int ret = 0;
+       struct krait_mux_clk *mux = container_of(nb, struct krait_mux_clk,
+                                                clk_nb);
+       /* Switch to safe parent */
+       if (event == PRE_RATE_CHANGE) {
+               mux->old_index = krait_mux_clk_ops.get_parent(&mux->hw);
+               ret = krait_mux_clk_ops.set_parent(&mux->hw, mux->safe_sel);
+               mux->reparent = false;
+       /*
+        * By the time POST_RATE_CHANGE notifier is called,
+        * clk framework itself would have changed the parent for the new rate.
+        * Only otherwise, put back to the old parent.
+        */
+       } else if (event == POST_RATE_CHANGE) {
+               if (!mux->reparent)
+                       ret = krait_mux_clk_ops.set_parent(&mux->hw,
+                                                          mux->old_index);
+       }
+
+       return notifier_from_errno(ret);
+}
+
+static int krait_notifier_register(struct device *dev, struct clk *clk,
+                                  struct krait_mux_clk *mux)
+{
+       int ret = 0;
+
+       mux->clk_nb.notifier_call = krait_notifier_cb;
+       ret = clk_notifier_register(clk, &mux->clk_nb);
+       if (ret)
+               dev_err(dev, "failed to register clock notifier: %d\n", ret);
+
+       return ret;
+}
+
+static int
+krait_add_div(struct device *dev, int id, const char *s, unsigned int offset)
+{
+       struct krait_div2_clk *div;
+       struct clk_init_data init = {
+               .num_parents = 1,
+               .ops = &krait_div2_clk_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       };
+       const char *p_names[1];
+       struct clk *clk;
+
+       div = devm_kzalloc(dev, sizeof(*div), GFP_KERNEL);
+       if (!div)
+               return -ENOMEM;
+
+       div->width = 2;
+       div->shift = 6;
+       div->lpl = id >= 0;
+       div->offset = offset;
+       div->hw.init = &init;
+
+       init.name = kasprintf(GFP_KERNEL, "hfpll%s_div", s);
+       if (!init.name)
+               return -ENOMEM;
+
+       init.parent_names = p_names;
+       p_names[0] = kasprintf(GFP_KERNEL, "hfpll%s", s);
+       if (!p_names[0]) {
+               kfree(init.name);
+               return -ENOMEM;
+       }
+
+       clk = devm_clk_register(dev, &div->hw);
+       kfree(p_names[0]);
+       kfree(init.name);
+
+       return PTR_ERR_OR_ZERO(clk);
+}
+
+static int
+krait_add_sec_mux(struct device *dev, int id, const char *s,
+                 unsigned int offset, bool unique_aux)
+{
+       int ret;
+       struct krait_mux_clk *mux;
+       static const char *sec_mux_list[] = {
+               "acpu_aux",
+               "qsb",
+       };
+       struct clk_init_data init = {
+               .parent_names = sec_mux_list,
+               .num_parents = ARRAY_SIZE(sec_mux_list),
+               .ops = &krait_mux_clk_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       };
+       struct clk *clk;
+
+       mux = devm_kzalloc(dev, sizeof(*mux), GFP_KERNEL);
+       if (!mux)
+               return -ENOMEM;
+
+       mux->offset = offset;
+       mux->lpl = id >= 0;
+       mux->mask = 0x3;
+       mux->shift = 2;
+       mux->parent_map = sec_mux_map;
+       mux->hw.init = &init;
+       mux->safe_sel = 0;
+
+       init.name = kasprintf(GFP_KERNEL, "krait%s_sec_mux", s);
+       if (!init.name)
+               return -ENOMEM;
+
+       if (unique_aux) {
+               sec_mux_list[0] = kasprintf(GFP_KERNEL, "acpu%s_aux", s);
+               if (!sec_mux_list[0]) {
+                       clk = ERR_PTR(-ENOMEM);
+                       goto err_aux;
+               }
+       }
+
+       clk = devm_clk_register(dev, &mux->hw);
+
+       ret = krait_notifier_register(dev, clk, mux);
+       if (ret)
+               goto unique_aux;
+
+unique_aux:
+       if (unique_aux)
+               kfree(sec_mux_list[0]);
+err_aux:
+       kfree(init.name);
+       return PTR_ERR_OR_ZERO(clk);
+}
+
+static struct clk *
+krait_add_pri_mux(struct device *dev, int id, const char *s,
+                 unsigned int offset)
+{
+       int ret;
+       struct krait_mux_clk *mux;
+       const char *p_names[3];
+       struct clk_init_data init = {
+               .parent_names = p_names,
+               .num_parents = ARRAY_SIZE(p_names),
+               .ops = &krait_mux_clk_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       };
+       struct clk *clk;
+
+       mux = devm_kzalloc(dev, sizeof(*mux), GFP_KERNEL);
+       if (!mux)
+               return ERR_PTR(-ENOMEM);
+
+       mux->mask = 0x3;
+       mux->shift = 0;
+       mux->offset = offset;
+       mux->lpl = id >= 0;
+       mux->parent_map = pri_mux_map;
+       mux->hw.init = &init;
+       mux->safe_sel = 2;
+
+       init.name = kasprintf(GFP_KERNEL, "krait%s_pri_mux", s);
+       if (!init.name)
+               return ERR_PTR(-ENOMEM);
+
+       p_names[0] = kasprintf(GFP_KERNEL, "hfpll%s", s);
+       if (!p_names[0]) {
+               clk = ERR_PTR(-ENOMEM);
+               goto err_p0;
+       }
+
+       p_names[1] = kasprintf(GFP_KERNEL, "hfpll%s_div", s);
+       if (!p_names[1]) {
+               clk = ERR_PTR(-ENOMEM);
+               goto err_p1;
+       }
+
+       p_names[2] = kasprintf(GFP_KERNEL, "krait%s_sec_mux", s);
+       if (!p_names[2]) {
+               clk = ERR_PTR(-ENOMEM);
+               goto err_p2;
+       }
+
+       clk = devm_clk_register(dev, &mux->hw);
+
+       ret = krait_notifier_register(dev, clk, mux);
+       if (ret)
+               goto err_p3;
+err_p3:
+       kfree(p_names[2]);
+err_p2:
+       kfree(p_names[1]);
+err_p1:
+       kfree(p_names[0]);
+err_p0:
+       kfree(init.name);
+       return clk;
+}
+
+/* id < 0 for L2, otherwise id == physical CPU number */
+static struct clk *krait_add_clks(struct device *dev, int id, bool unique_aux)
+{
+       int ret;
+       unsigned int offset;
+       void *p = NULL;
+       const char *s;
+       struct clk *clk;
+
+       if (id >= 0) {
+               offset = 0x4501 + (0x1000 * id);
+               s = p = kasprintf(GFP_KERNEL, "%d", id);
+               if (!s)
+                       return ERR_PTR(-ENOMEM);
+       } else {
+               offset = 0x500;
+               s = "_l2";
+       }
+
+       ret = krait_add_div(dev, id, s, offset);
+       if (ret) {
+               clk = ERR_PTR(ret);
+               goto err;
+       }
+
+       ret = krait_add_sec_mux(dev, id, s, offset, unique_aux);
+       if (ret) {
+               clk = ERR_PTR(ret);
+               goto err;
+       }
+
+       clk = krait_add_pri_mux(dev, id, s, offset);
+err:
+       kfree(p);
+       return clk;
+}
+
+static struct clk *krait_of_get(struct of_phandle_args *clkspec, void *data)
+{
+       unsigned int idx = clkspec->args[0];
+       struct clk **clks = data;
+
+       if (idx >= 5) {
+               pr_err("%s: invalid clock index %d\n", __func__, idx);
+               return ERR_PTR(-EINVAL);
+       }
+
+       return clks[idx] ? : ERR_PTR(-ENODEV);
+}
+
+static const struct of_device_id krait_cc_match_table[] = {
+       { .compatible = "qcom,krait-cc-v1", (void *)1UL },
+       { .compatible = "qcom,krait-cc-v2" },
+       {}
+};
+MODULE_DEVICE_TABLE(of, krait_cc_match_table);
+
+static int krait_cc_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       const struct of_device_id *id;
+       unsigned long cur_rate, aux_rate;
+       int cpu;
+       struct clk *clk;
+       struct clk **clks;
+       struct clk *l2_pri_mux_clk;
+
+       id = of_match_device(krait_cc_match_table, dev);
+       if (!id)
+               return -ENODEV;
+
+       /* Rate is 1 because 0 causes problems for __clk_mux_determine_rate */
+       clk = clk_register_fixed_rate(dev, "qsb", NULL, 0, 1);
+       if (IS_ERR(clk))
+               return PTR_ERR(clk);
+
+       if (!id->data) {
+               clk = clk_register_fixed_factor(dev, "acpu_aux",
+                                               "gpll0_vote", 0, 1, 2);
+               if (IS_ERR(clk))
+                       return PTR_ERR(clk);
+       }
+
+       /* Krait configurations have at most 4 CPUs and one L2 */
+       clks = devm_kcalloc(dev, 5, sizeof(*clks), GFP_KERNEL);
+       if (!clks)
+               return -ENOMEM;
+
+       for_each_possible_cpu(cpu) {
+               clk = krait_add_clks(dev, cpu, id->data);
+               if (IS_ERR(clk))
+                       return PTR_ERR(clk);
+               clks[cpu] = clk;
+       }
+
+       l2_pri_mux_clk = krait_add_clks(dev, -1, id->data);
+       if (IS_ERR(l2_pri_mux_clk))
+               return PTR_ERR(l2_pri_mux_clk);
+       clks[4] = l2_pri_mux_clk;
+
+       /*
+        * We don't want the CPU or L2 clocks to be turned off at late init
+        * if CPUFREQ or HOTPLUG configs are disabled. So, bump up the
+        * refcount of these clocks. Any cpufreq/hotplug manager can assume
+        * that the clocks have already been prepared and enabled by the time
+        * they take over.
+        */
+       for_each_online_cpu(cpu) {
+               clk_prepare_enable(l2_pri_mux_clk);
+               WARN(clk_prepare_enable(clks[cpu]),
+                    "Unable to turn on CPU%d clock", cpu);
+       }
+
+       /*
+        * Force reinit of HFPLLs and muxes to overwrite any potential
+        * incorrect configuration of HFPLLs and muxes by the bootloader.
+        * While at it, also make sure the cores are running at known rates
+        * and print the current rate.
+        *
+        * The clocks are set to aux clock rate first to make sure the
+        * secondary mux is not sourcing off of QSB. The rate is then set to
+        * two different rates to force a HFPLL reinit under all
+        * circumstances.
+        */
+       cur_rate = clk_get_rate(l2_pri_mux_clk);
+       aux_rate = 384000000;
+       if (cur_rate == 1) {
+               pr_info("L2 @ QSB rate. Forcing new rate.\n");
+               cur_rate = aux_rate;
+       }
+       clk_set_rate(l2_pri_mux_clk, aux_rate);
+       clk_set_rate(l2_pri_mux_clk, 2);
+       clk_set_rate(l2_pri_mux_clk, cur_rate);
+       pr_info("L2 @ %lu KHz\n", clk_get_rate(l2_pri_mux_clk) / 1000);
+       for_each_possible_cpu(cpu) {
+               clk = clks[cpu];
+               cur_rate = clk_get_rate(clk);
+               if (cur_rate == 1) {
+                       pr_info("CPU%d @ QSB rate. Forcing new rate.\n", cpu);
+                       cur_rate = aux_rate;
+               }
+
+               clk_set_rate(clk, aux_rate);
+               clk_set_rate(clk, 2);
+               clk_set_rate(clk, cur_rate);
+               pr_info("CPU%d @ %lu KHz\n", cpu, clk_get_rate(clk) / 1000);
+       }
+
+       of_clk_add_provider(dev->of_node, krait_of_get, clks);
+
+       return 0;
+}
+
+static struct platform_driver krait_cc_driver = {
+       .probe = krait_cc_probe,
+       .driver = {
+               .name = "krait-cc",
+               .of_match_table = krait_cc_match_table,
+       },
+};
+module_platform_driver(krait_cc_driver);
+
+MODULE_DESCRIPTION("Krait CPU Clock Driver");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:krait-cc");
index 9022bbe1297e7f3c2c351ff55e854227f3d4049b..b879e3e3a6b426aed8e9d3729d0c9cee48bcde15 100644 (file)
@@ -1,13 +1,18 @@
+# SPDX-License-Identifier: GPL-2.0
+
 config CLK_RENESAS
        bool "Renesas SoC clock support" if COMPILE_TEST && !ARCH_RENESAS
        default y if ARCH_RENESAS
        select CLK_EMEV2 if ARCH_EMEV2
        select CLK_RZA1 if ARCH_R7S72100
+       select CLK_R7S9210 if ARCH_R7S9210
        select CLK_R8A73A4 if ARCH_R8A73A4
        select CLK_R8A7740 if ARCH_R8A7740
-       select CLK_R8A7743 if ARCH_R8A7743
+       select CLK_R8A7743 if ARCH_R8A7743 || ARCH_R8A7744
        select CLK_R8A7745 if ARCH_R8A7745
        select CLK_R8A77470 if ARCH_R8A77470
+       select CLK_R8A774A1 if ARCH_R8A774A1
+       select CLK_R8A774C0 if ARCH_R8A774C0
        select CLK_R8A7778 if ARCH_R8A7778
        select CLK_R8A7779 if ARCH_R8A7779
        select CLK_R8A7790 if ARCH_R8A7790
@@ -45,6 +50,10 @@ config CLK_RZA1
        bool "RZ/A1H clock support" if COMPILE_TEST
        select CLK_RENESAS_CPG_MSTP
 
+config CLK_R7S9210
+       bool "RZ/A2 clock support" if COMPILE_TEST
+       select CLK_RENESAS_CPG_MSSR
+
 config CLK_R8A73A4
        bool "R-Mobile APE6 clock support" if COMPILE_TEST
        select CLK_RENESAS_CPG_MSTP
@@ -67,6 +76,14 @@ config CLK_R8A77470
        bool "RZ/G1C clock support" if COMPILE_TEST
        select CLK_RCAR_GEN2_CPG
 
+config CLK_R8A774A1
+       bool "RZ/G2M clock support" if COMPILE_TEST
+       select CLK_RCAR_GEN3_CPG
+
+config CLK_R8A774C0
+       bool "RZ/G2E clock support" if COMPILE_TEST
+       select CLK_RCAR_GEN3_CPG
+
 config CLK_R8A7778
        bool "R-Car M1A clock support" if COMPILE_TEST
        select CLK_RENESAS_CPG_MSTP
index e4aa3d6143d2436a86f2daf997da8b0eb3a45f2f..c793e3cc9452af5fdbd7335302787633e7ab175c 100644 (file)
@@ -2,11 +2,14 @@
 # SoC
 obj-$(CONFIG_CLK_EMEV2)                        += clk-emev2.o
 obj-$(CONFIG_CLK_RZA1)                 += clk-rz.o
+obj-$(CONFIG_CLK_R7S9210)              += r7s9210-cpg-mssr.o
 obj-$(CONFIG_CLK_R8A73A4)              += clk-r8a73a4.o
 obj-$(CONFIG_CLK_R8A7740)              += clk-r8a7740.o
 obj-$(CONFIG_CLK_R8A7743)              += r8a7743-cpg-mssr.o
 obj-$(CONFIG_CLK_R8A7745)              += r8a7745-cpg-mssr.o
 obj-$(CONFIG_CLK_R8A77470)             += r8a77470-cpg-mssr.o
+obj-$(CONFIG_CLK_R8A774A1)             += r8a774a1-cpg-mssr.o
+obj-$(CONFIG_CLK_R8A774C0)             += r8a774c0-cpg-mssr.o
 obj-$(CONFIG_CLK_R8A7778)              += clk-r8a7778.o
 obj-$(CONFIG_CLK_R8A7779)              += clk-r8a7779.o
 obj-$(CONFIG_CLK_R8A7790)              += r8a7790-cpg-mssr.o
index 9febbf42c3df6979a8c667c8d08a1e7846acba8d..57c9341643065a9234fcf80514b6eb3a79e639e9 100644 (file)
@@ -1,13 +1,10 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * r8a7790 Common Clock Framework support
  *
  * Copyright (C) 2013  Renesas Solutions Corp.
  *
  * Contact: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #include <linux/clk-provider.h>
@@ -312,8 +309,8 @@ static void __init cpg_div6_clock_init(struct device_node *np)
 
        num_parents = of_clk_get_parent_count(np);
        if (num_parents < 1) {
-               pr_err("%s: no parent found for %s DIV6 clock\n",
-                      __func__, np->name);
+               pr_err("%s: no parent found for %pOFn DIV6 clock\n",
+                      __func__, np);
                return;
        }
 
@@ -324,8 +321,8 @@ static void __init cpg_div6_clock_init(struct device_node *np)
 
        reg = of_iomap(np, 0);
        if (reg == NULL) {
-               pr_err("%s: failed to map %s DIV6 clock register\n",
-                      __func__, np->name);
+               pr_err("%s: failed to map %pOFn DIV6 clock register\n",
+                      __func__, np);
                goto error;
        }
 
@@ -337,8 +334,8 @@ static void __init cpg_div6_clock_init(struct device_node *np)
 
        clk = cpg_div6_register(clk_name, num_parents, parent_names, reg, NULL);
        if (IS_ERR(clk)) {
-               pr_err("%s: failed to register %s DIV6 clock (%ld)\n",
-                      __func__, np->name, PTR_ERR(clk));
+               pr_err("%s: failed to register %pOFn DIV6 clock (%ld)\n",
+                      __func__, np, PTR_ERR(clk));
                goto error;
        }
 
index a91825471c79acd28f68ea5f0f2c998d54a571d9..7807b30a5bbb590139a5c4d785e10699325253bc 100644 (file)
@@ -1,21 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * EMMA Mobile EV2 common clock framework support
  *
  * Copyright (C) 2013 Takashi Yoshii <takashi.yoshii.ze@renesas.com>
  * Copyright (C) 2012 Magnus Damm
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 #include <linux/clk-provider.h>
 #include <linux/clkdev.h>
@@ -86,8 +74,8 @@ static void __init emev2_smu_clkdiv_init(struct device_node *np)
        clk = clk_register_divider(NULL, np->name, parent_name, 0,
                                   smu_base + reg[0], reg[1], 8, 0, &lock);
        of_clk_add_provider(np, of_clk_src_simple_get, clk);
-       clk_register_clkdev(clk, np->name, NULL);
-       pr_debug("## %s %s %p\n", __func__, np->name, clk);
+       clk_register_clkdev(clk, np->full_name, NULL);
+       pr_debug("## %s %pOFn %p\n", __func__, np, clk);
 }
 CLK_OF_DECLARE(emev2_smu_clkdiv, "renesas,emev2-smu-clkdiv",
                emev2_smu_clkdiv_init);
@@ -104,7 +92,7 @@ static void __init emev2_smu_gclk_init(struct device_node *np)
        clk = clk_register_gate(NULL, np->name, parent_name, 0,
                                smu_base + reg[0], reg[1], 0, &lock);
        of_clk_add_provider(np, of_clk_src_simple_get, clk);
-       clk_register_clkdev(clk, np->name, NULL);
-       pr_debug("## %s %s %p\n", __func__, np->name, clk);
+       clk_register_clkdev(clk, np->full_name, NULL);
+       pr_debug("## %s %pOFn %p\n", __func__, np, clk);
 }
 CLK_OF_DECLARE(emev2_smu_gclk, "renesas,emev2-smu-gclk", emev2_smu_gclk_init);
index e82adcb16a52a3b790c34fc2a49079615a7bf907..1c1768c2cc8251cd2715839f464773ce5b2eb0b5 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * R-Car MSTP clocks
  *
@@ -5,10 +6,6 @@
  * Copyright (C) 2015 Glider bvba
  *
  * Contact: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #include <linux/clk.h>
@@ -239,8 +236,8 @@ static void __init cpg_mstp_clocks_init(struct device_node *np)
                        break;
 
                if (clkidx >= MSTP_MAX_CLOCKS) {
-                       pr_err("%s: invalid clock %s %s index %u\n",
-                              __func__, np->name, name, clkidx);
+                       pr_err("%s: invalid clock %pOFn %s index %u\n",
+                              __func__, np, name, clkidx);
                        continue;
                }
 
@@ -259,8 +256,8 @@ static void __init cpg_mstp_clocks_init(struct device_node *np)
                         */
                        clk_register_clkdev(clks[clkidx], name, NULL);
                } else {
-                       pr_err("%s: failed to register %s %s clock (%ld)\n",
-                              __func__, np->name, name, PTR_ERR(clks[clkidx]));
+                       pr_err("%s: failed to register %pOFn %s clock (%ld)\n",
+                              __func__, np, name, PTR_ERR(clks[clkidx]));
                }
        }
 
index 7b903ce4c9015ad76a476c7f45707bd5960d390b..2719c248c67beb5fe1317c1c3bdd41ee5e2067f4 100644 (file)
@@ -1,11 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * r8a73a4 Core CPG Clocks
  *
  * Copyright (C) 2014  Ulrich Hecht
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #include <linux/clk-provider.h>
@@ -228,8 +225,8 @@ static void __init r8a73a4_cpg_clocks_init(struct device_node *np)
 
                clk = r8a73a4_cpg_register_clock(np, cpg, name);
                if (IS_ERR(clk))
-                       pr_err("%s: failed to register %s %s clock (%ld)\n",
-                              __func__, np->name, name, PTR_ERR(clk));
+                       pr_err("%s: failed to register %pOFn %s clock (%ld)\n",
+                              __func__, np, name, PTR_ERR(clk));
                else
                        cpg->data.clks[i] = clk;
        }
index a7a30d2eca418f6e15febe5cf47aac91d426ec32..5967656c13cca91fd1b2822cd06ae27c407b906e 100644 (file)
@@ -1,11 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * r8a7740 Core CPG Clocks
  *
  * Copyright (C) 2014  Ulrich Hecht
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #include <linux/clk-provider.h>
@@ -187,8 +184,8 @@ static void __init r8a7740_cpg_clocks_init(struct device_node *np)
 
                clk = r8a7740_cpg_register_clock(np, cpg, name);
                if (IS_ERR(clk))
-                       pr_err("%s: failed to register %s %s clock (%ld)\n",
-                              __func__, np->name, name, PTR_ERR(clk));
+                       pr_err("%s: failed to register %pOFn %s clock (%ld)\n",
+                              __func__, np, name, PTR_ERR(clk));
                else
                        cpg->data.clks[i] = clk;
        }
index 886a8380e91247a199f2852177b9fda5cff8f0ad..3ccc53685bdd22f57d95a2ed60daa64a3ff9f1ff 100644 (file)
@@ -1,11 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * r8a7778 Core CPG Clocks
  *
  * Copyright (C) 2014  Ulrich Hecht
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #include <linux/clk-provider.h>
@@ -130,8 +127,8 @@ static void __init r8a7778_cpg_clocks_init(struct device_node *np)
 
                clk = r8a7778_cpg_register_clock(np, cpg, name);
                if (IS_ERR(clk))
-                       pr_err("%s: failed to register %s %s clock (%ld)\n",
-                              __func__, np->name, name, PTR_ERR(clk));
+                       pr_err("%s: failed to register %pOFn %s clock (%ld)\n",
+                              __func__, np, name, PTR_ERR(clk));
                else
                        cpg->data.clks[i] = clk;
        }
index 5adcca4656c33303e9630f6a3624b09b50242ddb..9f3b5522eef59a1269c679bd07735bbef511b6b1 100644 (file)
@@ -1,13 +1,10 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * r8a7779 Core CPG Clocks
  *
  * Copyright (C) 2013, 2014 Horms Solutions Ltd.
  *
  * Contact: Simon Horman <horms@verge.net.au>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #include <linux/clk-provider.h>
@@ -164,8 +161,8 @@ static void __init r8a7779_cpg_clocks_init(struct device_node *np)
                clk = r8a7779_cpg_register_clock(np, cpg, config,
                                                 plla_mult, name);
                if (IS_ERR(clk))
-                       pr_err("%s: failed to register %s %s clock (%ld)\n",
-                              __func__, np->name, name, PTR_ERR(clk));
+                       pr_err("%s: failed to register %pOFn %s clock (%ld)\n",
+                              __func__, np, name, PTR_ERR(clk));
                else
                        cpg->data.clks[i] = clk;
        }
index bccd62f2cb092fac27416764d4eba89d98e305ba..2913b414815748632686b6a1e980e84d5ce48c0d 100644 (file)
@@ -1,13 +1,10 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * rcar_gen2 Core CPG Clocks
  *
  * Copyright (C) 2013  Ideas On Board SPRL
  *
  * Contact: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #include <linux/clk-provider.h>
@@ -445,8 +442,8 @@ static void __init rcar_gen2_cpg_clocks_init(struct device_node *np)
 
                clk = rcar_gen2_cpg_register_clock(np, cpg, config, name);
                if (IS_ERR(clk))
-                       pr_err("%s: failed to register %s %s clock (%ld)\n",
-                              __func__, np->name, name, PTR_ERR(clk));
+                       pr_err("%s: failed to register %pOFn %s clock (%ld)\n",
+                              __func__, np, name, PTR_ERR(clk));
                else
                        cpg->data.clks[i] = clk;
        }
index ac2f86d626b694be3824c7465c7e7aae3897a9af..3cda53a97f4e6b4a0d5b90bd2d70c279e8aa83e1 100644 (file)
@@ -1,12 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * RZ/A1 Core CPG Clocks
  *
  * Copyright (C) 2013 Ideas On Board SPRL
  * Copyright (C) 2014 Wolfram Sang, Sang Engineering <wsa@sang-engineering.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #include <linux/clk-provider.h>
@@ -113,8 +110,8 @@ static void __init rz_cpg_clocks_init(struct device_node *np)
 
                clk = rz_cpg_register_clock(np, cpg, name);
                if (IS_ERR(clk))
-                       pr_err("%s: failed to register %s %s clock (%ld)\n",
-                              __func__, np->name, name, PTR_ERR(clk));
+                       pr_err("%s: failed to register %pOFn %s clock (%ld)\n",
+                              __func__, np, name, PTR_ERR(clk));
                else
                        cpg->data.clks[i] = clk;
        }
index bab33610eb6caedfd5bd41e60874fea0cb00a906..dc8ffc7c727a73a226912e826382e466e8049b0e 100644 (file)
@@ -1,11 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * sh73a0 Core CPG Clocks
  *
  * Copyright (C) 2014  Ulrich Hecht
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #include <linux/clk-provider.h>
@@ -206,8 +203,8 @@ static void __init sh73a0_cpg_clocks_init(struct device_node *np)
 
                clk = sh73a0_cpg_register_clock(np, cpg, name);
                if (IS_ERR(clk))
-                       pr_err("%s: failed to register %s %s clock (%ld)\n",
-                              __func__, np->name, name, PTR_ERR(clk));
+                       pr_err("%s: failed to register %pOFn %s clock (%ld)\n",
+                              __func__, np, name, PTR_ERR(clk));
                else
                        cpg->data.clks[i] = clk;
        }
diff --git a/drivers/clk/renesas/r7s9210-cpg-mssr.c b/drivers/clk/renesas/r7s9210-cpg-mssr.c
new file mode 100644 (file)
index 0000000..5135f13
--- /dev/null
@@ -0,0 +1,217 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * R7S9210 Clock Pulse Generator / Module Standby
+ *
+ * Based on r8a7795-cpg-mssr.c
+ *
+ * Copyright (C) 2018 Chris Brandt
+ * Copyright (C) 2018 Renesas Electronics Corp.
+ *
+ */
+
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <dt-bindings/clock/r7s9210-cpg-mssr.h>
+#include "renesas-cpg-mssr.h"
+
+#define CPG_FRQCR      0x00
+
+static u8 cpg_mode;
+
+/* Internal Clock ratio table */
+static const struct {
+       unsigned int i;
+       unsigned int g;
+       unsigned int b;
+       unsigned int p1;
+       /* p0 is always 32 */;
+} ratio_tab[5] = {     /* I,  G,  B, P1 */
+                       {  2,  4,  8, 16},      /* FRQCR = 0x012 */
+                       {  4,  4,  8, 16},      /* FRQCR = 0x112 */
+                       {  8,  4,  8, 16},      /* FRQCR = 0x212 */
+                       { 16,  8, 16, 16},      /* FRQCR = 0x322 */
+                       { 16, 16, 32, 32},      /* FRQCR = 0x333 */
+                       };
+
+enum rz_clk_types {
+       CLK_TYPE_RZA_MAIN = CLK_TYPE_CUSTOM,
+       CLK_TYPE_RZA_PLL,
+};
+
+enum clk_ids {
+       /* Core Clock Outputs exported to DT */
+       LAST_DT_CORE_CLK = R7S9210_CLK_P0,
+
+       /* External Input Clocks */
+       CLK_EXTAL,
+
+       /* Internal Core Clocks */
+       CLK_MAIN,
+       CLK_PLL,
+
+       /* Module Clocks */
+       MOD_CLK_BASE
+};
+
+static struct cpg_core_clk r7s9210_early_core_clks[] = {
+       /* External Clock Inputs */
+       DEF_INPUT("extal",     CLK_EXTAL),
+
+       /* Internal Core Clocks */
+       DEF_BASE(".main",       CLK_MAIN, CLK_TYPE_RZA_MAIN, CLK_EXTAL),
+       DEF_BASE(".pll",       CLK_PLL, CLK_TYPE_RZA_PLL, CLK_MAIN),
+
+       /* Core Clock Outputs */
+       DEF_FIXED("p1c",    R7S9210_CLK_P1C,   CLK_PLL,         16, 1),
+};
+
+static const struct mssr_mod_clk r7s9210_early_mod_clks[] __initconst = {
+       DEF_MOD_STB("ostm2",     34,    R7S9210_CLK_P1C),
+       DEF_MOD_STB("ostm1",     35,    R7S9210_CLK_P1C),
+       DEF_MOD_STB("ostm0",     36,    R7S9210_CLK_P1C),
+};
+
+static struct cpg_core_clk r7s9210_core_clks[] = {
+       /* Core Clock Outputs */
+       DEF_FIXED("i",      R7S9210_CLK_I,     CLK_PLL,          2, 1),
+       DEF_FIXED("g",      R7S9210_CLK_G,     CLK_PLL,          4, 1),
+       DEF_FIXED("b",      R7S9210_CLK_B,     CLK_PLL,          8, 1),
+       DEF_FIXED("p1",     R7S9210_CLK_P1,    CLK_PLL,         16, 1),
+       DEF_FIXED("p0",     R7S9210_CLK_P0,    CLK_PLL,         32, 1),
+};
+
+static const struct mssr_mod_clk r7s9210_mod_clks[] __initconst = {
+       DEF_MOD_STB("scif4",     43,    R7S9210_CLK_P1C),
+       DEF_MOD_STB("scif3",     44,    R7S9210_CLK_P1C),
+       DEF_MOD_STB("scif2",     45,    R7S9210_CLK_P1C),
+       DEF_MOD_STB("scif1",     46,    R7S9210_CLK_P1C),
+       DEF_MOD_STB("scif0",     47,    R7S9210_CLK_P1C),
+
+       DEF_MOD_STB("ether1",    64,    R7S9210_CLK_B),
+       DEF_MOD_STB("ether0",    65,    R7S9210_CLK_B),
+
+       DEF_MOD_STB("i2c3",      84,    R7S9210_CLK_P1),
+       DEF_MOD_STB("i2c2",      85,    R7S9210_CLK_P1),
+       DEF_MOD_STB("i2c1",      86,    R7S9210_CLK_P1),
+       DEF_MOD_STB("i2c0",      87,    R7S9210_CLK_P1),
+
+       DEF_MOD_STB("spi2",      95,    R7S9210_CLK_P1),
+       DEF_MOD_STB("spi1",      96,    R7S9210_CLK_P1),
+       DEF_MOD_STB("spi0",      97,    R7S9210_CLK_P1),
+};
+
+/* The clock dividers in the table vary based on DT and register settings */
+static void __init r7s9210_update_clk_table(struct clk *extal_clk,
+                                           void __iomem *base)
+{
+       int i;
+       u16 frqcr;
+       u8 index;
+
+       /* If EXTAL is above 12MHz, then we know it is Mode 1 */
+       if (clk_get_rate(extal_clk) > 12000000)
+               cpg_mode = 1;
+
+       frqcr = clk_readl(base + CPG_FRQCR) & 0xFFF;
+       if (frqcr == 0x012)
+               index = 0;
+       else if (frqcr == 0x112)
+               index = 1;
+       else if (frqcr == 0x212)
+               index = 2;
+       else if (frqcr == 0x322)
+               index = 3;
+       else if (frqcr == 0x333)
+               index = 4;
+       else
+               BUG_ON(1);      /* Illegal FRQCR value */
+
+       for (i = 0; i < ARRAY_SIZE(r7s9210_core_clks); i++) {
+               switch (r7s9210_core_clks[i].id) {
+               case R7S9210_CLK_I:
+                       r7s9210_core_clks[i].div = ratio_tab[index].i;
+                       break;
+               case R7S9210_CLK_G:
+                       r7s9210_core_clks[i].div = ratio_tab[index].g;
+                       break;
+               case R7S9210_CLK_B:
+                       r7s9210_core_clks[i].div = ratio_tab[index].b;
+                       break;
+               case R7S9210_CLK_P1:
+               case R7S9210_CLK_P1C:
+                       r7s9210_core_clks[i].div = ratio_tab[index].p1;
+                       break;
+               case R7S9210_CLK_P0:
+                       r7s9210_core_clks[i].div = 32;
+                       break;
+               }
+       }
+}
+
+struct clk * __init rza2_cpg_clk_register(struct device *dev,
+       const struct cpg_core_clk *core, const struct cpg_mssr_info *info,
+       struct clk **clks, void __iomem *base,
+       struct raw_notifier_head *notifiers)
+{
+       struct clk *parent;
+       unsigned int mult = 1;
+       unsigned int div = 1;
+
+       parent = clks[core->parent];
+       if (IS_ERR(parent))
+               return ERR_CAST(parent);
+
+       switch (core->id) {
+       case CLK_MAIN:
+               break;
+
+       case CLK_PLL:
+               if (cpg_mode)
+                       mult = 44;      /* Divider 1 is 1/2 */
+               else
+                       mult = 88;      /* Divider 1 is 1 */
+               break;
+
+       default:
+               return ERR_PTR(-EINVAL);
+       }
+
+       if (core->id == CLK_MAIN)
+               r7s9210_update_clk_table(parent, base);
+
+       return clk_register_fixed_factor(NULL, core->name,
+                                        __clk_get_name(parent), 0, mult, div);
+}
+
+const struct cpg_mssr_info r7s9210_cpg_mssr_info __initconst = {
+       /* Early Clocks */
+       .early_core_clks = r7s9210_early_core_clks,
+       .num_early_core_clks = ARRAY_SIZE(r7s9210_early_core_clks),
+       .early_mod_clks = r7s9210_early_mod_clks,
+       .num_early_mod_clks = ARRAY_SIZE(r7s9210_early_mod_clks),
+
+       /* Core Clocks */
+       .core_clks = r7s9210_core_clks,
+       .num_core_clks = ARRAY_SIZE(r7s9210_core_clks),
+       .last_dt_core_clk = LAST_DT_CORE_CLK,
+       .num_total_core_clks = MOD_CLK_BASE,
+
+       /* Module Clocks */
+       .mod_clks = r7s9210_mod_clks,
+       .num_mod_clks = ARRAY_SIZE(r7s9210_mod_clks),
+       .num_hw_mod_clks = 11 * 32, /* includes STBCR0 which doesn't exist */
+
+       /* Callbacks */
+       .cpg_clk_register = rza2_cpg_clk_register,
+
+       /* RZ/A2 has Standby Control Registers */
+       .stbyctrl = true,
+};
+
+static void __init r7s9210_cpg_mssr_early_init(struct device_node *np)
+{
+       cpg_mssr_early_init(np, &r7s9210_cpg_mssr_info);
+}
+
+CLK_OF_DECLARE_DRIVER(cpg_mstp_clks, "renesas,r7s9210-cpg-mssr",
+                     r7s9210_cpg_mssr_early_init);
index 011c170ec3f95d65f7a83384b42431bcbfc86e55..c01d9af2525a181a3614a40b2444138126310fa5 100644 (file)
@@ -1,16 +1,14 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * r8a7743 Clock Pulse Generator / Module Standby and Software Reset
  *
  * Copyright (C) 2016 Cogent Embedded Inc.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published
- * by the Free Software Foundation; of the License.
  */
 
 #include <linux/device.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
+#include <linux/of.h>
 #include <linux/soc/renesas/rcar-rst.h>
 
 #include <dt-bindings/clock/r8a7743-cpg-mssr.h>
@@ -37,7 +35,7 @@ enum clk_ids {
        MOD_CLK_BASE
 };
 
-static const struct cpg_core_clk r8a7743_core_clks[] __initconst = {
+static struct cpg_core_clk r8a7743_core_clks[] __initdata = {
        /* External Clock Inputs */
        DEF_INPUT("extal",      CLK_EXTAL),
        DEF_INPUT("usb_extal",  CLK_USB_EXTAL),
@@ -238,6 +236,8 @@ static const struct rcar_gen2_cpg_pll_config cpg_pll_configs[8] __initconst = {
 static int __init r8a7743_cpg_mssr_init(struct device *dev)
 {
        const struct rcar_gen2_cpg_pll_config *cpg_pll_config;
+       struct device_node *np = dev->of_node;
+       unsigned int i;
        u32 cpg_mode;
        int error;
 
@@ -247,6 +247,14 @@ static int __init r8a7743_cpg_mssr_init(struct device *dev)
 
        cpg_pll_config = &cpg_pll_configs[CPG_PLL_CONFIG_INDEX(cpg_mode)];
 
+       if (of_device_is_compatible(np, "renesas,r8a7744-cpg-mssr")) {
+               /* RZ/G1N uses a 1/5 divider for ZG */
+               for (i = 0; i < ARRAY_SIZE(r8a7743_core_clks); i++)
+                       if (r8a7743_core_clks[i].id == R8A7743_CLK_ZG) {
+                               r8a7743_core_clks[i].div = 5;
+                               break;
+                       }
+       }
        return rcar_gen2_cpg_init(cpg_pll_config, 2, cpg_mode);
 }
 
index 4b0a9243b7481176ca2c8701451f03421bd3de59..493874e5ebeeb6bb50aef7cb780289d406ea5c8f 100644 (file)
@@ -1,11 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * r8a7745 Clock Pulse Generator / Module Standby and Software Reset
  *
  * Copyright (C) 2016 Cogent Embedded Inc.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published
- * by the Free Software Foundation; of the License.
  */
 
 #include <linux/device.h>
diff --git a/drivers/clk/renesas/r8a774a1-cpg-mssr.c b/drivers/clk/renesas/r8a774a1-cpg-mssr.c
new file mode 100644 (file)
index 0000000..b0da342
--- /dev/null
@@ -0,0 +1,323 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * r8a774a1 Clock Pulse Generator / Module Standby and Software Reset
+ *
+ * Copyright (C) 2018 Renesas Electronics Corp.
+ *
+ * Based on r8a7796-cpg-mssr.c
+ *
+ * Copyright (C) 2016 Glider bvba
+ */
+
+#include <linux/device.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/soc/renesas/rcar-rst.h>
+
+#include <dt-bindings/clock/r8a774a1-cpg-mssr.h>
+
+#include "renesas-cpg-mssr.h"
+#include "rcar-gen3-cpg.h"
+
+enum clk_ids {
+       /* Core Clock Outputs exported to DT */
+       LAST_DT_CORE_CLK = R8A774A1_CLK_OSC,
+
+       /* External Input Clocks */
+       CLK_EXTAL,
+       CLK_EXTALR,
+
+       /* Internal Core Clocks */
+       CLK_MAIN,
+       CLK_PLL0,
+       CLK_PLL1,
+       CLK_PLL2,
+       CLK_PLL3,
+       CLK_PLL4,
+       CLK_PLL1_DIV2,
+       CLK_PLL1_DIV4,
+       CLK_S0,
+       CLK_S1,
+       CLK_S2,
+       CLK_S3,
+       CLK_SDSRC,
+       CLK_RINT,
+
+       /* Module Clocks */
+       MOD_CLK_BASE
+};
+
+static const struct cpg_core_clk r8a774a1_core_clks[] __initconst = {
+       /* External Clock Inputs */
+       DEF_INPUT("extal",      CLK_EXTAL),
+       DEF_INPUT("extalr",     CLK_EXTALR),
+
+       /* Internal Core Clocks */
+       DEF_BASE(".main",       CLK_MAIN, CLK_TYPE_GEN3_MAIN, CLK_EXTAL),
+       DEF_BASE(".pll0",       CLK_PLL0, CLK_TYPE_GEN3_PLL0, CLK_MAIN),
+       DEF_BASE(".pll1",       CLK_PLL1, CLK_TYPE_GEN3_PLL1, CLK_MAIN),
+       DEF_BASE(".pll2",       CLK_PLL2, CLK_TYPE_GEN3_PLL2, CLK_MAIN),
+       DEF_BASE(".pll3",       CLK_PLL3, CLK_TYPE_GEN3_PLL3, CLK_MAIN),
+       DEF_BASE(".pll4",       CLK_PLL4, CLK_TYPE_GEN3_PLL4, CLK_MAIN),
+
+       DEF_FIXED(".pll1_div2", CLK_PLL1_DIV2,     CLK_PLL1,       2, 1),
+       DEF_FIXED(".pll1_div4", CLK_PLL1_DIV4,     CLK_PLL1_DIV2,  2, 1),
+       DEF_FIXED(".s0",        CLK_S0,            CLK_PLL1_DIV2,  2, 1),
+       DEF_FIXED(".s1",        CLK_S1,            CLK_PLL1_DIV2,  3, 1),
+       DEF_FIXED(".s2",        CLK_S2,            CLK_PLL1_DIV2,  4, 1),
+       DEF_FIXED(".s3",        CLK_S3,            CLK_PLL1_DIV2,  6, 1),
+       DEF_FIXED(".sdsrc",     CLK_SDSRC,         CLK_PLL1_DIV2,  2, 1),
+
+       DEF_GEN3_OSC(".r",      CLK_RINT,          CLK_EXTAL,      32),
+
+       /* Core Clock Outputs */
+       DEF_BASE("z",           R8A774A1_CLK_Z,     CLK_TYPE_GEN3_Z, CLK_PLL0),
+       DEF_BASE("z2",          R8A774A1_CLK_Z2,    CLK_TYPE_GEN3_Z2, CLK_PLL2),
+       DEF_FIXED("ztr",        R8A774A1_CLK_ZTR,   CLK_PLL1_DIV2,  6, 1),
+       DEF_FIXED("ztrd2",      R8A774A1_CLK_ZTRD2, CLK_PLL1_DIV2, 12, 1),
+       DEF_FIXED("zt",         R8A774A1_CLK_ZT,    CLK_PLL1_DIV2,  4, 1),
+       DEF_FIXED("zx",         R8A774A1_CLK_ZX,    CLK_PLL1_DIV2,  2, 1),
+       DEF_FIXED("s0d1",       R8A774A1_CLK_S0D1,  CLK_S0,         1, 1),
+       DEF_FIXED("s0d2",       R8A774A1_CLK_S0D2,  CLK_S0,         2, 1),
+       DEF_FIXED("s0d3",       R8A774A1_CLK_S0D3,  CLK_S0,         3, 1),
+       DEF_FIXED("s0d4",       R8A774A1_CLK_S0D4,  CLK_S0,         4, 1),
+       DEF_FIXED("s0d6",       R8A774A1_CLK_S0D6,  CLK_S0,         6, 1),
+       DEF_FIXED("s0d8",       R8A774A1_CLK_S0D8,  CLK_S0,         8, 1),
+       DEF_FIXED("s0d12",      R8A774A1_CLK_S0D12, CLK_S0,        12, 1),
+       DEF_FIXED("s1d2",       R8A774A1_CLK_S1D2,  CLK_S1,         2, 1),
+       DEF_FIXED("s1d4",       R8A774A1_CLK_S1D4,  CLK_S1,         4, 1),
+       DEF_FIXED("s2d1",       R8A774A1_CLK_S2D1,  CLK_S2,         1, 1),
+       DEF_FIXED("s2d2",       R8A774A1_CLK_S2D2,  CLK_S2,         2, 1),
+       DEF_FIXED("s2d4",       R8A774A1_CLK_S2D4,  CLK_S2,         4, 1),
+       DEF_FIXED("s3d1",       R8A774A1_CLK_S3D1,  CLK_S3,         1, 1),
+       DEF_FIXED("s3d2",       R8A774A1_CLK_S3D2,  CLK_S3,         2, 1),
+       DEF_FIXED("s3d4",       R8A774A1_CLK_S3D4,  CLK_S3,         4, 1),
+
+       DEF_GEN3_SD("sd0",      R8A774A1_CLK_SD0,   CLK_SDSRC,     0x074),
+       DEF_GEN3_SD("sd1",      R8A774A1_CLK_SD1,   CLK_SDSRC,     0x078),
+       DEF_GEN3_SD("sd2",      R8A774A1_CLK_SD2,   CLK_SDSRC,     0x268),
+       DEF_GEN3_SD("sd3",      R8A774A1_CLK_SD3,   CLK_SDSRC,     0x26c),
+
+       DEF_FIXED("cl",         R8A774A1_CLK_CL,    CLK_PLL1_DIV2, 48, 1),
+       DEF_FIXED("cp",         R8A774A1_CLK_CP,    CLK_EXTAL,      2, 1),
+
+       DEF_DIV6P1("csi0",      R8A774A1_CLK_CSI0,  CLK_PLL1_DIV4, 0x00c),
+       DEF_DIV6P1("mso",       R8A774A1_CLK_MSO,   CLK_PLL1_DIV4, 0x014),
+       DEF_DIV6P1("hdmi",      R8A774A1_CLK_HDMI,  CLK_PLL1_DIV4, 0x250),
+
+       DEF_GEN3_OSC("osc",     R8A774A1_CLK_OSC,   CLK_EXTAL,     8),
+
+       DEF_BASE("r",           R8A774A1_CLK_R,     CLK_TYPE_GEN3_R, CLK_RINT),
+};
+
+static const struct mssr_mod_clk r8a774a1_mod_clks[] __initconst = {
+       DEF_MOD("fdp1-0",                119,   R8A774A1_CLK_S0D1),
+       DEF_MOD("scif5",                 202,   R8A774A1_CLK_S3D4),
+       DEF_MOD("scif4",                 203,   R8A774A1_CLK_S3D4),
+       DEF_MOD("scif3",                 204,   R8A774A1_CLK_S3D4),
+       DEF_MOD("scif1",                 206,   R8A774A1_CLK_S3D4),
+       DEF_MOD("scif0",                 207,   R8A774A1_CLK_S3D4),
+       DEF_MOD("msiof3",                208,   R8A774A1_CLK_MSO),
+       DEF_MOD("msiof2",                209,   R8A774A1_CLK_MSO),
+       DEF_MOD("msiof1",                210,   R8A774A1_CLK_MSO),
+       DEF_MOD("msiof0",                211,   R8A774A1_CLK_MSO),
+       DEF_MOD("sys-dmac2",             217,   R8A774A1_CLK_S0D3),
+       DEF_MOD("sys-dmac1",             218,   R8A774A1_CLK_S0D3),
+       DEF_MOD("sys-dmac0",             219,   R8A774A1_CLK_S0D3),
+       DEF_MOD("cmt3",                  300,   R8A774A1_CLK_R),
+       DEF_MOD("cmt2",                  301,   R8A774A1_CLK_R),
+       DEF_MOD("cmt1",                  302,   R8A774A1_CLK_R),
+       DEF_MOD("cmt0",                  303,   R8A774A1_CLK_R),
+       DEF_MOD("scif2",                 310,   R8A774A1_CLK_S3D4),
+       DEF_MOD("sdif3",                 311,   R8A774A1_CLK_SD3),
+       DEF_MOD("sdif2",                 312,   R8A774A1_CLK_SD2),
+       DEF_MOD("sdif1",                 313,   R8A774A1_CLK_SD1),
+       DEF_MOD("sdif0",                 314,   R8A774A1_CLK_SD0),
+       DEF_MOD("pcie1",                 318,   R8A774A1_CLK_S3D1),
+       DEF_MOD("pcie0",                 319,   R8A774A1_CLK_S3D1),
+       DEF_MOD("usb3-if0",              328,   R8A774A1_CLK_S3D1),
+       DEF_MOD("usb-dmac0",             330,   R8A774A1_CLK_S3D1),
+       DEF_MOD("usb-dmac1",             331,   R8A774A1_CLK_S3D1),
+       DEF_MOD("rwdt",                  402,   R8A774A1_CLK_R),
+       DEF_MOD("intc-ex",               407,   R8A774A1_CLK_CP),
+       DEF_MOD("intc-ap",               408,   R8A774A1_CLK_S0D3),
+       DEF_MOD("audmac1",               501,   R8A774A1_CLK_S0D3),
+       DEF_MOD("audmac0",               502,   R8A774A1_CLK_S0D3),
+       DEF_MOD("hscif4",                516,   R8A774A1_CLK_S3D1),
+       DEF_MOD("hscif3",                517,   R8A774A1_CLK_S3D1),
+       DEF_MOD("hscif2",                518,   R8A774A1_CLK_S3D1),
+       DEF_MOD("hscif1",                519,   R8A774A1_CLK_S3D1),
+       DEF_MOD("hscif0",                520,   R8A774A1_CLK_S3D1),
+       DEF_MOD("thermal",               522,   R8A774A1_CLK_CP),
+       DEF_MOD("pwm",                   523,   R8A774A1_CLK_S0D12),
+       DEF_MOD("fcpvd2",                601,   R8A774A1_CLK_S0D2),
+       DEF_MOD("fcpvd1",                602,   R8A774A1_CLK_S0D2),
+       DEF_MOD("fcpvd0",                603,   R8A774A1_CLK_S0D2),
+       DEF_MOD("fcpvb0",                607,   R8A774A1_CLK_S0D1),
+       DEF_MOD("fcpvi0",                611,   R8A774A1_CLK_S0D1),
+       DEF_MOD("fcpf0",                 615,   R8A774A1_CLK_S0D1),
+       DEF_MOD("fcpci0",                617,   R8A774A1_CLK_S0D2),
+       DEF_MOD("fcpcs",                 619,   R8A774A1_CLK_S0D2),
+       DEF_MOD("vspd2",                 621,   R8A774A1_CLK_S0D2),
+       DEF_MOD("vspd1",                 622,   R8A774A1_CLK_S0D2),
+       DEF_MOD("vspd0",                 623,   R8A774A1_CLK_S0D2),
+       DEF_MOD("vspb",                  626,   R8A774A1_CLK_S0D1),
+       DEF_MOD("vspi0",                 631,   R8A774A1_CLK_S0D1),
+       DEF_MOD("ehci1",                 702,   R8A774A1_CLK_S3D4),
+       DEF_MOD("ehci0",                 703,   R8A774A1_CLK_S3D4),
+       DEF_MOD("hsusb",                 704,   R8A774A1_CLK_S3D4),
+       DEF_MOD("csi20",                 714,   R8A774A1_CLK_CSI0),
+       DEF_MOD("csi40",                 716,   R8A774A1_CLK_CSI0),
+       DEF_MOD("du2",                   722,   R8A774A1_CLK_S2D1),
+       DEF_MOD("du1",                   723,   R8A774A1_CLK_S2D1),
+       DEF_MOD("du0",                   724,   R8A774A1_CLK_S2D1),
+       DEF_MOD("lvds",                  727,   R8A774A1_CLK_S2D1),
+       DEF_MOD("hdmi0",                 729,   R8A774A1_CLK_HDMI),
+       DEF_MOD("vin7",                  804,   R8A774A1_CLK_S0D2),
+       DEF_MOD("vin6",                  805,   R8A774A1_CLK_S0D2),
+       DEF_MOD("vin5",                  806,   R8A774A1_CLK_S0D2),
+       DEF_MOD("vin4",                  807,   R8A774A1_CLK_S0D2),
+       DEF_MOD("vin3",                  808,   R8A774A1_CLK_S0D2),
+       DEF_MOD("vin2",                  809,   R8A774A1_CLK_S0D2),
+       DEF_MOD("vin1",                  810,   R8A774A1_CLK_S0D2),
+       DEF_MOD("vin0",                  811,   R8A774A1_CLK_S0D2),
+       DEF_MOD("etheravb",              812,   R8A774A1_CLK_S0D6),
+       DEF_MOD("gpio7",                 905,   R8A774A1_CLK_S3D4),
+       DEF_MOD("gpio6",                 906,   R8A774A1_CLK_S3D4),
+       DEF_MOD("gpio5",                 907,   R8A774A1_CLK_S3D4),
+       DEF_MOD("gpio4",                 908,   R8A774A1_CLK_S3D4),
+       DEF_MOD("gpio3",                 909,   R8A774A1_CLK_S3D4),
+       DEF_MOD("gpio2",                 910,   R8A774A1_CLK_S3D4),
+       DEF_MOD("gpio1",                 911,   R8A774A1_CLK_S3D4),
+       DEF_MOD("gpio0",                 912,   R8A774A1_CLK_S3D4),
+       DEF_MOD("can-if1",               915,   R8A774A1_CLK_S3D4),
+       DEF_MOD("can-if0",               916,   R8A774A1_CLK_S3D4),
+       DEF_MOD("i2c6",                  918,   R8A774A1_CLK_S0D6),
+       DEF_MOD("i2c5",                  919,   R8A774A1_CLK_S0D6),
+       DEF_MOD("i2c-dvfs",              926,   R8A774A1_CLK_CP),
+       DEF_MOD("i2c4",                  927,   R8A774A1_CLK_S0D6),
+       DEF_MOD("i2c3",                  928,   R8A774A1_CLK_S0D6),
+       DEF_MOD("i2c2",                  929,   R8A774A1_CLK_S3D2),
+       DEF_MOD("i2c1",                  930,   R8A774A1_CLK_S3D2),
+       DEF_MOD("i2c0",                  931,   R8A774A1_CLK_S3D2),
+       DEF_MOD("ssi-all",              1005,   R8A774A1_CLK_S3D4),
+       DEF_MOD("ssi9",                 1006,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi8",                 1007,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi7",                 1008,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi6",                 1009,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi5",                 1010,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi4",                 1011,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi3",                 1012,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi2",                 1013,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi1",                 1014,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi0",                 1015,   MOD_CLK_ID(1005)),
+       DEF_MOD("scu-all",              1017,   R8A774A1_CLK_S3D4),
+       DEF_MOD("scu-dvc1",             1018,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-dvc0",             1019,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-ctu1-mix1",        1020,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-ctu0-mix0",        1021,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src9",             1022,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src8",             1023,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src7",             1024,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src6",             1025,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src5",             1026,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src4",             1027,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src3",             1028,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src2",             1029,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src1",             1030,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src0",             1031,   MOD_CLK_ID(1017)),
+};
+
+static const unsigned int r8a774a1_crit_mod_clks[] __initconst = {
+       MOD_CLK_ID(408),        /* INTC-AP (GIC) */
+};
+
+/*
+ * CPG Clock Data
+ */
+
+/*
+ *   MD                EXTAL           PLL0    PLL1    PLL2    PLL3    PLL4    OSC
+ * 14 13 19 17 (MHz)
+ *-------------------------------------------------------------------------
+ * 0  0  0  0  16.66 x 1       x180    x192    x144    x192    x144    /16
+ * 0  0  0  1  16.66 x 1       x180    x192    x144    x128    x144    /16
+ * 0  0  1  0  Prohibited setting
+ * 0  0  1  1  16.66 x 1       x180    x192    x144    x192    x144    /16
+ * 0  1  0  0  20    x 1       x150    x160    x120    x160    x120    /19
+ * 0  1  0  1  20    x 1       x150    x160    x120    x106    x120    /19
+ * 0  1  1  0  Prohibited setting
+ * 0  1  1  1  20    x 1       x150    x160    x120    x160    x120    /19
+ * 1  0  0  0  25    x 1       x120    x128    x96     x128    x96     /24
+ * 1  0  0  1  25    x 1       x120    x128    x96     x84     x96     /24
+ * 1  0  1  0  Prohibited setting
+ * 1  0  1  1  25    x 1       x120    x128    x96     x128    x96     /24
+ * 1  1  0  0  33.33 / 2       x180    x192    x144    x192    x144    /32
+ * 1  1  0  1  33.33 / 2       x180    x192    x144    x128    x144    /32
+ * 1  1  1  0  Prohibited setting
+ * 1  1  1  1  33.33 / 2       x180    x192    x144    x192    x144    /32
+ */
+#define CPG_PLL_CONFIG_INDEX(md)       ((((md) & BIT(14)) >> 11) | \
+                                        (((md) & BIT(13)) >> 11) | \
+                                        (((md) & BIT(19)) >> 18) | \
+                                        (((md) & BIT(17)) >> 17))
+
+static const struct rcar_gen3_cpg_pll_config cpg_pll_configs[16] __initconst = {
+       /* EXTAL div    PLL1 mult/div   PLL3 mult/div   OSC prediv */
+       { 1,            192,    1,      192,    1,      16,     },
+       { 1,            192,    1,      128,    1,      16,     },
+       { 0, /* Prohibited setting */                           },
+       { 1,            192,    1,      192,    1,      16,     },
+       { 1,            160,    1,      160,    1,      19,     },
+       { 1,            160,    1,      106,    1,      19,     },
+       { 0, /* Prohibited setting */                           },
+       { 1,            160,    1,      160,    1,      19,     },
+       { 1,            128,    1,      128,    1,      24,     },
+       { 1,            128,    1,      84,     1,      24,     },
+       { 0, /* Prohibited setting */                           },
+       { 1,            128,    1,      128,    1,      24,     },
+       { 2,            192,    1,      192,    1,      32,     },
+       { 2,            192,    1,      128,    1,      32,     },
+       { 0, /* Prohibited setting */                           },
+       { 2,            192,    1,      192,    1,      32,     },
+};
+
+static int __init r8a774a1_cpg_mssr_init(struct device *dev)
+{
+       const struct rcar_gen3_cpg_pll_config *cpg_pll_config;
+       u32 cpg_mode;
+       int error;
+
+       error = rcar_rst_read_mode_pins(&cpg_mode);
+       if (error)
+               return error;
+
+       cpg_pll_config = &cpg_pll_configs[CPG_PLL_CONFIG_INDEX(cpg_mode)];
+       if (!cpg_pll_config->extal_div) {
+               dev_err(dev, "Prohibited setting (cpg_mode=0x%x)\n", cpg_mode);
+               return -EINVAL;
+       }
+
+       return rcar_gen3_cpg_init(cpg_pll_config, CLK_EXTALR, cpg_mode);
+}
+
+const struct cpg_mssr_info r8a774a1_cpg_mssr_info __initconst = {
+       /* Core Clocks */
+       .core_clks = r8a774a1_core_clks,
+       .num_core_clks = ARRAY_SIZE(r8a774a1_core_clks),
+       .last_dt_core_clk = LAST_DT_CORE_CLK,
+       .num_total_core_clks = MOD_CLK_BASE,
+
+       /* Module Clocks */
+       .mod_clks = r8a774a1_mod_clks,
+       .num_mod_clks = ARRAY_SIZE(r8a774a1_mod_clks),
+       .num_hw_mod_clks = 12 * 32,
+
+       /* Critical Module Clocks */
+       .crit_mod_clks = r8a774a1_crit_mod_clks,
+       .num_crit_mod_clks = ARRAY_SIZE(r8a774a1_crit_mod_clks),
+
+       /* Callbacks */
+       .init = r8a774a1_cpg_mssr_init,
+       .cpg_clk_register = rcar_gen3_cpg_clk_register,
+};
diff --git a/drivers/clk/renesas/r8a774c0-cpg-mssr.c b/drivers/clk/renesas/r8a774c0-cpg-mssr.c
new file mode 100644 (file)
index 0000000..10b9689
--- /dev/null
@@ -0,0 +1,286 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * r8a774c0 Clock Pulse Generator / Module Standby and Software Reset
+ *
+ * Copyright (C) 2018 Renesas Electronics Corp.
+ *
+ * Based on r8a77990-cpg-mssr.c
+ *
+ * Copyright (C) 2015 Glider bvba
+ * Copyright (C) 2015 Renesas Electronics Corp.
+ */
+
+#include <linux/device.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/soc/renesas/rcar-rst.h>
+
+#include <dt-bindings/clock/r8a774c0-cpg-mssr.h>
+
+#include "renesas-cpg-mssr.h"
+#include "rcar-gen3-cpg.h"
+
+enum clk_ids {
+       /* Core Clock Outputs exported to DT */
+       LAST_DT_CORE_CLK = R8A774C0_CLK_CPEX,
+
+       /* External Input Clocks */
+       CLK_EXTAL,
+
+       /* Internal Core Clocks */
+       CLK_MAIN,
+       CLK_PLL0,
+       CLK_PLL1,
+       CLK_PLL3,
+       CLK_PLL0D4,
+       CLK_PLL0D8,
+       CLK_PLL0D20,
+       CLK_PLL0D24,
+       CLK_PLL1D2,
+       CLK_PE,
+       CLK_S0,
+       CLK_S1,
+       CLK_S2,
+       CLK_S3,
+       CLK_SDSRC,
+       CLK_RINT,
+       CLK_OCO,
+
+       /* Module Clocks */
+       MOD_CLK_BASE
+};
+
+static const struct cpg_core_clk r8a774c0_core_clks[] __initconst = {
+       /* External Clock Inputs */
+       DEF_INPUT("extal",     CLK_EXTAL),
+
+       /* Internal Core Clocks */
+       DEF_BASE(".main",      CLK_MAIN, CLK_TYPE_GEN3_MAIN,       CLK_EXTAL),
+       DEF_BASE(".pll1",      CLK_PLL1, CLK_TYPE_GEN3_PLL1,       CLK_MAIN),
+       DEF_BASE(".pll3",      CLK_PLL3, CLK_TYPE_GEN3_PLL3,       CLK_MAIN),
+
+       DEF_FIXED(".pll0",     CLK_PLL0,           CLK_MAIN,       1, 100),
+       DEF_FIXED(".pll0d4",   CLK_PLL0D4,         CLK_PLL0,       4, 1),
+       DEF_FIXED(".pll0d8",   CLK_PLL0D8,         CLK_PLL0,       8, 1),
+       DEF_FIXED(".pll0d20",  CLK_PLL0D20,        CLK_PLL0,      20, 1),
+       DEF_FIXED(".pll0d24",  CLK_PLL0D24,        CLK_PLL0,      24, 1),
+       DEF_FIXED(".pll1d2",   CLK_PLL1D2,         CLK_PLL1,       2, 1),
+       DEF_FIXED(".pe",       CLK_PE,             CLK_PLL0D20,    1, 1),
+       DEF_FIXED(".s0",       CLK_S0,             CLK_PLL1,       2, 1),
+       DEF_FIXED(".s1",       CLK_S1,             CLK_PLL1,       3, 1),
+       DEF_FIXED(".s2",       CLK_S2,             CLK_PLL1,       4, 1),
+       DEF_FIXED(".s3",       CLK_S3,             CLK_PLL1,       6, 1),
+       DEF_FIXED(".sdsrc",    CLK_SDSRC,          CLK_PLL1,       2, 1),
+
+       DEF_DIV6_RO(".r",      CLK_RINT,           CLK_EXTAL, CPG_RCKCR, 32),
+
+       DEF_RATE(".oco",       CLK_OCO,            8 * 1000 * 1000),
+
+       /* Core Clock Outputs */
+       DEF_FIXED("za2",       R8A774C0_CLK_ZA2,   CLK_PLL0D24,    1, 1),
+       DEF_FIXED("za8",       R8A774C0_CLK_ZA8,   CLK_PLL0D8,     1, 1),
+       DEF_FIXED("ztr",       R8A774C0_CLK_ZTR,   CLK_PLL1,       6, 1),
+       DEF_FIXED("zt",        R8A774C0_CLK_ZT,    CLK_PLL1,       4, 1),
+       DEF_FIXED("zx",        R8A774C0_CLK_ZX,    CLK_PLL1,       3, 1),
+       DEF_FIXED("s0d1",      R8A774C0_CLK_S0D1,  CLK_S0,         1, 1),
+       DEF_FIXED("s0d3",      R8A774C0_CLK_S0D3,  CLK_S0,         3, 1),
+       DEF_FIXED("s0d6",      R8A774C0_CLK_S0D6,  CLK_S0,         6, 1),
+       DEF_FIXED("s0d12",     R8A774C0_CLK_S0D12, CLK_S0,        12, 1),
+       DEF_FIXED("s0d24",     R8A774C0_CLK_S0D24, CLK_S0,        24, 1),
+       DEF_FIXED("s1d1",      R8A774C0_CLK_S1D1,  CLK_S1,         1, 1),
+       DEF_FIXED("s1d2",      R8A774C0_CLK_S1D2,  CLK_S1,         2, 1),
+       DEF_FIXED("s1d4",      R8A774C0_CLK_S1D4,  CLK_S1,         4, 1),
+       DEF_FIXED("s2d1",      R8A774C0_CLK_S2D1,  CLK_S2,         1, 1),
+       DEF_FIXED("s2d2",      R8A774C0_CLK_S2D2,  CLK_S2,         2, 1),
+       DEF_FIXED("s2d4",      R8A774C0_CLK_S2D4,  CLK_S2,         4, 1),
+       DEF_FIXED("s3d1",      R8A774C0_CLK_S3D1,  CLK_S3,         1, 1),
+       DEF_FIXED("s3d2",      R8A774C0_CLK_S3D2,  CLK_S3,         2, 1),
+       DEF_FIXED("s3d4",      R8A774C0_CLK_S3D4,  CLK_S3,         4, 1),
+
+       DEF_GEN3_SD("sd0",     R8A774C0_CLK_SD0,   CLK_SDSRC,     0x0074),
+       DEF_GEN3_SD("sd1",     R8A774C0_CLK_SD1,   CLK_SDSRC,     0x0078),
+       DEF_GEN3_SD("sd3",     R8A774C0_CLK_SD3,   CLK_SDSRC,     0x026c),
+
+       DEF_FIXED("cl",        R8A774C0_CLK_CL,    CLK_PLL1,      48, 1),
+       DEF_FIXED("cp",        R8A774C0_CLK_CP,    CLK_EXTAL,      2, 1),
+       DEF_FIXED("cpex",      R8A774C0_CLK_CPEX,  CLK_EXTAL,      4, 1),
+
+       DEF_DIV6_RO("osc",     R8A774C0_CLK_OSC,   CLK_EXTAL, CPG_RCKCR,  8),
+
+       DEF_GEN3_PE("s0d6c",   R8A774C0_CLK_S0D6C, CLK_S0, 6, CLK_PE, 2),
+       DEF_GEN3_PE("s3d1c",   R8A774C0_CLK_S3D1C, CLK_S3, 1, CLK_PE, 1),
+       DEF_GEN3_PE("s3d2c",   R8A774C0_CLK_S3D2C, CLK_S3, 2, CLK_PE, 2),
+       DEF_GEN3_PE("s3d4c",   R8A774C0_CLK_S3D4C, CLK_S3, 4, CLK_PE, 4),
+
+       DEF_DIV6P1("csi0",     R8A774C0_CLK_CSI0,  CLK_PLL1D2, 0x00c),
+       DEF_DIV6P1("mso",      R8A774C0_CLK_MSO,   CLK_PLL1D2, 0x014),
+
+       DEF_GEN3_RCKSEL("r",   R8A774C0_CLK_R, CLK_RINT, 1, CLK_OCO, 61 * 4),
+};
+
+static const struct mssr_mod_clk r8a774c0_mod_clks[] __initconst = {
+       DEF_MOD("scif5",                 202,   R8A774C0_CLK_S3D4C),
+       DEF_MOD("scif4",                 203,   R8A774C0_CLK_S3D4C),
+       DEF_MOD("scif3",                 204,   R8A774C0_CLK_S3D4C),
+       DEF_MOD("scif1",                 206,   R8A774C0_CLK_S3D4C),
+       DEF_MOD("scif0",                 207,   R8A774C0_CLK_S3D4C),
+       DEF_MOD("msiof3",                208,   R8A774C0_CLK_MSO),
+       DEF_MOD("msiof2",                209,   R8A774C0_CLK_MSO),
+       DEF_MOD("msiof1",                210,   R8A774C0_CLK_MSO),
+       DEF_MOD("msiof0",                211,   R8A774C0_CLK_MSO),
+       DEF_MOD("sys-dmac2",             217,   R8A774C0_CLK_S3D1),
+       DEF_MOD("sys-dmac1",             218,   R8A774C0_CLK_S3D1),
+       DEF_MOD("sys-dmac0",             219,   R8A774C0_CLK_S3D1),
+
+       DEF_MOD("cmt3",                  300,   R8A774C0_CLK_R),
+       DEF_MOD("cmt2",                  301,   R8A774C0_CLK_R),
+       DEF_MOD("cmt1",                  302,   R8A774C0_CLK_R),
+       DEF_MOD("cmt0",                  303,   R8A774C0_CLK_R),
+       DEF_MOD("scif2",                 310,   R8A774C0_CLK_S3D4C),
+       DEF_MOD("sdif3",                 311,   R8A774C0_CLK_SD3),
+       DEF_MOD("sdif1",                 313,   R8A774C0_CLK_SD1),
+       DEF_MOD("sdif0",                 314,   R8A774C0_CLK_SD0),
+       DEF_MOD("pcie0",                 319,   R8A774C0_CLK_S3D1),
+       DEF_MOD("usb3-if0",              328,   R8A774C0_CLK_S3D1),
+       DEF_MOD("usb-dmac0",             330,   R8A774C0_CLK_S3D1),
+       DEF_MOD("usb-dmac1",             331,   R8A774C0_CLK_S3D1),
+
+       DEF_MOD("rwdt",                  402,   R8A774C0_CLK_R),
+       DEF_MOD("intc-ex",               407,   R8A774C0_CLK_CP),
+       DEF_MOD("intc-ap",               408,   R8A774C0_CLK_S0D3),
+
+       DEF_MOD("audmac0",               502,   R8A774C0_CLK_S3D4),
+       DEF_MOD("hscif4",                516,   R8A774C0_CLK_S3D1C),
+       DEF_MOD("hscif3",                517,   R8A774C0_CLK_S3D1C),
+       DEF_MOD("hscif2",                518,   R8A774C0_CLK_S3D1C),
+       DEF_MOD("hscif1",                519,   R8A774C0_CLK_S3D1C),
+       DEF_MOD("hscif0",                520,   R8A774C0_CLK_S3D1C),
+       DEF_MOD("thermal",               522,   R8A774C0_CLK_CP),
+       DEF_MOD("pwm",                   523,   R8A774C0_CLK_S3D4C),
+
+       DEF_MOD("fcpvd1",                602,   R8A774C0_CLK_S1D2),
+       DEF_MOD("fcpvd0",                603,   R8A774C0_CLK_S1D2),
+       DEF_MOD("fcpvb0",                607,   R8A774C0_CLK_S0D1),
+       DEF_MOD("fcpvi0",                611,   R8A774C0_CLK_S0D1),
+       DEF_MOD("fcpf0",                 615,   R8A774C0_CLK_S0D1),
+       DEF_MOD("fcpcs",                 619,   R8A774C0_CLK_S0D1),
+       DEF_MOD("vspd1",                 622,   R8A774C0_CLK_S1D2),
+       DEF_MOD("vspd0",                 623,   R8A774C0_CLK_S1D2),
+       DEF_MOD("vspb",                  626,   R8A774C0_CLK_S0D1),
+       DEF_MOD("vspi0",                 631,   R8A774C0_CLK_S0D1),
+
+       DEF_MOD("ehci0",                 703,   R8A774C0_CLK_S3D4),
+       DEF_MOD("hsusb",                 704,   R8A774C0_CLK_S3D4),
+       DEF_MOD("csi40",                 716,   R8A774C0_CLK_CSI0),
+       DEF_MOD("du1",                   723,   R8A774C0_CLK_S2D1),
+       DEF_MOD("du0",                   724,   R8A774C0_CLK_S2D1),
+       DEF_MOD("lvds",                  727,   R8A774C0_CLK_S2D1),
+
+       DEF_MOD("vin5",                  806,   R8A774C0_CLK_S1D2),
+       DEF_MOD("vin4",                  807,   R8A774C0_CLK_S1D2),
+       DEF_MOD("etheravb",              812,   R8A774C0_CLK_S3D2),
+
+       DEF_MOD("gpio6",                 906,   R8A774C0_CLK_S3D4),
+       DEF_MOD("gpio5",                 907,   R8A774C0_CLK_S3D4),
+       DEF_MOD("gpio4",                 908,   R8A774C0_CLK_S3D4),
+       DEF_MOD("gpio3",                 909,   R8A774C0_CLK_S3D4),
+       DEF_MOD("gpio2",                 910,   R8A774C0_CLK_S3D4),
+       DEF_MOD("gpio1",                 911,   R8A774C0_CLK_S3D4),
+       DEF_MOD("gpio0",                 912,   R8A774C0_CLK_S3D4),
+       DEF_MOD("can-if1",               915,   R8A774C0_CLK_S3D4),
+       DEF_MOD("can-if0",               916,   R8A774C0_CLK_S3D4),
+       DEF_MOD("i2c6",                  918,   R8A774C0_CLK_S3D2),
+       DEF_MOD("i2c5",                  919,   R8A774C0_CLK_S3D2),
+       DEF_MOD("i2c-dvfs",              926,   R8A774C0_CLK_CP),
+       DEF_MOD("i2c4",                  927,   R8A774C0_CLK_S3D2),
+       DEF_MOD("i2c3",                  928,   R8A774C0_CLK_S3D2),
+       DEF_MOD("i2c2",                  929,   R8A774C0_CLK_S3D2),
+       DEF_MOD("i2c1",                  930,   R8A774C0_CLK_S3D2),
+       DEF_MOD("i2c0",                  931,   R8A774C0_CLK_S3D2),
+
+       DEF_MOD("i2c7",                 1003,   R8A774C0_CLK_S3D2),
+       DEF_MOD("ssi-all",              1005,   R8A774C0_CLK_S3D4),
+       DEF_MOD("ssi9",                 1006,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi8",                 1007,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi7",                 1008,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi6",                 1009,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi5",                 1010,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi4",                 1011,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi3",                 1012,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi2",                 1013,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi1",                 1014,   MOD_CLK_ID(1005)),
+       DEF_MOD("ssi0",                 1015,   MOD_CLK_ID(1005)),
+       DEF_MOD("scu-all",              1017,   R8A774C0_CLK_S3D4),
+       DEF_MOD("scu-dvc1",             1018,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-dvc0",             1019,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-ctu1-mix1",        1020,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-ctu0-mix0",        1021,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src9",             1022,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src8",             1023,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src7",             1024,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src6",             1025,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src5",             1026,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src4",             1027,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src3",             1028,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src2",             1029,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src1",             1030,   MOD_CLK_ID(1017)),
+       DEF_MOD("scu-src0",             1031,   MOD_CLK_ID(1017)),
+};
+
+static const unsigned int r8a774c0_crit_mod_clks[] __initconst = {
+       MOD_CLK_ID(408),        /* INTC-AP (GIC) */
+};
+
+/*
+ * CPG Clock Data
+ */
+
+/*
+ * MD19                EXTAL (MHz)     PLL0            PLL1            PLL3
+ *--------------------------------------------------------------------
+ * 0           48 x 1          x100/1          x100/3          x100/3
+ * 1           48 x 1          x100/1          x100/3           x58/3
+ */
+#define CPG_PLL_CONFIG_INDEX(md)       (((md) & BIT(19)) >> 19)
+
+static const struct rcar_gen3_cpg_pll_config cpg_pll_configs[2] __initconst = {
+       /* EXTAL div    PLL1 mult/div   PLL3 mult/div */
+       { 1,            100,    3,      100,    3,      },
+       { 1,            100,    3,       58,    3,      },
+};
+
+static int __init r8a774c0_cpg_mssr_init(struct device *dev)
+{
+       const struct rcar_gen3_cpg_pll_config *cpg_pll_config;
+       u32 cpg_mode;
+       int error;
+
+       error = rcar_rst_read_mode_pins(&cpg_mode);
+       if (error)
+               return error;
+
+       cpg_pll_config = &cpg_pll_configs[CPG_PLL_CONFIG_INDEX(cpg_mode)];
+
+       return rcar_gen3_cpg_init(cpg_pll_config, 0, cpg_mode);
+}
+
+const struct cpg_mssr_info r8a774c0_cpg_mssr_info __initconst = {
+       /* Core Clocks */
+       .core_clks = r8a774c0_core_clks,
+       .num_core_clks = ARRAY_SIZE(r8a774c0_core_clks),
+       .last_dt_core_clk = LAST_DT_CORE_CLK,
+       .num_total_core_clks = MOD_CLK_BASE,
+
+       /* Module Clocks */
+       .mod_clks = r8a774c0_mod_clks,
+       .num_mod_clks = ARRAY_SIZE(r8a774c0_mod_clks),
+       .num_hw_mod_clks = 12 * 32,
+
+       /* Critical Module Clocks */
+       .crit_mod_clks = r8a774c0_crit_mod_clks,
+       .num_crit_mod_clks = ARRAY_SIZE(r8a774c0_crit_mod_clks),
+
+       /* Callbacks */
+       .init = r8a774c0_cpg_mssr_init,
+       .cpg_clk_register = rcar_gen3_cpg_clk_register,
+};
index f936cb74b6811678f8ba93a003a573afc0c0151d..c57cb93f831589f85eed013f616d99ceadf5c740 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * r8a7790 Clock Pulse Generator / Module Standby and Software Reset
  *
@@ -6,10 +7,6 @@
  * Based on clk-rcar-gen2.c
  *
  * Copyright (C) 2013 Ideas On Board SPRL
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #include <linux/device.h>
index 1b91f03b7598076683f1300ce01b6ccd3b7a416d..65702debcabbf654a23ad9922415b3c5f95d77b5 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * r8a7791 Clock Pulse Generator / Module Standby and Software Reset
  *
@@ -6,10 +7,6 @@
  * Based on clk-rcar-gen2.c
  *
  * Copyright (C) 2013 Ideas On Board SPRL
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #include <linux/device.h>
index 493e07859f5fa40deee18d36ee78bea180c932e3..cf8b84a3a06052fbdacf63e6975e0b60bc6b4456 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * r8a7792 Clock Pulse Generator / Module Standby and Software Reset
  *
@@ -6,10 +7,6 @@
  * Based on clk-rcar-gen2.c
  *
  * Copyright (C) 2013 Ideas On Board SPRL
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #include <linux/device.h>
index 088f4b79fdfcdab4448a242ed6de89df97688716..c1948693c5c1c499b8262b12925c74a2ef1fb8e3 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * r8a7794 Clock Pulse Generator / Module Standby and Software Reset
  *
@@ -6,10 +7,6 @@
  * Based on clk-rcar-gen2.c
  *
  * Copyright (C) 2013 Ideas On Board SPRL
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #include <linux/device.h>
index a85dd50e89110d5d4c571c791a5a8cb87a4d537a..119c024407263568e89d0a66bcf89be8a6259c43 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * r8a7795 Clock Pulse Generator / Module Standby and Software Reset
  *
@@ -6,10 +7,6 @@
  * Based on clk-rcar-gen3.c
  *
  * Copyright (C) 2015 Renesas Electronics Corp.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #include <linux/device.h>
@@ -73,6 +70,8 @@ static struct cpg_core_clk r8a7795_core_clks[] __initdata = {
        DEF_FIXED(".s3",        CLK_S3,            CLK_PLL1_DIV2,  6, 1),
        DEF_FIXED(".sdsrc",     CLK_SDSRC,         CLK_PLL1_DIV2,  2, 1),
 
+       DEF_GEN3_OSC(".r",      CLK_RINT,          CLK_EXTAL,      32),
+
        /* Core Clock Outputs */
        DEF_BASE("z",           R8A7795_CLK_Z,     CLK_TYPE_GEN3_Z, CLK_PLL0),
        DEF_BASE("z2",          R8A7795_CLK_Z2,    CLK_TYPE_GEN3_Z2, CLK_PLL2),
@@ -111,8 +110,7 @@ static struct cpg_core_clk r8a7795_core_clks[] __initdata = {
        DEF_DIV6P1("mso",       R8A7795_CLK_MSO,   CLK_PLL1_DIV4, 0x014),
        DEF_DIV6P1("hdmi",      R8A7795_CLK_HDMI,  CLK_PLL1_DIV4, 0x250),
 
-       DEF_DIV6_RO("osc",      R8A7795_CLK_OSC,   CLK_EXTAL, CPG_RCKCR,  8),
-       DEF_DIV6_RO("r_int",    CLK_RINT,          CLK_EXTAL, CPG_RCKCR, 32),
+       DEF_GEN3_OSC("osc",     R8A7795_CLK_OSC,   CLK_EXTAL,     8),
 
        DEF_BASE("r",           R8A7795_CLK_R,     CLK_TYPE_GEN3_R, CLK_RINT),
 };
@@ -283,25 +281,25 @@ static const unsigned int r8a7795_crit_mod_clks[] __initconst = {
  */
 
 /*
- *   MD                EXTAL           PLL0    PLL1    PLL2    PLL3    PLL4
+ *   MD                EXTAL           PLL0    PLL1    PLL2    PLL3    PLL4    OSC
  * 14 13 19 17 (MHz)
- *-------------------------------------------------------------------
- * 0  0  0  0  16.66 x 1       x180    x192    x144    x192    x144
- * 0  0  0  1  16.66 x 1       x180    x192    x144    x128    x144
+ *-------------------------------------------------------------------------
+ * 0  0  0  0  16.66 x 1       x180    x192    x144    x192    x144    /16
+ * 0  0  0  1  16.66 x 1       x180    x192    x144    x128    x144    /16
  * 0  0  1  0  Prohibited setting
- * 0  0  1  1  16.66 x 1       x180    x192    x144    x192    x144
- * 0  1  0  0  20    x 1       x150    x160    x120    x160    x120
- * 0  1  0  1  20    x 1       x150    x160    x120    x106    x120
+ * 0  0  1  1  16.66 x 1       x180    x192    x144    x192    x144    /16
+ * 0  1  0  0  20    x 1       x150    x160    x120    x160    x120    /19
+ * 0  1  0  1  20    x 1       x150    x160    x120    x106    x120    /19
  * 0  1  1  0  Prohibited setting
- * 0  1  1  1  20    x 1       x150    x160    x120    x160    x120
- * 1  0  0  0  25    x 1       x120    x128    x96     x128    x96
- * 1  0  0  1  25    x 1       x120    x128    x96     x84     x96
+ * 0  1  1  1  20    x 1       x150    x160    x120    x160    x120    /19
+ * 1  0  0  0  25    x 1       x120    x128    x96     x128    x96     /24
+ * 1  0  0  1  25    x 1       x120    x128    x96     x84     x96     /24
  * 1  0  1  0  Prohibited setting
- * 1  0  1  1  25    x 1       x120    x128    x96     x128    x96
- * 1  1  0  0  33.33 / 2       x180    x192    x144    x192    x144
- * 1  1  0  1  33.33 / 2       x180    x192    x144    x128    x144
+ * 1  0  1  1  25    x 1       x120    x128    x96     x128    x96     /24
+ * 1  1  0  0  33.33 / 2       x180    x192    x144    x192    x144    /32
+ * 1  1  0  1  33.33 / 2       x180    x192    x144    x128    x144    /32
  * 1  1  1  0  Prohibited setting
- * 1  1  1  1  33.33 / 2       x180    x192    x144    x192    x144
+ * 1  1  1  1  33.33 / 2       x180    x192    x144    x192    x144    /32
  */
 #define CPG_PLL_CONFIG_INDEX(md)       ((((md) & BIT(14)) >> 11) | \
                                         (((md) & BIT(13)) >> 11) | \
@@ -309,23 +307,23 @@ static const unsigned int r8a7795_crit_mod_clks[] __initconst = {
                                         (((md) & BIT(17)) >> 17))
 
 static const struct rcar_gen3_cpg_pll_config cpg_pll_configs[16] __initconst = {
-       /* EXTAL div    PLL1 mult/div   PLL3 mult/div */
-       { 1,            192,    1,      192,    1,      },
-       { 1,            192,    1,      128,    1,      },
-       { 0, /* Prohibited setting */                   },
-       { 1,            192,    1,      192,    1,      },
-       { 1,            160,    1,      160,    1,      },
-       { 1,            160,    1,      106,    1,      },
-       { 0, /* Prohibited setting */                   },
-       { 1,            160,    1,      160,    1,      },
-       { 1,            128,    1,      128,    1,      },
-       { 1,            128,    1,      84,     1,      },
-       { 0, /* Prohibited setting */                   },
-       { 1,            128,    1,      128,    1,      },
-       { 2,            192,    1,      192,    1,      },
-       { 2,            192,    1,      128,    1,      },
-       { 0, /* Prohibited setting */                   },
-       { 2,            192,    1,      192,    1,      },
+       /* EXTAL div    PLL1 mult/div   PLL3 mult/div   OSC prediv */
+       { 1,            192,    1,      192,    1,      16,     },
+       { 1,            192,    1,      128,    1,      16,     },
+       { 0, /* Prohibited setting */                           },
+       { 1,            192,    1,      192,    1,      16,     },
+       { 1,            160,    1,      160,    1,      19,     },
+       { 1,            160,    1,      106,    1,      19,     },
+       { 0, /* Prohibited setting */                           },
+       { 1,            160,    1,      160,    1,      19,     },
+       { 1,            128,    1,      128,    1,      24,     },
+       { 1,            128,    1,      84,     1,      24,     },
+       { 0, /* Prohibited setting */                           },
+       { 1,            128,    1,      128,    1,      24,     },
+       { 2,            192,    1,      192,    1,      32,     },
+       { 2,            192,    1,      128,    1,      32,     },
+       { 0, /* Prohibited setting */                           },
+       { 2,            192,    1,      192,    1,      32,     },
 };
 
 static const struct soc_device_attribute r8a7795es1[] __initconst = {
index dfb267a92f2a20d384b9f0ea1f04859eb71aeefc..10567386e6dd83eb8e9e4f9e448eaafa6bcdc95d 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * r8a7796 Clock Pulse Generator / Module Standby and Software Reset
  *
@@ -7,10 +8,6 @@
  *
  * Copyright (C) 2015 Glider bvba
  * Copyright (C) 2015 Renesas Electronics Corp.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #include <linux/device.h>
@@ -73,6 +70,8 @@ static const struct cpg_core_clk r8a7796_core_clks[] __initconst = {
        DEF_FIXED(".s3",        CLK_S3,            CLK_PLL1_DIV2,  6, 1),
        DEF_FIXED(".sdsrc",     CLK_SDSRC,         CLK_PLL1_DIV2,  2, 1),
 
+       DEF_GEN3_OSC(".r",      CLK_RINT,          CLK_EXTAL,      32),
+
        /* Core Clock Outputs */
        DEF_BASE("z",           R8A7796_CLK_Z,     CLK_TYPE_GEN3_Z, CLK_PLL0),
        DEF_BASE("z2",          R8A7796_CLK_Z2,    CLK_TYPE_GEN3_Z2, CLK_PLL2),
@@ -110,8 +109,7 @@ static const struct cpg_core_clk r8a7796_core_clks[] __initconst = {
        DEF_DIV6P1("mso",       R8A7796_CLK_MSO,   CLK_PLL1_DIV4, 0x014),
        DEF_DIV6P1("hdmi",      R8A7796_CLK_HDMI,  CLK_PLL1_DIV4, 0x250),
 
-       DEF_DIV6_RO("osc",      R8A7796_CLK_OSC,   CLK_EXTAL, CPG_RCKCR,  8),
-       DEF_DIV6_RO("r_int",    CLK_RINT,          CLK_EXTAL, CPG_RCKCR, 32),
+       DEF_GEN3_OSC("osc",     R8A7796_CLK_OSC,   CLK_EXTAL,     8),
 
        DEF_BASE("r",           R8A7796_CLK_R,     CLK_TYPE_GEN3_R, CLK_RINT),
 };
@@ -255,25 +253,25 @@ static const unsigned int r8a7796_crit_mod_clks[] __initconst = {
  */
 
 /*
- *   MD                EXTAL           PLL0    PLL1    PLL2    PLL3    PLL4
+ *   MD                EXTAL           PLL0    PLL1    PLL2    PLL3    PLL4    OSC
  * 14 13 19 17 (MHz)
- *-------------------------------------------------------------------
- * 0  0  0  0  16.66 x 1       x180    x192    x144    x192    x144
- * 0  0  0  1  16.66 x 1       x180    x192    x144    x128    x144
+ *-------------------------------------------------------------------------
+ * 0  0  0  0  16.66 x 1       x180    x192    x144    x192    x144    /16
+ * 0  0  0  1  16.66 x 1       x180    x192    x144    x128    x144    /16
  * 0  0  1  0  Prohibited setting
- * 0  0  1  1  16.66 x 1       x180    x192    x144    x192    x144
- * 0  1  0  0  20    x 1       x150    x160    x120    x160    x120
- * 0  1  0  1  20    x 1       x150    x160    x120    x106    x120
+ * 0  0  1  1  16.66 x 1       x180    x192    x144    x192    x144    /16
+ * 0  1  0  0  20    x 1       x150    x160    x120    x160    x120    /19
+ * 0  1  0  1  20    x 1       x150    x160    x120    x106    x120    /19
  * 0  1  1  0  Prohibited setting
- * 0  1  1  1  20    x 1       x150    x160    x120    x160    x120
- * 1  0  0  0  25    x 1       x120    x128    x96     x128    x96
- * 1  0  0  1  25    x 1       x120    x128    x96     x84     x96
+ * 0  1  1  1  20    x 1       x150    x160    x120    x160    x120    /19
+ * 1  0  0  0  25    x 1       x120    x128    x96     x128    x96     /24
+ * 1  0  0  1  25    x 1       x120    x128    x96     x84     x96     /24
  * 1  0  1  0  Prohibited setting
- * 1  0  1  1  25    x 1       x120    x128    x96     x128    x96
- * 1  1  0  0  33.33 / 2       x180    x192    x144    x192    x144
- * 1  1  0  1  33.33 / 2       x180    x192    x144    x128    x144
+ * 1  0  1  1  25    x 1       x120    x128    x96     x128    x96     /24
+ * 1  1  0  0  33.33 / 2       x180    x192    x144    x192    x144    /32
+ * 1  1  0  1  33.33 / 2       x180    x192    x144    x128    x144    /32
  * 1  1  1  0  Prohibited setting
- * 1  1  1  1  33.33 / 2       x180    x192    x144    x192    x144
+ * 1  1  1  1  33.33 / 2       x180    x192    x144    x192    x144    /32
  */
 #define CPG_PLL_CONFIG_INDEX(md)       ((((md) & BIT(14)) >> 11) | \
                                         (((md) & BIT(13)) >> 11) | \
@@ -281,23 +279,23 @@ static const unsigned int r8a7796_crit_mod_clks[] __initconst = {
                                         (((md) & BIT(17)) >> 17))
 
 static const struct rcar_gen3_cpg_pll_config cpg_pll_configs[16] __initconst = {
-       /* EXTAL div    PLL1 mult/div   PLL3 mult/div */
-       { 1,            192,    1,      192,    1,      },
-       { 1,            192,    1,      128,    1,      },
-       { 0, /* Prohibited setting */                   },
-       { 1,            192,    1,      192,    1,      },
-       { 1,            160,    1,      160,    1,      },
-       { 1,            160,    1,      106,    1,      },
-       { 0, /* Prohibited setting */                   },
-       { 1,            160,    1,      160,    1,      },
-       { 1,            128,    1,      128,    1,      },
-       { 1,            128,    1,      84,     1,      },
-       { 0, /* Prohibited setting */                   },
-       { 1,            128,    1,      128,    1,      },
-       { 2,            192,    1,      192,    1,      },
-       { 2,            192,    1,      128,    1,      },
-       { 0, /* Prohibited setting */                   },
-       { 2,            192,    1,      192,    1,      },
+       /* EXTAL div    PLL1 mult/div   PLL3 mult/div   OSC prediv */
+       { 1,            192,    1,      192,    1,      16,     },
+       { 1,            192,    1,      128,    1,      16,     },
+       { 0, /* Prohibited setting */                           },
+       { 1,            192,    1,      192,    1,      16,     },
+       { 1,            160,    1,      160,    1,      19,     },
+       { 1,            160,    1,      106,    1,      19,     },
+       { 0, /* Prohibited setting */                           },
+       { 1,            160,    1,      160,    1,      19,     },
+       { 1,            128,    1,      128,    1,      24,     },
+       { 1,            128,    1,      84,     1,      24,     },
+       { 0, /* Prohibited setting */                           },
+       { 1,            128,    1,      128,    1,      24,     },
+       { 2,            192,    1,      192,    1,      32,     },
+       { 2,            192,    1,      128,    1,      32,     },
+       { 0, /* Prohibited setting */                           },
+       { 2,            192,    1,      192,    1,      32,     },
 };
 
 static int __init r8a7796_cpg_mssr_init(struct device *dev)
index 8fae5e9c4a77242d9ea1615f14e1cf08e6507b8e..1fcc411502da5e5f317c7f44a30d69b84d5cf2bf 100644 (file)
@@ -68,6 +68,8 @@ static const struct cpg_core_clk r8a77965_core_clks[] __initconst = {
        DEF_FIXED(".s3",        CLK_S3,                 CLK_PLL1_DIV2,  6, 1),
        DEF_FIXED(".sdsrc",     CLK_SDSRC,              CLK_PLL1_DIV2,  2, 1),
 
+       DEF_GEN3_OSC(".r",      CLK_RINT,               CLK_EXTAL,      32),
+
        /* Core Clock Outputs */
        DEF_BASE("z",           R8A77965_CLK_Z,         CLK_TYPE_GEN3_Z, CLK_PLL0),
        DEF_FIXED("ztr",        R8A77965_CLK_ZTR,       CLK_PLL1_DIV2,  6, 1),
@@ -104,13 +106,13 @@ static const struct cpg_core_clk r8a77965_core_clks[] __initconst = {
        DEF_DIV6P1("mso",       R8A77965_CLK_MSO,       CLK_PLL1_DIV4,  0x014),
        DEF_DIV6P1("hdmi",      R8A77965_CLK_HDMI,      CLK_PLL1_DIV4,  0x250),
 
-       DEF_DIV6_RO("osc",      R8A77965_CLK_OSC, CLK_EXTAL, CPG_RCKCR, 8),
-       DEF_DIV6_RO("r_int",    CLK_RINT, CLK_EXTAL, CPG_RCKCR, 32),
+       DEF_GEN3_OSC("osc",     R8A77965_CLK_OSC,       CLK_EXTAL,      8),
 
        DEF_BASE("r",           R8A77965_CLK_R, CLK_TYPE_GEN3_R, CLK_RINT),
 };
 
 static const struct mssr_mod_clk r8a77965_mod_clks[] __initconst = {
+       DEF_MOD("fdp1-0",               119,    R8A77965_CLK_S0D1),
        DEF_MOD("scif5",                202,    R8A77965_CLK_S3D4),
        DEF_MOD("scif4",                203,    R8A77965_CLK_S3D4),
        DEF_MOD("scif3",                204,    R8A77965_CLK_S3D4),
@@ -192,6 +194,7 @@ static const struct mssr_mod_clk r8a77965_mod_clks[] __initconst = {
        DEF_MOD("vin1",                 810,    R8A77965_CLK_S0D2),
        DEF_MOD("vin0",                 811,    R8A77965_CLK_S0D2),
        DEF_MOD("etheravb",             812,    R8A77965_CLK_S0D6),
+       DEF_MOD("sata0",                815,    R8A77965_CLK_S3D2),
        DEF_MOD("imr1",                 822,    R8A77965_CLK_S0D2),
        DEF_MOD("imr0",                 823,    R8A77965_CLK_S0D2),
 
@@ -252,25 +255,25 @@ static const unsigned int r8a77965_crit_mod_clks[] __initconst = {
  */
 
 /*
- *   MD                EXTAL           PLL0    PLL1    PLL3    PLL4
+ *   MD                EXTAL           PLL0    PLL1    PLL3    PLL4    OSC
  * 14 13 19 17 (MHz)
- *-----------------------------------------------------------
- * 0  0  0  0  16.66 x 1       x180    x192    x192    x144
- * 0  0  0  1  16.66 x 1       x180    x192    x128    x144
+ *-----------------------------------------------------------------
+ * 0  0  0  0  16.66 x 1       x180    x192    x192    x144    /16
+ * 0  0  0  1  16.66 x 1       x180    x192    x128    x144    /16
  * 0  0  1  0  Prohibited setting
- * 0  0  1  1  16.66 x 1       x180    x192    x192    x144
- * 0  1  0  0  20    x 1       x150    x160    x160    x120
- * 0  1  0  1  20    x 1       x150    x160    x106    x120
+ * 0  0  1  1  16.66 x 1       x180    x192    x192    x144    /16
+ * 0  1  0  0  20    x 1       x150    x160    x160    x120    /19
+ * 0  1  0  1  20    x 1       x150    x160    x106    x120    /19
  * 0  1  1  0  Prohibited setting
- * 0  1  1  1  20    x 1       x150    x160    x160    x120
- * 1  0  0  0  25    x 1       x120    x128    x128    x96
- * 1  0  0  1  25    x 1       x120    x128    x84     x96
+ * 0  1  1  1  20    x 1       x150    x160    x160    x120    /19
+ * 1  0  0  0  25    x 1       x120    x128    x128    x96     /24
+ * 1  0  0  1  25    x 1       x120    x128    x84     x96     /24
  * 1  0  1  0  Prohibited setting
- * 1  0  1  1  25    x 1       x120    x128    x128    x96
- * 1  1  0  0  33.33 / 2       x180    x192    x192    x144
- * 1  1  0  1  33.33 / 2       x180    x192    x128    x144
+ * 1  0  1  1  25    x 1       x120    x128    x128    x96     /24
+ * 1  1  0  0  33.33 / 2       x180    x192    x192    x144    /32
+ * 1  1  0  1  33.33 / 2       x180    x192    x128    x144    /32
  * 1  1  1  0  Prohibited setting
- * 1  1  1  1  33.33 / 2       x180    x192    x192    x144
+ * 1  1  1  1  33.33 / 2       x180    x192    x192    x144    /32
  */
 #define CPG_PLL_CONFIG_INDEX(md)       ((((md) & BIT(14)) >> 11) | \
                                         (((md) & BIT(13)) >> 11) | \
@@ -278,23 +281,23 @@ static const unsigned int r8a77965_crit_mod_clks[] __initconst = {
                                         (((md) & BIT(17)) >> 17))
 
 static const struct rcar_gen3_cpg_pll_config cpg_pll_configs[16] __initconst = {
-       /* EXTAL div    PLL1 mult/div   PLL3 mult/div */
-       { 1,            192,    1,      192,    1,      },
-       { 1,            192,    1,      128,    1,      },
-       { 0, /* Prohibited setting */                   },
-       { 1,            192,    1,      192,    1,      },
-       { 1,            160,    1,      160,    1,      },
-       { 1,            160,    1,      106,    1,      },
-       { 0, /* Prohibited setting */                   },
-       { 1,            160,    1,      160,    1,      },
-       { 1,            128,    1,      128,    1,      },
-       { 1,            128,    1,      84,     1,      },
-       { 0, /* Prohibited setting */                   },
-       { 1,            128,    1,      128,    1,      },
-       { 2,            192,    1,      192,    1,      },
-       { 2,            192,    1,      128,    1,      },
-       { 0, /* Prohibited setting */                   },
-       { 2,            192,    1,      192,    1,      },
+       /* EXTAL div    PLL1 mult/div   PLL3 mult/div   OSC prediv */
+       { 1,            192,    1,      192,    1,      16,     },
+       { 1,            192,    1,      128,    1,      16,     },
+       { 0, /* Prohibited setting */                           },
+       { 1,            192,    1,      192,    1,      16,     },
+       { 1,            160,    1,      160,    1,      19,     },
+       { 1,            160,    1,      106,    1,      19,     },
+       { 0, /* Prohibited setting */                           },
+       { 1,            160,    1,      160,    1,      19,     },
+       { 1,            128,    1,      128,    1,      24,     },
+       { 1,            128,    1,      84,     1,      24,     },
+       { 0, /* Prohibited setting */                           },
+       { 1,            128,    1,      128,    1,      24,     },
+       { 2,            192,    1,      192,    1,      32,     },
+       { 2,            192,    1,      128,    1,      32,     },
+       { 0, /* Prohibited setting */                           },
+       { 2,            192,    1,      192,    1,      32,     },
 };
 
 static int __init r8a77965_cpg_mssr_init(struct device *dev)
index f55842917e8dd36ab86135113ffb468cd60798ba..2015e45543e948f23aa70160a4a5b34f9f61355d 100644 (file)
@@ -1,17 +1,15 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * r8a77970 Clock Pulse Generator / Module Standby and Software Reset
  *
- * Copyright (C) 2017 Cogent Embedded Inc.
+ * Copyright (C) 2017-2018 Cogent Embedded Inc.
  *
  * Based on r8a7795-cpg-mssr.c
  *
  * Copyright (C) 2015 Glider bvba
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
+#include <linux/clk-provider.h>
 #include <linux/device.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
 #include "renesas-cpg-mssr.h"
 #include "rcar-gen3-cpg.h"
 
+#define CPG_SD0CKCR            0x0074
+
+enum r8a77970_clk_types {
+       CLK_TYPE_R8A77970_SD0H = CLK_TYPE_GEN3_SOC_BASE,
+       CLK_TYPE_R8A77970_SD0,
+};
+
 enum clk_ids {
        /* Core Clock Outputs exported to DT */
        LAST_DT_CORE_CLK = R8A77970_CLK_OSC,
@@ -42,6 +47,20 @@ enum clk_ids {
        MOD_CLK_BASE
 };
 
+static spinlock_t cpg_lock;
+
+static const struct clk_div_table cpg_sd0h_div_table[] = {
+       {  0,  2 }, {  1,  3 }, {  2,  4 }, {  3,  6 },
+       {  4,  8 }, {  5, 12 }, {  6, 16 }, {  7, 18 },
+       {  8, 24 }, { 10, 36 }, { 11, 48 }, {  0,  0 },
+};
+
+static const struct clk_div_table cpg_sd0_div_table[] = {
+       {  4,  8 }, {  5, 12 }, {  6, 16 }, {  7, 18 },
+       {  8, 24 }, { 10, 36 }, { 11, 48 }, { 12, 10 },
+       {  0,  0 },
+};
+
 static const struct cpg_core_clk r8a77970_core_clks[] __initconst = {
        /* External Clock Inputs */
        DEF_INPUT("extal",      CLK_EXTAL),
@@ -68,6 +87,10 @@ static const struct cpg_core_clk r8a77970_core_clks[] __initconst = {
        DEF_FIXED("s2d2",       R8A77970_CLK_S2D2,  CLK_PLL1_DIV2, 12, 1),
        DEF_FIXED("s2d4",       R8A77970_CLK_S2D4,  CLK_PLL1_DIV2, 24, 1),
 
+       DEF_BASE("sd0h", R8A77970_CLK_SD0H, CLK_TYPE_R8A77970_SD0H,
+                CLK_PLL1_DIV2),
+       DEF_BASE("sd0", R8A77970_CLK_SD0, CLK_TYPE_R8A77970_SD0, CLK_PLL1_DIV2),
+
        DEF_FIXED("cl",         R8A77970_CLK_CL,    CLK_PLL1_DIV2, 48, 1),
        DEF_FIXED("cp",         R8A77970_CLK_CP,    CLK_EXTAL,      2, 1),
 
@@ -80,6 +103,11 @@ static const struct cpg_core_clk r8a77970_core_clks[] __initconst = {
 };
 
 static const struct mssr_mod_clk r8a77970_mod_clks[] __initconst = {
+       DEF_MOD("tmu4",                  121,   R8A77970_CLK_S2D2),
+       DEF_MOD("tmu3",                  122,   R8A77970_CLK_S2D2),
+       DEF_MOD("tmu2",                  123,   R8A77970_CLK_S2D2),
+       DEF_MOD("tmu1",                  124,   R8A77970_CLK_S2D2),
+       DEF_MOD("tmu0",                  125,   R8A77970_CLK_CP),
        DEF_MOD("ivcp1e",                127,   R8A77970_CLK_S2D1),
        DEF_MOD("scif4",                 203,   R8A77970_CLK_S2D4),
        DEF_MOD("scif3",                 204,   R8A77970_CLK_S2D4),
@@ -92,6 +120,12 @@ static const struct mssr_mod_clk r8a77970_mod_clks[] __initconst = {
        DEF_MOD("mfis",                  213,   R8A77970_CLK_S2D2),
        DEF_MOD("sys-dmac2",             217,   R8A77970_CLK_S2D1),
        DEF_MOD("sys-dmac1",             218,   R8A77970_CLK_S2D1),
+       DEF_MOD("cmt3",                  300,   R8A77970_CLK_R),
+       DEF_MOD("cmt2",                  301,   R8A77970_CLK_R),
+       DEF_MOD("cmt1",                  302,   R8A77970_CLK_R),
+       DEF_MOD("cmt0",                  303,   R8A77970_CLK_R),
+       DEF_MOD("tpu0",                  304,   R8A77970_CLK_S2D4),
+       DEF_MOD("sd-if",                 314,   R8A77970_CLK_SD0),
        DEF_MOD("rwdt",                  402,   R8A77970_CLK_R),
        DEF_MOD("intc-ex",               407,   R8A77970_CLK_CP),
        DEF_MOD("intc-ap",               408,   R8A77970_CLK_S2D1),
@@ -173,11 +207,46 @@ static int __init r8a77970_cpg_mssr_init(struct device *dev)
        if (error)
                return error;
 
+       spin_lock_init(&cpg_lock);
+
        cpg_pll_config = &cpg_pll_configs[CPG_PLL_CONFIG_INDEX(cpg_mode)];
 
        return rcar_gen3_cpg_init(cpg_pll_config, CLK_EXTALR, cpg_mode);
 }
 
+static struct clk * __init r8a77970_cpg_clk_register(struct device *dev,
+       const struct cpg_core_clk *core, const struct cpg_mssr_info *info,
+       struct clk **clks, void __iomem *base,
+       struct raw_notifier_head *notifiers)
+{
+       const struct clk_div_table *table;
+       const struct clk *parent;
+       unsigned int shift;
+
+       switch (core->type) {
+       case CLK_TYPE_R8A77970_SD0H:
+               table = cpg_sd0h_div_table;
+               shift = 8;
+               break;
+       case CLK_TYPE_R8A77970_SD0:
+               table = cpg_sd0_div_table;
+               shift = 4;
+               break;
+       default:
+               return rcar_gen3_cpg_clk_register(dev, core, info, clks, base,
+                                                 notifiers);
+       }
+
+       parent = clks[core->parent];
+       if (IS_ERR(parent))
+               return ERR_CAST(parent);
+
+       return clk_register_divider_table(NULL, core->name,
+                                         __clk_get_name(parent), 0,
+                                         base + CPG_SD0CKCR,
+                                         shift, 4, 0, table, &cpg_lock);
+}
+
 const struct cpg_mssr_info r8a77970_cpg_mssr_info __initconst = {
        /* Core Clocks */
        .core_clks = r8a77970_core_clks,
@@ -196,5 +265,5 @@ const struct cpg_mssr_info r8a77970_cpg_mssr_info __initconst = {
 
        /* Callbacks */
        .init = r8a77970_cpg_mssr_init,
-       .cpg_clk_register = rcar_gen3_cpg_clk_register,
+       .cpg_clk_register = r8a77970_cpg_clk_register,
 };
index d7ebd9ec00594fc8e12d8c90c9d8f321a8c1daed..25a3083b676413df960e6dbbe963c04524386511 100644 (file)
@@ -41,6 +41,7 @@ enum clk_ids {
        CLK_S2,
        CLK_S3,
        CLK_SDSRC,
+       CLK_OCO,
 
        /* Module Clocks */
        MOD_CLK_BASE
@@ -64,6 +65,7 @@ static const struct cpg_core_clk r8a77980_core_clks[] __initconst = {
        DEF_FIXED(".s2",        CLK_S2,            CLK_PLL1_DIV2,  4, 1),
        DEF_FIXED(".s3",        CLK_S3,            CLK_PLL1_DIV2,  6, 1),
        DEF_FIXED(".sdsrc",     CLK_SDSRC,         CLK_PLL1_DIV2,  2, 1),
+       DEF_RATE(".oco",        CLK_OCO,           32768),
 
        /* Core Clock Outputs */
        DEF_FIXED("ztr",        R8A77980_CLK_ZTR,   CLK_PLL1_DIV2,  6, 1),
@@ -96,6 +98,9 @@ static const struct cpg_core_clk r8a77980_core_clks[] __initconst = {
        DEF_DIV6P1("canfd",     R8A77980_CLK_CANFD, CLK_PLL1_DIV4, 0x244),
        DEF_DIV6P1("csi0",      R8A77980_CLK_CSI0,  CLK_PLL1_DIV4, 0x00c),
        DEF_DIV6P1("mso",       R8A77980_CLK_MSO,   CLK_PLL1_DIV4, 0x014),
+
+       DEF_GEN3_OSC("osc",     R8A77980_CLK_OSC,   CLK_EXTAL,     8),
+       DEF_GEN3_MDSEL("r",     R8A77980_CLK_R, 29, CLK_EXTALR, 1, CLK_OCO, 1),
 };
 
 static const struct mssr_mod_clk r8a77980_mod_clks[] __initconst = {
@@ -114,9 +119,14 @@ static const struct mssr_mod_clk r8a77980_mod_clks[] __initconst = {
        DEF_MOD("msiof0",                211,   R8A77980_CLK_MSO),
        DEF_MOD("sys-dmac2",             217,   R8A77980_CLK_S0D3),
        DEF_MOD("sys-dmac1",             218,   R8A77980_CLK_S0D3),
+       DEF_MOD("cmt3",                  300,   R8A77980_CLK_R),
+       DEF_MOD("cmt2",                  301,   R8A77980_CLK_R),
+       DEF_MOD("cmt1",                  302,   R8A77980_CLK_R),
+       DEF_MOD("cmt0",                  303,   R8A77980_CLK_R),
        DEF_MOD("tpu0",                  304,   R8A77980_CLK_S3D4),
        DEF_MOD("sdif",                  314,   R8A77980_CLK_SD0),
        DEF_MOD("pciec0",                319,   R8A77980_CLK_S2D2),
+       DEF_MOD("rwdt",                  402,   R8A77980_CLK_R),
        DEF_MOD("intc-ex",               407,   R8A77980_CLK_CP),
        DEF_MOD("intc-ap",               408,   R8A77980_CLK_S0D3),
        DEF_MOD("hscif3",                517,   R8A77980_CLK_S3D1),
@@ -171,23 +181,23 @@ static const unsigned int r8a77980_crit_mod_clks[] __initconst = {
  */
 
 /*
- *   MD                EXTAL           PLL2    PLL1    PLL3
+ *   MD                EXTAL           PLL2    PLL1    PLL3    OSC
  * 14 13       (MHz)
- * --------------------------------------------------
- * 0  0                16.66 x 1       x240    x192    x192
- * 0  1                20    x 1       x200    x160    x160
- * 1  0                27    x 1       x148    x118    x118
- * 1  1                33.33 / 2       x240    x192    x192
+ * --------------------------------------------------------
+ * 0  0                16.66 x 1       x240    x192    x192    /16
+ * 0  1                20    x 1       x200    x160    x160    /19
+ * 1  0                27    x 1       x148    x118    x118    /26
+ * 1  1                33.33 / 2       x240    x192    x192    /32
  */
 #define CPG_PLL_CONFIG_INDEX(md)       ((((md) & BIT(14)) >> 13) | \
                                         (((md) & BIT(13)) >> 13))
 
 static const struct rcar_gen3_cpg_pll_config cpg_pll_configs[4] __initconst = {
-       /* EXTAL div    PLL1 mult/div   PLL3 mult/div */
-       { 1,            192,    1,      192,    1,      },
-       { 1,            160,    1,      160,    1,      },
-       { 1,            118,    1,      118,    1,      },
-       { 2,            192,    1,      192,    1,      },
+       /* EXTAL div    PLL1 mult/div   PLL3 mult/div   OSC prediv */
+       { 1,            192,    1,      192,    1,      16,     },
+       { 1,            160,    1,      160,    1,      19,     },
+       { 1,            118,    1,      118,    1,      26,     },
+       { 2,            192,    1,      192,    1,      32,     },
 };
 
 static int __init r8a77980_cpg_mssr_init(struct device *dev)
index 9e14f1486fbb93ccb887c9b85cae0a61757741f3..9eb80180eea0b1a627ace5e586656f53a26a6472 100644 (file)
@@ -44,6 +44,8 @@ enum clk_ids {
        CLK_S2,
        CLK_S3,
        CLK_SDSRC,
+       CLK_RINT,
+       CLK_OCO,
 
        /* Module Clocks */
        MOD_CLK_BASE
@@ -72,6 +74,10 @@ static const struct cpg_core_clk r8a77990_core_clks[] __initconst = {
        DEF_FIXED(".s3",       CLK_S3,             CLK_PLL1,       6, 1),
        DEF_FIXED(".sdsrc",    CLK_SDSRC,          CLK_PLL1,       2, 1),
 
+       DEF_DIV6_RO(".r",      CLK_RINT,           CLK_EXTAL, CPG_RCKCR, 32),
+
+       DEF_RATE(".oco",       CLK_OCO,            8 * 1000 * 1000),
+
        /* Core Clock Outputs */
        DEF_FIXED("za2",       R8A77990_CLK_ZA2,   CLK_PLL0D24,    1, 1),
        DEF_FIXED("za8",       R8A77990_CLK_ZA8,   CLK_PLL0D8,     1, 1),
@@ -100,8 +106,8 @@ static const struct cpg_core_clk r8a77990_core_clks[] __initconst = {
        DEF_FIXED("cl",        R8A77990_CLK_CL,    CLK_PLL1,      48, 1),
        DEF_FIXED("cp",        R8A77990_CLK_CP,    CLK_EXTAL,      2, 1),
        DEF_FIXED("cpex",      R8A77990_CLK_CPEX,  CLK_EXTAL,      4, 1),
-       DEF_FIXED("osc",       R8A77990_CLK_OSC,   CLK_EXTAL,    384, 1),
-       DEF_FIXED("r",         R8A77990_CLK_R,     CLK_EXTAL,   1536, 1),
+
+       DEF_DIV6_RO("osc",     R8A77990_CLK_OSC,   CLK_EXTAL, CPG_RCKCR,  8),
 
        DEF_GEN3_PE("s0d6c",   R8A77990_CLK_S0D6C, CLK_S0, 6, CLK_PE, 2),
        DEF_GEN3_PE("s3d1c",   R8A77990_CLK_S3D1C, CLK_S3, 1, CLK_PE, 1),
@@ -111,6 +117,8 @@ static const struct cpg_core_clk r8a77990_core_clks[] __initconst = {
        DEF_DIV6P1("canfd",    R8A77990_CLK_CANFD, CLK_PLL0D6, 0x244),
        DEF_DIV6P1("csi0",     R8A77990_CLK_CSI0,  CLK_PLL1D2, 0x00c),
        DEF_DIV6P1("mso",      R8A77990_CLK_MSO,   CLK_PLL1D2, 0x014),
+
+       DEF_GEN3_RCKSEL("r",   R8A77990_CLK_R, CLK_RINT, 1, CLK_OCO, 61 * 4),
 };
 
 static const struct mssr_mod_clk r8a77990_mod_clks[] __initconst = {
@@ -202,6 +210,7 @@ static const struct mssr_mod_clk r8a77990_mod_clks[] __initconst = {
        DEF_MOD("i2c1",                  930,   R8A77990_CLK_S3D2),
        DEF_MOD("i2c0",                  931,   R8A77990_CLK_S3D2),
 
+       DEF_MOD("i2c7",                 1003,   R8A77990_CLK_S3D2),
        DEF_MOD("ssi-all",              1005,   R8A77990_CLK_S3D4),
        DEF_MOD("ssi9",                 1006,   MOD_CLK_ID(1005)),
        DEF_MOD("ssi8",                 1007,   MOD_CLK_ID(1005)),
@@ -241,8 +250,8 @@ static const unsigned int r8a77990_crit_mod_clks[] __initconst = {
 /*
  * MD19                EXTAL (MHz)     PLL0            PLL1            PLL3
  *--------------------------------------------------------------------
- * 0           48 x 1          x100/4          x100/3          x100/3
- * 1           48 x 1          x100/4          x100/3           x58/3
+ * 0           48 x 1          x100/1          x100/3          x100/3
+ * 1           48 x 1          x100/1          x100/3           x58/3
  */
 #define CPG_PLL_CONFIG_INDEX(md)       (((md) & BIT(19)) >> 19)
 
index ea4cafbe6e851aca89c24f79b4912b1a2278d774..47e60e3dbe05ff18252c7513ec2bd5e3c5b39aff 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * r8a77995 Clock Pulse Generator / Module Standby and Software Reset
  *
@@ -7,10 +8,6 @@
  *
  * Copyright (C) 2015 Glider bvba
  * Copyright (C) 2015 Renesas Electronics Corp.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #include <linux/device.h>
@@ -46,6 +43,8 @@ enum clk_ids {
        CLK_S3,
        CLK_SDSRC,
        CLK_SSPSRC,
+       CLK_RINT,
+       CLK_OCO,
 
        /* Module Clocks */
        MOD_CLK_BASE
@@ -72,6 +71,10 @@ static const struct cpg_core_clk r8a77995_core_clks[] __initconst = {
        DEF_FIXED(".s3",       CLK_S3,             CLK_PLL1,       6, 1),
        DEF_FIXED(".sdsrc",    CLK_SDSRC,          CLK_PLL1,       2, 1),
 
+       DEF_DIV6_RO(".r",      CLK_RINT,           CLK_EXTAL, CPG_RCKCR, 32),
+
+       DEF_RATE(".oco",       CLK_OCO,            8 * 1000 * 1000),
+
        /* Core Clock Outputs */
        DEF_FIXED("z2",        R8A77995_CLK_Z2,    CLK_PLL0D3,     1, 1),
        DEF_FIXED("ztr",       R8A77995_CLK_ZTR,   CLK_PLL1,       6, 1),
@@ -90,8 +93,8 @@ static const struct cpg_core_clk r8a77995_core_clks[] __initconst = {
 
        DEF_FIXED("cl",        R8A77995_CLK_CL,    CLK_PLL1,      48, 1),
        DEF_FIXED("cp",        R8A77995_CLK_CP,    CLK_EXTAL,      2, 1),
-       DEF_FIXED("osc",       R8A77995_CLK_OSC,   CLK_EXTAL,    384, 1),
-       DEF_FIXED("r",         R8A77995_CLK_R,     CLK_EXTAL,   1536, 1),
+
+       DEF_DIV6_RO("osc",     R8A77995_CLK_OSC,   CLK_EXTAL, CPG_RCKCR,  8),
 
        DEF_GEN3_PE("s1d4c",   R8A77995_CLK_S1D4C, CLK_S1, 4, CLK_PE, 2),
        DEF_GEN3_PE("s3d1c",   R8A77995_CLK_S3D1C, CLK_S3, 1, CLK_PE, 1),
@@ -102,6 +105,8 @@ static const struct cpg_core_clk r8a77995_core_clks[] __initconst = {
 
        DEF_DIV6P1("canfd",    R8A77995_CLK_CANFD, CLK_PLL0D3,    0x244),
        DEF_DIV6P1("mso",      R8A77995_CLK_MSO,   CLK_PLL1D2,    0x014),
+
+       DEF_GEN3_RCKSEL("r",   R8A77995_CLK_R, CLK_RINT, 1, CLK_OCO, 61 * 4),
 };
 
 static const struct mssr_mod_clk r8a77995_mod_clks[] __initconst = {
index a0b6ecdc63dd3bba3af1675da498c6429fb99904..6d2b56891559725d3d22bf53444b5854feb37a82 100644 (file)
@@ -539,7 +539,8 @@ r9a06g032_div_round_rate(struct clk_hw *hw,
         * several uarts attached to this divider, and changing this impacts
         * everyone.
         */
-       if (clk->index == R9A06G032_DIV_UART) {
+       if (clk->index == R9A06G032_DIV_UART ||
+           clk->index == R9A06G032_DIV_P2_PG) {
                pr_devel("%s div uart hack!\n", __func__);
                return clk_get_rate(hw->clk);
        }
index daf88bc2cdae177becd5adaea85c886a6c56ffc8..f596a2dafcf4d8d1548b53ed506063f984578816 100644 (file)
@@ -1,11 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * R-Car Gen2 Clock Pulse Generator
  *
  * Copyright (C) 2016 Cogent Embedded Inc.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published
- * by the Free Software Foundation.
  */
 
 #include <linux/bug.h>
index 020a3baad0154231fb397792912fed327f39a0c1..bff9551c7a38a01e90506cc8f424a9b267cb981a 100644 (file)
@@ -1,11 +1,8 @@
-/*
+/* SPDX-License-Identifier: GPL-2.0
+ *
  * R-Car Gen2 Clock Pulse Generator
  *
  * Copyright (C) 2016 Cogent Embedded Inc.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published
- * by the Free Software Foundation; version 2 of the License.
  */
 
 #ifndef __CLK_RENESAS_RCAR_GEN2_CPG_H__
index 628b63b85d3f09c5cfdf37dea4b565953e41264a..4ba38f98cc7bab8296631c04e1d3901870e4891e 100644 (file)
@@ -1,15 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * R-Car Gen3 Clock Pulse Generator
  *
- * Copyright (C) 2015-2016 Glider bvba
+ * Copyright (C) 2015-2018 Glider bvba
  *
  * Based on clk-rcar-gen3.c
  *
  * Copyright (C) 2015 Renesas Electronics Corp.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #include <linux/bug.h>
@@ -31,6 +28,8 @@
 #define CPG_PLL2CR             0x002c
 #define CPG_PLL4CR             0x01f4
 
+#define CPG_RCKCR_CKSEL        BIT(15) /* RCLK Clock Source Select */
+
 struct cpg_simple_notifier {
        struct notifier_block nb;
        void __iomem *reg;
@@ -444,7 +443,7 @@ struct clk * __init rcar_gen3_cpg_clk_register(struct device *dev,
        unsigned int div = 1;
        u32 value;
 
-       parent = clks[core->parent & 0xffff];   /* CLK_TYPE_PE uses high bits */
+       parent = clks[core->parent & 0xffff];   /* some types use high bits */
        if (IS_ERR(parent))
                return ERR_CAST(parent);
 
@@ -524,7 +523,7 @@ struct clk * __init rcar_gen3_cpg_clk_register(struct device *dev,
 
                        if (clk_get_rate(clks[cpg_clk_extalr])) {
                                parent = clks[cpg_clk_extalr];
-                               value |= BIT(15);
+                               value |= CPG_RCKCR_CKSEL;
                        }
 
                        writel(value, csn->reg);
@@ -537,16 +536,14 @@ struct clk * __init rcar_gen3_cpg_clk_register(struct device *dev,
                        parent = clks[cpg_clk_extalr];
                break;
 
-       case CLK_TYPE_GEN3_PE:
+       case CLK_TYPE_GEN3_MDSEL:
                /*
-                * Peripheral clock with a fixed divider, selectable between
-                * clean and spread spectrum parents using MD12
+                * Clock selectable between two parents and two fixed dividers
+                * using a mode pin
                 */
-               if (cpg_mode & BIT(12)) {
-                       /* Clean */
+               if (cpg_mode & BIT(core->offset)) {
                        div = core->div & 0xffff;
                } else {
-                       /* SCCG */
                        parent = clks[core->parent >> 16];
                        if (IS_ERR(parent))
                                return ERR_CAST(parent);
@@ -563,6 +560,28 @@ struct clk * __init rcar_gen3_cpg_clk_register(struct device *dev,
                return cpg_z_clk_register(core->name, __clk_get_name(parent),
                                          base, CPG_FRQCRC_Z2FC_MASK);
 
+       case CLK_TYPE_GEN3_OSC:
+               /*
+                * Clock combining OSC EXTAL predivider and a fixed divider
+                */
+               div = cpg_pll_config->osc_prediv * core->div;
+               break;
+
+       case CLK_TYPE_GEN3_RCKSEL:
+               /*
+                * Clock selectable between two parents and two fixed dividers
+                * using RCKCR.CKSEL
+                */
+               if (readl(base + CPG_RCKCR) & CPG_RCKCR_CKSEL) {
+                       div = core->div & 0xffff;
+               } else {
+                       parent = clks[core->parent >> 16];
+                       if (IS_ERR(parent))
+                               return ERR_CAST(parent);
+                       div = core->div >> 16;
+               }
+               break;
+
        default:
                return ERR_PTR(-EINVAL);
        }
index ea4f8fc3c4c972e79418cef9a251bad3bd4fcbee..f4fb6cf16688cfb3d34a07f8add2764a181c46d9 100644 (file)
@@ -1,11 +1,9 @@
-/*
+/* SPDX-License-Identifier: GPL-2.0
+ *
  * R-Car Gen3 Clock Pulse Generator
  *
- * Copyright (C) 2015-2016 Glider bvba
+ * Copyright (C) 2015-2018 Glider bvba
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #ifndef __CLK_RENESAS_RCAR_GEN3_CPG_H__
@@ -20,19 +18,35 @@ enum rcar_gen3_clk_types {
        CLK_TYPE_GEN3_PLL4,
        CLK_TYPE_GEN3_SD,
        CLK_TYPE_GEN3_R,
-       CLK_TYPE_GEN3_PE,
+       CLK_TYPE_GEN3_MDSEL,    /* Select parent/divider using mode pin */
        CLK_TYPE_GEN3_Z,
        CLK_TYPE_GEN3_Z2,
+       CLK_TYPE_GEN3_OSC,      /* OSC EXTAL predivider and fixed divider */
+       CLK_TYPE_GEN3_RCKSEL,   /* Select parent/divider using RCKCR.CKSEL */
+
+       /* SoC specific definitions start here */
+       CLK_TYPE_GEN3_SOC_BASE,
 };
 
 #define DEF_GEN3_SD(_name, _id, _parent, _offset)      \
        DEF_BASE(_name, _id, CLK_TYPE_GEN3_SD, _parent, .offset = _offset)
 
+#define DEF_GEN3_MDSEL(_name, _id, _md, _parent0, _div0, _parent1, _div1) \
+       DEF_BASE(_name, _id, CLK_TYPE_GEN3_MDSEL,       \
+                (_parent0) << 16 | (_parent1),         \
+                .div = (_div0) << 16 | (_div1), .offset = _md)
+
 #define DEF_GEN3_PE(_name, _id, _parent_sscg, _div_sscg, _parent_clean, \
                    _div_clean) \
-       DEF_BASE(_name, _id, CLK_TYPE_GEN3_PE,                  \
-                (_parent_sscg) << 16 | (_parent_clean),        \
-                .div = (_div_sscg) << 16 | (_div_clean))
+       DEF_GEN3_MDSEL(_name, _id, 12, _parent_sscg, _div_sscg, \
+                      _parent_clean, _div_clean)
+
+#define DEF_GEN3_OSC(_name, _id, _parent, _div)                \
+       DEF_BASE(_name, _id, CLK_TYPE_GEN3_OSC, _parent, .div = _div)
+
+#define DEF_GEN3_RCKSEL(_name, _id, _parent0, _div0, _parent1, _div1) \
+       DEF_BASE(_name, _id, CLK_TYPE_GEN3_RCKSEL,      \
+                (_parent0) << 16 | (_parent1), .div = (_div0) << 16 | (_div1))
 
 struct rcar_gen3_cpg_pll_config {
        u8 extal_div;
@@ -40,6 +54,7 @@ struct rcar_gen3_cpg_pll_config {
        u8 pll1_div;
        u8 pll3_mult;
        u8 pll3_div;
+       u8 osc_prediv;
 };
 
 #define CPG_RCKCR      0x240
index 6cd030a589641335fb10e1137bf6a4d476dba182..b241f9ca3d7146ba85b27ffff0355cc0e9f32277 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Renesas R-Car USB2.0 clock selector
  *
@@ -6,10 +7,6 @@
  * Based on renesas-cpg-mssr.c
  *
  * Copyright (C) 2015 Glider bvba
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #include <linux/clk.h>
index f4b013e9352d9efca6260c5ca763e8fcc53eb6f5..f7bb817420b4fdbb681680fb6bed29dbaf8b9bf4 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Renesas Clock Pulse Generator / Module Standby and Software Reset
  *
@@ -7,10 +8,6 @@
  *
  * Copyright (C) 2013 Ideas On Board SPRL
  * Copyright (C) 2015 Renesas Electronics Corp.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #include <linux/clk.h>
@@ -73,6 +70,17 @@ static const u16 smstpcr[] = {
 
 #define        SMSTPCR(i)      smstpcr[i]
 
+/*
+ * Standby Control Register offsets (RZ/A)
+ * Base address is FRQCR register
+ */
+
+static const u16 stbcr[] = {
+       0xFFFF/*dummy*/, 0x010, 0x014, 0x410, 0x414, 0x418, 0x41C, 0x420,
+       0x424, 0x428, 0x42C,
+};
+
+#define        STBCR(i)        stbcr[i]
 
 /*
  * Software Reset Register offsets
@@ -110,6 +118,7 @@ static const u16 srcr[] = {
  * @notifiers: Notifier chain to save/restore clock state for system resume
  * @smstpcr_saved[].mask: Mask of SMSTPCR[] bits under our control
  * @smstpcr_saved[].val: Saved values of SMSTPCR[]
+ * @stbyctrl: This device has Standby Control Registers
  */
 struct cpg_mssr_priv {
 #ifdef CONFIG_RESET_CONTROLLER
@@ -118,11 +127,13 @@ struct cpg_mssr_priv {
        struct device *dev;
        void __iomem *base;
        spinlock_t rmw_lock;
+       struct device_node *np;
 
        struct clk **clks;
        unsigned int num_core_clks;
        unsigned int num_mod_clks;
        unsigned int last_dt_core_clk;
+       bool stbyctrl;
 
        struct raw_notifier_head notifiers;
        struct {
@@ -131,6 +142,7 @@ struct cpg_mssr_priv {
        } smstpcr_saved[ARRAY_SIZE(smstpcr)];
 };
 
+static struct cpg_mssr_priv *cpg_mssr_priv;
 
 /**
  * struct mstp_clock - MSTP gating clock
@@ -162,16 +174,29 @@ static int cpg_mstp_clock_endisable(struct clk_hw *hw, bool enable)
                enable ? "ON" : "OFF");
        spin_lock_irqsave(&priv->rmw_lock, flags);
 
-       value = readl(priv->base + SMSTPCR(reg));
-       if (enable)
-               value &= ~bitmask;
-       else
-               value |= bitmask;
-       writel(value, priv->base + SMSTPCR(reg));
+       if (priv->stbyctrl) {
+               value = readb(priv->base + STBCR(reg));
+               if (enable)
+                       value &= ~bitmask;
+               else
+                       value |= bitmask;
+               writeb(value, priv->base + STBCR(reg));
+
+               /* dummy read to ensure write has completed */
+               readb(priv->base + STBCR(reg));
+               barrier_data(priv->base + STBCR(reg));
+       } else {
+               value = readl(priv->base + SMSTPCR(reg));
+               if (enable)
+                       value &= ~bitmask;
+               else
+                       value |= bitmask;
+               writel(value, priv->base + SMSTPCR(reg));
+       }
 
        spin_unlock_irqrestore(&priv->rmw_lock, flags);
 
-       if (!enable)
+       if (!enable || priv->stbyctrl)
                return 0;
 
        for (i = 1000; i > 0; --i) {
@@ -205,7 +230,10 @@ static int cpg_mstp_clock_is_enabled(struct clk_hw *hw)
        struct cpg_mssr_priv *priv = clock->priv;
        u32 value;
 
-       value = readl(priv->base + MSTPSR(clock->index / 32));
+       if (priv->stbyctrl)
+               value = readb(priv->base + STBCR(clock->index / 32));
+       else
+               value = readl(priv->base + MSTPSR(clock->index / 32));
 
        return !(value & BIT(clock->index % 32));
 }
@@ -226,6 +254,7 @@ struct clk *cpg_mssr_clk_src_twocell_get(struct of_phandle_args *clkspec,
        unsigned int idx;
        const char *type;
        struct clk *clk;
+       int range_check;
 
        switch (clkspec->args[0]) {
        case CPG_CORE:
@@ -240,8 +269,14 @@ struct clk *cpg_mssr_clk_src_twocell_get(struct of_phandle_args *clkspec,
 
        case CPG_MOD:
                type = "module";
-               idx = MOD_CLK_PACK(clkidx);
-               if (clkidx % 100 > 31 || idx >= priv->num_mod_clks) {
+               if (priv->stbyctrl) {
+                       idx = MOD_CLK_PACK_10(clkidx);
+                       range_check = 7 - (clkidx % 10);
+               } else {
+                       idx = MOD_CLK_PACK(clkidx);
+                       range_check = 31 - (clkidx % 100);
+               }
+               if (range_check < 0 || idx >= priv->num_mod_clks) {
                        dev_err(dev, "Invalid %s clock index %u\n", type,
                                clkidx);
                        return ERR_PTR(-EINVAL);
@@ -283,7 +318,7 @@ static void __init cpg_mssr_register_core_clk(const struct cpg_core_clk *core,
 
        switch (core->type) {
        case CLK_TYPE_IN:
-               clk = of_clk_get_by_name(priv->dev->of_node, core->name);
+               clk = of_clk_get_by_name(priv->np, core->name);
                break;
 
        case CLK_TYPE_FF:
@@ -313,6 +348,11 @@ static void __init cpg_mssr_register_core_clk(const struct cpg_core_clk *core,
                }
                break;
 
+       case CLK_TYPE_FR:
+               clk = clk_register_fixed_rate(NULL, core->name, NULL, 0,
+                                             core->mult);
+               break;
+
        default:
                if (info->cpg_clk_register)
                        clk = info->cpg_clk_register(dev, core, info,
@@ -641,11 +681,22 @@ static inline int cpg_mssr_reset_controller_register(struct cpg_mssr_priv *priv)
 
 
 static const struct of_device_id cpg_mssr_match[] = {
+#ifdef CONFIG_CLK_R7S9210
+       {
+               .compatible = "renesas,r7s9210-cpg-mssr",
+               .data = &r7s9210_cpg_mssr_info,
+       },
+#endif
 #ifdef CONFIG_CLK_R8A7743
        {
                .compatible = "renesas,r8a7743-cpg-mssr",
                .data = &r8a7743_cpg_mssr_info,
        },
+       /* RZ/G1N is (almost) identical to RZ/G1M w.r.t. clocks. */
+       {
+               .compatible = "renesas,r8a7744-cpg-mssr",
+               .data = &r8a7743_cpg_mssr_info,
+       },
 #endif
 #ifdef CONFIG_CLK_R8A7745
        {
@@ -659,6 +710,18 @@ static const struct of_device_id cpg_mssr_match[] = {
                .data = &r8a77470_cpg_mssr_info,
        },
 #endif
+#ifdef CONFIG_CLK_R8A774A1
+       {
+               .compatible = "renesas,r8a774a1-cpg-mssr",
+               .data = &r8a774a1_cpg_mssr_info,
+       },
+#endif
+#ifdef CONFIG_CLK_R8A774C0
+       {
+               .compatible = "renesas,r8a774c0-cpg-mssr",
+               .data = &r8a774c0_cpg_mssr_info,
+       },
+#endif
 #ifdef CONFIG_CLK_R8A7790
        {
                .compatible = "renesas,r8a7790-cpg-mssr",
@@ -780,13 +843,23 @@ static int cpg_mssr_resume_noirq(struct device *dev)
                if (!mask)
                        continue;
 
-               oldval = readl(priv->base + SMSTPCR(reg));
+               if (priv->stbyctrl)
+                       oldval = readb(priv->base + STBCR(reg));
+               else
+                       oldval = readl(priv->base + SMSTPCR(reg));
                newval = oldval & ~mask;
                newval |= priv->smstpcr_saved[reg].val & mask;
                if (newval == oldval)
                        continue;
 
-               writel(newval, priv->base + SMSTPCR(reg));
+               if (priv->stbyctrl) {
+                       writeb(newval, priv->base + STBCR(reg));
+                       /* dummy read to ensure write has completed */
+                       readb(priv->base + STBCR(reg));
+                       barrier_data(priv->base + STBCR(reg));
+                       continue;
+               } else
+                       writel(newval, priv->base + SMSTPCR(reg));
 
                /* Wait until enabled clocks are really enabled */
                mask &= ~priv->smstpcr_saved[reg].val;
@@ -817,61 +890,115 @@ static const struct dev_pm_ops cpg_mssr_pm = {
 #define DEV_PM_OPS     NULL
 #endif /* CONFIG_PM_SLEEP && CONFIG_ARM_PSCI_FW */
 
-static int __init cpg_mssr_probe(struct platform_device *pdev)
+static int __init cpg_mssr_common_init(struct device *dev,
+                                      struct device_node *np,
+                                      const struct cpg_mssr_info *info)
 {
-       struct device *dev = &pdev->dev;
-       struct device_node *np = dev->of_node;
-       const struct cpg_mssr_info *info;
        struct cpg_mssr_priv *priv;
+       struct clk **clks = NULL;
        unsigned int nclks, i;
-       struct resource *res;
-       struct clk **clks;
        int error;
 
-       info = of_device_get_match_data(dev);
        if (info->init) {
                error = info->init(dev);
                if (error)
                        return error;
        }
 
-       priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+       priv = kzalloc(sizeof(*priv), GFP_KERNEL);
        if (!priv)
                return -ENOMEM;
 
+       priv->np = np;
        priv->dev = dev;
        spin_lock_init(&priv->rmw_lock);
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       priv->base = devm_ioremap_resource(dev, res);
-       if (IS_ERR(priv->base))
-               return PTR_ERR(priv->base);
+       priv->base = of_iomap(np, 0);
+       if (!priv->base) {
+               error = -ENOMEM;
+               goto out_err;
+       }
 
        nclks = info->num_total_core_clks + info->num_hw_mod_clks;
-       clks = devm_kmalloc_array(dev, nclks, sizeof(*clks), GFP_KERNEL);
-       if (!clks)
-               return -ENOMEM;
+       clks = kmalloc_array(nclks, sizeof(*clks), GFP_KERNEL);
+       if (!clks) {
+               error = -ENOMEM;
+               goto out_err;
+       }
 
-       dev_set_drvdata(dev, priv);
+       cpg_mssr_priv = priv;
        priv->clks = clks;
        priv->num_core_clks = info->num_total_core_clks;
        priv->num_mod_clks = info->num_hw_mod_clks;
        priv->last_dt_core_clk = info->last_dt_core_clk;
        RAW_INIT_NOTIFIER_HEAD(&priv->notifiers);
+       priv->stbyctrl = info->stbyctrl;
 
        for (i = 0; i < nclks; i++)
                clks[i] = ERR_PTR(-ENOENT);
 
+       error = of_clk_add_provider(np, cpg_mssr_clk_src_twocell_get, priv);
+       if (error)
+               goto out_err;
+
+       return 0;
+
+out_err:
+       kfree(clks);
+       if (priv->base)
+               iounmap(priv->base);
+       kfree(priv);
+
+       return error;
+}
+
+void __init cpg_mssr_early_init(struct device_node *np,
+                               const struct cpg_mssr_info *info)
+{
+       int error;
+       int i;
+
+       error = cpg_mssr_common_init(NULL, np, info);
+       if (error)
+               return;
+
+       for (i = 0; i < info->num_early_core_clks; i++)
+               cpg_mssr_register_core_clk(&info->early_core_clks[i], info,
+                                          cpg_mssr_priv);
+
+       for (i = 0; i < info->num_early_mod_clks; i++)
+               cpg_mssr_register_mod_clk(&info->early_mod_clks[i], info,
+                                         cpg_mssr_priv);
+
+}
+
+static int __init cpg_mssr_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *np = dev->of_node;
+       const struct cpg_mssr_info *info;
+       struct cpg_mssr_priv *priv;
+       unsigned int i;
+       int error;
+
+       info = of_device_get_match_data(dev);
+
+       if (!cpg_mssr_priv) {
+               error = cpg_mssr_common_init(dev, dev->of_node, info);
+               if (error)
+                       return error;
+       }
+
+       priv = cpg_mssr_priv;
+       priv->dev = dev;
+       dev_set_drvdata(dev, priv);
+
        for (i = 0; i < info->num_core_clks; i++)
                cpg_mssr_register_core_clk(&info->core_clks[i], info, priv);
 
        for (i = 0; i < info->num_mod_clks; i++)
                cpg_mssr_register_mod_clk(&info->mod_clks[i], info, priv);
 
-       error = of_clk_add_provider(np, cpg_mssr_clk_src_twocell_get, priv);
-       if (error)
-               return error;
-
        error = devm_add_action_or_reset(dev,
                                         cpg_mssr_del_clk_provider,
                                         np);
@@ -883,6 +1010,10 @@ static int __init cpg_mssr_probe(struct platform_device *pdev)
        if (error)
                return error;
 
+       /* Reset Controller not supported for Standby Control SoCs */
+       if (info->stbyctrl)
+               return 0;
+
        error = cpg_mssr_reset_controller_register(priv);
        if (error)
                return error;
index 642f720b9b055337f554357be8904463d38bce4d..c4ec9df146fd990e90bb3b93b78e93c1d14e811c 100644 (file)
@@ -1,11 +1,8 @@
-/*
+/* SPDX-License-Identifier: GPL-2.0
+ *
  * Renesas Clock Pulse Generator / Module Standby and Software Reset
  *
  * Copyright (C) 2015 Glider bvba
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #ifndef __CLK_RENESAS_CPG_MSSR_H__
@@ -38,6 +35,7 @@ enum clk_types {
        CLK_TYPE_FF,            /* Fixed Factor Clock */
        CLK_TYPE_DIV6P1,        /* DIV6 Clock with 1 parent clock */
        CLK_TYPE_DIV6_RO,       /* DIV6 Clock read only with extra divisor */
+       CLK_TYPE_FR,            /* Fixed Rate Clock */
 
        /* Custom definitions start here */
        CLK_TYPE_CUSTOM,
@@ -56,6 +54,8 @@ enum clk_types {
        DEF_BASE(_name, _id, CLK_TYPE_DIV6P1, _parent, .offset = _offset)
 #define DEF_DIV6_RO(_name, _id, _parent, _offset, _div)        \
        DEF_BASE(_name, _id, CLK_TYPE_DIV6_RO, _parent, .offset = _offset, .div = _div, .mult = 1)
+#define DEF_RATE(_name, _id, _rate)    \
+       DEF_TYPE(_name, _id, CLK_TYPE_FR, .mult = _rate)
 
     /*
      * Definitions of Module Clocks
@@ -75,12 +75,24 @@ struct mssr_mod_clk {
 #define DEF_MOD(_name, _mod, _parent...)       \
        { .name = _name, .id = MOD_CLK_ID(_mod), .parent = _parent }
 
+/* Convert from sparse base-10 to packed index space */
+#define MOD_CLK_PACK_10(x)     ((x / 10) * 32 + (x % 10))
+
+#define MOD_CLK_ID_10(x)       (MOD_CLK_BASE + MOD_CLK_PACK_10(x))
+
+#define DEF_MOD_STB(_name, _mod, _parent...)   \
+       { .name = _name, .id = MOD_CLK_ID_10(_mod), .parent = _parent }
 
 struct device_node;
 
     /**
      * SoC-specific CPG/MSSR Description
      *
+     * @early_core_clks: Array of Early Core Clock definitions
+     * @num_early_core_clks: Number of entries in early_core_clks[]
+     * @early_mod_clks: Array of Early Module Clock definitions
+     * @num_early_mod_clks: Number of entries in early_mod_clks[]
+     *
      * @core_clks: Array of Core Clock definitions
      * @num_core_clks: Number of entries in core_clks[]
      * @last_dt_core_clk: ID of the last Core Clock exported to DT
@@ -100,14 +112,25 @@ struct device_node;
      *
      * @init: Optional callback to perform SoC-specific initialization
      * @cpg_clk_register: Optional callback to handle special Core Clock types
+     *
+     * @stbyctrl: This device has Standby Control Registers which are 8-bits
+     *            wide, no status registers (MSTPSR) and have different address
+     *            offsets.
      */
 
 struct cpg_mssr_info {
+       /* Early Clocks */
+       const struct cpg_core_clk *early_core_clks;
+       unsigned int num_early_core_clks;
+       const struct mssr_mod_clk *early_mod_clks;
+       unsigned int num_early_mod_clks;
+
        /* Core Clocks */
        const struct cpg_core_clk *core_clks;
        unsigned int num_core_clks;
        unsigned int last_dt_core_clk;
        unsigned int num_total_core_clks;
+       bool stbyctrl;
 
        /* Module Clocks */
        const struct mssr_mod_clk *mod_clks;
@@ -131,9 +154,12 @@ struct cpg_mssr_info {
                                        struct raw_notifier_head *notifiers);
 };
 
+extern const struct cpg_mssr_info r7s9210_cpg_mssr_info;
 extern const struct cpg_mssr_info r8a7743_cpg_mssr_info;
 extern const struct cpg_mssr_info r8a7745_cpg_mssr_info;
 extern const struct cpg_mssr_info r8a77470_cpg_mssr_info;
+extern const struct cpg_mssr_info r8a774a1_cpg_mssr_info;
+extern const struct cpg_mssr_info r8a774c0_cpg_mssr_info;
 extern const struct cpg_mssr_info r8a7790_cpg_mssr_info;
 extern const struct cpg_mssr_info r8a7791_cpg_mssr_info;
 extern const struct cpg_mssr_info r8a7792_cpg_mssr_info;
@@ -146,6 +172,8 @@ extern const struct cpg_mssr_info r8a77980_cpg_mssr_info;
 extern const struct cpg_mssr_info r8a77990_cpg_mssr_info;
 extern const struct cpg_mssr_info r8a77995_cpg_mssr_info;
 
+void __init cpg_mssr_early_init(struct device_node *np,
+                               const struct cpg_mssr_info *info);
 
     /*
      * Helpers for fixing up clock tables depending on SoC revision
index e8075359366b0d9ef9cf84611d6c36b19fc22c4a..ebce5260068b72a9e2013e3aeaddc61f7cf252d8 100644 (file)
@@ -80,16 +80,12 @@ static long rockchip_ddrclk_sip_round_rate(struct clk_hw *hw,
 static u8 rockchip_ddrclk_get_parent(struct clk_hw *hw)
 {
        struct rockchip_ddrclk *ddrclk = to_rockchip_ddrclk_hw(hw);
-       int num_parents = clk_hw_get_num_parents(hw);
        u32 val;
 
        val = clk_readl(ddrclk->reg_base +
                        ddrclk->mux_offset) >> ddrclk->mux_shift;
        val &= GENMASK(ddrclk->mux_width - 1, 0);
 
-       if (val >= num_parents)
-               return -EINVAL;
-
        return val;
 }
 
index 67e73fd71f095c9b1164e26a5422c4d8f5edd6ee..fa25e35ce7d5d9670643e93093568640c2cad480 100644 (file)
@@ -645,7 +645,7 @@ static struct rockchip_clk_branch rk3066a_clk_branches[] __initdata = {
        GATE(HCLK_I2S1, "hclk_i2s1", "hclk_cpu", 0, RK2928_CLKGATE_CON(7), 3, GFLAGS),
        GATE(HCLK_I2S2, "hclk_i2s2", "hclk_cpu", 0, RK2928_CLKGATE_CON(7), 4, GFLAGS),
        GATE(HCLK_CIF1, "hclk_cif1", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 6, GFLAGS),
-       GATE(0, "hclk_hdmi", "hclk_cpu", 0, RK2928_CLKGATE_CON(4), 14, GFLAGS),
+       GATE(HCLK_HDMI, "hclk_hdmi", "hclk_cpu", 0, RK2928_CLKGATE_CON(4), 14, GFLAGS),
 
        GATE(HCLK_OTG1, "hclk_usbotg1", "hclk_peri", CLK_IGNORE_UNUSED,
                        RK2928_CLKGATE_CON(5), 14, GFLAGS),
index 450de24a1b4224cd9386881c7c25471f32899060..5a67b7869960e6c87ded5fee5508fa70088841a6 100644 (file)
@@ -83,22 +83,43 @@ static struct rockchip_pll_rate_table rk3288_pll_rates[] = {
        RK3066_PLL_RATE( 768000000, 1, 64, 2),
        RK3066_PLL_RATE( 742500000, 8, 495, 2),
        RK3066_PLL_RATE( 696000000, 1, 58, 2),
+       RK3066_PLL_RATE_NB(621000000, 1, 207, 8, 1),
        RK3066_PLL_RATE( 600000000, 1, 50, 2),
        RK3066_PLL_RATE_NB(594000000, 1, 198, 8, 1),
        RK3066_PLL_RATE( 552000000, 1, 46, 2),
        RK3066_PLL_RATE( 504000000, 1, 84, 4),
        RK3066_PLL_RATE( 500000000, 3, 125, 2),
        RK3066_PLL_RATE( 456000000, 1, 76, 4),
+       RK3066_PLL_RATE( 428000000, 1, 107, 6),
        RK3066_PLL_RATE( 408000000, 1, 68, 4),
        RK3066_PLL_RATE( 400000000, 3, 100, 2),
+       RK3066_PLL_RATE_NB( 394000000, 1, 197, 12, 1),
        RK3066_PLL_RATE( 384000000, 2, 128, 4),
        RK3066_PLL_RATE( 360000000, 1, 60, 4),
+       RK3066_PLL_RATE_NB( 356000000, 1, 178, 12, 1),
+       RK3066_PLL_RATE_NB( 324000000, 1, 189, 14, 1),
        RK3066_PLL_RATE( 312000000, 1, 52, 4),
-       RK3066_PLL_RATE( 300000000, 1, 50, 4),
-       RK3066_PLL_RATE( 297000000, 2, 198, 8),
+       RK3066_PLL_RATE_NB( 308000000, 1, 154, 12, 1),
+       RK3066_PLL_RATE_NB( 303000000, 1, 202, 16, 1),
+       RK3066_PLL_RATE( 300000000, 1, 75, 6),
+       RK3066_PLL_RATE_NB( 297750000, 2, 397, 16, 1),
+       RK3066_PLL_RATE_NB( 293250000, 2, 391, 16, 1),
+       RK3066_PLL_RATE_NB( 292500000, 1, 195, 16, 1),
+       RK3066_PLL_RATE( 273600000, 1, 114, 10),
+       RK3066_PLL_RATE_NB( 273000000, 1, 182, 16, 1),
+       RK3066_PLL_RATE_NB( 270000000, 1, 180, 16, 1),
+       RK3066_PLL_RATE_NB( 266250000, 2, 355, 16, 1),
+       RK3066_PLL_RATE_NB( 256500000, 1, 171, 16, 1),
        RK3066_PLL_RATE( 252000000, 1, 84, 8),
-       RK3066_PLL_RATE( 216000000, 1, 72, 8),
-       RK3066_PLL_RATE( 148500000, 2, 99, 8),
+       RK3066_PLL_RATE_NB( 250500000, 1, 167, 16, 1),
+       RK3066_PLL_RATE_NB( 243428571, 1, 142, 14, 1),
+       RK3066_PLL_RATE( 238000000, 1, 119, 12),
+       RK3066_PLL_RATE_NB( 219750000, 2, 293, 16, 1),
+       RK3066_PLL_RATE_NB( 216000000, 1, 144, 16, 1),
+       RK3066_PLL_RATE_NB( 213000000, 1, 142, 16, 1),
+       RK3066_PLL_RATE( 195428571, 1, 114, 14),
+       RK3066_PLL_RATE( 160000000, 1, 80, 12),
+       RK3066_PLL_RATE( 157500000, 1, 105, 16),
        RK3066_PLL_RATE( 126000000, 1, 84, 16),
        RK3066_PLL_RATE(  48000000, 1, 64, 32),
        { /* sentinel */ },
index 252366a5231f766dd6a9df28fb7a755b7a6021f7..2c54266077907a4cee349fbe9f5a80180477dad5 100644 (file)
@@ -813,22 +813,22 @@ static struct rockchip_clk_branch rk3328_clk_branches[] __initdata = {
        MMC(SCLK_SDMMC_DRV, "sdmmc_drv", "clk_sdmmc",
            RK3328_SDMMC_CON0, 1),
        MMC(SCLK_SDMMC_SAMPLE, "sdmmc_sample", "clk_sdmmc",
-           RK3328_SDMMC_CON1, 1),
+           RK3328_SDMMC_CON1, 0),
 
        MMC(SCLK_SDIO_DRV, "sdio_drv", "clk_sdio",
            RK3328_SDIO_CON0, 1),
        MMC(SCLK_SDIO_SAMPLE, "sdio_sample", "clk_sdio",
-           RK3328_SDIO_CON1, 1),
+           RK3328_SDIO_CON1, 0),
 
        MMC(SCLK_EMMC_DRV, "emmc_drv", "clk_emmc",
            RK3328_EMMC_CON0, 1),
        MMC(SCLK_EMMC_SAMPLE, "emmc_sample", "clk_emmc",
-           RK3328_EMMC_CON1, 1),
+           RK3328_EMMC_CON1, 0),
 
        MMC(SCLK_SDMMC_EXT_DRV, "sdmmc_ext_drv", "clk_sdmmc_ext",
            RK3328_SDMMC_EXT_CON0, 1),
        MMC(SCLK_SDMMC_EXT_SAMPLE, "sdmmc_ext_sample", "clk_sdmmc_ext",
-           RK3328_SDMMC_EXT_CON1, 1),
+           RK3328_SDMMC_EXT_CON1, 0),
 };
 
 static const char *const rk3328_critical_clocks[] __initconst = {
index d2c99d8916b83e48c1b23d6c49dd98f43f81f2db..a5fddebbe530532be49c3c4dc7e3cfdf6d6deea0 100644 (file)
@@ -152,7 +152,7 @@ static int exynos_cpuclk_pre_rate_change(struct clk_notifier_data *ndata,
                        struct exynos_cpuclk *cpuclk, void __iomem *base)
 {
        const struct exynos_cpuclk_cfg_data *cfg_data = cpuclk->cfg;
-       unsigned long alt_prate = clk_get_rate(cpuclk->alt_parent);
+       unsigned long alt_prate = clk_hw_get_rate(cpuclk->alt_parent);
        unsigned long alt_div = 0, alt_div_mask = DIV_MASK;
        unsigned long div0, div1 = 0, mux_reg;
        unsigned long flags;
@@ -280,7 +280,7 @@ static int exynos5433_cpuclk_pre_rate_change(struct clk_notifier_data *ndata,
                        struct exynos_cpuclk *cpuclk, void __iomem *base)
 {
        const struct exynos_cpuclk_cfg_data *cfg_data = cpuclk->cfg;
-       unsigned long alt_prate = clk_get_rate(cpuclk->alt_parent);
+       unsigned long alt_prate = clk_hw_get_rate(cpuclk->alt_parent);
        unsigned long alt_div = 0, alt_div_mask = DIV_MASK;
        unsigned long div0, div1 = 0, mux_reg;
        unsigned long flags;
@@ -432,7 +432,7 @@ int __init exynos_register_cpu_clock(struct samsung_clk_provider *ctx,
        else
                cpuclk->clk_nb.notifier_call = exynos_cpuclk_notifier_cb;
 
-       cpuclk->alt_parent = __clk_lookup(alt_parent);
+       cpuclk->alt_parent = __clk_get_hw(__clk_lookup(alt_parent));
        if (!cpuclk->alt_parent) {
                pr_err("%s: could not lookup alternate parent %s\n",
                                __func__, alt_parent);
index d4b6b517fe1b44689df28853cf894baa3799153d..bd38c6aa389706c92261cd72f4f0c8fd8906ba67 100644 (file)
@@ -49,7 +49,7 @@ struct exynos_cpuclk_cfg_data {
  */
 struct exynos_cpuclk {
        struct clk_hw                           hw;
-       struct clk                              *alt_parent;
+       struct clk_hw                           *alt_parent;
        void __iomem                            *ctrl_base;
        spinlock_t                              *lock;
        const struct exynos_cpuclk_cfg_data     *cfg;
index f659c5cbf1d5d6d70a965582166221e61911cfb1..8f8a0f9fc842d9f7d1a0ba38a9f871c01d324cff 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/clk-provider.h>
 #include <linux/of_address.h>
 #include <linux/of_device.h>
-#include <linux/syscore_ops.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
index 27c9d23657b32fbab4b43ee6459fca3d11a46be8..0e9a41a4cac8da875ee71645fd6803aff005d513 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/platform_device.h>
-#include <linux/syscore_ops.h>
 
 #include <dt-bindings/clock/exynos3250.h>
 
index 0421960eb96333048e709c4df6308c3e8338fb7b..59d4d46667ce51d0043bb9d02e5f2d8b82179c93 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/clk-provider.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
-#include <linux/syscore_ops.h>
 
 #include "clk.h"
 #include "clk-cpu.h"
 #define CLKOUT_CMU_CPU         0x14a00
 #define PWR_CTRL1              0x15020
 #define E4X12_PWR_CTRL2                0x15024
-#define E4X12_DIV_ISP0         0x18300
-#define E4X12_DIV_ISP1         0x18304
-#define E4X12_GATE_ISP0                0x18800
-#define E4X12_GATE_ISP1                0x18804
 
 /* Below definitions are used for PWR_CTRL settings */
 #define PWR_CTRL1_CORE2_DOWN_RATIO(x)          (((x) & 0x7) << 28)
@@ -157,14 +152,6 @@ enum exynos4_plls {
 static void __iomem *reg_base;
 static enum exynos4_soc exynos4_soc;
 
-/*
- * Support for CMU save/restore across system suspends
- */
-#ifdef CONFIG_PM_SLEEP
-static struct samsung_clk_reg_dump *exynos4_save_common;
-static struct samsung_clk_reg_dump *exynos4_save_soc;
-static struct samsung_clk_reg_dump *exynos4_save_pll;
-
 /*
  * list of controller registers to be saved and restored during a
  * suspend/resume cycle.
@@ -192,7 +179,7 @@ static const unsigned long exynos4x12_clk_save[] __initconst = {
        E4X12_PWR_CTRL2,
 };
 
-static const unsigned long exynos4_clk_pll_regs[] __initconst = {
+static const unsigned long exynos4_clk_regs[] __initconst = {
        EPLL_LOCK,
        VPLL_LOCK,
        EPLL_CON0,
@@ -201,9 +188,6 @@ static const unsigned long exynos4_clk_pll_regs[] __initconst = {
        VPLL_CON0,
        VPLL_CON1,
        VPLL_CON2,
-};
-
-static const unsigned long exynos4_clk_regs[] __initconst = {
        SRC_LEFTBUS,
        DIV_LEFTBUS,
        GATE_IP_LEFTBUS,
@@ -276,6 +260,8 @@ static const unsigned long exynos4_clk_regs[] __initconst = {
 };
 
 static const struct samsung_clk_reg_dump src_mask_suspend[] = {
+       { .offset = VPLL_CON0,                  .value = 0x80600302, },
+       { .offset = EPLL_CON0,                  .value = 0x806F0302, },
        { .offset = SRC_MASK_TOP,               .value = 0x00000001, },
        { .offset = SRC_MASK_CAM,               .value = 0x11111111, },
        { .offset = SRC_MASK_TV,                .value = 0x00000111, },
@@ -291,123 +277,6 @@ static const struct samsung_clk_reg_dump src_mask_suspend_e4210[] = {
        { .offset = E4210_SRC_MASK_LCD1,        .value = 0x00001111, },
 };
 
-#define PLL_ENABLED    (1 << 31)
-#define PLL_LOCKED     (1 << 29)
-
-static void exynos4_clk_enable_pll(u32 reg)
-{
-       u32 pll_con = readl(reg_base + reg);
-       pll_con |= PLL_ENABLED;
-       writel(pll_con, reg_base + reg);
-
-       while (!(pll_con & PLL_LOCKED)) {
-               cpu_relax();
-               pll_con = readl(reg_base + reg);
-       }
-}
-
-static void exynos4_clk_wait_for_pll(u32 reg)
-{
-       u32 pll_con;
-
-       pll_con = readl(reg_base + reg);
-       if (!(pll_con & PLL_ENABLED))
-               return;
-
-       while (!(pll_con & PLL_LOCKED)) {
-               cpu_relax();
-               pll_con = readl(reg_base + reg);
-       }
-}
-
-static int exynos4_clk_suspend(void)
-{
-       samsung_clk_save(reg_base, exynos4_save_common,
-                               ARRAY_SIZE(exynos4_clk_regs));
-       samsung_clk_save(reg_base, exynos4_save_pll,
-                               ARRAY_SIZE(exynos4_clk_pll_regs));
-
-       exynos4_clk_enable_pll(EPLL_CON0);
-       exynos4_clk_enable_pll(VPLL_CON0);
-
-       if (exynos4_soc == EXYNOS4210) {
-               samsung_clk_save(reg_base, exynos4_save_soc,
-                                       ARRAY_SIZE(exynos4210_clk_save));
-               samsung_clk_restore(reg_base, src_mask_suspend_e4210,
-                                       ARRAY_SIZE(src_mask_suspend_e4210));
-       } else {
-               samsung_clk_save(reg_base, exynos4_save_soc,
-                                       ARRAY_SIZE(exynos4x12_clk_save));
-       }
-
-       samsung_clk_restore(reg_base, src_mask_suspend,
-                                       ARRAY_SIZE(src_mask_suspend));
-
-       return 0;
-}
-
-static void exynos4_clk_resume(void)
-{
-       samsung_clk_restore(reg_base, exynos4_save_pll,
-                               ARRAY_SIZE(exynos4_clk_pll_regs));
-
-       exynos4_clk_wait_for_pll(EPLL_CON0);
-       exynos4_clk_wait_for_pll(VPLL_CON0);
-
-       samsung_clk_restore(reg_base, exynos4_save_common,
-                               ARRAY_SIZE(exynos4_clk_regs));
-
-       if (exynos4_soc == EXYNOS4210)
-               samsung_clk_restore(reg_base, exynos4_save_soc,
-                                       ARRAY_SIZE(exynos4210_clk_save));
-       else
-               samsung_clk_restore(reg_base, exynos4_save_soc,
-                                       ARRAY_SIZE(exynos4x12_clk_save));
-}
-
-static struct syscore_ops exynos4_clk_syscore_ops = {
-       .suspend = exynos4_clk_suspend,
-       .resume = exynos4_clk_resume,
-};
-
-static void __init exynos4_clk_sleep_init(void)
-{
-       exynos4_save_common = samsung_clk_alloc_reg_dump(exynos4_clk_regs,
-                                       ARRAY_SIZE(exynos4_clk_regs));
-       if (!exynos4_save_common)
-               goto err_warn;
-
-       if (exynos4_soc == EXYNOS4210)
-               exynos4_save_soc = samsung_clk_alloc_reg_dump(
-                                       exynos4210_clk_save,
-                                       ARRAY_SIZE(exynos4210_clk_save));
-       else
-               exynos4_save_soc = samsung_clk_alloc_reg_dump(
-                                       exynos4x12_clk_save,
-                                       ARRAY_SIZE(exynos4x12_clk_save));
-       if (!exynos4_save_soc)
-               goto err_common;
-
-       exynos4_save_pll = samsung_clk_alloc_reg_dump(exynos4_clk_pll_regs,
-                                       ARRAY_SIZE(exynos4_clk_pll_regs));
-       if (!exynos4_save_pll)
-               goto err_soc;
-
-       register_syscore_ops(&exynos4_clk_syscore_ops);
-       return;
-
-err_soc:
-       kfree(exynos4_save_soc);
-err_common:
-       kfree(exynos4_save_common);
-err_warn:
-       pr_warn("%s: failed to allocate sleep save data, no sleep support!\n",
-               __func__);
-}
-#else
-static void __init exynos4_clk_sleep_init(void) {}
-#endif
-
 /* list of all parent clock list */
 PNAME(mout_apll_p)     = { "fin_pll", "fout_apll", };
 PNAME(mout_mpll_p)     = { "fin_pll", "fout_mpll", };
@@ -841,18 +710,6 @@ static const struct samsung_div_clock exynos4x12_div_clks[] __initconst = {
        DIV(0, "div_c2c_aclk", "div_c2c", DIV_DMC1, 12, 3),
 };
 
-static struct samsung_div_clock exynos4x12_isp_div_clks[] = {
-       DIV_F(CLK_DIV_ISP0, "div_isp0", "aclk200", E4X12_DIV_ISP0, 0, 3,
-                                               CLK_GET_RATE_NOCACHE, 0),
-       DIV_F(CLK_DIV_ISP1, "div_isp1", "aclk200", E4X12_DIV_ISP0, 4, 3,
-                                               CLK_GET_RATE_NOCACHE, 0),
-       DIV(0, "div_mpwm", "div_isp1", E4X12_DIV_ISP1, 0, 3),
-       DIV_F(CLK_DIV_MCUISP0, "div_mcuisp0", "aclk400_mcuisp", E4X12_DIV_ISP1,
-                                               4, 3, CLK_GET_RATE_NOCACHE, 0),
-       DIV_F(CLK_DIV_MCUISP1, "div_mcuisp1", "div_mcuisp0", E4X12_DIV_ISP1,
-                                               8, 3, CLK_GET_RATE_NOCACHE, 0),
-};
-
 /* list of gate clocks supported in all exynos4 soc's */
 static const struct samsung_gate_clock exynos4_gate_clks[] __initconst = {
        GATE(CLK_PPMULEFT, "ppmuleft", "aclk200", GATE_IP_LEFTBUS, 1, 0, 0),
@@ -1150,61 +1007,6 @@ static const struct samsung_gate_clock exynos4x12_gate_clks[] __initconst = {
                0),
 };
 
-static struct samsung_gate_clock exynos4x12_isp_gate_clks[] = {
-       GATE(CLK_FIMC_ISP, "isp", "aclk200", E4X12_GATE_ISP0, 0,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_FIMC_DRC, "drc", "aclk200", E4X12_GATE_ISP0, 1,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_FIMC_FD, "fd", "aclk200", E4X12_GATE_ISP0, 2,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_FIMC_LITE0, "lite0", "aclk200", E4X12_GATE_ISP0, 3,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_FIMC_LITE1, "lite1", "aclk200", E4X12_GATE_ISP0, 4,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_MCUISP, "mcuisp", "aclk200", E4X12_GATE_ISP0, 5,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_GICISP, "gicisp", "aclk200", E4X12_GATE_ISP0, 7,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_SMMU_ISP, "smmu_isp", "aclk200", E4X12_GATE_ISP0, 8,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_SMMU_DRC, "smmu_drc", "aclk200", E4X12_GATE_ISP0, 9,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_SMMU_FD, "smmu_fd", "aclk200", E4X12_GATE_ISP0, 10,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_SMMU_LITE0, "smmu_lite0", "aclk200", E4X12_GATE_ISP0, 11,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_SMMU_LITE1, "smmu_lite1", "aclk200", E4X12_GATE_ISP0, 12,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_PPMUISPMX, "ppmuispmx", "aclk200", E4X12_GATE_ISP0, 20,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_PPMUISPX, "ppmuispx", "aclk200", E4X12_GATE_ISP0, 21,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_MCUCTL_ISP, "mcuctl_isp", "aclk200", E4X12_GATE_ISP0, 23,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_MPWM_ISP, "mpwm_isp", "aclk200", E4X12_GATE_ISP0, 24,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_I2C0_ISP, "i2c0_isp", "aclk200", E4X12_GATE_ISP0, 25,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_I2C1_ISP, "i2c1_isp", "aclk200", E4X12_GATE_ISP0, 26,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_MTCADC_ISP, "mtcadc_isp", "aclk200", E4X12_GATE_ISP0, 27,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_PWM_ISP, "pwm_isp", "aclk200", E4X12_GATE_ISP0, 28,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_WDT_ISP, "wdt_isp", "aclk200", E4X12_GATE_ISP0, 30,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_UART_ISP, "uart_isp", "aclk200", E4X12_GATE_ISP0, 31,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_ASYNCAXIM, "asyncaxim", "aclk200", E4X12_GATE_ISP1, 0,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_SMMU_ISPCX, "smmu_ispcx", "aclk200", E4X12_GATE_ISP1, 4,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_SPI0_ISP, "spi0_isp", "aclk200", E4X12_GATE_ISP1, 12,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-       GATE(CLK_SPI1_ISP, "spi1_isp", "aclk200", E4X12_GATE_ISP1, 13,
-                       CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
-};
-
 /*
  * The parent of the fin_pll clock is selected by the XOM[0] bit. This bit
  * resides in chipid register space, outside of the clock controller memory
@@ -1504,8 +1306,6 @@ static void __init exynos4_clk_init(struct device_node *np,
                        e4210_armclk_d, ARRAY_SIZE(e4210_armclk_d),
                        CLK_CPU_NEEDS_DEBUG_ALT_DIV | CLK_CPU_HAS_DIV1);
        } else {
-               struct resource res;
-
                samsung_clk_register_mux(ctx, exynos4x12_mux_clks,
                        ARRAY_SIZE(exynos4x12_mux_clks));
                samsung_clk_register_div(ctx, exynos4x12_div_clks,
@@ -1516,14 +1316,6 @@ static void __init exynos4_clk_init(struct device_node *np,
                        exynos4x12_fixed_factor_clks,
                        ARRAY_SIZE(exynos4x12_fixed_factor_clks));
 
-               of_address_to_resource(np, 0, &res);
-               if (resource_size(&res) > 0x18000) {
-                       samsung_clk_register_div(ctx, exynos4x12_isp_div_clks,
-                               ARRAY_SIZE(exynos4x12_isp_div_clks));
-                       samsung_clk_register_gate(ctx, exynos4x12_isp_gate_clks,
-                               ARRAY_SIZE(exynos4x12_isp_gate_clks));
-               }
-
                exynos_register_cpu_clock(ctx, CLK_ARM_CLK, "armclk",
                        mout_core_p4x12[0], mout_core_p4x12[1], 0x14200,
                        e4412_armclk_d, ARRAY_SIZE(e4412_armclk_d),
@@ -1532,7 +1324,17 @@ static void __init exynos4_clk_init(struct device_node *np,
 
        if (soc == EXYNOS4X12)
                exynos4x12_core_down_clock();
-       exynos4_clk_sleep_init();
+
+       samsung_clk_extended_sleep_init(reg_base,
+                       exynos4_clk_regs, ARRAY_SIZE(exynos4_clk_regs),
+                       src_mask_suspend, ARRAY_SIZE(src_mask_suspend));
+       if (exynos4_soc == EXYNOS4210)
+               samsung_clk_extended_sleep_init(reg_base,
+                   exynos4210_clk_save, ARRAY_SIZE(exynos4210_clk_save),
+                   src_mask_suspend_e4210, ARRAY_SIZE(src_mask_suspend_e4210));
+       else
+               samsung_clk_sleep_init(reg_base, exynos4x12_clk_save,
+                                      ARRAY_SIZE(exynos4x12_clk_save));
 
        samsung_clk_of_add_provider(np, ctx);
 
index 347fd80c351b06211a34cfcf7fc934e35bb7483f..f14139bcb0c119f5a975dd7759ae62ab0791774f 100644 (file)
@@ -14,7 +14,6 @@
 #include <linux/clk-provider.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
-#include <linux/syscore_ops.h>
 
 #include "clk.h"
 #include "clk-cpu.h"
@@ -111,9 +110,6 @@ enum exynos5250_plls {
 
 static void __iomem *reg_base;
 
-#ifdef CONFIG_PM_SLEEP
-static struct samsung_clk_reg_dump *exynos5250_save;
-
 /*
  * list of controller registers to be saved and restored during a
  * suspend/resume cycle.
@@ -172,41 +168,6 @@ static const unsigned long exynos5250_clk_regs[] __initconst = {
        GATE_IP_ISP1,
 };
 
-static int exynos5250_clk_suspend(void)
-{
-       samsung_clk_save(reg_base, exynos5250_save,
-                               ARRAY_SIZE(exynos5250_clk_regs));
-
-       return 0;
-}
-
-static void exynos5250_clk_resume(void)
-{
-       samsung_clk_restore(reg_base, exynos5250_save,
-                               ARRAY_SIZE(exynos5250_clk_regs));
-}
-
-static struct syscore_ops exynos5250_clk_syscore_ops = {
-       .suspend = exynos5250_clk_suspend,
-       .resume = exynos5250_clk_resume,
-};
-
-static void __init exynos5250_clk_sleep_init(void)
-{
-       exynos5250_save = samsung_clk_alloc_reg_dump(exynos5250_clk_regs,
-                                       ARRAY_SIZE(exynos5250_clk_regs));
-       if (!exynos5250_save) {
-               pr_warn("%s: failed to allocate sleep save data, no sleep support!\n",
-                       __func__);
-               return;
-       }
-
-       register_syscore_ops(&exynos5250_clk_syscore_ops);
-}
-#else
-static void __init exynos5250_clk_sleep_init(void) {}
-#endif
-
 /* list of all parent clock list */
 PNAME(mout_apll_p)     = { "fin_pll", "fout_apll", };
 PNAME(mout_cpu_p)      = { "mout_apll", "mout_mpll", };
@@ -882,7 +843,8 @@ static void __init exynos5250_clk_init(struct device_node *np)
                PWR_CTRL2_CORE2_UP_RATIO | PWR_CTRL2_CORE1_UP_RATIO);
        __raw_writel(tmp, reg_base + PWR_CTRL2);
 
-       exynos5250_clk_sleep_init();
+       samsung_clk_sleep_init(reg_base, exynos5250_clk_regs,
+                              ARRAY_SIZE(exynos5250_clk_regs));
        exynos5_subcmus_init(ctx, 1, &exynos5250_disp_subcmu);
 
        samsung_clk_of_add_provider(np, ctx);
index 95e1bf69449b75c1812c095f2db2483deac91dae..34cce3c5898f5afe80d36ed89b7112f793111302 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/clk-provider.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
-#include <linux/syscore_ops.h>
 
 #include "clk.h"
 #include "clk-cpu.h"
@@ -156,10 +155,6 @@ enum exynos5x_plls {
 static void __iomem *reg_base;
 static enum exynos5x_soc exynos5x_soc;
 
-#ifdef CONFIG_PM_SLEEP
-static struct samsung_clk_reg_dump *exynos5x_save;
-static struct samsung_clk_reg_dump *exynos5800_save;
-
 /*
  * list of controller registers to be saved and restored during a
  * suspend/resume cycle.
@@ -281,68 +276,9 @@ static const struct samsung_clk_reg_dump exynos5420_set_clksrc[] = {
        { .offset = GATE_BUS_TOP,               .value = 0xffffffff, },
        { .offset = GATE_BUS_DISP1,             .value = 0xffffffff, },
        { .offset = GATE_IP_PERIC,              .value = 0xffffffff, },
+       { .offset = GATE_IP_PERIS,              .value = 0xffffffff, },
 };
 
-static int exynos5420_clk_suspend(void)
-{
-       samsung_clk_save(reg_base, exynos5x_save,
-                               ARRAY_SIZE(exynos5x_clk_regs));
-
-       if (exynos5x_soc == EXYNOS5800)
-               samsung_clk_save(reg_base, exynos5800_save,
-                               ARRAY_SIZE(exynos5800_clk_regs));
-
-       samsung_clk_restore(reg_base, exynos5420_set_clksrc,
-                               ARRAY_SIZE(exynos5420_set_clksrc));
-
-       return 0;
-}
-
-static void exynos5420_clk_resume(void)
-{
-       samsung_clk_restore(reg_base, exynos5x_save,
-                               ARRAY_SIZE(exynos5x_clk_regs));
-
-       if (exynos5x_soc == EXYNOS5800)
-               samsung_clk_restore(reg_base, exynos5800_save,
-                               ARRAY_SIZE(exynos5800_clk_regs));
-}
-
-static struct syscore_ops exynos5420_clk_syscore_ops = {
-       .suspend = exynos5420_clk_suspend,
-       .resume = exynos5420_clk_resume,
-};
-
-static void __init exynos5420_clk_sleep_init(void)
-{
-       exynos5x_save = samsung_clk_alloc_reg_dump(exynos5x_clk_regs,
-                                       ARRAY_SIZE(exynos5x_clk_regs));
-       if (!exynos5x_save) {
-               pr_warn("%s: failed to allocate sleep save data, no sleep support!\n",
-                       __func__);
-               return;
-       }
-
-       if (exynos5x_soc == EXYNOS5800) {
-               exynos5800_save =
-                       samsung_clk_alloc_reg_dump(exynos5800_clk_regs,
-                                       ARRAY_SIZE(exynos5800_clk_regs));
-               if (!exynos5800_save)
-                       goto err_soc;
-       }
-
-       register_syscore_ops(&exynos5420_clk_syscore_ops);
-       return;
-err_soc:
-       kfree(exynos5x_save);
-       pr_warn("%s: failed to allocate sleep save data, no sleep support!\n",
-               __func__);
-       return;
-}
-#else
-static void __init exynos5420_clk_sleep_init(void) {}
-#endif
-
 /* list of all parent clocks */
 PNAME(mout_mspll_cpu_p) = {"mout_sclk_cpll", "mout_sclk_dpll",
                                "mout_sclk_mpll", "mout_sclk_spll"};
@@ -633,6 +569,7 @@ static const struct samsung_div_clock exynos5420_div_clks[] __initconst = {
 };
 
 static const struct samsung_gate_clock exynos5420_gate_clks[] __initconst = {
+       GATE(CLK_SECKEY, "seckey", "aclk66_psgen", GATE_BUS_PERIS1, 1, 0, 0),
        GATE(CLK_MAU_EPLL, "mau_epll", "mout_mau_epll_clk",
                        SRC_MASK_TOP7, 20, CLK_SET_RATE_PARENT, 0),
 };
@@ -1162,8 +1099,6 @@ static const struct samsung_gate_clock exynos5x_gate_clks[] __initconst = {
        GATE(CLK_TMU, "tmu", "aclk66_psgen", GATE_IP_PERIS, 21, 0, 0),
        GATE(CLK_TMU_GPU, "tmu_gpu", "aclk66_psgen", GATE_IP_PERIS, 22, 0, 0),
 
-       GATE(CLK_SECKEY, "seckey", "aclk66_psgen", GATE_BUS_PERIS1, 1, 0, 0),
-
        /* GEN Block */
        GATE(CLK_ROTATOR, "rotator", "mout_user_aclk266", GATE_IP_GEN, 1, 0, 0),
        GATE(CLK_JPEG, "jpeg", "aclk300_jpeg", GATE_IP_GEN, 2, 0, 0),
@@ -1540,7 +1475,12 @@ static void __init exynos5x_clk_init(struct device_node *np,
                mout_kfc_p[0], mout_kfc_p[1], 0x28200,
                exynos5420_kfcclk_d, ARRAY_SIZE(exynos5420_kfcclk_d), 0);
 
-       exynos5420_clk_sleep_init();
+       samsung_clk_extended_sleep_init(reg_base,
+               exynos5x_clk_regs, ARRAY_SIZE(exynos5x_clk_regs),
+               exynos5420_set_clksrc, ARRAY_SIZE(exynos5420_set_clksrc));
+       if (soc == EXYNOS5800)
+               samsung_clk_sleep_init(reg_base, exynos5800_clk_regs,
+                                      ARRAY_SIZE(exynos5800_clk_regs));
        exynos5_subcmus_init(ctx, ARRAY_SIZE(exynos5x_subcmus),
                             exynos5x_subcmus);
 
index 162de44df099bff5be3a70e4fd5b010e1fc584f5..751e2c4fb65b64faa046c1be2abed06f825289a1 100644 (file)
@@ -177,6 +177,17 @@ static const unsigned long top_clk_regs[] __initconst = {
        ENABLE_CMU_TOP_DIV_STAT,
 };
 
+static const struct samsung_clk_reg_dump top_suspend_regs[] = {
+       /* force all aclk clocks enabled */
+       { ENABLE_ACLK_TOP, 0x67ecffed },
+       /* force all sclk_uart clocks enabled */
+       { ENABLE_SCLK_TOP_PERIC, 0x38 },
+       /* ISP PLL has to be enabled for suspend: reset value + ENABLE bit */
+       { ISP_PLL_CON0, 0x85cc0502 },
+       /* ISP PLL has to be enabled for suspend: reset value + ENABLE bit */
+       { AUD_PLL_CON0, 0x84830202 },
+};
+
 /* list of all parent clock list */
 PNAME(mout_aud_pll_p)          = { "oscclk", "fout_aud_pll", };
 PNAME(mout_isp_pll_p)          = { "oscclk", "fout_isp_pll", };
@@ -792,6 +803,8 @@ static const struct samsung_cmu_info top_cmu_info __initconst = {
        .nr_clk_ids             = TOP_NR_CLK,
        .clk_regs               = top_clk_regs,
        .nr_clk_regs            = ARRAY_SIZE(top_clk_regs),
+       .suspend_regs           = top_suspend_regs,
+       .nr_suspend_regs        = ARRAY_SIZE(top_suspend_regs),
 };
 
 static void __init exynos5433_cmu_top_init(struct device_node *np)
@@ -822,6 +835,13 @@ static const unsigned long cpif_clk_regs[] __initconst = {
        ENABLE_SCLK_CPIF,
 };
 
+static const struct samsung_clk_reg_dump cpif_suspend_regs[] = {
+       /* force all sclk clocks enabled */
+       { ENABLE_SCLK_CPIF, 0x3ff },
+       /* MPHY PLL has to be enabled for suspend: reset value + ENABLE bit */
+       { MPHY_PLL_CON0, 0x81c70601 },
+};
+
 /* list of all parent clock list */
 PNAME(mout_mphy_pll_p)         = { "oscclk", "fout_mphy_pll", };
 
@@ -862,6 +882,8 @@ static const struct samsung_cmu_info cpif_cmu_info __initconst = {
        .nr_clk_ids             = CPIF_NR_CLK,
        .clk_regs               = cpif_clk_regs,
        .nr_clk_regs            = ARRAY_SIZE(cpif_clk_regs),
+       .suspend_regs           = cpif_suspend_regs,
+       .nr_suspend_regs        = ARRAY_SIZE(cpif_suspend_regs),
 };
 
 static void __init exynos5433_cmu_cpif_init(struct device_node *np)
@@ -1547,6 +1569,13 @@ static const unsigned long peric_clk_regs[] __initconst = {
        ENABLE_IP_PERIC2,
 };
 
+static const struct samsung_clk_reg_dump peric_suspend_regs[] = {
+       /* pclk: sci, pmu, sysreg, gpio_{finger, ese, touch, nfc}, uart2-0 */
+       { ENABLE_PCLK_PERIC0, 0xe00ff000 },
+       /* sclk: uart2-0 */
+       { ENABLE_SCLK_PERIC, 0x7 },
+};
+
 static const struct samsung_div_clock peric_div_clks[] __initconst = {
        /* DIV_PERIC */
        DIV(CLK_DIV_SCLK_SCI, "div_sclk_sci", "oscclk", DIV_PERIC, 4, 4),
@@ -1705,6 +1734,8 @@ static const struct samsung_cmu_info peric_cmu_info __initconst = {
        .nr_clk_ids             = PERIC_NR_CLK,
        .clk_regs               = peric_clk_regs,
        .nr_clk_regs            = ARRAY_SIZE(peric_clk_regs),
+       .suspend_regs           = peric_suspend_regs,
+       .nr_suspend_regs        = ARRAY_SIZE(peric_suspend_regs),
 };
 
 static void __init exynos5433_cmu_peric_init(struct device_node *np)
@@ -5630,7 +5661,7 @@ static const struct of_device_id exynos5433_cmu_of_match[] = {
 static const struct dev_pm_ops exynos5433_cmu_pm_ops = {
        SET_RUNTIME_PM_OPS(exynos5433_cmu_suspend, exynos5433_cmu_resume,
                           NULL)
-       SET_LATE_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
+       SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
                                     pm_runtime_force_resume)
 };
 
index a9c88747505428cf30a71316da0e313b7bd415a3..8cb868f062577a79fee2d9ee817e3d6d0704ef25 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/clk-provider.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
-#include <linux/syscore_ops.h>
 
 #include <dt-bindings/clock/s3c2410.h>
 
@@ -40,9 +39,6 @@ enum s3c2410_plls {
 
 static void __iomem *reg_base;
 
-#ifdef CONFIG_PM_SLEEP
-static struct samsung_clk_reg_dump *s3c2410_save;
-
 /*
  * list of controller registers to be saved and restored during a
  * suspend/resume cycle.
@@ -57,42 +53,6 @@ static unsigned long s3c2410_clk_regs[] __initdata = {
        CAMDIVN,
 };
 
-static int s3c2410_clk_suspend(void)
-{
-       samsung_clk_save(reg_base, s3c2410_save,
-                               ARRAY_SIZE(s3c2410_clk_regs));
-
-       return 0;
-}
-
-static void s3c2410_clk_resume(void)
-{
-       samsung_clk_restore(reg_base, s3c2410_save,
-                               ARRAY_SIZE(s3c2410_clk_regs));
-}
-
-static struct syscore_ops s3c2410_clk_syscore_ops = {
-       .suspend = s3c2410_clk_suspend,
-       .resume = s3c2410_clk_resume,
-};
-
-static void __init s3c2410_clk_sleep_init(void)
-{
-       s3c2410_save = samsung_clk_alloc_reg_dump(s3c2410_clk_regs,
-                                               ARRAY_SIZE(s3c2410_clk_regs));
-       if (!s3c2410_save) {
-               pr_warn("%s: failed to allocate sleep save data, no sleep support!\n",
-                       __func__);
-               return;
-       }
-
-       register_syscore_ops(&s3c2410_clk_syscore_ops);
-       return;
-}
-#else
-static void __init s3c2410_clk_sleep_init(void) {}
-#endif
-
 PNAME(fclk_p) = { "mpll", "div_slow" };
 
 static struct samsung_mux_clock s3c2410_common_muxes[] __initdata = {
@@ -461,7 +421,8 @@ void __init s3c2410_common_clk_init(struct device_node *np, unsigned long xti_f,
                        ARRAY_SIZE(s3c244x_common_aliases));
        }
 
-       s3c2410_clk_sleep_init();
+       samsung_clk_sleep_init(reg_base, s3c2410_clk_regs,
+                              ARRAY_SIZE(s3c2410_clk_regs));
 
        samsung_clk_of_add_provider(np, ctx);
 }
index 6bc94d3aff78f58eef7469f41a4af54ab08aa41f..dd1159050a5a54c498396d947756fb8f239f2f32 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/clk-provider.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
-#include <linux/syscore_ops.h>
 #include <linux/reboot.h>
 
 #include <dt-bindings/clock/s3c2412.h>
@@ -29,9 +28,6 @@
 
 static void __iomem *reg_base;
 
-#ifdef CONFIG_PM_SLEEP
-static struct samsung_clk_reg_dump *s3c2412_save;
-
 /*
  * list of controller registers to be saved and restored during a
  * suspend/resume cycle.
@@ -45,42 +41,6 @@ static unsigned long s3c2412_clk_regs[] __initdata = {
        CLKSRC,
 };
 
-static int s3c2412_clk_suspend(void)
-{
-       samsung_clk_save(reg_base, s3c2412_save,
-                               ARRAY_SIZE(s3c2412_clk_regs));
-
-       return 0;
-}
-
-static void s3c2412_clk_resume(void)
-{
-       samsung_clk_restore(reg_base, s3c2412_save,
-                               ARRAY_SIZE(s3c2412_clk_regs));
-}
-
-static struct syscore_ops s3c2412_clk_syscore_ops = {
-       .suspend = s3c2412_clk_suspend,
-       .resume = s3c2412_clk_resume,
-};
-
-static void __init s3c2412_clk_sleep_init(void)
-{
-       s3c2412_save = samsung_clk_alloc_reg_dump(s3c2412_clk_regs,
-                                               ARRAY_SIZE(s3c2412_clk_regs));
-       if (!s3c2412_save) {
-               pr_warn("%s: failed to allocate sleep save data, no sleep support!\n",
-                       __func__);
-               return;
-       }
-
-       register_syscore_ops(&s3c2412_clk_syscore_ops);
-       return;
-}
-#else
-static void __init s3c2412_clk_sleep_init(void) {}
-#endif
-
 static struct clk_div_table divxti_d[] = {
        { .val = 0, .div = 1 },
        { .val = 1, .div = 2 },
@@ -278,7 +238,8 @@ void __init s3c2412_common_clk_init(struct device_node *np, unsigned long xti_f,
        samsung_clk_register_alias(ctx, s3c2412_aliases,
                                   ARRAY_SIZE(s3c2412_aliases));
 
-       s3c2412_clk_sleep_init();
+       samsung_clk_sleep_init(reg_base, s3c2412_clk_regs,
+                              ARRAY_SIZE(s3c2412_clk_regs));
 
        samsung_clk_of_add_provider(np, ctx);
 
index c46e6d5bc9bccbe6472a2c13b7ff52e01cc0e948..884067e4f1a15e4b8bfd5c2dd43ba086d10b10fa 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/clk-provider.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
-#include <linux/syscore_ops.h>
 #include <linux/reboot.h>
 
 #include <dt-bindings/clock/s3c2443.h>
@@ -43,9 +42,6 @@ enum supported_socs {
 
 static void __iomem *reg_base;
 
-#ifdef CONFIG_PM_SLEEP
-static struct samsung_clk_reg_dump *s3c2443_save;
-
 /*
  * list of controller registers to be saved and restored during a
  * suspend/resume cycle.
@@ -65,42 +61,6 @@ static unsigned long s3c2443_clk_regs[] __initdata = {
        SCLKCON,
 };
 
-static int s3c2443_clk_suspend(void)
-{
-       samsung_clk_save(reg_base, s3c2443_save,
-                               ARRAY_SIZE(s3c2443_clk_regs));
-
-       return 0;
-}
-
-static void s3c2443_clk_resume(void)
-{
-       samsung_clk_restore(reg_base, s3c2443_save,
-                               ARRAY_SIZE(s3c2443_clk_regs));
-}
-
-static struct syscore_ops s3c2443_clk_syscore_ops = {
-       .suspend = s3c2443_clk_suspend,
-       .resume = s3c2443_clk_resume,
-};
-
-static void __init s3c2443_clk_sleep_init(void)
-{
-       s3c2443_save = samsung_clk_alloc_reg_dump(s3c2443_clk_regs,
-                                               ARRAY_SIZE(s3c2443_clk_regs));
-       if (!s3c2443_save) {
-               pr_warn("%s: failed to allocate sleep save data, no sleep support!\n",
-                       __func__);
-               return;
-       }
-
-       register_syscore_ops(&s3c2443_clk_syscore_ops);
-       return;
-}
-#else
-static void __init s3c2443_clk_sleep_init(void) {}
-#endif
-
 PNAME(epllref_p) = { "mpllref", "mpllref", "xti", "ext" };
 PNAME(esysclk_p) = { "epllref", "epll" };
 PNAME(mpllref_p) = { "xti", "mdivclk" };
@@ -450,7 +410,8 @@ void __init s3c2443_common_clk_init(struct device_node *np, unsigned long xti_f,
                break;
        }
 
-       s3c2443_clk_sleep_init();
+       samsung_clk_sleep_init(reg_base, s3c2443_clk_regs,
+                              ARRAY_SIZE(s3c2443_clk_regs));
 
        samsung_clk_of_add_provider(np, ctx);
 
index 6db01cf5ab8364901905c68e584b6418c7cff509..54916c7bdb0672a6f1111292ae8e92e642528d4f 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/clk-provider.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
-#include <linux/syscore_ops.h>
 
 #include <dt-bindings/clock/samsung,s3c64xx-clock.h>
 
 static void __iomem *reg_base;
 static bool is_s3c6400;
 
-#ifdef CONFIG_PM_SLEEP
-static struct samsung_clk_reg_dump *s3c64xx_save_common;
-static struct samsung_clk_reg_dump *s3c64xx_save_soc;
-
 /*
  * List of controller registers to be saved and restored during
  * a suspend/resume cycle.
@@ -89,60 +84,6 @@ static unsigned long s3c6410_clk_regs[] __initdata = {
        MEM0_GATE,
 };
 
-static int s3c64xx_clk_suspend(void)
-{
-       samsung_clk_save(reg_base, s3c64xx_save_common,
-                               ARRAY_SIZE(s3c64xx_clk_regs));
-
-       if (!is_s3c6400)
-               samsung_clk_save(reg_base, s3c64xx_save_soc,
-                                       ARRAY_SIZE(s3c6410_clk_regs));
-
-       return 0;
-}
-
-static void s3c64xx_clk_resume(void)
-{
-       samsung_clk_restore(reg_base, s3c64xx_save_common,
-                               ARRAY_SIZE(s3c64xx_clk_regs));
-
-       if (!is_s3c6400)
-               samsung_clk_restore(reg_base, s3c64xx_save_soc,
-                                       ARRAY_SIZE(s3c6410_clk_regs));
-}
-
-static struct syscore_ops s3c64xx_clk_syscore_ops = {
-       .suspend = s3c64xx_clk_suspend,
-       .resume = s3c64xx_clk_resume,
-};
-
-static void __init s3c64xx_clk_sleep_init(void)
-{
-       s3c64xx_save_common = samsung_clk_alloc_reg_dump(s3c64xx_clk_regs,
-                                               ARRAY_SIZE(s3c64xx_clk_regs));
-       if (!s3c64xx_save_common)
-               goto err_warn;
-
-       if (!is_s3c6400) {
-               s3c64xx_save_soc = samsung_clk_alloc_reg_dump(s3c6410_clk_regs,
-                                               ARRAY_SIZE(s3c6410_clk_regs));
-               if (!s3c64xx_save_soc)
-                       goto err_soc;
-       }
-
-       register_syscore_ops(&s3c64xx_clk_syscore_ops);
-       return;
-
-err_soc:
-       kfree(s3c64xx_save_common);
-err_warn:
-       pr_warn("%s: failed to allocate sleep save data, no sleep support!\n",
-               __func__);
-}
-#else
-static void __init s3c64xx_clk_sleep_init(void) {}
-#endif
-
 /* List of parent clocks common for all S3C64xx SoCs. */
 PNAME(spi_mmc_p)       = { "mout_epll", "dout_mpll", "fin_pll", "clk27m" };
 PNAME(uart_p)          = { "mout_epll", "dout_mpll" };
@@ -508,7 +449,12 @@ void __init s3c64xx_clk_init(struct device_node *np, unsigned long xtal_f,
 
        samsung_clk_register_alias(ctx, s3c64xx_clock_aliases,
                                        ARRAY_SIZE(s3c64xx_clock_aliases));
-       s3c64xx_clk_sleep_init();
+
+       samsung_clk_sleep_init(reg_base, s3c64xx_clk_regs,
+                              ARRAY_SIZE(s3c64xx_clk_regs));
+       if (!is_s3c6400)
+               samsung_clk_sleep_init(reg_base, s3c6410_clk_regs,
+                                      ARRAY_SIZE(s3c6410_clk_regs));
 
        samsung_clk_of_add_provider(np, ctx);
 
index fd2725710a6fa968437e45a108555a7eb506dbc2..41d2337fe030c129396ec49b88b0f62b68e95850 100644 (file)
@@ -14,7 +14,6 @@
 #include <linux/clk-provider.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
-#include <linux/syscore_ops.h>
 
 #include "clk.h"
 #include "clk-pll.h"
@@ -83,9 +82,6 @@ enum {
 
 static void __iomem *reg_base;
 
-#ifdef CONFIG_PM_SLEEP
-static struct samsung_clk_reg_dump *s5pv210_clk_dump;
-
 /* List of registers that need to be preserved across suspend/resume. */
 static unsigned long s5pv210_clk_regs[] __initdata = {
        CLK_SRC0,
@@ -132,40 +128,6 @@ static unsigned long s5pv210_clk_regs[] __initdata = {
        CLK_OUT,
 };
 
-static int s5pv210_clk_suspend(void)
-{
-       samsung_clk_save(reg_base, s5pv210_clk_dump,
-                               ARRAY_SIZE(s5pv210_clk_regs));
-       return 0;
-}
-
-static void s5pv210_clk_resume(void)
-{
-       samsung_clk_restore(reg_base, s5pv210_clk_dump,
-                               ARRAY_SIZE(s5pv210_clk_regs));
-}
-
-static struct syscore_ops s5pv210_clk_syscore_ops = {
-       .suspend = s5pv210_clk_suspend,
-       .resume = s5pv210_clk_resume,
-};
-
-static void s5pv210_clk_sleep_init(void)
-{
-       s5pv210_clk_dump =
-               samsung_clk_alloc_reg_dump(s5pv210_clk_regs,
-                                          ARRAY_SIZE(s5pv210_clk_regs));
-       if (!s5pv210_clk_dump) {
-               pr_warn("%s: Failed to allocate sleep save data\n", __func__);
-               return;
-       }
-
-       register_syscore_ops(&s5pv210_clk_syscore_ops);
-}
-#else
-static inline void s5pv210_clk_sleep_init(void) { }
-#endif
-
 /* Mux parent lists. */
 static const char *const fin_pll_p[] __initconst = {
        "xxti",
@@ -822,7 +784,8 @@ static void __init __s5pv210_clk_init(struct device_node *np,
        samsung_clk_register_alias(ctx, s5pv210_aliases,
                                                ARRAY_SIZE(s5pv210_aliases));
 
-       s5pv210_clk_sleep_init();
+       samsung_clk_sleep_init(reg_base, s5pv210_clk_regs,
+                              ARRAY_SIZE(s5pv210_clk_regs));
 
        samsung_clk_of_add_provider(np, ctx);
 
index 8634884aa11ce421fb9a3485d6f1af2408bd5fd4..1f6e47cd327db413ec481ab5403c543b17797e56 100644 (file)
@@ -290,9 +290,12 @@ static int samsung_clk_suspend(void)
 {
        struct samsung_clock_reg_cache *reg_cache;
 
-       list_for_each_entry(reg_cache, &clock_reg_cache_list, node)
+       list_for_each_entry(reg_cache, &clock_reg_cache_list, node) {
                samsung_clk_save(reg_cache->reg_base, reg_cache->rdump,
                                reg_cache->rd_num);
+               samsung_clk_restore(reg_cache->reg_base, reg_cache->rsuspend,
+                               reg_cache->rsuspend_num);
+       }
        return 0;
 }
 
@@ -310,9 +313,11 @@ static struct syscore_ops samsung_clk_syscore_ops = {
        .resume = samsung_clk_resume,
 };
 
-void samsung_clk_sleep_init(void __iomem *reg_base,
+void samsung_clk_extended_sleep_init(void __iomem *reg_base,
                        const unsigned long *rdump,
-                       unsigned long nr_rdump)
+                       unsigned long nr_rdump,
+                       const struct samsung_clk_reg_dump *rsuspend,
+                       unsigned long nr_rsuspend)
 {
        struct samsung_clock_reg_cache *reg_cache;
 
@@ -330,13 +335,10 @@ void samsung_clk_sleep_init(void __iomem *reg_base,
 
        reg_cache->reg_base = reg_base;
        reg_cache->rd_num = nr_rdump;
+       reg_cache->rsuspend = rsuspend;
+       reg_cache->rsuspend_num = nr_rsuspend;
        list_add_tail(&reg_cache->node, &clock_reg_cache_list);
 }
-
-#else
-void samsung_clk_sleep_init(void __iomem *reg_base,
-                       const unsigned long *rdump,
-                       unsigned long nr_rdump) {}
 #endif
 
 /*
@@ -380,8 +382,9 @@ struct samsung_clk_provider * __init samsung_cmu_register_one(
                samsung_clk_register_fixed_factor(ctx, cmu->fixed_factor_clks,
                        cmu->nr_fixed_factor_clks);
        if (cmu->clk_regs)
-               samsung_clk_sleep_init(reg_base, cmu->clk_regs,
-                       cmu->nr_clk_regs);
+               samsung_clk_extended_sleep_init(reg_base,
+                       cmu->clk_regs, cmu->nr_clk_regs,
+                       cmu->suspend_regs, cmu->nr_suspend_regs);
 
        samsung_clk_of_add_provider(np, ctx);
 
index 3880d2f9d5829df357f0c4b9f9639bbfd171599d..c3f309d7100dd2313592edd2b6a398afd65b738b 100644 (file)
@@ -279,6 +279,8 @@ struct samsung_clock_reg_cache {
        void __iomem *reg_base;
        struct samsung_clk_reg_dump *rdump;
        unsigned int rd_num;
+       const struct samsung_clk_reg_dump *rsuspend;
+       unsigned int rsuspend_num;
 };
 
 struct samsung_cmu_info {
@@ -358,9 +360,21 @@ extern struct samsung_clk_provider __init *samsung_cmu_register_one(
 
 extern unsigned long _get_rate(const char *clk_name);
 
-extern void samsung_clk_sleep_init(void __iomem *reg_base,
+#ifdef CONFIG_PM_SLEEP
+extern void samsung_clk_extended_sleep_init(void __iomem *reg_base,
                        const unsigned long *rdump,
-                       unsigned long nr_rdump);
+                       unsigned long nr_rdump,
+                       const struct samsung_clk_reg_dump *rsuspend,
+                       unsigned long nr_rsuspend);
+#else
+static inline void samsung_clk_extended_sleep_init(void __iomem *reg_base,
+                       const unsigned long *rdump,
+                       unsigned long nr_rdump,
+                       const struct samsung_clk_reg_dump *rsuspend,
+                       unsigned long nr_rsuspend) {}
+#endif
+#define samsung_clk_sleep_init(reg_base, rdump, nr_rdump) \
+       samsung_clk_extended_sleep_init(reg_base, rdump, nr_rdump, NULL, 0)
 
 extern void samsung_clk_save(void __iomem *base,
                        struct samsung_clk_reg_dump *rd,
index a79d81985c4e0251a6049d5d09b89415d0354ba3..cfa000007622d63dc08d590594e03e390e037a01 100644 (file)
@@ -936,7 +936,7 @@ static void __init st_of_quadfs_setup(struct device_node *np,
        if (!clk_parent_name)
                return;
 
-       pll_name = kasprintf(GFP_KERNEL, "%s.pll", np->name);
+       pll_name = kasprintf(GFP_KERNEL, "%pOFn.pll", np);
        if (!pll_name)
                return;
 
index ee9c12cf3f08c38d6c1757a646c043b25f7dd90e..5f80eb0180142c4a9f1bde5e758a3bebe3aa36b5 100644 (file)
@@ -64,17 +64,19 @@ static SUNXI_CCU_NM_WITH_GATE_LOCK(pll_audio_base_clk, "pll-audio-base",
                                   BIT(28),     /* lock */
                                   CLK_SET_RATE_UNGATE);
 
-static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_video0_clk, "pll-video0",
-                                       "osc24M", 0x010,
-                                       8, 7,           /* N */
-                                       0, 4,           /* M */
-                                       BIT(24),        /* frac enable */
-                                       BIT(25),        /* frac select */
-                                       270000000,      /* frac rate 0 */
-                                       297000000,      /* frac rate 1 */
-                                       BIT(31),        /* gate */
-                                       BIT(28),        /* lock */
-                                       CLK_SET_RATE_UNGATE);
+static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX(pll_video0_clk, "pll-video0",
+                                               "osc24M", 0x010,
+                                               192000000,      /* Minimum rate */
+                                               1008000000,     /* Maximum rate */
+                                               8, 7,           /* N */
+                                               0, 4,           /* M */
+                                               BIT(24),        /* frac enable */
+                                               BIT(25),        /* frac select */
+                                               270000000,      /* frac rate 0 */
+                                               297000000,      /* frac rate 1 */
+                                               BIT(31),        /* gate */
+                                               BIT(28),        /* lock */
+                                               CLK_SET_RATE_UNGATE);
 
 static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve",
                                        "osc24M", 0x018,
@@ -125,17 +127,19 @@ static struct ccu_nk pll_periph1_clk = {
        },
 };
 
-static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_video1_clk, "pll-video1",
-                                       "osc24M", 0x030,
-                                       8, 7,           /* N */
-                                       0, 4,           /* M */
-                                       BIT(24),        /* frac enable */
-                                       BIT(25),        /* frac select */
-                                       270000000,      /* frac rate 0 */
-                                       297000000,      /* frac rate 1 */
-                                       BIT(31),        /* gate */
-                                       BIT(28),        /* lock */
-                                       CLK_SET_RATE_UNGATE);
+static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX(pll_video1_clk, "pll-video1",
+                                               "osc24M", 0x030,
+                                               192000000,      /* Minimum rate */
+                                               1008000000,     /* Maximum rate */
+                                               8, 7,           /* N */
+                                               0, 4,           /* M */
+                                               BIT(24),        /* frac enable */
+                                               BIT(25),        /* frac select */
+                                               270000000,      /* frac rate 0 */
+                                               297000000,      /* frac rate 1 */
+                                               BIT(31),        /* gate */
+                                               BIT(28),        /* lock */
+                                               CLK_SET_RATE_UNGATE);
 
 static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_gpu_clk, "pll-gpu",
                                        "osc24M", 0x038,
index 061b6fbb4f9591c0b77a54e8aa6a4ac0bb993e66..cd415b968e8c289582403bb8db97dd4c29b8b434 100644 (file)
@@ -27,7 +27,9 @@
 #define CLK_PLL_AUDIO_2X               4
 #define CLK_PLL_AUDIO_4X               5
 #define CLK_PLL_AUDIO_8X               6
-#define CLK_PLL_VIDEO0                 7
+
+/* PLL_VIDEO0 exported for HDMI PHY */
+
 #define CLK_PLL_VIDEO0_2X              8
 #define CLK_PLL_VE                     9
 #define CLK_PLL_DDR0                   10
index bdbfe78fe1333c944434c8f66b130923617dc671..2193e1495086eb7439fe8fe55bc663552cd350da 100644 (file)
@@ -224,7 +224,7 @@ static SUNXI_CCU_MP_WITH_MUX(psi_ahb1_ahb2_clk, "psi-ahb1-ahb2",
                             psi_ahb1_ahb2_parents,
                             0x510,
                             0, 5,      /* M */
-                            16, 2,     /* P */
+                            8, 2,      /* P */
                             24, 2,     /* mux */
                             0);
 
@@ -233,19 +233,19 @@ static const char * const ahb3_apb1_apb2_parents[] = { "osc24M", "osc32k",
                                                       "pll-periph0" };
 static SUNXI_CCU_MP_WITH_MUX(ahb3_clk, "ahb3", ahb3_apb1_apb2_parents, 0x51c,
                             0, 5,      /* M */
-                            16, 2,     /* P */
+                            8, 2,      /* P */
                             24, 2,     /* mux */
                             0);
 
 static SUNXI_CCU_MP_WITH_MUX(apb1_clk, "apb1", ahb3_apb1_apb2_parents, 0x520,
                             0, 5,      /* M */
-                            16, 2,     /* P */
+                            8, 2,      /* P */
                             24, 2,     /* mux */
                             0);
 
 static SUNXI_CCU_MP_WITH_MUX(apb2_clk, "apb2", ahb3_apb1_apb2_parents, 0x524,
                             0, 5,      /* M */
-                            16, 2,     /* P */
+                            8, 2,      /* P */
                             24, 2,     /* mux */
                             0);
 
@@ -352,7 +352,7 @@ static SUNXI_CCU_GATE(bus_dbg_clk, "bus-dbg", "psi-ahb1-ahb2",
 static SUNXI_CCU_GATE(bus_psi_clk, "bus-psi", "psi-ahb1-ahb2",
                      0x79c, BIT(0), 0);
 
-static SUNXI_CCU_GATE(bus_pwm_clk, "bus-pwm", "apb1", 0x79c, BIT(0), 0);
+static SUNXI_CCU_GATE(bus_pwm_clk, "bus-pwm", "apb1", 0x7ac, BIT(0), 0);
 
 static SUNXI_CCU_GATE(bus_iommu_clk, "bus-iommu", "apb1", 0x7bc, BIT(0), 0);
 
@@ -408,26 +408,29 @@ static SUNXI_CCU_GATE(bus_nand_clk, "bus-nand", "ahb3", 0x82c, BIT(0), 0);
 
 static const char * const mmc_parents[] = { "osc24M", "pll-periph0-2x",
                                            "pll-periph1-2x" };
-static SUNXI_CCU_MP_WITH_MUX_GATE(mmc0_clk, "mmc0", mmc_parents, 0x830,
-                                       0, 4,   /* M */
-                                       8, 2,   /* N */
-                                       24, 3,  /* mux */
-                                       BIT(31),/* gate */
-                                       0);
-
-static SUNXI_CCU_MP_WITH_MUX_GATE(mmc1_clk, "mmc1", mmc_parents, 0x834,
-                                       0, 4,   /* M */
-                                       8, 2,   /* N */
-                                       24, 3,  /* mux */
-                                       BIT(31),/* gate */
-                                       0);
-
-static SUNXI_CCU_MP_WITH_MUX_GATE(mmc2_clk, "mmc2", mmc_parents, 0x838,
-                                       0, 4,   /* M */
-                                       8, 2,   /* N */
-                                       24, 3,  /* mux */
-                                       BIT(31),/* gate */
-                                       0);
+static SUNXI_CCU_MP_WITH_MUX_GATE_POSTDIV(mmc0_clk, "mmc0", mmc_parents, 0x830,
+                                         0, 4,         /* M */
+                                         8, 2,         /* N */
+                                         24, 3,        /* mux */
+                                         BIT(31),      /* gate */
+                                         2,            /* post-div */
+                                         0);
+
+static SUNXI_CCU_MP_WITH_MUX_GATE_POSTDIV(mmc1_clk, "mmc1", mmc_parents, 0x834,
+                                         0, 4,         /* M */
+                                         8, 2,         /* N */
+                                         24, 3,        /* mux */
+                                         BIT(31),      /* gate */
+                                         2,            /* post-div */
+                                         0);
+
+static SUNXI_CCU_MP_WITH_MUX_GATE_POSTDIV(mmc2_clk, "mmc2", mmc_parents, 0x838,
+                                         0, 4,         /* M */
+                                         8, 2,         /* N */
+                                         24, 3,        /* mux */
+                                         BIT(31),      /* gate */
+                                         2,            /* post-div */
+                                         0);
 
 static SUNXI_CCU_GATE(bus_mmc0_clk, "bus-mmc0", "ahb3", 0x84c, BIT(0), 0);
 static SUNXI_CCU_GATE(bus_mmc1_clk, "bus-mmc1", "ahb3", 0x84c, BIT(1), 0);
index 7d08015b980d33e7f53b5a5d48ee18894896fe6c..2d6555d7317058c1b892bc91dbd75dfe0fe1df6e 100644 (file)
@@ -108,6 +108,7 @@ static struct ccu_nkmp pll_video0_clk = {
        .n              = _SUNXI_CCU_MULT_OFFSET_MIN_MAX(8, 8, 0, 12, 0),
        .m              = _SUNXI_CCU_DIV(16, 1), /* input divider */
        .p              = _SUNXI_CCU_DIV(0, 2), /* output divider */
+       .max_rate       = 3000000000UL,
        .common         = {
                .reg            = 0x010,
                .lock_reg       = CCU_SUN8I_A83T_LOCK_REG,
@@ -220,6 +221,7 @@ static struct ccu_nkmp pll_video1_clk = {
        .n              = _SUNXI_CCU_MULT_OFFSET_MIN_MAX(8, 8, 0, 12, 0),
        .m              = _SUNXI_CCU_DIV(16, 1), /* input divider */
        .p              = _SUNXI_CCU_DIV(0, 2), /* external divider p */
+       .max_rate       = 3000000000UL,
        .common         = {
                .reg            = 0x04c,
                .lock_reg       = CCU_SUN8I_A83T_LOCK_REG,
index 77ed0b0ba6819d94317e12f31ac25896143e2a77..eb5c608428fa4ba3aab6a4935449487bdfe8adbe 100644 (file)
@@ -69,18 +69,19 @@ static SUNXI_CCU_NM_WITH_SDM_GATE_LOCK(pll_audio_base_clk, "pll-audio-base",
                                       BIT(28), /* lock */
                                       CLK_SET_RATE_UNGATE);
 
-static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN(pll_video_clk, "pll-video",
-                                           "osc24M", 0x0010,
-                                           192000000,  /* Minimum rate */
-                                           8, 7,       /* N */
-                                           0, 4,       /* M */
-                                           BIT(24),    /* frac enable */
-                                           BIT(25),    /* frac select */
-                                           270000000,  /* frac rate 0 */
-                                           297000000,  /* frac rate 1 */
-                                           BIT(31),    /* gate */
-                                           BIT(28),    /* lock */
-                                           CLK_SET_RATE_UNGATE);
+static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX(pll_video_clk, "pll-video",
+                                               "osc24M", 0x0010,
+                                               192000000, /* Minimum rate */
+                                               912000000, /* Maximum rate */
+                                               8, 7,      /* N */
+                                               0, 4,      /* M */
+                                               BIT(24),   /* frac enable */
+                                               BIT(25),   /* frac select */
+                                               270000000, /* frac rate 0 */
+                                               297000000, /* frac rate 1 */
+                                               BIT(31),   /* gate */
+                                               BIT(28),   /* lock */
+                                               CLK_SET_RATE_UNGATE);
 
 static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve",
                                        "osc24M", 0x0018,
index 0f388f6944d52e7a1d221778414ada120dd78994..582ebd41d20d9bb8c795f864b73e6b3bd938f59f 100644 (file)
@@ -65,19 +65,19 @@ static SUNXI_CCU_NM_WITH_GATE_LOCK(pll_audio_base_clk, "pll-audio-base",
                                   BIT(28),     /* lock */
                                   CLK_SET_RATE_UNGATE);
 
-/* TODO: The result of N/M is required to be in [8, 25] range. */
-static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN(pll_video0_clk, "pll-video0",
-                                           "osc24M", 0x0010,
-                                           192000000,  /* Minimum rate */
-                                           8, 7,       /* N */
-                                           0, 4,       /* M */
-                                           BIT(24),    /* frac enable */
-                                           BIT(25),    /* frac select */
-                                           270000000,  /* frac rate 0 */
-                                           297000000,  /* frac rate 1 */
-                                           BIT(31),    /* gate */
-                                           BIT(28),    /* lock */
-                                           CLK_SET_RATE_UNGATE);
+static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX(pll_video0_clk, "pll-video0",
+                                               "osc24M", 0x0010,
+                                               192000000,  /* Minimum rate */
+                                               1008000000, /* Maximum rate */
+                                               8, 7,       /* N */
+                                               0, 4,       /* M */
+                                               BIT(24),    /* frac enable */
+                                               BIT(25),    /* frac select */
+                                               270000000,  /* frac rate 0 */
+                                               297000000,  /* frac rate 1 */
+                                               BIT(31),    /* gate */
+                                               BIT(28),    /* lock */
+                                               CLK_SET_RATE_UNGATE);
 
 /* TODO: The result of N/M is required to be in [8, 25] range. */
 static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_ve_clk, "pll-ve",
@@ -152,19 +152,19 @@ static struct ccu_nk pll_periph1_clk = {
        },
 };
 
-/* TODO: The result of N/M is required to be in [8, 25] range. */
-static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN(pll_video1_clk, "pll-video1",
-                                           "osc24M", 0x030,
-                                           192000000,  /* Minimum rate */
-                                           8, 7,       /* N */
-                                           0, 4,       /* M */
-                                           BIT(24),    /* frac enable */
-                                           BIT(25),    /* frac select */
-                                           270000000,  /* frac rate 0 */
-                                           297000000,  /* frac rate 1 */
-                                           BIT(31),    /* gate */
-                                           BIT(28),    /* lock */
-                                           CLK_SET_RATE_UNGATE);
+static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX(pll_video1_clk, "pll-video1",
+                                               "osc24M", 0x030,
+                                               192000000,  /* Minimum rate */
+                                               1008000000, /* Maximum rate */
+                                               8, 7,       /* N */
+                                               0, 4,       /* M */
+                                               BIT(24),    /* frac enable */
+                                               BIT(25),    /* frac select */
+                                               270000000,  /* frac rate 0 */
+                                               297000000,  /* frac rate 1 */
+                                               BIT(31),    /* gate */
+                                               BIT(28),    /* lock */
+                                               CLK_SET_RATE_UNGATE);
 
 static struct ccu_nkm pll_sata_clk = {
        .enable         = BIT(31),
index ebd9436d2c7cd382ed86a3bee1957a5db48b7530..9b49adb20d07c68ef8ddd01f8d35e73ed746f64f 100644 (file)
@@ -137,6 +137,13 @@ static long ccu_nkmp_round_rate(struct clk_hw *hw, unsigned long rate,
        if (nkmp->common.features & CCU_FEATURE_FIXED_POSTDIV)
                rate *= nkmp->fixed_post_div;
 
+       if (nkmp->max_rate && rate > nkmp->max_rate) {
+               rate = nkmp->max_rate;
+               if (nkmp->common.features & CCU_FEATURE_FIXED_POSTDIV)
+                       rate /= nkmp->fixed_post_div;
+               return rate;
+       }
+
        _nkmp.min_n = nkmp->n.min ?: 1;
        _nkmp.max_n = nkmp->n.max ?: 1 << nkmp->n.width;
        _nkmp.min_k = nkmp->k.min ?: 1;
index 6940503e7fc4665d36fd889e3ec25fa258a14f40..a9f8c116a7453b969019dfda27c4b340604e35dc 100644 (file)
@@ -35,6 +35,7 @@ struct ccu_nkmp {
        struct ccu_div_internal         p;
 
        unsigned int            fixed_post_div;
+       unsigned int            max_rate;
 
        struct ccu_common       common;
 };
index 4e2073307f34013e215fd827cc7048f6d4608bc6..6fe3c14f7b2dad94696afc14ab44ff213d78a093 100644 (file)
@@ -124,6 +124,13 @@ static long ccu_nm_round_rate(struct clk_hw *hw, unsigned long rate,
                return rate;
        }
 
+       if (nm->max_rate && rate > nm->max_rate) {
+               rate = nm->max_rate;
+               if (nm->common.features & CCU_FEATURE_FIXED_POSTDIV)
+                       rate /= nm->fixed_post_div;
+               return rate;
+       }
+
        if (ccu_frac_helper_has_rate(&nm->common, &nm->frac, rate)) {
                if (nm->common.features & CCU_FEATURE_FIXED_POSTDIV)
                        rate /= nm->fixed_post_div;
index 1d8b459c50b7c8d90e2085eeacc402c61989641c..de232f2199a6ba3982670001062571ad12e0fa83 100644 (file)
@@ -38,6 +38,7 @@ struct ccu_nm {
 
        unsigned int            fixed_post_div;
        unsigned int            min_rate;
+       unsigned int            max_rate;
 
        struct ccu_common       common;
 };
@@ -115,6 +116,35 @@ struct ccu_nm {
                },                                                      \
        }
 
+#define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX(_struct, _name,       \
+                                                _parent, _reg,         \
+                                                _min_rate, _max_rate,  \
+                                                _nshift, _nwidth,      \
+                                                _mshift, _mwidth,      \
+                                                _frac_en, _frac_sel,   \
+                                                _frac_rate_0,          \
+                                                _frac_rate_1,          \
+                                                _gate, _lock, _flags)  \
+       struct ccu_nm _struct = {                                       \
+               .enable         = _gate,                                \
+               .lock           = _lock,                                \
+               .n              = _SUNXI_CCU_MULT(_nshift, _nwidth),    \
+               .m              = _SUNXI_CCU_DIV(_mshift, _mwidth),     \
+               .frac           = _SUNXI_CCU_FRAC(_frac_en, _frac_sel,  \
+                                                 _frac_rate_0,         \
+                                                 _frac_rate_1),        \
+               .min_rate       = _min_rate,                            \
+               .max_rate       = _max_rate,                            \
+               .common         = {                                     \
+                       .reg            = _reg,                         \
+                       .features       = CCU_FEATURE_FRACTIONAL,       \
+                       .hw.init        = CLK_HW_INIT(_name,            \
+                                                     _parent,          \
+                                                     &ccu_nm_ops,      \
+                                                     _flags),          \
+               },                                                      \
+       }
+
 #define SUNXI_CCU_NM_WITH_GATE_LOCK(_struct, _name, _parent, _reg,     \
                                    _nshift, _nwidth,                   \
                                    _mshift, _mwidth,                   \
index a27c264cc9b4fb34f2b2d6d8748336ad102e4841..fc0278a1acc7ac6219617f499c11eca1c5c395a5 100644 (file)
@@ -140,8 +140,8 @@ static void __init sun9i_a80_mod0_setup(struct device_node *node)
 
        reg = of_io_request_and_map(node, 0, of_node_full_name(node));
        if (IS_ERR(reg)) {
-               pr_err("Could not get registers for mod0-clk: %s\n",
-                      node->name);
+               pr_err("Could not get registers for mod0-clk: %pOFn\n",
+                      node);
                return;
        }
 
@@ -306,7 +306,7 @@ static void __init sunxi_mmc_setup(struct device_node *node,
 
        reg = of_io_request_and_map(node, 0, of_node_full_name(node));
        if (IS_ERR(reg)) {
-               pr_err("Couldn't map the %s clock registers\n", node->name);
+               pr_err("Couldn't map the %pOFn clock registers\n", node);
                return;
        }
 
index e9295c286d5d9017a110010a5c2102778824b104..7e21b2b10c946f92b9996160ce7d046fd754d426 100644 (file)
@@ -88,8 +88,8 @@ static void __init sun9i_a80_pll4_setup(struct device_node *node)
 
        reg = of_io_request_and_map(node, 0, of_node_full_name(node));
        if (IS_ERR(reg)) {
-               pr_err("Could not get registers for a80-pll4-clk: %s\n",
-                      node->name);
+               pr_err("Could not get registers for a80-pll4-clk: %pOFn\n",
+                      node);
                return;
        }
 
@@ -142,8 +142,8 @@ static void __init sun9i_a80_gt_setup(struct device_node *node)
 
        reg = of_io_request_and_map(node, 0, of_node_full_name(node));
        if (IS_ERR(reg)) {
-               pr_err("Could not get registers for a80-gt-clk: %s\n",
-                      node->name);
+               pr_err("Could not get registers for a80-gt-clk: %pOFn\n",
+                      node);
                return;
        }
 
@@ -197,8 +197,8 @@ static void __init sun9i_a80_ahb_setup(struct device_node *node)
 
        reg = of_io_request_and_map(node, 0, of_node_full_name(node));
        if (IS_ERR(reg)) {
-               pr_err("Could not get registers for a80-ahb-clk: %s\n",
-                      node->name);
+               pr_err("Could not get registers for a80-ahb-clk: %pOFn\n",
+                      node);
                return;
        }
 
@@ -223,8 +223,8 @@ static void __init sun9i_a80_apb0_setup(struct device_node *node)
 
        reg = of_io_request_and_map(node, 0, of_node_full_name(node));
        if (IS_ERR(reg)) {
-               pr_err("Could not get registers for a80-apb0-clk: %s\n",
-                      node->name);
+               pr_err("Could not get registers for a80-apb0-clk: %pOFn\n",
+                      node);
                return;
        }
 
@@ -280,8 +280,8 @@ static void __init sun9i_a80_apb1_setup(struct device_node *node)
 
        reg = of_io_request_and_map(node, 0, of_node_full_name(node));
        if (IS_ERR(reg)) {
-               pr_err("Could not get registers for a80-apb1-clk: %s\n",
-                      node->name);
+               pr_err("Could not get registers for a80-apb1-clk: %pOFn\n",
+                      node);
                return;
        }
 
index 012714d94b429bcca04b277aed39983a140b08d0..892c29030b7b26772aa7a58b2598faab5c7bc94e 100644 (file)
@@ -568,8 +568,8 @@ static struct clk * __init sunxi_factors_clk_setup(struct device_node *node,
 
        reg = of_iomap(node, 0);
        if (!reg) {
-               pr_err("Could not get registers for factors-clk: %s\n",
-                      node->name);
+               pr_err("Could not get registers for factors-clk: %pOFn\n",
+                      node);
                return NULL;
        }
 
index 48ee43734e05117bec4d783431b7fc617daf3fb4..ebb0e1b6bf0156aacb7675dbfa5c694bfd14ea51 100644 (file)
@@ -1609,8 +1609,12 @@ int tegra_dfll_register(struct platform_device *pdev,
 
        td->vdd_reg = devm_regulator_get(td->dev, "vdd-cpu");
        if (IS_ERR(td->vdd_reg)) {
-               dev_err(td->dev, "couldn't get vdd_cpu regulator\n");
-               return PTR_ERR(td->vdd_reg);
+               ret = PTR_ERR(td->vdd_reg);
+               if (ret != -EPROBE_DEFER)
+                       dev_err(td->dev, "couldn't get vdd_cpu regulator: %d\n",
+                               ret);
+
+               return ret;
        }
 
        td->dvco_rst = devm_reset_control_get(td->dev, "dvco");
index 9eb1cb14fce11ca5dd0ddd725102a343712d3b24..88f1943bd2b507aec617c98fafa50c5746406730 100644 (file)
@@ -27,6 +27,7 @@
 #include <dt-bindings/clock/tegra210-car.h>
 #include <dt-bindings/reset/tegra210-car.h>
 #include <linux/iopoll.h>
+#include <linux/sizes.h>
 #include <soc/tegra/pmc.h>
 
 #include "clk.h"
@@ -2603,7 +2604,7 @@ static struct tegra210_domain_mbist_war tegra210_pg_mbist_war[] = {
        [TEGRA_POWERGATE_MPE] = {
                .handle_lvl2_ovr = tegra210_generic_mbist_war,
                .lvl2_offset = LVL2_CLK_GATE_OVRE,
-               .lvl2_mask = BIT(2),
+               .lvl2_mask = BIT(29),
        },
        [TEGRA_POWERGATE_SOR] = {
                .handle_lvl2_ovr = tegra210_generic_mbist_war,
@@ -2654,14 +2655,14 @@ static struct tegra210_domain_mbist_war tegra210_pg_mbist_war[] = {
                .num_clks = ARRAY_SIZE(nvdec_slcg_clkids),
                .clk_init_data = nvdec_slcg_clkids,
                .handle_lvl2_ovr = tegra210_generic_mbist_war,
-               .lvl2_offset = LVL2_CLK_GATE_OVRC,
+               .lvl2_offset = LVL2_CLK_GATE_OVRE,
                .lvl2_mask = BIT(9) | BIT(31),
        },
        [TEGRA_POWERGATE_NVJPG] = {
                .num_clks = ARRAY_SIZE(nvjpg_slcg_clkids),
                .clk_init_data = nvjpg_slcg_clkids,
                .handle_lvl2_ovr = tegra210_generic_mbist_war,
-               .lvl2_offset = LVL2_CLK_GATE_OVRC,
+               .lvl2_offset = LVL2_CLK_GATE_OVRE,
                .lvl2_mask = BIT(9) | BIT(31),
        },
        [TEGRA_POWERGATE_AUD] = {
index 5ab295d2a3cb6790ae4d4ca1be297c958299ca54..5ca1e39dd88a6ae5777299a88ba0ab56d4bb9e0a 100644 (file)
@@ -6,7 +6,8 @@ clk-common                              = dpll.o composite.o divider.o gate.o \
                                          fixed-factor.o mux.o apll.o \
                                          clkt_dpll.o clkt_iclk.o clkt_dflt.o \
                                          clkctrl.o
-obj-$(CONFIG_SOC_AM33XX)               += $(clk-common) clk-33xx.o dpll3xxx.o
+obj-$(CONFIG_SOC_AM33XX)               += $(clk-common) clk-33xx.o dpll3xxx.o \
+                                         clk-33xx-compat.o
 obj-$(CONFIG_SOC_TI81XX)               += $(clk-common) fapll.o clk-814x.o clk-816x.o
 obj-$(CONFIG_ARCH_OMAP2)               += $(clk-common) interface.o clk-2xxx.o
 obj-$(CONFIG_ARCH_OMAP3)               += $(clk-common) interface.o \
@@ -16,8 +17,10 @@ obj-$(CONFIG_ARCH_OMAP4)             += $(clk-common) clk-44xx.o \
 obj-$(CONFIG_SOC_OMAP5)                        += $(clk-common) clk-54xx.o \
                                           dpll3xxx.o dpll44xx.o
 obj-$(CONFIG_SOC_DRA7XX)               += $(clk-common) clk-7xx.o \
-                                          clk-dra7-atl.o dpll3xxx.o dpll44xx.o
-obj-$(CONFIG_SOC_AM43XX)               += $(clk-common) dpll3xxx.o clk-43xx.o
+                                          clk-dra7-atl.o dpll3xxx.o \
+                                          dpll44xx.o clk-7xx-compat.o
+obj-$(CONFIG_SOC_AM43XX)               += $(clk-common) dpll3xxx.o clk-43xx.o \
+                                          clk-43xx-compat.o
 
 endif  # CONFIG_ARCH_OMAP2PLUS
 
index 61c126a5d26ad88aacc4491c73f85248fe2d2f4f..222f68bc3f2ae5149d188ac683c36396750a7191 100644 (file)
@@ -143,8 +143,8 @@ static void __init omap_clk_register_apll(void *user,
 
        clk = of_clk_get(node, 0);
        if (IS_ERR(clk)) {
-               pr_debug("clk-ref for %s not ready, retry\n",
-                        node->name);
+               pr_debug("clk-ref for %pOFn not ready, retry\n",
+                        node);
                if (!ti_clk_retry_init(node, hw, omap_clk_register_apll))
                        return;
 
@@ -155,8 +155,8 @@ static void __init omap_clk_register_apll(void *user,
 
        clk = of_clk_get(node, 1);
        if (IS_ERR(clk)) {
-               pr_debug("clk-bypass for %s not ready, retry\n",
-                        node->name);
+               pr_debug("clk-bypass for %pOFn not ready, retry\n",
+                        node);
                if (!ti_clk_retry_init(node, hw, omap_clk_register_apll))
                        return;
 
@@ -202,7 +202,7 @@ static void __init of_dra7_apll_setup(struct device_node *node)
 
        init->num_parents = of_clk_get_parent_count(node);
        if (init->num_parents < 1) {
-               pr_err("dra7 apll %s must have parent(s)\n", node->name);
+               pr_err("dra7 apll %pOFn must have parent(s)\n", node);
                goto cleanup;
        }
 
@@ -366,7 +366,7 @@ static void __init of_omap2_apll_setup(struct device_node *node)
 
        init->num_parents = of_clk_get_parent_count(node);
        if (init->num_parents != 1) {
-               pr_err("%s must have one parent\n", node->name);
+               pr_err("%pOFn must have one parent\n", node);
                goto cleanup;
        }
 
@@ -374,13 +374,13 @@ static void __init of_omap2_apll_setup(struct device_node *node)
        init->parent_names = &parent_name;
 
        if (of_property_read_u32(node, "ti,clock-frequency", &val)) {
-               pr_err("%s missing clock-frequency\n", node->name);
+               pr_err("%pOFn missing clock-frequency\n", node);
                goto cleanup;
        }
        clk_hw->fixed_rate = val;
 
        if (of_property_read_u32(node, "ti,bit-shift", &val)) {
-               pr_err("%s missing bit-shift\n", node->name);
+               pr_err("%pOFn missing bit-shift\n", node);
                goto cleanup;
        }
 
@@ -389,7 +389,7 @@ static void __init of_omap2_apll_setup(struct device_node *node)
        ad->autoidle_mask = 0x3 << val;
 
        if (of_property_read_u32(node, "ti,idlest-shift", &val)) {
-               pr_err("%s missing idlest-shift\n", node->name);
+               pr_err("%pOFn missing idlest-shift\n", node);
                goto cleanup;
        }
 
diff --git a/drivers/clk/ti/clk-33xx-compat.c b/drivers/clk/ti/clk-33xx-compat.c
new file mode 100644 (file)
index 0000000..3e07f12
--- /dev/null
@@ -0,0 +1,218 @@
+/*
+ * AM33XX Clock init
+ *
+ * Copyright (C) 2013 Texas Instruments, Inc
+ *     Tero Kristo (t-kristo@ti.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation version 2.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/kernel.h>
+#include <linux/list.h>
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/clk/ti.h>
+#include <dt-bindings/clock/am3.h>
+
+#include "clock.h"
+
+static const char * const am3_gpio1_dbclk_parents[] __initconst = {
+       "l4_per_cm:clk:0138:0",
+       NULL,
+};
+
+static const struct omap_clkctrl_bit_data am3_gpio2_bit_data[] __initconst = {
+       { 18, TI_CLK_GATE, am3_gpio1_dbclk_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data am3_gpio3_bit_data[] __initconst = {
+       { 18, TI_CLK_GATE, am3_gpio1_dbclk_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data am3_gpio4_bit_data[] __initconst = {
+       { 18, TI_CLK_GATE, am3_gpio1_dbclk_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data am3_l4_per_clkctrl_regs[] __initconst = {
+       { AM3_CPGMAC0_CLKCTRL, NULL, CLKF_SW_SUP, "cpsw_125mhz_gclk", "cpsw_125mhz_clkdm" },
+       { AM3_LCDC_CLKCTRL, NULL, CLKF_SW_SUP | CLKF_SET_RATE_PARENT, "lcd_gclk", "lcdc_clkdm" },
+       { AM3_USB_OTG_HS_CLKCTRL, NULL, CLKF_SW_SUP, "usbotg_fck", "l3s_clkdm" },
+       { AM3_TPTC0_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
+       { AM3_EMIF_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_ddr_m2_div2_ck", "l3_clkdm" },
+       { AM3_OCMCRAM_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
+       { AM3_GPMC_CLKCTRL, NULL, CLKF_SW_SUP, "l3s_gclk", "l3s_clkdm" },
+       { AM3_MCASP0_CLKCTRL, NULL, CLKF_SW_SUP, "mcasp0_fck", "l3s_clkdm" },
+       { AM3_UART6_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM3_MMC1_CLKCTRL, NULL, CLKF_SW_SUP, "mmc_clk" },
+       { AM3_ELM_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM3_I2C3_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM3_I2C2_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM3_SPI0_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM3_SPI1_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM3_L4_LS_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM3_MCASP1_CLKCTRL, NULL, CLKF_SW_SUP, "mcasp1_fck", "l3s_clkdm" },
+       { AM3_UART2_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM3_UART3_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM3_UART4_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM3_UART5_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM3_TIMER7_CLKCTRL, NULL, CLKF_SW_SUP, "timer7_fck" },
+       { AM3_TIMER2_CLKCTRL, NULL, CLKF_SW_SUP, "timer2_fck" },
+       { AM3_TIMER3_CLKCTRL, NULL, CLKF_SW_SUP, "timer3_fck" },
+       { AM3_TIMER4_CLKCTRL, NULL, CLKF_SW_SUP, "timer4_fck" },
+       { AM3_RNG_CLKCTRL, NULL, CLKF_SW_SUP, "rng_fck" },
+       { AM3_AES_CLKCTRL, NULL, CLKF_SW_SUP, "aes0_fck", "l3_clkdm" },
+       { AM3_SHAM_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
+       { AM3_GPIO2_CLKCTRL, am3_gpio2_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM3_GPIO3_CLKCTRL, am3_gpio3_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM3_GPIO4_CLKCTRL, am3_gpio4_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM3_TPCC_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
+       { AM3_D_CAN0_CLKCTRL, NULL, CLKF_SW_SUP, "dcan0_fck" },
+       { AM3_D_CAN1_CLKCTRL, NULL, CLKF_SW_SUP, "dcan1_fck" },
+       { AM3_EPWMSS1_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM3_EPWMSS0_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM3_EPWMSS2_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM3_L3_INSTR_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
+       { AM3_L3_MAIN_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
+       { AM3_PRUSS_CLKCTRL, NULL, CLKF_SW_SUP, "pruss_ocp_gclk", "pruss_ocp_clkdm" },
+       { AM3_TIMER5_CLKCTRL, NULL, CLKF_SW_SUP, "timer5_fck" },
+       { AM3_TIMER6_CLKCTRL, NULL, CLKF_SW_SUP, "timer6_fck" },
+       { AM3_MMC2_CLKCTRL, NULL, CLKF_SW_SUP, "mmc_clk" },
+       { AM3_MMC3_CLKCTRL, NULL, CLKF_SW_SUP, "mmc_clk", "l3s_clkdm" },
+       { AM3_TPTC1_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
+       { AM3_TPTC2_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
+       { AM3_SPINLOCK_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM3_MAILBOX_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM3_L4_HS_CLKCTRL, NULL, CLKF_SW_SUP, "l4hs_gclk", "l4hs_clkdm" },
+       { AM3_OCPWP_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM3_CLKDIV32K_CLKCTRL, NULL, CLKF_SW_SUP, "clkdiv32k_ck", "clk_24mhz_clkdm" },
+       { 0 },
+};
+
+static const char * const am3_gpio0_dbclk_parents[] __initconst = {
+       "gpio0_dbclk_mux_ck",
+       NULL,
+};
+
+static const struct omap_clkctrl_bit_data am3_gpio1_bit_data[] __initconst = {
+       { 18, TI_CLK_GATE, am3_gpio0_dbclk_parents, NULL },
+       { 0 },
+};
+
+static const char * const am3_dbg_sysclk_ck_parents[] __initconst = {
+       "sys_clkin_ck",
+       NULL,
+};
+
+static const char * const am3_trace_pmd_clk_mux_ck_parents[] __initconst = {
+       "l4_wkup_cm:clk:0010:19",
+       "l4_wkup_cm:clk:0010:30",
+       NULL,
+};
+
+static const char * const am3_trace_clk_div_ck_parents[] __initconst = {
+       "l4_wkup_cm:clk:0010:20",
+       NULL,
+};
+
+static const struct omap_clkctrl_div_data am3_trace_clk_div_ck_data __initconst = {
+       .max_div = 64,
+       .flags = CLK_DIVIDER_POWER_OF_TWO,
+};
+
+static const char * const am3_stm_clk_div_ck_parents[] __initconst = {
+       "l4_wkup_cm:clk:0010:22",
+       NULL,
+};
+
+static const struct omap_clkctrl_div_data am3_stm_clk_div_ck_data __initconst = {
+       .max_div = 64,
+       .flags = CLK_DIVIDER_POWER_OF_TWO,
+};
+
+static const char * const am3_dbg_clka_ck_parents[] __initconst = {
+       "dpll_core_m4_ck",
+       NULL,
+};
+
+static const struct omap_clkctrl_bit_data am3_debugss_bit_data[] __initconst = {
+       { 19, TI_CLK_GATE, am3_dbg_sysclk_ck_parents, NULL },
+       { 20, TI_CLK_MUX, am3_trace_pmd_clk_mux_ck_parents, NULL },
+       { 22, TI_CLK_MUX, am3_trace_pmd_clk_mux_ck_parents, NULL },
+       { 24, TI_CLK_DIVIDER, am3_trace_clk_div_ck_parents, &am3_trace_clk_div_ck_data },
+       { 27, TI_CLK_DIVIDER, am3_stm_clk_div_ck_parents, &am3_stm_clk_div_ck_data },
+       { 30, TI_CLK_GATE, am3_dbg_clka_ck_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data am3_l4_wkup_clkctrl_regs[] __initconst = {
+       { AM3_CONTROL_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_core_m4_div2_ck" },
+       { AM3_GPIO1_CLKCTRL, am3_gpio1_bit_data, CLKF_SW_SUP, "dpll_core_m4_div2_ck" },
+       { AM3_L4_WKUP_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_core_m4_div2_ck" },
+       { AM3_DEBUGSS_CLKCTRL, am3_debugss_bit_data, CLKF_SW_SUP, "l4_wkup_cm:clk:0010:24", "l3_aon_clkdm" },
+       { AM3_WKUP_M3_CLKCTRL, NULL, CLKF_NO_IDLEST, "dpll_core_m4_div2_ck", "l4_wkup_aon_clkdm" },
+       { AM3_UART1_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_wkupdm_ck" },
+       { AM3_I2C1_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_wkupdm_ck" },
+       { AM3_ADC_TSC_CLKCTRL, NULL, CLKF_SW_SUP, "adc_tsc_fck" },
+       { AM3_SMARTREFLEX0_CLKCTRL, NULL, CLKF_SW_SUP, "smartreflex0_fck" },
+       { AM3_TIMER1_CLKCTRL, NULL, CLKF_SW_SUP, "timer1_fck" },
+       { AM3_SMARTREFLEX1_CLKCTRL, NULL, CLKF_SW_SUP, "smartreflex1_fck" },
+       { AM3_WD_TIMER2_CLKCTRL, NULL, CLKF_SW_SUP, "wdt1_fck" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data am3_mpu_clkctrl_regs[] __initconst = {
+       { AM3_MPU_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_mpu_m2_ck" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data am3_l4_rtc_clkctrl_regs[] __initconst = {
+       { AM3_RTC_CLKCTRL, NULL, CLKF_SW_SUP, "clk_32768_ck" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data am3_gfx_l3_clkctrl_regs[] __initconst = {
+       { AM3_GFX_CLKCTRL, NULL, CLKF_SW_SUP, "gfx_fck_div_ck" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data am3_l4_cefuse_clkctrl_regs[] __initconst = {
+       { AM3_CEFUSE_CLKCTRL, NULL, CLKF_SW_SUP, "sys_clkin_ck" },
+       { 0 },
+};
+
+const struct omap_clkctrl_data am3_clkctrl_compat_data[] __initconst = {
+       { 0x44e00014, am3_l4_per_clkctrl_regs },
+       { 0x44e00404, am3_l4_wkup_clkctrl_regs },
+       { 0x44e00604, am3_mpu_clkctrl_regs },
+       { 0x44e00800, am3_l4_rtc_clkctrl_regs },
+       { 0x44e00904, am3_gfx_l3_clkctrl_regs },
+       { 0x44e00a20, am3_l4_cefuse_clkctrl_regs },
+       { 0 },
+};
+
+struct ti_dt_clk am33xx_compat_clks[] = {
+       DT_CLK(NULL, "timer_32k_ck", "l4_per_cm:0138:0"),
+       DT_CLK(NULL, "timer_sys_ck", "sys_clkin_ck"),
+       DT_CLK(NULL, "clkdiv32k_ick", "l4_per_cm:0138:0"),
+       DT_CLK(NULL, "dbg_clka_ck", "l4_wkup_cm:0010:30"),
+       DT_CLK(NULL, "dbg_sysclk_ck", "l4_wkup_cm:0010:19"),
+       DT_CLK(NULL, "gpio0_dbclk", "l4_wkup_cm:0004:18"),
+       DT_CLK(NULL, "gpio1_dbclk", "l4_per_cm:0098:18"),
+       DT_CLK(NULL, "gpio2_dbclk", "l4_per_cm:009c:18"),
+       DT_CLK(NULL, "gpio3_dbclk", "l4_per_cm:00a0:18"),
+       DT_CLK(NULL, "stm_clk_div_ck", "l4_wkup_cm:0010:27"),
+       DT_CLK(NULL, "stm_pmd_clock_mux_ck", "l4_wkup_cm:0010:22"),
+       DT_CLK(NULL, "trace_clk_div_ck", "l4_wkup_cm:0010:24"),
+       DT_CLK(NULL, "trace_pmd_clk_mux_ck", "l4_wkup_cm:0010:20"),
+       { .node_name = NULL },
+};
index 12e0a2d1991124504c3ac9a0c5245b991b9921f4..a360d310955523161502d86c7240c2b7eb64c61f 100644 (file)
@@ -24,7 +24,7 @@
 #include "clock.h"
 
 static const char * const am3_gpio1_dbclk_parents[] __initconst = {
-       "l4_per_cm:clk:0138:0",
+       "clk-24mhz-clkctrl:0000:0",
        NULL,
 };
 
@@ -43,58 +43,86 @@ static const struct omap_clkctrl_bit_data am3_gpio4_bit_data[] __initconst = {
        { 0 },
 };
 
-static const struct omap_clkctrl_reg_data am3_l4_per_clkctrl_regs[] __initconst = {
-       { AM3_CPGMAC0_CLKCTRL, NULL, CLKF_SW_SUP, "cpsw_125mhz_gclk", "cpsw_125mhz_clkdm" },
-       { AM3_LCDC_CLKCTRL, NULL, CLKF_SW_SUP | CLKF_SET_RATE_PARENT, "lcd_gclk", "lcdc_clkdm" },
-       { AM3_USB_OTG_HS_CLKCTRL, NULL, CLKF_SW_SUP, "usbotg_fck", "l3s_clkdm" },
-       { AM3_TPTC0_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
-       { AM3_EMIF_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_ddr_m2_div2_ck", "l3_clkdm" },
-       { AM3_OCMCRAM_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
-       { AM3_GPMC_CLKCTRL, NULL, CLKF_SW_SUP, "l3s_gclk", "l3s_clkdm" },
-       { AM3_MCASP0_CLKCTRL, NULL, CLKF_SW_SUP, "mcasp0_fck", "l3s_clkdm" },
-       { AM3_UART6_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
-       { AM3_MMC1_CLKCTRL, NULL, CLKF_SW_SUP, "mmc_clk" },
-       { AM3_ELM_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM3_I2C3_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
-       { AM3_I2C2_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
-       { AM3_SPI0_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
-       { AM3_SPI1_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
-       { AM3_L4_LS_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM3_MCASP1_CLKCTRL, NULL, CLKF_SW_SUP, "mcasp1_fck", "l3s_clkdm" },
-       { AM3_UART2_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
-       { AM3_UART3_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
-       { AM3_UART4_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
-       { AM3_UART5_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
-       { AM3_TIMER7_CLKCTRL, NULL, CLKF_SW_SUP, "timer7_fck" },
-       { AM3_TIMER2_CLKCTRL, NULL, CLKF_SW_SUP, "timer2_fck" },
-       { AM3_TIMER3_CLKCTRL, NULL, CLKF_SW_SUP, "timer3_fck" },
-       { AM3_TIMER4_CLKCTRL, NULL, CLKF_SW_SUP, "timer4_fck" },
-       { AM3_RNG_CLKCTRL, NULL, CLKF_SW_SUP, "rng_fck" },
-       { AM3_AES_CLKCTRL, NULL, CLKF_SW_SUP, "aes0_fck", "l3_clkdm" },
-       { AM3_SHAM_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
-       { AM3_GPIO2_CLKCTRL, am3_gpio2_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM3_GPIO3_CLKCTRL, am3_gpio3_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM3_GPIO4_CLKCTRL, am3_gpio4_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM3_TPCC_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
-       { AM3_D_CAN0_CLKCTRL, NULL, CLKF_SW_SUP, "dcan0_fck" },
-       { AM3_D_CAN1_CLKCTRL, NULL, CLKF_SW_SUP, "dcan1_fck" },
-       { AM3_EPWMSS1_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM3_EPWMSS0_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM3_EPWMSS2_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM3_L3_INSTR_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
-       { AM3_L3_MAIN_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
-       { AM3_PRUSS_CLKCTRL, NULL, CLKF_SW_SUP, "pruss_ocp_gclk", "pruss_ocp_clkdm" },
-       { AM3_TIMER5_CLKCTRL, NULL, CLKF_SW_SUP, "timer5_fck" },
-       { AM3_TIMER6_CLKCTRL, NULL, CLKF_SW_SUP, "timer6_fck" },
-       { AM3_MMC2_CLKCTRL, NULL, CLKF_SW_SUP, "mmc_clk" },
-       { AM3_MMC3_CLKCTRL, NULL, CLKF_SW_SUP, "mmc_clk", "l3s_clkdm" },
-       { AM3_TPTC1_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
-       { AM3_TPTC2_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
-       { AM3_SPINLOCK_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM3_MAILBOX_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM3_L4_HS_CLKCTRL, NULL, CLKF_SW_SUP, "l4hs_gclk", "l4hs_clkdm" },
-       { AM3_OCPWP_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM3_CLKDIV32K_CLKCTRL, NULL, CLKF_SW_SUP, "clkdiv32k_ck", "clk_24mhz_clkdm" },
+static const struct omap_clkctrl_reg_data am3_l4ls_clkctrl_regs[] __initconst = {
+       { AM3_L4LS_UART6_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM3_L4LS_MMC1_CLKCTRL, NULL, CLKF_SW_SUP, "mmc_clk" },
+       { AM3_L4LS_ELM_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM3_L4LS_I2C3_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM3_L4LS_I2C2_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM3_L4LS_SPI0_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM3_L4LS_SPI1_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM3_L4LS_L4_LS_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM3_L4LS_UART2_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM3_L4LS_UART3_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM3_L4LS_UART4_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM3_L4LS_UART5_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM3_L4LS_TIMER7_CLKCTRL, NULL, CLKF_SW_SUP, "timer7_fck" },
+       { AM3_L4LS_TIMER2_CLKCTRL, NULL, CLKF_SW_SUP, "timer2_fck" },
+       { AM3_L4LS_TIMER3_CLKCTRL, NULL, CLKF_SW_SUP, "timer3_fck" },
+       { AM3_L4LS_TIMER4_CLKCTRL, NULL, CLKF_SW_SUP, "timer4_fck" },
+       { AM3_L4LS_RNG_CLKCTRL, NULL, CLKF_SW_SUP, "rng_fck" },
+       { AM3_L4LS_GPIO2_CLKCTRL, am3_gpio2_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM3_L4LS_GPIO3_CLKCTRL, am3_gpio3_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM3_L4LS_GPIO4_CLKCTRL, am3_gpio4_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM3_L4LS_D_CAN0_CLKCTRL, NULL, CLKF_SW_SUP, "dcan0_fck" },
+       { AM3_L4LS_D_CAN1_CLKCTRL, NULL, CLKF_SW_SUP, "dcan1_fck" },
+       { AM3_L4LS_EPWMSS1_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM3_L4LS_EPWMSS0_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM3_L4LS_EPWMSS2_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM3_L4LS_TIMER5_CLKCTRL, NULL, CLKF_SW_SUP, "timer5_fck" },
+       { AM3_L4LS_TIMER6_CLKCTRL, NULL, CLKF_SW_SUP, "timer6_fck" },
+       { AM3_L4LS_MMC2_CLKCTRL, NULL, CLKF_SW_SUP, "mmc_clk" },
+       { AM3_L4LS_SPINLOCK_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM3_L4LS_MAILBOX_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM3_L4LS_OCPWP_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data am3_l3s_clkctrl_regs[] __initconst = {
+       { AM3_L3S_USB_OTG_HS_CLKCTRL, NULL, CLKF_SW_SUP, "usbotg_fck" },
+       { AM3_L3S_GPMC_CLKCTRL, NULL, CLKF_SW_SUP, "l3s_gclk" },
+       { AM3_L3S_MCASP0_CLKCTRL, NULL, CLKF_SW_SUP, "mcasp0_fck" },
+       { AM3_L3S_MCASP1_CLKCTRL, NULL, CLKF_SW_SUP, "mcasp1_fck" },
+       { AM3_L3S_MMC3_CLKCTRL, NULL, CLKF_SW_SUP, "mmc_clk" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data am3_l3_clkctrl_regs[] __initconst = {
+       { AM3_L3_TPTC0_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
+       { AM3_L3_EMIF_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_ddr_m2_div2_ck" },
+       { AM3_L3_OCMCRAM_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
+       { AM3_L3_AES_CLKCTRL, NULL, CLKF_SW_SUP, "aes0_fck" },
+       { AM3_L3_SHAM_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
+       { AM3_L3_TPCC_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
+       { AM3_L3_L3_INSTR_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
+       { AM3_L3_L3_MAIN_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
+       { AM3_L3_TPTC1_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
+       { AM3_L3_TPTC2_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data am3_l4hs_clkctrl_regs[] __initconst = {
+       { AM3_L4HS_L4_HS_CLKCTRL, NULL, CLKF_SW_SUP, "l4hs_gclk" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data am3_pruss_ocp_clkctrl_regs[] __initconst = {
+       { AM3_PRUSS_OCP_PRUSS_CLKCTRL, NULL, CLKF_SW_SUP, "pruss_ocp_gclk" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data am3_cpsw_125mhz_clkctrl_regs[] __initconst = {
+       { AM3_CPSW_125MHZ_CPGMAC0_CLKCTRL, NULL, CLKF_SW_SUP, "cpsw_125mhz_gclk" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data am3_lcdc_clkctrl_regs[] __initconst = {
+       { AM3_LCDC_LCDC_CLKCTRL, NULL, CLKF_SW_SUP | CLKF_SET_RATE_PARENT, "lcd_gclk" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data am3_clk_24mhz_clkctrl_regs[] __initconst = {
+       { AM3_CLK_24MHZ_CLKDIV32K_CLKCTRL, NULL, CLKF_SW_SUP, "clkdiv32k_ck" },
        { 0 },
 };
 
@@ -108,19 +136,33 @@ static const struct omap_clkctrl_bit_data am3_gpio1_bit_data[] __initconst = {
        { 0 },
 };
 
+static const struct omap_clkctrl_reg_data am3_l4_wkup_clkctrl_regs[] __initconst = {
+       { AM3_L4_WKUP_CONTROL_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_core_m4_div2_ck" },
+       { AM3_L4_WKUP_GPIO1_CLKCTRL, am3_gpio1_bit_data, CLKF_SW_SUP, "dpll_core_m4_div2_ck" },
+       { AM3_L4_WKUP_L4_WKUP_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_core_m4_div2_ck" },
+       { AM3_L4_WKUP_UART1_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_wkupdm_ck" },
+       { AM3_L4_WKUP_I2C1_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_wkupdm_ck" },
+       { AM3_L4_WKUP_ADC_TSC_CLKCTRL, NULL, CLKF_SW_SUP, "adc_tsc_fck" },
+       { AM3_L4_WKUP_SMARTREFLEX0_CLKCTRL, NULL, CLKF_SW_SUP, "smartreflex0_fck" },
+       { AM3_L4_WKUP_TIMER1_CLKCTRL, NULL, CLKF_SW_SUP, "timer1_fck" },
+       { AM3_L4_WKUP_SMARTREFLEX1_CLKCTRL, NULL, CLKF_SW_SUP, "smartreflex1_fck" },
+       { AM3_L4_WKUP_WD_TIMER2_CLKCTRL, NULL, CLKF_SW_SUP, "wdt1_fck" },
+       { 0 },
+};
+
 static const char * const am3_dbg_sysclk_ck_parents[] __initconst = {
        "sys_clkin_ck",
        NULL,
 };
 
 static const char * const am3_trace_pmd_clk_mux_ck_parents[] __initconst = {
-       "l4_wkup_cm:clk:0010:19",
-       "l4_wkup_cm:clk:0010:30",
+       "l3-aon-clkctrl:0000:19",
+       "l3-aon-clkctrl:0000:30",
        NULL,
 };
 
 static const char * const am3_trace_clk_div_ck_parents[] __initconst = {
-       "l4_wkup_cm:clk:0010:20",
+       "l3-aon-clkctrl:0000:20",
        NULL,
 };
 
@@ -130,7 +172,7 @@ static const struct omap_clkctrl_div_data am3_trace_clk_div_ck_data __initconst
 };
 
 static const char * const am3_stm_clk_div_ck_parents[] __initconst = {
-       "l4_wkup_cm:clk:0010:22",
+       "l3-aon-clkctrl:0000:22",
        NULL,
 };
 
@@ -154,66 +196,69 @@ static const struct omap_clkctrl_bit_data am3_debugss_bit_data[] __initconst = {
        { 0 },
 };
 
-static const struct omap_clkctrl_reg_data am3_l4_wkup_clkctrl_regs[] __initconst = {
-       { AM3_CONTROL_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_core_m4_div2_ck" },
-       { AM3_GPIO1_CLKCTRL, am3_gpio1_bit_data, CLKF_SW_SUP, "dpll_core_m4_div2_ck" },
-       { AM3_L4_WKUP_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_core_m4_div2_ck" },
-       { AM3_DEBUGSS_CLKCTRL, am3_debugss_bit_data, CLKF_SW_SUP, "l4_wkup_cm:clk:0010:24", "l3_aon_clkdm" },
-       { AM3_WKUP_M3_CLKCTRL, NULL, CLKF_NO_IDLEST, "dpll_core_m4_div2_ck", "l4_wkup_aon_clkdm" },
-       { AM3_UART1_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_wkupdm_ck" },
-       { AM3_I2C1_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_wkupdm_ck" },
-       { AM3_ADC_TSC_CLKCTRL, NULL, CLKF_SW_SUP, "adc_tsc_fck" },
-       { AM3_SMARTREFLEX0_CLKCTRL, NULL, CLKF_SW_SUP, "smartreflex0_fck" },
-       { AM3_TIMER1_CLKCTRL, NULL, CLKF_SW_SUP, "timer1_fck" },
-       { AM3_SMARTREFLEX1_CLKCTRL, NULL, CLKF_SW_SUP, "smartreflex1_fck" },
-       { AM3_WD_TIMER2_CLKCTRL, NULL, CLKF_SW_SUP, "wdt1_fck" },
+static const struct omap_clkctrl_reg_data am3_l3_aon_clkctrl_regs[] __initconst = {
+       { AM3_L3_AON_DEBUGSS_CLKCTRL, am3_debugss_bit_data, CLKF_SW_SUP, "l3-aon-clkctrl:0000:24" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data am3_l4_wkup_aon_clkctrl_regs[] __initconst = {
+       { AM3_L4_WKUP_AON_WKUP_M3_CLKCTRL, NULL, CLKF_NO_IDLEST, "dpll_core_m4_div2_ck" },
        { 0 },
 };
 
 static const struct omap_clkctrl_reg_data am3_mpu_clkctrl_regs[] __initconst = {
-       { AM3_MPU_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_mpu_m2_ck" },
+       { AM3_MPU_MPU_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_mpu_m2_ck" },
        { 0 },
 };
 
 static const struct omap_clkctrl_reg_data am3_l4_rtc_clkctrl_regs[] __initconst = {
-       { AM3_RTC_CLKCTRL, NULL, CLKF_SW_SUP, "clk_32768_ck" },
+       { AM3_L4_RTC_RTC_CLKCTRL, NULL, CLKF_SW_SUP, "clk_32768_ck" },
        { 0 },
 };
 
 static const struct omap_clkctrl_reg_data am3_gfx_l3_clkctrl_regs[] __initconst = {
-       { AM3_GFX_CLKCTRL, NULL, CLKF_SW_SUP, "gfx_fck_div_ck" },
+       { AM3_GFX_L3_GFX_CLKCTRL, NULL, CLKF_SW_SUP, "gfx_fck_div_ck" },
        { 0 },
 };
 
 static const struct omap_clkctrl_reg_data am3_l4_cefuse_clkctrl_regs[] __initconst = {
-       { AM3_CEFUSE_CLKCTRL, NULL, CLKF_SW_SUP, "sys_clkin_ck" },
+       { AM3_L4_CEFUSE_CEFUSE_CLKCTRL, NULL, CLKF_SW_SUP, "sys_clkin_ck" },
        { 0 },
 };
 
 const struct omap_clkctrl_data am3_clkctrl_data[] __initconst = {
-       { 0x44e00014, am3_l4_per_clkctrl_regs },
-       { 0x44e00404, am3_l4_wkup_clkctrl_regs },
-       { 0x44e00604, am3_mpu_clkctrl_regs },
+       { 0x44e00038, am3_l4ls_clkctrl_regs },
+       { 0x44e0001c, am3_l3s_clkctrl_regs },
+       { 0x44e00024, am3_l3_clkctrl_regs },
+       { 0x44e00120, am3_l4hs_clkctrl_regs },
+       { 0x44e000e8, am3_pruss_ocp_clkctrl_regs },
+       { 0x44e00000, am3_cpsw_125mhz_clkctrl_regs },
+       { 0x44e00018, am3_lcdc_clkctrl_regs },
+       { 0x44e0014c, am3_clk_24mhz_clkctrl_regs },
+       { 0x44e00400, am3_l4_wkup_clkctrl_regs },
+       { 0x44e00414, am3_l3_aon_clkctrl_regs },
+       { 0x44e004b0, am3_l4_wkup_aon_clkctrl_regs },
+       { 0x44e00600, am3_mpu_clkctrl_regs },
        { 0x44e00800, am3_l4_rtc_clkctrl_regs },
-       { 0x44e00904, am3_gfx_l3_clkctrl_regs },
-       { 0x44e00a20, am3_l4_cefuse_clkctrl_regs },
+       { 0x44e00900, am3_gfx_l3_clkctrl_regs },
+       { 0x44e00a00, am3_l4_cefuse_clkctrl_regs },
        { 0 },
 };
 
 static struct ti_dt_clk am33xx_clks[] = {
-       DT_CLK(NULL, "timer_32k_ck", "l4_per_cm:0138:0"),
+       DT_CLK(NULL, "timer_32k_ck", "clk-24mhz-clkctrl:0000:0"),
        DT_CLK(NULL, "timer_sys_ck", "sys_clkin_ck"),
-       DT_CLK(NULL, "clkdiv32k_ick", "l4_per_cm:0138:0"),
-       DT_CLK(NULL, "dbg_clka_ck", "l4_wkup_cm:0010:30"),
-       DT_CLK(NULL, "dbg_sysclk_ck", "l4_wkup_cm:0010:19"),
-       DT_CLK(NULL, "gpio0_dbclk", "l4_wkup_cm:0004:18"),
-       DT_CLK(NULL, "gpio1_dbclk", "l4_per_cm:0098:18"),
-       DT_CLK(NULL, "gpio2_dbclk", "l4_per_cm:009c:18"),
-       DT_CLK(NULL, "gpio3_dbclk", "l4_per_cm:00a0:18"),
-       DT_CLK(NULL, "stm_clk_div_ck", "l4_wkup_cm:0010:27"),
-       DT_CLK(NULL, "stm_pmd_clock_mux_ck", "l4_wkup_cm:0010:22"),
-       DT_CLK(NULL, "trace_clk_div_ck", "l4_wkup_cm:0010:24"),
-       DT_CLK(NULL, "trace_pmd_clk_mux_ck", "l4_wkup_cm:0010:20"),
+       DT_CLK(NULL, "clkdiv32k_ick", "clk-24mhz-clkctrl:0000:0"),
+       DT_CLK(NULL, "dbg_clka_ck", "l3-aon-clkctrl:0000:30"),
+       DT_CLK(NULL, "dbg_sysclk_ck", "l3-aon-clkctrl:0000:19"),
+       DT_CLK(NULL, "gpio0_dbclk", "l4-wkup-clkctrl:0008:18"),
+       DT_CLK(NULL, "gpio1_dbclk", "l4ls-clkctrl:0074:18"),
+       DT_CLK(NULL, "gpio2_dbclk", "l4ls-clkctrl:0078:18"),
+       DT_CLK(NULL, "gpio3_dbclk", "l4ls-clkctrl:007c:18"),
+       DT_CLK(NULL, "stm_clk_div_ck", "l3-aon-clkctrl:0000:27"),
+       DT_CLK(NULL, "stm_pmd_clock_mux_ck", "l3-aon-clkctrl:0000:22"),
+       DT_CLK(NULL, "trace_clk_div_ck", "l3-aon-clkctrl:0000:24"),
+       DT_CLK(NULL, "trace_pmd_clk_mux_ck", "l3-aon-clkctrl:0000:20"),
        { .node_name = NULL },
 };
 
@@ -232,7 +277,10 @@ int __init am33xx_dt_clk_init(void)
 {
        struct clk *clk1, *clk2;
 
-       ti_dt_clocks_register(am33xx_clks);
+       if (ti_clk_get_features()->flags & TI_CLK_CLKCTRL_COMPAT)
+               ti_dt_clocks_register(am33xx_compat_clks);
+       else
+               ti_dt_clocks_register(am33xx_clks);
 
        omap2_clk_disable_autoidle_all();
 
diff --git a/drivers/clk/ti/clk-43xx-compat.c b/drivers/clk/ti/clk-43xx-compat.c
new file mode 100644 (file)
index 0000000..5130398
--- /dev/null
@@ -0,0 +1,225 @@
+/*
+ * AM43XX Clock init
+ *
+ * Copyright (C) 2013 Texas Instruments, Inc
+ *     Tero Kristo (t-kristo@ti.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation version 2.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/kernel.h>
+#include <linux/list.h>
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/clk/ti.h>
+#include <dt-bindings/clock/am4.h>
+
+#include "clock.h"
+
+static const char * const am4_synctimer_32kclk_parents[] __initconst = {
+       "mux_synctimer32k_ck",
+       NULL,
+};
+
+static const struct omap_clkctrl_bit_data am4_counter_32k_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, am4_synctimer_32kclk_parents, NULL },
+       { 0 },
+};
+
+static const char * const am4_gpio0_dbclk_parents[] __initconst = {
+       "gpio0_dbclk_mux_ck",
+       NULL,
+};
+
+static const struct omap_clkctrl_bit_data am4_gpio1_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, am4_gpio0_dbclk_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data am4_l4_wkup_clkctrl_regs[] __initconst = {
+       { AM4_ADC_TSC_CLKCTRL, NULL, CLKF_SW_SUP, "adc_tsc_fck", "l3s_tsc_clkdm" },
+       { AM4_L4_WKUP_CLKCTRL, NULL, CLKF_SW_SUP, "sys_clkin_ck", "l4_wkup_clkdm" },
+       { AM4_WKUP_M3_CLKCTRL, NULL, CLKF_NO_IDLEST, "sys_clkin_ck" },
+       { AM4_COUNTER_32K_CLKCTRL, am4_counter_32k_bit_data, CLKF_SW_SUP, "l4_wkup_cm:clk:0210:8" },
+       { AM4_TIMER1_CLKCTRL, NULL, CLKF_SW_SUP, "timer1_fck", "l4_wkup_clkdm" },
+       { AM4_WD_TIMER2_CLKCTRL, NULL, CLKF_SW_SUP, "wdt1_fck", "l4_wkup_clkdm" },
+       { AM4_I2C1_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_wkupdm_ck", "l4_wkup_clkdm" },
+       { AM4_UART1_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_wkupdm_ck", "l4_wkup_clkdm" },
+       { AM4_SMARTREFLEX0_CLKCTRL, NULL, CLKF_SW_SUP, "smartreflex0_fck", "l4_wkup_clkdm" },
+       { AM4_SMARTREFLEX1_CLKCTRL, NULL, CLKF_SW_SUP, "smartreflex1_fck", "l4_wkup_clkdm" },
+       { AM4_CONTROL_CLKCTRL, NULL, CLKF_SW_SUP, "sys_clkin_ck", "l4_wkup_clkdm" },
+       { AM4_GPIO1_CLKCTRL, am4_gpio1_bit_data, CLKF_SW_SUP, "sys_clkin_ck", "l4_wkup_clkdm" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data am4_mpu_clkctrl_regs[] __initconst = {
+       { AM4_MPU_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_mpu_m2_ck" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data am4_gfx_l3_clkctrl_regs[] __initconst = {
+       { AM4_GFX_CLKCTRL, NULL, CLKF_SW_SUP, "gfx_fck_div_ck" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data am4_l4_rtc_clkctrl_regs[] __initconst = {
+       { AM4_RTC_CLKCTRL, NULL, CLKF_SW_SUP, "clk_32768_ck" },
+       { 0 },
+};
+
+static const char * const am4_usb_otg_ss0_refclk960m_parents[] __initconst = {
+       "dpll_per_clkdcoldo",
+       NULL,
+};
+
+static const struct omap_clkctrl_bit_data am4_usb_otg_ss0_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, am4_usb_otg_ss0_refclk960m_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data am4_usb_otg_ss1_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, am4_usb_otg_ss0_refclk960m_parents, NULL },
+       { 0 },
+};
+
+static const char * const am4_gpio1_dbclk_parents[] __initconst = {
+       "clkdiv32k_ick",
+       NULL,
+};
+
+static const struct omap_clkctrl_bit_data am4_gpio2_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, am4_gpio1_dbclk_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data am4_gpio3_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, am4_gpio1_dbclk_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data am4_gpio4_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, am4_gpio1_dbclk_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data am4_gpio5_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, am4_gpio1_dbclk_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data am4_gpio6_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, am4_gpio1_dbclk_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data am4_l4_per_clkctrl_regs[] __initconst = {
+       { AM4_L3_MAIN_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
+       { AM4_AES_CLKCTRL, NULL, CLKF_SW_SUP, "aes0_fck", "l3_clkdm" },
+       { AM4_DES_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
+       { AM4_L3_INSTR_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
+       { AM4_OCMCRAM_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
+       { AM4_SHAM_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
+       { AM4_VPFE0_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3s_clkdm" },
+       { AM4_VPFE1_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3s_clkdm" },
+       { AM4_TPCC_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
+       { AM4_TPTC0_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
+       { AM4_TPTC1_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
+       { AM4_TPTC2_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
+       { AM4_L4_HS_CLKCTRL, NULL, CLKF_SW_SUP, "l4hs_gclk", "l3_clkdm" },
+       { AM4_GPMC_CLKCTRL, NULL, CLKF_SW_SUP, "l3s_gclk", "l3s_clkdm" },
+       { AM4_MCASP0_CLKCTRL, NULL, CLKF_SW_SUP, "mcasp0_fck", "l3s_clkdm" },
+       { AM4_MCASP1_CLKCTRL, NULL, CLKF_SW_SUP, "mcasp1_fck", "l3s_clkdm" },
+       { AM4_MMC3_CLKCTRL, NULL, CLKF_SW_SUP, "mmc_clk", "l3s_clkdm" },
+       { AM4_QSPI_CLKCTRL, NULL, CLKF_SW_SUP, "l3s_gclk", "l3s_clkdm" },
+       { AM4_USB_OTG_SS0_CLKCTRL, am4_usb_otg_ss0_bit_data, CLKF_SW_SUP, "l3s_gclk", "l3s_clkdm" },
+       { AM4_USB_OTG_SS1_CLKCTRL, am4_usb_otg_ss1_bit_data, CLKF_SW_SUP, "l3s_gclk", "l3s_clkdm" },
+       { AM4_PRUSS_CLKCTRL, NULL, CLKF_SW_SUP, "pruss_ocp_gclk", "pruss_ocp_clkdm" },
+       { AM4_L4_LS_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_D_CAN0_CLKCTRL, NULL, CLKF_SW_SUP, "dcan0_fck" },
+       { AM4_D_CAN1_CLKCTRL, NULL, CLKF_SW_SUP, "dcan1_fck" },
+       { AM4_EPWMSS0_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_EPWMSS1_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_EPWMSS2_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_EPWMSS3_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_EPWMSS4_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_EPWMSS5_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_ELM_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_GPIO2_CLKCTRL, am4_gpio2_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_GPIO3_CLKCTRL, am4_gpio3_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_GPIO4_CLKCTRL, am4_gpio4_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_GPIO5_CLKCTRL, am4_gpio5_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_GPIO6_CLKCTRL, am4_gpio6_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_HDQ1W_CLKCTRL, NULL, CLKF_SW_SUP, "func_12m_clk" },
+       { AM4_I2C2_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM4_I2C3_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM4_MAILBOX_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_MMC1_CLKCTRL, NULL, CLKF_SW_SUP, "mmc_clk" },
+       { AM4_MMC2_CLKCTRL, NULL, CLKF_SW_SUP, "mmc_clk" },
+       { AM4_RNG_CLKCTRL, NULL, CLKF_SW_SUP, "rng_fck" },
+       { AM4_SPI0_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM4_SPI1_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM4_SPI2_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM4_SPI3_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM4_SPI4_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM4_SPINLOCK_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_TIMER2_CLKCTRL, NULL, CLKF_SW_SUP, "timer2_fck" },
+       { AM4_TIMER3_CLKCTRL, NULL, CLKF_SW_SUP, "timer3_fck" },
+       { AM4_TIMER4_CLKCTRL, NULL, CLKF_SW_SUP, "timer4_fck" },
+       { AM4_TIMER5_CLKCTRL, NULL, CLKF_SW_SUP, "timer5_fck" },
+       { AM4_TIMER6_CLKCTRL, NULL, CLKF_SW_SUP, "timer6_fck" },
+       { AM4_TIMER7_CLKCTRL, NULL, CLKF_SW_SUP, "timer7_fck" },
+       { AM4_TIMER8_CLKCTRL, NULL, CLKF_SW_SUP, "timer8_fck" },
+       { AM4_TIMER9_CLKCTRL, NULL, CLKF_SW_SUP, "timer9_fck" },
+       { AM4_TIMER10_CLKCTRL, NULL, CLKF_SW_SUP, "timer10_fck" },
+       { AM4_TIMER11_CLKCTRL, NULL, CLKF_SW_SUP, "timer11_fck" },
+       { AM4_UART2_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM4_UART3_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM4_UART4_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM4_UART5_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM4_UART6_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM4_OCP2SCP0_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_OCP2SCP1_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_EMIF_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_ddr_m2_ck", "emif_clkdm" },
+       { AM4_DSS_CORE_CLKCTRL, NULL, CLKF_SW_SUP | CLKF_SET_RATE_PARENT, "disp_clk", "dss_clkdm" },
+       { AM4_CPGMAC0_CLKCTRL, NULL, CLKF_SW_SUP, "cpsw_125mhz_gclk", "cpsw_125mhz_clkdm" },
+       { 0 },
+};
+
+const struct omap_clkctrl_data am4_clkctrl_compat_data[] __initconst = {
+       { 0x44df2820, am4_l4_wkup_clkctrl_regs },
+       { 0x44df8320, am4_mpu_clkctrl_regs },
+       { 0x44df8420, am4_gfx_l3_clkctrl_regs },
+       { 0x44df8520, am4_l4_rtc_clkctrl_regs },
+       { 0x44df8820, am4_l4_per_clkctrl_regs },
+       { 0 },
+};
+
+const struct omap_clkctrl_data am438x_clkctrl_compat_data[] __initconst = {
+       { 0x44df2820, am4_l4_wkup_clkctrl_regs },
+       { 0x44df8320, am4_mpu_clkctrl_regs },
+       { 0x44df8420, am4_gfx_l3_clkctrl_regs },
+       { 0x44df8820, am4_l4_per_clkctrl_regs },
+       { 0 },
+};
+
+struct ti_dt_clk am43xx_compat_clks[] = {
+       DT_CLK(NULL, "timer_32k_ck", "clkdiv32k_ick"),
+       DT_CLK(NULL, "timer_sys_ck", "sys_clkin_ck"),
+       DT_CLK(NULL, "gpio0_dbclk", "l4_wkup_cm:0348:8"),
+       DT_CLK(NULL, "gpio1_dbclk", "l4_per_cm:0458:8"),
+       DT_CLK(NULL, "gpio2_dbclk", "l4_per_cm:0460:8"),
+       DT_CLK(NULL, "gpio3_dbclk", "l4_per_cm:0468:8"),
+       DT_CLK(NULL, "gpio4_dbclk", "l4_per_cm:0470:8"),
+       DT_CLK(NULL, "gpio5_dbclk", "l4_per_cm:0478:8"),
+       DT_CLK(NULL, "synctimer_32kclk", "l4_wkup_cm:0210:8"),
+       DT_CLK(NULL, "usb_otg_ss0_refclk960m", "l4_per_cm:0240:8"),
+       DT_CLK(NULL, "usb_otg_ss1_refclk960m", "l4_per_cm:0248:8"),
+       { .node_name = NULL },
+};
index 63c5ddb501876993f0584364f44ed56a28bc175d..2782d91838ac4368e49c8ea9421d01963dff1391 100644 (file)
 
 #include "clock.h"
 
+static const struct omap_clkctrl_reg_data am4_l3s_tsc_clkctrl_regs[] __initconst = {
+       { AM4_L3S_TSC_ADC_TSC_CLKCTRL, NULL, CLKF_SW_SUP, "adc_tsc_fck" },
+       { 0 },
+};
+
 static const char * const am4_synctimer_32kclk_parents[] __initconst = {
        "mux_synctimer32k_ck",
        NULL,
@@ -33,6 +38,12 @@ static const struct omap_clkctrl_bit_data am4_counter_32k_bit_data[] __initconst
        { 0 },
 };
 
+static const struct omap_clkctrl_reg_data am4_l4_wkup_aon_clkctrl_regs[] __initconst = {
+       { AM4_L4_WKUP_AON_WKUP_M3_CLKCTRL, NULL, CLKF_SW_SUP | CLKF_NO_IDLEST, "sys_clkin_ck" },
+       { AM4_L4_WKUP_AON_COUNTER_32K_CLKCTRL, am4_counter_32k_bit_data, CLKF_SW_SUP, "l4-wkup-aon-clkctrl:0008:8" },
+       { 0 },
+};
+
 static const char * const am4_gpio0_dbclk_parents[] __initconst = {
        "gpio0_dbclk_mux_ck",
        NULL,
@@ -44,33 +55,45 @@ static const struct omap_clkctrl_bit_data am4_gpio1_bit_data[] __initconst = {
 };
 
 static const struct omap_clkctrl_reg_data am4_l4_wkup_clkctrl_regs[] __initconst = {
-       { AM4_ADC_TSC_CLKCTRL, NULL, CLKF_SW_SUP, "adc_tsc_fck", "l3s_tsc_clkdm" },
-       { AM4_L4_WKUP_CLKCTRL, NULL, CLKF_SW_SUP, "sys_clkin_ck", "l4_wkup_clkdm" },
-       { AM4_WKUP_M3_CLKCTRL, NULL, CLKF_NO_IDLEST, "sys_clkin_ck" },
-       { AM4_COUNTER_32K_CLKCTRL, am4_counter_32k_bit_data, CLKF_SW_SUP, "l4_wkup_cm:clk:0210:8" },
-       { AM4_TIMER1_CLKCTRL, NULL, CLKF_SW_SUP, "timer1_fck", "l4_wkup_clkdm" },
-       { AM4_WD_TIMER2_CLKCTRL, NULL, CLKF_SW_SUP, "wdt1_fck", "l4_wkup_clkdm" },
-       { AM4_I2C1_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_wkupdm_ck", "l4_wkup_clkdm" },
-       { AM4_UART1_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_wkupdm_ck", "l4_wkup_clkdm" },
-       { AM4_SMARTREFLEX0_CLKCTRL, NULL, CLKF_SW_SUP, "smartreflex0_fck", "l4_wkup_clkdm" },
-       { AM4_SMARTREFLEX1_CLKCTRL, NULL, CLKF_SW_SUP, "smartreflex1_fck", "l4_wkup_clkdm" },
-       { AM4_CONTROL_CLKCTRL, NULL, CLKF_SW_SUP, "sys_clkin_ck", "l4_wkup_clkdm" },
-       { AM4_GPIO1_CLKCTRL, am4_gpio1_bit_data, CLKF_SW_SUP, "sys_clkin_ck", "l4_wkup_clkdm" },
+       { AM4_L4_WKUP_L4_WKUP_CLKCTRL, NULL, CLKF_SW_SUP, "sys_clkin_ck" },
+       { AM4_L4_WKUP_TIMER1_CLKCTRL, NULL, CLKF_SW_SUP, "timer1_fck" },
+       { AM4_L4_WKUP_WD_TIMER2_CLKCTRL, NULL, CLKF_SW_SUP, "wdt1_fck" },
+       { AM4_L4_WKUP_I2C1_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_wkupdm_ck" },
+       { AM4_L4_WKUP_UART1_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_wkupdm_ck" },
+       { AM4_L4_WKUP_SMARTREFLEX0_CLKCTRL, NULL, CLKF_SW_SUP, "smartreflex0_fck" },
+       { AM4_L4_WKUP_SMARTREFLEX1_CLKCTRL, NULL, CLKF_SW_SUP, "smartreflex1_fck" },
+       { AM4_L4_WKUP_CONTROL_CLKCTRL, NULL, CLKF_SW_SUP, "sys_clkin_ck" },
+       { AM4_L4_WKUP_GPIO1_CLKCTRL, am4_gpio1_bit_data, CLKF_SW_SUP, "sys_clkin_ck" },
        { 0 },
 };
 
 static const struct omap_clkctrl_reg_data am4_mpu_clkctrl_regs[] __initconst = {
-       { AM4_MPU_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_mpu_m2_ck" },
+       { AM4_MPU_MPU_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_mpu_m2_ck" },
        { 0 },
 };
 
 static const struct omap_clkctrl_reg_data am4_gfx_l3_clkctrl_regs[] __initconst = {
-       { AM4_GFX_CLKCTRL, NULL, CLKF_SW_SUP, "gfx_fck_div_ck" },
+       { AM4_GFX_L3_GFX_CLKCTRL, NULL, CLKF_SW_SUP, "gfx_fck_div_ck" },
        { 0 },
 };
 
 static const struct omap_clkctrl_reg_data am4_l4_rtc_clkctrl_regs[] __initconst = {
-       { AM4_RTC_CLKCTRL, NULL, CLKF_SW_SUP, "clk_32768_ck" },
+       { AM4_L4_RTC_RTC_CLKCTRL, NULL, CLKF_SW_SUP, "clk_32768_ck" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data am4_l3_clkctrl_regs[] __initconst = {
+       { AM4_L3_L3_MAIN_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
+       { AM4_L3_AES_CLKCTRL, NULL, CLKF_SW_SUP, "aes0_fck" },
+       { AM4_L3_DES_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
+       { AM4_L3_L3_INSTR_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
+       { AM4_L3_OCMCRAM_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
+       { AM4_L3_SHAM_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
+       { AM4_L3_TPCC_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
+       { AM4_L3_TPTC0_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
+       { AM4_L3_TPTC1_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
+       { AM4_L3_TPTC2_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
+       { AM4_L3_L4_HS_CLKCTRL, NULL, CLKF_SW_SUP, "l4hs_gclk" },
        { 0 },
 };
 
@@ -89,6 +112,24 @@ static const struct omap_clkctrl_bit_data am4_usb_otg_ss1_bit_data[] __initconst
        { 0 },
 };
 
+static const struct omap_clkctrl_reg_data am4_l3s_clkctrl_regs[] __initconst = {
+       { AM4_L3S_VPFE0_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
+       { AM4_L3S_VPFE1_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk" },
+       { AM4_L3S_GPMC_CLKCTRL, NULL, CLKF_SW_SUP, "l3s_gclk" },
+       { AM4_L3S_MCASP0_CLKCTRL, NULL, CLKF_SW_SUP, "mcasp0_fck" },
+       { AM4_L3S_MCASP1_CLKCTRL, NULL, CLKF_SW_SUP, "mcasp1_fck" },
+       { AM4_L3S_MMC3_CLKCTRL, NULL, CLKF_SW_SUP, "mmc_clk" },
+       { AM4_L3S_QSPI_CLKCTRL, NULL, CLKF_SW_SUP, "l3s_gclk" },
+       { AM4_L3S_USB_OTG_SS0_CLKCTRL, am4_usb_otg_ss0_bit_data, CLKF_SW_SUP, "l3s_gclk" },
+       { AM4_L3S_USB_OTG_SS1_CLKCTRL, am4_usb_otg_ss1_bit_data, CLKF_SW_SUP, "l3s_gclk" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data am4_pruss_ocp_clkctrl_regs[] __initconst = {
+       { AM4_PRUSS_OCP_PRUSS_CLKCTRL, NULL, CLKF_SW_SUP, "pruss_ocp_gclk" },
+       { 0 },
+};
+
 static const char * const am4_gpio1_dbclk_parents[] __initconst = {
        "clkdiv32k_ick",
        NULL,
@@ -119,108 +160,115 @@ static const struct omap_clkctrl_bit_data am4_gpio6_bit_data[] __initconst = {
        { 0 },
 };
 
-static const struct omap_clkctrl_reg_data am4_l4_per_clkctrl_regs[] __initconst = {
-       { AM4_L3_MAIN_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
-       { AM4_AES_CLKCTRL, NULL, CLKF_SW_SUP, "aes0_fck", "l3_clkdm" },
-       { AM4_DES_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
-       { AM4_L3_INSTR_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
-       { AM4_OCMCRAM_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
-       { AM4_SHAM_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
-       { AM4_VPFE0_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3s_clkdm" },
-       { AM4_VPFE1_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3s_clkdm" },
-       { AM4_TPCC_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
-       { AM4_TPTC0_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
-       { AM4_TPTC1_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
-       { AM4_TPTC2_CLKCTRL, NULL, CLKF_SW_SUP, "l3_gclk", "l3_clkdm" },
-       { AM4_L4_HS_CLKCTRL, NULL, CLKF_SW_SUP, "l4hs_gclk", "l3_clkdm" },
-       { AM4_GPMC_CLKCTRL, NULL, CLKF_SW_SUP, "l3s_gclk", "l3s_clkdm" },
-       { AM4_MCASP0_CLKCTRL, NULL, CLKF_SW_SUP, "mcasp0_fck", "l3s_clkdm" },
-       { AM4_MCASP1_CLKCTRL, NULL, CLKF_SW_SUP, "mcasp1_fck", "l3s_clkdm" },
-       { AM4_MMC3_CLKCTRL, NULL, CLKF_SW_SUP, "mmc_clk", "l3s_clkdm" },
-       { AM4_QSPI_CLKCTRL, NULL, CLKF_SW_SUP, "l3s_gclk", "l3s_clkdm" },
-       { AM4_USB_OTG_SS0_CLKCTRL, am4_usb_otg_ss0_bit_data, CLKF_SW_SUP, "l3s_gclk", "l3s_clkdm" },
-       { AM4_USB_OTG_SS1_CLKCTRL, am4_usb_otg_ss1_bit_data, CLKF_SW_SUP, "l3s_gclk", "l3s_clkdm" },
-       { AM4_PRUSS_CLKCTRL, NULL, CLKF_SW_SUP, "pruss_ocp_gclk", "pruss_ocp_clkdm" },
-       { AM4_L4_LS_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM4_D_CAN0_CLKCTRL, NULL, CLKF_SW_SUP, "dcan0_fck" },
-       { AM4_D_CAN1_CLKCTRL, NULL, CLKF_SW_SUP, "dcan1_fck" },
-       { AM4_EPWMSS0_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM4_EPWMSS1_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM4_EPWMSS2_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM4_EPWMSS3_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM4_EPWMSS4_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM4_EPWMSS5_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM4_ELM_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM4_GPIO2_CLKCTRL, am4_gpio2_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM4_GPIO3_CLKCTRL, am4_gpio3_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM4_GPIO4_CLKCTRL, am4_gpio4_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM4_GPIO5_CLKCTRL, am4_gpio5_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM4_GPIO6_CLKCTRL, am4_gpio6_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM4_HDQ1W_CLKCTRL, NULL, CLKF_SW_SUP, "func_12m_clk" },
-       { AM4_I2C2_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
-       { AM4_I2C3_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
-       { AM4_MAILBOX_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM4_MMC1_CLKCTRL, NULL, CLKF_SW_SUP, "mmc_clk" },
-       { AM4_MMC2_CLKCTRL, NULL, CLKF_SW_SUP, "mmc_clk" },
-       { AM4_RNG_CLKCTRL, NULL, CLKF_SW_SUP, "rng_fck" },
-       { AM4_SPI0_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
-       { AM4_SPI1_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
-       { AM4_SPI2_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
-       { AM4_SPI3_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
-       { AM4_SPI4_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
-       { AM4_SPINLOCK_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM4_TIMER2_CLKCTRL, NULL, CLKF_SW_SUP, "timer2_fck" },
-       { AM4_TIMER3_CLKCTRL, NULL, CLKF_SW_SUP, "timer3_fck" },
-       { AM4_TIMER4_CLKCTRL, NULL, CLKF_SW_SUP, "timer4_fck" },
-       { AM4_TIMER5_CLKCTRL, NULL, CLKF_SW_SUP, "timer5_fck" },
-       { AM4_TIMER6_CLKCTRL, NULL, CLKF_SW_SUP, "timer6_fck" },
-       { AM4_TIMER7_CLKCTRL, NULL, CLKF_SW_SUP, "timer7_fck" },
-       { AM4_TIMER8_CLKCTRL, NULL, CLKF_SW_SUP, "timer8_fck" },
-       { AM4_TIMER9_CLKCTRL, NULL, CLKF_SW_SUP, "timer9_fck" },
-       { AM4_TIMER10_CLKCTRL, NULL, CLKF_SW_SUP, "timer10_fck" },
-       { AM4_TIMER11_CLKCTRL, NULL, CLKF_SW_SUP, "timer11_fck" },
-       { AM4_UART2_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
-       { AM4_UART3_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
-       { AM4_UART4_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
-       { AM4_UART5_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
-       { AM4_UART6_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
-       { AM4_OCP2SCP0_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM4_OCP2SCP1_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
-       { AM4_EMIF_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_ddr_m2_ck", "emif_clkdm" },
-       { AM4_DSS_CORE_CLKCTRL, NULL, CLKF_SW_SUP | CLKF_SET_RATE_PARENT, "disp_clk", "dss_clkdm" },
-       { AM4_CPGMAC0_CLKCTRL, NULL, CLKF_SW_SUP, "cpsw_125mhz_gclk", "cpsw_125mhz_clkdm" },
+static const struct omap_clkctrl_reg_data am4_l4ls_clkctrl_regs[] __initconst = {
+       { AM4_L4LS_L4_LS_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_L4LS_D_CAN0_CLKCTRL, NULL, CLKF_SW_SUP, "dcan0_fck" },
+       { AM4_L4LS_D_CAN1_CLKCTRL, NULL, CLKF_SW_SUP, "dcan1_fck" },
+       { AM4_L4LS_EPWMSS0_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_L4LS_EPWMSS1_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_L4LS_EPWMSS2_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_L4LS_EPWMSS3_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_L4LS_EPWMSS4_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_L4LS_EPWMSS5_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_L4LS_ELM_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_L4LS_GPIO2_CLKCTRL, am4_gpio2_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_L4LS_GPIO3_CLKCTRL, am4_gpio3_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_L4LS_GPIO4_CLKCTRL, am4_gpio4_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_L4LS_GPIO5_CLKCTRL, am4_gpio5_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_L4LS_GPIO6_CLKCTRL, am4_gpio6_bit_data, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_L4LS_HDQ1W_CLKCTRL, NULL, CLKF_SW_SUP, "func_12m_clk" },
+       { AM4_L4LS_I2C2_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM4_L4LS_I2C3_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM4_L4LS_MAILBOX_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_L4LS_MMC1_CLKCTRL, NULL, CLKF_SW_SUP, "mmc_clk" },
+       { AM4_L4LS_MMC2_CLKCTRL, NULL, CLKF_SW_SUP, "mmc_clk" },
+       { AM4_L4LS_RNG_CLKCTRL, NULL, CLKF_SW_SUP, "rng_fck" },
+       { AM4_L4LS_SPI0_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM4_L4LS_SPI1_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM4_L4LS_SPI2_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM4_L4LS_SPI3_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM4_L4LS_SPI4_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM4_L4LS_SPINLOCK_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_L4LS_TIMER2_CLKCTRL, NULL, CLKF_SW_SUP, "timer2_fck" },
+       { AM4_L4LS_TIMER3_CLKCTRL, NULL, CLKF_SW_SUP, "timer3_fck" },
+       { AM4_L4LS_TIMER4_CLKCTRL, NULL, CLKF_SW_SUP, "timer4_fck" },
+       { AM4_L4LS_TIMER5_CLKCTRL, NULL, CLKF_SW_SUP, "timer5_fck" },
+       { AM4_L4LS_TIMER6_CLKCTRL, NULL, CLKF_SW_SUP, "timer6_fck" },
+       { AM4_L4LS_TIMER7_CLKCTRL, NULL, CLKF_SW_SUP, "timer7_fck" },
+       { AM4_L4LS_TIMER8_CLKCTRL, NULL, CLKF_SW_SUP, "timer8_fck" },
+       { AM4_L4LS_TIMER9_CLKCTRL, NULL, CLKF_SW_SUP, "timer9_fck" },
+       { AM4_L4LS_TIMER10_CLKCTRL, NULL, CLKF_SW_SUP, "timer10_fck" },
+       { AM4_L4LS_TIMER11_CLKCTRL, NULL, CLKF_SW_SUP, "timer11_fck" },
+       { AM4_L4LS_UART2_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM4_L4LS_UART3_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM4_L4LS_UART4_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM4_L4LS_UART5_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM4_L4LS_UART6_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_per_m2_div4_ck" },
+       { AM4_L4LS_OCP2SCP0_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { AM4_L4LS_OCP2SCP1_CLKCTRL, NULL, CLKF_SW_SUP, "l4ls_gclk" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data am4_emif_clkctrl_regs[] __initconst = {
+       { AM4_EMIF_EMIF_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_ddr_m2_ck" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data am4_dss_clkctrl_regs[] __initconst = {
+       { AM4_DSS_DSS_CORE_CLKCTRL, NULL, CLKF_SW_SUP | CLKF_SET_RATE_PARENT, "disp_clk" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data am4_cpsw_125mhz_clkctrl_regs[] __initconst = {
+       { AM4_CPSW_125MHZ_CPGMAC0_CLKCTRL, NULL, CLKF_SW_SUP, "cpsw_125mhz_gclk" },
        { 0 },
 };
 
 const struct omap_clkctrl_data am4_clkctrl_data[] __initconst = {
-       { 0x44df2820, am4_l4_wkup_clkctrl_regs },
+       { 0x44df2920, am4_l3s_tsc_clkctrl_regs },
+       { 0x44df2a28, am4_l4_wkup_aon_clkctrl_regs },
+       { 0x44df2a20, am4_l4_wkup_clkctrl_regs },
        { 0x44df8320, am4_mpu_clkctrl_regs },
        { 0x44df8420, am4_gfx_l3_clkctrl_regs },
        { 0x44df8520, am4_l4_rtc_clkctrl_regs },
-       { 0x44df8820, am4_l4_per_clkctrl_regs },
+       { 0x44df8820, am4_l3_clkctrl_regs },
+       { 0x44df8868, am4_l3s_clkctrl_regs },
+       { 0x44df8b20, am4_pruss_ocp_clkctrl_regs },
+       { 0x44df8c20, am4_l4ls_clkctrl_regs },
+       { 0x44df8f20, am4_emif_clkctrl_regs },
+       { 0x44df9220, am4_dss_clkctrl_regs },
+       { 0x44df9320, am4_cpsw_125mhz_clkctrl_regs },
        { 0 },
 };
 
 const struct omap_clkctrl_data am438x_clkctrl_data[] __initconst = {
-       { 0x44df2820, am4_l4_wkup_clkctrl_regs },
+       { 0x44df2920, am4_l3s_tsc_clkctrl_regs },
+       { 0x44df2a28, am4_l4_wkup_aon_clkctrl_regs },
+       { 0x44df2a20, am4_l4_wkup_clkctrl_regs },
        { 0x44df8320, am4_mpu_clkctrl_regs },
        { 0x44df8420, am4_gfx_l3_clkctrl_regs },
-       { 0x44df8820, am4_l4_per_clkctrl_regs },
+       { 0x44df8820, am4_l3_clkctrl_regs },
+       { 0x44df8868, am4_l3s_clkctrl_regs },
+       { 0x44df8b20, am4_pruss_ocp_clkctrl_regs },
+       { 0x44df8c20, am4_l4ls_clkctrl_regs },
+       { 0x44df8f20, am4_emif_clkctrl_regs },
+       { 0x44df9220, am4_dss_clkctrl_regs },
+       { 0x44df9320, am4_cpsw_125mhz_clkctrl_regs },
        { 0 },
 };
 
 static struct ti_dt_clk am43xx_clks[] = {
        DT_CLK(NULL, "timer_32k_ck", "clkdiv32k_ick"),
        DT_CLK(NULL, "timer_sys_ck", "sys_clkin_ck"),
-       DT_CLK(NULL, "gpio0_dbclk", "l4_wkup_cm:0348:8"),
-       DT_CLK(NULL, "gpio1_dbclk", "l4_per_cm:0458:8"),
-       DT_CLK(NULL, "gpio2_dbclk", "l4_per_cm:0460:8"),
-       DT_CLK(NULL, "gpio3_dbclk", "l4_per_cm:0468:8"),
-       DT_CLK(NULL, "gpio4_dbclk", "l4_per_cm:0470:8"),
-       DT_CLK(NULL, "gpio5_dbclk", "l4_per_cm:0478:8"),
-       DT_CLK(NULL, "synctimer_32kclk", "l4_wkup_cm:0210:8"),
-       DT_CLK(NULL, "usb_otg_ss0_refclk960m", "l4_per_cm:0240:8"),
-       DT_CLK(NULL, "usb_otg_ss1_refclk960m", "l4_per_cm:0248:8"),
+       DT_CLK(NULL, "gpio0_dbclk", "l4-wkup-clkctrl:0148:8"),
+       DT_CLK(NULL, "gpio1_dbclk", "l4ls-clkctrl:0058:8"),
+       DT_CLK(NULL, "gpio2_dbclk", "l4ls-clkctrl:0060:8"),
+       DT_CLK(NULL, "gpio3_dbclk", "l4ls-clkctrl:0068:8"),
+       DT_CLK(NULL, "gpio4_dbclk", "l4ls-clkctrl:0070:8"),
+       DT_CLK(NULL, "gpio5_dbclk", "l4ls-clkctrl:0078:8"),
+       DT_CLK(NULL, "synctimer_32kclk", "l4-wkup-aon-clkctrl:0008:8"),
+       DT_CLK(NULL, "usb_otg_ss0_refclk960m", "l3s-clkctrl:01f8:8"),
+       DT_CLK(NULL, "usb_otg_ss1_refclk960m", "l3s-clkctrl:0200:8"),
        { .node_name = NULL },
 };
 
@@ -228,7 +276,10 @@ int __init am43xx_dt_clk_init(void)
 {
        struct clk *clk1, *clk2;
 
-       ti_dt_clocks_register(am43xx_clks);
+       if (ti_clk_get_features()->flags & TI_CLK_CLKCTRL_COMPAT)
+               ti_dt_clocks_register(am43xx_compat_clks);
+       else
+               ti_dt_clocks_register(am43xx_clks);
 
        omap2_clk_disable_autoidle_all();
 
diff --git a/drivers/clk/ti/clk-7xx-compat.c b/drivers/clk/ti/clk-7xx-compat.c
new file mode 100644 (file)
index 0000000..e3cb7f0
--- /dev/null
@@ -0,0 +1,823 @@
+/*
+ * DRA7 Clock init
+ *
+ * Copyright (C) 2013 Texas Instruments, Inc.
+ *
+ * Tero Kristo (t-kristo@ti.com)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/kernel.h>
+#include <linux/list.h>
+#include <linux/clk.h>
+#include <linux/clkdev.h>
+#include <linux/clk/ti.h>
+#include <dt-bindings/clock/dra7.h>
+
+#include "clock.h"
+
+#define DRA7_DPLL_GMAC_DEFFREQ                         1000000000
+#define DRA7_DPLL_USB_DEFFREQ                          960000000
+
+static const struct omap_clkctrl_reg_data dra7_mpu_clkctrl_regs[] __initconst = {
+       { DRA7_MPU_CLKCTRL, NULL, 0, "dpll_mpu_m2_ck" },
+       { 0 },
+};
+
+static const char * const dra7_mcasp1_aux_gfclk_mux_parents[] __initconst = {
+       "per_abe_x1_gfclk2_div",
+       "video1_clk2_div",
+       "video2_clk2_div",
+       "hdmi_clk2_div",
+       NULL,
+};
+
+static const char * const dra7_mcasp1_ahclkx_mux_parents[] __initconst = {
+       "abe_24m_fclk",
+       "abe_sys_clk_div",
+       "func_24m_clk",
+       "atl_clkin3_ck",
+       "atl_clkin2_ck",
+       "atl_clkin1_ck",
+       "atl_clkin0_ck",
+       "sys_clkin2",
+       "ref_clkin0_ck",
+       "ref_clkin1_ck",
+       "ref_clkin2_ck",
+       "ref_clkin3_ck",
+       "mlb_clk",
+       "mlbp_clk",
+       NULL,
+};
+
+static const struct omap_clkctrl_bit_data dra7_mcasp1_bit_data[] __initconst = {
+       { 22, TI_CLK_MUX, dra7_mcasp1_aux_gfclk_mux_parents, NULL },
+       { 24, TI_CLK_MUX, dra7_mcasp1_ahclkx_mux_parents, NULL },
+       { 28, TI_CLK_MUX, dra7_mcasp1_ahclkx_mux_parents, NULL },
+       { 0 },
+};
+
+static const char * const dra7_timer5_gfclk_mux_parents[] __initconst = {
+       "timer_sys_clk_div",
+       "sys_32k_ck",
+       "sys_clkin2",
+       "ref_clkin0_ck",
+       "ref_clkin1_ck",
+       "ref_clkin2_ck",
+       "ref_clkin3_ck",
+       "abe_giclk_div",
+       "video1_div_clk",
+       "video2_div_clk",
+       "hdmi_div_clk",
+       "clkoutmux0_clk_mux",
+       NULL,
+};
+
+static const struct omap_clkctrl_bit_data dra7_timer5_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_timer5_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_timer6_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_timer5_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_timer7_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_timer5_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_timer8_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_timer5_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const char * const dra7_uart6_gfclk_mux_parents[] __initconst = {
+       "func_48m_fclk",
+       "dpll_per_m2x2_ck",
+       NULL,
+};
+
+static const struct omap_clkctrl_bit_data dra7_uart6_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_uart6_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data dra7_ipu_clkctrl_regs[] __initconst = {
+       { DRA7_MCASP1_CLKCTRL, dra7_mcasp1_bit_data, CLKF_SW_SUP, "ipu_cm:clk:0010:22" },
+       { DRA7_TIMER5_CLKCTRL, dra7_timer5_bit_data, CLKF_SW_SUP, "ipu_cm:clk:0018:24" },
+       { DRA7_TIMER6_CLKCTRL, dra7_timer6_bit_data, CLKF_SW_SUP, "ipu_cm:clk:0020:24" },
+       { DRA7_TIMER7_CLKCTRL, dra7_timer7_bit_data, CLKF_SW_SUP, "ipu_cm:clk:0028:24" },
+       { DRA7_TIMER8_CLKCTRL, dra7_timer8_bit_data, CLKF_SW_SUP, "ipu_cm:clk:0030:24" },
+       { DRA7_I2C5_CLKCTRL, NULL, CLKF_SW_SUP, "func_96m_fclk" },
+       { DRA7_UART6_CLKCTRL, dra7_uart6_bit_data, CLKF_SW_SUP, "ipu_cm:clk:0040:24" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data dra7_rtc_clkctrl_regs[] __initconst = {
+       { DRA7_RTCSS_CLKCTRL, NULL, CLKF_SW_SUP, "sys_32k_ck" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data dra7_coreaon_clkctrl_regs[] __initconst = {
+       { DRA7_SMARTREFLEX_MPU_CLKCTRL, NULL, CLKF_SW_SUP, "wkupaon_iclk_mux" },
+       { DRA7_SMARTREFLEX_CORE_CLKCTRL, NULL, CLKF_SW_SUP, "wkupaon_iclk_mux" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data dra7_l3main1_clkctrl_regs[] __initconst = {
+       { DRA7_L3_MAIN_1_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_GPMC_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_TPCC_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_TPTC0_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_TPTC1_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_VCP1_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_VCP2_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data dra7_dma_clkctrl_regs[] __initconst = {
+       { DRA7_DMA_SYSTEM_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data dra7_emif_clkctrl_regs[] __initconst = {
+       { DRA7_DMM_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { 0 },
+};
+
+static const char * const dra7_atl_dpll_clk_mux_parents[] __initconst = {
+       "sys_32k_ck",
+       "video1_clkin_ck",
+       "video2_clkin_ck",
+       "hdmi_clkin_ck",
+       NULL,
+};
+
+static const char * const dra7_atl_gfclk_mux_parents[] __initconst = {
+       "l3_iclk_div",
+       "dpll_abe_m2_ck",
+       "atl_cm:clk:0000:24",
+       NULL,
+};
+
+static const struct omap_clkctrl_bit_data dra7_atl_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_atl_dpll_clk_mux_parents, NULL },
+       { 26, TI_CLK_MUX, dra7_atl_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data dra7_atl_clkctrl_regs[] __initconst = {
+       { DRA7_ATL_CLKCTRL, dra7_atl_bit_data, CLKF_SW_SUP, "atl_cm:clk:0000:26" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data dra7_l4cfg_clkctrl_regs[] __initconst = {
+       { DRA7_L4_CFG_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_SPINLOCK_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_MAILBOX1_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_MAILBOX2_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_MAILBOX3_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_MAILBOX4_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_MAILBOX5_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_MAILBOX6_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_MAILBOX7_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_MAILBOX8_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_MAILBOX9_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_MAILBOX10_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_MAILBOX11_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_MAILBOX12_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_MAILBOX13_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data dra7_l3instr_clkctrl_regs[] __initconst = {
+       { DRA7_L3_MAIN_2_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_L3_INSTR_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div" },
+       { 0 },
+};
+
+static const char * const dra7_dss_dss_clk_parents[] __initconst = {
+       "dpll_per_h12x2_ck",
+       NULL,
+};
+
+static const char * const dra7_dss_48mhz_clk_parents[] __initconst = {
+       "func_48m_fclk",
+       NULL,
+};
+
+static const char * const dra7_dss_hdmi_clk_parents[] __initconst = {
+       "hdmi_dpll_clk_mux",
+       NULL,
+};
+
+static const char * const dra7_dss_32khz_clk_parents[] __initconst = {
+       "sys_32k_ck",
+       NULL,
+};
+
+static const char * const dra7_dss_video1_clk_parents[] __initconst = {
+       "video1_dpll_clk_mux",
+       NULL,
+};
+
+static const char * const dra7_dss_video2_clk_parents[] __initconst = {
+       "video2_dpll_clk_mux",
+       NULL,
+};
+
+static const struct omap_clkctrl_bit_data dra7_dss_core_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, dra7_dss_dss_clk_parents, NULL },
+       { 9, TI_CLK_GATE, dra7_dss_48mhz_clk_parents, NULL },
+       { 10, TI_CLK_GATE, dra7_dss_hdmi_clk_parents, NULL },
+       { 11, TI_CLK_GATE, dra7_dss_32khz_clk_parents, NULL },
+       { 12, TI_CLK_GATE, dra7_dss_video1_clk_parents, NULL },
+       { 13, TI_CLK_GATE, dra7_dss_video2_clk_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data dra7_dss_clkctrl_regs[] __initconst = {
+       { DRA7_DSS_CORE_CLKCTRL, dra7_dss_core_bit_data, CLKF_SW_SUP, "dss_cm:clk:0000:8" },
+       { DRA7_BB2D_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_core_h24x2_ck" },
+       { 0 },
+};
+
+static const char * const dra7_mmc1_fclk_mux_parents[] __initconst = {
+       "func_128m_clk",
+       "dpll_per_m2x2_ck",
+       NULL,
+};
+
+static const char * const dra7_mmc1_fclk_div_parents[] __initconst = {
+       "l3init_cm:clk:0008:24",
+       NULL,
+};
+
+static const struct omap_clkctrl_div_data dra7_mmc1_fclk_div_data __initconst = {
+       .max_div = 4,
+       .flags = CLK_DIVIDER_POWER_OF_TWO,
+};
+
+static const struct omap_clkctrl_bit_data dra7_mmc1_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, dra7_dss_32khz_clk_parents, NULL },
+       { 24, TI_CLK_MUX, dra7_mmc1_fclk_mux_parents, NULL },
+       { 25, TI_CLK_DIVIDER, dra7_mmc1_fclk_div_parents, &dra7_mmc1_fclk_div_data },
+       { 0 },
+};
+
+static const char * const dra7_mmc2_fclk_div_parents[] __initconst = {
+       "l3init_cm:clk:0010:24",
+       NULL,
+};
+
+static const struct omap_clkctrl_div_data dra7_mmc2_fclk_div_data __initconst = {
+       .max_div = 4,
+       .flags = CLK_DIVIDER_POWER_OF_TWO,
+};
+
+static const struct omap_clkctrl_bit_data dra7_mmc2_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, dra7_dss_32khz_clk_parents, NULL },
+       { 24, TI_CLK_MUX, dra7_mmc1_fclk_mux_parents, NULL },
+       { 25, TI_CLK_DIVIDER, dra7_mmc2_fclk_div_parents, &dra7_mmc2_fclk_div_data },
+       { 0 },
+};
+
+static const char * const dra7_usb_otg_ss2_refclk960m_parents[] __initconst = {
+       "l3init_960m_gfclk",
+       NULL,
+};
+
+static const struct omap_clkctrl_bit_data dra7_usb_otg_ss2_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, dra7_usb_otg_ss2_refclk960m_parents, NULL },
+       { 0 },
+};
+
+static const char * const dra7_sata_ref_clk_parents[] __initconst = {
+       "sys_clkin1",
+       NULL,
+};
+
+static const struct omap_clkctrl_bit_data dra7_sata_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, dra7_sata_ref_clk_parents, NULL },
+       { 0 },
+};
+
+static const char * const dra7_optfclk_pciephy1_clk_parents[] __initconst = {
+       "apll_pcie_ck",
+       NULL,
+};
+
+static const char * const dra7_optfclk_pciephy1_div_clk_parents[] __initconst = {
+       "optfclk_pciephy_div",
+       NULL,
+};
+
+static const struct omap_clkctrl_bit_data dra7_pcie1_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, dra7_dss_32khz_clk_parents, NULL },
+       { 9, TI_CLK_GATE, dra7_optfclk_pciephy1_clk_parents, NULL },
+       { 10, TI_CLK_GATE, dra7_optfclk_pciephy1_div_clk_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_pcie2_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, dra7_dss_32khz_clk_parents, NULL },
+       { 9, TI_CLK_GATE, dra7_optfclk_pciephy1_clk_parents, NULL },
+       { 10, TI_CLK_GATE, dra7_optfclk_pciephy1_div_clk_parents, NULL },
+       { 0 },
+};
+
+static const char * const dra7_rmii_50mhz_clk_mux_parents[] __initconst = {
+       "dpll_gmac_h11x2_ck",
+       "rmii_clk_ck",
+       NULL,
+};
+
+static const char * const dra7_gmac_rft_clk_mux_parents[] __initconst = {
+       "video1_clkin_ck",
+       "video2_clkin_ck",
+       "dpll_abe_m2_ck",
+       "hdmi_clkin_ck",
+       "l3_iclk_div",
+       NULL,
+};
+
+static const struct omap_clkctrl_bit_data dra7_gmac_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_rmii_50mhz_clk_mux_parents, NULL },
+       { 25, TI_CLK_MUX, dra7_gmac_rft_clk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_usb_otg_ss1_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, dra7_usb_otg_ss2_refclk960m_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data dra7_l3init_clkctrl_regs[] __initconst = {
+       { DRA7_MMC1_CLKCTRL, dra7_mmc1_bit_data, CLKF_SW_SUP, "l3init_cm:clk:0008:25" },
+       { DRA7_MMC2_CLKCTRL, dra7_mmc2_bit_data, CLKF_SW_SUP, "l3init_cm:clk:0010:25" },
+       { DRA7_USB_OTG_SS2_CLKCTRL, dra7_usb_otg_ss2_bit_data, CLKF_HW_SUP, "dpll_core_h13x2_ck" },
+       { DRA7_USB_OTG_SS3_CLKCTRL, NULL, CLKF_HW_SUP, "dpll_core_h13x2_ck" },
+       { DRA7_USB_OTG_SS4_CLKCTRL, NULL, CLKF_HW_SUP, "dpll_core_h13x2_ck" },
+       { DRA7_SATA_CLKCTRL, dra7_sata_bit_data, CLKF_SW_SUP, "func_48m_fclk" },
+       { DRA7_PCIE1_CLKCTRL, dra7_pcie1_bit_data, CLKF_SW_SUP, "l4_root_clk_div", "pcie_clkdm" },
+       { DRA7_PCIE2_CLKCTRL, dra7_pcie2_bit_data, CLKF_SW_SUP, "l4_root_clk_div", "pcie_clkdm" },
+       { DRA7_GMAC_CLKCTRL, dra7_gmac_bit_data, CLKF_SW_SUP, "dpll_gmac_ck", "gmac_clkdm" },
+       { DRA7_OCP2SCP1_CLKCTRL, NULL, CLKF_HW_SUP, "l4_root_clk_div" },
+       { DRA7_OCP2SCP3_CLKCTRL, NULL, CLKF_HW_SUP, "l4_root_clk_div" },
+       { DRA7_USB_OTG_SS1_CLKCTRL, dra7_usb_otg_ss1_bit_data, CLKF_HW_SUP, "dpll_core_h13x2_ck" },
+       { 0 },
+};
+
+static const char * const dra7_timer10_gfclk_mux_parents[] __initconst = {
+       "timer_sys_clk_div",
+       "sys_32k_ck",
+       "sys_clkin2",
+       "ref_clkin0_ck",
+       "ref_clkin1_ck",
+       "ref_clkin2_ck",
+       "ref_clkin3_ck",
+       "abe_giclk_div",
+       "video1_div_clk",
+       "video2_div_clk",
+       "hdmi_div_clk",
+       NULL,
+};
+
+static const struct omap_clkctrl_bit_data dra7_timer10_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_timer10_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_timer11_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_timer10_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_timer2_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_timer10_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_timer3_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_timer10_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_timer4_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_timer10_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_timer9_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_timer10_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_gpio2_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, dra7_dss_32khz_clk_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_gpio3_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, dra7_dss_32khz_clk_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_gpio4_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, dra7_dss_32khz_clk_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_gpio5_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, dra7_dss_32khz_clk_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_gpio6_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, dra7_dss_32khz_clk_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_timer13_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_timer10_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_timer14_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_timer10_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_timer15_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_timer10_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_gpio7_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, dra7_dss_32khz_clk_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_gpio8_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, dra7_dss_32khz_clk_parents, NULL },
+       { 0 },
+};
+
+static const char * const dra7_mmc3_gfclk_div_parents[] __initconst = {
+       "l4per_cm:clk:0120:24",
+       NULL,
+};
+
+static const struct omap_clkctrl_div_data dra7_mmc3_gfclk_div_data __initconst = {
+       .max_div = 4,
+       .flags = CLK_DIVIDER_POWER_OF_TWO,
+};
+
+static const struct omap_clkctrl_bit_data dra7_mmc3_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, dra7_dss_32khz_clk_parents, NULL },
+       { 24, TI_CLK_MUX, dra7_uart6_gfclk_mux_parents, NULL },
+       { 25, TI_CLK_DIVIDER, dra7_mmc3_gfclk_div_parents, &dra7_mmc3_gfclk_div_data },
+       { 0 },
+};
+
+static const char * const dra7_mmc4_gfclk_div_parents[] __initconst = {
+       "l4per_cm:clk:0128:24",
+       NULL,
+};
+
+static const struct omap_clkctrl_div_data dra7_mmc4_gfclk_div_data __initconst = {
+       .max_div = 4,
+       .flags = CLK_DIVIDER_POWER_OF_TWO,
+};
+
+static const struct omap_clkctrl_bit_data dra7_mmc4_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, dra7_dss_32khz_clk_parents, NULL },
+       { 24, TI_CLK_MUX, dra7_uart6_gfclk_mux_parents, NULL },
+       { 25, TI_CLK_DIVIDER, dra7_mmc4_gfclk_div_parents, &dra7_mmc4_gfclk_div_data },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_timer16_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_timer10_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const char * const dra7_qspi_gfclk_mux_parents[] __initconst = {
+       "func_128m_clk",
+       "dpll_per_h13x2_ck",
+       NULL,
+};
+
+static const char * const dra7_qspi_gfclk_div_parents[] __initconst = {
+       "l4per_cm:clk:0138:24",
+       NULL,
+};
+
+static const struct omap_clkctrl_div_data dra7_qspi_gfclk_div_data __initconst = {
+       .max_div = 4,
+       .flags = CLK_DIVIDER_POWER_OF_TWO,
+};
+
+static const struct omap_clkctrl_bit_data dra7_qspi_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_qspi_gfclk_mux_parents, NULL },
+       { 25, TI_CLK_DIVIDER, dra7_qspi_gfclk_div_parents, &dra7_qspi_gfclk_div_data },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_uart1_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_uart6_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_uart2_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_uart6_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_uart3_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_uart6_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_uart4_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_uart6_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_mcasp2_bit_data[] __initconst = {
+       { 22, TI_CLK_MUX, dra7_mcasp1_aux_gfclk_mux_parents, NULL },
+       { 24, TI_CLK_MUX, dra7_mcasp1_ahclkx_mux_parents, NULL },
+       { 28, TI_CLK_MUX, dra7_mcasp1_ahclkx_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_mcasp3_bit_data[] __initconst = {
+       { 22, TI_CLK_MUX, dra7_mcasp1_aux_gfclk_mux_parents, NULL },
+       { 24, TI_CLK_MUX, dra7_mcasp1_ahclkx_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_uart5_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_uart6_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_mcasp5_bit_data[] __initconst = {
+       { 22, TI_CLK_MUX, dra7_mcasp1_aux_gfclk_mux_parents, NULL },
+       { 24, TI_CLK_MUX, dra7_mcasp1_ahclkx_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_mcasp8_bit_data[] __initconst = {
+       { 22, TI_CLK_MUX, dra7_mcasp1_aux_gfclk_mux_parents, NULL },
+       { 24, TI_CLK_MUX, dra7_mcasp1_ahclkx_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_mcasp4_bit_data[] __initconst = {
+       { 22, TI_CLK_MUX, dra7_mcasp1_aux_gfclk_mux_parents, NULL },
+       { 24, TI_CLK_MUX, dra7_mcasp1_ahclkx_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_uart7_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_uart6_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_uart8_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_uart6_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_uart9_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_uart6_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_mcasp6_bit_data[] __initconst = {
+       { 22, TI_CLK_MUX, dra7_mcasp1_aux_gfclk_mux_parents, NULL },
+       { 24, TI_CLK_MUX, dra7_mcasp1_ahclkx_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_mcasp7_bit_data[] __initconst = {
+       { 22, TI_CLK_MUX, dra7_mcasp1_aux_gfclk_mux_parents, NULL },
+       { 24, TI_CLK_MUX, dra7_mcasp1_ahclkx_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data dra7_l4per_clkctrl_regs[] __initconst = {
+       { DRA7_L4_PER2_CLKCTRL, NULL, 0, "l3_iclk_div", "l4per2_clkdm" },
+       { DRA7_L4_PER3_CLKCTRL, NULL, 0, "l3_iclk_div", "l4per3_clkdm" },
+       { DRA7_TIMER10_CLKCTRL, dra7_timer10_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0028:24" },
+       { DRA7_TIMER11_CLKCTRL, dra7_timer11_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0030:24" },
+       { DRA7_TIMER2_CLKCTRL, dra7_timer2_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0038:24" },
+       { DRA7_TIMER3_CLKCTRL, dra7_timer3_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0040:24" },
+       { DRA7_TIMER4_CLKCTRL, dra7_timer4_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0048:24" },
+       { DRA7_TIMER9_CLKCTRL, dra7_timer9_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0050:24" },
+       { DRA7_ELM_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_GPIO2_CLKCTRL, dra7_gpio2_bit_data, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_GPIO3_CLKCTRL, dra7_gpio3_bit_data, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_GPIO4_CLKCTRL, dra7_gpio4_bit_data, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_GPIO5_CLKCTRL, dra7_gpio5_bit_data, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_GPIO6_CLKCTRL, dra7_gpio6_bit_data, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_HDQ1W_CLKCTRL, NULL, CLKF_SW_SUP, "func_12m_fclk" },
+       { DRA7_EPWMSS1_CLKCTRL, NULL, CLKF_SW_SUP, "l4_root_clk_div", "l4per2_clkdm" },
+       { DRA7_EPWMSS2_CLKCTRL, NULL, CLKF_SW_SUP, "l4_root_clk_div", "l4per2_clkdm" },
+       { DRA7_I2C1_CLKCTRL, NULL, CLKF_SW_SUP, "func_96m_fclk" },
+       { DRA7_I2C2_CLKCTRL, NULL, CLKF_SW_SUP, "func_96m_fclk" },
+       { DRA7_I2C3_CLKCTRL, NULL, CLKF_SW_SUP, "func_96m_fclk" },
+       { DRA7_I2C4_CLKCTRL, NULL, CLKF_SW_SUP, "func_96m_fclk" },
+       { DRA7_L4_PER1_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_EPWMSS0_CLKCTRL, NULL, CLKF_SW_SUP, "l4_root_clk_div", "l4per2_clkdm" },
+       { DRA7_TIMER13_CLKCTRL, dra7_timer13_bit_data, CLKF_SW_SUP, "l4per_cm:clk:00c8:24", "l4per3_clkdm" },
+       { DRA7_TIMER14_CLKCTRL, dra7_timer14_bit_data, CLKF_SW_SUP, "l4per_cm:clk:00d0:24", "l4per3_clkdm" },
+       { DRA7_TIMER15_CLKCTRL, dra7_timer15_bit_data, CLKF_SW_SUP, "l4per_cm:clk:00d8:24", "l4per3_clkdm" },
+       { DRA7_MCSPI1_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" },
+       { DRA7_MCSPI2_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" },
+       { DRA7_MCSPI3_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" },
+       { DRA7_MCSPI4_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" },
+       { DRA7_GPIO7_CLKCTRL, dra7_gpio7_bit_data, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_GPIO8_CLKCTRL, dra7_gpio8_bit_data, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_MMC3_CLKCTRL, dra7_mmc3_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0120:25" },
+       { DRA7_MMC4_CLKCTRL, dra7_mmc4_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0128:25" },
+       { DRA7_TIMER16_CLKCTRL, dra7_timer16_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0130:24", "l4per3_clkdm" },
+       { DRA7_QSPI_CLKCTRL, dra7_qspi_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0138:25", "l4per2_clkdm" },
+       { DRA7_UART1_CLKCTRL, dra7_uart1_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0140:24" },
+       { DRA7_UART2_CLKCTRL, dra7_uart2_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0148:24" },
+       { DRA7_UART3_CLKCTRL, dra7_uart3_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0150:24" },
+       { DRA7_UART4_CLKCTRL, dra7_uart4_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0158:24" },
+       { DRA7_MCASP2_CLKCTRL, dra7_mcasp2_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0160:22", "l4per2_clkdm" },
+       { DRA7_MCASP3_CLKCTRL, dra7_mcasp3_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0168:22", "l4per2_clkdm" },
+       { DRA7_UART5_CLKCTRL, dra7_uart5_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0170:24" },
+       { DRA7_MCASP5_CLKCTRL, dra7_mcasp5_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0178:22", "l4per2_clkdm" },
+       { DRA7_MCASP8_CLKCTRL, dra7_mcasp8_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0190:24", "l4per2_clkdm" },
+       { DRA7_MCASP4_CLKCTRL, dra7_mcasp4_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0198:22", "l4per2_clkdm" },
+       { DRA7_AES1_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div", "l4sec_clkdm" },
+       { DRA7_AES2_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div", "l4sec_clkdm" },
+       { DRA7_DES_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div", "l4sec_clkdm" },
+       { DRA7_RNG_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div", "l4sec_clkdm" },
+       { DRA7_SHAM_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div", "l4sec_clkdm" },
+       { DRA7_UART7_CLKCTRL, dra7_uart7_bit_data, CLKF_SW_SUP, "l4per_cm:clk:01d0:24", "l4per2_clkdm" },
+       { DRA7_UART8_CLKCTRL, dra7_uart8_bit_data, CLKF_SW_SUP, "l4per_cm:clk:01e0:24", "l4per2_clkdm" },
+       { DRA7_UART9_CLKCTRL, dra7_uart9_bit_data, CLKF_SW_SUP, "l4per_cm:clk:01e8:24", "l4per2_clkdm" },
+       { DRA7_DCAN2_CLKCTRL, NULL, CLKF_SW_SUP, "sys_clkin1", "l4per2_clkdm" },
+       { DRA7_MCASP6_CLKCTRL, dra7_mcasp6_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0204:22", "l4per2_clkdm" },
+       { DRA7_MCASP7_CLKCTRL, dra7_mcasp7_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0208:22", "l4per2_clkdm" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_gpio1_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, dra7_dss_32khz_clk_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_timer1_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_timer10_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_uart10_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_uart6_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const char * const dra7_dcan1_sys_clk_mux_parents[] __initconst = {
+       "sys_clkin1",
+       "sys_clkin2",
+       NULL,
+};
+
+static const struct omap_clkctrl_bit_data dra7_dcan1_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_dcan1_sys_clk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data dra7_wkupaon_clkctrl_regs[] __initconst = {
+       { DRA7_L4_WKUP_CLKCTRL, NULL, 0, "wkupaon_iclk_mux" },
+       { DRA7_WD_TIMER2_CLKCTRL, NULL, CLKF_SW_SUP, "sys_32k_ck" },
+       { DRA7_GPIO1_CLKCTRL, dra7_gpio1_bit_data, CLKF_HW_SUP, "wkupaon_iclk_mux" },
+       { DRA7_TIMER1_CLKCTRL, dra7_timer1_bit_data, CLKF_SW_SUP, "wkupaon_cm:clk:0020:24" },
+       { DRA7_TIMER12_CLKCTRL, NULL, 0, "secure_32k_clk_src_ck" },
+       { DRA7_COUNTER_32K_CLKCTRL, NULL, 0, "wkupaon_iclk_mux" },
+       { DRA7_UART10_CLKCTRL, dra7_uart10_bit_data, CLKF_SW_SUP, "wkupaon_cm:clk:0060:24" },
+       { DRA7_DCAN1_CLKCTRL, dra7_dcan1_bit_data, CLKF_SW_SUP, "wkupaon_cm:clk:0068:24" },
+       { DRA7_ADC_CLKCTRL, NULL, CLKF_SW_SUP, "mcan_clk"},
+       { 0 },
+};
+
+const struct omap_clkctrl_data dra7_clkctrl_compat_data[] __initconst = {
+       { 0x4a005320, dra7_mpu_clkctrl_regs },
+       { 0x4a005540, dra7_ipu_clkctrl_regs },
+       { 0x4a005740, dra7_rtc_clkctrl_regs },
+       { 0x4a008620, dra7_coreaon_clkctrl_regs },
+       { 0x4a008720, dra7_l3main1_clkctrl_regs },
+       { 0x4a008a20, dra7_dma_clkctrl_regs },
+       { 0x4a008b20, dra7_emif_clkctrl_regs },
+       { 0x4a008c00, dra7_atl_clkctrl_regs },
+       { 0x4a008d20, dra7_l4cfg_clkctrl_regs },
+       { 0x4a008e20, dra7_l3instr_clkctrl_regs },
+       { 0x4a009120, dra7_dss_clkctrl_regs },
+       { 0x4a009320, dra7_l3init_clkctrl_regs },
+       { 0x4a009700, dra7_l4per_clkctrl_regs },
+       { 0x4ae07820, dra7_wkupaon_clkctrl_regs },
+       { 0 },
+};
+
+struct ti_dt_clk dra7xx_compat_clks[] = {
+       DT_CLK(NULL, "timer_32k_ck", "sys_32k_ck"),
+       DT_CLK(NULL, "sys_clkin_ck", "timer_sys_clk_div"),
+       DT_CLK(NULL, "sys_clkin", "sys_clkin1"),
+       DT_CLK(NULL, "atl_dpll_clk_mux", "atl_cm:0000:24"),
+       DT_CLK(NULL, "atl_gfclk_mux", "atl_cm:0000:26"),
+       DT_CLK(NULL, "dcan1_sys_clk_mux", "wkupaon_cm:0068:24"),
+       DT_CLK(NULL, "dss_32khz_clk", "dss_cm:0000:11"),
+       DT_CLK(NULL, "dss_48mhz_clk", "dss_cm:0000:9"),
+       DT_CLK(NULL, "dss_dss_clk", "dss_cm:0000:8"),
+       DT_CLK(NULL, "dss_hdmi_clk", "dss_cm:0000:10"),
+       DT_CLK(NULL, "dss_video1_clk", "dss_cm:0000:12"),
+       DT_CLK(NULL, "dss_video2_clk", "dss_cm:0000:13"),
+       DT_CLK(NULL, "gmac_rft_clk_mux", "l3init_cm:00b0:25"),
+       DT_CLK(NULL, "gpio1_dbclk", "wkupaon_cm:0018:8"),
+       DT_CLK(NULL, "gpio2_dbclk", "l4per_cm:0060:8"),
+       DT_CLK(NULL, "gpio3_dbclk", "l4per_cm:0068:8"),
+       DT_CLK(NULL, "gpio4_dbclk", "l4per_cm:0070:8"),
+       DT_CLK(NULL, "gpio5_dbclk", "l4per_cm:0078:8"),
+       DT_CLK(NULL, "gpio6_dbclk", "l4per_cm:0080:8"),
+       DT_CLK(NULL, "gpio7_dbclk", "l4per_cm:0110:8"),
+       DT_CLK(NULL, "gpio8_dbclk", "l4per_cm:0118:8"),
+       DT_CLK(NULL, "mcasp1_ahclkr_mux", "ipu_cm:0010:28"),
+       DT_CLK(NULL, "mcasp1_ahclkx_mux", "ipu_cm:0010:24"),
+       DT_CLK(NULL, "mcasp1_aux_gfclk_mux", "ipu_cm:0010:22"),
+       DT_CLK(NULL, "mcasp2_ahclkr_mux", "l4per_cm:0160:28"),
+       DT_CLK(NULL, "mcasp2_ahclkx_mux", "l4per_cm:0160:24"),
+       DT_CLK(NULL, "mcasp2_aux_gfclk_mux", "l4per_cm:0160:22"),
+       DT_CLK(NULL, "mcasp3_ahclkx_mux", "l4per_cm:0168:24"),
+       DT_CLK(NULL, "mcasp3_aux_gfclk_mux", "l4per_cm:0168:22"),
+       DT_CLK(NULL, "mcasp4_ahclkx_mux", "l4per_cm:0198:24"),
+       DT_CLK(NULL, "mcasp4_aux_gfclk_mux", "l4per_cm:0198:22"),
+       DT_CLK(NULL, "mcasp5_ahclkx_mux", "l4per_cm:0178:24"),
+       DT_CLK(NULL, "mcasp5_aux_gfclk_mux", "l4per_cm:0178:22"),
+       DT_CLK(NULL, "mcasp6_ahclkx_mux", "l4per_cm:0204:24"),
+       DT_CLK(NULL, "mcasp6_aux_gfclk_mux", "l4per_cm:0204:22"),
+       DT_CLK(NULL, "mcasp7_ahclkx_mux", "l4per_cm:0208:24"),
+       DT_CLK(NULL, "mcasp7_aux_gfclk_mux", "l4per_cm:0208:22"),
+       DT_CLK(NULL, "mcasp8_ahclkx_mux", "l4per_cm:0190:22"),
+       DT_CLK(NULL, "mcasp8_aux_gfclk_mux", "l4per_cm:0190:24"),
+       DT_CLK(NULL, "mmc1_clk32k", "l3init_cm:0008:8"),
+       DT_CLK(NULL, "mmc1_fclk_div", "l3init_cm:0008:25"),
+       DT_CLK(NULL, "mmc1_fclk_mux", "l3init_cm:0008:24"),
+       DT_CLK(NULL, "mmc2_clk32k", "l3init_cm:0010:8"),
+       DT_CLK(NULL, "mmc2_fclk_div", "l3init_cm:0010:25"),
+       DT_CLK(NULL, "mmc2_fclk_mux", "l3init_cm:0010:24"),
+       DT_CLK(NULL, "mmc3_clk32k", "l4per_cm:0120:8"),
+       DT_CLK(NULL, "mmc3_gfclk_div", "l4per_cm:0120:25"),
+       DT_CLK(NULL, "mmc3_gfclk_mux", "l4per_cm:0120:24"),
+       DT_CLK(NULL, "mmc4_clk32k", "l4per_cm:0128:8"),
+       DT_CLK(NULL, "mmc4_gfclk_div", "l4per_cm:0128:25"),
+       DT_CLK(NULL, "mmc4_gfclk_mux", "l4per_cm:0128:24"),
+       DT_CLK(NULL, "optfclk_pciephy1_32khz", "l3init_cm:0090:8"),
+       DT_CLK(NULL, "optfclk_pciephy1_clk", "l3init_cm:0090:9"),
+       DT_CLK(NULL, "optfclk_pciephy1_div_clk", "l3init_cm:0090:10"),
+       DT_CLK(NULL, "optfclk_pciephy2_32khz", "l3init_cm:0098:8"),
+       DT_CLK(NULL, "optfclk_pciephy2_clk", "l3init_cm:0098:9"),
+       DT_CLK(NULL, "optfclk_pciephy2_div_clk", "l3init_cm:0098:10"),
+       DT_CLK(NULL, "qspi_gfclk_div", "l4per_cm:0138:25"),
+       DT_CLK(NULL, "qspi_gfclk_mux", "l4per_cm:0138:24"),
+       DT_CLK(NULL, "rmii_50mhz_clk_mux", "l3init_cm:00b0:24"),
+       DT_CLK(NULL, "sata_ref_clk", "l3init_cm:0068:8"),
+       DT_CLK(NULL, "timer10_gfclk_mux", "l4per_cm:0028:24"),
+       DT_CLK(NULL, "timer11_gfclk_mux", "l4per_cm:0030:24"),
+       DT_CLK(NULL, "timer13_gfclk_mux", "l4per_cm:00c8:24"),
+       DT_CLK(NULL, "timer14_gfclk_mux", "l4per_cm:00d0:24"),
+       DT_CLK(NULL, "timer15_gfclk_mux", "l4per_cm:00d8:24"),
+       DT_CLK(NULL, "timer16_gfclk_mux", "l4per_cm:0130:24"),
+       DT_CLK(NULL, "timer1_gfclk_mux", "wkupaon_cm:0020:24"),
+       DT_CLK(NULL, "timer2_gfclk_mux", "l4per_cm:0038:24"),
+       DT_CLK(NULL, "timer3_gfclk_mux", "l4per_cm:0040:24"),
+       DT_CLK(NULL, "timer4_gfclk_mux", "l4per_cm:0048:24"),
+       DT_CLK(NULL, "timer5_gfclk_mux", "ipu_cm:0018:24"),
+       DT_CLK(NULL, "timer6_gfclk_mux", "ipu_cm:0020:24"),
+       DT_CLK(NULL, "timer7_gfclk_mux", "ipu_cm:0028:24"),
+       DT_CLK(NULL, "timer8_gfclk_mux", "ipu_cm:0030:24"),
+       DT_CLK(NULL, "timer9_gfclk_mux", "l4per_cm:0050:24"),
+       DT_CLK(NULL, "uart10_gfclk_mux", "wkupaon_cm:0060:24"),
+       DT_CLK(NULL, "uart1_gfclk_mux", "l4per_cm:0140:24"),
+       DT_CLK(NULL, "uart2_gfclk_mux", "l4per_cm:0148:24"),
+       DT_CLK(NULL, "uart3_gfclk_mux", "l4per_cm:0150:24"),
+       DT_CLK(NULL, "uart4_gfclk_mux", "l4per_cm:0158:24"),
+       DT_CLK(NULL, "uart5_gfclk_mux", "l4per_cm:0170:24"),
+       DT_CLK(NULL, "uart6_gfclk_mux", "ipu_cm:0040:24"),
+       DT_CLK(NULL, "uart7_gfclk_mux", "l4per_cm:01d0:24"),
+       DT_CLK(NULL, "uart8_gfclk_mux", "l4per_cm:01e0:24"),
+       DT_CLK(NULL, "uart9_gfclk_mux", "l4per_cm:01e8:24"),
+       DT_CLK(NULL, "usb_otg_ss1_refclk960m", "l3init_cm:00d0:8"),
+       DT_CLK(NULL, "usb_otg_ss2_refclk960m", "l3init_cm:0020:8"),
+       { .node_name = NULL },
+};
index 71a122b2dc67eb6c4324da73ea75860117067160..597fb4a593180e087a24e80b6c5a512266dadc90 100644 (file)
 #define DRA7_DPLL_USB_DEFFREQ                          960000000
 
 static const struct omap_clkctrl_reg_data dra7_mpu_clkctrl_regs[] __initconst = {
-       { DRA7_MPU_CLKCTRL, NULL, 0, "dpll_mpu_m2_ck" },
+       { DRA7_MPU_MPU_CLKCTRL, NULL, 0, "dpll_mpu_m2_ck" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data dra7_dsp1_clkctrl_regs[] __initconst = {
+       { DRA7_DSP1_MMU0_DSP1_CLKCTRL, NULL, CLKF_HW_SUP, "dpll_dsp_m2_ck" },
+       { 0 },
+};
+
+static const char * const dra7_ipu1_gfclk_mux_parents[] __initconst = {
+       "dpll_abe_m2x2_ck",
+       "dpll_core_h22x2_ck",
+       NULL,
+};
+
+static const struct omap_clkctrl_bit_data dra7_mmu_ipu1_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_ipu1_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data dra7_ipu1_clkctrl_regs[] __initconst = {
+       { DRA7_IPU1_MMU_IPU1_CLKCTRL, dra7_mmu_ipu1_bit_data, CLKF_HW_SUP, "ipu1-clkctrl:0000:24" },
        { 0 },
 };
 
@@ -108,45 +129,55 @@ static const struct omap_clkctrl_bit_data dra7_uart6_bit_data[] __initconst = {
 };
 
 static const struct omap_clkctrl_reg_data dra7_ipu_clkctrl_regs[] __initconst = {
-       { DRA7_MCASP1_CLKCTRL, dra7_mcasp1_bit_data, CLKF_SW_SUP, "ipu_cm:clk:0010:22" },
-       { DRA7_TIMER5_CLKCTRL, dra7_timer5_bit_data, CLKF_SW_SUP, "ipu_cm:clk:0018:24" },
-       { DRA7_TIMER6_CLKCTRL, dra7_timer6_bit_data, CLKF_SW_SUP, "ipu_cm:clk:0020:24" },
-       { DRA7_TIMER7_CLKCTRL, dra7_timer7_bit_data, CLKF_SW_SUP, "ipu_cm:clk:0028:24" },
-       { DRA7_TIMER8_CLKCTRL, dra7_timer8_bit_data, CLKF_SW_SUP, "ipu_cm:clk:0030:24" },
-       { DRA7_I2C5_CLKCTRL, NULL, CLKF_SW_SUP, "func_96m_fclk" },
-       { DRA7_UART6_CLKCTRL, dra7_uart6_bit_data, CLKF_SW_SUP, "ipu_cm:clk:0040:24" },
+       { DRA7_IPU_MCASP1_CLKCTRL, dra7_mcasp1_bit_data, CLKF_SW_SUP, "ipu-clkctrl:0000:22" },
+       { DRA7_IPU_TIMER5_CLKCTRL, dra7_timer5_bit_data, CLKF_SW_SUP, "ipu-clkctrl:0008:24" },
+       { DRA7_IPU_TIMER6_CLKCTRL, dra7_timer6_bit_data, CLKF_SW_SUP, "ipu-clkctrl:0010:24" },
+       { DRA7_IPU_TIMER7_CLKCTRL, dra7_timer7_bit_data, CLKF_SW_SUP, "ipu-clkctrl:0018:24" },
+       { DRA7_IPU_TIMER8_CLKCTRL, dra7_timer8_bit_data, CLKF_SW_SUP, "ipu-clkctrl:0020:24" },
+       { DRA7_IPU_I2C5_CLKCTRL, NULL, CLKF_SW_SUP, "func_96m_fclk" },
+       { DRA7_IPU_UART6_CLKCTRL, dra7_uart6_bit_data, CLKF_SW_SUP, "ipu-clkctrl:0030:24" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data dra7_dsp2_clkctrl_regs[] __initconst = {
+       { DRA7_DSP2_MMU0_DSP2_CLKCTRL, NULL, CLKF_HW_SUP, "dpll_dsp_m2_ck" },
        { 0 },
 };
 
 static const struct omap_clkctrl_reg_data dra7_rtc_clkctrl_regs[] __initconst = {
-       { DRA7_RTCSS_CLKCTRL, NULL, CLKF_SW_SUP, "sys_32k_ck" },
+       { DRA7_RTC_RTCSS_CLKCTRL, NULL, CLKF_SW_SUP, "sys_32k_ck" },
        { 0 },
 };
 
 static const struct omap_clkctrl_reg_data dra7_coreaon_clkctrl_regs[] __initconst = {
-       { DRA7_SMARTREFLEX_MPU_CLKCTRL, NULL, CLKF_SW_SUP, "wkupaon_iclk_mux" },
-       { DRA7_SMARTREFLEX_CORE_CLKCTRL, NULL, CLKF_SW_SUP, "wkupaon_iclk_mux" },
+       { DRA7_COREAON_SMARTREFLEX_MPU_CLKCTRL, NULL, CLKF_SW_SUP, "wkupaon_iclk_mux" },
+       { DRA7_COREAON_SMARTREFLEX_CORE_CLKCTRL, NULL, CLKF_SW_SUP, "wkupaon_iclk_mux" },
        { 0 },
 };
 
 static const struct omap_clkctrl_reg_data dra7_l3main1_clkctrl_regs[] __initconst = {
-       { DRA7_L3_MAIN_1_CLKCTRL, NULL, 0, "l3_iclk_div" },
-       { DRA7_GPMC_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div" },
-       { DRA7_TPCC_CLKCTRL, NULL, 0, "l3_iclk_div" },
-       { DRA7_TPTC0_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div" },
-       { DRA7_TPTC1_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div" },
-       { DRA7_VCP1_CLKCTRL, NULL, 0, "l3_iclk_div" },
-       { DRA7_VCP2_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_L3MAIN1_L3_MAIN_1_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_L3MAIN1_GPMC_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_L3MAIN1_TPCC_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_L3MAIN1_TPTC0_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_L3MAIN1_TPTC1_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_L3MAIN1_VCP1_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_L3MAIN1_VCP2_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data dra7_ipu2_clkctrl_regs[] __initconst = {
+       { DRA7_IPU2_MMU_IPU2_CLKCTRL, NULL, CLKF_HW_SUP, "dpll_core_h22x2_ck" },
        { 0 },
 };
 
 static const struct omap_clkctrl_reg_data dra7_dma_clkctrl_regs[] __initconst = {
-       { DRA7_DMA_SYSTEM_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_DMA_DMA_SYSTEM_CLKCTRL, NULL, 0, "l3_iclk_div" },
        { 0 },
 };
 
 static const struct omap_clkctrl_reg_data dra7_emif_clkctrl_regs[] __initconst = {
-       { DRA7_DMM_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_EMIF_DMM_CLKCTRL, NULL, 0, "l3_iclk_div" },
        { 0 },
 };
 
@@ -161,7 +192,7 @@ static const char * const dra7_atl_dpll_clk_mux_parents[] __initconst = {
 static const char * const dra7_atl_gfclk_mux_parents[] __initconst = {
        "l3_iclk_div",
        "dpll_abe_m2_ck",
-       "atl_cm:clk:0000:24",
+       "atl-clkctrl:0000:24",
        NULL,
 };
 
@@ -172,32 +203,32 @@ static const struct omap_clkctrl_bit_data dra7_atl_bit_data[] __initconst = {
 };
 
 static const struct omap_clkctrl_reg_data dra7_atl_clkctrl_regs[] __initconst = {
-       { DRA7_ATL_CLKCTRL, dra7_atl_bit_data, CLKF_SW_SUP, "atl_cm:clk:0000:26" },
+       { DRA7_ATL_ATL_CLKCTRL, dra7_atl_bit_data, CLKF_SW_SUP, "atl-clkctrl:0000:26" },
        { 0 },
 };
 
 static const struct omap_clkctrl_reg_data dra7_l4cfg_clkctrl_regs[] __initconst = {
-       { DRA7_L4_CFG_CLKCTRL, NULL, 0, "l3_iclk_div" },
-       { DRA7_SPINLOCK_CLKCTRL, NULL, 0, "l3_iclk_div" },
-       { DRA7_MAILBOX1_CLKCTRL, NULL, 0, "l3_iclk_div" },
-       { DRA7_MAILBOX2_CLKCTRL, NULL, 0, "l3_iclk_div" },
-       { DRA7_MAILBOX3_CLKCTRL, NULL, 0, "l3_iclk_div" },
-       { DRA7_MAILBOX4_CLKCTRL, NULL, 0, "l3_iclk_div" },
-       { DRA7_MAILBOX5_CLKCTRL, NULL, 0, "l3_iclk_div" },
-       { DRA7_MAILBOX6_CLKCTRL, NULL, 0, "l3_iclk_div" },
-       { DRA7_MAILBOX7_CLKCTRL, NULL, 0, "l3_iclk_div" },
-       { DRA7_MAILBOX8_CLKCTRL, NULL, 0, "l3_iclk_div" },
-       { DRA7_MAILBOX9_CLKCTRL, NULL, 0, "l3_iclk_div" },
-       { DRA7_MAILBOX10_CLKCTRL, NULL, 0, "l3_iclk_div" },
-       { DRA7_MAILBOX11_CLKCTRL, NULL, 0, "l3_iclk_div" },
-       { DRA7_MAILBOX12_CLKCTRL, NULL, 0, "l3_iclk_div" },
-       { DRA7_MAILBOX13_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_L4CFG_L4_CFG_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_L4CFG_SPINLOCK_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_L4CFG_MAILBOX1_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_L4CFG_MAILBOX2_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_L4CFG_MAILBOX3_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_L4CFG_MAILBOX4_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_L4CFG_MAILBOX5_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_L4CFG_MAILBOX6_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_L4CFG_MAILBOX7_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_L4CFG_MAILBOX8_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_L4CFG_MAILBOX9_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_L4CFG_MAILBOX10_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_L4CFG_MAILBOX11_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_L4CFG_MAILBOX12_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_L4CFG_MAILBOX13_CLKCTRL, NULL, 0, "l3_iclk_div" },
        { 0 },
 };
 
 static const struct omap_clkctrl_reg_data dra7_l3instr_clkctrl_regs[] __initconst = {
-       { DRA7_L3_MAIN_2_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div" },
-       { DRA7_L3_INSTR_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_L3INSTR_L3_MAIN_2_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_L3INSTR_L3_INSTR_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div" },
        { 0 },
 };
 
@@ -242,8 +273,8 @@ static const struct omap_clkctrl_bit_data dra7_dss_core_bit_data[] __initconst =
 };
 
 static const struct omap_clkctrl_reg_data dra7_dss_clkctrl_regs[] __initconst = {
-       { DRA7_DSS_CORE_CLKCTRL, dra7_dss_core_bit_data, CLKF_SW_SUP, "dss_cm:clk:0000:8" },
-       { DRA7_BB2D_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_core_h24x2_ck" },
+       { DRA7_DSS_DSS_CORE_CLKCTRL, dra7_dss_core_bit_data, CLKF_SW_SUP, "dss-clkctrl:0000:8" },
+       { DRA7_DSS_BB2D_CLKCTRL, NULL, CLKF_SW_SUP, "dpll_core_h24x2_ck" },
        { 0 },
 };
 
@@ -254,7 +285,7 @@ static const char * const dra7_mmc1_fclk_mux_parents[] __initconst = {
 };
 
 static const char * const dra7_mmc1_fclk_div_parents[] __initconst = {
-       "l3init_cm:clk:0008:24",
+       "l3init-clkctrl:0008:24",
        NULL,
 };
 
@@ -271,7 +302,7 @@ static const struct omap_clkctrl_bit_data dra7_mmc1_bit_data[] __initconst = {
 };
 
 static const char * const dra7_mmc2_fclk_div_parents[] __initconst = {
-       "l3init_cm:clk:0010:24",
+       "l3init-clkctrl:0010:24",
        NULL,
 };
 
@@ -307,6 +338,24 @@ static const struct omap_clkctrl_bit_data dra7_sata_bit_data[] __initconst = {
        { 0 },
 };
 
+static const struct omap_clkctrl_bit_data dra7_usb_otg_ss1_bit_data[] __initconst = {
+       { 8, TI_CLK_GATE, dra7_usb_otg_ss2_refclk960m_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data dra7_l3init_clkctrl_regs[] __initconst = {
+       { DRA7_L3INIT_MMC1_CLKCTRL, dra7_mmc1_bit_data, CLKF_SW_SUP, "l3init-clkctrl:0008:25" },
+       { DRA7_L3INIT_MMC2_CLKCTRL, dra7_mmc2_bit_data, CLKF_SW_SUP, "l3init-clkctrl:0010:25" },
+       { DRA7_L3INIT_USB_OTG_SS2_CLKCTRL, dra7_usb_otg_ss2_bit_data, CLKF_HW_SUP, "dpll_core_h13x2_ck" },
+       { DRA7_L3INIT_USB_OTG_SS3_CLKCTRL, NULL, CLKF_HW_SUP, "dpll_core_h13x2_ck" },
+       { DRA7_L3INIT_USB_OTG_SS4_CLKCTRL, NULL, CLKF_HW_SUP, "dpll_core_h13x2_ck" },
+       { DRA7_L3INIT_SATA_CLKCTRL, dra7_sata_bit_data, CLKF_SW_SUP, "func_48m_fclk" },
+       { DRA7_L3INIT_OCP2SCP1_CLKCTRL, NULL, CLKF_HW_SUP, "l4_root_clk_div" },
+       { DRA7_L3INIT_OCP2SCP3_CLKCTRL, NULL, CLKF_HW_SUP, "l4_root_clk_div" },
+       { DRA7_L3INIT_USB_OTG_SS1_CLKCTRL, dra7_usb_otg_ss1_bit_data, CLKF_HW_SUP, "dpll_core_h13x2_ck" },
+       { 0 },
+};
+
 static const char * const dra7_optfclk_pciephy1_clk_parents[] __initconst = {
        "apll_pcie_ck",
        NULL,
@@ -331,6 +380,12 @@ static const struct omap_clkctrl_bit_data dra7_pcie2_bit_data[] __initconst = {
        { 0 },
 };
 
+static const struct omap_clkctrl_reg_data dra7_pcie_clkctrl_regs[] __initconst = {
+       { DRA7_PCIE_PCIE1_CLKCTRL, dra7_pcie1_bit_data, CLKF_SW_SUP, "l4_root_clk_div" },
+       { DRA7_PCIE_PCIE2_CLKCTRL, dra7_pcie2_bit_data, CLKF_SW_SUP, "l4_root_clk_div" },
+       { 0 },
+};
+
 static const char * const dra7_rmii_50mhz_clk_mux_parents[] __initconst = {
        "dpll_gmac_h11x2_ck",
        "rmii_clk_ck",
@@ -352,24 +407,8 @@ static const struct omap_clkctrl_bit_data dra7_gmac_bit_data[] __initconst = {
        { 0 },
 };
 
-static const struct omap_clkctrl_bit_data dra7_usb_otg_ss1_bit_data[] __initconst = {
-       { 8, TI_CLK_GATE, dra7_usb_otg_ss2_refclk960m_parents, NULL },
-       { 0 },
-};
-
-static const struct omap_clkctrl_reg_data dra7_l3init_clkctrl_regs[] __initconst = {
-       { DRA7_MMC1_CLKCTRL, dra7_mmc1_bit_data, CLKF_SW_SUP, "l3init_cm:clk:0008:25" },
-       { DRA7_MMC2_CLKCTRL, dra7_mmc2_bit_data, CLKF_SW_SUP, "l3init_cm:clk:0010:25" },
-       { DRA7_USB_OTG_SS2_CLKCTRL, dra7_usb_otg_ss2_bit_data, CLKF_HW_SUP, "dpll_core_h13x2_ck" },
-       { DRA7_USB_OTG_SS3_CLKCTRL, NULL, CLKF_HW_SUP, "dpll_core_h13x2_ck" },
-       { DRA7_USB_OTG_SS4_CLKCTRL, NULL, CLKF_HW_SUP, "dpll_core_h13x2_ck" },
-       { DRA7_SATA_CLKCTRL, dra7_sata_bit_data, CLKF_SW_SUP, "func_48m_fclk" },
-       { DRA7_PCIE1_CLKCTRL, dra7_pcie1_bit_data, CLKF_SW_SUP, "l4_root_clk_div", "pcie_clkdm" },
-       { DRA7_PCIE2_CLKCTRL, dra7_pcie2_bit_data, CLKF_SW_SUP, "l4_root_clk_div", "pcie_clkdm" },
-       { DRA7_GMAC_CLKCTRL, dra7_gmac_bit_data, CLKF_SW_SUP, "dpll_gmac_ck", "gmac_clkdm" },
-       { DRA7_OCP2SCP1_CLKCTRL, NULL, CLKF_HW_SUP, "l4_root_clk_div" },
-       { DRA7_OCP2SCP3_CLKCTRL, NULL, CLKF_HW_SUP, "l4_root_clk_div" },
-       { DRA7_USB_OTG_SS1_CLKCTRL, dra7_usb_otg_ss1_bit_data, CLKF_HW_SUP, "dpll_core_h13x2_ck" },
+static const struct omap_clkctrl_reg_data dra7_gmac_clkctrl_regs[] __initconst = {
+       { DRA7_GMAC_GMAC_CLKCTRL, dra7_gmac_bit_data, CLKF_SW_SUP, "dpll_gmac_ck" },
        { 0 },
 };
 
@@ -443,21 +482,6 @@ static const struct omap_clkctrl_bit_data dra7_gpio6_bit_data[] __initconst = {
        { 0 },
 };
 
-static const struct omap_clkctrl_bit_data dra7_timer13_bit_data[] __initconst = {
-       { 24, TI_CLK_MUX, dra7_timer10_gfclk_mux_parents, NULL },
-       { 0 },
-};
-
-static const struct omap_clkctrl_bit_data dra7_timer14_bit_data[] __initconst = {
-       { 24, TI_CLK_MUX, dra7_timer10_gfclk_mux_parents, NULL },
-       { 0 },
-};
-
-static const struct omap_clkctrl_bit_data dra7_timer15_bit_data[] __initconst = {
-       { 24, TI_CLK_MUX, dra7_timer10_gfclk_mux_parents, NULL },
-       { 0 },
-};
-
 static const struct omap_clkctrl_bit_data dra7_gpio7_bit_data[] __initconst = {
        { 8, TI_CLK_GATE, dra7_dss_32khz_clk_parents, NULL },
        { 0 },
@@ -469,7 +493,7 @@ static const struct omap_clkctrl_bit_data dra7_gpio8_bit_data[] __initconst = {
 };
 
 static const char * const dra7_mmc3_gfclk_div_parents[] __initconst = {
-       "l4per_cm:clk:0120:24",
+       "l4per-clkctrl:00f8:24",
        NULL,
 };
 
@@ -486,7 +510,7 @@ static const struct omap_clkctrl_bit_data dra7_mmc3_bit_data[] __initconst = {
 };
 
 static const char * const dra7_mmc4_gfclk_div_parents[] __initconst = {
-       "l4per_cm:clk:0128:24",
+       "l4per-clkctrl:0100:24",
        NULL,
 };
 
@@ -502,8 +526,72 @@ static const struct omap_clkctrl_bit_data dra7_mmc4_bit_data[] __initconst = {
        { 0 },
 };
 
-static const struct omap_clkctrl_bit_data dra7_timer16_bit_data[] __initconst = {
-       { 24, TI_CLK_MUX, dra7_timer10_gfclk_mux_parents, NULL },
+static const struct omap_clkctrl_bit_data dra7_uart1_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_uart6_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_uart2_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_uart6_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_uart3_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_uart6_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_uart4_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_uart6_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_uart5_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_uart6_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data dra7_l4per_clkctrl_regs[] __initconst = {
+       { DRA7_L4PER_TIMER10_CLKCTRL, dra7_timer10_bit_data, CLKF_SW_SUP, "l4per-clkctrl:0000:24" },
+       { DRA7_L4PER_TIMER11_CLKCTRL, dra7_timer11_bit_data, CLKF_SW_SUP, "l4per-clkctrl:0008:24" },
+       { DRA7_L4PER_TIMER2_CLKCTRL, dra7_timer2_bit_data, CLKF_SW_SUP, "l4per-clkctrl:0010:24" },
+       { DRA7_L4PER_TIMER3_CLKCTRL, dra7_timer3_bit_data, CLKF_SW_SUP, "l4per-clkctrl:0018:24" },
+       { DRA7_L4PER_TIMER4_CLKCTRL, dra7_timer4_bit_data, CLKF_SW_SUP, "l4per-clkctrl:0020:24" },
+       { DRA7_L4PER_TIMER9_CLKCTRL, dra7_timer9_bit_data, CLKF_SW_SUP, "l4per-clkctrl:0028:24" },
+       { DRA7_L4PER_ELM_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_L4PER_GPIO2_CLKCTRL, dra7_gpio2_bit_data, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_L4PER_GPIO3_CLKCTRL, dra7_gpio3_bit_data, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_L4PER_GPIO4_CLKCTRL, dra7_gpio4_bit_data, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_L4PER_GPIO5_CLKCTRL, dra7_gpio5_bit_data, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_L4PER_GPIO6_CLKCTRL, dra7_gpio6_bit_data, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_L4PER_HDQ1W_CLKCTRL, NULL, CLKF_SW_SUP, "func_12m_fclk" },
+       { DRA7_L4PER_I2C1_CLKCTRL, NULL, CLKF_SW_SUP, "func_96m_fclk" },
+       { DRA7_L4PER_I2C2_CLKCTRL, NULL, CLKF_SW_SUP, "func_96m_fclk" },
+       { DRA7_L4PER_I2C3_CLKCTRL, NULL, CLKF_SW_SUP, "func_96m_fclk" },
+       { DRA7_L4PER_I2C4_CLKCTRL, NULL, CLKF_SW_SUP, "func_96m_fclk" },
+       { DRA7_L4PER_L4_PER1_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_L4PER_MCSPI1_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" },
+       { DRA7_L4PER_MCSPI2_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" },
+       { DRA7_L4PER_MCSPI3_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" },
+       { DRA7_L4PER_MCSPI4_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" },
+       { DRA7_L4PER_GPIO7_CLKCTRL, dra7_gpio7_bit_data, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_L4PER_GPIO8_CLKCTRL, dra7_gpio8_bit_data, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_L4PER_MMC3_CLKCTRL, dra7_mmc3_bit_data, CLKF_SW_SUP, "l4per-clkctrl:00f8:25" },
+       { DRA7_L4PER_MMC4_CLKCTRL, dra7_mmc4_bit_data, CLKF_SW_SUP, "l4per-clkctrl:0100:25" },
+       { DRA7_L4PER_UART1_CLKCTRL, dra7_uart1_bit_data, CLKF_SW_SUP, "l4per-clkctrl:0118:24" },
+       { DRA7_L4PER_UART2_CLKCTRL, dra7_uart2_bit_data, CLKF_SW_SUP, "l4per-clkctrl:0120:24" },
+       { DRA7_L4PER_UART3_CLKCTRL, dra7_uart3_bit_data, CLKF_SW_SUP, "l4per-clkctrl:0128:24" },
+       { DRA7_L4PER_UART4_CLKCTRL, dra7_uart4_bit_data, CLKF_SW_SUP, "l4per-clkctrl:0130:24" },
+       { DRA7_L4PER_UART5_CLKCTRL, dra7_uart5_bit_data, CLKF_SW_SUP, "l4per-clkctrl:0148:24" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data dra7_l4sec_clkctrl_regs[] __initconst = {
+       { DRA7_L4SEC_AES1_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_L4SEC_AES2_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_L4SEC_DES_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div" },
+       { DRA7_L4SEC_RNG_CLKCTRL, NULL, CLKF_HW_SUP, "" },
+       { DRA7_L4SEC_SHAM_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div" },
        { 0 },
 };
 
@@ -514,7 +602,7 @@ static const char * const dra7_qspi_gfclk_mux_parents[] __initconst = {
 };
 
 static const char * const dra7_qspi_gfclk_div_parents[] __initconst = {
-       "l4per_cm:clk:0138:24",
+       "l4per2-clkctrl:012c:24",
        NULL,
 };
 
@@ -529,26 +617,6 @@ static const struct omap_clkctrl_bit_data dra7_qspi_bit_data[] __initconst = {
        { 0 },
 };
 
-static const struct omap_clkctrl_bit_data dra7_uart1_bit_data[] __initconst = {
-       { 24, TI_CLK_MUX, dra7_uart6_gfclk_mux_parents, NULL },
-       { 0 },
-};
-
-static const struct omap_clkctrl_bit_data dra7_uart2_bit_data[] __initconst = {
-       { 24, TI_CLK_MUX, dra7_uart6_gfclk_mux_parents, NULL },
-       { 0 },
-};
-
-static const struct omap_clkctrl_bit_data dra7_uart3_bit_data[] __initconst = {
-       { 24, TI_CLK_MUX, dra7_uart6_gfclk_mux_parents, NULL },
-       { 0 },
-};
-
-static const struct omap_clkctrl_bit_data dra7_uart4_bit_data[] __initconst = {
-       { 24, TI_CLK_MUX, dra7_uart6_gfclk_mux_parents, NULL },
-       { 0 },
-};
-
 static const struct omap_clkctrl_bit_data dra7_mcasp2_bit_data[] __initconst = {
        { 22, TI_CLK_MUX, dra7_mcasp1_aux_gfclk_mux_parents, NULL },
        { 24, TI_CLK_MUX, dra7_mcasp1_ahclkx_mux_parents, NULL },
@@ -562,11 +630,6 @@ static const struct omap_clkctrl_bit_data dra7_mcasp3_bit_data[] __initconst = {
        { 0 },
 };
 
-static const struct omap_clkctrl_bit_data dra7_uart5_bit_data[] __initconst = {
-       { 24, TI_CLK_MUX, dra7_uart6_gfclk_mux_parents, NULL },
-       { 0 },
-};
-
 static const struct omap_clkctrl_bit_data dra7_mcasp5_bit_data[] __initconst = {
        { 22, TI_CLK_MUX, dra7_mcasp1_aux_gfclk_mux_parents, NULL },
        { 24, TI_CLK_MUX, dra7_mcasp1_ahclkx_mux_parents, NULL },
@@ -612,64 +675,54 @@ static const struct omap_clkctrl_bit_data dra7_mcasp7_bit_data[] __initconst = {
        { 0 },
 };
 
-static const struct omap_clkctrl_reg_data dra7_l4per_clkctrl_regs[] __initconst = {
-       { DRA7_L4_PER2_CLKCTRL, NULL, 0, "l3_iclk_div", "l4per2_clkdm" },
-       { DRA7_L4_PER3_CLKCTRL, NULL, 0, "l3_iclk_div", "l4per3_clkdm" },
-       { DRA7_TIMER10_CLKCTRL, dra7_timer10_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0028:24" },
-       { DRA7_TIMER11_CLKCTRL, dra7_timer11_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0030:24" },
-       { DRA7_TIMER2_CLKCTRL, dra7_timer2_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0038:24" },
-       { DRA7_TIMER3_CLKCTRL, dra7_timer3_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0040:24" },
-       { DRA7_TIMER4_CLKCTRL, dra7_timer4_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0048:24" },
-       { DRA7_TIMER9_CLKCTRL, dra7_timer9_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0050:24" },
-       { DRA7_ELM_CLKCTRL, NULL, 0, "l3_iclk_div" },
-       { DRA7_GPIO2_CLKCTRL, dra7_gpio2_bit_data, CLKF_HW_SUP, "l3_iclk_div" },
-       { DRA7_GPIO3_CLKCTRL, dra7_gpio3_bit_data, CLKF_HW_SUP, "l3_iclk_div" },
-       { DRA7_GPIO4_CLKCTRL, dra7_gpio4_bit_data, CLKF_HW_SUP, "l3_iclk_div" },
-       { DRA7_GPIO5_CLKCTRL, dra7_gpio5_bit_data, CLKF_HW_SUP, "l3_iclk_div" },
-       { DRA7_GPIO6_CLKCTRL, dra7_gpio6_bit_data, CLKF_HW_SUP, "l3_iclk_div" },
-       { DRA7_HDQ1W_CLKCTRL, NULL, CLKF_SW_SUP, "func_12m_fclk" },
-       { DRA7_EPWMSS1_CLKCTRL, NULL, CLKF_SW_SUP, "l4_root_clk_div", "l4per2_clkdm" },
-       { DRA7_EPWMSS2_CLKCTRL, NULL, CLKF_SW_SUP, "l4_root_clk_div", "l4per2_clkdm" },
-       { DRA7_I2C1_CLKCTRL, NULL, CLKF_SW_SUP, "func_96m_fclk" },
-       { DRA7_I2C2_CLKCTRL, NULL, CLKF_SW_SUP, "func_96m_fclk" },
-       { DRA7_I2C3_CLKCTRL, NULL, CLKF_SW_SUP, "func_96m_fclk" },
-       { DRA7_I2C4_CLKCTRL, NULL, CLKF_SW_SUP, "func_96m_fclk" },
-       { DRA7_L4_PER1_CLKCTRL, NULL, 0, "l3_iclk_div" },
-       { DRA7_EPWMSS0_CLKCTRL, NULL, CLKF_SW_SUP, "l4_root_clk_div", "l4per2_clkdm" },
-       { DRA7_TIMER13_CLKCTRL, dra7_timer13_bit_data, CLKF_SW_SUP, "l4per_cm:clk:00c8:24", "l4per3_clkdm" },
-       { DRA7_TIMER14_CLKCTRL, dra7_timer14_bit_data, CLKF_SW_SUP, "l4per_cm:clk:00d0:24", "l4per3_clkdm" },
-       { DRA7_TIMER15_CLKCTRL, dra7_timer15_bit_data, CLKF_SW_SUP, "l4per_cm:clk:00d8:24", "l4per3_clkdm" },
-       { DRA7_MCSPI1_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" },
-       { DRA7_MCSPI2_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" },
-       { DRA7_MCSPI3_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" },
-       { DRA7_MCSPI4_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" },
-       { DRA7_GPIO7_CLKCTRL, dra7_gpio7_bit_data, CLKF_HW_SUP, "l3_iclk_div" },
-       { DRA7_GPIO8_CLKCTRL, dra7_gpio8_bit_data, CLKF_HW_SUP, "l3_iclk_div" },
-       { DRA7_MMC3_CLKCTRL, dra7_mmc3_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0120:25" },
-       { DRA7_MMC4_CLKCTRL, dra7_mmc4_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0128:25" },
-       { DRA7_TIMER16_CLKCTRL, dra7_timer16_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0130:24", "l4per3_clkdm" },
-       { DRA7_QSPI_CLKCTRL, dra7_qspi_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0138:25", "l4per2_clkdm" },
-       { DRA7_UART1_CLKCTRL, dra7_uart1_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0140:24" },
-       { DRA7_UART2_CLKCTRL, dra7_uart2_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0148:24" },
-       { DRA7_UART3_CLKCTRL, dra7_uart3_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0150:24" },
-       { DRA7_UART4_CLKCTRL, dra7_uart4_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0158:24" },
-       { DRA7_MCASP2_CLKCTRL, dra7_mcasp2_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0160:22", "l4per2_clkdm" },
-       { DRA7_MCASP3_CLKCTRL, dra7_mcasp3_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0168:22", "l4per2_clkdm" },
-       { DRA7_UART5_CLKCTRL, dra7_uart5_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0170:24" },
-       { DRA7_MCASP5_CLKCTRL, dra7_mcasp5_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0178:22", "l4per2_clkdm" },
-       { DRA7_MCASP8_CLKCTRL, dra7_mcasp8_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0190:24", "l4per2_clkdm" },
-       { DRA7_MCASP4_CLKCTRL, dra7_mcasp4_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0198:22", "l4per2_clkdm" },
-       { DRA7_AES1_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div", "l4sec_clkdm" },
-       { DRA7_AES2_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div", "l4sec_clkdm" },
-       { DRA7_DES_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div", "l4sec_clkdm" },
-       { DRA7_RNG_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div", "l4sec_clkdm" },
-       { DRA7_SHAM_CLKCTRL, NULL, CLKF_HW_SUP, "l3_iclk_div", "l4sec_clkdm" },
-       { DRA7_UART7_CLKCTRL, dra7_uart7_bit_data, CLKF_SW_SUP, "l4per_cm:clk:01d0:24", "l4per2_clkdm" },
-       { DRA7_UART8_CLKCTRL, dra7_uart8_bit_data, CLKF_SW_SUP, "l4per_cm:clk:01e0:24", "l4per2_clkdm" },
-       { DRA7_UART9_CLKCTRL, dra7_uart9_bit_data, CLKF_SW_SUP, "l4per_cm:clk:01e8:24", "l4per2_clkdm" },
-       { DRA7_DCAN2_CLKCTRL, NULL, CLKF_SW_SUP, "sys_clkin1", "l4per2_clkdm" },
-       { DRA7_MCASP6_CLKCTRL, dra7_mcasp6_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0204:22", "l4per2_clkdm" },
-       { DRA7_MCASP7_CLKCTRL, dra7_mcasp7_bit_data, CLKF_SW_SUP, "l4per_cm:clk:0208:22", "l4per2_clkdm" },
+static const struct omap_clkctrl_reg_data dra7_l4per2_clkctrl_regs[] __initconst = {
+       { DRA7_L4PER2_L4_PER2_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_L4PER2_PRUSS1_CLKCTRL, NULL, CLKF_SW_SUP, "" },
+       { DRA7_L4PER2_PRUSS2_CLKCTRL, NULL, CLKF_SW_SUP, "" },
+       { DRA7_L4PER2_EPWMSS1_CLKCTRL, NULL, CLKF_SW_SUP, "l4_root_clk_div" },
+       { DRA7_L4PER2_EPWMSS2_CLKCTRL, NULL, CLKF_SW_SUP, "l4_root_clk_div" },
+       { DRA7_L4PER2_EPWMSS0_CLKCTRL, NULL, CLKF_SW_SUP, "l4_root_clk_div" },
+       { DRA7_L4PER2_QSPI_CLKCTRL, dra7_qspi_bit_data, CLKF_SW_SUP, "l4per2-clkctrl:012c:25" },
+       { DRA7_L4PER2_MCASP2_CLKCTRL, dra7_mcasp2_bit_data, CLKF_SW_SUP, "l4per2-clkctrl:0154:22" },
+       { DRA7_L4PER2_MCASP3_CLKCTRL, dra7_mcasp3_bit_data, CLKF_SW_SUP, "l4per2-clkctrl:015c:22" },
+       { DRA7_L4PER2_MCASP5_CLKCTRL, dra7_mcasp5_bit_data, CLKF_SW_SUP, "l4per2-clkctrl:016c:22" },
+       { DRA7_L4PER2_MCASP8_CLKCTRL, dra7_mcasp8_bit_data, CLKF_SW_SUP, "l4per2-clkctrl:0184:24" },
+       { DRA7_L4PER2_MCASP4_CLKCTRL, dra7_mcasp4_bit_data, CLKF_SW_SUP, "l4per2-clkctrl:018c:22" },
+       { DRA7_L4PER2_UART7_CLKCTRL, dra7_uart7_bit_data, CLKF_SW_SUP, "l4per2-clkctrl:01c4:24" },
+       { DRA7_L4PER2_UART8_CLKCTRL, dra7_uart8_bit_data, CLKF_SW_SUP, "l4per2-clkctrl:01d4:24" },
+       { DRA7_L4PER2_UART9_CLKCTRL, dra7_uart9_bit_data, CLKF_SW_SUP, "l4per2-clkctrl:01dc:24" },
+       { DRA7_L4PER2_DCAN2_CLKCTRL, NULL, CLKF_SW_SUP, "sys_clkin1" },
+       { DRA7_L4PER2_MCASP6_CLKCTRL, dra7_mcasp6_bit_data, CLKF_SW_SUP, "l4per2-clkctrl:01f8:22" },
+       { DRA7_L4PER2_MCASP7_CLKCTRL, dra7_mcasp7_bit_data, CLKF_SW_SUP, "l4per2-clkctrl:01fc:22" },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_timer13_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_timer10_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_timer14_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_timer10_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_timer15_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_timer10_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_bit_data dra7_timer16_bit_data[] __initconst = {
+       { 24, TI_CLK_MUX, dra7_timer10_gfclk_mux_parents, NULL },
+       { 0 },
+};
+
+static const struct omap_clkctrl_reg_data dra7_l4per3_clkctrl_regs[] __initconst = {
+       { DRA7_L4PER3_L4_PER3_CLKCTRL, NULL, 0, "l3_iclk_div" },
+       { DRA7_L4PER3_TIMER13_CLKCTRL, dra7_timer13_bit_data, CLKF_SW_SUP, "l4per3-clkctrl:00b4:24" },
+       { DRA7_L4PER3_TIMER14_CLKCTRL, dra7_timer14_bit_data, CLKF_SW_SUP, "l4per3-clkctrl:00bc:24" },
+       { DRA7_L4PER3_TIMER15_CLKCTRL, dra7_timer15_bit_data, CLKF_SW_SUP, "l4per3-clkctrl:00c4:24" },
+       { DRA7_L4PER3_TIMER16_CLKCTRL, dra7_timer16_bit_data, CLKF_SW_SUP, "l4per3-clkctrl:011c:24" },
        { 0 },
 };
 
@@ -700,24 +753,28 @@ static const struct omap_clkctrl_bit_data dra7_dcan1_bit_data[] __initconst = {
 };
 
 static const struct omap_clkctrl_reg_data dra7_wkupaon_clkctrl_regs[] __initconst = {
-       { DRA7_L4_WKUP_CLKCTRL, NULL, 0, "wkupaon_iclk_mux" },
-       { DRA7_WD_TIMER2_CLKCTRL, NULL, CLKF_SW_SUP, "sys_32k_ck" },
-       { DRA7_GPIO1_CLKCTRL, dra7_gpio1_bit_data, CLKF_HW_SUP, "wkupaon_iclk_mux" },
-       { DRA7_TIMER1_CLKCTRL, dra7_timer1_bit_data, CLKF_SW_SUP, "wkupaon_cm:clk:0020:24" },
-       { DRA7_TIMER12_CLKCTRL, NULL, 0, "secure_32k_clk_src_ck" },
-       { DRA7_COUNTER_32K_CLKCTRL, NULL, 0, "wkupaon_iclk_mux" },
-       { DRA7_UART10_CLKCTRL, dra7_uart10_bit_data, CLKF_SW_SUP, "wkupaon_cm:clk:0060:24" },
-       { DRA7_DCAN1_CLKCTRL, dra7_dcan1_bit_data, CLKF_SW_SUP, "wkupaon_cm:clk:0068:24" },
-       { DRA7_ADC_CLKCTRL, NULL, CLKF_SW_SUP, "mcan_clk"},
+       { DRA7_WKUPAON_L4_WKUP_CLKCTRL, NULL, 0, "wkupaon_iclk_mux" },
+       { DRA7_WKUPAON_WD_TIMER2_CLKCTRL, NULL, CLKF_SW_SUP, "sys_32k_ck" },
+       { DRA7_WKUPAON_GPIO1_CLKCTRL, dra7_gpio1_bit_data, CLKF_HW_SUP, "wkupaon_iclk_mux" },
+       { DRA7_WKUPAON_TIMER1_CLKCTRL, dra7_timer1_bit_data, CLKF_SW_SUP, "wkupaon-clkctrl:0020:24" },
+       { DRA7_WKUPAON_TIMER12_CLKCTRL, NULL, 0, "secure_32k_clk_src_ck" },
+       { DRA7_WKUPAON_COUNTER_32K_CLKCTRL, NULL, 0, "wkupaon_iclk_mux" },
+       { DRA7_WKUPAON_UART10_CLKCTRL, dra7_uart10_bit_data, CLKF_SW_SUP, "wkupaon-clkctrl:0060:24" },
+       { DRA7_WKUPAON_DCAN1_CLKCTRL, dra7_dcan1_bit_data, CLKF_SW_SUP, "wkupaon-clkctrl:0068:24" },
+       { DRA7_WKUPAON_ADC_CLKCTRL, NULL, CLKF_SW_SUP, "mcan_clk" },
        { 0 },
 };
 
 const struct omap_clkctrl_data dra7_clkctrl_data[] __initconst = {
        { 0x4a005320, dra7_mpu_clkctrl_regs },
-       { 0x4a005540, dra7_ipu_clkctrl_regs },
-       { 0x4a005740, dra7_rtc_clkctrl_regs },
+       { 0x4a005420, dra7_dsp1_clkctrl_regs },
+       { 0x4a005520, dra7_ipu1_clkctrl_regs },
+       { 0x4a005550, dra7_ipu_clkctrl_regs },
+       { 0x4a005620, dra7_dsp2_clkctrl_regs },
+       { 0x4a005720, dra7_rtc_clkctrl_regs },
        { 0x4a008620, dra7_coreaon_clkctrl_regs },
        { 0x4a008720, dra7_l3main1_clkctrl_regs },
+       { 0x4a008920, dra7_ipu2_clkctrl_regs },
        { 0x4a008a20, dra7_dma_clkctrl_regs },
        { 0x4a008b20, dra7_emif_clkctrl_regs },
        { 0x4a008c00, dra7_atl_clkctrl_regs },
@@ -725,7 +782,12 @@ const struct omap_clkctrl_data dra7_clkctrl_data[] __initconst = {
        { 0x4a008e20, dra7_l3instr_clkctrl_regs },
        { 0x4a009120, dra7_dss_clkctrl_regs },
        { 0x4a009320, dra7_l3init_clkctrl_regs },
-       { 0x4a009700, dra7_l4per_clkctrl_regs },
+       { 0x4a0093b0, dra7_pcie_clkctrl_regs },
+       { 0x4a0093d0, dra7_gmac_clkctrl_regs },
+       { 0x4a009728, dra7_l4per_clkctrl_regs },
+       { 0x4a0098a0, dra7_l4sec_clkctrl_regs },
+       { 0x4a00970c, dra7_l4per2_clkctrl_regs },
+       { 0x4a009714, dra7_l4per3_clkctrl_regs },
        { 0x4ae07820, dra7_wkupaon_clkctrl_regs },
        { 0 },
 };
@@ -734,91 +796,92 @@ static struct ti_dt_clk dra7xx_clks[] = {
        DT_CLK(NULL, "timer_32k_ck", "sys_32k_ck"),
        DT_CLK(NULL, "sys_clkin_ck", "timer_sys_clk_div"),
        DT_CLK(NULL, "sys_clkin", "sys_clkin1"),
-       DT_CLK(NULL, "atl_dpll_clk_mux", "atl_cm:0000:24"),
-       DT_CLK(NULL, "atl_gfclk_mux", "atl_cm:0000:26"),
-       DT_CLK(NULL, "dcan1_sys_clk_mux", "wkupaon_cm:0068:24"),
-       DT_CLK(NULL, "dss_32khz_clk", "dss_cm:0000:11"),
-       DT_CLK(NULL, "dss_48mhz_clk", "dss_cm:0000:9"),
-       DT_CLK(NULL, "dss_dss_clk", "dss_cm:0000:8"),
-       DT_CLK(NULL, "dss_hdmi_clk", "dss_cm:0000:10"),
-       DT_CLK(NULL, "dss_video1_clk", "dss_cm:0000:12"),
-       DT_CLK(NULL, "dss_video2_clk", "dss_cm:0000:13"),
-       DT_CLK(NULL, "gmac_rft_clk_mux", "l3init_cm:00b0:25"),
-       DT_CLK(NULL, "gpio1_dbclk", "wkupaon_cm:0018:8"),
-       DT_CLK(NULL, "gpio2_dbclk", "l4per_cm:0060:8"),
-       DT_CLK(NULL, "gpio3_dbclk", "l4per_cm:0068:8"),
-       DT_CLK(NULL, "gpio4_dbclk", "l4per_cm:0070:8"),
-       DT_CLK(NULL, "gpio5_dbclk", "l4per_cm:0078:8"),
-       DT_CLK(NULL, "gpio6_dbclk", "l4per_cm:0080:8"),
-       DT_CLK(NULL, "gpio7_dbclk", "l4per_cm:0110:8"),
-       DT_CLK(NULL, "gpio8_dbclk", "l4per_cm:0118:8"),
-       DT_CLK(NULL, "mcasp1_ahclkr_mux", "ipu_cm:0010:28"),
-       DT_CLK(NULL, "mcasp1_ahclkx_mux", "ipu_cm:0010:24"),
-       DT_CLK(NULL, "mcasp1_aux_gfclk_mux", "ipu_cm:0010:22"),
-       DT_CLK(NULL, "mcasp2_ahclkr_mux", "l4per_cm:0160:28"),
-       DT_CLK(NULL, "mcasp2_ahclkx_mux", "l4per_cm:0160:24"),
-       DT_CLK(NULL, "mcasp2_aux_gfclk_mux", "l4per_cm:0160:22"),
-       DT_CLK(NULL, "mcasp3_ahclkx_mux", "l4per_cm:0168:24"),
-       DT_CLK(NULL, "mcasp3_aux_gfclk_mux", "l4per_cm:0168:22"),
-       DT_CLK(NULL, "mcasp4_ahclkx_mux", "l4per_cm:0198:24"),
-       DT_CLK(NULL, "mcasp4_aux_gfclk_mux", "l4per_cm:0198:22"),
-       DT_CLK(NULL, "mcasp5_ahclkx_mux", "l4per_cm:0178:24"),
-       DT_CLK(NULL, "mcasp5_aux_gfclk_mux", "l4per_cm:0178:22"),
-       DT_CLK(NULL, "mcasp6_ahclkx_mux", "l4per_cm:0204:24"),
-       DT_CLK(NULL, "mcasp6_aux_gfclk_mux", "l4per_cm:0204:22"),
-       DT_CLK(NULL, "mcasp7_ahclkx_mux", "l4per_cm:0208:24"),
-       DT_CLK(NULL, "mcasp7_aux_gfclk_mux", "l4per_cm:0208:22"),
-       DT_CLK(NULL, "mcasp8_ahclkx_mux", "l4per_cm:0190:22"),
-       DT_CLK(NULL, "mcasp8_aux_gfclk_mux", "l4per_cm:0190:24"),
-       DT_CLK(NULL, "mmc1_clk32k", "l3init_cm:0008:8"),
-       DT_CLK(NULL, "mmc1_fclk_div", "l3init_cm:0008:25"),
-       DT_CLK(NULL, "mmc1_fclk_mux", "l3init_cm:0008:24"),
-       DT_CLK(NULL, "mmc2_clk32k", "l3init_cm:0010:8"),
-       DT_CLK(NULL, "mmc2_fclk_div", "l3init_cm:0010:25"),
-       DT_CLK(NULL, "mmc2_fclk_mux", "l3init_cm:0010:24"),
-       DT_CLK(NULL, "mmc3_clk32k", "l4per_cm:0120:8"),
-       DT_CLK(NULL, "mmc3_gfclk_div", "l4per_cm:0120:25"),
-       DT_CLK(NULL, "mmc3_gfclk_mux", "l4per_cm:0120:24"),
-       DT_CLK(NULL, "mmc4_clk32k", "l4per_cm:0128:8"),
-       DT_CLK(NULL, "mmc4_gfclk_div", "l4per_cm:0128:25"),
-       DT_CLK(NULL, "mmc4_gfclk_mux", "l4per_cm:0128:24"),
-       DT_CLK(NULL, "optfclk_pciephy1_32khz", "l3init_cm:0090:8"),
-       DT_CLK(NULL, "optfclk_pciephy1_clk", "l3init_cm:0090:9"),
-       DT_CLK(NULL, "optfclk_pciephy1_div_clk", "l3init_cm:0090:10"),
-       DT_CLK(NULL, "optfclk_pciephy2_32khz", "l3init_cm:0098:8"),
-       DT_CLK(NULL, "optfclk_pciephy2_clk", "l3init_cm:0098:9"),
-       DT_CLK(NULL, "optfclk_pciephy2_div_clk", "l3init_cm:0098:10"),
-       DT_CLK(NULL, "qspi_gfclk_div", "l4per_cm:0138:25"),
-       DT_CLK(NULL, "qspi_gfclk_mux", "l4per_cm:0138:24"),
-       DT_CLK(NULL, "rmii_50mhz_clk_mux", "l3init_cm:00b0:24"),
-       DT_CLK(NULL, "sata_ref_clk", "l3init_cm:0068:8"),
-       DT_CLK(NULL, "timer10_gfclk_mux", "l4per_cm:0028:24"),
-       DT_CLK(NULL, "timer11_gfclk_mux", "l4per_cm:0030:24"),
-       DT_CLK(NULL, "timer13_gfclk_mux", "l4per_cm:00c8:24"),
-       DT_CLK(NULL, "timer14_gfclk_mux", "l4per_cm:00d0:24"),
-       DT_CLK(NULL, "timer15_gfclk_mux", "l4per_cm:00d8:24"),
-       DT_CLK(NULL, "timer16_gfclk_mux", "l4per_cm:0130:24"),
-       DT_CLK(NULL, "timer1_gfclk_mux", "wkupaon_cm:0020:24"),
-       DT_CLK(NULL, "timer2_gfclk_mux", "l4per_cm:0038:24"),
-       DT_CLK(NULL, "timer3_gfclk_mux", "l4per_cm:0040:24"),
-       DT_CLK(NULL, "timer4_gfclk_mux", "l4per_cm:0048:24"),
-       DT_CLK(NULL, "timer5_gfclk_mux", "ipu_cm:0018:24"),
-       DT_CLK(NULL, "timer6_gfclk_mux", "ipu_cm:0020:24"),
-       DT_CLK(NULL, "timer7_gfclk_mux", "ipu_cm:0028:24"),
-       DT_CLK(NULL, "timer8_gfclk_mux", "ipu_cm:0030:24"),
-       DT_CLK(NULL, "timer9_gfclk_mux", "l4per_cm:0050:24"),
-       DT_CLK(NULL, "uart10_gfclk_mux", "wkupaon_cm:0060:24"),
-       DT_CLK(NULL, "uart1_gfclk_mux", "l4per_cm:0140:24"),
-       DT_CLK(NULL, "uart2_gfclk_mux", "l4per_cm:0148:24"),
-       DT_CLK(NULL, "uart3_gfclk_mux", "l4per_cm:0150:24"),
-       DT_CLK(NULL, "uart4_gfclk_mux", "l4per_cm:0158:24"),
-       DT_CLK(NULL, "uart5_gfclk_mux", "l4per_cm:0170:24"),
-       DT_CLK(NULL, "uart6_gfclk_mux", "ipu_cm:0040:24"),
-       DT_CLK(NULL, "uart7_gfclk_mux", "l4per_cm:01d0:24"),
-       DT_CLK(NULL, "uart8_gfclk_mux", "l4per_cm:01e0:24"),
-       DT_CLK(NULL, "uart9_gfclk_mux", "l4per_cm:01e8:24"),
-       DT_CLK(NULL, "usb_otg_ss1_refclk960m", "l3init_cm:00d0:8"),
-       DT_CLK(NULL, "usb_otg_ss2_refclk960m", "l3init_cm:0020:8"),
+       DT_CLK(NULL, "atl_dpll_clk_mux", "atl-clkctrl:0000:24"),
+       DT_CLK(NULL, "atl_gfclk_mux", "atl-clkctrl:0000:26"),
+       DT_CLK(NULL, "dcan1_sys_clk_mux", "wkupaon-clkctrl:0068:24"),
+       DT_CLK(NULL, "dss_32khz_clk", "dss-clkctrl:0000:11"),
+       DT_CLK(NULL, "dss_48mhz_clk", "dss-clkctrl:0000:9"),
+       DT_CLK(NULL, "dss_dss_clk", "dss-clkctrl:0000:8"),
+       DT_CLK(NULL, "dss_hdmi_clk", "dss-clkctrl:0000:10"),
+       DT_CLK(NULL, "dss_video1_clk", "dss-clkctrl:0000:12"),
+       DT_CLK(NULL, "dss_video2_clk", "dss-clkctrl:0000:13"),
+       DT_CLK(NULL, "gmac_rft_clk_mux", "gmac-clkctrl:0000:25"),
+       DT_CLK(NULL, "gpio1_dbclk", "wkupaon-clkctrl:0018:8"),
+       DT_CLK(NULL, "gpio2_dbclk", "l4per-clkctrl:0038:8"),
+       DT_CLK(NULL, "gpio3_dbclk", "l4per-clkctrl:0040:8"),
+       DT_CLK(NULL, "gpio4_dbclk", "l4per-clkctrl:0048:8"),
+       DT_CLK(NULL, "gpio5_dbclk", "l4per-clkctrl:0050:8"),
+       DT_CLK(NULL, "gpio6_dbclk", "l4per-clkctrl:0058:8"),
+       DT_CLK(NULL, "gpio7_dbclk", "l4per-clkctrl:00e8:8"),
+       DT_CLK(NULL, "gpio8_dbclk", "l4per-clkctrl:00f0:8"),
+       DT_CLK(NULL, "ipu1_gfclk_mux", "ipu1-clkctrl:0000:24"),
+       DT_CLK(NULL, "mcasp1_ahclkr_mux", "ipu-clkctrl:0000:28"),
+       DT_CLK(NULL, "mcasp1_ahclkx_mux", "ipu-clkctrl:0000:24"),
+       DT_CLK(NULL, "mcasp1_aux_gfclk_mux", "ipu-clkctrl:0000:22"),
+       DT_CLK(NULL, "mcasp2_ahclkr_mux", "l4per2-clkctrl:0154:28"),
+       DT_CLK(NULL, "mcasp2_ahclkx_mux", "l4per2-clkctrl:0154:24"),
+       DT_CLK(NULL, "mcasp2_aux_gfclk_mux", "l4per2-clkctrl:0154:22"),
+       DT_CLK(NULL, "mcasp3_ahclkx_mux", "l4per2-clkctrl:015c:24"),
+       DT_CLK(NULL, "mcasp3_aux_gfclk_mux", "l4per2-clkctrl:015c:22"),
+       DT_CLK(NULL, "mcasp4_ahclkx_mux", "l4per2-clkctrl:018c:24"),
+       DT_CLK(NULL, "mcasp4_aux_gfclk_mux", "l4per2-clkctrl:018c:22"),
+       DT_CLK(NULL, "mcasp5_ahclkx_mux", "l4per2-clkctrl:016c:24"),
+       DT_CLK(NULL, "mcasp5_aux_gfclk_mux", "l4per2-clkctrl:016c:22"),
+       DT_CLK(NULL, "mcasp6_ahclkx_mux", "l4per2-clkctrl:01f8:24"),
+       DT_CLK(NULL, "mcasp6_aux_gfclk_mux", "l4per2-clkctrl:01f8:22"),
+       DT_CLK(NULL, "mcasp7_ahclkx_mux", "l4per2-clkctrl:01fc:24"),
+       DT_CLK(NULL, "mcasp7_aux_gfclk_mux", "l4per2-clkctrl:01fc:22"),
+       DT_CLK(NULL, "mcasp8_ahclkx_mux", "l4per2-clkctrl:0184:22"),
+       DT_CLK(NULL, "mcasp8_aux_gfclk_mux", "l4per2-clkctrl:0184:24"),
+       DT_CLK(NULL, "mmc1_clk32k", "l3init-clkctrl:0008:8"),
+       DT_CLK(NULL, "mmc1_fclk_div", "l3init-clkctrl:0008:25"),
+       DT_CLK(NULL, "mmc1_fclk_mux", "l3init-clkctrl:0008:24"),
+       DT_CLK(NULL, "mmc2_clk32k", "l3init-clkctrl:0010:8"),
+       DT_CLK(NULL, "mmc2_fclk_div", "l3init-clkctrl:0010:25"),
+       DT_CLK(NULL, "mmc2_fclk_mux", "l3init-clkctrl:0010:24"),
+       DT_CLK(NULL, "mmc3_clk32k", "l4per-clkctrl:00f8:8"),
+       DT_CLK(NULL, "mmc3_gfclk_div", "l4per-clkctrl:00f8:25"),
+       DT_CLK(NULL, "mmc3_gfclk_mux", "l4per-clkctrl:00f8:24"),
+       DT_CLK(NULL, "mmc4_clk32k", "l4per-clkctrl:0100:8"),
+       DT_CLK(NULL, "mmc4_gfclk_div", "l4per-clkctrl:0100:25"),
+       DT_CLK(NULL, "mmc4_gfclk_mux", "l4per-clkctrl:0100:24"),
+       DT_CLK(NULL, "optfclk_pciephy1_32khz", "pcie-clkctrl:0000:8"),
+       DT_CLK(NULL, "optfclk_pciephy1_clk", "pcie-clkctrl:0000:9"),
+       DT_CLK(NULL, "optfclk_pciephy1_div_clk", "pcie-clkctrl:0000:10"),
+       DT_CLK(NULL, "optfclk_pciephy2_32khz", "pcie-clkctrl:0008:8"),
+       DT_CLK(NULL, "optfclk_pciephy2_clk", "pcie-clkctrl:0008:9"),
+       DT_CLK(NULL, "optfclk_pciephy2_div_clk", "pcie-clkctrl:0008:10"),
+       DT_CLK(NULL, "qspi_gfclk_div", "l4per2-clkctrl:012c:25"),
+       DT_CLK(NULL, "qspi_gfclk_mux", "l4per2-clkctrl:012c:24"),
+       DT_CLK(NULL, "rmii_50mhz_clk_mux", "gmac-clkctrl:0000:24"),
+       DT_CLK(NULL, "sata_ref_clk", "l3init-clkctrl:0068:8"),
+       DT_CLK(NULL, "timer10_gfclk_mux", "l4per-clkctrl:0000:24"),
+       DT_CLK(NULL, "timer11_gfclk_mux", "l4per-clkctrl:0008:24"),
+       DT_CLK(NULL, "timer13_gfclk_mux", "l4per3-clkctrl:00b4:24"),
+       DT_CLK(NULL, "timer14_gfclk_mux", "l4per3-clkctrl:00bc:24"),
+       DT_CLK(NULL, "timer15_gfclk_mux", "l4per3-clkctrl:00c4:24"),
+       DT_CLK(NULL, "timer16_gfclk_mux", "l4per3-clkctrl:011c:24"),
+       DT_CLK(NULL, "timer1_gfclk_mux", "wkupaon-clkctrl:0020:24"),
+       DT_CLK(NULL, "timer2_gfclk_mux", "l4per-clkctrl:0010:24"),
+       DT_CLK(NULL, "timer3_gfclk_mux", "l4per-clkctrl:0018:24"),
+       DT_CLK(NULL, "timer4_gfclk_mux", "l4per-clkctrl:0020:24"),
+       DT_CLK(NULL, "timer5_gfclk_mux", "ipu-clkctrl:0008:24"),
+       DT_CLK(NULL, "timer6_gfclk_mux", "ipu-clkctrl:0010:24"),
+       DT_CLK(NULL, "timer7_gfclk_mux", "ipu-clkctrl:0018:24"),
+       DT_CLK(NULL, "timer8_gfclk_mux", "ipu-clkctrl:0020:24"),
+       DT_CLK(NULL, "timer9_gfclk_mux", "l4per-clkctrl:0028:24"),
+       DT_CLK(NULL, "uart10_gfclk_mux", "wkupaon-clkctrl:0060:24"),
+       DT_CLK(NULL, "uart1_gfclk_mux", "l4per-clkctrl:0118:24"),
+       DT_CLK(NULL, "uart2_gfclk_mux", "l4per-clkctrl:0120:24"),
+       DT_CLK(NULL, "uart3_gfclk_mux", "l4per-clkctrl:0128:24"),
+       DT_CLK(NULL, "uart4_gfclk_mux", "l4per-clkctrl:0130:24"),
+       DT_CLK(NULL, "uart5_gfclk_mux", "l4per-clkctrl:0148:24"),
+       DT_CLK(NULL, "uart6_gfclk_mux", "ipu-clkctrl:0030:24"),
+       DT_CLK(NULL, "uart7_gfclk_mux", "l4per2-clkctrl:01c4:24"),
+       DT_CLK(NULL, "uart8_gfclk_mux", "l4per2-clkctrl:01d4:24"),
+       DT_CLK(NULL, "uart9_gfclk_mux", "l4per2-clkctrl:01dc:24"),
+       DT_CLK(NULL, "usb_otg_ss1_refclk960m", "l3init-clkctrl:00d0:8"),
+       DT_CLK(NULL, "usb_otg_ss2_refclk960m", "l3init-clkctrl:0020:8"),
        { .node_name = NULL },
 };
 
@@ -827,7 +890,10 @@ int __init dra7xx_dt_clk_init(void)
        int rc;
        struct clk *dpll_ck, *hdcp_ck;
 
-       ti_dt_clocks_register(dra7xx_clks);
+       if (ti_clk_get_features()->flags & TI_CLK_CLKCTRL_COMPAT)
+               ti_dt_clocks_register(dra7xx_compat_clks);
+       else
+               ti_dt_clocks_register(dra7xx_clks);
 
        omap2_clk_disable_autoidle_all();
 
index 14881547043130d1e686055387a6276e49fd11f9..a01ca9395179a77c9f0c620e5389fe98b1d0fba3 100644 (file)
@@ -190,8 +190,8 @@ static void __init of_dra7_atl_clock_setup(struct device_node *node)
        init.num_parents = of_clk_get_parent_count(node);
 
        if (init.num_parents != 1) {
-               pr_err("%s: atl clock %s must have 1 parent\n", __func__,
-                      node->name);
+               pr_err("%s: atl clock %pOFn must have 1 parent\n", __func__,
+                      node);
                goto cleanup;
        }
 
index 7d22e1af224770d7084cd7d8ec29e24d3f87368f..1c690e57a3f16a39313603716a6900b3537648af 100644 (file)
@@ -34,7 +34,7 @@
 struct ti_clk_ll_ops *ti_clk_ll_ops;
 static struct device_node *clocks_node_ptr[CLK_MAX_MEMMAPS];
 
-static struct ti_clk_features ti_clk_features;
+struct ti_clk_features ti_clk_features;
 
 struct clk_iomap {
        struct regmap *regmap;
@@ -129,7 +129,7 @@ int ti_clk_setup_ll_ops(struct ti_clk_ll_ops *ops)
 void __init ti_dt_clocks_register(struct ti_dt_clk oclks[])
 {
        struct ti_dt_clk *c;
-       struct device_node *node;
+       struct device_node *node, *parent;
        struct clk *clk;
        struct of_phandle_args clkspec;
        char buf[64];
@@ -140,6 +140,9 @@ void __init ti_dt_clocks_register(struct ti_dt_clk oclks[])
        int ret;
        static bool clkctrl_nodes_missing;
        static bool has_clkctrl_data;
+       static bool compat_mode;
+
+       compat_mode = ti_clk_get_features()->flags & TI_CLK_CLKCTRL_COMPAT;
 
        for (c = oclks; c->node_name != NULL; c++) {
                strcpy(buf, c->node_name);
@@ -164,8 +167,12 @@ void __init ti_dt_clocks_register(struct ti_dt_clk oclks[])
                        continue;
 
                node = of_find_node_by_name(NULL, buf);
-               if (num_args)
-                       node = of_find_node_by_name(node, "clk");
+               if (num_args && compat_mode) {
+                       parent = node;
+                       node = of_get_child_by_name(parent, "clk");
+                       of_node_put(parent);
+               }
+
                clkspec.np = node;
                clkspec.args_count = num_args;
                for (i = 0; i < num_args; i++) {
@@ -173,11 +180,12 @@ void __init ti_dt_clocks_register(struct ti_dt_clk oclks[])
                        if (ret) {
                                pr_warn("Bad tag in %s at %d: %s\n",
                                        c->node_name, i, tags[i]);
+                               of_node_put(node);
                                return;
                        }
                }
                clk = of_clk_get_from_provider(&clkspec);
-
+               of_node_put(node);
                if (!IS_ERR(clk)) {
                        c->lk.clk = clk;
                        clkdev_add(&c->lk);
@@ -223,7 +231,7 @@ int __init ti_clk_retry_init(struct device_node *node, void *user,
 {
        struct clk_init_item *retry;
 
-       pr_debug("%s: adding to retry list...\n", node->name);
+       pr_debug("%pOFn: adding to retry list...\n", node);
        retry = kzalloc(sizeof(*retry), GFP_KERNEL);
        if (!retry)
                return -ENOMEM;
@@ -258,14 +266,14 @@ int ti_clk_get_reg_addr(struct device_node *node, int index,
        }
 
        if (i == CLK_MAX_MEMMAPS) {
-               pr_err("clk-provider not found for %s!\n", node->name);
+               pr_err("clk-provider not found for %pOFn!\n", node);
                return -ENOENT;
        }
 
        reg->index = i;
 
        if (of_property_read_u32_index(node, "reg", index, &val)) {
-               pr_err("%s must have reg[%d]!\n", node->name, index);
+               pr_err("%pOFn must have reg[%d]!\n", node, index);
                return -EINVAL;
        }
 
@@ -312,7 +320,7 @@ int __init omap2_clk_provider_init(struct device_node *parent, int index,
        /* get clocks for this parent */
        clocks = of_get_child_by_name(parent, "clocks");
        if (!clocks) {
-               pr_err("%s missing 'clocks' child node.\n", parent->name);
+               pr_err("%pOFn missing 'clocks' child node.\n", parent);
                return -EINVAL;
        }
 
@@ -365,7 +373,7 @@ void ti_dt_clk_init_retry_clks(void)
 
        while (!list_empty(&retry_list) && retries) {
                list_for_each_entry_safe(retry, tmp, &retry_list, link) {
-                       pr_debug("retry-init: %s\n", retry->node->name);
+                       pr_debug("retry-init: %pOFn\n", retry->node);
                        retry->func(retry->user, retry->node);
                        list_del(&retry->link);
                        kfree(retry);
index 421b0539222058354d94ae6c29347d03b02ddd93..469f560ae1cf7c779a75d4d18dc30e0883e1d340 100644 (file)
@@ -259,8 +259,13 @@ _ti_clkctrl_clk_register(struct omap_clkctrl_provider *provider,
        struct omap_clkctrl_clk *clkctrl_clk;
        int ret = 0;
 
-       init.name = kasprintf(GFP_KERNEL, "%s:%s:%04x:%d", node->parent->name,
-                             node->name, offset, bit);
+       if (ti_clk_get_features()->flags & TI_CLK_CLKCTRL_COMPAT)
+               init.name = kasprintf(GFP_KERNEL, "%pOFn:%pOFn:%04x:%d",
+                                     node->parent, node, offset,
+                                     bit);
+       else
+               init.name = kasprintf(GFP_KERNEL, "%pOFn:%04x:%d", node,
+                                     offset, bit);
        clkctrl_clk = kzalloc(sizeof(*clkctrl_clk), GFP_KERNEL);
        if (!init.name || !clkctrl_clk) {
                ret = -ENOMEM;
@@ -440,6 +445,11 @@ static void __init _ti_omap4_clkctrl_setup(struct device_node *node)
        const __be32 *addrp;
        u32 addr;
        int ret;
+       char *c;
+
+       if (!(ti_clk_get_features()->flags & TI_CLK_CLKCTRL_COMPAT) &&
+           !strcmp(node->name, "clk"))
+               ti_clk_features.flags |= TI_CLK_CLKCTRL_COMPAT;
 
        addrp = of_get_address(node, 0, NULL, NULL);
        addr = (u32)of_translate_address(node, addrp);
@@ -453,18 +463,35 @@ static void __init _ti_omap4_clkctrl_setup(struct device_node *node)
                data = omap5_clkctrl_data;
 #endif
 #ifdef CONFIG_SOC_DRA7XX
-       if (of_machine_is_compatible("ti,dra7"))
-               data = dra7_clkctrl_data;
+       if (of_machine_is_compatible("ti,dra7")) {
+               if (ti_clk_get_features()->flags & TI_CLK_CLKCTRL_COMPAT)
+                       data = dra7_clkctrl_compat_data;
+               else
+                       data = dra7_clkctrl_data;
+       }
 #endif
 #ifdef CONFIG_SOC_AM33XX
-       if (of_machine_is_compatible("ti,am33xx"))
-               data = am3_clkctrl_data;
+       if (of_machine_is_compatible("ti,am33xx")) {
+               if (ti_clk_get_features()->flags & TI_CLK_CLKCTRL_COMPAT)
+                       data = am3_clkctrl_compat_data;
+               else
+                       data = am3_clkctrl_data;
+       }
 #endif
 #ifdef CONFIG_SOC_AM43XX
-       if (of_machine_is_compatible("ti,am4372"))
-               data = am4_clkctrl_data;
-       if (of_machine_is_compatible("ti,am438x"))
-               data = am438x_clkctrl_data;
+       if (of_machine_is_compatible("ti,am4372")) {
+               if (ti_clk_get_features()->flags & TI_CLK_CLKCTRL_COMPAT)
+                       data = am4_clkctrl_compat_data;
+               else
+                       data = am4_clkctrl_data;
+       }
+
+       if (of_machine_is_compatible("ti,am438x")) {
+               if (ti_clk_get_features()->flags & TI_CLK_CLKCTRL_COMPAT)
+                       data = am438x_clkctrl_compat_data;
+               else
+                       data = am438x_clkctrl_data;
+       }
 #endif
 #ifdef CONFIG_SOC_TI81XX
        if (of_machine_is_compatible("ti,dm814"))
@@ -492,21 +519,43 @@ static void __init _ti_omap4_clkctrl_setup(struct device_node *node)
 
        provider->base = of_iomap(node, 0);
 
-       provider->clkdm_name = kmalloc(strlen(node->parent->name) + 3,
-                                      GFP_KERNEL);
-       if (!provider->clkdm_name) {
-               kfree(provider);
-               return;
+       if (ti_clk_get_features()->flags & TI_CLK_CLKCTRL_COMPAT) {
+               provider->clkdm_name = kasprintf(GFP_KERNEL, "%pOFnxxx", node->parent);
+               if (!provider->clkdm_name) {
+                       kfree(provider);
+                       return;
+               }
+
+               /*
+                * Create default clkdm name, replace _cm from end of parent
+                * node name with _clkdm
+                */
+               provider->clkdm_name[strlen(provider->clkdm_name) - 5] = 0;
+       } else {
+               provider->clkdm_name = kasprintf(GFP_KERNEL, "%pOFn", node);
+               if (!provider->clkdm_name) {
+                       kfree(provider);
+                       return;
+               }
+
+               /*
+                * Create default clkdm name, replace _clkctrl from end of
+                * node name with _clkdm
+                */
+               provider->clkdm_name[strlen(provider->clkdm_name) - 7] = 0;
        }
 
-       /*
-        * Create default clkdm name, replace _cm from end of parent node
-        * name with _clkdm
-        */
-       strcpy(provider->clkdm_name, node->parent->name);
-       provider->clkdm_name[strlen(provider->clkdm_name) - 2] = 0;
        strcat(provider->clkdm_name, "clkdm");
 
+       /* Replace any dash from the clkdm name with underscore */
+       c = provider->clkdm_name;
+
+       while (*c) {
+               if (*c == '-')
+                       *c = '_';
+               c++;
+       }
+
        INIT_LIST_HEAD(&provider->clocks);
 
        /* Generate clocks */
@@ -539,9 +588,13 @@ static void __init _ti_omap4_clkctrl_setup(struct device_node *node)
                init.flags = 0;
                if (reg_data->flags & CLKF_SET_RATE_PARENT)
                        init.flags |= CLK_SET_RATE_PARENT;
-               init.name = kasprintf(GFP_KERNEL, "%s:%s:%04x:%d",
-                                     node->parent->name, node->name,
-                                     reg_data->offset, 0);
+               if (ti_clk_get_features()->flags & TI_CLK_CLKCTRL_COMPAT)
+                       init.name = kasprintf(GFP_KERNEL, "%pOFn:%pOFn:%04x:%d",
+                                             node->parent, node,
+                                             reg_data->offset, 0);
+               else
+                       init.name = kasprintf(GFP_KERNEL, "%pOFn:%04x:%d",
+                                             node, reg_data->offset, 0);
                clkctrl_clk = kzalloc(sizeof(*clkctrl_clk), GFP_KERNEL);
                if (!init.name || !clkctrl_clk)
                        goto cleanup;
index b58278077226e75b2e38304bfa10a45d48fa7dfc..9f312a21951001bb6946737e52fbf03e3d294284 100644 (file)
@@ -24,6 +24,7 @@ struct clk_omap_divider {
        u8                      flags;
        s8                      latch;
        const struct clk_div_table      *table;
+       u32             context;
 };
 
 #define to_clk_omap_divider(_hw) container_of(_hw, struct clk_omap_divider, hw)
@@ -36,6 +37,7 @@ struct clk_omap_mux {
        u8                      shift;
        s8                      latch;
        u8                      flags;
+       u8                      saved_parent;
 };
 
 #define to_clk_omap_mux(_hw) container_of(_hw, struct clk_omap_mux, hw)
@@ -184,9 +186,16 @@ struct omap_clkctrl_data {
 extern const struct omap_clkctrl_data omap4_clkctrl_data[];
 extern const struct omap_clkctrl_data omap5_clkctrl_data[];
 extern const struct omap_clkctrl_data dra7_clkctrl_data[];
+extern const struct omap_clkctrl_data dra7_clkctrl_compat_data[];
+extern struct ti_dt_clk dra7xx_compat_clks[];
 extern const struct omap_clkctrl_data am3_clkctrl_data[];
+extern const struct omap_clkctrl_data am3_clkctrl_compat_data[];
+extern struct ti_dt_clk am33xx_compat_clks[];
 extern const struct omap_clkctrl_data am4_clkctrl_data[];
+extern const struct omap_clkctrl_data am4_clkctrl_compat_data[];
+extern struct ti_dt_clk am43xx_compat_clks[];
 extern const struct omap_clkctrl_data am438x_clkctrl_data[];
+extern const struct omap_clkctrl_data am438x_clkctrl_compat_data[];
 extern const struct omap_clkctrl_data dm814_clkctrl_data[];
 extern const struct omap_clkctrl_data dm816_clkctrl_data[];
 
@@ -233,6 +242,8 @@ extern const struct clk_ops ti_clk_divider_ops;
 extern const struct clk_ops ti_clk_mux_ops;
 extern const struct clk_ops omap_gate_clk_ops;
 
+extern struct ti_clk_features ti_clk_features;
+
 void omap2_init_clk_clkdm(struct clk_hw *hw);
 int omap2_clkops_enable_clkdm(struct clk_hw *hw);
 void omap2_clkops_disable_clkdm(struct clk_hw *hw);
index 030e8b2c10500cde5f8805d5674140ded9a17b12..6a89936ba03afe26578a7494275e0c723dad69d4 100644 (file)
@@ -135,8 +135,8 @@ static void __init _register_composite(void *user,
 
                comp = _lookup_component(cclk->comp_nodes[i]);
                if (!comp) {
-                       pr_debug("component %s not ready for %s, retry\n",
-                                cclk->comp_nodes[i]->name, node->name);
+                       pr_debug("component %s not ready for %pOFn, retry\n",
+                                cclk->comp_nodes[i]->name, node);
                        if (!ti_clk_retry_init(node, hw,
                                               _register_composite))
                                return;
@@ -144,8 +144,8 @@ static void __init _register_composite(void *user,
                        goto cleanup;
                }
                if (cclk->comp_clks[comp->type] != NULL) {
-                       pr_err("duplicate component types for %s (%s)!\n",
-                              node->name, component_clk_types[comp->type]);
+                       pr_err("duplicate component types for %pOFn (%s)!\n",
+                              node, component_clk_types[comp->type]);
                        goto cleanup;
                }
 
@@ -168,7 +168,7 @@ static void __init _register_composite(void *user,
        }
 
        if (!num_parents) {
-               pr_err("%s: no parents found for %s!\n", __func__, node->name);
+               pr_err("%s: no parents found for %pOFn!\n", __func__, node);
                goto cleanup;
        }
 
@@ -212,7 +212,7 @@ static void __init of_ti_composite_clk_setup(struct device_node *node)
        num_clks = of_clk_get_parent_count(node);
 
        if (!num_clks) {
-               pr_err("composite clk %s must have component(s)\n", node->name);
+               pr_err("composite clk %pOFn must have component(s)\n", node);
                return;
        }
 
@@ -248,7 +248,7 @@ int __init ti_clk_add_component(struct device_node *node, struct clk_hw *hw,
        num_parents = of_clk_get_parent_count(node);
 
        if (!num_parents) {
-               pr_err("component-clock %s must have parent(s)\n", node->name);
+               pr_err("component-clock %pOFn must have parent(s)\n", node);
                return -EINVAL;
        }
 
index ccfb4d9a152aea55c3e414dc26d2ddd3ce792ee4..8d77090ad94aecd283ee085bb77a81491c9c6978 100644 (file)
@@ -268,10 +268,46 @@ static int ti_clk_divider_set_rate(struct clk_hw *hw, unsigned long rate,
        return 0;
 }
 
+/**
+ * clk_divider_save_context - Save the divider value
+ * @hw: pointer  struct clk_hw
+ *
+ * Save the divider value
+ */
+static int clk_divider_save_context(struct clk_hw *hw)
+{
+       struct clk_omap_divider *divider = to_clk_omap_divider(hw);
+       u32 val;
+
+       val = ti_clk_ll_ops->clk_readl(&divider->reg) >> divider->shift;
+       divider->context = val & div_mask(divider);
+
+       return 0;
+}
+
+/**
+ * clk_divider_restore_context - restore the saved the divider value
+ * @hw: pointer  struct clk_hw
+ *
+ * Restore the saved the divider value
+ */
+static void clk_divider_restore_context(struct clk_hw *hw)
+{
+       struct clk_omap_divider *divider = to_clk_omap_divider(hw);
+       u32 val;
+
+       val = ti_clk_ll_ops->clk_readl(&divider->reg);
+       val &= ~(div_mask(divider) << divider->shift);
+       val |= divider->context << divider->shift;
+       ti_clk_ll_ops->clk_writel(val, &divider->reg);
+}
+
 const struct clk_ops ti_clk_divider_ops = {
        .recalc_rate = ti_clk_divider_recalc_rate,
        .round_rate = ti_clk_divider_round_rate,
        .set_rate = ti_clk_divider_set_rate,
+       .save_context = clk_divider_save_context,
+       .restore_context = clk_divider_restore_context,
 };
 
 static struct clk *_register_divider(struct device *dev, const char *name,
@@ -492,7 +528,7 @@ __init ti_clk_get_div_table(struct device_node *node)
        }
 
        if (!valid_div) {
-               pr_err("no valid dividers for %s table\n", node->name);
+               pr_err("no valid dividers for %pOFn table\n", node);
                return ERR_PTR(-EINVAL);
        }
 
@@ -530,7 +566,7 @@ static int _get_divider_width(struct device_node *node,
                        min_div = 1;
 
                if (of_property_read_u32(node, "ti,max-div", &max_div)) {
-                       pr_err("no max-div for %s!\n", node->name);
+                       pr_err("no max-div for %pOFn!\n", node);
                        return -EINVAL;
                }
 
index dc86d07d09211e35a6b9bf9338381ac2f4ef9183..92e28af7afba8ef320eae1c3ef0f3680d1ad72ce 100644 (file)
@@ -39,6 +39,8 @@ static const struct clk_ops dpll_m4xen_ck_ops = {
        .set_rate_and_parent    = &omap3_noncore_dpll_set_rate_and_parent,
        .determine_rate = &omap4_dpll_regm4xen_determine_rate,
        .get_parent     = &omap2_init_dpll_parent,
+       .save_context   = &omap3_core_dpll_save_context,
+       .restore_context = &omap3_core_dpll_restore_context,
 };
 #else
 static const struct clk_ops dpll_m4xen_ck_ops = {};
@@ -62,6 +64,8 @@ static const struct clk_ops dpll_ck_ops = {
        .set_rate_and_parent    = &omap3_noncore_dpll_set_rate_and_parent,
        .determine_rate = &omap3_noncore_dpll_determine_rate,
        .get_parent     = &omap2_init_dpll_parent,
+       .save_context   = &omap3_noncore_dpll_save_context,
+       .restore_context = &omap3_noncore_dpll_restore_context,
 };
 
 static const struct clk_ops dpll_no_gate_ck_ops = {
@@ -72,6 +76,8 @@ static const struct clk_ops dpll_no_gate_ck_ops = {
        .set_parent     = &omap3_noncore_dpll_set_parent,
        .set_rate_and_parent    = &omap3_noncore_dpll_set_rate_and_parent,
        .determine_rate = &omap3_noncore_dpll_determine_rate,
+       .save_context   = &omap3_noncore_dpll_save_context,
+       .restore_context = &omap3_noncore_dpll_restore_context
 };
 #else
 static const struct clk_ops dpll_core_ck_ops = {};
@@ -162,8 +168,8 @@ static void __init _register_dpll(void *user,
 
        clk = of_clk_get(node, 0);
        if (IS_ERR(clk)) {
-               pr_debug("clk-ref missing for %s, retry later\n",
-                        node->name);
+               pr_debug("clk-ref missing for %pOFn, retry later\n",
+                        node);
                if (!ti_clk_retry_init(node, hw, _register_dpll))
                        return;
 
@@ -175,8 +181,8 @@ static void __init _register_dpll(void *user,
        clk = of_clk_get(node, 1);
 
        if (IS_ERR(clk)) {
-               pr_debug("clk-bypass missing for %s, retry later\n",
-                        node->name);
+               pr_debug("clk-bypass missing for %pOFn, retry later\n",
+                        node);
                if (!ti_clk_retry_init(node, hw, _register_dpll))
                        return;
 
@@ -226,7 +232,7 @@ static void _register_dpll_x2(struct device_node *node,
 
        parent_name = of_clk_get_parent_name(node, 0);
        if (!parent_name) {
-               pr_err("%s must have parent\n", node->name);
+               pr_err("%pOFn must have parent\n", node);
                return;
        }
 
@@ -305,7 +311,7 @@ static void __init of_ti_dpll_setup(struct device_node *node,
 
        init->num_parents = of_clk_get_parent_count(node);
        if (!init->num_parents) {
-               pr_err("%s must have parent(s)\n", node->name);
+               pr_err("%pOFn must have parent(s)\n", node);
                goto cleanup;
        }
 
index 4534de2ef455d6e734c592062d4bcf92d4a404d7..44b6b6403753c95845048910838c4567c79f91d4 100644 (file)
@@ -782,6 +782,130 @@ unsigned long omap3_clkoutx2_recalc(struct clk_hw *hw,
        return rate;
 }
 
+/**
+ * omap3_core_dpll_save_context - Save the m and n values of the divider
+ * @hw: pointer  struct clk_hw
+ *
+ * Before the dpll registers are lost save the last rounded rate m and n
+ * and the enable mask.
+ */
+int omap3_core_dpll_save_context(struct clk_hw *hw)
+{
+       struct clk_hw_omap *clk = to_clk_hw_omap(hw);
+       struct dpll_data *dd;
+       u32 v;
+
+       dd = clk->dpll_data;
+
+       v = ti_clk_ll_ops->clk_readl(&dd->control_reg);
+       clk->context = (v & dd->enable_mask) >> __ffs(dd->enable_mask);
+
+       if (clk->context == DPLL_LOCKED) {
+               v = ti_clk_ll_ops->clk_readl(&dd->mult_div1_reg);
+               dd->last_rounded_m = (v & dd->mult_mask) >>
+                                               __ffs(dd->mult_mask);
+               dd->last_rounded_n = ((v & dd->div1_mask) >>
+                                               __ffs(dd->div1_mask)) + 1;
+       }
+
+       return 0;
+}
+
+/**
+ * omap3_core_dpll_restore_context - restore the m and n values of the divider
+ * @hw: pointer  struct clk_hw
+ *
+ * Restore the last rounded rate m and n
+ * and the enable mask.
+ */
+void omap3_core_dpll_restore_context(struct clk_hw *hw)
+{
+       struct clk_hw_omap *clk = to_clk_hw_omap(hw);
+       const struct dpll_data *dd;
+       u32 v;
+
+       dd = clk->dpll_data;
+
+       if (clk->context == DPLL_LOCKED) {
+               _omap3_dpll_write_clken(clk, 0x4);
+               _omap3_wait_dpll_status(clk, 0);
+
+               v = ti_clk_ll_ops->clk_readl(&dd->mult_div1_reg);
+               v &= ~(dd->mult_mask | dd->div1_mask);
+               v |= dd->last_rounded_m << __ffs(dd->mult_mask);
+               v |= (dd->last_rounded_n - 1) << __ffs(dd->div1_mask);
+               ti_clk_ll_ops->clk_writel(v, &dd->mult_div1_reg);
+
+               _omap3_dpll_write_clken(clk, DPLL_LOCKED);
+               _omap3_wait_dpll_status(clk, 1);
+       } else {
+               _omap3_dpll_write_clken(clk, clk->context);
+       }
+}
+
+/**
+ * omap3_non_core_dpll_save_context - Save the m and n values of the divider
+ * @hw: pointer  struct clk_hw
+ *
+ * Before the dpll registers are lost save the last rounded rate m and n
+ * and the enable mask.
+ */
+int omap3_noncore_dpll_save_context(struct clk_hw *hw)
+{
+       struct clk_hw_omap *clk = to_clk_hw_omap(hw);
+       struct dpll_data *dd;
+       u32 v;
+
+       dd = clk->dpll_data;
+
+       v = ti_clk_ll_ops->clk_readl(&dd->control_reg);
+       clk->context = (v & dd->enable_mask) >> __ffs(dd->enable_mask);
+
+       if (clk->context == DPLL_LOCKED) {
+               v = ti_clk_ll_ops->clk_readl(&dd->mult_div1_reg);
+               dd->last_rounded_m = (v & dd->mult_mask) >>
+                                               __ffs(dd->mult_mask);
+               dd->last_rounded_n = ((v & dd->div1_mask) >>
+                                               __ffs(dd->div1_mask)) + 1;
+       }
+
+       return 0;
+}
+
+/**
+ * omap3_core_dpll_restore_context - restore the m and n values of the divider
+ * @hw: pointer  struct clk_hw
+ *
+ * Restore the last rounded rate m and n
+ * and the enable mask.
+ */
+void omap3_noncore_dpll_restore_context(struct clk_hw *hw)
+{
+       struct clk_hw_omap *clk = to_clk_hw_omap(hw);
+       const struct dpll_data *dd;
+       u32 ctrl, mult_div1;
+
+       dd = clk->dpll_data;
+
+       ctrl = ti_clk_ll_ops->clk_readl(&dd->control_reg);
+       mult_div1 = ti_clk_ll_ops->clk_readl(&dd->mult_div1_reg);
+
+       if (clk->context == ((ctrl & dd->enable_mask) >>
+                            __ffs(dd->enable_mask)) &&
+           dd->last_rounded_m == ((mult_div1 & dd->mult_mask) >>
+                                  __ffs(dd->mult_mask)) &&
+           dd->last_rounded_n == ((mult_div1 & dd->div1_mask) >>
+                                  __ffs(dd->div1_mask)) + 1) {
+               /* nothing to be done */
+               return;
+       }
+
+       if (clk->context == DPLL_LOCKED)
+               omap3_noncore_dpll_program(clk, 0);
+       else
+               _omap3_dpll_write_clken(clk, clk->context);
+}
+
 /* OMAP3/4 non-CORE DPLL clkops */
 const struct clk_hw_omap_ops clkhwops_omap3_dpll = {
        .allow_idle     = omap3_dpll_allow_idle,
index 071af44b1ba856d28ec4438f3373bc3ab9750475..ed24f20f63c73f4da764d3a3ec97a8079e3dd9d5 100644 (file)
@@ -555,7 +555,7 @@ static void __init ti_fapll_setup(struct device_node *node)
 
        init->num_parents = of_clk_get_parent_count(node);
        if (init->num_parents != 2) {
-               pr_err("%s must have two parents\n", node->name);
+               pr_err("%pOFn must have two parents\n", node);
                goto free;
        }
 
@@ -564,19 +564,19 @@ static void __init ti_fapll_setup(struct device_node *node)
 
        fd->clk_ref = of_clk_get(node, 0);
        if (IS_ERR(fd->clk_ref)) {
-               pr_err("%s could not get clk_ref\n", node->name);
+               pr_err("%pOFn could not get clk_ref\n", node);
                goto free;
        }
 
        fd->clk_bypass = of_clk_get(node, 1);
        if (IS_ERR(fd->clk_bypass)) {
-               pr_err("%s could not get clk_bypass\n", node->name);
+               pr_err("%pOFn could not get clk_bypass\n", node);
                goto free;
        }
 
        fd->base = of_iomap(node, 0);
        if (!fd->base) {
-               pr_err("%s could not get IO base\n", node->name);
+               pr_err("%pOFn could not get IO base\n", node);
                goto free;
        }
 
index 0174a51a4ba6c11dfa4cec9b2a57bc44e156ef67..7cbe896db07166532886c9b7613acc79f3efa068 100644 (file)
@@ -42,12 +42,12 @@ static void __init of_ti_fixed_factor_clk_setup(struct device_node *node)
        u32 flags = 0;
 
        if (of_property_read_u32(node, "ti,clock-div", &div)) {
-               pr_err("%s must have a clock-div property\n", node->name);
+               pr_err("%pOFn must have a clock-div property\n", node);
                return;
        }
 
        if (of_property_read_u32(node, "ti,clock-mult", &mult)) {
-               pr_err("%s must have a clock-mult property\n", node->name);
+               pr_err("%pOFn must have a clock-mult property\n", node);
                return;
        }
 
index 935b2de5fb88702af4f6caf045b03cd7c355e7ec..1c78fff5513c798b5e0f8e62887c5a83b1523be8 100644 (file)
@@ -33,6 +33,7 @@ static const struct clk_ops omap_gate_clkdm_clk_ops = {
        .init           = &omap2_init_clk_clkdm,
        .enable         = &omap2_clkops_enable_clkdm,
        .disable        = &omap2_clkops_disable_clkdm,
+       .restore_context = clk_gate_restore_context,
 };
 
 const struct clk_ops omap_gate_clk_ops = {
@@ -40,6 +41,7 @@ const struct clk_ops omap_gate_clk_ops = {
        .enable         = &omap2_dflt_clk_enable,
        .disable        = &omap2_dflt_clk_disable,
        .is_enabled     = &omap2_dflt_clk_is_enabled,
+       .restore_context = clk_gate_restore_context,
 };
 
 static const struct clk_ops omap_gate_clk_hsdiv_restore_ops = {
@@ -47,6 +49,7 @@ static const struct clk_ops omap_gate_clk_hsdiv_restore_ops = {
        .enable         = &omap36xx_gate_clk_enable_with_hsdiv_restore,
        .disable        = &omap2_dflt_clk_disable,
        .is_enabled     = &omap2_dflt_clk_is_enabled,
+       .restore_context = clk_gate_restore_context,
 };
 
 /**
@@ -179,7 +182,7 @@ static void __init _of_ti_gate_clk_setup(struct device_node *node,
        }
 
        if (of_clk_get_parent_count(node) != 1) {
-               pr_err("%s must have 1 parent\n", node->name);
+               pr_err("%pOFn must have 1 parent\n", node);
                return;
        }
 
index 41ae7021670ea0179f43ef194be4bb73ed1fff33..87e00c2ee957d9dab2a6bd646f36b8c21040c358 100644 (file)
@@ -84,7 +84,7 @@ static void __init _of_ti_interface_clk_setup(struct device_node *node,
 
        parent_name = of_clk_get_parent_name(node, 0);
        if (!parent_name) {
-               pr_err("%s must have a parent\n", node->name);
+               pr_err("%pOFn must have a parent\n", node);
                return;
        }
 
index 69a4308a5a983b9e027eb8610ac5da53c8b15cec..883bdde94d048643c1ff98239305b2f6393c1339 100644 (file)
@@ -91,10 +91,39 @@ static int ti_clk_mux_set_parent(struct clk_hw *hw, u8 index)
        return 0;
 }
 
+/**
+ * clk_mux_save_context - Save the parent selcted in the mux
+ * @hw: pointer  struct clk_hw
+ *
+ * Save the parent mux value.
+ */
+static int clk_mux_save_context(struct clk_hw *hw)
+{
+       struct clk_omap_mux *mux = to_clk_omap_mux(hw);
+
+       mux->saved_parent = ti_clk_mux_get_parent(hw);
+       return 0;
+}
+
+/**
+ * clk_mux_restore_context - Restore the parent in the mux
+ * @hw: pointer  struct clk_hw
+ *
+ * Restore the saved parent mux value.
+ */
+static void clk_mux_restore_context(struct clk_hw *hw)
+{
+       struct clk_omap_mux *mux = to_clk_omap_mux(hw);
+
+       ti_clk_mux_set_parent(hw, mux->saved_parent);
+}
+
 const struct clk_ops ti_clk_mux_ops = {
        .get_parent = ti_clk_mux_get_parent,
        .set_parent = ti_clk_mux_set_parent,
        .determine_rate = __clk_mux_determine_rate,
+       .save_context = clk_mux_save_context,
+       .restore_context = clk_mux_restore_context,
 };
 
 static struct clk *_register_mux(struct device *dev, const char *name,
@@ -186,7 +215,7 @@ static void of_mux_clk_setup(struct device_node *node)
 
        num_parents = of_clk_get_parent_count(node);
        if (num_parents < 2) {
-               pr_err("mux-clock %s must have parents\n", node->name);
+               pr_err("mux-clock %pOFn must have parents\n", node);
                return;
        }
        parent_names = kzalloc((sizeof(char *) * num_parents), GFP_KERNEL);
@@ -278,7 +307,7 @@ static void __init of_ti_composite_mux_clk_setup(struct device_node *node)
        num_parents = of_clk_get_parent_count(node);
 
        if (num_parents < 2) {
-               pr_err("%s must have parents\n", node->name);
+               pr_err("%pOFn must have parents\n", node);
                goto cleanup;
        }
 
index 88a2cab37f627b86bebe9512ffee9db720b327e1..d7b53ac8ad11520101c11823fd44c0b9eaec178f 100644 (file)
@@ -602,7 +602,7 @@ void __init zynq_clock_init(void)
        }
 
        if (of_address_to_resource(np, 0, &res)) {
-               pr_err("%s: failed to get resource\n", np->name);
+               pr_err("%pOFn: failed to get resource\n", np);
                goto np_err;
        }
 
@@ -611,7 +611,7 @@ void __init zynq_clock_init(void)
        if (slcr->data) {
                zynq_clkc_base = (__force void __iomem *)slcr->data + res.start;
        } else {
-               pr_err("%s: Unable to get I/O memory\n", np->name);
+               pr_err("%pOFn: Unable to get I/O memory\n", np);
                of_node_put(slcr);
                goto np_err;
        }
index b396f00e481db9d4858856c05cc9454677395f7e..86a8806e2140291f3fcca22b695a2ee5066cb096 100644 (file)
@@ -16,6 +16,8 @@
 #define AM3_CLKCTRL_OFFSET     0x0
 #define AM3_CLKCTRL_INDEX(offset)      ((offset) - AM3_CLKCTRL_OFFSET)
 
+/* XXX: Compatibility part begin, remove this once compatibility support is no longer needed */
+
 /* l4_per clocks */
 #define AM3_L4_PER_CLKCTRL_OFFSET      0x14
 #define AM3_L4_PER_CLKCTRL_INDEX(offset)       ((offset) - AM3_L4_PER_CLKCTRL_OFFSET)
 #define AM3_L4_CEFUSE_CLKCTRL_INDEX(offset)    ((offset) - AM3_L4_CEFUSE_CLKCTRL_OFFSET)
 #define AM3_CEFUSE_CLKCTRL     AM3_L4_CEFUSE_CLKCTRL_INDEX(0x20)
 
+/* XXX: Compatibility part end */
+
+/* l4ls clocks */
+#define AM3_L4LS_CLKCTRL_OFFSET        0x38
+#define AM3_L4LS_CLKCTRL_INDEX(offset) ((offset) - AM3_L4LS_CLKCTRL_OFFSET)
+#define AM3_L4LS_UART6_CLKCTRL AM3_L4LS_CLKCTRL_INDEX(0x38)
+#define AM3_L4LS_MMC1_CLKCTRL  AM3_L4LS_CLKCTRL_INDEX(0x3c)
+#define AM3_L4LS_ELM_CLKCTRL   AM3_L4LS_CLKCTRL_INDEX(0x40)
+#define AM3_L4LS_I2C3_CLKCTRL  AM3_L4LS_CLKCTRL_INDEX(0x44)
+#define AM3_L4LS_I2C2_CLKCTRL  AM3_L4LS_CLKCTRL_INDEX(0x48)
+#define AM3_L4LS_SPI0_CLKCTRL  AM3_L4LS_CLKCTRL_INDEX(0x4c)
+#define AM3_L4LS_SPI1_CLKCTRL  AM3_L4LS_CLKCTRL_INDEX(0x50)
+#define AM3_L4LS_L4_LS_CLKCTRL AM3_L4LS_CLKCTRL_INDEX(0x60)
+#define AM3_L4LS_UART2_CLKCTRL AM3_L4LS_CLKCTRL_INDEX(0x6c)
+#define AM3_L4LS_UART3_CLKCTRL AM3_L4LS_CLKCTRL_INDEX(0x70)
+#define AM3_L4LS_UART4_CLKCTRL AM3_L4LS_CLKCTRL_INDEX(0x74)
+#define AM3_L4LS_UART5_CLKCTRL AM3_L4LS_CLKCTRL_INDEX(0x78)
+#define AM3_L4LS_TIMER7_CLKCTRL        AM3_L4LS_CLKCTRL_INDEX(0x7c)
+#define AM3_L4LS_TIMER2_CLKCTRL        AM3_L4LS_CLKCTRL_INDEX(0x80)
+#define AM3_L4LS_TIMER3_CLKCTRL        AM3_L4LS_CLKCTRL_INDEX(0x84)
+#define AM3_L4LS_TIMER4_CLKCTRL        AM3_L4LS_CLKCTRL_INDEX(0x88)
+#define AM3_L4LS_RNG_CLKCTRL   AM3_L4LS_CLKCTRL_INDEX(0x90)
+#define AM3_L4LS_GPIO2_CLKCTRL AM3_L4LS_CLKCTRL_INDEX(0xac)
+#define AM3_L4LS_GPIO3_CLKCTRL AM3_L4LS_CLKCTRL_INDEX(0xb0)
+#define AM3_L4LS_GPIO4_CLKCTRL AM3_L4LS_CLKCTRL_INDEX(0xb4)
+#define AM3_L4LS_D_CAN0_CLKCTRL        AM3_L4LS_CLKCTRL_INDEX(0xc0)
+#define AM3_L4LS_D_CAN1_CLKCTRL        AM3_L4LS_CLKCTRL_INDEX(0xc4)
+#define AM3_L4LS_EPWMSS1_CLKCTRL       AM3_L4LS_CLKCTRL_INDEX(0xcc)
+#define AM3_L4LS_EPWMSS0_CLKCTRL       AM3_L4LS_CLKCTRL_INDEX(0xd4)
+#define AM3_L4LS_EPWMSS2_CLKCTRL       AM3_L4LS_CLKCTRL_INDEX(0xd8)
+#define AM3_L4LS_TIMER5_CLKCTRL        AM3_L4LS_CLKCTRL_INDEX(0xec)
+#define AM3_L4LS_TIMER6_CLKCTRL        AM3_L4LS_CLKCTRL_INDEX(0xf0)
+#define AM3_L4LS_MMC2_CLKCTRL  AM3_L4LS_CLKCTRL_INDEX(0xf4)
+#define AM3_L4LS_SPINLOCK_CLKCTRL      AM3_L4LS_CLKCTRL_INDEX(0x10c)
+#define AM3_L4LS_MAILBOX_CLKCTRL       AM3_L4LS_CLKCTRL_INDEX(0x110)
+#define AM3_L4LS_OCPWP_CLKCTRL AM3_L4LS_CLKCTRL_INDEX(0x130)
+
+/* l3s clocks */
+#define AM3_L3S_CLKCTRL_OFFSET 0x1c
+#define AM3_L3S_CLKCTRL_INDEX(offset)  ((offset) - AM3_L3S_CLKCTRL_OFFSET)
+#define AM3_L3S_USB_OTG_HS_CLKCTRL     AM3_L3S_CLKCTRL_INDEX(0x1c)
+#define AM3_L3S_GPMC_CLKCTRL   AM3_L3S_CLKCTRL_INDEX(0x30)
+#define AM3_L3S_MCASP0_CLKCTRL AM3_L3S_CLKCTRL_INDEX(0x34)
+#define AM3_L3S_MCASP1_CLKCTRL AM3_L3S_CLKCTRL_INDEX(0x68)
+#define AM3_L3S_MMC3_CLKCTRL   AM3_L3S_CLKCTRL_INDEX(0xf8)
+
+/* l3 clocks */
+#define AM3_L3_CLKCTRL_OFFSET  0x24
+#define AM3_L3_CLKCTRL_INDEX(offset)   ((offset) - AM3_L3_CLKCTRL_OFFSET)
+#define AM3_L3_TPTC0_CLKCTRL   AM3_L3_CLKCTRL_INDEX(0x24)
+#define AM3_L3_EMIF_CLKCTRL    AM3_L3_CLKCTRL_INDEX(0x28)
+#define AM3_L3_OCMCRAM_CLKCTRL AM3_L3_CLKCTRL_INDEX(0x2c)
+#define AM3_L3_AES_CLKCTRL     AM3_L3_CLKCTRL_INDEX(0x94)
+#define AM3_L3_SHAM_CLKCTRL    AM3_L3_CLKCTRL_INDEX(0xa0)
+#define AM3_L3_TPCC_CLKCTRL    AM3_L3_CLKCTRL_INDEX(0xbc)
+#define AM3_L3_L3_INSTR_CLKCTRL        AM3_L3_CLKCTRL_INDEX(0xdc)
+#define AM3_L3_L3_MAIN_CLKCTRL AM3_L3_CLKCTRL_INDEX(0xe0)
+#define AM3_L3_TPTC1_CLKCTRL   AM3_L3_CLKCTRL_INDEX(0xfc)
+#define AM3_L3_TPTC2_CLKCTRL   AM3_L3_CLKCTRL_INDEX(0x100)
+
+/* l4hs clocks */
+#define AM3_L4HS_CLKCTRL_OFFSET        0x120
+#define AM3_L4HS_CLKCTRL_INDEX(offset) ((offset) - AM3_L4HS_CLKCTRL_OFFSET)
+#define AM3_L4HS_L4_HS_CLKCTRL AM3_L4HS_CLKCTRL_INDEX(0x120)
+
+/* pruss_ocp clocks */
+#define AM3_PRUSS_OCP_CLKCTRL_OFFSET   0xe8
+#define AM3_PRUSS_OCP_CLKCTRL_INDEX(offset)    ((offset) - AM3_PRUSS_OCP_CLKCTRL_OFFSET)
+#define AM3_PRUSS_OCP_PRUSS_CLKCTRL    AM3_PRUSS_OCP_CLKCTRL_INDEX(0xe8)
+
+/* cpsw_125mhz clocks */
+#define AM3_CPSW_125MHZ_CPGMAC0_CLKCTRL        AM3_CLKCTRL_INDEX(0x14)
+
+/* lcdc clocks */
+#define AM3_LCDC_CLKCTRL_OFFSET        0x18
+#define AM3_LCDC_CLKCTRL_INDEX(offset) ((offset) - AM3_LCDC_CLKCTRL_OFFSET)
+#define AM3_LCDC_LCDC_CLKCTRL  AM3_LCDC_CLKCTRL_INDEX(0x18)
+
+/* clk_24mhz clocks */
+#define AM3_CLK_24MHZ_CLKCTRL_OFFSET   0x14c
+#define AM3_CLK_24MHZ_CLKCTRL_INDEX(offset)    ((offset) - AM3_CLK_24MHZ_CLKCTRL_OFFSET)
+#define AM3_CLK_24MHZ_CLKDIV32K_CLKCTRL        AM3_CLK_24MHZ_CLKCTRL_INDEX(0x14c)
+
+/* l4_wkup clocks */
+#define AM3_L4_WKUP_CONTROL_CLKCTRL    AM3_CLKCTRL_INDEX(0x4)
+#define AM3_L4_WKUP_GPIO1_CLKCTRL      AM3_CLKCTRL_INDEX(0x8)
+#define AM3_L4_WKUP_L4_WKUP_CLKCTRL    AM3_CLKCTRL_INDEX(0xc)
+#define AM3_L4_WKUP_UART1_CLKCTRL      AM3_CLKCTRL_INDEX(0xb4)
+#define AM3_L4_WKUP_I2C1_CLKCTRL       AM3_CLKCTRL_INDEX(0xb8)
+#define AM3_L4_WKUP_ADC_TSC_CLKCTRL    AM3_CLKCTRL_INDEX(0xbc)
+#define AM3_L4_WKUP_SMARTREFLEX0_CLKCTRL       AM3_CLKCTRL_INDEX(0xc0)
+#define AM3_L4_WKUP_TIMER1_CLKCTRL     AM3_CLKCTRL_INDEX(0xc4)
+#define AM3_L4_WKUP_SMARTREFLEX1_CLKCTRL       AM3_CLKCTRL_INDEX(0xc8)
+#define AM3_L4_WKUP_WD_TIMER2_CLKCTRL  AM3_CLKCTRL_INDEX(0xd4)
+
+/* l3_aon clocks */
+#define AM3_L3_AON_CLKCTRL_OFFSET      0x14
+#define AM3_L3_AON_CLKCTRL_INDEX(offset)       ((offset) - AM3_L3_AON_CLKCTRL_OFFSET)
+#define AM3_L3_AON_DEBUGSS_CLKCTRL     AM3_L3_AON_CLKCTRL_INDEX(0x14)
+
+/* l4_wkup_aon clocks */
+#define AM3_L4_WKUP_AON_CLKCTRL_OFFSET 0xb0
+#define AM3_L4_WKUP_AON_CLKCTRL_INDEX(offset)  ((offset) - AM3_L4_WKUP_AON_CLKCTRL_OFFSET)
+#define AM3_L4_WKUP_AON_WKUP_M3_CLKCTRL        AM3_L4_WKUP_AON_CLKCTRL_INDEX(0xb0)
+
+/* mpu clocks */
+#define AM3_MPU_MPU_CLKCTRL    AM3_CLKCTRL_INDEX(0x4)
+
+/* l4_rtc clocks */
+#define AM3_L4_RTC_RTC_CLKCTRL AM3_CLKCTRL_INDEX(0x0)
+
+/* gfx_l3 clocks */
+#define AM3_GFX_L3_GFX_CLKCTRL AM3_CLKCTRL_INDEX(0x4)
+
+/* l4_cefuse clocks */
+#define AM3_L4_CEFUSE_CEFUSE_CLKCTRL   AM3_CLKCTRL_INDEX(0x20)
+
 #endif
index d21df00b32701593a4624eb6b8869a398067a291..0f545b5afd6032fab531542b62c06ea7369115fa 100644 (file)
@@ -16,6 +16,8 @@
 #define AM4_CLKCTRL_OFFSET     0x20
 #define AM4_CLKCTRL_INDEX(offset)      ((offset) - AM4_CLKCTRL_OFFSET)
 
+/* XXX: Compatibility part begin, remove this once compatibility support is no longer needed */
+
 /* l4_wkup clocks */
 #define AM4_ADC_TSC_CLKCTRL    AM4_CLKCTRL_INDEX(0x120)
 #define AM4_L4_WKUP_CLKCTRL    AM4_CLKCTRL_INDEX(0x220)
 #define AM4_DSS_CORE_CLKCTRL   AM4_CLKCTRL_INDEX(0xa20)
 #define AM4_CPGMAC0_CLKCTRL    AM4_CLKCTRL_INDEX(0xb20)
 
+/* XXX: Compatibility part end. */
+
+/* l3s_tsc clocks */
+#define AM4_L3S_TSC_CLKCTRL_OFFSET     0x120
+#define AM4_L3S_TSC_CLKCTRL_INDEX(offset)      ((offset) - AM4_L3S_TSC_CLKCTRL_OFFSET)
+#define AM4_L3S_TSC_ADC_TSC_CLKCTRL    AM4_L3S_TSC_CLKCTRL_INDEX(0x120)
+
+/* l4_wkup_aon clocks */
+#define AM4_L4_WKUP_AON_CLKCTRL_OFFSET 0x228
+#define AM4_L4_WKUP_AON_CLKCTRL_INDEX(offset)  ((offset) - AM4_L4_WKUP_AON_CLKCTRL_OFFSET)
+#define AM4_L4_WKUP_AON_WKUP_M3_CLKCTRL        AM4_L4_WKUP_AON_CLKCTRL_INDEX(0x228)
+#define AM4_L4_WKUP_AON_COUNTER_32K_CLKCTRL    AM4_L4_WKUP_AON_CLKCTRL_INDEX(0x230)
+
+/* l4_wkup clocks */
+#define AM4_L4_WKUP_CLKCTRL_OFFSET     0x220
+#define AM4_L4_WKUP_CLKCTRL_INDEX(offset)      ((offset) - AM4_L4_WKUP_CLKCTRL_OFFSET)
+#define AM4_L4_WKUP_L4_WKUP_CLKCTRL    AM4_L4_WKUP_CLKCTRL_INDEX(0x220)
+#define AM4_L4_WKUP_TIMER1_CLKCTRL     AM4_L4_WKUP_CLKCTRL_INDEX(0x328)
+#define AM4_L4_WKUP_WD_TIMER2_CLKCTRL  AM4_L4_WKUP_CLKCTRL_INDEX(0x338)
+#define AM4_L4_WKUP_I2C1_CLKCTRL       AM4_L4_WKUP_CLKCTRL_INDEX(0x340)
+#define AM4_L4_WKUP_UART1_CLKCTRL      AM4_L4_WKUP_CLKCTRL_INDEX(0x348)
+#define AM4_L4_WKUP_SMARTREFLEX0_CLKCTRL       AM4_L4_WKUP_CLKCTRL_INDEX(0x350)
+#define AM4_L4_WKUP_SMARTREFLEX1_CLKCTRL       AM4_L4_WKUP_CLKCTRL_INDEX(0x358)
+#define AM4_L4_WKUP_CONTROL_CLKCTRL    AM4_L4_WKUP_CLKCTRL_INDEX(0x360)
+#define AM4_L4_WKUP_GPIO1_CLKCTRL      AM4_L4_WKUP_CLKCTRL_INDEX(0x368)
+
+/* mpu clocks */
+#define AM4_MPU_MPU_CLKCTRL    AM4_CLKCTRL_INDEX(0x20)
+
+/* gfx_l3 clocks */
+#define AM4_GFX_L3_GFX_CLKCTRL AM4_CLKCTRL_INDEX(0x20)
+
+/* l4_rtc clocks */
+#define AM4_L4_RTC_RTC_CLKCTRL AM4_CLKCTRL_INDEX(0x20)
+
+/* l3 clocks */
+#define AM4_L3_L3_MAIN_CLKCTRL AM4_CLKCTRL_INDEX(0x20)
+#define AM4_L3_AES_CLKCTRL     AM4_CLKCTRL_INDEX(0x28)
+#define AM4_L3_DES_CLKCTRL     AM4_CLKCTRL_INDEX(0x30)
+#define AM4_L3_L3_INSTR_CLKCTRL        AM4_CLKCTRL_INDEX(0x40)
+#define AM4_L3_OCMCRAM_CLKCTRL AM4_CLKCTRL_INDEX(0x50)
+#define AM4_L3_SHAM_CLKCTRL    AM4_CLKCTRL_INDEX(0x58)
+#define AM4_L3_TPCC_CLKCTRL    AM4_CLKCTRL_INDEX(0x78)
+#define AM4_L3_TPTC0_CLKCTRL   AM4_CLKCTRL_INDEX(0x80)
+#define AM4_L3_TPTC1_CLKCTRL   AM4_CLKCTRL_INDEX(0x88)
+#define AM4_L3_TPTC2_CLKCTRL   AM4_CLKCTRL_INDEX(0x90)
+#define AM4_L3_L4_HS_CLKCTRL   AM4_CLKCTRL_INDEX(0xa0)
+
+/* l3s clocks */
+#define AM4_L3S_CLKCTRL_OFFSET 0x68
+#define AM4_L3S_CLKCTRL_INDEX(offset)  ((offset) - AM4_L3S_CLKCTRL_OFFSET)
+#define AM4_L3S_VPFE0_CLKCTRL  AM4_L3S_CLKCTRL_INDEX(0x68)
+#define AM4_L3S_VPFE1_CLKCTRL  AM4_L3S_CLKCTRL_INDEX(0x70)
+#define AM4_L3S_GPMC_CLKCTRL   AM4_L3S_CLKCTRL_INDEX(0x220)
+#define AM4_L3S_MCASP0_CLKCTRL AM4_L3S_CLKCTRL_INDEX(0x238)
+#define AM4_L3S_MCASP1_CLKCTRL AM4_L3S_CLKCTRL_INDEX(0x240)
+#define AM4_L3S_MMC3_CLKCTRL   AM4_L3S_CLKCTRL_INDEX(0x248)
+#define AM4_L3S_QSPI_CLKCTRL   AM4_L3S_CLKCTRL_INDEX(0x258)
+#define AM4_L3S_USB_OTG_SS0_CLKCTRL    AM4_L3S_CLKCTRL_INDEX(0x260)
+#define AM4_L3S_USB_OTG_SS1_CLKCTRL    AM4_L3S_CLKCTRL_INDEX(0x268)
+
+/* pruss_ocp clocks */
+#define AM4_PRUSS_OCP_CLKCTRL_OFFSET   0x320
+#define AM4_PRUSS_OCP_CLKCTRL_INDEX(offset)    ((offset) - AM4_PRUSS_OCP_CLKCTRL_OFFSET)
+#define AM4_PRUSS_OCP_PRUSS_CLKCTRL    AM4_PRUSS_OCP_CLKCTRL_INDEX(0x320)
+
+/* l4ls clocks */
+#define AM4_L4LS_CLKCTRL_OFFSET        0x420
+#define AM4_L4LS_CLKCTRL_INDEX(offset) ((offset) - AM4_L4LS_CLKCTRL_OFFSET)
+#define AM4_L4LS_L4_LS_CLKCTRL AM4_L4LS_CLKCTRL_INDEX(0x420)
+#define AM4_L4LS_D_CAN0_CLKCTRL        AM4_L4LS_CLKCTRL_INDEX(0x428)
+#define AM4_L4LS_D_CAN1_CLKCTRL        AM4_L4LS_CLKCTRL_INDEX(0x430)
+#define AM4_L4LS_EPWMSS0_CLKCTRL       AM4_L4LS_CLKCTRL_INDEX(0x438)
+#define AM4_L4LS_EPWMSS1_CLKCTRL       AM4_L4LS_CLKCTRL_INDEX(0x440)
+#define AM4_L4LS_EPWMSS2_CLKCTRL       AM4_L4LS_CLKCTRL_INDEX(0x448)
+#define AM4_L4LS_EPWMSS3_CLKCTRL       AM4_L4LS_CLKCTRL_INDEX(0x450)
+#define AM4_L4LS_EPWMSS4_CLKCTRL       AM4_L4LS_CLKCTRL_INDEX(0x458)
+#define AM4_L4LS_EPWMSS5_CLKCTRL       AM4_L4LS_CLKCTRL_INDEX(0x460)
+#define AM4_L4LS_ELM_CLKCTRL   AM4_L4LS_CLKCTRL_INDEX(0x468)
+#define AM4_L4LS_GPIO2_CLKCTRL AM4_L4LS_CLKCTRL_INDEX(0x478)
+#define AM4_L4LS_GPIO3_CLKCTRL AM4_L4LS_CLKCTRL_INDEX(0x480)
+#define AM4_L4LS_GPIO4_CLKCTRL AM4_L4LS_CLKCTRL_INDEX(0x488)
+#define AM4_L4LS_GPIO5_CLKCTRL AM4_L4LS_CLKCTRL_INDEX(0x490)
+#define AM4_L4LS_GPIO6_CLKCTRL AM4_L4LS_CLKCTRL_INDEX(0x498)
+#define AM4_L4LS_HDQ1W_CLKCTRL AM4_L4LS_CLKCTRL_INDEX(0x4a0)
+#define AM4_L4LS_I2C2_CLKCTRL  AM4_L4LS_CLKCTRL_INDEX(0x4a8)
+#define AM4_L4LS_I2C3_CLKCTRL  AM4_L4LS_CLKCTRL_INDEX(0x4b0)
+#define AM4_L4LS_MAILBOX_CLKCTRL       AM4_L4LS_CLKCTRL_INDEX(0x4b8)
+#define AM4_L4LS_MMC1_CLKCTRL  AM4_L4LS_CLKCTRL_INDEX(0x4c0)
+#define AM4_L4LS_MMC2_CLKCTRL  AM4_L4LS_CLKCTRL_INDEX(0x4c8)
+#define AM4_L4LS_RNG_CLKCTRL   AM4_L4LS_CLKCTRL_INDEX(0x4e0)
+#define AM4_L4LS_SPI0_CLKCTRL  AM4_L4LS_CLKCTRL_INDEX(0x500)
+#define AM4_L4LS_SPI1_CLKCTRL  AM4_L4LS_CLKCTRL_INDEX(0x508)
+#define AM4_L4LS_SPI2_CLKCTRL  AM4_L4LS_CLKCTRL_INDEX(0x510)
+#define AM4_L4LS_SPI3_CLKCTRL  AM4_L4LS_CLKCTRL_INDEX(0x518)
+#define AM4_L4LS_SPI4_CLKCTRL  AM4_L4LS_CLKCTRL_INDEX(0x520)
+#define AM4_L4LS_SPINLOCK_CLKCTRL      AM4_L4LS_CLKCTRL_INDEX(0x528)
+#define AM4_L4LS_TIMER2_CLKCTRL        AM4_L4LS_CLKCTRL_INDEX(0x530)
+#define AM4_L4LS_TIMER3_CLKCTRL        AM4_L4LS_CLKCTRL_INDEX(0x538)
+#define AM4_L4LS_TIMER4_CLKCTRL        AM4_L4LS_CLKCTRL_INDEX(0x540)
+#define AM4_L4LS_TIMER5_CLKCTRL        AM4_L4LS_CLKCTRL_INDEX(0x548)
+#define AM4_L4LS_TIMER6_CLKCTRL        AM4_L4LS_CLKCTRL_INDEX(0x550)
+#define AM4_L4LS_TIMER7_CLKCTRL        AM4_L4LS_CLKCTRL_INDEX(0x558)
+#define AM4_L4LS_TIMER8_CLKCTRL        AM4_L4LS_CLKCTRL_INDEX(0x560)
+#define AM4_L4LS_TIMER9_CLKCTRL        AM4_L4LS_CLKCTRL_INDEX(0x568)
+#define AM4_L4LS_TIMER10_CLKCTRL       AM4_L4LS_CLKCTRL_INDEX(0x570)
+#define AM4_L4LS_TIMER11_CLKCTRL       AM4_L4LS_CLKCTRL_INDEX(0x578)
+#define AM4_L4LS_UART2_CLKCTRL AM4_L4LS_CLKCTRL_INDEX(0x580)
+#define AM4_L4LS_UART3_CLKCTRL AM4_L4LS_CLKCTRL_INDEX(0x588)
+#define AM4_L4LS_UART4_CLKCTRL AM4_L4LS_CLKCTRL_INDEX(0x590)
+#define AM4_L4LS_UART5_CLKCTRL AM4_L4LS_CLKCTRL_INDEX(0x598)
+#define AM4_L4LS_UART6_CLKCTRL AM4_L4LS_CLKCTRL_INDEX(0x5a0)
+#define AM4_L4LS_OCP2SCP0_CLKCTRL      AM4_L4LS_CLKCTRL_INDEX(0x5b8)
+#define AM4_L4LS_OCP2SCP1_CLKCTRL      AM4_L4LS_CLKCTRL_INDEX(0x5c0)
+
+/* emif clocks */
+#define AM4_EMIF_CLKCTRL_OFFSET        0x720
+#define AM4_EMIF_CLKCTRL_INDEX(offset) ((offset) - AM4_EMIF_CLKCTRL_OFFSET)
+#define AM4_EMIF_EMIF_CLKCTRL  AM4_EMIF_CLKCTRL_INDEX(0x720)
+
+/* dss clocks */
+#define AM4_DSS_CLKCTRL_OFFSET 0xa20
+#define AM4_DSS_CLKCTRL_INDEX(offset)  ((offset) - AM4_DSS_CLKCTRL_OFFSET)
+#define AM4_DSS_DSS_CORE_CLKCTRL       AM4_DSS_CLKCTRL_INDEX(0xa20)
+
+/* cpsw_125mhz clocks */
+#define AM4_CPSW_125MHZ_CLKCTRL_OFFSET 0xb20
+#define AM4_CPSW_125MHZ_CLKCTRL_INDEX(offset)  ((offset) - AM4_CPSW_125MHZ_CLKCTRL_OFFSET)
+#define AM4_CPSW_125MHZ_CPGMAC0_CLKCTRL        AM4_CPSW_125MHZ_CLKCTRL_INDEX(0xb20)
+
 #endif
index ab3ee241d10c50577694ab5eeacabf8c8cabcb39..ed30da28d8203f990dc4d0d21c4d1b9c18af733a 100644 (file)
@@ -9,6 +9,20 @@
 #ifndef _DT_BINDINGS_CLK_AT91_H
 #define _DT_BINDINGS_CLK_AT91_H
 
+#define PMC_TYPE_CORE          0
+#define PMC_TYPE_SYSTEM                1
+#define PMC_TYPE_PERIPHERAL    2
+#define PMC_TYPE_GCK           3
+
+#define PMC_SLOW               0
+#define PMC_MCK                        1
+#define PMC_UTMI               2
+#define PMC_MAIN               3
+#define PMC_MCK2               4
+#define PMC_I2S0_MUX           5
+#define PMC_I2S1_MUX           6
+
+#ifndef AT91_PMC_MOSCS
 #define AT91_PMC_MOSCS         0               /* MOSCS Flag */
 #define AT91_PMC_LOCKA         1               /* PLLA Lock */
 #define AT91_PMC_LOCKB         2               /* PLLB Lock */
@@ -19,5 +33,6 @@
 #define AT91_PMC_MOSCRCS       17              /* Main On-Chip RC */
 #define AT91_PMC_CFDEV         18              /* Clock Failure Detector Event */
 #define AT91_PMC_GCKRDY                24              /* Generated Clocks */
+#endif
 
 #endif
index d7549c57cac36c66bae2373eef4e517acb022f7b..ec969b5aeb25d4ce4b5565a658c930a070291896 100644 (file)
 #define DRA7_CLKCTRL_OFFSET    0x20
 #define DRA7_CLKCTRL_INDEX(offset)     ((offset) - DRA7_CLKCTRL_OFFSET)
 
+/* XXX: Compatibility part begin, remove this once compatibility support is no longer needed */
+
 /* mpu clocks */
 #define DRA7_MPU_CLKCTRL       DRA7_CLKCTRL_INDEX(0x20)
 
 /* ipu clocks */
-#define DRA7_IPU_CLKCTRL_OFFSET        0x40
-#define DRA7_IPU_CLKCTRL_INDEX(offset) ((offset) - DRA7_IPU_CLKCTRL_OFFSET)
-#define DRA7_MCASP1_CLKCTRL    DRA7_IPU_CLKCTRL_INDEX(0x50)
-#define DRA7_TIMER5_CLKCTRL    DRA7_IPU_CLKCTRL_INDEX(0x58)
-#define DRA7_TIMER6_CLKCTRL    DRA7_IPU_CLKCTRL_INDEX(0x60)
-#define DRA7_TIMER7_CLKCTRL    DRA7_IPU_CLKCTRL_INDEX(0x68)
-#define DRA7_TIMER8_CLKCTRL    DRA7_IPU_CLKCTRL_INDEX(0x70)
-#define DRA7_I2C5_CLKCTRL      DRA7_IPU_CLKCTRL_INDEX(0x78)
-#define DRA7_UART6_CLKCTRL     DRA7_IPU_CLKCTRL_INDEX(0x80)
+#define _DRA7_IPU_CLKCTRL_OFFSET       0x40
+#define _DRA7_IPU_CLKCTRL_INDEX(offset)        ((offset) - _DRA7_IPU_CLKCTRL_OFFSET)
+#define DRA7_MCASP1_CLKCTRL    _DRA7_IPU_CLKCTRL_INDEX(0x50)
+#define DRA7_TIMER5_CLKCTRL    _DRA7_IPU_CLKCTRL_INDEX(0x58)
+#define DRA7_TIMER6_CLKCTRL    _DRA7_IPU_CLKCTRL_INDEX(0x60)
+#define DRA7_TIMER7_CLKCTRL    _DRA7_IPU_CLKCTRL_INDEX(0x68)
+#define DRA7_TIMER8_CLKCTRL    _DRA7_IPU_CLKCTRL_INDEX(0x70)
+#define DRA7_I2C5_CLKCTRL      _DRA7_IPU_CLKCTRL_INDEX(0x78)
+#define DRA7_UART6_CLKCTRL     _DRA7_IPU_CLKCTRL_INDEX(0x80)
 
 /* rtc clocks */
 #define DRA7_RTC_CLKCTRL_OFFSET        0x40
 #define DRA7_USB_OTG_SS1_CLKCTRL       DRA7_CLKCTRL_INDEX(0xf0)
 
 /* l4per clocks */
-#define DRA7_L4PER_CLKCTRL_OFFSET      0x0
-#define DRA7_L4PER_CLKCTRL_INDEX(offset)       ((offset) - DRA7_L4PER_CLKCTRL_OFFSET)
-#define DRA7_L4_PER2_CLKCTRL   DRA7_L4PER_CLKCTRL_INDEX(0xc)
-#define DRA7_L4_PER3_CLKCTRL   DRA7_L4PER_CLKCTRL_INDEX(0x14)
-#define DRA7_TIMER10_CLKCTRL   DRA7_L4PER_CLKCTRL_INDEX(0x28)
-#define DRA7_TIMER11_CLKCTRL   DRA7_L4PER_CLKCTRL_INDEX(0x30)
-#define DRA7_TIMER2_CLKCTRL    DRA7_L4PER_CLKCTRL_INDEX(0x38)
-#define DRA7_TIMER3_CLKCTRL    DRA7_L4PER_CLKCTRL_INDEX(0x40)
-#define DRA7_TIMER4_CLKCTRL    DRA7_L4PER_CLKCTRL_INDEX(0x48)
-#define DRA7_TIMER9_CLKCTRL    DRA7_L4PER_CLKCTRL_INDEX(0x50)
-#define DRA7_ELM_CLKCTRL       DRA7_L4PER_CLKCTRL_INDEX(0x58)
-#define DRA7_GPIO2_CLKCTRL     DRA7_L4PER_CLKCTRL_INDEX(0x60)
-#define DRA7_GPIO3_CLKCTRL     DRA7_L4PER_CLKCTRL_INDEX(0x68)
-#define DRA7_GPIO4_CLKCTRL     DRA7_L4PER_CLKCTRL_INDEX(0x70)
-#define DRA7_GPIO5_CLKCTRL     DRA7_L4PER_CLKCTRL_INDEX(0x78)
-#define DRA7_GPIO6_CLKCTRL     DRA7_L4PER_CLKCTRL_INDEX(0x80)
-#define DRA7_HDQ1W_CLKCTRL     DRA7_L4PER_CLKCTRL_INDEX(0x88)
-#define DRA7_EPWMSS1_CLKCTRL   DRA7_L4PER_CLKCTRL_INDEX(0x90)
-#define DRA7_EPWMSS2_CLKCTRL   DRA7_L4PER_CLKCTRL_INDEX(0x98)
-#define DRA7_I2C1_CLKCTRL      DRA7_L4PER_CLKCTRL_INDEX(0xa0)
-#define DRA7_I2C2_CLKCTRL      DRA7_L4PER_CLKCTRL_INDEX(0xa8)
-#define DRA7_I2C3_CLKCTRL      DRA7_L4PER_CLKCTRL_INDEX(0xb0)
-#define DRA7_I2C4_CLKCTRL      DRA7_L4PER_CLKCTRL_INDEX(0xb8)
-#define DRA7_L4_PER1_CLKCTRL   DRA7_L4PER_CLKCTRL_INDEX(0xc0)
-#define DRA7_EPWMSS0_CLKCTRL   DRA7_L4PER_CLKCTRL_INDEX(0xc4)
-#define DRA7_TIMER13_CLKCTRL   DRA7_L4PER_CLKCTRL_INDEX(0xc8)
-#define DRA7_TIMER14_CLKCTRL   DRA7_L4PER_CLKCTRL_INDEX(0xd0)
-#define DRA7_TIMER15_CLKCTRL   DRA7_L4PER_CLKCTRL_INDEX(0xd8)
-#define DRA7_MCSPI1_CLKCTRL    DRA7_L4PER_CLKCTRL_INDEX(0xf0)
-#define DRA7_MCSPI2_CLKCTRL    DRA7_L4PER_CLKCTRL_INDEX(0xf8)
-#define DRA7_MCSPI3_CLKCTRL    DRA7_L4PER_CLKCTRL_INDEX(0x100)
-#define DRA7_MCSPI4_CLKCTRL    DRA7_L4PER_CLKCTRL_INDEX(0x108)
-#define DRA7_GPIO7_CLKCTRL     DRA7_L4PER_CLKCTRL_INDEX(0x110)
-#define DRA7_GPIO8_CLKCTRL     DRA7_L4PER_CLKCTRL_INDEX(0x118)
-#define DRA7_MMC3_CLKCTRL      DRA7_L4PER_CLKCTRL_INDEX(0x120)
-#define DRA7_MMC4_CLKCTRL      DRA7_L4PER_CLKCTRL_INDEX(0x128)
-#define DRA7_TIMER16_CLKCTRL   DRA7_L4PER_CLKCTRL_INDEX(0x130)
-#define DRA7_QSPI_CLKCTRL      DRA7_L4PER_CLKCTRL_INDEX(0x138)
-#define DRA7_UART1_CLKCTRL     DRA7_L4PER_CLKCTRL_INDEX(0x140)
-#define DRA7_UART2_CLKCTRL     DRA7_L4PER_CLKCTRL_INDEX(0x148)
-#define DRA7_UART3_CLKCTRL     DRA7_L4PER_CLKCTRL_INDEX(0x150)
-#define DRA7_UART4_CLKCTRL     DRA7_L4PER_CLKCTRL_INDEX(0x158)
-#define DRA7_MCASP2_CLKCTRL    DRA7_L4PER_CLKCTRL_INDEX(0x160)
-#define DRA7_MCASP3_CLKCTRL    DRA7_L4PER_CLKCTRL_INDEX(0x168)
-#define DRA7_UART5_CLKCTRL     DRA7_L4PER_CLKCTRL_INDEX(0x170)
-#define DRA7_MCASP5_CLKCTRL    DRA7_L4PER_CLKCTRL_INDEX(0x178)
-#define DRA7_MCASP8_CLKCTRL    DRA7_L4PER_CLKCTRL_INDEX(0x190)
-#define DRA7_MCASP4_CLKCTRL    DRA7_L4PER_CLKCTRL_INDEX(0x198)
-#define DRA7_AES1_CLKCTRL      DRA7_L4PER_CLKCTRL_INDEX(0x1a0)
-#define DRA7_AES2_CLKCTRL      DRA7_L4PER_CLKCTRL_INDEX(0x1a8)
-#define DRA7_DES_CLKCTRL       DRA7_L4PER_CLKCTRL_INDEX(0x1b0)
-#define DRA7_RNG_CLKCTRL       DRA7_L4PER_CLKCTRL_INDEX(0x1c0)
-#define DRA7_SHAM_CLKCTRL      DRA7_L4PER_CLKCTRL_INDEX(0x1c8)
-#define DRA7_UART7_CLKCTRL     DRA7_L4PER_CLKCTRL_INDEX(0x1d0)
-#define DRA7_UART8_CLKCTRL     DRA7_L4PER_CLKCTRL_INDEX(0x1e0)
-#define DRA7_UART9_CLKCTRL     DRA7_L4PER_CLKCTRL_INDEX(0x1e8)
-#define DRA7_DCAN2_CLKCTRL     DRA7_L4PER_CLKCTRL_INDEX(0x1f0)
-#define DRA7_MCASP6_CLKCTRL    DRA7_L4PER_CLKCTRL_INDEX(0x204)
-#define DRA7_MCASP7_CLKCTRL    DRA7_L4PER_CLKCTRL_INDEX(0x208)
+#define _DRA7_L4PER_CLKCTRL_OFFSET     0x0
+#define _DRA7_L4PER_CLKCTRL_INDEX(offset)      ((offset) - _DRA7_L4PER_CLKCTRL_OFFSET)
+#define DRA7_L4_PER2_CLKCTRL   _DRA7_L4PER_CLKCTRL_INDEX(0xc)
+#define DRA7_L4_PER3_CLKCTRL   _DRA7_L4PER_CLKCTRL_INDEX(0x14)
+#define DRA7_TIMER10_CLKCTRL   _DRA7_L4PER_CLKCTRL_INDEX(0x28)
+#define DRA7_TIMER11_CLKCTRL   _DRA7_L4PER_CLKCTRL_INDEX(0x30)
+#define DRA7_TIMER2_CLKCTRL    _DRA7_L4PER_CLKCTRL_INDEX(0x38)
+#define DRA7_TIMER3_CLKCTRL    _DRA7_L4PER_CLKCTRL_INDEX(0x40)
+#define DRA7_TIMER4_CLKCTRL    _DRA7_L4PER_CLKCTRL_INDEX(0x48)
+#define DRA7_TIMER9_CLKCTRL    _DRA7_L4PER_CLKCTRL_INDEX(0x50)
+#define DRA7_ELM_CLKCTRL       _DRA7_L4PER_CLKCTRL_INDEX(0x58)
+#define DRA7_GPIO2_CLKCTRL     _DRA7_L4PER_CLKCTRL_INDEX(0x60)
+#define DRA7_GPIO3_CLKCTRL     _DRA7_L4PER_CLKCTRL_INDEX(0x68)
+#define DRA7_GPIO4_CLKCTRL     _DRA7_L4PER_CLKCTRL_INDEX(0x70)
+#define DRA7_GPIO5_CLKCTRL     _DRA7_L4PER_CLKCTRL_INDEX(0x78)
+#define DRA7_GPIO6_CLKCTRL     _DRA7_L4PER_CLKCTRL_INDEX(0x80)
+#define DRA7_HDQ1W_CLKCTRL     _DRA7_L4PER_CLKCTRL_INDEX(0x88)
+#define DRA7_EPWMSS1_CLKCTRL   _DRA7_L4PER_CLKCTRL_INDEX(0x90)
+#define DRA7_EPWMSS2_CLKCTRL   _DRA7_L4PER_CLKCTRL_INDEX(0x98)
+#define DRA7_I2C1_CLKCTRL      _DRA7_L4PER_CLKCTRL_INDEX(0xa0)
+#define DRA7_I2C2_CLKCTRL      _DRA7_L4PER_CLKCTRL_INDEX(0xa8)
+#define DRA7_I2C3_CLKCTRL      _DRA7_L4PER_CLKCTRL_INDEX(0xb0)
+#define DRA7_I2C4_CLKCTRL      _DRA7_L4PER_CLKCTRL_INDEX(0xb8)
+#define DRA7_L4_PER1_CLKCTRL   _DRA7_L4PER_CLKCTRL_INDEX(0xc0)
+#define DRA7_EPWMSS0_CLKCTRL   _DRA7_L4PER_CLKCTRL_INDEX(0xc4)
+#define DRA7_TIMER13_CLKCTRL   _DRA7_L4PER_CLKCTRL_INDEX(0xc8)
+#define DRA7_TIMER14_CLKCTRL   _DRA7_L4PER_CLKCTRL_INDEX(0xd0)
+#define DRA7_TIMER15_CLKCTRL   _DRA7_L4PER_CLKCTRL_INDEX(0xd8)
+#define DRA7_MCSPI1_CLKCTRL    _DRA7_L4PER_CLKCTRL_INDEX(0xf0)
+#define DRA7_MCSPI2_CLKCTRL    _DRA7_L4PER_CLKCTRL_INDEX(0xf8)
+#define DRA7_MCSPI3_CLKCTRL    _DRA7_L4PER_CLKCTRL_INDEX(0x100)
+#define DRA7_MCSPI4_CLKCTRL    _DRA7_L4PER_CLKCTRL_INDEX(0x108)
+#define DRA7_GPIO7_CLKCTRL     _DRA7_L4PER_CLKCTRL_INDEX(0x110)
+#define DRA7_GPIO8_CLKCTRL     _DRA7_L4PER_CLKCTRL_INDEX(0x118)
+#define DRA7_MMC3_CLKCTRL      _DRA7_L4PER_CLKCTRL_INDEX(0x120)
+#define DRA7_MMC4_CLKCTRL      _DRA7_L4PER_CLKCTRL_INDEX(0x128)
+#define DRA7_TIMER16_CLKCTRL   _DRA7_L4PER_CLKCTRL_INDEX(0x130)
+#define DRA7_QSPI_CLKCTRL      _DRA7_L4PER_CLKCTRL_INDEX(0x138)
+#define DRA7_UART1_CLKCTRL     _DRA7_L4PER_CLKCTRL_INDEX(0x140)
+#define DRA7_UART2_CLKCTRL     _DRA7_L4PER_CLKCTRL_INDEX(0x148)
+#define DRA7_UART3_CLKCTRL     _DRA7_L4PER_CLKCTRL_INDEX(0x150)
+#define DRA7_UART4_CLKCTRL     _DRA7_L4PER_CLKCTRL_INDEX(0x158)
+#define DRA7_MCASP2_CLKCTRL    _DRA7_L4PER_CLKCTRL_INDEX(0x160)
+#define DRA7_MCASP3_CLKCTRL    _DRA7_L4PER_CLKCTRL_INDEX(0x168)
+#define DRA7_UART5_CLKCTRL     _DRA7_L4PER_CLKCTRL_INDEX(0x170)
+#define DRA7_MCASP5_CLKCTRL    _DRA7_L4PER_CLKCTRL_INDEX(0x178)
+#define DRA7_MCASP8_CLKCTRL    _DRA7_L4PER_CLKCTRL_INDEX(0x190)
+#define DRA7_MCASP4_CLKCTRL    _DRA7_L4PER_CLKCTRL_INDEX(0x198)
+#define DRA7_AES1_CLKCTRL      _DRA7_L4PER_CLKCTRL_INDEX(0x1a0)
+#define DRA7_AES2_CLKCTRL      _DRA7_L4PER_CLKCTRL_INDEX(0x1a8)
+#define DRA7_DES_CLKCTRL       _DRA7_L4PER_CLKCTRL_INDEX(0x1b0)
+#define DRA7_RNG_CLKCTRL       _DRA7_L4PER_CLKCTRL_INDEX(0x1c0)
+#define DRA7_SHAM_CLKCTRL      _DRA7_L4PER_CLKCTRL_INDEX(0x1c8)
+#define DRA7_UART7_CLKCTRL     _DRA7_L4PER_CLKCTRL_INDEX(0x1d0)
+#define DRA7_UART8_CLKCTRL     _DRA7_L4PER_CLKCTRL_INDEX(0x1e0)
+#define DRA7_UART9_CLKCTRL     _DRA7_L4PER_CLKCTRL_INDEX(0x1e8)
+#define DRA7_DCAN2_CLKCTRL     _DRA7_L4PER_CLKCTRL_INDEX(0x1f0)
+#define DRA7_MCASP6_CLKCTRL    _DRA7_L4PER_CLKCTRL_INDEX(0x204)
+#define DRA7_MCASP7_CLKCTRL    _DRA7_L4PER_CLKCTRL_INDEX(0x208)
 
 /* wkupaon clocks */
 #define DRA7_L4_WKUP_CLKCTRL   DRA7_CLKCTRL_INDEX(0x20)
 #define DRA7_DCAN1_CLKCTRL     DRA7_CLKCTRL_INDEX(0x88)
 #define DRA7_ADC_CLKCTRL       DRA7_CLKCTRL_INDEX(0xa0)
 
+/* XXX: Compatibility part end. */
+
+/* mpu clocks */
+#define DRA7_MPU_MPU_CLKCTRL   DRA7_CLKCTRL_INDEX(0x20)
+
+/* dsp1 clocks */
+#define DRA7_DSP1_MMU0_DSP1_CLKCTRL    DRA7_CLKCTRL_INDEX(0x20)
+
+/* ipu1 clocks */
+#define DRA7_IPU1_MMU_IPU1_CLKCTRL     DRA7_CLKCTRL_INDEX(0x20)
+
+/* ipu clocks */
+#define DRA7_IPU_CLKCTRL_OFFSET        0x50
+#define DRA7_IPU_CLKCTRL_INDEX(offset) ((offset) - DRA7_IPU_CLKCTRL_OFFSET)
+#define DRA7_IPU_MCASP1_CLKCTRL        DRA7_IPU_CLKCTRL_INDEX(0x50)
+#define DRA7_IPU_TIMER5_CLKCTRL        DRA7_IPU_CLKCTRL_INDEX(0x58)
+#define DRA7_IPU_TIMER6_CLKCTRL        DRA7_IPU_CLKCTRL_INDEX(0x60)
+#define DRA7_IPU_TIMER7_CLKCTRL        DRA7_IPU_CLKCTRL_INDEX(0x68)
+#define DRA7_IPU_TIMER8_CLKCTRL        DRA7_IPU_CLKCTRL_INDEX(0x70)
+#define DRA7_IPU_I2C5_CLKCTRL  DRA7_IPU_CLKCTRL_INDEX(0x78)
+#define DRA7_IPU_UART6_CLKCTRL DRA7_IPU_CLKCTRL_INDEX(0x80)
+
+/* dsp2 clocks */
+#define DRA7_DSP2_MMU0_DSP2_CLKCTRL    DRA7_CLKCTRL_INDEX(0x20)
+
+/* rtc clocks */
+#define DRA7_RTC_RTCSS_CLKCTRL DRA7_CLKCTRL_INDEX(0x44)
+
+/* coreaon clocks */
+#define DRA7_COREAON_SMARTREFLEX_MPU_CLKCTRL   DRA7_CLKCTRL_INDEX(0x28)
+#define DRA7_COREAON_SMARTREFLEX_CORE_CLKCTRL  DRA7_CLKCTRL_INDEX(0x38)
+
+/* l3main1 clocks */
+#define DRA7_L3MAIN1_L3_MAIN_1_CLKCTRL DRA7_CLKCTRL_INDEX(0x20)
+#define DRA7_L3MAIN1_GPMC_CLKCTRL      DRA7_CLKCTRL_INDEX(0x28)
+#define DRA7_L3MAIN1_TPCC_CLKCTRL      DRA7_CLKCTRL_INDEX(0x70)
+#define DRA7_L3MAIN1_TPTC0_CLKCTRL     DRA7_CLKCTRL_INDEX(0x78)
+#define DRA7_L3MAIN1_TPTC1_CLKCTRL     DRA7_CLKCTRL_INDEX(0x80)
+#define DRA7_L3MAIN1_VCP1_CLKCTRL      DRA7_CLKCTRL_INDEX(0x88)
+#define DRA7_L3MAIN1_VCP2_CLKCTRL      DRA7_CLKCTRL_INDEX(0x90)
+
+/* ipu2 clocks */
+#define DRA7_IPU2_MMU_IPU2_CLKCTRL     DRA7_CLKCTRL_INDEX(0x20)
+
+/* dma clocks */
+#define DRA7_DMA_DMA_SYSTEM_CLKCTRL    DRA7_CLKCTRL_INDEX(0x20)
+
+/* emif clocks */
+#define DRA7_EMIF_DMM_CLKCTRL  DRA7_CLKCTRL_INDEX(0x20)
+
+/* atl clocks */
+#define DRA7_ATL_CLKCTRL_OFFSET        0x0
+#define DRA7_ATL_CLKCTRL_INDEX(offset) ((offset) - DRA7_ATL_CLKCTRL_OFFSET)
+#define DRA7_ATL_ATL_CLKCTRL   DRA7_ATL_CLKCTRL_INDEX(0x0)
+
+/* l4cfg clocks */
+#define DRA7_L4CFG_L4_CFG_CLKCTRL      DRA7_CLKCTRL_INDEX(0x20)
+#define DRA7_L4CFG_SPINLOCK_CLKCTRL    DRA7_CLKCTRL_INDEX(0x28)
+#define DRA7_L4CFG_MAILBOX1_CLKCTRL    DRA7_CLKCTRL_INDEX(0x30)
+#define DRA7_L4CFG_MAILBOX2_CLKCTRL    DRA7_CLKCTRL_INDEX(0x48)
+#define DRA7_L4CFG_MAILBOX3_CLKCTRL    DRA7_CLKCTRL_INDEX(0x50)
+#define DRA7_L4CFG_MAILBOX4_CLKCTRL    DRA7_CLKCTRL_INDEX(0x58)
+#define DRA7_L4CFG_MAILBOX5_CLKCTRL    DRA7_CLKCTRL_INDEX(0x60)
+#define DRA7_L4CFG_MAILBOX6_CLKCTRL    DRA7_CLKCTRL_INDEX(0x68)
+#define DRA7_L4CFG_MAILBOX7_CLKCTRL    DRA7_CLKCTRL_INDEX(0x70)
+#define DRA7_L4CFG_MAILBOX8_CLKCTRL    DRA7_CLKCTRL_INDEX(0x78)
+#define DRA7_L4CFG_MAILBOX9_CLKCTRL    DRA7_CLKCTRL_INDEX(0x80)
+#define DRA7_L4CFG_MAILBOX10_CLKCTRL   DRA7_CLKCTRL_INDEX(0x88)
+#define DRA7_L4CFG_MAILBOX11_CLKCTRL   DRA7_CLKCTRL_INDEX(0x90)
+#define DRA7_L4CFG_MAILBOX12_CLKCTRL   DRA7_CLKCTRL_INDEX(0x98)
+#define DRA7_L4CFG_MAILBOX13_CLKCTRL   DRA7_CLKCTRL_INDEX(0xa0)
+
+/* l3instr clocks */
+#define DRA7_L3INSTR_L3_MAIN_2_CLKCTRL DRA7_CLKCTRL_INDEX(0x20)
+#define DRA7_L3INSTR_L3_INSTR_CLKCTRL  DRA7_CLKCTRL_INDEX(0x28)
+
+/* dss clocks */
+#define DRA7_DSS_DSS_CORE_CLKCTRL      DRA7_CLKCTRL_INDEX(0x20)
+#define DRA7_DSS_BB2D_CLKCTRL  DRA7_CLKCTRL_INDEX(0x30)
+
+/* l3init clocks */
+#define DRA7_L3INIT_MMC1_CLKCTRL       DRA7_CLKCTRL_INDEX(0x28)
+#define DRA7_L3INIT_MMC2_CLKCTRL       DRA7_CLKCTRL_INDEX(0x30)
+#define DRA7_L3INIT_USB_OTG_SS2_CLKCTRL        DRA7_CLKCTRL_INDEX(0x40)
+#define DRA7_L3INIT_USB_OTG_SS3_CLKCTRL        DRA7_CLKCTRL_INDEX(0x48)
+#define DRA7_L3INIT_USB_OTG_SS4_CLKCTRL        DRA7_CLKCTRL_INDEX(0x50)
+#define DRA7_L3INIT_SATA_CLKCTRL       DRA7_CLKCTRL_INDEX(0x88)
+#define DRA7_L3INIT_OCP2SCP1_CLKCTRL   DRA7_CLKCTRL_INDEX(0xe0)
+#define DRA7_L3INIT_OCP2SCP3_CLKCTRL   DRA7_CLKCTRL_INDEX(0xe8)
+#define DRA7_L3INIT_USB_OTG_SS1_CLKCTRL        DRA7_CLKCTRL_INDEX(0xf0)
+
+/* pcie clocks */
+#define DRA7_PCIE_CLKCTRL_OFFSET       0xb0
+#define DRA7_PCIE_CLKCTRL_INDEX(offset)        ((offset) - DRA7_PCIE_CLKCTRL_OFFSET)
+#define DRA7_PCIE_PCIE1_CLKCTRL        DRA7_PCIE_CLKCTRL_INDEX(0xb0)
+#define DRA7_PCIE_PCIE2_CLKCTRL        DRA7_PCIE_CLKCTRL_INDEX(0xb8)
+
+/* gmac clocks */
+#define DRA7_GMAC_CLKCTRL_OFFSET       0xd0
+#define DRA7_GMAC_CLKCTRL_INDEX(offset)        ((offset) - DRA7_GMAC_CLKCTRL_OFFSET)
+#define DRA7_GMAC_GMAC_CLKCTRL DRA7_GMAC_CLKCTRL_INDEX(0xd0)
+
+/* l4per clocks */
+#define DRA7_L4PER_CLKCTRL_OFFSET      0x28
+#define DRA7_L4PER_CLKCTRL_INDEX(offset)       ((offset) - DRA7_L4PER_CLKCTRL_OFFSET)
+#define DRA7_L4PER_TIMER10_CLKCTRL     DRA7_L4PER_CLKCTRL_INDEX(0x28)
+#define DRA7_L4PER_TIMER11_CLKCTRL     DRA7_L4PER_CLKCTRL_INDEX(0x30)
+#define DRA7_L4PER_TIMER2_CLKCTRL      DRA7_L4PER_CLKCTRL_INDEX(0x38)
+#define DRA7_L4PER_TIMER3_CLKCTRL      DRA7_L4PER_CLKCTRL_INDEX(0x40)
+#define DRA7_L4PER_TIMER4_CLKCTRL      DRA7_L4PER_CLKCTRL_INDEX(0x48)
+#define DRA7_L4PER_TIMER9_CLKCTRL      DRA7_L4PER_CLKCTRL_INDEX(0x50)
+#define DRA7_L4PER_ELM_CLKCTRL DRA7_L4PER_CLKCTRL_INDEX(0x58)
+#define DRA7_L4PER_GPIO2_CLKCTRL       DRA7_L4PER_CLKCTRL_INDEX(0x60)
+#define DRA7_L4PER_GPIO3_CLKCTRL       DRA7_L4PER_CLKCTRL_INDEX(0x68)
+#define DRA7_L4PER_GPIO4_CLKCTRL       DRA7_L4PER_CLKCTRL_INDEX(0x70)
+#define DRA7_L4PER_GPIO5_CLKCTRL       DRA7_L4PER_CLKCTRL_INDEX(0x78)
+#define DRA7_L4PER_GPIO6_CLKCTRL       DRA7_L4PER_CLKCTRL_INDEX(0x80)
+#define DRA7_L4PER_HDQ1W_CLKCTRL       DRA7_L4PER_CLKCTRL_INDEX(0x88)
+#define DRA7_L4PER_I2C1_CLKCTRL        DRA7_L4PER_CLKCTRL_INDEX(0xa0)
+#define DRA7_L4PER_I2C2_CLKCTRL        DRA7_L4PER_CLKCTRL_INDEX(0xa8)
+#define DRA7_L4PER_I2C3_CLKCTRL        DRA7_L4PER_CLKCTRL_INDEX(0xb0)
+#define DRA7_L4PER_I2C4_CLKCTRL        DRA7_L4PER_CLKCTRL_INDEX(0xb8)
+#define DRA7_L4PER_L4_PER1_CLKCTRL     DRA7_L4PER_CLKCTRL_INDEX(0xc0)
+#define DRA7_L4PER_MCSPI1_CLKCTRL      DRA7_L4PER_CLKCTRL_INDEX(0xf0)
+#define DRA7_L4PER_MCSPI2_CLKCTRL      DRA7_L4PER_CLKCTRL_INDEX(0xf8)
+#define DRA7_L4PER_MCSPI3_CLKCTRL      DRA7_L4PER_CLKCTRL_INDEX(0x100)
+#define DRA7_L4PER_MCSPI4_CLKCTRL      DRA7_L4PER_CLKCTRL_INDEX(0x108)
+#define DRA7_L4PER_GPIO7_CLKCTRL       DRA7_L4PER_CLKCTRL_INDEX(0x110)
+#define DRA7_L4PER_GPIO8_CLKCTRL       DRA7_L4PER_CLKCTRL_INDEX(0x118)
+#define DRA7_L4PER_MMC3_CLKCTRL        DRA7_L4PER_CLKCTRL_INDEX(0x120)
+#define DRA7_L4PER_MMC4_CLKCTRL        DRA7_L4PER_CLKCTRL_INDEX(0x128)
+#define DRA7_L4PER_UART1_CLKCTRL       DRA7_L4PER_CLKCTRL_INDEX(0x140)
+#define DRA7_L4PER_UART2_CLKCTRL       DRA7_L4PER_CLKCTRL_INDEX(0x148)
+#define DRA7_L4PER_UART3_CLKCTRL       DRA7_L4PER_CLKCTRL_INDEX(0x150)
+#define DRA7_L4PER_UART4_CLKCTRL       DRA7_L4PER_CLKCTRL_INDEX(0x158)
+#define DRA7_L4PER_UART5_CLKCTRL       DRA7_L4PER_CLKCTRL_INDEX(0x170)
+
+/* l4sec clocks */
+#define DRA7_L4SEC_CLKCTRL_OFFSET      0x1a0
+#define DRA7_L4SEC_CLKCTRL_INDEX(offset)       ((offset) - DRA7_L4SEC_CLKCTRL_OFFSET)
+#define DRA7_L4SEC_AES1_CLKCTRL        DRA7_L4SEC_CLKCTRL_INDEX(0x1a0)
+#define DRA7_L4SEC_AES2_CLKCTRL        DRA7_L4SEC_CLKCTRL_INDEX(0x1a8)
+#define DRA7_L4SEC_DES_CLKCTRL DRA7_L4SEC_CLKCTRL_INDEX(0x1b0)
+#define DRA7_L4SEC_RNG_CLKCTRL DRA7_L4SEC_CLKCTRL_INDEX(0x1c0)
+#define DRA7_L4SEC_SHAM_CLKCTRL        DRA7_L4SEC_CLKCTRL_INDEX(0x1c8)
+
+/* l4per2 clocks */
+#define DRA7_L4PER2_CLKCTRL_OFFSET     0xc
+#define DRA7_L4PER2_CLKCTRL_INDEX(offset)      ((offset) - DRA7_L4PER2_CLKCTRL_OFFSET)
+#define DRA7_L4PER2_L4_PER2_CLKCTRL    DRA7_L4PER2_CLKCTRL_INDEX(0xc)
+#define DRA7_L4PER2_PRUSS1_CLKCTRL     DRA7_L4PER2_CLKCTRL_INDEX(0x18)
+#define DRA7_L4PER2_PRUSS2_CLKCTRL     DRA7_L4PER2_CLKCTRL_INDEX(0x20)
+#define DRA7_L4PER2_EPWMSS1_CLKCTRL    DRA7_L4PER2_CLKCTRL_INDEX(0x90)
+#define DRA7_L4PER2_EPWMSS2_CLKCTRL    DRA7_L4PER2_CLKCTRL_INDEX(0x98)
+#define DRA7_L4PER2_EPWMSS0_CLKCTRL    DRA7_L4PER2_CLKCTRL_INDEX(0xc4)
+#define DRA7_L4PER2_QSPI_CLKCTRL       DRA7_L4PER2_CLKCTRL_INDEX(0x138)
+#define DRA7_L4PER2_MCASP2_CLKCTRL     DRA7_L4PER2_CLKCTRL_INDEX(0x160)
+#define DRA7_L4PER2_MCASP3_CLKCTRL     DRA7_L4PER2_CLKCTRL_INDEX(0x168)
+#define DRA7_L4PER2_MCASP5_CLKCTRL     DRA7_L4PER2_CLKCTRL_INDEX(0x178)
+#define DRA7_L4PER2_MCASP8_CLKCTRL     DRA7_L4PER2_CLKCTRL_INDEX(0x190)
+#define DRA7_L4PER2_MCASP4_CLKCTRL     DRA7_L4PER2_CLKCTRL_INDEX(0x198)
+#define DRA7_L4PER2_UART7_CLKCTRL      DRA7_L4PER2_CLKCTRL_INDEX(0x1d0)
+#define DRA7_L4PER2_UART8_CLKCTRL      DRA7_L4PER2_CLKCTRL_INDEX(0x1e0)
+#define DRA7_L4PER2_UART9_CLKCTRL      DRA7_L4PER2_CLKCTRL_INDEX(0x1e8)
+#define DRA7_L4PER2_DCAN2_CLKCTRL      DRA7_L4PER2_CLKCTRL_INDEX(0x1f0)
+#define DRA7_L4PER2_MCASP6_CLKCTRL     DRA7_L4PER2_CLKCTRL_INDEX(0x204)
+#define DRA7_L4PER2_MCASP7_CLKCTRL     DRA7_L4PER2_CLKCTRL_INDEX(0x208)
+
+/* l4per3 clocks */
+#define DRA7_L4PER3_CLKCTRL_OFFSET     0x14
+#define DRA7_L4PER3_CLKCTRL_INDEX(offset)      ((offset) - DRA7_L4PER3_CLKCTRL_OFFSET)
+#define DRA7_L4PER3_L4_PER3_CLKCTRL    DRA7_L4PER3_CLKCTRL_INDEX(0x14)
+#define DRA7_L4PER3_TIMER13_CLKCTRL    DRA7_L4PER3_CLKCTRL_INDEX(0xc8)
+#define DRA7_L4PER3_TIMER14_CLKCTRL    DRA7_L4PER3_CLKCTRL_INDEX(0xd0)
+#define DRA7_L4PER3_TIMER15_CLKCTRL    DRA7_L4PER3_CLKCTRL_INDEX(0xd8)
+#define DRA7_L4PER3_TIMER16_CLKCTRL    DRA7_L4PER3_CLKCTRL_INDEX(0x130)
+
+/* wkupaon clocks */
+#define DRA7_WKUPAON_L4_WKUP_CLKCTRL   DRA7_CLKCTRL_INDEX(0x20)
+#define DRA7_WKUPAON_WD_TIMER2_CLKCTRL DRA7_CLKCTRL_INDEX(0x30)
+#define DRA7_WKUPAON_GPIO1_CLKCTRL     DRA7_CLKCTRL_INDEX(0x38)
+#define DRA7_WKUPAON_TIMER1_CLKCTRL    DRA7_CLKCTRL_INDEX(0x40)
+#define DRA7_WKUPAON_TIMER12_CLKCTRL   DRA7_CLKCTRL_INDEX(0x48)
+#define DRA7_WKUPAON_COUNTER_32K_CLKCTRL       DRA7_CLKCTRL_INDEX(0x50)
+#define DRA7_WKUPAON_UART10_CLKCTRL    DRA7_CLKCTRL_INDEX(0x80)
+#define DRA7_WKUPAON_DCAN1_CLKCTRL     DRA7_CLKCTRL_INDEX(0x88)
+#define DRA7_WKUPAON_ADC_CLKCTRL       DRA7_CLKCTRL_INDEX(0xa0)
+
 #endif
index c796ff02ceeb10829a70680adb4f585a0dee1752..fe8214017b466f4b5ec75fa6461edac4a8395117 100644 (file)
@@ -1,11 +1,8 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
  *     Author: Tomasz Figa <t.figa@samsung.com>
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
  * Device Tree binding constants for Samsung Exynos3250 clock controllers.
  */
 
index e9f9d400c322f10f04417d69456de75a4d3be17e..a0439ce8e8d332fc9ced4807d6605dfd712445a4 100644 (file)
@@ -1,13 +1,10 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  * Copyright (c) 2013 Samsung Electronics Co., Ltd.
  * Author: Andrzej Hajda <a.hajda@samsung.com>
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
  * Device Tree binding constants for Exynos4 clock controller.
-*/
+ */
 
 #ifndef _DT_BINDINGS_CLOCK_EXYNOS_4_H
 #define _DT_BINDINGS_CLOCK_EXYNOS_4_H
 #define CLK_MIPI_HSI           349 /* Exynos4210 only */
 #define CLK_PIXELASYNCM0       351
 #define CLK_PIXELASYNCM1       352
-#define CLK_FIMC_LITE0         353 /* Exynos4x12 only */
-#define CLK_FIMC_LITE1         354 /* Exynos4x12 only */
-#define CLK_PPMUISPX           355 /* Exynos4x12 only */
-#define CLK_PPMUISPMX          356 /* Exynos4x12 only */
-#define CLK_FIMC_ISP           357 /* Exynos4x12 only */
-#define CLK_FIMC_DRC           358 /* Exynos4x12 only */
-#define CLK_FIMC_FD            359 /* Exynos4x12 only */
-#define CLK_MCUISP             360 /* Exynos4x12 only */
-#define CLK_GICISP             361 /* Exynos4x12 only */
-#define CLK_SMMU_ISP           362 /* Exynos4x12 only */
-#define CLK_SMMU_DRC           363 /* Exynos4x12 only */
-#define CLK_SMMU_FD            364 /* Exynos4x12 only */
-#define CLK_SMMU_LITE0         365 /* Exynos4x12 only */
-#define CLK_SMMU_LITE1         366 /* Exynos4x12 only */
-#define CLK_MCUCTL_ISP         367 /* Exynos4x12 only */
-#define CLK_MPWM_ISP           368 /* Exynos4x12 only */
-#define CLK_I2C0_ISP           369 /* Exynos4x12 only */
-#define CLK_I2C1_ISP           370 /* Exynos4x12 only */
-#define CLK_MTCADC_ISP         371 /* Exynos4x12 only */
-#define CLK_PWM_ISP            372 /* Exynos4x12 only */
-#define CLK_WDT_ISP            373 /* Exynos4x12 only */
-#define CLK_UART_ISP           374 /* Exynos4x12 only */
-#define CLK_ASYNCAXIM          375 /* Exynos4x12 only */
-#define CLK_SMMU_ISPCX         376 /* Exynos4x12 only */
-#define CLK_SPI0_ISP           377 /* Exynos4x12 only */
-#define CLK_SPI1_ISP           378 /* Exynos4x12 only */
 #define CLK_PWM_ISP_SCLK       379 /* Exynos4x12 only */
 #define CLK_SPI0_ISP_SCLK      380 /* Exynos4x12 only */
 #define CLK_SPI1_ISP_SCLK      381 /* Exynos4x12 only */
 #define CLK_PPMUACP            415
 
 /* div clocks */
-#define CLK_DIV_ISP0           450 /* Exynos4x12 only */
-#define CLK_DIV_ISP1           451 /* Exynos4x12 only */
-#define CLK_DIV_MCUISP0                452 /* Exynos4x12 only */
-#define CLK_DIV_MCUISP1                453 /* Exynos4x12 only */
 #define CLK_DIV_ACLK200                454 /* Exynos4x12 only */
 #define CLK_DIV_ACLK400_MCUISP 455 /* Exynos4x12 only */
 #define CLK_DIV_ACP            456
index 15508adcdfde5451a8d8a230bf0f2e3c29cbd7a4..bc8a3c53a54b8dc087d506c6e11a975839857de1 100644 (file)
@@ -1,13 +1,10 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  * Copyright (c) 2013 Samsung Electronics Co., Ltd.
  * Author: Andrzej Hajda <a.hajda@samsung.com>
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
  * Device Tree binding constants for Exynos5250 clock controller.
-*/
+ */
 
 #ifndef _DT_BINDINGS_CLOCK_EXYNOS_5250_H
 #define _DT_BINDINGS_CLOCK_EXYNOS_5250_H
index a4bac9a1764fc1cde39aa52dbd51f1a22f13b16e..98a58cbd81b2c3c3571e1d58fe72ce0400665042 100644 (file)
@@ -1,13 +1,10 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
  * Author: Rahul Sharma <rahul.sharma@samsung.com>
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
  * Provides Constants for Exynos5260 clocks.
-*/
+ */
 
 #ifndef _DT_BINDINGS_CLK_EXYNOS5260_H
 #define _DT_BINDINGS_CLK_EXYNOS5260_H
index 6cb4e90f81fc33628d23f353cbbd6cba00815945..f179eabbcdb70382dc99062d097f6e45dcb14351 100644 (file)
@@ -1,13 +1,10 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
  * Copyright (c) 2016 Krzysztof Kozlowski
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
  * Device Tree binding constants for Exynos5421 clock controller.
-*/
+ */
 
 #ifndef _DT_BINDINGS_CLOCK_EXYNOS_5410_H
 #define _DT_BINDINGS_CLOCK_EXYNOS_5410_H
index 2740ae0424a97836cc3212f773fea13f4e91a53d..355f469943f1d77abb6e0992fad6bc4f699672b8 100644 (file)
@@ -1,13 +1,10 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  * Copyright (c) 2013 Samsung Electronics Co., Ltd.
  * Author: Andrzej Hajda <a.hajda@samsung.com>
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
  * Device Tree binding constants for Exynos5420 clock controller.
-*/
+ */
 
 #ifndef _DT_BINDINGS_CLOCK_EXYNOS_5420_H
 #define _DT_BINDINGS_CLOCK_EXYNOS_5420_H
index be39d23e6a32ecf3e4fa24343ea518352db75f8e..98bd85ce1e452740f7e7a91ede9a12f124933534 100644 (file)
@@ -1,10 +1,7 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
  * Author: Chanwoo Choi <cw00.choi@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
  */
 
 #ifndef _DT_BINDINGS_CLOCK_EXYNOS5433_H
index 10c558611085df705e982623a1934031015de461..fce33c7050c85c296df9c6df4af08587b8c44c6b 100644 (file)
@@ -1,11 +1,8 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
  * Author: Naveen Krishna Ch <naveenkrishna.ch@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
+ */
 
 #ifndef _DT_BINDINGS_CLOCK_EXYNOS7_H
 #define _DT_BINDINGS_CLOCK_EXYNOS7_H
diff --git a/include/dt-bindings/clock/hi3670-clock.h b/include/dt-bindings/clock/hi3670-clock.h
new file mode 100644 (file)
index 0000000..fa48583
--- /dev/null
@@ -0,0 +1,348 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Device Tree binding constants for HiSilicon Hi3670 SoC
+ *
+ * Copyright (c) 2001-2021, Huawei Tech. Co., Ltd.
+ * Copyright (c) 2018 Linaro Ltd.
+ */
+
+#ifndef __DT_BINDINGS_CLOCK_HI3670_H
+#define __DT_BINDINGS_CLOCK_HI3670_H
+
+/* clk in stub clock */
+#define HI3670_CLK_STUB_CLUSTER0               0
+#define HI3670_CLK_STUB_CLUSTER1               1
+#define HI3670_CLK_STUB_GPU                    2
+#define HI3670_CLK_STUB_DDR                    3
+#define HI3670_CLK_STUB_DDR_VOTE               4
+#define HI3670_CLK_STUB_DDR_LIMIT              5
+#define HI3670_CLK_STUB_NUM                    6
+
+/* clk in crg clock */
+#define HI3670_CLKIN_SYS                       0
+#define HI3670_CLKIN_REF                       1
+#define HI3670_CLK_FLL_SRC                     2
+#define HI3670_CLK_PPLL0                       3
+#define HI3670_CLK_PPLL1                       4
+#define HI3670_CLK_PPLL2                       5
+#define HI3670_CLK_PPLL3                       6
+#define HI3670_CLK_PPLL4                       7
+#define HI3670_CLK_PPLL6                       8
+#define HI3670_CLK_PPLL7                       9
+#define HI3670_CLK_PPLL_PCIE                   10
+#define HI3670_CLK_PCIEPLL_REV                 11
+#define HI3670_CLK_SCPLL                       12
+#define HI3670_PCLK                            13
+#define HI3670_CLK_UART0_DBG                   14
+#define HI3670_CLK_UART6                       15
+#define HI3670_OSC32K                          16
+#define HI3670_OSC19M                          17
+#define HI3670_CLK_480M                                18
+#define HI3670_CLK_INVALID                     19
+#define HI3670_CLK_DIV_SYSBUS                  20
+#define HI3670_CLK_FACTOR_MMC                  21
+#define HI3670_CLK_SD_SYS                      22
+#define HI3670_CLK_SDIO_SYS                    23
+#define HI3670_CLK_DIV_A53HPM                  24
+#define HI3670_CLK_DIV_320M                    25
+#define HI3670_PCLK_GATE_UART0                 26
+#define HI3670_CLK_FACTOR_UART0                        27
+#define HI3670_CLK_FACTOR_USB3PHY_PLL          28
+#define HI3670_CLK_GATE_ABB_USB                        29
+#define HI3670_CLK_GATE_UFSPHY_REF             30
+#define HI3670_ICS_VOLT_HIGH                   31
+#define HI3670_ICS_VOLT_MIDDLE                 32
+#define HI3670_VENC_VOLT_HOLD                  33
+#define HI3670_VDEC_VOLT_HOLD                  34
+#define HI3670_EDC_VOLT_HOLD                   35
+#define HI3670_CLK_ISP_SNCLK_FAC               36
+#define HI3670_CLK_FACTOR_RXDPHY               37
+#define HI3670_AUTODIV_SYSBUS                  38
+#define HI3670_AUTODIV_EMMC0BUS                        39
+#define HI3670_PCLK_ANDGT_MMC1_PCIE            40
+#define HI3670_CLK_GATE_VCODECBUS_GT           41
+#define HI3670_CLK_ANDGT_SD                    42
+#define HI3670_CLK_SD_SYS_GT                   43
+#define HI3670_CLK_ANDGT_SDIO                  44
+#define HI3670_CLK_SDIO_SYS_GT                 45
+#define HI3670_CLK_A53HPM_ANDGT                        46
+#define HI3670_CLK_320M_PLL_GT                 47
+#define HI3670_CLK_ANDGT_UARTH                 48
+#define HI3670_CLK_ANDGT_UARTL                 49
+#define HI3670_CLK_ANDGT_UART0                 50
+#define HI3670_CLK_ANDGT_SPI                   51
+#define HI3670_CLK_ANDGT_PCIEAXI               52
+#define HI3670_CLK_DIV_AO_ASP_GT               53
+#define HI3670_CLK_GATE_CSI_TRANS              54
+#define HI3670_CLK_GATE_DSI_TRANS              55
+#define HI3670_CLK_ANDGT_PTP                   56
+#define HI3670_CLK_ANDGT_OUT0                  57
+#define HI3670_CLK_ANDGT_OUT1                  58
+#define HI3670_CLKGT_DP_AUDIO_PLL_AO           59
+#define HI3670_CLK_ANDGT_VDEC                  60
+#define HI3670_CLK_ANDGT_VENC                  61
+#define HI3670_CLK_ISP_SNCLK_ANGT              62
+#define HI3670_CLK_ANDGT_RXDPHY                        63
+#define HI3670_CLK_ANDGT_ICS                   64
+#define HI3670_AUTODIV_DMABUS                  65
+#define HI3670_CLK_MUX_SYSBUS                  66
+#define HI3670_CLK_MUX_VCODECBUS               67
+#define HI3670_CLK_MUX_SD_SYS                  68
+#define HI3670_CLK_MUX_SD_PLL                  69
+#define HI3670_CLK_MUX_SDIO_SYS                        70
+#define HI3670_CLK_MUX_SDIO_PLL                        71
+#define HI3670_CLK_MUX_A53HPM                  72
+#define HI3670_CLK_MUX_320M                    73
+#define HI3670_CLK_MUX_UARTH                   74
+#define HI3670_CLK_MUX_UARTL                   75
+#define HI3670_CLK_MUX_UART0                   76
+#define HI3670_CLK_MUX_I2C                     77
+#define HI3670_CLK_MUX_SPI                     78
+#define HI3670_CLK_MUX_PCIEAXI                 79
+#define HI3670_CLK_MUX_AO_ASP                  80
+#define HI3670_CLK_MUX_VDEC                    81
+#define HI3670_CLK_MUX_VENC                    82
+#define HI3670_CLK_ISP_SNCLK_MUX0              83
+#define HI3670_CLK_ISP_SNCLK_MUX1              84
+#define HI3670_CLK_ISP_SNCLK_MUX2              85
+#define HI3670_CLK_MUX_RXDPHY_CFG              86
+#define HI3670_CLK_MUX_ICS                     87
+#define HI3670_CLK_DIV_CFGBUS                  88
+#define HI3670_CLK_DIV_MMC0BUS                 89
+#define HI3670_CLK_DIV_MMC1BUS                 90
+#define HI3670_PCLK_DIV_MMC1_PCIE              91
+#define HI3670_CLK_DIV_VCODECBUS               92
+#define HI3670_CLK_DIV_SD                      93
+#define HI3670_CLK_DIV_SDIO                    94
+#define HI3670_CLK_DIV_UARTH                   95
+#define HI3670_CLK_DIV_UARTL                   96
+#define HI3670_CLK_DIV_UART0                   97
+#define HI3670_CLK_DIV_I2C                     98
+#define HI3670_CLK_DIV_SPI                     99
+#define HI3670_CLK_DIV_PCIEAXI                 100
+#define HI3670_CLK_DIV_AO_ASP                  101
+#define HI3670_CLK_DIV_CSI_TRANS               102
+#define HI3670_CLK_DIV_DSI_TRANS               103
+#define HI3670_CLK_DIV_PTP                     104
+#define HI3670_CLK_DIV_CLKOUT0_PLL             105
+#define HI3670_CLK_DIV_CLKOUT1_PLL             106
+#define HI3670_CLKDIV_DP_AUDIO_PLL_AO          107
+#define HI3670_CLK_DIV_VDEC                    108
+#define HI3670_CLK_DIV_VENC                    109
+#define HI3670_CLK_ISP_SNCLK_DIV0              110
+#define HI3670_CLK_ISP_SNCLK_DIV1              111
+#define HI3670_CLK_ISP_SNCLK_DIV2              112
+#define HI3670_CLK_DIV_ICS                     113
+#define HI3670_PPLL1_EN_ACPU                   114
+#define HI3670_PPLL2_EN_ACPU                   115
+#define HI3670_PPLL3_EN_ACPU                   116
+#define HI3670_PPLL1_GT_CPU                    117
+#define HI3670_PPLL2_GT_CPU                    118
+#define HI3670_PPLL3_GT_CPU                    119
+#define HI3670_CLK_GATE_PPLL2_MEDIA            120
+#define HI3670_CLK_GATE_PPLL3_MEDIA            121
+#define HI3670_CLK_GATE_PPLL4_MEDIA            122
+#define HI3670_CLK_GATE_PPLL6_MEDIA            123
+#define HI3670_CLK_GATE_PPLL7_MEDIA            124
+#define HI3670_PCLK_GPIO0                      125
+#define HI3670_PCLK_GPIO1                      126
+#define HI3670_PCLK_GPIO2                      127
+#define HI3670_PCLK_GPIO3                      128
+#define HI3670_PCLK_GPIO4                      129
+#define HI3670_PCLK_GPIO5                      130
+#define HI3670_PCLK_GPIO6                      131
+#define HI3670_PCLK_GPIO7                      132
+#define HI3670_PCLK_GPIO8                      133
+#define HI3670_PCLK_GPIO9                      134
+#define HI3670_PCLK_GPIO10                     135
+#define HI3670_PCLK_GPIO11                     136
+#define HI3670_PCLK_GPIO12                     137
+#define HI3670_PCLK_GPIO13                     138
+#define HI3670_PCLK_GPIO14                     139
+#define HI3670_PCLK_GPIO15                     140
+#define HI3670_PCLK_GPIO16                     141
+#define HI3670_PCLK_GPIO17                     142
+#define HI3670_PCLK_GPIO20                     143
+#define HI3670_PCLK_GPIO21                     144
+#define HI3670_PCLK_GATE_DSI0                  145
+#define HI3670_PCLK_GATE_DSI1                  146
+#define HI3670_HCLK_GATE_USB3OTG               147
+#define HI3670_ACLK_GATE_USB3DVFS              148
+#define HI3670_HCLK_GATE_SDIO                  149
+#define HI3670_PCLK_GATE_PCIE_SYS              150
+#define HI3670_PCLK_GATE_PCIE_PHY              151
+#define HI3670_PCLK_GATE_MMC1_PCIE             152
+#define HI3670_PCLK_GATE_MMC0_IOC              153
+#define HI3670_PCLK_GATE_MMC1_IOC              154
+#define HI3670_CLK_GATE_DMAC                   155
+#define HI3670_CLK_GATE_VCODECBUS2DDR          156
+#define HI3670_CLK_CCI400_BYPASS               157
+#define HI3670_CLK_GATE_CCI400                 158
+#define HI3670_CLK_GATE_SD                     159
+#define HI3670_HCLK_GATE_SD                    160
+#define HI3670_CLK_GATE_SDIO                   161
+#define HI3670_CLK_GATE_A57HPM                 162
+#define HI3670_CLK_GATE_A53HPM                 163
+#define HI3670_CLK_GATE_PA_A53                 164
+#define HI3670_CLK_GATE_PA_A57                 165
+#define HI3670_CLK_GATE_PA_G3D                 166
+#define HI3670_CLK_GATE_GPUHPM                 167
+#define HI3670_CLK_GATE_PERIHPM                        168
+#define HI3670_CLK_GATE_AOHPM                  169
+#define HI3670_CLK_GATE_UART1                  170
+#define HI3670_CLK_GATE_UART4                  171
+#define HI3670_PCLK_GATE_UART1                 172
+#define HI3670_PCLK_GATE_UART4                 173
+#define HI3670_CLK_GATE_UART2                  174
+#define HI3670_CLK_GATE_UART5                  175
+#define HI3670_PCLK_GATE_UART2                 176
+#define HI3670_PCLK_GATE_UART5                 177
+#define HI3670_CLK_GATE_UART0                  178
+#define HI3670_CLK_GATE_I2C3                   179
+#define HI3670_CLK_GATE_I2C4                   180
+#define HI3670_CLK_GATE_I2C7                   181
+#define HI3670_PCLK_GATE_I2C3                  182
+#define HI3670_PCLK_GATE_I2C4                  183
+#define HI3670_PCLK_GATE_I2C7                  184
+#define HI3670_CLK_GATE_SPI1                   185
+#define HI3670_CLK_GATE_SPI4                   186
+#define HI3670_PCLK_GATE_SPI1                  187
+#define HI3670_PCLK_GATE_SPI4                  188
+#define HI3670_CLK_GATE_USB3OTG_REF            189
+#define HI3670_CLK_GATE_USB2PHY_REF            190
+#define HI3670_CLK_GATE_PCIEAUX                        191
+#define HI3670_ACLK_GATE_PCIE                  192
+#define HI3670_CLK_GATE_MMC1_PCIEAXI           193
+#define HI3670_CLK_GATE_PCIEPHY_REF            194
+#define HI3670_CLK_GATE_PCIE_DEBOUNCE          195
+#define HI3670_CLK_GATE_PCIEIO                 196
+#define HI3670_CLK_GATE_PCIE_HP                        197
+#define HI3670_CLK_GATE_AO_ASP                 198
+#define HI3670_PCLK_GATE_PCTRL                 199
+#define HI3670_CLK_CSI_TRANS_GT                        200
+#define HI3670_CLK_DSI_TRANS_GT                        201
+#define HI3670_CLK_GATE_PWM                    202
+#define HI3670_ABB_AUDIO_EN0                   203
+#define HI3670_ABB_AUDIO_EN1                   204
+#define HI3670_ABB_AUDIO_GT_EN0                        205
+#define HI3670_ABB_AUDIO_GT_EN1                        206
+#define HI3670_CLK_GATE_DP_AUDIO_PLL_AO                207
+#define HI3670_PERI_VOLT_HOLD                  208
+#define HI3670_PERI_VOLT_MIDDLE                        209
+#define HI3670_CLK_GATE_ISP_SNCLK0             210
+#define HI3670_CLK_GATE_ISP_SNCLK1             211
+#define HI3670_CLK_GATE_ISP_SNCLK2             212
+#define HI3670_CLK_GATE_RXDPHY0_CFG            213
+#define HI3670_CLK_GATE_RXDPHY1_CFG            214
+#define HI3670_CLK_GATE_RXDPHY2_CFG            215
+#define HI3670_CLK_GATE_TXDPHY0_CFG            216
+#define HI3670_CLK_GATE_TXDPHY0_REF            217
+#define HI3670_CLK_GATE_TXDPHY1_CFG            218
+#define HI3670_CLK_GATE_TXDPHY1_REF            219
+#define HI3670_CLK_GATE_MEDIA_TCXO             220
+
+/* clk in sctrl */
+#define HI3670_CLK_ANDGT_IOPERI                        0
+#define HI3670_CLKANDGT_ASP_SUBSYS_PERI                1
+#define HI3670_CLK_ANGT_ASP_SUBSYS             2
+#define HI3670_CLK_MUX_UFS_SUBSYS              3
+#define HI3670_CLK_MUX_CLKOUT0                 4
+#define HI3670_CLK_MUX_CLKOUT1                 5
+#define HI3670_CLK_MUX_ASP_SUBSYS_PERI         6
+#define HI3670_CLK_MUX_ASP_PLL                 7
+#define HI3670_CLK_DIV_AOBUS                   8
+#define HI3670_CLK_DIV_UFS_SUBSYS              9
+#define HI3670_CLK_DIV_IOPERI                  10
+#define HI3670_CLK_DIV_CLKOUT0_TCXO            11
+#define HI3670_CLK_DIV_CLKOUT1_TCXO            12
+#define HI3670_CLK_ASP_SUBSYS_PERI_DIV         13
+#define HI3670_CLK_DIV_ASP_SUBSYS              14
+#define HI3670_PPLL0_EN_ACPU                   15
+#define HI3670_PPLL0_GT_CPU                    16
+#define HI3670_CLK_GATE_PPLL0_MEDIA            17
+#define HI3670_PCLK_GPIO18                     18
+#define HI3670_PCLK_GPIO19                     19
+#define HI3670_CLK_GATE_SPI                    20
+#define HI3670_PCLK_GATE_SPI                   21
+#define HI3670_CLK_GATE_UFS_SUBSYS             22
+#define HI3670_CLK_GATE_UFSIO_REF              23
+#define HI3670_PCLK_AO_GPIO0                   24
+#define HI3670_PCLK_AO_GPIO1                   25
+#define HI3670_PCLK_AO_GPIO2                   26
+#define HI3670_PCLK_AO_GPIO3                   27
+#define HI3670_PCLK_AO_GPIO4                   28
+#define HI3670_PCLK_AO_GPIO5                   29
+#define HI3670_PCLK_AO_GPIO6                   30
+#define HI3670_CLK_GATE_OUT0                   31
+#define HI3670_CLK_GATE_OUT1                   32
+#define HI3670_PCLK_GATE_SYSCNT                        33
+#define HI3670_CLK_GATE_SYSCNT                 34
+#define HI3670_CLK_GATE_ASP_SUBSYS_PERI                35
+#define HI3670_CLK_GATE_ASP_SUBSYS             36
+#define HI3670_CLK_GATE_ASP_TCXO               37
+#define HI3670_CLK_GATE_DP_AUDIO_PLL           38
+
+/* clk in pmuctrl */
+#define HI3670_GATE_ABB_192                    0
+
+/* clk in pctrl */
+#define HI3670_GATE_UFS_TCXO_EN                        0
+#define HI3670_GATE_USB_TCXO_EN                        1
+
+/* clk in iomcu */
+#define HI3670_CLK_GATE_I2C0                   0
+#define HI3670_CLK_GATE_I2C1                   1
+#define HI3670_CLK_GATE_I2C2                   2
+#define HI3670_CLK_GATE_SPI0                   3
+#define HI3670_CLK_GATE_SPI2                   4
+#define HI3670_CLK_GATE_UART3                  5
+#define HI3670_CLK_I2C0_GATE_IOMCU             6
+#define HI3670_CLK_I2C1_GATE_IOMCU             7
+#define HI3670_CLK_I2C2_GATE_IOMCU             8
+#define HI3670_CLK_SPI0_GATE_IOMCU             9
+#define HI3670_CLK_SPI2_GATE_IOMCU             10
+#define HI3670_CLK_UART3_GATE_IOMCU            11
+#define HI3670_CLK_GATE_PERI0_IOMCU            12
+
+/* clk in media1 */
+#define HI3670_CLK_GATE_VIVOBUS_ANDGT          0
+#define HI3670_CLK_ANDGT_EDC0                  1
+#define HI3670_CLK_ANDGT_LDI0                  2
+#define HI3670_CLK_ANDGT_LDI1                  3
+#define HI3670_CLK_MMBUF_PLL_ANDGT             4
+#define HI3670_PCLK_MMBUF_ANDGT                        5
+#define HI3670_CLK_MUX_VIVOBUS                 6
+#define HI3670_CLK_MUX_EDC0                    7
+#define HI3670_CLK_MUX_LDI0                    8
+#define HI3670_CLK_MUX_LDI1                    9
+#define HI3670_CLK_SW_MMBUF                    10
+#define HI3670_CLK_DIV_VIVOBUS                 11
+#define HI3670_CLK_DIV_EDC0                    12
+#define HI3670_CLK_DIV_LDI0                    13
+#define HI3670_CLK_DIV_LDI1                    14
+#define HI3670_ACLK_DIV_MMBUF                  15
+#define HI3670_PCLK_DIV_MMBUF                  16
+#define HI3670_ACLK_GATE_NOC_DSS               17
+#define HI3670_PCLK_GATE_NOC_DSS_CFG           18
+#define HI3670_PCLK_GATE_MMBUF_CFG             19
+#define HI3670_PCLK_GATE_DISP_NOC_SUBSYS       20
+#define HI3670_ACLK_GATE_DISP_NOC_SUBSYS       21
+#define HI3670_PCLK_GATE_DSS                   22
+#define HI3670_ACLK_GATE_DSS                   23
+#define HI3670_CLK_GATE_VIVOBUSFREQ            24
+#define HI3670_CLK_GATE_EDC0                   25
+#define HI3670_CLK_GATE_LDI0                   26
+#define HI3670_CLK_GATE_LDI1FREQ               27
+#define HI3670_CLK_GATE_BRG                    28
+#define HI3670_ACLK_GATE_ASC                   29
+#define HI3670_CLK_GATE_DSS_AXI_MM             30
+#define HI3670_CLK_GATE_MMBUF                  31
+#define HI3670_PCLK_GATE_MMBUF                 32
+#define HI3670_CLK_GATE_ATDIV_VIVO             33
+
+/* clk in media2 */
+#define HI3670_CLK_GATE_VDECFREQ               0
+#define HI3670_CLK_GATE_VENCFREQ               1
+#define HI3670_CLK_GATE_ICSFREQ                        2
+
+#endif /* __DT_BINDINGS_CLOCK_HI3670_H */
index 7ad171b8f3bfc0e7e72b67083e7110a5fee4d02c..87b068f4a9982785e30f80e23c2c33952fd17bb9 100644 (file)
 #define IMX6QDL_CLK_MLB_PODF                   260
 #define IMX6QDL_CLK_EPIT1                      261
 #define IMX6QDL_CLK_EPIT2                      262
-#define IMX6QDL_CLK_END                                263
+#define IMX6QDL_CLK_MMDC_P0_IPG                        263
+#define IMX6QDL_CLK_END                                264
 
 #endif /* __DT_BINDINGS_CLOCK_IMX6QDL_H */
index e14573e293c5a0ae56953445ad73bc616dac6485..cfbfc39d1878ab4c920875da810590bd4438fbbb 100644 (file)
 #define IMX6SL_CLK_SSI2_IPG            162
 #define IMX6SL_CLK_SSI3_IPG            163
 #define IMX6SL_CLK_SPDIF_GCLK          164
-#define IMX6SL_CLK_END                 165
+#define IMX6SL_CLK_MMDC_P0_IPG         165
+#define IMX6SL_CLK_MMDC_P1_IPG         166
+#define IMX6SL_CLK_END                 167
 
 #endif /* __DT_BINDINGS_CLOCK_IMX6SL_H */
index 1036475f997d8436c944aca18d3a46a72a0de5c9..f446710fe63d0a56cd894a3bca13d95479e1b39a 100644 (file)
 #define IMX6SLL_CLK_GPIO4               176
 #define IMX6SLL_CLK_GPIO5               177
 #define IMX6SLL_CLK_GPIO6               178
+#define IMX6SLL_CLK_MMDC_P1_IPG                179
 
-#define IMX6SLL_CLK_END                        179
+#define IMX6SLL_CLK_END                        180
 
 #endif /* __DT_BINDINGS_CLOCK_IMX6SLL_H */
index cd2d6c570e866ad745a9bfa865aeb479162ebfd0..fb420c73477412373be4090b233ba61d0cf822cc 100644 (file)
 #define IMX6SX_CLK_LVDS2_OUT           266
 #define IMX6SX_CLK_LVDS2_IN            267
 #define IMX6SX_CLK_ANACLK2             268
-#define IMX6SX_CLK_CLK_END             269
+#define IMX6SX_CLK_MMDC_P1_IPG         269
+#define IMX6SX_CLK_CLK_END             270
 
 #endif /* __DT_BINDINGS_CLOCK_IMX6SX_H */
index f8e0476a3a0eb00189b102b06f7566738d929184..f718aac9b9dad25b104743bc160fc80e3867e0ba 100644 (file)
 #define IMX6UL_CLK_GPIO3               246
 #define IMX6UL_CLK_GPIO4               247
 #define IMX6UL_CLK_GPIO5               248
+#define IMX6UL_CLK_MMDC_P1_IPG         249
 
-#define IMX6UL_CLK_END                 249
+#define IMX6UL_CLK_END                 250
 
 #endif /* __DT_BINDINGS_CLOCK_IMX6UL_H */
diff --git a/include/dt-bindings/clock/jz4725b-cgu.h b/include/dt-bindings/clock/jz4725b-cgu.h
new file mode 100644 (file)
index 0000000..460bbef
--- /dev/null
@@ -0,0 +1,35 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * This header provides clock numbers for the ingenic,jz4725b-cgu DT binding.
+ */
+
+#ifndef __DT_BINDINGS_CLOCK_JZ4725B_CGU_H__
+#define __DT_BINDINGS_CLOCK_JZ4725B_CGU_H__
+
+#define JZ4725B_CLK_EXT                0
+#define JZ4725B_CLK_OSC32K     1
+#define JZ4725B_CLK_PLL                2
+#define JZ4725B_CLK_PLL_HALF   3
+#define JZ4725B_CLK_CCLK       4
+#define JZ4725B_CLK_HCLK       5
+#define JZ4725B_CLK_PCLK       6
+#define JZ4725B_CLK_MCLK       7
+#define JZ4725B_CLK_IPU                8
+#define JZ4725B_CLK_LCD                9
+#define JZ4725B_CLK_I2S                10
+#define JZ4725B_CLK_SPI                11
+#define JZ4725B_CLK_MMC_MUX    12
+#define JZ4725B_CLK_UDC                13
+#define JZ4725B_CLK_UART       14
+#define JZ4725B_CLK_DMA                15
+#define JZ4725B_CLK_ADC                16
+#define JZ4725B_CLK_I2C                17
+#define JZ4725B_CLK_AIC                18
+#define JZ4725B_CLK_MMC0       19
+#define JZ4725B_CLK_MMC1       20
+#define JZ4725B_CLK_BCH                21
+#define JZ4725B_CLK_TCU                22
+#define JZ4725B_CLK_EXT512     23
+#define JZ4725B_CLK_RTC                24
+
+#endif /* __DT_BINDINGS_CLOCK_JZ4725B_CGU_H__ */
index 7b28b09058699a31b2c6441189fc222667680c79..af8261dcace1dc9e58d78b92bd58529ddf959daf 100644 (file)
@@ -1,10 +1,7 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  * Copyright (C) 2014 Google, Inc
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
  * Device Tree binding constants clocks for the Maxim 77686 PMIC.
  */
 
index 997312edcbb5b059375f1c31e745bb66568411ed..51adcbaed697ad3cc564545439f803d1fbd956e0 100644 (file)
@@ -1,10 +1,7 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  * Copyright (C) 2014 Google, Inc
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
  * Device Tree binding constants clocks for the Maxim 77802 PMIC.
  */
 
diff --git a/include/dt-bindings/clock/qcom,camcc-sdm845.h b/include/dt-bindings/clock/qcom,camcc-sdm845.h
new file mode 100644 (file)
index 0000000..4f7a2d2
--- /dev/null
@@ -0,0 +1,116 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2018, The Linux Foundation. All rights reserved.
+ */
+
+#ifndef _DT_BINDINGS_CLK_SDM_CAM_CC_SDM845_H
+#define _DT_BINDINGS_CLK_SDM_CAM_CC_SDM845_H
+
+/* CAM_CC clock registers */
+#define CAM_CC_BPS_AHB_CLK                             0
+#define CAM_CC_BPS_AREG_CLK                            1
+#define CAM_CC_BPS_AXI_CLK                             2
+#define CAM_CC_BPS_CLK                                 3
+#define CAM_CC_BPS_CLK_SRC                             4
+#define CAM_CC_CAMNOC_ATB_CLK                          5
+#define CAM_CC_CAMNOC_AXI_CLK                          6
+#define CAM_CC_CCI_CLK                                 7
+#define CAM_CC_CCI_CLK_SRC                             8
+#define CAM_CC_CPAS_AHB_CLK                            9
+#define CAM_CC_CPHY_RX_CLK_SRC                         10
+#define CAM_CC_CSI0PHYTIMER_CLK                                11
+#define CAM_CC_CSI0PHYTIMER_CLK_SRC                    12
+#define CAM_CC_CSI1PHYTIMER_CLK                                13
+#define CAM_CC_CSI1PHYTIMER_CLK_SRC                    14
+#define CAM_CC_CSI2PHYTIMER_CLK                                15
+#define CAM_CC_CSI2PHYTIMER_CLK_SRC                    16
+#define CAM_CC_CSI3PHYTIMER_CLK                                17
+#define CAM_CC_CSI3PHYTIMER_CLK_SRC                    18
+#define CAM_CC_CSIPHY0_CLK                             19
+#define CAM_CC_CSIPHY1_CLK                             20
+#define CAM_CC_CSIPHY2_CLK                             21
+#define CAM_CC_CSIPHY3_CLK                             22
+#define CAM_CC_FAST_AHB_CLK_SRC                                23
+#define CAM_CC_FD_CORE_CLK                             24
+#define CAM_CC_FD_CORE_CLK_SRC                         25
+#define CAM_CC_FD_CORE_UAR_CLK                         26
+#define CAM_CC_ICP_APB_CLK                             27
+#define CAM_CC_ICP_ATB_CLK                             28
+#define CAM_CC_ICP_CLK                                 29
+#define CAM_CC_ICP_CLK_SRC                             30
+#define CAM_CC_ICP_CTI_CLK                             31
+#define CAM_CC_ICP_TS_CLK                              32
+#define CAM_CC_IFE_0_AXI_CLK                           33
+#define CAM_CC_IFE_0_CLK                               34
+#define CAM_CC_IFE_0_CLK_SRC                           35
+#define CAM_CC_IFE_0_CPHY_RX_CLK                       36
+#define CAM_CC_IFE_0_CSID_CLK                          37
+#define CAM_CC_IFE_0_CSID_CLK_SRC                      38
+#define CAM_CC_IFE_0_DSP_CLK                           39
+#define CAM_CC_IFE_1_AXI_CLK                           40
+#define CAM_CC_IFE_1_CLK                               41
+#define CAM_CC_IFE_1_CLK_SRC                           42
+#define CAM_CC_IFE_1_CPHY_RX_CLK                       43
+#define CAM_CC_IFE_1_CSID_CLK                          44
+#define CAM_CC_IFE_1_CSID_CLK_SRC                      45
+#define CAM_CC_IFE_1_DSP_CLK                           46
+#define CAM_CC_IFE_LITE_CLK                            47
+#define CAM_CC_IFE_LITE_CLK_SRC                                48
+#define CAM_CC_IFE_LITE_CPHY_RX_CLK                    49
+#define CAM_CC_IFE_LITE_CSID_CLK                       50
+#define CAM_CC_IFE_LITE_CSID_CLK_SRC                   51
+#define CAM_CC_IPE_0_AHB_CLK                           52
+#define CAM_CC_IPE_0_AREG_CLK                          53
+#define CAM_CC_IPE_0_AXI_CLK                           54
+#define CAM_CC_IPE_0_CLK                               55
+#define CAM_CC_IPE_0_CLK_SRC                           56
+#define CAM_CC_IPE_1_AHB_CLK                           57
+#define CAM_CC_IPE_1_AREG_CLK                          58
+#define CAM_CC_IPE_1_AXI_CLK                           59
+#define CAM_CC_IPE_1_CLK                               60
+#define CAM_CC_IPE_1_CLK_SRC                           61
+#define CAM_CC_JPEG_CLK                                        62
+#define CAM_CC_JPEG_CLK_SRC                            63
+#define CAM_CC_LRME_CLK                                        64
+#define CAM_CC_LRME_CLK_SRC                            65
+#define CAM_CC_MCLK0_CLK                               66
+#define CAM_CC_MCLK0_CLK_SRC                           67
+#define CAM_CC_MCLK1_CLK                               68
+#define CAM_CC_MCLK1_CLK_SRC                           69
+#define CAM_CC_MCLK2_CLK                               70
+#define CAM_CC_MCLK2_CLK_SRC                           71
+#define CAM_CC_MCLK3_CLK                               72
+#define CAM_CC_MCLK3_CLK_SRC                           73
+#define CAM_CC_PLL0                                    74
+#define CAM_CC_PLL0_OUT_EVEN                           75
+#define CAM_CC_PLL1                                    76
+#define CAM_CC_PLL1_OUT_EVEN                           77
+#define CAM_CC_PLL2                                    78
+#define CAM_CC_PLL2_OUT_EVEN                           79
+#define CAM_CC_PLL3                                    80
+#define CAM_CC_PLL3_OUT_EVEN                           81
+#define CAM_CC_SLOW_AHB_CLK_SRC                                82
+#define CAM_CC_SOC_AHB_CLK                             83
+#define CAM_CC_SYS_TMR_CLK                             84
+
+/* CAM_CC Resets */
+#define TITAN_CAM_CC_CCI_BCR                           0
+#define TITAN_CAM_CC_CPAS_BCR                          1
+#define TITAN_CAM_CC_CSI0PHY_BCR                       2
+#define TITAN_CAM_CC_CSI1PHY_BCR                       3
+#define TITAN_CAM_CC_CSI2PHY_BCR                       4
+#define TITAN_CAM_CC_MCLK0_BCR                         5
+#define TITAN_CAM_CC_MCLK1_BCR                         6
+#define TITAN_CAM_CC_MCLK2_BCR                         7
+#define TITAN_CAM_CC_MCLK3_BCR                         8
+#define TITAN_CAM_CC_TITAN_TOP_BCR                     9
+
+/* CAM_CC GDSCRs */
+#define BPS_GDSC                                       0
+#define IPE_0_GDSC                                     1
+#define IPE_1_GDSC                                     2
+#define IFE_0_GDSC                                     3
+#define IFE_1_GDSC                                     4
+#define TITAN_TOP_GDSC                                 5
+
+#endif
index 7d20eedfee9898592ce7265da188d0482e04420d..e02742fc81cc76b9db8450ca7e828bb698b42c68 100644 (file)
 #define CE3_SRC                                        303
 #define CE3_CORE_CLK                           304
 #define CE3_H_CLK                              305
+#define PLL16                                  306
+#define PLL17                                  307
 
 #endif
index 75b07cf5eed0f9a2941f0367af601b77c0bd1599..db80f2ee571b22fdbf77b9fa8a2477fc7747d528 100644 (file)
 #define GCC_RX1_USB2_CLKREF_CLK                                        218
 #define GCC_HLOS1_VOTE_LPASS_CORE_SMMU_CLK                     219
 #define GCC_HLOS1_VOTE_LPASS_ADSP_SMMU_CLK                     220
+#define GCC_EDP_CLKREF_CLK                                     221
+#define GCC_MSS_CFG_AHB_CLK                                    222
+#define GCC_MSS_Q6_BIMC_AXI_CLK                                        223
+#define GCC_MSS_SNOC_AXI_CLK                                   224
+#define GCC_MSS_MNOC_BIMC_AXI_CLK                              225
+#define GCC_DCC_AHB_CLK                                                226
+#define GCC_AGGRE0_NOC_MPU_CFG_AHB_CLK                         227
+#define GCC_MMSS_GPLL0_DIV_CLK                                 228
+#define GCC_MSS_GPLL0_DIV_CLK                                  229
 
 #define GCC_SYSTEM_NOC_BCR                                     0
 #define GCC_CONFIG_NOC_BCR                                     1
diff --git a/include/dt-bindings/clock/qcom,gcc-qcs404.h b/include/dt-bindings/clock/qcom,gcc-qcs404.h
new file mode 100644 (file)
index 0000000..6ceb55e
--- /dev/null
@@ -0,0 +1,165 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2018, The Linux Foundation. All rights reserved.
+ */
+
+#ifndef _DT_BINDINGS_CLK_QCOM_GCC_QCS404_H
+#define _DT_BINDINGS_CLK_QCOM_GCC_QCS404_H
+
+#define GCC_APSS_AHB_CLK_SRC                           0
+#define GCC_BLSP1_QUP0_I2C_APPS_CLK_SRC                        1
+#define GCC_BLSP1_QUP0_SPI_APPS_CLK_SRC                        2
+#define GCC_BLSP1_QUP1_I2C_APPS_CLK_SRC                        3
+#define GCC_BLSP1_QUP1_SPI_APPS_CLK_SRC                        4
+#define GCC_BLSP1_QUP2_I2C_APPS_CLK_SRC                        5
+#define GCC_BLSP1_QUP2_SPI_APPS_CLK_SRC                        6
+#define GCC_BLSP1_QUP3_I2C_APPS_CLK_SRC                        7
+#define GCC_BLSP1_QUP3_SPI_APPS_CLK_SRC                        8
+#define GCC_BLSP1_QUP4_I2C_APPS_CLK_SRC                        9
+#define GCC_BLSP1_QUP4_SPI_APPS_CLK_SRC                        10
+#define GCC_BLSP1_UART0_APPS_CLK_SRC                   11
+#define GCC_BLSP1_UART1_APPS_CLK_SRC                   12
+#define GCC_BLSP1_UART2_APPS_CLK_SRC                   13
+#define GCC_BLSP1_UART3_APPS_CLK_SRC                   14
+#define GCC_BLSP2_QUP0_I2C_APPS_CLK_SRC                        15
+#define GCC_BLSP2_QUP0_SPI_APPS_CLK_SRC                        16
+#define GCC_BLSP2_UART0_APPS_CLK_SRC                   17
+#define GCC_BYTE0_CLK_SRC                              18
+#define GCC_EMAC_CLK_SRC                               19
+#define GCC_EMAC_PTP_CLK_SRC                           20
+#define GCC_ESC0_CLK_SRC                               21
+#define GCC_APSS_AHB_CLK                               22
+#define GCC_APSS_AXI_CLK                               23
+#define GCC_BIMC_APSS_AXI_CLK                          24
+#define GCC_BIMC_GFX_CLK                               25
+#define GCC_BIMC_MDSS_CLK                              26
+#define GCC_BLSP1_AHB_CLK                              27
+#define GCC_BLSP1_QUP0_I2C_APPS_CLK                    28
+#define GCC_BLSP1_QUP0_SPI_APPS_CLK                    29
+#define GCC_BLSP1_QUP1_I2C_APPS_CLK                    30
+#define GCC_BLSP1_QUP1_SPI_APPS_CLK                    31
+#define GCC_BLSP1_QUP2_I2C_APPS_CLK                    32
+#define GCC_BLSP1_QUP2_SPI_APPS_CLK                    33
+#define GCC_BLSP1_QUP3_I2C_APPS_CLK                    34
+#define GCC_BLSP1_QUP3_SPI_APPS_CLK                    35
+#define GCC_BLSP1_QUP4_I2C_APPS_CLK                    36
+#define GCC_BLSP1_QUP4_SPI_APPS_CLK                    37
+#define GCC_BLSP1_UART0_APPS_CLK                       38
+#define GCC_BLSP1_UART1_APPS_CLK                       39
+#define GCC_BLSP1_UART2_APPS_CLK                       40
+#define GCC_BLSP1_UART3_APPS_CLK                       41
+#define GCC_BLSP2_AHB_CLK                              42
+#define GCC_BLSP2_QUP0_I2C_APPS_CLK                    43
+#define GCC_BLSP2_QUP0_SPI_APPS_CLK                    44
+#define GCC_BLSP2_UART0_APPS_CLK                       45
+#define GCC_BOOT_ROM_AHB_CLK                           46
+#define GCC_DCC_CLK                                    47
+#define GCC_GENI_IR_H_CLK                              48
+#define GCC_ETH_AXI_CLK                                        49
+#define GCC_ETH_PTP_CLK                                        50
+#define GCC_ETH_RGMII_CLK                              51
+#define GCC_ETH_SLAVE_AHB_CLK                          52
+#define GCC_GENI_IR_S_CLK                              53
+#define GCC_GP1_CLK                                    54
+#define GCC_GP2_CLK                                    55
+#define GCC_GP3_CLK                                    56
+#define GCC_MDSS_AHB_CLK                               57
+#define GCC_MDSS_AXI_CLK                               58
+#define GCC_MDSS_BYTE0_CLK                             59
+#define GCC_MDSS_ESC0_CLK                              60
+#define GCC_MDSS_HDMI_APP_CLK                          61
+#define GCC_MDSS_HDMI_PCLK_CLK                         62
+#define GCC_MDSS_MDP_CLK                               63
+#define GCC_MDSS_PCLK0_CLK                             64
+#define GCC_MDSS_VSYNC_CLK                             65
+#define GCC_OXILI_AHB_CLK                              66
+#define GCC_OXILI_GFX3D_CLK                            67
+#define GCC_PCIE_0_AUX_CLK                             68
+#define GCC_PCIE_0_CFG_AHB_CLK                         69
+#define GCC_PCIE_0_MSTR_AXI_CLK                                70
+#define GCC_PCIE_0_PIPE_CLK                            71
+#define GCC_PCIE_0_SLV_AXI_CLK                         72
+#define GCC_PCNOC_USB2_CLK                             73
+#define GCC_PCNOC_USB3_CLK                             74
+#define GCC_PDM2_CLK                                   75
+#define GCC_PDM_AHB_CLK                                        76
+#define GCC_VSYNC_CLK_SRC                              77
+#define GCC_PRNG_AHB_CLK                               78
+#define GCC_PWM0_XO512_CLK                             79
+#define GCC_PWM1_XO512_CLK                             80
+#define GCC_PWM2_XO512_CLK                             81
+#define GCC_SDCC1_AHB_CLK                              82
+#define GCC_SDCC1_APPS_CLK                             83
+#define GCC_SDCC1_ICE_CORE_CLK                         84
+#define GCC_SDCC2_AHB_CLK                              85
+#define GCC_SDCC2_APPS_CLK                             86
+#define GCC_SYS_NOC_USB3_CLK                           87
+#define GCC_USB20_MOCK_UTMI_CLK                                88
+#define GCC_USB2A_PHY_SLEEP_CLK                                89
+#define GCC_USB30_MASTER_CLK                           90
+#define GCC_USB30_MOCK_UTMI_CLK                                91
+#define GCC_USB30_SLEEP_CLK                            92
+#define GCC_USB3_PHY_AUX_CLK                           93
+#define GCC_USB3_PHY_PIPE_CLK                          94
+#define GCC_USB_HS_PHY_CFG_AHB_CLK                     95
+#define GCC_USB_HS_SYSTEM_CLK                          96
+#define GCC_GFX3D_CLK_SRC                              97
+#define GCC_GP1_CLK_SRC                                        98
+#define GCC_GP2_CLK_SRC                                        99
+#define GCC_GP3_CLK_SRC                                        100
+#define GCC_GPLL0_OUT_MAIN                             101
+#define GCC_GPLL1_OUT_MAIN                             102
+#define GCC_GPLL3_OUT_MAIN                             103
+#define GCC_GPLL4_OUT_MAIN                             104
+#define GCC_HDMI_APP_CLK_SRC                           105
+#define GCC_HDMI_PCLK_CLK_SRC                          106
+#define GCC_MDP_CLK_SRC                                        107
+#define GCC_PCIE_0_AUX_CLK_SRC                         108
+#define GCC_PCIE_0_PIPE_CLK_SRC                                109
+#define GCC_PCLK0_CLK_SRC                              110
+#define GCC_PDM2_CLK_SRC                               111
+#define GCC_SDCC1_APPS_CLK_SRC                         112
+#define GCC_SDCC1_ICE_CORE_CLK_SRC                     113
+#define GCC_SDCC2_APPS_CLK_SRC                         114
+#define GCC_USB20_MOCK_UTMI_CLK_SRC                    115
+#define GCC_USB30_MASTER_CLK_SRC                       116
+#define GCC_USB30_MOCK_UTMI_CLK_SRC                    117
+#define GCC_USB3_PHY_AUX_CLK_SRC                       118
+#define GCC_USB_HS_SYSTEM_CLK_SRC                      119
+#define GCC_GPLL0_AO_CLK_SRC                           120
+#define GCC_USB_HS_INACTIVITY_TIMERS_CLK               122
+#define GCC_GPLL0_AO_OUT_MAIN                          123
+#define GCC_GPLL0_SLEEP_CLK_SRC                                124
+#define GCC_GPLL6                                      125
+#define GCC_GPLL6_OUT_AUX                              126
+#define GCC_MDSS_MDP_VOTE_CLK                          127
+#define GCC_MDSS_ROTATOR_VOTE_CLK                      128
+#define GCC_BIMC_GPU_CLK                               129
+#define GCC_GTCU_AHB_CLK                               130
+#define GCC_GFX_TCU_CLK                                        131
+#define GCC_GFX_TBU_CLK                                        132
+#define GCC_SMMU_CFG_CLK                               133
+#define GCC_APSS_TCU_CLK                               134
+#define GCC_CRYPTO_AHB_CLK                             135
+#define GCC_CRYPTO_AXI_CLK                             136
+#define GCC_CRYPTO_CLK                                 137
+#define GCC_MDP_TBU_CLK                                        138
+#define GCC_QDSS_DAP_CLK                               139
+#define GCC_DCC_XO_CLK                                 140
+
+#define GCC_GENI_IR_BCR                                        0
+#define GCC_USB_HS_BCR                                 1
+#define GCC_USB2_HS_PHY_ONLY_BCR                       2
+#define GCC_QUSB2_PHY_BCR                              3
+#define GCC_USB_HS_PHY_CFG_AHB_BCR                     4
+#define GCC_USB2A_PHY_BCR                              5
+#define GCC_USB3_PHY_BCR                               6
+#define GCC_USB_30_BCR                                 7
+#define GCC_USB3PHY_PHY_BCR                            8
+#define GCC_PCIE_0_BCR                                 9
+#define GCC_PCIE_0_PHY_BCR                             10
+#define GCC_PCIE_0_LINK_DOWN_BCR                       11
+#define GCC_PCIEPHY_0_PHY_BCR                          12
+#define GCC_EMAC_BCR                                   13
+
+#endif
diff --git a/include/dt-bindings/clock/qcom,gcc-sdm660.h b/include/dt-bindings/clock/qcom,gcc-sdm660.h
new file mode 100644 (file)
index 0000000..4683022
--- /dev/null
@@ -0,0 +1,156 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2018, Craig Tatlor.
+ */
+
+#ifndef _DT_BINDINGS_CLK_MSM_GCC_660_H
+#define _DT_BINDINGS_CLK_MSM_GCC_660_H
+
+#define BLSP1_QUP1_I2C_APPS_CLK_SRC            0
+#define BLSP1_QUP1_SPI_APPS_CLK_SRC            1
+#define BLSP1_QUP2_I2C_APPS_CLK_SRC            2
+#define BLSP1_QUP2_SPI_APPS_CLK_SRC            3
+#define BLSP1_QUP3_I2C_APPS_CLK_SRC            4
+#define BLSP1_QUP3_SPI_APPS_CLK_SRC            5
+#define BLSP1_QUP4_I2C_APPS_CLK_SRC            6
+#define BLSP1_QUP4_SPI_APPS_CLK_SRC            7
+#define BLSP1_UART1_APPS_CLK_SRC               8
+#define BLSP1_UART2_APPS_CLK_SRC               9
+#define BLSP2_QUP1_I2C_APPS_CLK_SRC            10
+#define BLSP2_QUP1_SPI_APPS_CLK_SRC            11
+#define BLSP2_QUP2_I2C_APPS_CLK_SRC            12
+#define BLSP2_QUP2_SPI_APPS_CLK_SRC            13
+#define BLSP2_QUP3_I2C_APPS_CLK_SRC            14
+#define BLSP2_QUP3_SPI_APPS_CLK_SRC            15
+#define BLSP2_QUP4_I2C_APPS_CLK_SRC            16
+#define BLSP2_QUP4_SPI_APPS_CLK_SRC            17
+#define BLSP2_UART1_APPS_CLK_SRC               18
+#define BLSP2_UART2_APPS_CLK_SRC               19
+#define GCC_AGGRE2_UFS_AXI_CLK                 20
+#define GCC_AGGRE2_USB3_AXI_CLK                        21
+#define GCC_BIMC_GFX_CLK                       22
+#define GCC_BIMC_HMSS_AXI_CLK                  23
+#define GCC_BIMC_MSS_Q6_AXI_CLK                        24
+#define GCC_BLSP1_AHB_CLK                      25
+#define GCC_BLSP1_QUP1_I2C_APPS_CLK            26
+#define GCC_BLSP1_QUP1_SPI_APPS_CLK            27
+#define GCC_BLSP1_QUP2_I2C_APPS_CLK            28
+#define GCC_BLSP1_QUP2_SPI_APPS_CLK            29
+#define GCC_BLSP1_QUP3_I2C_APPS_CLK            30
+#define GCC_BLSP1_QUP3_SPI_APPS_CLK            31
+#define GCC_BLSP1_QUP4_I2C_APPS_CLK            32
+#define GCC_BLSP1_QUP4_SPI_APPS_CLK            33
+#define GCC_BLSP1_UART1_APPS_CLK               34
+#define GCC_BLSP1_UART2_APPS_CLK               35
+#define GCC_BLSP2_AHB_CLK                      36
+#define GCC_BLSP2_QUP1_I2C_APPS_CLK            37
+#define GCC_BLSP2_QUP1_SPI_APPS_CLK            38
+#define GCC_BLSP2_QUP2_I2C_APPS_CLK            39
+#define GCC_BLSP2_QUP2_SPI_APPS_CLK            40
+#define GCC_BLSP2_QUP3_I2C_APPS_CLK            41
+#define GCC_BLSP2_QUP3_SPI_APPS_CLK            42
+#define GCC_BLSP2_QUP4_I2C_APPS_CLK            43
+#define GCC_BLSP2_QUP4_SPI_APPS_CLK            44
+#define GCC_BLSP2_UART1_APPS_CLK               45
+#define GCC_BLSP2_UART2_APPS_CLK               46
+#define GCC_BOOT_ROM_AHB_CLK                   47
+#define GCC_CFG_NOC_USB2_AXI_CLK               48
+#define GCC_CFG_NOC_USB3_AXI_CLK               49
+#define GCC_DCC_AHB_CLK                                50
+#define GCC_GP1_CLK                            51
+#define GCC_GP2_CLK                            52
+#define GCC_GP3_CLK                            53
+#define GCC_GPU_BIMC_GFX_CLK                   54
+#define GCC_GPU_CFG_AHB_CLK                    55
+#define GCC_GPU_GPLL0_CLK                      56
+#define GCC_GPU_GPLL0_DIV_CLK                  57
+#define GCC_HMSS_DVM_BUS_CLK                   58
+#define GCC_HMSS_RBCPR_CLK                     59
+#define GCC_MMSS_GPLL0_CLK                     60
+#define GCC_MMSS_GPLL0_DIV_CLK                 61
+#define GCC_MMSS_NOC_CFG_AHB_CLK               62
+#define GCC_MMSS_SYS_NOC_AXI_CLK               63
+#define GCC_MSS_CFG_AHB_CLK                    64
+#define GCC_MSS_GPLL0_DIV_CLK                  65
+#define GCC_MSS_MNOC_BIMC_AXI_CLK              66
+#define GCC_MSS_Q6_BIMC_AXI_CLK                        67
+#define GCC_MSS_SNOC_AXI_CLK                   68
+#define GCC_PDM2_CLK                           69
+#define GCC_PDM_AHB_CLK                                70
+#define GCC_PRNG_AHB_CLK                       71
+#define GCC_QSPI_AHB_CLK                       72
+#define GCC_QSPI_SER_CLK                       73
+#define GCC_SDCC1_AHB_CLK                      74
+#define GCC_SDCC1_APPS_CLK                     75
+#define GCC_SDCC1_ICE_CORE_CLK                 76
+#define GCC_SDCC2_AHB_CLK                      77
+#define GCC_SDCC2_APPS_CLK                     78
+#define GCC_UFS_AHB_CLK                                79
+#define GCC_UFS_AXI_CLK                                80
+#define GCC_UFS_CLKREF_CLK                     81
+#define GCC_UFS_ICE_CORE_CLK                   82
+#define GCC_UFS_PHY_AUX_CLK                    83
+#define GCC_UFS_RX_SYMBOL_0_CLK                        84
+#define GCC_UFS_RX_SYMBOL_1_CLK                        85
+#define GCC_UFS_TX_SYMBOL_0_CLK                        86
+#define GCC_UFS_UNIPRO_CORE_CLK                        87
+#define GCC_USB20_MASTER_CLK                   88
+#define GCC_USB20_MOCK_UTMI_CLK                        89
+#define GCC_USB20_SLEEP_CLK                    90
+#define GCC_USB30_MASTER_CLK                   91
+#define GCC_USB30_MOCK_UTMI_CLK                        92
+#define GCC_USB30_SLEEP_CLK                    93
+#define GCC_USB3_CLKREF_CLK                    94
+#define GCC_USB3_PHY_AUX_CLK                   95
+#define GCC_USB3_PHY_PIPE_CLK                  96
+#define GCC_USB_PHY_CFG_AHB2PHY_CLK            97
+#define GP1_CLK_SRC                            98
+#define GP2_CLK_SRC                            99
+#define GP3_CLK_SRC                            100
+#define GPLL0                                  101
+#define GPLL0_EARLY                            102
+#define GPLL1                                  103
+#define GPLL1_EARLY                            104
+#define GPLL4                                  105
+#define GPLL4_EARLY                            106
+#define HMSS_GPLL0_CLK_SRC                     107
+#define HMSS_GPLL4_CLK_SRC                     108
+#define HMSS_RBCPR_CLK_SRC                     109
+#define PDM2_CLK_SRC                           110
+#define QSPI_SER_CLK_SRC                       111
+#define SDCC1_APPS_CLK_SRC                     112
+#define SDCC1_ICE_CORE_CLK_SRC                 113
+#define SDCC2_APPS_CLK_SRC                     114
+#define UFS_AXI_CLK_SRC                                115
+#define UFS_ICE_CORE_CLK_SRC                   116
+#define UFS_PHY_AUX_CLK_SRC                    117
+#define UFS_UNIPRO_CORE_CLK_SRC                        118
+#define USB20_MASTER_CLK_SRC                   119
+#define USB20_MOCK_UTMI_CLK_SRC                        120
+#define USB30_MASTER_CLK_SRC                   121
+#define USB30_MOCK_UTMI_CLK_SRC                        122
+#define USB3_PHY_AUX_CLK_SRC                   123
+#define GPLL0_OUT_MSSCC                                124
+#define GCC_UFS_AXI_HW_CTL_CLK                 125
+#define GCC_UFS_ICE_CORE_HW_CTL_CLK            126
+#define GCC_UFS_PHY_AUX_HW_CTL_CLK             127
+#define GCC_UFS_UNIPRO_CORE_HW_CTL_CLK         128
+#define GCC_RX0_USB2_CLKREF_CLK                        129
+#define GCC_RX1_USB2_CLKREF_CLK                        130
+
+#define PCIE_0_GDSC    0
+#define UFS_GDSC       1
+#define USB_30_GDSC    2
+
+#define GCC_QUSB2PHY_PRIM_BCR          0
+#define GCC_QUSB2PHY_SEC_BCR           1
+#define GCC_UFS_BCR                    2
+#define GCC_USB3_DP_PHY_BCR            3
+#define GCC_USB3_PHY_BCR               4
+#define GCC_USB3PHY_PHY_BCR            5
+#define GCC_USB_20_BCR                  6
+#define GCC_USB_30_BCR                 7
+#define GCC_USB_PHY_CFG_AHB2PHY_BCR    8
+
+#endif
index f96fc2dbf60e0dd74b03b1b8d48394e2fd957b52..b8eae5a76503079b18374348cfdcd1992f84479e 100644 (file)
 #define GPLL4                                                  184
 #define GCC_CPUSS_DVM_BUS_CLK                                  185
 #define GCC_CPUSS_GNOC_CLK                                     186
+#define GCC_QSPI_CORE_CLK_SRC                                  187
+#define GCC_QSPI_CORE_CLK                                      188
+#define GCC_QSPI_CNOC_PERIPH_AHB_CLK                           189
 
 /* GCC Resets */
 #define GCC_MMSS_BCR                                           0
index 0dcb3e87d44c121ec55b8614cee46fae6b1417d7..a267ac25014355493fa29b5830824c5a5982884c 100644 (file)
@@ -1,10 +1,7 @@
-/*
+/* SPDX-License-Identifier: GPL-2.0
+ *
  * Copyright (C) 2014 Renesas Solutions Corp.
  * Copyright (C) 2014 Wolfram Sang, Sang Engineering <wsa@sang-engineering.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
  */
 
 #ifndef __DT_BINDINGS_CLOCK_R7S72100_H__
diff --git a/include/dt-bindings/clock/r7s9210-cpg-mssr.h b/include/dt-bindings/clock/r7s9210-cpg-mssr.h
new file mode 100644 (file)
index 0000000..b6f85ca
--- /dev/null
@@ -0,0 +1,20 @@
+/* SPDX-License-Identifier: GPL-2.0
+ *
+ * Copyright (C) 2018 Renesas Electronics Corp.
+ *
+ */
+
+#ifndef __DT_BINDINGS_CLOCK_R7S9210_CPG_MSSR_H__
+#define __DT_BINDINGS_CLOCK_R7S9210_CPG_MSSR_H__
+
+#include <dt-bindings/clock/renesas-cpg-mssr.h>
+
+/* R7S9210 CPG Core Clocks */
+#define R7S9210_CLK_I                  0
+#define R7S9210_CLK_G                  1
+#define R7S9210_CLK_B                  2
+#define R7S9210_CLK_P1                 3
+#define R7S9210_CLK_P1C                        4
+#define R7S9210_CLK_P0                 5
+
+#endif /* __DT_BINDINGS_CLOCK_R7S9210_CPG_MSSR_H__ */
index e1d1f3c6a99ea95c72bd3500cead514aef40d3f8..3ba936029d9fbaee5a3180d7855c368d73944c72 100644 (file)
@@ -1,10 +1,6 @@
-/*
- * Copyright (C) 2016 Cogent Embedded Inc.
+/* SPDX-License-Identifier: GPL-2.0+
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * Copyright (C) 2016 Cogent Embedded Inc.
  */
 #ifndef __DT_BINDINGS_CLOCK_R8A7743_CPG_MSSR_H__
 #define __DT_BINDINGS_CLOCK_R8A7743_CPG_MSSR_H__
diff --git a/include/dt-bindings/clock/r8a7744-cpg-mssr.h b/include/dt-bindings/clock/r8a7744-cpg-mssr.h
new file mode 100644 (file)
index 0000000..2690be0
--- /dev/null
@@ -0,0 +1,39 @@
+/* SPDX-License-Identifier: GPL-2.0
+ *
+ * Copyright (C) 2018 Renesas Electronics Corp.
+ */
+#ifndef __DT_BINDINGS_CLOCK_R8A7744_CPG_MSSR_H__
+#define __DT_BINDINGS_CLOCK_R8A7744_CPG_MSSR_H__
+
+#include <dt-bindings/clock/renesas-cpg-mssr.h>
+
+/* r8a7744 CPG Core Clocks */
+#define R8A7744_CLK_Z          0
+#define R8A7744_CLK_ZG         1
+#define R8A7744_CLK_ZTR                2
+#define R8A7744_CLK_ZTRD2      3
+#define R8A7744_CLK_ZT         4
+#define R8A7744_CLK_ZX         5
+#define R8A7744_CLK_ZS         6
+#define R8A7744_CLK_HP         7
+#define R8A7744_CLK_B          9
+#define R8A7744_CLK_LB         10
+#define R8A7744_CLK_P          11
+#define R8A7744_CLK_CL         12
+#define R8A7744_CLK_M2         13
+#define R8A7744_CLK_ZB3                15
+#define R8A7744_CLK_ZB3D2      16
+#define R8A7744_CLK_DDR                17
+#define R8A7744_CLK_SDH                18
+#define R8A7744_CLK_SD0                19
+#define R8A7744_CLK_SD2                20
+#define R8A7744_CLK_SD3                21
+#define R8A7744_CLK_MMC0       22
+#define R8A7744_CLK_MP         23
+#define R8A7744_CLK_QSPI       26
+#define R8A7744_CLK_CP         27
+#define R8A7744_CLK_RCAN       28
+#define R8A7744_CLK_R          29
+#define R8A7744_CLK_OSC                30
+
+#endif /* __DT_BINDINGS_CLOCK_R8A7744_CPG_MSSR_H__ */
index 56ad6f0c67606d74bd99098a6ed5d401d5799c39..f81066c9d19234b7c439708cdc38c30c4d4a26f4 100644 (file)
@@ -1,10 +1,6 @@
-/*
- * Copyright (C) 2016 Cogent Embedded Inc.
+/* SPDX-License-Identifier: GPL-2.0+
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * Copyright (C) 2016 Cogent Embedded Inc.
  */
 #ifndef __DT_BINDINGS_CLOCK_R8A7745_CPG_MSSR_H__
 #define __DT_BINDINGS_CLOCK_R8A7745_CPG_MSSR_H__
diff --git a/include/dt-bindings/clock/r8a774a1-cpg-mssr.h b/include/dt-bindings/clock/r8a774a1-cpg-mssr.h
new file mode 100644 (file)
index 0000000..9bc5d45
--- /dev/null
@@ -0,0 +1,58 @@
+/* SPDX-License-Identifier: GPL-2.0
+ *
+ * Copyright (C) 2018 Renesas Electronics Corp.
+ */
+#ifndef __DT_BINDINGS_CLOCK_R8A774A1_CPG_MSSR_H__
+#define __DT_BINDINGS_CLOCK_R8A774A1_CPG_MSSR_H__
+
+#include <dt-bindings/clock/renesas-cpg-mssr.h>
+
+/* r8a774a1 CPG Core Clocks */
+#define R8A774A1_CLK_Z                 0
+#define R8A774A1_CLK_Z2                        1
+#define R8A774A1_CLK_ZG                        2
+#define R8A774A1_CLK_ZTR               3
+#define R8A774A1_CLK_ZTRD2             4
+#define R8A774A1_CLK_ZT                        5
+#define R8A774A1_CLK_ZX                        6
+#define R8A774A1_CLK_S0D1              7
+#define R8A774A1_CLK_S0D2              8
+#define R8A774A1_CLK_S0D3              9
+#define R8A774A1_CLK_S0D4              10
+#define R8A774A1_CLK_S0D6              11
+#define R8A774A1_CLK_S0D8              12
+#define R8A774A1_CLK_S0D12             13
+#define R8A774A1_CLK_S1D2              14
+#define R8A774A1_CLK_S1D4              15
+#define R8A774A1_CLK_S2D1              16
+#define R8A774A1_CLK_S2D2              17
+#define R8A774A1_CLK_S2D4              18
+#define R8A774A1_CLK_S3D1              19
+#define R8A774A1_CLK_S3D2              20
+#define R8A774A1_CLK_S3D4              21
+#define R8A774A1_CLK_LB                        22
+#define R8A774A1_CLK_CL                        23
+#define R8A774A1_CLK_ZB3               24
+#define R8A774A1_CLK_ZB3D2             25
+#define R8A774A1_CLK_ZB3D4             26
+#define R8A774A1_CLK_CR                        27
+#define R8A774A1_CLK_CRD2              28
+#define R8A774A1_CLK_SD0H              29
+#define R8A774A1_CLK_SD0               30
+#define R8A774A1_CLK_SD1H              31
+#define R8A774A1_CLK_SD1               32
+#define R8A774A1_CLK_SD2H              33
+#define R8A774A1_CLK_SD2               34
+#define R8A774A1_CLK_SD3H              35
+#define R8A774A1_CLK_SD3               36
+#define R8A774A1_CLK_RPC               37
+#define R8A774A1_CLK_RPCD2             38
+#define R8A774A1_CLK_MSO               39
+#define R8A774A1_CLK_HDMI              40
+#define R8A774A1_CLK_CSI0              41
+#define R8A774A1_CLK_CP                        42
+#define R8A774A1_CLK_CPEX              43
+#define R8A774A1_CLK_R                 44
+#define R8A774A1_CLK_OSC               45
+
+#endif /* __DT_BINDINGS_CLOCK_R8A774A1_CPG_MSSR_H__ */
diff --git a/include/dt-bindings/clock/r8a774c0-cpg-mssr.h b/include/dt-bindings/clock/r8a774c0-cpg-mssr.h
new file mode 100644 (file)
index 0000000..8fe51b6
--- /dev/null
@@ -0,0 +1,60 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2018 Renesas Electronics Corp.
+ */
+#ifndef __DT_BINDINGS_CLOCK_R8A774C0_CPG_MSSR_H__
+#define __DT_BINDINGS_CLOCK_R8A774C0_CPG_MSSR_H__
+
+#include <dt-bindings/clock/renesas-cpg-mssr.h>
+
+/* r8a774c0 CPG Core Clocks */
+#define R8A774C0_CLK_Z2                        0
+#define R8A774C0_CLK_ZG                        1
+#define R8A774C0_CLK_ZTR               2
+#define R8A774C0_CLK_ZT                        3
+#define R8A774C0_CLK_ZX                        4
+#define R8A774C0_CLK_S0D1              5
+#define R8A774C0_CLK_S0D3              6
+#define R8A774C0_CLK_S0D6              7
+#define R8A774C0_CLK_S0D12             8
+#define R8A774C0_CLK_S0D24             9
+#define R8A774C0_CLK_S1D1              10
+#define R8A774C0_CLK_S1D2              11
+#define R8A774C0_CLK_S1D4              12
+#define R8A774C0_CLK_S2D1              13
+#define R8A774C0_CLK_S2D2              14
+#define R8A774C0_CLK_S2D4              15
+#define R8A774C0_CLK_S3D1              16
+#define R8A774C0_CLK_S3D2              17
+#define R8A774C0_CLK_S3D4              18
+#define R8A774C0_CLK_S0D6C             19
+#define R8A774C0_CLK_S3D1C             20
+#define R8A774C0_CLK_S3D2C             21
+#define R8A774C0_CLK_S3D4C             22
+#define R8A774C0_CLK_LB                        23
+#define R8A774C0_CLK_CL                        24
+#define R8A774C0_CLK_ZB3               25
+#define R8A774C0_CLK_ZB3D2             26
+#define R8A774C0_CLK_CR                        27
+#define R8A774C0_CLK_CRD2              28
+#define R8A774C0_CLK_SD0H              29
+#define R8A774C0_CLK_SD0               30
+#define R8A774C0_CLK_SD1H              31
+#define R8A774C0_CLK_SD1               32
+#define R8A774C0_CLK_SD3H              33
+#define R8A774C0_CLK_SD3               34
+#define R8A774C0_CLK_RPC               35
+#define R8A774C0_CLK_RPCD2             36
+#define R8A774C0_CLK_ZA2               37
+#define R8A774C0_CLK_ZA8               38
+#define R8A774C0_CLK_Z2D               39
+#define R8A774C0_CLK_MSO               40
+#define R8A774C0_CLK_R                 41
+#define R8A774C0_CLK_OSC               42
+#define R8A774C0_CLK_LV0               43
+#define R8A774C0_CLK_LV1               44
+#define R8A774C0_CLK_CSI0              45
+#define R8A774C0_CLK_CP                        46
+#define R8A774C0_CLK_CPEX              47
+
+#endif /* __DT_BINDINGS_CLOCK_R8A774C0_CPG_MSSR_H__ */
index 1625b8bf34822b6e8f41f1dbdead56c8ce13bff6..c5955b56b36d80876e7cf6cd037a3d018909f1ef 100644 (file)
@@ -1,10 +1,6 @@
-/*
- * Copyright (C) 2015 Renesas Electronics Corp.
+/* SPDX-License-Identifier: GPL-2.0+
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * Copyright (C) 2015 Renesas Electronics Corp.
  */
 
 #ifndef __DT_BINDINGS_CLOCK_R8A7790_CPG_MSSR_H__
index e8823410c01c5a09d0676ddf547c1821b42cf619..aadd06c566c043e7e1909a3dc23fa70514022de1 100644 (file)
@@ -1,10 +1,6 @@
-/*
- * Copyright (C) 2015 Renesas Electronics Corp.
+/* SPDX-License-Identifier: GPL-2.0+
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * Copyright (C) 2015 Renesas Electronics Corp.
  */
 
 #ifndef __DT_BINDINGS_CLOCK_R8A7791_CPG_MSSR_H__
index 72ce85cb2f94b0abb206145d9332dc14a47f738c..829c44db0271c27a95b788a740bd728a733bb41b 100644 (file)
@@ -1,10 +1,6 @@
-/*
- * Copyright (C) 2015 Renesas Electronics Corp.
+/* SPDX-License-Identifier: GPL-2.0+
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * Copyright (C) 2015 Renesas Electronics Corp.
  */
 
 #ifndef __DT_BINDINGS_CLOCK_R8A7792_CPG_MSSR_H__
index 7318d45d4e7e9888c41aa1fb66def087b4cb6ff4..49c66d8ed1782fc06d06000f6af96c8a2b464262 100644 (file)
@@ -1,16 +1,8 @@
-/*
+/* SPDX-License-Identifier: GPL-2.0
+ *
  * r8a7793 clock definition
  *
  * Copyright (C) 2014  Renesas Electronics Corporation
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
  */
 
 #ifndef __DT_BINDINGS_CLOCK_R8A7793_H__
index 8809b0f62d615457f07a463a3c4699d0276a0250..d1ff646c31f2355bf0e67d28c563a827a9df94a6 100644 (file)
@@ -1,10 +1,6 @@
-/*
- * Copyright (C) 2015 Renesas Electronics Corp.
+/* SPDX-License-Identifier: GPL-2.0+
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * Copyright (C) 2015 Renesas Electronics Corp.
  */
 
 #ifndef __DT_BINDINGS_CLOCK_R8A7793_CPG_MSSR_H__
index 93e99c3ffc8dafebef94d0644cb15532c86ab1b4..649f005782d05213ae3760124e67e4913c5b419c 100644 (file)
@@ -1,11 +1,7 @@
-/*
+/* SPDX-License-Identifier: GPL-2.0+
+ *
  * Copyright (C) 2014 Renesas Electronics Corporation
  * Copyright 2013 Ideas On Board SPRL
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
  */
 
 #ifndef __DT_BINDINGS_CLOCK_R8A7794_H__
index 9d720311ae3a229a324febbeeaf698f0ec977c5c..6314e23b51af5be9a019a89ac2791c03bf69c57a 100644 (file)
@@ -1,10 +1,6 @@
-/*
- * Copyright (C) 2015 Renesas Electronics Corp.
+/* SPDX-License-Identifier: GPL-2.0+
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * Copyright (C) 2015 Renesas Electronics Corp.
  */
 
 #ifndef __DT_BINDINGS_CLOCK_R8A7794_CPG_MSSR_H__
index f047eaf261f34ac783b2187997894daffe552572..9483896415654706de2f8820c327fc4512ffa81f 100644 (file)
@@ -1,10 +1,6 @@
-/*
- * Copyright (C) 2015 Renesas Electronics Corp.
+/* SPDX-License-Identifier: GPL-2.0+
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * Copyright (C) 2015 Renesas Electronics Corp.
  */
 #ifndef __DT_BINDINGS_CLOCK_R8A7795_CPG_MSSR_H__
 #define __DT_BINDINGS_CLOCK_R8A7795_CPG_MSSR_H__
index 1e5942695f0dd057e0e3976824e0205b357eb6b9..e6087f2f7e3aff4adcb4bf7ec6c949242e68d44a 100644 (file)
@@ -1,10 +1,6 @@
-/*
- * Copyright (C) 2016 Renesas Electronics Corp.
+/* SPDX-License-Identifier: GPL-2.0+
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * Copyright (C) 2016 Renesas Electronics Corp.
  */
 #ifndef __DT_BINDINGS_CLOCK_R8A7796_CPG_MSSR_H__
 #define __DT_BINDINGS_CLOCK_R8A7796_CPG_MSSR_H__
index 4146395595b10bda7a255d7c309ec17b29dc552b..6145ebe66361574256e630e2d2711b6007399b59 100644 (file)
@@ -1,11 +1,7 @@
-/*
+/* SPDX-License-Identifier: GPL-2.0+
+ *
  * Copyright (C) 2016 Renesas Electronics Corp.
  * Copyright (C) 2017 Cogent Embedded, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
  */
 #ifndef __DT_BINDINGS_CLOCK_R8A77970_CPG_MSSR_H__
 #define __DT_BINDINGS_CLOCK_R8A77970_CPG_MSSR_H__
index 4e8ae3dee5901b01374e6fd609e7e988d4107676..1eb11acfa563dbd81056d997d8cf0df2d3637d50 100644 (file)
@@ -1,10 +1,6 @@
-/*
- * Copyright (C) 2017 Glider bvba
+/* SPDX-License-Identifier: GPL-2.0+
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * Copyright (C) 2017 Glider bvba
  */
 #ifndef __DT_BINDINGS_CLOCK_R8A77995_CPG_MSSR_H__
 #define __DT_BINDINGS_CLOCK_R8A77995_CPG_MSSR_H__
index 569a3cc33ffb5bc7ed35cc2bd1948a8651d2e62a..8169ad063f0a03c760ea53ecf3bf5d7a5257577b 100644 (file)
@@ -1,10 +1,6 @@
-/*
- * Copyright (C) 2015 Renesas Electronics Corp.
+/* SPDX-License-Identifier: GPL-2.0+
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * Copyright (C) 2015 Renesas Electronics Corp.
  */
 #ifndef __DT_BINDINGS_CLOCK_RENESAS_CPG_MSSR_H__
 #define __DT_BINDINGS_CLOCK_RENESAS_CPG_MSSR_H__
index b9462b7d3dfe67bf495431786d19f53b61f4a8cf..dc2101a634befe28eb2d240c7a38055cd806de79 100644 (file)
 #define HCLK_CIF1              470
 #define HCLK_VEPU              471
 #define HCLK_VDPU              472
+#define HCLK_HDMI              473
 
-#define CLK_NR_CLKS            (HCLK_VDPU + 1)
+#define CLK_NR_CLKS            (HCLK_HDMI + 1)
 
 /* soft-reset indices */
 #define SRST_MCORE             2
index 352a7673fc69939a2c7f71679856732f654dddf1..0fb65c3f2f598bb825f3f664f1ced5dfc19af74c 100644 (file)
@@ -1,10 +1,7 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  * Copyright (c) 2013 Heiko Stuebner <heiko@sntech.de>
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
  * Device Tree binding constants clock controllers of Samsung S3C2410 and later.
  */
 
index aac1dcfda81cdb005fe8ff067768c3653a077b8f..b4656156cc0fb5616d59d5da8409108e1b14d69d 100644 (file)
@@ -1,10 +1,7 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  * Copyright (c) 2013 Heiko Stuebner <heiko@sntech.de>
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
  * Device Tree binding constants clock controllers of Samsung S3C2412.
  */
 
index f3ba68a25ecb2a82dbb92169928165a11fb642e5..a9d2f105d536a0eeb6368c00a6d630a320eecdc5 100644 (file)
@@ -1,10 +1,7 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  * Copyright (c) 2013 Heiko Stuebner <heiko@sntech.de>
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
  * Device Tree binding constants clock controllers of Samsung S3C2443 and later.
  */
 
index b903d7de27c92e2fda9ca66b685c9fea953a372d..5ece35d429ffeb30f6e7cbf41951cf8e16e9a091 100644 (file)
@@ -1,10 +1,7 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  * Copyright (C) 2015 Markus Reichl
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
  * Device Tree binding constants clocks for the Samsung S2MPS11 PMIC.
  */
 
index ad95c7f50090c749c32c7fe6f7936f179f240606..19d233f37e2fab7c6d5ee78953228200292e1036 100644 (file)
@@ -1,12 +1,9 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  * Copyright (c) 2013 Tomasz Figa <tomasz.figa at gmail.com>
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
  * Device Tree binding constants for Samsung S3C64xx clock controller.
-*/
+ */
 
 #ifndef _DT_BINDINGS_CLOCK_SAMSUNG_S3C64XX_CLOCK_H
 #define _DT_BINDINGS_CLOCK_SAMSUNG_S3C64XX_CLOCK_H
index d66432c6e6759730fff0a705edacb88be94fd40b..a8ac4cfcdcbc3e912bf2549d8b30da45b61bf86a 100644 (file)
@@ -43,6 +43,7 @@
 #ifndef _DT_BINDINGS_CLK_SUN50I_A64_H_
 #define _DT_BINDINGS_CLK_SUN50I_A64_H_
 
+#define CLK_PLL_VIDEO0         7
 #define CLK_PLL_PERIPH0                11
 
 #define CLK_BUS_MIPI_DSI       28
diff --git a/include/dt-bindings/reset/actions,s700-reset.h b/include/dt-bindings/reset/actions,s700-reset.h
new file mode 100644 (file)
index 0000000..5e3b16b
--- /dev/null
@@ -0,0 +1,34 @@
+// SPDX-License-Identifier: (GPL-2.0-or-later OR MIT)
+//
+// Device Tree binding constants for Actions Semi S700 Reset Management Unit
+//
+// Copyright (c) 2018 Linaro Ltd.
+
+#ifndef __DT_BINDINGS_ACTIONS_S700_RESET_H
+#define __DT_BINDINGS_ACTIONS_S700_RESET_H
+
+#define RESET_AUDIO                            0
+#define RESET_CSI                              1
+#define RESET_DE                               2
+#define RESET_DSI                              3
+#define RESET_GPIO                             4
+#define RESET_I2C0                             5
+#define RESET_I2C1                             6
+#define RESET_I2C2                             7
+#define RESET_I2C3                             8
+#define RESET_KEY                              9
+#define RESET_LCD0                             10
+#define RESET_SI                               11
+#define RESET_SPI0                             12
+#define RESET_SPI1                             13
+#define RESET_SPI2                             14
+#define RESET_SPI3                             15
+#define RESET_UART0                            16
+#define RESET_UART1                            17
+#define RESET_UART2                            18
+#define RESET_UART3                            19
+#define RESET_UART4                            20
+#define RESET_UART5                            21
+#define RESET_UART6                            22
+
+#endif /* __DT_BINDINGS_ACTIONS_S700_RESET_H */
diff --git a/include/dt-bindings/reset/actions,s900-reset.h b/include/dt-bindings/reset/actions,s900-reset.h
new file mode 100644 (file)
index 0000000..42c19d0
--- /dev/null
@@ -0,0 +1,65 @@
+// SPDX-License-Identifier: (GPL-2.0-or-later OR MIT)
+//
+// Device Tree binding constants for Actions Semi S900 Reset Management Unit
+//
+// Copyright (c) 2018 Linaro Ltd.
+
+#ifndef __DT_BINDINGS_ACTIONS_S900_RESET_H
+#define __DT_BINDINGS_ACTIONS_S900_RESET_H
+
+#define RESET_CHIPID                           0
+#define RESET_CPU_SCNT                         1
+#define RESET_SRAMI                            2
+#define RESET_DDR_CTL_PHY                      3
+#define RESET_DMAC                             4
+#define RESET_GPIO                             5
+#define RESET_BISP_AXI                         6
+#define RESET_CSI0                             7
+#define RESET_CSI1                             8
+#define RESET_DE                               9
+#define RESET_DSI                              10
+#define RESET_GPU3D_PA                         11
+#define RESET_GPU3D_PB                         12
+#define RESET_HDE                              13
+#define RESET_I2C0                             14
+#define RESET_I2C1                             15
+#define RESET_I2C2                             16
+#define RESET_I2C3                             17
+#define RESET_I2C4                             18
+#define RESET_I2C5                             19
+#define RESET_IMX                              20
+#define RESET_NANDC0                           21
+#define RESET_NANDC1                           22
+#define RESET_SD0                              23
+#define RESET_SD1                              24
+#define RESET_SD2                              25
+#define RESET_SD3                              26
+#define RESET_SPI0                             27
+#define RESET_SPI1                             28
+#define RESET_SPI2                             29
+#define RESET_SPI3                             30
+#define RESET_UART0                            31
+#define RESET_UART1                            32
+#define RESET_UART2                            33
+#define RESET_UART3                            34
+#define RESET_UART4                            35
+#define RESET_UART5                            36
+#define RESET_UART6                            37
+#define RESET_HDMI                             38
+#define RESET_LVDS                             39
+#define RESET_EDP                              40
+#define RESET_USB2HUB                          41
+#define RESET_USB2HSIC                         42
+#define RESET_USB3                             43
+#define RESET_PCM1                             44
+#define RESET_AUDIO                            45
+#define RESET_PCM0                             46
+#define RESET_SE                               47
+#define RESET_GIC                              48
+#define RESET_DDR_CTL_PHY_AXI                  49
+#define RESET_CMU_DDR                          50
+#define RESET_DMM                              51
+#define RESET_HDCP2TX                          52
+#define RESET_ETHERNET                         53
+
+#endif /* __DT_BINDINGS_ACTIONS_S900_RESET_H */
index 08b1aa70a38d30a30cb4ae0f58bf7a68be92b15b..60c51871b04be87b67235c952edb85f8b26b6217 100644 (file)
@@ -119,6 +119,11 @@ struct clk_duty {
  *             Called with enable_lock held.  This function must not
  *             sleep.
  *
+ * @save_context: Save the context of the clock in prepration for poweroff.
+ *
+ * @restore_context: Restore the context of the clock after a restoration
+ *             of power.
+ *
  * @recalc_rate        Recalculate the rate of this clock, by querying hardware. The
  *             parent rate is an input parameter.  It is up to the caller to
  *             ensure that the prepare_mutex is held across this call.
@@ -223,6 +228,8 @@ struct clk_ops {
        void            (*disable)(struct clk_hw *hw);
        int             (*is_enabled)(struct clk_hw *hw);
        void            (*disable_unused)(struct clk_hw *hw);
+       int             (*save_context)(struct clk_hw *hw);
+       void            (*restore_context)(struct clk_hw *hw);
        unsigned long   (*recalc_rate)(struct clk_hw *hw,
                                        unsigned long parent_rate);
        long            (*round_rate)(struct clk_hw *hw, unsigned long rate,
@@ -1011,5 +1018,7 @@ static inline void clk_writel(u32 val, u32 __iomem *reg)
 
 #endif /* platform dependent I/O accessors */
 
+void clk_gate_restore_context(struct clk_hw *hw);
+
 #endif /* CONFIG_COMMON_CLK */
 #endif /* CLK_PROVIDER_H */
index 4f750c481b82b29d05e136d9cea42e51e58199b9..a7773b5c0b9fb4b3e9c08966c83b3441ef240760 100644 (file)
@@ -312,7 +312,26 @@ struct clk *clk_get(struct device *dev, const char *id);
  */
 int __must_check clk_bulk_get(struct device *dev, int num_clks,
                              struct clk_bulk_data *clks);
-
+/**
+ * clk_bulk_get_all - lookup and obtain all available references to clock
+ *                   producer.
+ * @dev: device for clock "consumer"
+ * @clks: pointer to the clk_bulk_data table of consumer
+ *
+ * This helper function allows drivers to get all clk consumers in one
+ * operation. If any of the clk cannot be acquired then any clks
+ * that were obtained will be freed before returning to the caller.
+ *
+ * Returns a positive value for the number of clocks obtained while the
+ * clock references are stored in the clk_bulk_data table in @clks field.
+ * Returns 0 if there're none and a negative value if something failed.
+ *
+ * Drivers must assume that the clock source is not enabled.
+ *
+ * clk_bulk_get should not be called from within interrupt context.
+ */
+int __must_check clk_bulk_get_all(struct device *dev,
+                                 struct clk_bulk_data **clks);
 /**
  * devm_clk_bulk_get - managed get multiple clk consumers
  * @dev: device for clock "consumer"
@@ -327,6 +346,22 @@ int __must_check clk_bulk_get(struct device *dev, int num_clks,
  */
 int __must_check devm_clk_bulk_get(struct device *dev, int num_clks,
                                   struct clk_bulk_data *clks);
+/**
+ * devm_clk_bulk_get_all - managed get multiple clk consumers
+ * @dev: device for clock "consumer"
+ * @clks: pointer to the clk_bulk_data table of consumer
+ *
+ * Returns a positive value for the number of clocks obtained while the
+ * clock references are stored in the clk_bulk_data table in @clks field.
+ * Returns 0 if there're none and a negative value if something failed.
+ *
+ * This helper function allows drivers to get several clk
+ * consumers in one operation with management, the clks will
+ * automatically be freed when the device is unbound.
+ */
+
+int __must_check devm_clk_bulk_get_all(struct device *dev,
+                                      struct clk_bulk_data **clks);
 
 /**
  * devm_clk_get - lookup and obtain a managed reference to a clock producer.
@@ -487,6 +522,19 @@ void clk_put(struct clk *clk);
  */
 void clk_bulk_put(int num_clks, struct clk_bulk_data *clks);
 
+/**
+ * clk_bulk_put_all - "free" all the clock source
+ * @num_clks: the number of clk_bulk_data
+ * @clks: the clk_bulk_data table of consumer
+ *
+ * Note: drivers must ensure that all clk_bulk_enable calls made on this
+ * clock source are balanced by clk_bulk_disable calls prior to calling
+ * this function.
+ *
+ * clk_bulk_put_all should not be called from within interrupt context.
+ */
+void clk_bulk_put_all(int num_clks, struct clk_bulk_data *clks);
+
 /**
  * devm_clk_put        - "free" a managed clock source
  * @dev: device used to acquire the clock
@@ -629,6 +677,23 @@ struct clk *clk_get_parent(struct clk *clk);
  */
 struct clk *clk_get_sys(const char *dev_id, const char *con_id);
 
+/**
+ * clk_save_context - save clock context for poweroff
+ *
+ * Saves the context of the clock register for powerstates in which the
+ * contents of the registers will be lost. Occurs deep within the suspend
+ * code so locking is not necessary.
+ */
+int clk_save_context(void);
+
+/**
+ * clk_restore_context - restore clock context after poweroff
+ *
+ * This occurs with all clocks enabled. Occurs deep within the resume code
+ * so locking is not necessary.
+ */
+void clk_restore_context(void);
+
 #else /* !CONFIG_HAVE_CLK */
 
 static inline struct clk *clk_get(struct device *dev, const char *id)
@@ -642,6 +707,12 @@ static inline int __must_check clk_bulk_get(struct device *dev, int num_clks,
        return 0;
 }
 
+static inline int __must_check clk_bulk_get_all(struct device *dev,
+                                        struct clk_bulk_data **clks)
+{
+       return 0;
+}
+
 static inline struct clk *devm_clk_get(struct device *dev, const char *id)
 {
        return NULL;
@@ -653,6 +724,13 @@ static inline int __must_check devm_clk_bulk_get(struct device *dev, int num_clk
        return 0;
 }
 
+static inline int __must_check devm_clk_bulk_get_all(struct device *dev,
+                                                    struct clk_bulk_data **clks)
+{
+
+       return 0;
+}
+
 static inline struct clk *devm_get_clk_from_child(struct device *dev,
                                struct device_node *np, const char *con_id)
 {
@@ -663,6 +741,8 @@ static inline void clk_put(struct clk *clk) {}
 
 static inline void clk_bulk_put(int num_clks, struct clk_bulk_data *clks) {}
 
+static inline void clk_bulk_put_all(int num_clks, struct clk_bulk_data *clks) {}
+
 static inline void devm_clk_put(struct device *dev, struct clk *clk) {}
 
 
@@ -728,6 +808,14 @@ static inline struct clk *clk_get_sys(const char *dev_id, const char *con_id)
 {
        return NULL;
 }
+
+static inline int clk_save_context(void)
+{
+       return 0;
+}
+
+static inline void clk_restore_context(void) {}
+
 #endif
 
 /* clk_prepare_enable helps cases using clk_enable in non-atomic context. */
index 9ebf1f8243bb57af54b0d5adc3b22408c858d103..0ebbe2f0b45e785440dcc0f5962d86faf331f1fd 100644 (file)
@@ -1,14 +1,10 @@
-/*
+/* SPDX-License-Identifier: GPL-2.0+
+ *
  * Copyright 2013 Ideas On Board SPRL
  * Copyright 2013, 2014 Horms Solutions Ltd.
  *
  * Contact: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  * Contact: Simon Horman <horms@verge.net.au>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
  */
 
 #ifndef __LINUX_CLK_RENESAS_H_
index a8faa38b1ed60bd5a7a306abda6b39413e677090..eacc5df57b99fd28cba56081e03f8fa0cccf576b 100644 (file)
@@ -159,6 +159,7 @@ struct clk_hw_omap {
        const char              *clkdm_name;
        struct clockdomain      *clkdm;
        const struct clk_hw_omap_ops    *ops;
+       u32                     context;
 };
 
 /*
@@ -290,9 +291,15 @@ struct ti_clk_features {
 #define TI_CLK_DPLL4_DENY_REPROGRAM            BIT(1)
 #define TI_CLK_DISABLE_CLKDM_CONTROL           BIT(2)
 #define TI_CLK_ERRATA_I810                     BIT(3)
+#define TI_CLK_CLKCTRL_COMPAT                  BIT(4)
 
 void ti_clk_setup_features(struct ti_clk_features *features);
 const struct ti_clk_features *ti_clk_get_features(void);
+int omap3_noncore_dpll_save_context(struct clk_hw *hw);
+void omap3_noncore_dpll_restore_context(struct clk_hw *hw);
+
+int omap3_core_dpll_save_context(struct clk_hw *hw);
+void omap3_core_dpll_restore_context(struct clk_hw *hw);
 
 extern const struct clk_hw_omap_ops clkhwops_omap2xxx_dpll;