Merge tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 4 Nov 2021 04:18:44 +0000 (21:18 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 4 Nov 2021 04:18:44 +0000 (21:18 -0700)
Pull clk updates from Stephen Boyd:
 "The usual collection of clk driver updates and new driver additions.
  In terms of lines it's mainly Qualcomm and Mediatek code, supporting
  various SoCs and their multitude of clk controllers.

  New Drivers:
   - GCC and RPMcc support for Qualcomm QCM2290 SoCs
   - GCC support for Qualcomm MSM8994/MSM8992 SoCs
   - LPASSCC and CAMCC support for Qualcomm SC7280 SoCs
   - Support for Mediatek MT8195 SoCs
   - Initial clock driver for the Exynos850 SoC
   - Add i.MX8ULP clock driver and related bindings

  Updates:
   - Clock power management for new SAMA7G5 SoC
   - Updates to the master clock driver and sam9x60-pll to be able to
     use cpufreq-dt driver and avoid overclocking of CPU and MCK0
     domains while changing the frequency via DVFS
   - Use ARRAY_SIZE in qcom clk drivers
   - Remove some impractical fallback parent names in qcom clk drivers
   - Make Mediatek clk drivers tristate
   - Refactoring of the CPU clock code and conversion of Samsung
     Exynos5433 CPU clock driver to the platform driver
   - A few conversions to devm_platform_ioremap_resource()
   - Updates of the Samsung Kconfig help text
   - Update video path realted clocks for Amlogic meson8
   - Add SPI Multi I/O Bus and SDHI clocks and resets on Renesas RZ/G2L
   - Add SPI Multi I/O Bus (RPC) clocks on Renesas R-Car V3U
   - Add MediaLB clocks on Renesas R-Car H3, M3-W/W+, and M3-N
   - Remove unused helpers from i.MX specific clock header
   - Rework all i.MX clk based helpers to use clk_hw based ones
   - Rework i.MX gate/mux/divider wrappers
   - Rework imx_clk_hw_composite and imx_clk_hw_pll14xx wrappers
   - Update i.MX pllv4 and composite clocks to support i.MX8ULP
   - Disable i.MX7ULP composite clock during initialization
   - Add CLK_SET_RATE_NO_REPARENT flag to the i.MX7ULP composite
   - Disable the i.MX pfd when set pfdv2 clock rate
   - Add support for i.MX8ULP in pfdv2
   - Add the pcc reset controller support on i.MX8ULP
   - Fix the build break when clk-imx8ulp is built as module
   - Move csi_sel mux to correct base register in i.MX6UL clock drivr
   - Fix csi clk gate register in i.MX6UL clock driver
   - Fix build bug making CLK_IMX8ULP select MXC_CLK
   - Add TPU (PWM), and Z (Cortex-A76) clocks on Renesas R-Car V3U
   - Add Ethernet clocks on Renesas RZ/G2L
   - Move Rockchip to use module_platform_probe
   - Enable usage of Coresight related clocks on Rockchip rk3399"

* tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux: (170 commits)
  clk: use clk_core_get_rate_recalc() in clk_rate_get()
  clk: at91: sama7g5: set low limit for mck0 at 32KHz
  clk: at91: sama7g5: remove prescaler part of master clock
  clk: at91: clk-master: add notifier for divider
  clk: at91: clk-sam9x60-pll: add notifier for div part of PLL
  clk: at91: clk-master: fix prescaler logic
  clk: at91: clk-master: mask mckr against layout->mask
  clk: at91: clk-master: check if div or pres is zero
  clk: at91: sam9x60-pll: use DIV_ROUND_CLOSEST_ULL
  clk: at91: pmc: add sama7g5 to the list of available pmcs
  clk: at91: clk-master: improve readability by using local variables
  clk: at91: clk-master: add register definition for sama7g5's master clock
  clk: at91: sama7g5: add securam's peripheral clock
  clk: at91: pmc: execute suspend/resume only for backup mode
  clk: at91: re-factor clocks suspend/resume
  clk: ux500: Add driver for the reset portions of PRCC
  dt-bindings: clock: u8500: Rewrite in YAML and extend
  clk: composite: Use rate_ops.determine_rate when also a mux is available
  clk: samsung: describe drivers in Kconfig
  clk: samsung: exynos5433: update apollo and atlas clock probing
  ...

198 files changed:
Documentation/devicetree/bindings/arm/mediatek/mediatek,mt8195-clock.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/arm/mediatek/mediatek,mt8195-sys-clock.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/allwinner,sun8i-a83t-de2-clk.yaml
Documentation/devicetree/bindings/clock/arm,syscon-icst.yaml
Documentation/devicetree/bindings/clock/fixed-mmio-clock.txt [deleted file]
Documentation/devicetree/bindings/clock/fixed-mmio-clock.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/imx8ulp-cgc-clock.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/imx8ulp-pcc-clock.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/qcom,dispcc-sm8x50.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-msm8994.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/qcom,gcc-msm8998.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-qcm2290.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/qcom,gcc.yaml
Documentation/devicetree/bindings/clock/qcom,rpmcc.txt
Documentation/devicetree/bindings/clock/qcom,sc7280-camcc.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/qcom,sc7280-lpasscc.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/qcom,videocc.yaml
Documentation/devicetree/bindings/clock/samsung,exynos850-clock.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/stericsson,u8500-clks.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/ux500.txt [deleted file]
arch/arm/mach-integrator/Kconfig
arch/arm/mach-realview/Kconfig
arch/arm/mach-ux500/Kconfig
arch/arm/mach-versatile/Kconfig
arch/arm/mach-vexpress/Kconfig
drivers/clk/at91/at91rm9200.c
drivers/clk/at91/at91sam9260.c
drivers/clk/at91/at91sam9g45.c
drivers/clk/at91/at91sam9n12.c
drivers/clk/at91/at91sam9rl.c
drivers/clk/at91/at91sam9x5.c
drivers/clk/at91/clk-generated.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-programmable.c
drivers/clk/at91/clk-sam9x60-pll.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
drivers/clk/at91/pmc.c
drivers/clk/at91/pmc.h
drivers/clk/at91/sam9x60.c
drivers/clk/at91/sama5d2.c
drivers/clk/at91/sama5d3.c
drivers/clk/at91/sama5d4.c
drivers/clk/at91/sama7g5.c
drivers/clk/clk-composite.c
drivers/clk/clk.c
drivers/clk/imx/Kconfig
drivers/clk/imx/Makefile
drivers/clk/imx/clk-composite-7ulp.c
drivers/clk/imx/clk-composite-8m.c
drivers/clk/imx/clk-imx6ul.c
drivers/clk/imx/clk-imx7ulp.c
drivers/clk/imx/clk-imx8ulp.c [new file with mode: 0644]
drivers/clk/imx/clk-pfdv2.c
drivers/clk/imx/clk-pllv4.c
drivers/clk/imx/clk.h
drivers/clk/mediatek/Kconfig
drivers/clk/mediatek/Makefile
drivers/clk/mediatek/clk-apmixed.c
drivers/clk/mediatek/clk-cpumux.c
drivers/clk/mediatek/clk-gate.c
drivers/clk/mediatek/clk-mt6779-aud.c
drivers/clk/mediatek/clk-mt6779-cam.c
drivers/clk/mediatek/clk-mt6779-img.c
drivers/clk/mediatek/clk-mt6779-ipe.c
drivers/clk/mediatek/clk-mt6779-mfg.c
drivers/clk/mediatek/clk-mt6779-mm.c
drivers/clk/mediatek/clk-mt6779-vdec.c
drivers/clk/mediatek/clk-mt6779-venc.c
drivers/clk/mediatek/clk-mt6779.c
drivers/clk/mediatek/clk-mt8195-apmixedsys.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8195-apusys_pll.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8195-cam.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8195-ccu.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8195-img.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8195-imp_iic_wrap.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8195-infra_ao.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8195-ipe.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8195-mfg.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8195-peri_ao.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8195-scp_adsp.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8195-topckgen.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8195-vdec.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8195-vdo0.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8195-vdo1.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8195-venc.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8195-vpp0.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8195-vpp1.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8195-wpe.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mtk.c
drivers/clk/mediatek/clk-mtk.h
drivers/clk/mediatek/clk-mux.c
drivers/clk/mediatek/clk-pll.c
drivers/clk/mediatek/reset.c
drivers/clk/meson/meson8b.c
drivers/clk/meson/meson8b.h
drivers/clk/mvebu/ap-cpu-clk.c
drivers/clk/qcom/Kconfig
drivers/clk/qcom/Makefile
drivers/clk/qcom/a53-pll.c
drivers/clk/qcom/camcc-sc7280.c [new file with mode: 0644]
drivers/clk/qcom/clk-smd-rpm.c
drivers/clk/qcom/common.c
drivers/clk/qcom/dispcc-sm8250.c
drivers/clk/qcom/gcc-msm8953.c
drivers/clk/qcom/gcc-msm8994.c
drivers/clk/qcom/gcc-msm8998.c
drivers/clk/qcom/gcc-qcm2290.c [new file with mode: 0644]
drivers/clk/qcom/gcc-sc7280.c
drivers/clk/qcom/gcc-sdm660.c
drivers/clk/qcom/gdsc.c
drivers/clk/qcom/gdsc.h
drivers/clk/qcom/gpucc-msm8998.c
drivers/clk/qcom/gpucc-sdm660.c
drivers/clk/qcom/kpss-xcc.c
drivers/clk/qcom/lpasscc-sc7280.c [new file with mode: 0644]
drivers/clk/qcom/mmcc-msm8998.c
drivers/clk/qcom/mmcc-sdm660.c
drivers/clk/qcom/videocc-sm8250.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/r8a779a0-cpg-mssr.c
drivers/clk/renesas/r9a07g044-cpg.c
drivers/clk/renesas/rcar-cpg-lib.c
drivers/clk/renesas/rcar-cpg-lib.h
drivers/clk/renesas/rcar-gen3-cpg.c
drivers/clk/renesas/rzg2l-cpg.c
drivers/clk/renesas/rzg2l-cpg.h
drivers/clk/rockchip/clk-rk3399.c
drivers/clk/rockchip/clk-rk3568.c
drivers/clk/samsung/Kconfig
drivers/clk/samsung/Makefile
drivers/clk/samsung/clk-cpu.c
drivers/clk/samsung/clk-exynos-audss.c
drivers/clk/samsung/clk-exynos4412-isp.c
drivers/clk/samsung/clk-exynos5433.c
drivers/clk/samsung/clk-exynos850.c [new file with mode: 0644]
drivers/clk/samsung/clk-pll.c
drivers/clk/samsung/clk-pll.h
drivers/clk/samsung/clk-s5pv210-audss.c
drivers/clk/samsung/clk.c
drivers/clk/samsung/clk.h
drivers/clk/sunxi-ng/Kconfig
drivers/clk/sunxi-ng/ccu-sun4i-a10.c
drivers/clk/sunxi-ng/ccu-sun50i-a100-r.c
drivers/clk/sunxi-ng/ccu-sun50i-a100.c
drivers/clk/sunxi-ng/ccu-sun50i-a64.c
drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c
drivers/clk/sunxi-ng/ccu-sun50i-h6.c
drivers/clk/sunxi-ng/ccu-sun50i-h616.c
drivers/clk/sunxi-ng/ccu-sun5i.c
drivers/clk/sunxi-ng/ccu-sun6i-a31.c
drivers/clk/sunxi-ng/ccu-sun8i-a23.c
drivers/clk/sunxi-ng/ccu-sun8i-a33.c
drivers/clk/sunxi-ng/ccu-sun8i-a83t.c
drivers/clk/sunxi-ng/ccu-sun8i-de2.c
drivers/clk/sunxi-ng/ccu-sun8i-h3.c
drivers/clk/sunxi-ng/ccu-sun8i-r.c
drivers/clk/sunxi-ng/ccu-sun8i-r40.c
drivers/clk/sunxi-ng/ccu-sun8i-v3s.c
drivers/clk/sunxi-ng/ccu-sun9i-a80-de.c
drivers/clk/sunxi-ng/ccu-sun9i-a80-usb.c
drivers/clk/sunxi-ng/ccu-sun9i-a80.c
drivers/clk/sunxi-ng/ccu-suniv-f1c100s.c
drivers/clk/sunxi-ng/ccu_common.c
drivers/clk/sunxi-ng/ccu_common.h
drivers/clk/sunxi-ng/ccu_mux.h
drivers/clk/sunxi/clk-mod0.c
drivers/clk/sunxi/clk-sun6i-apb0-gates.c
drivers/clk/sunxi/clk-sun6i-apb0.c
drivers/clk/sunxi/clk-sun6i-ar100.c
drivers/clk/sunxi/clk-sun8i-apb0.c
drivers/clk/ux500/Makefile
drivers/clk/ux500/prcc.h [new file with mode: 0644]
drivers/clk/ux500/reset-prcc.c [new file with mode: 0644]
drivers/clk/ux500/reset-prcc.h [new file with mode: 0644]
drivers/clk/ux500/u8500_of_clk.c
drivers/clk/versatile/Kconfig
drivers/clk/versatile/Makefile
drivers/clk/versatile/clk-icst.c
include/dt-bindings/clock/exynos850.h [new file with mode: 0644]
include/dt-bindings/clock/imx8ulp-clock.h [new file with mode: 0644]
include/dt-bindings/clock/meson8b-clkc.h
include/dt-bindings/clock/mt8195-clk.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,camcc-sc7280.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,gcc-msm8994.h
include/dt-bindings/clock/qcom,gcc-qcm2290.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,lpass-sc7280.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,rpmcc.h
include/dt-bindings/reset/imx8ulp-pcc-reset.h [new file with mode: 0644]
include/dt-bindings/reset/stericsson,db8500-prcc-reset.h [new file with mode: 0644]
include/linux/soc/qcom/smd-rpm.h

diff --git a/Documentation/devicetree/bindings/arm/mediatek/mediatek,mt8195-clock.yaml b/Documentation/devicetree/bindings/arm/mediatek/mediatek,mt8195-clock.yaml
new file mode 100644 (file)
index 0000000..17fcbb4
--- /dev/null
@@ -0,0 +1,254 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: "http://devicetree.org/schemas/arm/mediatek/mediatek,mt8195-clock.yaml#"
+$schema: "http://devicetree.org/meta-schemas/core.yaml#"
+
+title: MediaTek Functional Clock Controller for MT8195
+
+maintainers:
+  - Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+description:
+  The clock architecture in Mediatek like below
+  PLLs -->
+          dividers -->
+                      muxes
+                           -->
+                              clock gate
+
+  The devices except apusys_pll provide clock gate control in different IP blocks.
+  The apusys_pll provides Plls which generated from SoC 26m for AI Processing Unit.
+
+properties:
+  compatible:
+    items:
+      - enum:
+          - mediatek,mt8195-scp_adsp
+          - mediatek,mt8195-imp_iic_wrap_s
+          - mediatek,mt8195-imp_iic_wrap_w
+          - mediatek,mt8195-mfgcfg
+          - mediatek,mt8195-vppsys0
+          - mediatek,mt8195-wpesys
+          - mediatek,mt8195-wpesys_vpp0
+          - mediatek,mt8195-wpesys_vpp1
+          - mediatek,mt8195-vppsys1
+          - mediatek,mt8195-imgsys
+          - mediatek,mt8195-imgsys1_dip_top
+          - mediatek,mt8195-imgsys1_dip_nr
+          - mediatek,mt8195-imgsys1_wpe
+          - mediatek,mt8195-ipesys
+          - mediatek,mt8195-camsys
+          - mediatek,mt8195-camsys_rawa
+          - mediatek,mt8195-camsys_yuva
+          - mediatek,mt8195-camsys_rawb
+          - mediatek,mt8195-camsys_yuvb
+          - mediatek,mt8195-camsys_mraw
+          - mediatek,mt8195-ccusys
+          - mediatek,mt8195-vdecsys_soc
+          - mediatek,mt8195-vdecsys
+          - mediatek,mt8195-vdecsys_core1
+          - mediatek,mt8195-vencsys
+          - mediatek,mt8195-vencsys_core1
+          - mediatek,mt8195-apusys_pll
+  reg:
+    maxItems: 1
+
+  '#clock-cells':
+    const: 1
+
+required:
+  - compatible
+  - reg
+
+additionalProperties: false
+
+examples:
+  - |
+    scp_adsp: clock-controller@10720000 {
+        compatible = "mediatek,mt8195-scp_adsp";
+        reg = <0x10720000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    imp_iic_wrap_s: clock-controller@11d03000 {
+        compatible = "mediatek,mt8195-imp_iic_wrap_s";
+        reg = <0x11d03000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    imp_iic_wrap_w: clock-controller@11e05000 {
+        compatible = "mediatek,mt8195-imp_iic_wrap_w";
+        reg = <0x11e05000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    mfgcfg: clock-controller@13fbf000 {
+        compatible = "mediatek,mt8195-mfgcfg";
+        reg = <0x13fbf000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    vppsys0: clock-controller@14000000 {
+        compatible = "mediatek,mt8195-vppsys0";
+        reg = <0x14000000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    wpesys: clock-controller@14e00000 {
+        compatible = "mediatek,mt8195-wpesys";
+        reg = <0x14e00000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    wpesys_vpp0: clock-controller@14e02000 {
+        compatible = "mediatek,mt8195-wpesys_vpp0";
+        reg = <0x14e02000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    wpesys_vpp1: clock-controller@14e03000 {
+        compatible = "mediatek,mt8195-wpesys_vpp1";
+        reg = <0x14e03000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    vppsys1: clock-controller@14f00000 {
+        compatible = "mediatek,mt8195-vppsys1";
+        reg = <0x14f00000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    imgsys: clock-controller@15000000 {
+        compatible = "mediatek,mt8195-imgsys";
+        reg = <0x15000000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    imgsys1_dip_top: clock-controller@15110000 {
+        compatible = "mediatek,mt8195-imgsys1_dip_top";
+        reg = <0x15110000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    imgsys1_dip_nr: clock-controller@15130000 {
+        compatible = "mediatek,mt8195-imgsys1_dip_nr";
+        reg = <0x15130000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    imgsys1_wpe: clock-controller@15220000 {
+        compatible = "mediatek,mt8195-imgsys1_wpe";
+        reg = <0x15220000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    ipesys: clock-controller@15330000 {
+        compatible = "mediatek,mt8195-ipesys";
+        reg = <0x15330000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    camsys: clock-controller@16000000 {
+        compatible = "mediatek,mt8195-camsys";
+        reg = <0x16000000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    camsys_rawa: clock-controller@1604f000 {
+        compatible = "mediatek,mt8195-camsys_rawa";
+        reg = <0x1604f000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    camsys_yuva: clock-controller@1606f000 {
+        compatible = "mediatek,mt8195-camsys_yuva";
+        reg = <0x1606f000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    camsys_rawb: clock-controller@1608f000 {
+        compatible = "mediatek,mt8195-camsys_rawb";
+        reg = <0x1608f000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    camsys_yuvb: clock-controller@160af000 {
+        compatible = "mediatek,mt8195-camsys_yuvb";
+        reg = <0x160af000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    camsys_mraw: clock-controller@16140000 {
+        compatible = "mediatek,mt8195-camsys_mraw";
+        reg = <0x16140000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    ccusys: clock-controller@17200000 {
+        compatible = "mediatek,mt8195-ccusys";
+        reg = <0x17200000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    vdecsys_soc: clock-controller@1800f000 {
+        compatible = "mediatek,mt8195-vdecsys_soc";
+        reg = <0x1800f000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    vdecsys: clock-controller@1802f000 {
+        compatible = "mediatek,mt8195-vdecsys";
+        reg = <0x1802f000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    vdecsys_core1: clock-controller@1803f000 {
+        compatible = "mediatek,mt8195-vdecsys_core1";
+        reg = <0x1803f000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    vencsys: clock-controller@1a000000 {
+        compatible = "mediatek,mt8195-vencsys";
+        reg = <0x1a000000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    vencsys_core1: clock-controller@1b000000 {
+        compatible = "mediatek,mt8195-vencsys_core1";
+        reg = <0x1b000000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    apusys_pll: clock-controller@190f3000 {
+        compatible = "mediatek,mt8195-apusys_pll";
+        reg = <0x190f3000 0x1000>;
+        #clock-cells = <1>;
+    };
diff --git a/Documentation/devicetree/bindings/arm/mediatek/mediatek,mt8195-sys-clock.yaml b/Documentation/devicetree/bindings/arm/mediatek/mediatek,mt8195-sys-clock.yaml
new file mode 100644 (file)
index 0000000..57a1503
--- /dev/null
@@ -0,0 +1,73 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: "http://devicetree.org/schemas/arm/mediatek/mediatek,mt8195-sys-clock.yaml#"
+$schema: "http://devicetree.org/meta-schemas/core.yaml#"
+
+title: MediaTek System Clock Controller for MT8195
+
+maintainers:
+  - Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+description:
+  The clock architecture in Mediatek like below
+  PLLs -->
+          dividers -->
+                      muxes
+                           -->
+                              clock gate
+
+  The apmixedsys provides most of PLLs which generated from SoC 26m.
+  The topckgen provides dividers and muxes which provide the clock source to other IP blocks.
+  The infracfg_ao and pericfg_ao provides clock gate in peripheral and infrastructure IP blocks.
+
+properties:
+  compatible:
+    items:
+      - enum:
+          - mediatek,mt8195-topckgen
+          - mediatek,mt8195-infracfg_ao
+          - mediatek,mt8195-apmixedsys
+          - mediatek,mt8195-pericfg_ao
+      - const: syscon
+
+  reg:
+    maxItems: 1
+
+  '#clock-cells':
+    const: 1
+
+required:
+  - compatible
+  - reg
+
+additionalProperties: false
+
+examples:
+  - |
+    topckgen: syscon@10000000 {
+        compatible = "mediatek,mt8195-topckgen", "syscon";
+        reg = <0x10000000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    infracfg_ao: syscon@10001000 {
+        compatible = "mediatek,mt8195-infracfg_ao", "syscon";
+        reg = <0x10001000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    apmixedsys: syscon@1000c000 {
+        compatible = "mediatek,mt8195-apmixedsys", "syscon";
+        reg = <0x1000c000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    pericfg_ao: syscon@11003000 {
+        compatible = "mediatek,mt8195-pericfg_ao", "syscon";
+        reg = <0x11003000 0x1000>;
+        #clock-cells = <1>;
+    };
index 3f995d2..e79eeac 100644 (file)
@@ -24,7 +24,7 @@ properties:
       - const: allwinner,sun8i-v3s-de2-clk
       - const: allwinner,sun50i-a64-de2-clk
       - const: allwinner,sun50i-h5-de2-clk
-      - const: allwinner,sun50i-h6-de2-clk
+      - const: allwinner,sun50i-h6-de3-clk
       - items:
           - const: allwinner,sun8i-r40-de2-clk
           - const: allwinner,sun8i-h3-de2-clk
index 118c554..90eadf6 100644 (file)
@@ -69,6 +69,10 @@ properties:
       - arm,impd1-vco1
       - arm,impd1-vco2
 
+  reg:
+    maxItems: 1
+    description: The VCO register
+
   clocks:
     description: Parent clock for the ICST VCO
     maxItems: 1
@@ -83,6 +87,7 @@ properties:
   vco-offset:
     $ref: '/schemas/types.yaml#/definitions/uint32'
     description: Offset to the VCO register for the oscillator
+    deprecated: true
 
 required:
   - "#clock-cells"
diff --git a/Documentation/devicetree/bindings/clock/fixed-mmio-clock.txt b/Documentation/devicetree/bindings/clock/fixed-mmio-clock.txt
deleted file mode 100644 (file)
index c359367..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-Binding for simple memory mapped io fixed-rate clock sources.
-The driver reads a clock frequency value from a single 32-bit memory mapped
-I/O register and registers it as a fixed rate clock.
-
-It was designed for test systems, like FPGA, not for complete, finished SoCs.
-
-This binding uses the common clock binding[1].
-
-[1] Documentation/devicetree/bindings/clock/clock-bindings.txt
-
-Required properties:
-- compatible : shall be "fixed-mmio-clock".
-- #clock-cells : from common clock binding; shall be set to 0.
-- reg : Address and length of the clock value register set.
-
-Optional properties:
-- clock-output-names : From common clock binding.
-
-Example:
-sysclock: sysclock@fd020004 {
-       #clock-cells = <0>;
-       compatible = "fixed-mmio-clock";
-       reg = <0xfd020004 0x4>;
-};
diff --git a/Documentation/devicetree/bindings/clock/fixed-mmio-clock.yaml b/Documentation/devicetree/bindings/clock/fixed-mmio-clock.yaml
new file mode 100644 (file)
index 0000000..1453ac8
--- /dev/null
@@ -0,0 +1,47 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/fixed-mmio-clock.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Binding for simple memory mapped IO fixed-rate clock sources
+
+description:
+  This binding describes a fixed-rate clock for which the frequency can
+  be read from a single 32-bit memory mapped I/O register.
+
+  It was designed for test systems, like FPGA, not for complete,
+  finished SoCs.
+
+maintainers:
+  - Jan Kotas <jank@cadence.com>
+
+properties:
+  compatible:
+    const: fixed-mmio-clock
+
+  reg:
+    maxItems: 1
+
+  "#clock-cells":
+    const: 0
+
+  clock-output-names:
+    maxItems: 1
+
+required:
+  - compatible
+  - reg
+  - "#clock-cells"
+
+additionalProperties: false
+
+examples:
+  - |
+    sysclock: sysclock@fd020004 {
+      compatible = "fixed-mmio-clock";
+      #clock-cells = <0>;
+      reg = <0xfd020004 0x4>;
+      clock-output-names = "sysclk";
+    };
+...
diff --git a/Documentation/devicetree/bindings/clock/imx8ulp-cgc-clock.yaml b/Documentation/devicetree/bindings/clock/imx8ulp-cgc-clock.yaml
new file mode 100644 (file)
index 0000000..71f7186
--- /dev/null
@@ -0,0 +1,43 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/imx8ulp-cgc-clock.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: NXP i.MX8ULP Clock Generation & Control(CGC) Module Binding
+
+maintainers:
+  - Jacky Bai <ping.bai@nxp.com>
+
+description: |
+  On i.MX8ULP, The clock sources generation, distribution and management is
+  under the control of several CGCs & PCCs modules. The CGC modules generate
+  and distribute clocks on the device.
+
+properties:
+  compatible:
+    enum:
+      - fsl,imx8ulp-cgc1
+      - fsl,imx8ulp-cgc2
+
+  reg:
+    maxItems: 1
+
+  '#clock-cells':
+    const: 1
+
+required:
+  - compatible
+  - reg
+  - '#clock-cells'
+
+additionalProperties: false
+
+examples:
+  # Clock Generation & Control Module node:
+  - |
+    clock-controller@292c0000 {
+        compatible = "fsl,imx8ulp-cgc1";
+        reg = <0x292c0000 0x10000>;
+        #clock-cells = <1>;
+    };
diff --git a/Documentation/devicetree/bindings/clock/imx8ulp-pcc-clock.yaml b/Documentation/devicetree/bindings/clock/imx8ulp-pcc-clock.yaml
new file mode 100644 (file)
index 0000000..0061272
--- /dev/null
@@ -0,0 +1,50 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/imx8ulp-pcc-clock.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: NXP i.MX8ULP Peripheral Clock Controller(PCC) Module Binding
+
+maintainers:
+  - Jacky Bai <ping.bai@nxp.com>
+
+description: |
+  On i.MX8ULP, The clock sources generation, distribution and management is
+  under the control of several CGCs & PCCs modules. The PCC modules control
+  software reset, clock selection, optional division and clock gating mode
+  for peripherals.
+
+properties:
+  compatible:
+    enum:
+      - fsl,imx8ulp-pcc3
+      - fsl,imx8ulp-pcc4
+      - fsl,imx8ulp-pcc5
+
+  reg:
+    maxItems: 1
+
+  '#clock-cells':
+    const: 1
+
+  '#reset-cells':
+    const: 1
+
+required:
+  - compatible
+  - reg
+  - '#clock-cells'
+  - '#reset-cells'
+
+additionalProperties: false
+
+examples:
+  # Peripheral Clock Control Module node:
+  - |
+    clock-controller@292d0000 {
+        compatible = "fsl,imx8ulp-pcc3";
+        reg = <0x292d0000 0x10000>;
+        #clock-cells = <1>;
+        #reset-cells = <1>;
+    };
index 6667261..3149767 100644 (file)
@@ -56,6 +56,16 @@ properties:
   reg:
     maxItems: 1
 
+  power-domains:
+    description:
+      A phandle and PM domain specifier for the MMCX power domain.
+    maxItems: 1
+
+  required-opps:
+    description:
+      A phandle to an OPP node describing required MMCX performance point.
+    maxItems: 1
+
 required:
   - compatible
   - reg
@@ -70,6 +80,7 @@ additionalProperties: false
 examples:
   - |
     #include <dt-bindings/clock/qcom,rpmh.h>
+    #include <dt-bindings/power/qcom-rpmpd.h>
     clock-controller@af00000 {
       compatible = "qcom,sm8250-dispcc";
       reg = <0x0af00000 0x10000>;
@@ -90,5 +101,7 @@ examples:
       #clock-cells = <1>;
       #reset-cells = <1>;
       #power-domain-cells = <1>;
+      power-domains = <&rpmhpd SM8250_MMCX>;
+      required-opps = <&rpmhpd_opp_low_svs>;
     };
 ...
diff --git a/Documentation/devicetree/bindings/clock/qcom,gcc-msm8994.yaml b/Documentation/devicetree/bindings/clock/qcom,gcc-msm8994.yaml
new file mode 100644 (file)
index 0000000..22e67b2
--- /dev/null
@@ -0,0 +1,70 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/qcom,gcc-msm8994.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm Global Clock & Reset Controller Binding for MSM8994
+
+maintainers:
+  - Konrad Dybcio <konrad.dybcio@somainline.org>
+
+description: |
+  Qualcomm global clock control module which supports the clocks, resets and
+  power domains on MSM8994 and MSM8992.
+
+  See also:
+  - dt-bindings/clock/qcom,gcc-msm8994.h
+
+properties:
+  compatible:
+    enum:
+      - qcom,gcc-msm8992
+      - qcom,gcc-msm8994
+
+  clocks:
+    items:
+      - description: Board XO source
+      - description: Sleep clock source
+
+  clock-names:
+    items:
+      - const: xo
+      - const: sleep
+
+  '#clock-cells':
+    const: 1
+
+  '#reset-cells':
+    const: 1
+
+  '#power-domain-cells':
+    const: 1
+
+  reg:
+    maxItems: 1
+
+required:
+  - compatible
+  - clocks
+  - clock-names
+  - reg
+  - '#clock-cells'
+  - '#reset-cells'
+  - '#power-domain-cells'
+
+additionalProperties: false
+
+examples:
+  - |
+    clock-controller@300000 {
+      compatible = "qcom,gcc-msm8994";
+      reg = <0x00300000 0x90000>;
+      clocks = <&xo_board>, <&sleep_clk>;
+      clock-names = "xo", "sleep";
+      #clock-cells = <1>;
+      #reset-cells = <1>;
+      #power-domain-cells = <1>;
+    };
+
+...
index a0bb713..8151c0a 100644 (file)
@@ -25,21 +25,17 @@ properties:
     items:
       - description: Board XO source
       - description: Sleep clock source
-      - description: USB 3.0 phy pipe clock
-      - description: UFS phy rx symbol clock for pipe 0
-      - description: UFS phy rx symbol clock for pipe 1
-      - description: UFS phy tx symbol clock
-      - description: PCIE phy pipe clock
+      - description: Audio reference clock (Optional clock)
+      - description: PLL test clock source (Optional clock)
+    minItems: 2
 
   clock-names:
     items:
       - const: xo
       - const: sleep_clk
-      - const: usb3_pipe
-      - const: ufs_rx_symbol0
-      - const: ufs_rx_symbol1
-      - const: ufs_tx_symbol0
-      - const: pcie0_pipe
+      - const: aud_ref_clk # Optional clock
+      - const: core_bi_pll_test_se # Optional clock
+    minItems: 2
 
   '#clock-cells':
     const: 1
@@ -80,16 +76,10 @@ examples:
       clocks = <&rpmcc RPM_SMD_XO_CLK_SRC>,
                <&sleep>,
                <0>,
-               <0>,
-               <0>,
-               <0>,
                <0>;
       clock-names = "xo",
                     "sleep_clk",
-                    "usb3_pipe",
-                    "ufs_rx_symbol0",
-                    "ufs_rx_symbol1",
-                    "ufs_tx_symbol0",
-                    "pcie0_pipe";
+                    "aud_ref_clk",
+                    "core_bi_pll_test_se";
     };
 ...
diff --git a/Documentation/devicetree/bindings/clock/qcom,gcc-qcm2290.yaml b/Documentation/devicetree/bindings/clock/qcom,gcc-qcm2290.yaml
new file mode 100644 (file)
index 0000000..5de9c82
--- /dev/null
@@ -0,0 +1,72 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/qcom,gcc-qcm2290.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm Global Clock & Reset Controller Binding for QCM2290
+
+maintainers:
+  - Shawn Guo <shawn.guo@linaro.org>
+
+description: |
+  Qualcomm global clock control module which supports the clocks, resets
+  and power domains on QCM2290.
+
+  See also:
+  - dt-bindings/clock/qcom,gcc-qcm2290.h
+
+properties:
+  compatible:
+    const: qcom,gcc-qcm2290
+
+  clocks:
+    items:
+      - description: Board XO source
+      - description: Sleep clock source
+
+  clock-names:
+    items:
+      - const: bi_tcxo
+      - const: sleep_clk
+
+  '#clock-cells':
+    const: 1
+
+  '#reset-cells':
+    const: 1
+
+  '#power-domain-cells':
+    const: 1
+
+  reg:
+    maxItems: 1
+
+  protected-clocks:
+    description:
+      Protected clock specifier list as per common clock binding.
+
+required:
+  - compatible
+  - clocks
+  - clock-names
+  - reg
+  - '#clock-cells'
+  - '#reset-cells'
+  - '#power-domain-cells'
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/qcom,rpmcc.h>
+    clock-controller@1400000 {
+        compatible = "qcom,gcc-qcm2290";
+        reg = <0x01400000 0x1f0000>;
+        #clock-cells = <1>;
+        #reset-cells = <1>;
+        #power-domain-cells = <1>;
+        clock-names = "bi_tcxo", "sleep_clk";
+        clocks = <&rpmcc RPM_SMD_XO_CLK_SRC>, <&sleep_clk>;
+    };
+...
index 2f20f8a..f66d703 100644 (file)
@@ -29,7 +29,6 @@ description: |
   - dt-bindings/reset/qcom,gcc-msm8660.h
   - dt-bindings/clock/qcom,gcc-msm8974.h (qcom,gcc-msm8226 and qcom,gcc-msm8974)
   - dt-bindings/reset/qcom,gcc-msm8974.h (qcom,gcc-msm8226 and qcom,gcc-msm8974)
-  - dt-bindings/clock/qcom,gcc-msm8994.h
   - dt-bindings/clock/qcom,gcc-mdm9607.h
   - dt-bindings/clock/qcom,gcc-mdm9615.h
   - dt-bindings/reset/qcom,gcc-mdm9615.h
@@ -52,7 +51,6 @@ properties:
       - qcom,gcc-msm8974
       - qcom,gcc-msm8974pro
       - qcom,gcc-msm8974pro-ac
-      - qcom,gcc-msm8994
       - qcom,gcc-mdm9615
       - qcom,gcc-sdm630
       - qcom,gcc-sdm660
index a487788..da295c3 100644 (file)
@@ -25,6 +25,7 @@ Required properties :
                        "qcom,rpmcc-msm8994",·"qcom,rpmcc"
                        "qcom,rpmcc-msm8996", "qcom,rpmcc"
                        "qcom,rpmcc-msm8998", "qcom,rpmcc"
+                       "qcom,rpmcc-qcm2290", "qcom,rpmcc"
                        "qcom,rpmcc-qcs404", "qcom,rpmcc"
                        "qcom,rpmcc-sdm660", "qcom,rpmcc"
                        "qcom,rpmcc-sm6115", "qcom,rpmcc"
diff --git a/Documentation/devicetree/bindings/clock/qcom,sc7280-camcc.yaml b/Documentation/devicetree/bindings/clock/qcom,sc7280-camcc.yaml
new file mode 100644 (file)
index 0000000..f27ca6f
--- /dev/null
@@ -0,0 +1,71 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/qcom,sc7280-camcc.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm Camera Clock & Reset Controller Binding for SC7280
+
+maintainers:
+  - Taniya Das <tdas@codeaurora.org>
+
+description: |
+  Qualcomm camera clock control module which supports the clocks, resets and
+  power domains on SC7280.
+
+  See also dt-bindings/clock/qcom,camcc-sc7280.h
+
+properties:
+  compatible:
+    const: qcom,sc7280-camcc
+
+  clocks:
+    items:
+      - description: Board XO source
+      - description: Board XO active source
+      - description: Sleep clock source
+
+  clock-names:
+    items:
+      - const: bi_tcxo
+      - const: bi_tcxo_ao
+      - const: sleep_clk
+
+  '#clock-cells':
+    const: 1
+
+  '#reset-cells':
+    const: 1
+
+  '#power-domain-cells':
+    const: 1
+
+  reg:
+    maxItems: 1
+
+required:
+  - compatible
+  - reg
+  - clocks
+  - clock-names
+  - '#clock-cells'
+  - '#reset-cells'
+  - '#power-domain-cells'
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/qcom,rpmh.h>
+    clock-controller@ad00000 {
+      compatible = "qcom,sc7280-camcc";
+      reg = <0x0ad00000 0x10000>;
+      clocks = <&rpmhcc RPMH_CXO_CLK>,
+               <&rpmhcc RPMH_CXO_CLK_A>,
+               <&sleep_clk>;
+      clock-names = "bi_tcxo", "bi_tcxo_ao", "sleep_clk";
+      #clock-cells = <1>;
+      #reset-cells = <1>;
+      #power-domain-cells = <1>;
+    };
+...
diff --git a/Documentation/devicetree/bindings/clock/qcom,sc7280-lpasscc.yaml b/Documentation/devicetree/bindings/clock/qcom,sc7280-lpasscc.yaml
new file mode 100644 (file)
index 0000000..47028d7
--- /dev/null
@@ -0,0 +1,68 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/qcom,sc7280-lpasscc.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm LPASS Core Clock Controller Binding for SC7280
+
+maintainers:
+  - Taniya Das <tdas@codeaurora.org>
+
+description: |
+  Qualcomm LPASS core clock control module which supports the clocks and
+  power domains on SC7280.
+
+  See also:
+  - dt-bindings/clock/qcom,lpass-sc7280.h
+
+properties:
+  compatible:
+    enum:
+      - qcom,sc7280-lpasscc
+
+  clocks:
+    items:
+      - description: gcc_cfg_noc_lpass_clk from GCC
+
+  clock-names:
+    items:
+      - const: iface
+
+  '#clock-cells':
+    const: 1
+
+  reg:
+    items:
+      - description: LPASS qdsp6ss register
+      - description: LPASS top-cc register
+      - description: LPASS cc register
+
+  reg-names:
+    items:
+      - const: qdsp6ss
+      - const: top_cc
+      - const: cc
+
+required:
+  - compatible
+  - reg
+  - clocks
+  - clock-names
+  - '#clock-cells'
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/qcom,gcc-sc7280.h>
+    #include <dt-bindings/clock/qcom,lpass-sc7280.h>
+    clock-controller@3000000 {
+      compatible = "qcom,sc7280-lpasscc";
+      reg = <0x03000000 0x40>, <0x03c04000 0x4>, <0x03389000 0x24>;
+      reg-names = "qdsp6ss", "top_cc", "cc";
+      clocks = <&gcc GCC_CFG_NOC_LPASS_CLK>;
+      clock-names = "iface";
+      #clock-cells = <1>;
+    };
+...
index 0d224f1..3cdbceb 100644 (file)
@@ -49,6 +49,16 @@ properties:
   reg:
     maxItems: 1
 
+  power-domains:
+    description:
+      A phandle and PM domain specifier for the MMCX power domain.
+    maxItems: 1
+
+  required-opps:
+    description:
+      A phandle to an OPP node describing required MMCX performance point.
+    maxItems: 1
+
 required:
   - compatible
   - reg
@@ -63,6 +73,7 @@ additionalProperties: false
 examples:
   - |
     #include <dt-bindings/clock/qcom,rpmh.h>
+    #include <dt-bindings/power/qcom-rpmpd.h>
     clock-controller@ab00000 {
       compatible = "qcom,sdm845-videocc";
       reg = <0x0ab00000 0x10000>;
@@ -71,5 +82,7 @@ examples:
       #clock-cells = <1>;
       #reset-cells = <1>;
       #power-domain-cells = <1>;
+      power-domains = <&rpmhpd SM8250_MMCX>;
+      required-opps = <&rpmhpd_opp_low_svs>;
     };
 ...
diff --git a/Documentation/devicetree/bindings/clock/samsung,exynos850-clock.yaml b/Documentation/devicetree/bindings/clock/samsung,exynos850-clock.yaml
new file mode 100644 (file)
index 0000000..7f8c91a
--- /dev/null
@@ -0,0 +1,185 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/samsung,exynos850-clock.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Samsung Exynos850 SoC clock controller
+
+maintainers:
+  - Sam Protsenko <semen.protsenko@linaro.org>
+  - Chanwoo Choi <cw00.choi@samsung.com>
+  - Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
+  - Sylwester Nawrocki <s.nawrocki@samsung.com>
+  - Tomasz Figa <tomasz.figa@gmail.com>
+
+description: |
+  Exynos850 clock controller is comprised of several CMU units, generating
+  clocks for different domains. Those CMU units are modeled as separate device
+  tree nodes, and might depend on each other. Root clocks in that clock tree are
+  two external clocks:: OSCCLK (26 MHz) and RTCCLK (32768 Hz). Those external
+  clocks must be defined as fixed-rate clocks in dts.
+
+  CMU_TOP is a top-level CMU, where all base clocks are prepared using PLLs and
+  dividers; all other leaf clocks (other CMUs) are usually derived from CMU_TOP.
+
+  Each clock is assigned an identifier and client nodes can use this identifier
+  to specify the clock which they consume. All clocks available for usage
+  in clock consumer nodes are defined as preprocessor macros in
+  'dt-bindings/clock/exynos850.h' header.
+
+properties:
+  compatible:
+    enum:
+      - samsung,exynos850-cmu-top
+      - samsung,exynos850-cmu-core
+      - samsung,exynos850-cmu-dpu
+      - samsung,exynos850-cmu-hsi
+      - samsung,exynos850-cmu-peri
+
+  clocks:
+    minItems: 1
+    maxItems: 5
+
+  clock-names:
+    minItems: 1
+    maxItems: 5
+
+  "#clock-cells":
+    const: 1
+
+  reg:
+    maxItems: 1
+
+allOf:
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: samsung,exynos850-cmu-top
+
+    then:
+      properties:
+        clocks:
+          items:
+            - description: External reference clock (26 MHz)
+
+        clock-names:
+          items:
+            - const: oscclk
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: samsung,exynos850-cmu-core
+
+    then:
+      properties:
+        clocks:
+          items:
+            - description: External reference clock (26 MHz)
+            - description: CMU_CORE bus clock (from CMU_TOP)
+            - description: CCI clock (from CMU_TOP)
+            - description: eMMC clock (from CMU_TOP)
+            - description: SSS clock (from CMU_TOP)
+
+        clock-names:
+          items:
+            - const: oscclk
+            - const: dout_core_bus
+            - const: dout_core_cci
+            - const: dout_core_mmc_embd
+            - const: dout_core_sss
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: samsung,exynos850-cmu-dpu
+
+    then:
+      properties:
+        clocks:
+          items:
+            - description: External reference clock (26 MHz)
+            - description: DPU clock (from CMU_TOP)
+
+        clock-names:
+          items:
+            - const: oscclk
+            - const: dout_dpu
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: samsung,exynos850-cmu-hsi
+
+    then:
+      properties:
+        clocks:
+          items:
+            - description: External reference clock (26 MHz)
+            - description: External RTC clock (32768 Hz)
+            - description: CMU_HSI bus clock (from CMU_TOP)
+            - description: SD card clock (from CMU_TOP)
+            - description: "USB 2.0 DRD clock (from CMU_TOP)"
+
+        clock-names:
+          items:
+            - const: oscclk
+            - const: rtcclk
+            - const: dout_hsi_bus
+            - const: dout_hsi_mmc_card
+            - const: dout_hsi_usb20drd
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: samsung,exynos850-cmu-peri
+
+    then:
+      properties:
+        clocks:
+          items:
+            - description: External reference clock (26 MHz)
+            - description: CMU_PERI bus clock (from CMU_TOP)
+            - description: UART clock (from CMU_TOP)
+            - description: Parent clock for HSI2C and SPI (from CMU_TOP)
+
+        clock-names:
+          items:
+            - const: oscclk
+            - const: dout_peri_bus
+            - const: dout_peri_uart
+            - const: dout_peri_ip
+
+required:
+  - compatible
+  - "#clock-cells"
+  - clocks
+  - clock-names
+  - reg
+
+additionalProperties: false
+
+examples:
+  # Clock controller node for CMU_PERI
+  - |
+    #include <dt-bindings/clock/exynos850.h>
+
+    cmu_peri: clock-controller@10030000 {
+        compatible = "samsung,exynos850-cmu-peri";
+        reg = <0x10030000 0x8000>;
+        #clock-cells = <1>;
+
+        clocks = <&oscclk>, <&cmu_top CLK_DOUT_PERI_BUS>,
+                 <&cmu_top CLK_DOUT_PERI_UART>,
+                 <&cmu_top CLK_DOUT_PERI_IP>;
+        clock-names = "oscclk", "dout_peri_bus",
+                      "dout_peri_uart", "dout_peri_ip";
+    };
+
+...
diff --git a/Documentation/devicetree/bindings/clock/stericsson,u8500-clks.yaml b/Documentation/devicetree/bindings/clock/stericsson,u8500-clks.yaml
new file mode 100644 (file)
index 0000000..9bc95a3
--- /dev/null
@@ -0,0 +1,121 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/stericsson,u8500-clks.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: ST-Ericsson DB8500 (U8500) clocks
+
+maintainers:
+  - Ulf Hansson <ulf.hansson@linaro.org>
+  - Linus Walleij <linus.walleij@linaro.org>
+
+description: While named "U8500 clocks" these clocks are inside the
+  DB8500 digital baseband system-on-chip and its siblings such as
+  DB8520. These bindings consider the clocks present in the SoC
+  itself, not off-chip clocks. There are four different on-chip
+  clocks - RTC (32 kHz), CPU clock (SMP TWD), PRCMU (power reset and
+  control management unit) clocks and PRCC (peripheral reset and
+  clock controller) clocks. For some reason PRCC 4 does not exist so
+  the itemization can be a bit unintuitive.
+
+properties:
+  compatible:
+    enum:
+      - stericsson,u8500-clks
+      - stericsson,u8540-clks
+      - stericsson,u9540-clks
+
+  reg:
+    items:
+      - description: PRCC 1 register area
+      - description: PRCC 2 register area
+      - description: PRCC 3 register area
+      - description: PRCC 5 register area
+      - description: PRCC 6 register area
+
+  prcmu-clock:
+    description: A subnode with one clock cell for PRCMU (power, reset, control
+      management unit) clocks. The cell indicates which PRCMU clock in the
+      prcmu-clock node the consumer wants to use.
+    type: object
+
+    properties:
+      '#clock-cells':
+        const: 1
+
+    additionalProperties: false
+
+  prcc-periph-clock:
+    description: A subnode with two clock cells for PRCC (peripheral
+      reset and clock controller) peripheral clocks. The first cell indicates
+      which PRCC block the consumer wants to use, possible values are 1, 2, 3,
+      5, 6. The second cell indicates which clock inside the PRCC block it
+      wants, possible values are 0 thru 31.
+    type: object
+
+    properties:
+      '#clock-cells':
+        const: 2
+
+    additionalProperties: false
+
+  prcc-kernel-clock:
+    description: A subnode with two clock cells for PRCC (peripheral reset
+      and clock controller) kernel clocks. The first cell indicates which PRCC
+      block the consumer wants to use, possible values are 1, 2, 3, 5, 6. The
+      second cell indicates which clock inside the PRCC block it wants, possible
+      values are 0 thru 31.
+    type: object
+
+    properties:
+      '#clock-cells':
+        const: 2
+
+    additionalProperties: false
+
+  prcc-reset-controller:
+    description: A subnode with two reset cells for the reset portions of the
+      PRCC (peripheral reset and clock controller). The first cell indicates
+      which PRCC block the consumer wants to use, possible values are 1, 2, 3
+      5 and 6. The second cell indicates which reset line inside the PRCC block
+      it wants to control, possible values are 0 thru 31.
+    type: object
+
+    properties:
+      '#reset-cells':
+        const: 2
+
+    additionalProperties: false
+
+  rtc32k-clock:
+    description: A subnode with zero clock cells for the 32kHz RTC clock.
+    type: object
+
+    properties:
+      '#clock-cells':
+        const: 0
+
+    additionalProperties: false
+
+  smp-twd-clock:
+    description: A subnode for the ARM SMP Timer Watchdog cluster with zero
+      clock cells.
+    type: object
+
+    properties:
+      '#clock-cells':
+        const: 0
+
+    additionalProperties: false
+
+required:
+  - compatible
+  - reg
+  - prcmu-clock
+  - prcc-periph-clock
+  - prcc-kernel-clock
+  - rtc32k-clock
+  - smp-twd-clock
+
+additionalProperties: false
diff --git a/Documentation/devicetree/bindings/clock/ux500.txt b/Documentation/devicetree/bindings/clock/ux500.txt
deleted file mode 100644 (file)
index e52bd4b..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-Clock bindings for ST-Ericsson Ux500 clocks
-
-Required properties :
-- compatible : shall contain only one of the following:
-  "stericsson,u8500-clks"
-  "stericsson,u8540-clks"
-  "stericsson,u9540-clks"
-- reg : shall contain base register location and length for
-  CLKRST1, 2, 3, 5, and 6 in an array. Note the absence of
-  CLKRST4, which does not exist.
-
-Required subnodes:
-- prcmu-clock: a subnode with one clock cell for PRCMU (power,
-  reset, control unit) clocks. The cell indicates which PRCMU
-  clock in the prcmu-clock node the consumer wants to use.
-- prcc-periph-clock: a subnode with two clock cells for
-  PRCC (programmable reset- and clock controller) peripheral clocks.
-  The first cell indicates which PRCC block the consumer
-  wants to use, possible values are 1, 2, 3, 5, 6. The second
-  cell indicates which clock inside the PRCC block it wants,
-  possible values are 0 thru 31.
-- prcc-kernel-clock: a subnode with two clock cells for
-  PRCC (programmable reset- and clock controller) kernel clocks
-  The first cell indicates which PRCC block the consumer
-  wants to use, possible values are 1, 2, 3, 5, 6. The second
-  cell indicates which clock inside the PRCC block it wants,
-  possible values are 0 thru 31.
-- rtc32k-clock: a subnode with zero clock cells for the 32kHz
-  RTC clock.
-- smp-twd-clock: a subnode for the ARM SMP Timer Watchdog cluster
-  with zero clock cells.
-
-Example:
-
-clocks {
-       compatible = "stericsson,u8500-clks";
-       /*
-        * Registers for the CLKRST block on peripheral
-        * groups 1, 2, 3, 5, 6,
-        */
-       reg = <0x8012f000 0x1000>, <0x8011f000 0x1000>,
-           <0x8000f000 0x1000>, <0xa03ff000 0x1000>,
-           <0xa03cf000 0x1000>;
-
-       prcmu_clk: prcmu-clock {
-               #clock-cells = <1>;
-       };
-
-       prcc_pclk: prcc-periph-clock {
-               #clock-cells = <2>;
-       };
-
-       prcc_kclk: prcc-kernel-clock {
-               #clock-cells = <2>;
-       };
-
-       rtc_clk: rtc32k-clock {
-               #clock-cells = <0>;
-       };
-
-       smp_twd_clk: smp-twd-clock {
-               #clock-cells = <0>;
-       };
-};
index 7a9808b..63a0ca8 100644 (file)
@@ -6,7 +6,7 @@ menuconfig ARCH_INTEGRATOR
        select CMA
        select DMA_CMA
        select HAVE_TCM
-       select ICST
+       select CLK_ICST
        select MFD_SYSCON
        select PLAT_VERSATILE
        select POWER_RESET
index 5c6031b..a4c3602 100644 (file)
@@ -11,7 +11,7 @@ menuconfig ARCH_REALVIEW
        select HAVE_ARM_TWD if SMP
        select HAVE_PATA_PLATFORM
        select HAVE_TCM
-       select ICST
+       select CLK_ICST
        select MACH_REALVIEW_EB if ARCH_MULTI_V5
        select MFD_SYSCON
        select PLAT_VERSATILE
index c1086eb..24ed7f4 100644 (file)
@@ -29,6 +29,7 @@ menuconfig ARCH_U8500
        select REGULATOR_DB8500_PRCMU
        select REGULATOR_FIXED_VOLTAGE
        select SOC_BUS
+       select RESET_CONTROLLER
        help
          Support for ST-Ericsson's Ux500 architecture
 
index d88e772..f78a1d3 100644 (file)
@@ -7,7 +7,7 @@ config ARCH_VERSATILE
        select ARM_VIC
        select CLKSRC_VERSATILE
        select CPU_ARM926T
-       select ICST
+       select CLK_ICST
        select MFD_SYSCON
        select PLAT_VERSATILE
        select POWER_RESET
index 065e129..2e6aff5 100644 (file)
@@ -11,7 +11,7 @@ menuconfig ARCH_VEXPRESS
        select HAVE_ARM_SCU if SMP
        select HAVE_ARM_TWD if SMP
        select HAVE_PATA_PLATFORM
-       select ICST
+       select CLK_ICST
        select NO_IOPORT_MAP
        select PLAT_VERSATILE
        select POWER_RESET
index 428a6f4..fff4fdd 100644 (file)
@@ -152,7 +152,7 @@ static void __init at91rm9200_pmc_setup(struct device_node *np)
                                          "masterck_pres",
                                          &at91rm9200_master_layout,
                                          &rm9200_mck_characteristics,
-                                         &rm9200_mck_lock, CLK_SET_RATE_GATE);
+                                         &rm9200_mck_lock, CLK_SET_RATE_GATE, 0);
        if (IS_ERR(hw))
                goto err_free;
 
index b29843b..79802f8 100644 (file)
@@ -429,7 +429,7 @@ static void __init at91sam926x_pmc_setup(struct device_node *np,
                                          &at91rm9200_master_layout,
                                          data->mck_characteristics,
                                          &at91sam9260_mck_lock,
-                                         CLK_SET_RATE_GATE);
+                                         CLK_SET_RATE_GATE, 0);
        if (IS_ERR(hw))
                goto err_free;
 
index 15da0df..7ed984f 100644 (file)
@@ -164,7 +164,7 @@ static void __init at91sam9g45_pmc_setup(struct device_node *np)
                                          &at91rm9200_master_layout,
                                          &mck_characteristics,
                                          &at91sam9g45_mck_lock,
-                                         CLK_SET_RATE_GATE);
+                                         CLK_SET_RATE_GATE, 0);
        if (IS_ERR(hw))
                goto err_free;
 
index 7fe435f..63cc589 100644 (file)
@@ -191,7 +191,7 @@ static void __init at91sam9n12_pmc_setup(struct device_node *np)
                                          &at91sam9x5_master_layout,
                                          &mck_characteristics,
                                          &at91sam9n12_mck_lock,
-                                         CLK_SET_RATE_GATE);
+                                         CLK_SET_RATE_GATE, 0);
        if (IS_ERR(hw))
                goto err_free;
 
index ecbabf5..4d4faf6 100644 (file)
@@ -132,7 +132,7 @@ static void __init at91sam9rl_pmc_setup(struct device_node *np)
                                          "masterck_pres",
                                          &at91rm9200_master_layout,
                                          &sam9rl_mck_characteristics,
-                                         &sam9rl_mck_lock, CLK_SET_RATE_GATE);
+                                         &sam9rl_mck_lock, CLK_SET_RATE_GATE, 0);
        if (IS_ERR(hw))
                goto err_free;
 
index 5cce48c..bd8007b 100644 (file)
@@ -210,7 +210,7 @@ static void __init at91sam9x5_pmc_setup(struct device_node *np,
                                          "masterck_pres",
                                          &at91sam9x5_master_layout,
                                          &mck_characteristics, &mck_lock,
-                                         CLK_SET_RATE_GATE);
+                                         CLK_SET_RATE_GATE, 0);
        if (IS_ERR(hw))
                goto err_free;
 
index b656d25..23cc829 100644 (file)
@@ -27,6 +27,7 @@ struct clk_generated {
        u32 id;
        u32 gckdiv;
        const struct clk_pcr_layout *layout;
+       struct at91_clk_pms pms;
        u8 parent_id;
        int chg_pid;
 };
@@ -34,25 +35,35 @@ struct clk_generated {
 #define to_clk_generated(hw) \
        container_of(hw, struct clk_generated, hw)
 
-static int clk_generated_enable(struct clk_hw *hw)
+static int clk_generated_set(struct clk_generated *gck, int status)
 {
-       struct clk_generated *gck = to_clk_generated(hw);
        unsigned long flags;
-
-       pr_debug("GCLK: %s, gckdiv = %d, parent id = %d\n",
-                __func__, gck->gckdiv, gck->parent_id);
+       unsigned int enable = status ? AT91_PMC_PCR_GCKEN : 0;
 
        spin_lock_irqsave(gck->lock, flags);
        regmap_write(gck->regmap, gck->layout->offset,
                     (gck->id & gck->layout->pid_mask));
        regmap_update_bits(gck->regmap, gck->layout->offset,
                           AT91_PMC_PCR_GCKDIV_MASK | gck->layout->gckcss_mask |
-                          gck->layout->cmd | AT91_PMC_PCR_GCKEN,
+                          gck->layout->cmd | enable,
                           field_prep(gck->layout->gckcss_mask, gck->parent_id) |
                           gck->layout->cmd |
                           FIELD_PREP(AT91_PMC_PCR_GCKDIV_MASK, gck->gckdiv) |
-                          AT91_PMC_PCR_GCKEN);
+                          enable);
        spin_unlock_irqrestore(gck->lock, flags);
+
+       return 0;
+}
+
+static int clk_generated_enable(struct clk_hw *hw)
+{
+       struct clk_generated *gck = to_clk_generated(hw);
+
+       pr_debug("GCLK: %s, gckdiv = %d, parent id = %d\n",
+                __func__, gck->gckdiv, gck->parent_id);
+
+       clk_generated_set(gck, 1);
+
        return 0;
 }
 
@@ -245,6 +256,23 @@ static int clk_generated_set_rate(struct clk_hw *hw,
        return 0;
 }
 
+static int clk_generated_save_context(struct clk_hw *hw)
+{
+       struct clk_generated *gck = to_clk_generated(hw);
+
+       gck->pms.status = clk_generated_is_enabled(&gck->hw);
+
+       return 0;
+}
+
+static void clk_generated_restore_context(struct clk_hw *hw)
+{
+       struct clk_generated *gck = to_clk_generated(hw);
+
+       if (gck->pms.status)
+               clk_generated_set(gck, gck->pms.status);
+}
+
 static const struct clk_ops generated_ops = {
        .enable = clk_generated_enable,
        .disable = clk_generated_disable,
@@ -254,6 +282,8 @@ static const struct clk_ops generated_ops = {
        .get_parent = clk_generated_get_parent,
        .set_parent = clk_generated_set_parent,
        .set_rate = clk_generated_set_rate,
+       .save_context = clk_generated_save_context,
+       .restore_context = clk_generated_restore_context,
 };
 
 /**
@@ -320,8 +350,6 @@ at91_clk_register_generated(struct regmap *regmap, spinlock_t *lock,
        if (ret) {
                kfree(gck);
                hw = ERR_PTR(ret);
-       } else {
-               pmc_register_id(id);
        }
 
        return hw;
index cfae2f5..8601b27 100644 (file)
@@ -28,6 +28,7 @@
 struct clk_main_osc {
        struct clk_hw hw;
        struct regmap *regmap;
+       struct at91_clk_pms pms;
 };
 
 #define to_clk_main_osc(hw) container_of(hw, struct clk_main_osc, hw)
@@ -37,6 +38,7 @@ struct clk_main_rc_osc {
        struct regmap *regmap;
        unsigned long frequency;
        unsigned long accuracy;
+       struct at91_clk_pms pms;
 };
 
 #define to_clk_main_rc_osc(hw) container_of(hw, struct clk_main_rc_osc, hw)
@@ -51,6 +53,7 @@ struct clk_rm9200_main {
 struct clk_sam9x5_main {
        struct clk_hw hw;
        struct regmap *regmap;
+       struct at91_clk_pms pms;
        u8 parent;
 };
 
@@ -120,10 +123,29 @@ static int clk_main_osc_is_prepared(struct clk_hw *hw)
        return (status & AT91_PMC_MOSCS) && clk_main_parent_select(tmp);
 }
 
+static int clk_main_osc_save_context(struct clk_hw *hw)
+{
+       struct clk_main_osc *osc = to_clk_main_osc(hw);
+
+       osc->pms.status = clk_main_osc_is_prepared(hw);
+
+       return 0;
+}
+
+static void clk_main_osc_restore_context(struct clk_hw *hw)
+{
+       struct clk_main_osc *osc = to_clk_main_osc(hw);
+
+       if (osc->pms.status)
+               clk_main_osc_prepare(hw);
+}
+
 static const struct clk_ops main_osc_ops = {
        .prepare = clk_main_osc_prepare,
        .unprepare = clk_main_osc_unprepare,
        .is_prepared = clk_main_osc_is_prepared,
+       .save_context = clk_main_osc_save_context,
+       .restore_context = clk_main_osc_restore_context,
 };
 
 struct clk_hw * __init
@@ -240,12 +262,31 @@ static unsigned long clk_main_rc_osc_recalc_accuracy(struct clk_hw *hw,
        return osc->accuracy;
 }
 
+static int clk_main_rc_osc_save_context(struct clk_hw *hw)
+{
+       struct clk_main_rc_osc *osc = to_clk_main_rc_osc(hw);
+
+       osc->pms.status = clk_main_rc_osc_is_prepared(hw);
+
+       return 0;
+}
+
+static void clk_main_rc_osc_restore_context(struct clk_hw *hw)
+{
+       struct clk_main_rc_osc *osc = to_clk_main_rc_osc(hw);
+
+       if (osc->pms.status)
+               clk_main_rc_osc_prepare(hw);
+}
+
 static const struct clk_ops main_rc_osc_ops = {
        .prepare = clk_main_rc_osc_prepare,
        .unprepare = clk_main_rc_osc_unprepare,
        .is_prepared = clk_main_rc_osc_is_prepared,
        .recalc_rate = clk_main_rc_osc_recalc_rate,
        .recalc_accuracy = clk_main_rc_osc_recalc_accuracy,
+       .save_context = clk_main_rc_osc_save_context,
+       .restore_context = clk_main_rc_osc_restore_context,
 };
 
 struct clk_hw * __init
@@ -465,12 +506,37 @@ static u8 clk_sam9x5_main_get_parent(struct clk_hw *hw)
        return clk_main_parent_select(status);
 }
 
+static int clk_sam9x5_main_save_context(struct clk_hw *hw)
+{
+       struct clk_sam9x5_main *clkmain = to_clk_sam9x5_main(hw);
+
+       clkmain->pms.status = clk_main_rc_osc_is_prepared(&clkmain->hw);
+       clkmain->pms.parent = clk_sam9x5_main_get_parent(&clkmain->hw);
+
+       return 0;
+}
+
+static void clk_sam9x5_main_restore_context(struct clk_hw *hw)
+{
+       struct clk_sam9x5_main *clkmain = to_clk_sam9x5_main(hw);
+       int ret;
+
+       ret = clk_sam9x5_main_set_parent(hw, clkmain->pms.parent);
+       if (ret)
+               return;
+
+       if (clkmain->pms.status)
+               clk_sam9x5_main_prepare(hw);
+}
+
 static const struct clk_ops sam9x5_main_ops = {
        .prepare = clk_sam9x5_main_prepare,
        .is_prepared = clk_sam9x5_main_is_prepared,
        .recalc_rate = clk_sam9x5_main_recalc_rate,
        .set_parent = clk_sam9x5_main_set_parent,
        .get_parent = clk_sam9x5_main_get_parent,
+       .save_context = clk_sam9x5_main_save_context,
+       .restore_context = clk_sam9x5_main_restore_context,
 };
 
 struct clk_hw * __init
index a804279..b2d0a7f 100644 (file)
@@ -5,6 +5,7 @@
 
 #include <linux/clk-provider.h>
 #include <linux/clkdev.h>
+#include <linux/clk.h>
 #include <linux/clk/at91_pmc.h>
 #include <linux/of.h>
 #include <linux/mfd/syscon.h>
 #define MASTER_DIV_SHIFT       8
 #define MASTER_DIV_MASK                0x7
 
-#define PMC_MCR                        0x30
-#define PMC_MCR_ID_MSK         GENMASK(3, 0)
-#define PMC_MCR_CMD            BIT(7)
-#define PMC_MCR_DIV            GENMASK(10, 8)
-#define PMC_MCR_CSS            GENMASK(20, 16)
 #define PMC_MCR_CSS_SHIFT      (16)
-#define PMC_MCR_EN             BIT(28)
-
-#define PMC_MCR_ID(x)          ((x) & PMC_MCR_ID_MSK)
 
 #define MASTER_MAX_ID          4
 
@@ -37,14 +30,19 @@ struct clk_master {
        spinlock_t *lock;
        const struct clk_master_layout *layout;
        const struct clk_master_characteristics *characteristics;
+       struct at91_clk_pms pms;
        u32 *mux_table;
        u32 mckr;
        int chg_pid;
        u8 id;
        u8 parent;
        u8 div;
+       u32 safe_div;
 };
 
+/* MCK div reference to be used by notifier. */
+static struct clk_master *master_div;
+
 static inline bool clk_master_ready(struct clk_master *master)
 {
        unsigned int bit = master->id ? AT91_PMC_MCKXRDY : AT91_PMC_MCKRDY;
@@ -112,97 +110,244 @@ static unsigned long clk_master_div_recalc_rate(struct clk_hw *hw,
        return rate;
 }
 
+static int clk_master_div_save_context(struct clk_hw *hw)
+{
+       struct clk_master *master = to_clk_master(hw);
+       struct clk_hw *parent_hw = clk_hw_get_parent(hw);
+       unsigned long flags;
+       unsigned int mckr, div;
+
+       spin_lock_irqsave(master->lock, flags);
+       regmap_read(master->regmap, master->layout->offset, &mckr);
+       spin_unlock_irqrestore(master->lock, flags);
+
+       mckr &= master->layout->mask;
+       div = (mckr >> MASTER_DIV_SHIFT) & MASTER_DIV_MASK;
+       div = master->characteristics->divisors[div];
+
+       master->pms.parent_rate = clk_hw_get_rate(parent_hw);
+       master->pms.rate = DIV_ROUND_CLOSEST(master->pms.parent_rate, div);
+
+       return 0;
+}
+
+static void clk_master_div_restore_context(struct clk_hw *hw)
+{
+       struct clk_master *master = to_clk_master(hw);
+       unsigned long flags;
+       unsigned int mckr;
+       u8 div;
+
+       spin_lock_irqsave(master->lock, flags);
+       regmap_read(master->regmap, master->layout->offset, &mckr);
+       spin_unlock_irqrestore(master->lock, flags);
+
+       mckr &= master->layout->mask;
+       div = (mckr >> MASTER_DIV_SHIFT) & MASTER_DIV_MASK;
+       div = master->characteristics->divisors[div];
+
+       if (div != DIV_ROUND_CLOSEST(master->pms.parent_rate, master->pms.rate))
+               pr_warn("MCKR DIV not configured properly by firmware!\n");
+}
+
 static const struct clk_ops master_div_ops = {
        .prepare = clk_master_prepare,
        .is_prepared = clk_master_is_prepared,
        .recalc_rate = clk_master_div_recalc_rate,
+       .save_context = clk_master_div_save_context,
+       .restore_context = clk_master_div_restore_context,
 };
 
-static int clk_master_div_set_rate(struct clk_hw *hw, unsigned long rate,
-                                  unsigned long parent_rate)
+/* This function must be called with lock acquired. */
+static int clk_master_div_set(struct clk_master *master,
+                             unsigned long parent_rate, int div)
 {
-       struct clk_master *master = to_clk_master(hw);
        const struct clk_master_characteristics *characteristics =
                                                master->characteristics;
-       unsigned long flags;
-       int div, i;
-
-       div = DIV_ROUND_CLOSEST(parent_rate, rate);
-       if (div > ARRAY_SIZE(characteristics->divisors))
-               return -EINVAL;
+       unsigned long rate = parent_rate;
+       unsigned int max_div = 0, div_index = 0, max_div_index = 0;
+       unsigned int i, mckr, tmp;
+       int ret;
 
        for (i = 0; i < ARRAY_SIZE(characteristics->divisors); i++) {
                if (!characteristics->divisors[i])
                        break;
 
-               if (div == characteristics->divisors[i]) {
-                       div = i;
-                       break;
+               if (div == characteristics->divisors[i])
+                       div_index = i;
+
+               if (max_div < characteristics->divisors[i]) {
+                       max_div = characteristics->divisors[i];
+                       max_div_index = i;
                }
        }
 
-       if (i == ARRAY_SIZE(characteristics->divisors))
-               return -EINVAL;
+       if (div > max_div)
+               div_index = max_div_index;
+
+       ret = regmap_read(master->regmap, master->layout->offset, &mckr);
+       if (ret)
+               return ret;
+
+       mckr &= master->layout->mask;
+       tmp = (mckr >> MASTER_DIV_SHIFT) & MASTER_DIV_MASK;
+       if (tmp == div_index)
+               return 0;
+
+       rate /= characteristics->divisors[div_index];
+       if (rate < characteristics->output.min)
+               pr_warn("master clk div is underclocked");
+       else if (rate > characteristics->output.max)
+               pr_warn("master clk div is overclocked");
+
+       mckr &= ~(MASTER_DIV_MASK << MASTER_DIV_SHIFT);
+       mckr |= (div_index << MASTER_DIV_SHIFT);
+       ret = regmap_write(master->regmap, master->layout->offset, mckr);
+       if (ret)
+               return ret;
 
-       spin_lock_irqsave(master->lock, flags);
-       regmap_update_bits(master->regmap, master->layout->offset,
-                          (MASTER_DIV_MASK << MASTER_DIV_SHIFT),
-                          (div << MASTER_DIV_SHIFT));
        while (!clk_master_ready(master))
                cpu_relax();
-       spin_unlock_irqrestore(master->lock, flags);
+
+       master->div = characteristics->divisors[div_index];
 
        return 0;
 }
 
-static int clk_master_div_determine_rate(struct clk_hw *hw,
-                                        struct clk_rate_request *req)
+static unsigned long clk_master_div_recalc_rate_chg(struct clk_hw *hw,
+                                                   unsigned long parent_rate)
 {
        struct clk_master *master = to_clk_master(hw);
+
+       return DIV_ROUND_CLOSEST_ULL(parent_rate, master->div);
+}
+
+static void clk_master_div_restore_context_chg(struct clk_hw *hw)
+{
+       struct clk_master *master = to_clk_master(hw);
+       unsigned long flags;
+       int ret;
+
+       spin_lock_irqsave(master->lock, flags);
+       ret = clk_master_div_set(master, master->pms.parent_rate,
+                                DIV_ROUND_CLOSEST(master->pms.parent_rate,
+                                                  master->pms.rate));
+       spin_unlock_irqrestore(master->lock, flags);
+       if (ret)
+               pr_warn("Failed to restore MCK DIV clock\n");
+}
+
+static const struct clk_ops master_div_ops_chg = {
+       .prepare = clk_master_prepare,
+       .is_prepared = clk_master_is_prepared,
+       .recalc_rate = clk_master_div_recalc_rate_chg,
+       .save_context = clk_master_div_save_context,
+       .restore_context = clk_master_div_restore_context_chg,
+};
+
+static int clk_master_div_notifier_fn(struct notifier_block *notifier,
+                                     unsigned long code, void *data)
+{
        const struct clk_master_characteristics *characteristics =
-                                               master->characteristics;
-       struct clk_hw *parent;
-       unsigned long parent_rate, tmp_rate, best_rate = 0;
-       int i, best_diff = INT_MIN, tmp_diff;
+                                               master_div->characteristics;
+       struct clk_notifier_data *cnd = data;
+       unsigned long flags, new_parent_rate, new_rate;
+       unsigned int mckr, div, new_div = 0;
+       int ret, i;
+       long tmp_diff;
+       long best_diff = -1;
+
+       spin_lock_irqsave(master_div->lock, flags);
+       switch (code) {
+       case PRE_RATE_CHANGE:
+               /*
+                * We want to avoid any overclocking of MCK DIV domain. To do
+                * this we set a safe divider (the underclocking is not of
+                * interest as we can go as low as 32KHz). The relation
+                * b/w this clock and its parents are as follows:
+                *
+                * FRAC PLL -> DIV PLL -> MCK DIV
+                *
+                * With the proper safe divider we should be good even with FRAC
+                * PLL at its maximum value.
+                */
+               ret = regmap_read(master_div->regmap, master_div->layout->offset,
+                                 &mckr);
+               if (ret) {
+                       ret = NOTIFY_STOP_MASK;
+                       goto unlock;
+               }
 
-       parent = clk_hw_get_parent(hw);
-       if (!parent)
-               return -EINVAL;
+               mckr &= master_div->layout->mask;
+               div = (mckr >> MASTER_DIV_SHIFT) & MASTER_DIV_MASK;
+
+               /* Switch to safe divider. */
+               clk_master_div_set(master_div,
+                                  cnd->old_rate * characteristics->divisors[div],
+                                  master_div->safe_div);
+               break;
+
+       case POST_RATE_CHANGE:
+               /*
+                * At this point we want to restore MCK DIV domain to its maximum
+                * allowed rate.
+                */
+               ret = regmap_read(master_div->regmap, master_div->layout->offset,
+                                 &mckr);
+               if (ret) {
+                       ret = NOTIFY_STOP_MASK;
+                       goto unlock;
+               }
 
-       parent_rate = clk_hw_get_rate(parent);
-       if (!parent_rate)
-               return -EINVAL;
+               mckr &= master_div->layout->mask;
+               div = (mckr >> MASTER_DIV_SHIFT) & MASTER_DIV_MASK;
+               new_parent_rate = cnd->new_rate * characteristics->divisors[div];
 
-       for (i = 0; i < ARRAY_SIZE(characteristics->divisors); i++) {
-               if (!characteristics->divisors[i])
-                       break;
+               for (i = 0; i < ARRAY_SIZE(characteristics->divisors); i++) {
+                       if (!characteristics->divisors[i])
+                               break;
+
+                       new_rate = DIV_ROUND_CLOSEST_ULL(new_parent_rate,
+                                                        characteristics->divisors[i]);
 
-               tmp_rate = DIV_ROUND_CLOSEST_ULL(parent_rate,
-                                                characteristics->divisors[i]);
-               tmp_diff = abs(tmp_rate - req->rate);
+                       tmp_diff = characteristics->output.max - new_rate;
+                       if (tmp_diff < 0)
+                               continue;
 
-               if (!best_rate || best_diff > tmp_diff) {
-                       best_diff = tmp_diff;
-                       best_rate = tmp_rate;
+                       if (best_diff < 0 || best_diff > tmp_diff) {
+                               new_div = characteristics->divisors[i];
+                               best_diff = tmp_diff;
+                       }
+
+                       if (!tmp_diff)
+                               break;
                }
 
-               if (!best_diff)
-                       break;
+               if (!new_div) {
+                       ret = NOTIFY_STOP_MASK;
+                       goto unlock;
+               }
+
+               /* Update the div to preserve MCK DIV clock rate. */
+               clk_master_div_set(master_div, new_parent_rate,
+                                  new_div);
+
+               ret = NOTIFY_OK;
+               break;
+
+       default:
+               ret = NOTIFY_DONE;
+               break;
        }
 
-       req->best_parent_rate = best_rate;
-       req->best_parent_hw = parent;
-       req->rate = best_rate;
+unlock:
+       spin_unlock_irqrestore(master_div->lock, flags);
 
-       return 0;
+       return ret;
 }
 
-static const struct clk_ops master_div_ops_chg = {
-       .prepare = clk_master_prepare,
-       .is_prepared = clk_master_is_prepared,
-       .recalc_rate = clk_master_div_recalc_rate,
-       .determine_rate = clk_master_div_determine_rate,
-       .set_rate = clk_master_div_set_rate,
+static struct notifier_block clk_master_div_notifier = {
+       .notifier_call = clk_master_div_notifier_fn,
 };
 
 static void clk_sama7g5_master_best_diff(struct clk_rate_request *req,
@@ -272,7 +417,8 @@ static int clk_master_pres_set_rate(struct clk_hw *hw, unsigned long rate,
 {
        struct clk_master *master = to_clk_master(hw);
        unsigned long flags;
-       unsigned int pres;
+       unsigned int pres, mckr, tmp;
+       int ret;
 
        pres = DIV_ROUND_CLOSEST(parent_rate, rate);
        if (pres > MASTER_PRES_MAX)
@@ -280,19 +426,31 @@ static int clk_master_pres_set_rate(struct clk_hw *hw, unsigned long rate,
 
        else if (pres == 3)
                pres = MASTER_PRES_MAX;
-       else
+       else if (pres)
                pres = ffs(pres) - 1;
 
        spin_lock_irqsave(master->lock, flags);
-       regmap_update_bits(master->regmap, master->layout->offset,
-                          (MASTER_PRES_MASK << master->layout->pres_shift),
-                          (pres << master->layout->pres_shift));
+       ret = regmap_read(master->regmap, master->layout->offset, &mckr);
+       if (ret)
+               goto unlock;
+
+       mckr &= master->layout->mask;
+       tmp = (mckr >> master->layout->pres_shift) & MASTER_PRES_MASK;
+       if (pres == tmp)
+               goto unlock;
+
+       mckr &= ~(MASTER_PRES_MASK << master->layout->pres_shift);
+       mckr |= (pres << master->layout->pres_shift);
+       ret = regmap_write(master->regmap, master->layout->offset, mckr);
+       if (ret)
+               goto unlock;
 
        while (!clk_master_ready(master))
                cpu_relax();
+unlock:
        spin_unlock_irqrestore(master->lock, flags);
 
-       return 0;
+       return ret;
 }
 
 static unsigned long clk_master_pres_recalc_rate(struct clk_hw *hw,
@@ -308,8 +466,9 @@ static unsigned long clk_master_pres_recalc_rate(struct clk_hw *hw,
        regmap_read(master->regmap, master->layout->offset, &val);
        spin_unlock_irqrestore(master->lock, flags);
 
+       val &= master->layout->mask;
        pres = (val >> master->layout->pres_shift) & MASTER_PRES_MASK;
-       if (pres == 3 && characteristics->have_div3_pres)
+       if (pres == MASTER_PRES_MAX && characteristics->have_div3_pres)
                pres = 3;
        else
                pres = (1 << pres);
@@ -327,14 +486,73 @@ static u8 clk_master_pres_get_parent(struct clk_hw *hw)
        regmap_read(master->regmap, master->layout->offset, &mckr);
        spin_unlock_irqrestore(master->lock, flags);
 
+       mckr &= master->layout->mask;
+
        return mckr & AT91_PMC_CSS;
 }
 
+static int clk_master_pres_save_context(struct clk_hw *hw)
+{
+       struct clk_master *master = to_clk_master(hw);
+       struct clk_hw *parent_hw = clk_hw_get_parent(hw);
+       unsigned long flags;
+       unsigned int val, pres;
+
+       spin_lock_irqsave(master->lock, flags);
+       regmap_read(master->regmap, master->layout->offset, &val);
+       spin_unlock_irqrestore(master->lock, flags);
+
+       val &= master->layout->mask;
+       pres = (val >> master->layout->pres_shift) & MASTER_PRES_MASK;
+       if (pres == MASTER_PRES_MAX && master->characteristics->have_div3_pres)
+               pres = 3;
+       else
+               pres = (1 << pres);
+
+       master->pms.parent = val & AT91_PMC_CSS;
+       master->pms.parent_rate = clk_hw_get_rate(parent_hw);
+       master->pms.rate = DIV_ROUND_CLOSEST_ULL(master->pms.parent_rate, pres);
+
+       return 0;
+}
+
+static void clk_master_pres_restore_context(struct clk_hw *hw)
+{
+       struct clk_master *master = to_clk_master(hw);
+       unsigned long flags;
+       unsigned int val, pres;
+
+       spin_lock_irqsave(master->lock, flags);
+       regmap_read(master->regmap, master->layout->offset, &val);
+       spin_unlock_irqrestore(master->lock, flags);
+
+       val &= master->layout->mask;
+       pres = (val >> master->layout->pres_shift) & MASTER_PRES_MASK;
+       if (pres == MASTER_PRES_MAX && master->characteristics->have_div3_pres)
+               pres = 3;
+       else
+               pres = (1 << pres);
+
+       if (master->pms.rate !=
+           DIV_ROUND_CLOSEST_ULL(master->pms.parent_rate, pres) ||
+           (master->pms.parent != (val & AT91_PMC_CSS)))
+               pr_warn("MCKR PRES was not configured properly by firmware!\n");
+}
+
+static void clk_master_pres_restore_context_chg(struct clk_hw *hw)
+{
+       struct clk_master *master = to_clk_master(hw);
+
+       clk_master_pres_set_rate(hw, master->pms.rate, master->pms.parent_rate);
+}
+
 static const struct clk_ops master_pres_ops = {
        .prepare = clk_master_prepare,
        .is_prepared = clk_master_is_prepared,
        .recalc_rate = clk_master_pres_recalc_rate,
        .get_parent = clk_master_pres_get_parent,
+       .save_context = clk_master_pres_save_context,
+       .restore_context = clk_master_pres_restore_context,
 };
 
 static const struct clk_ops master_pres_ops_chg = {
@@ -344,6 +562,8 @@ static const struct clk_ops master_pres_ops_chg = {
        .recalc_rate = clk_master_pres_recalc_rate,
        .get_parent = clk_master_pres_get_parent,
        .set_rate = clk_master_pres_set_rate,
+       .save_context = clk_master_pres_save_context,
+       .restore_context = clk_master_pres_restore_context_chg,
 };
 
 static struct clk_hw * __init
@@ -358,6 +578,8 @@ at91_clk_register_master_internal(struct regmap *regmap,
        struct clk_master *master;
        struct clk_init_data init;
        struct clk_hw *hw;
+       unsigned int mckr;
+       unsigned long irqflags;
        int ret;
 
        if (!name || !num_parents || !parent_names || !lock)
@@ -380,6 +602,16 @@ at91_clk_register_master_internal(struct regmap *regmap,
        master->chg_pid = chg_pid;
        master->lock = lock;
 
+       if (ops == &master_div_ops_chg) {
+               spin_lock_irqsave(master->lock, irqflags);
+               regmap_read(master->regmap, master->layout->offset, &mckr);
+               spin_unlock_irqrestore(master->lock, irqflags);
+
+               mckr &= layout->mask;
+               mckr = (mckr >> MASTER_DIV_SHIFT) & MASTER_DIV_MASK;
+               master->div = characteristics->divisors[mckr];
+       }
+
        hw = &master->hw;
        ret = clk_hw_register(NULL, &master->hw);
        if (ret) {
@@ -416,19 +648,29 @@ at91_clk_register_master_div(struct regmap *regmap,
                const char *name, const char *parent_name,
                const struct clk_master_layout *layout,
                const struct clk_master_characteristics *characteristics,
-               spinlock_t *lock, u32 flags)
+               spinlock_t *lock, u32 flags, u32 safe_div)
 {
        const struct clk_ops *ops;
+       struct clk_hw *hw;
 
        if (flags & CLK_SET_RATE_GATE)
                ops = &master_div_ops;
        else
                ops = &master_div_ops_chg;
 
-       return at91_clk_register_master_internal(regmap, name, 1,
-                                                &parent_name, layout,
-                                                characteristics, ops,
-                                                lock, flags, -EINVAL);
+       hw = at91_clk_register_master_internal(regmap, name, 1,
+                                              &parent_name, layout,
+                                              characteristics, ops,
+                                              lock, flags, -EINVAL);
+
+       if (!IS_ERR(hw) && safe_div) {
+               master_div = to_clk_master(hw);
+               master_div->safe_div = safe_div;
+               clk_notifier_register(hw->clk,
+                                     &clk_master_div_notifier);
+       }
+
+       return hw;
 }
 
 static unsigned long
@@ -539,30 +781,40 @@ static int clk_sama7g5_master_set_parent(struct clk_hw *hw, u8 index)
        return 0;
 }
 
-static int clk_sama7g5_master_enable(struct clk_hw *hw)
+static void clk_sama7g5_master_set(struct clk_master *master,
+                                  unsigned int status)
 {
-       struct clk_master *master = to_clk_master(hw);
        unsigned long flags;
        unsigned int val, cparent;
+       unsigned int enable = status ? AT91_PMC_MCR_V2_EN : 0;
+       unsigned int parent = master->parent << PMC_MCR_CSS_SHIFT;
+       unsigned int div = master->div << MASTER_DIV_SHIFT;
 
        spin_lock_irqsave(master->lock, flags);
 
-       regmap_write(master->regmap, PMC_MCR, PMC_MCR_ID(master->id));
-       regmap_read(master->regmap, PMC_MCR, &val);
-       regmap_update_bits(master->regmap, PMC_MCR,
-                          PMC_MCR_EN | PMC_MCR_CSS | PMC_MCR_DIV |
-                          PMC_MCR_CMD | PMC_MCR_ID_MSK,
-                          PMC_MCR_EN | (master->parent << PMC_MCR_CSS_SHIFT) |
-                          (master->div << MASTER_DIV_SHIFT) |
-                          PMC_MCR_CMD | PMC_MCR_ID(master->id));
+       regmap_write(master->regmap, AT91_PMC_MCR_V2,
+                    AT91_PMC_MCR_V2_ID(master->id));
+       regmap_read(master->regmap, AT91_PMC_MCR_V2, &val);
+       regmap_update_bits(master->regmap, AT91_PMC_MCR_V2,
+                          enable | AT91_PMC_MCR_V2_CSS | AT91_PMC_MCR_V2_DIV |
+                          AT91_PMC_MCR_V2_CMD | AT91_PMC_MCR_V2_ID_MSK,
+                          enable | parent | div | AT91_PMC_MCR_V2_CMD |
+                          AT91_PMC_MCR_V2_ID(master->id));
 
-       cparent = (val & PMC_MCR_CSS) >> PMC_MCR_CSS_SHIFT;
+       cparent = (val & AT91_PMC_MCR_V2_CSS) >> PMC_MCR_CSS_SHIFT;
 
        /* Wait here only if parent is being changed. */
        while ((cparent != master->parent) && !clk_master_ready(master))
                cpu_relax();
 
        spin_unlock_irqrestore(master->lock, flags);
+}
+
+static int clk_sama7g5_master_enable(struct clk_hw *hw)
+{
+       struct clk_master *master = to_clk_master(hw);
+
+       clk_sama7g5_master_set(master, 1);
 
        return 0;
 }
@@ -574,10 +826,12 @@ static void clk_sama7g5_master_disable(struct clk_hw *hw)
 
        spin_lock_irqsave(master->lock, flags);
 
-       regmap_write(master->regmap, PMC_MCR, master->id);
-       regmap_update_bits(master->regmap, PMC_MCR,
-                          PMC_MCR_EN | PMC_MCR_CMD | PMC_MCR_ID_MSK,
-                          PMC_MCR_CMD | PMC_MCR_ID(master->id));
+       regmap_write(master->regmap, AT91_PMC_MCR_V2, master->id);
+       regmap_update_bits(master->regmap, AT91_PMC_MCR_V2,
+                          AT91_PMC_MCR_V2_EN | AT91_PMC_MCR_V2_CMD |
+                          AT91_PMC_MCR_V2_ID_MSK,
+                          AT91_PMC_MCR_V2_CMD |
+                          AT91_PMC_MCR_V2_ID(master->id));
 
        spin_unlock_irqrestore(master->lock, flags);
 }
@@ -590,12 +844,12 @@ static int clk_sama7g5_master_is_enabled(struct clk_hw *hw)
 
        spin_lock_irqsave(master->lock, flags);
 
-       regmap_write(master->regmap, PMC_MCR, master->id);
-       regmap_read(master->regmap, PMC_MCR, &val);
+       regmap_write(master->regmap, AT91_PMC_MCR_V2, master->id);
+       regmap_read(master->regmap, AT91_PMC_MCR_V2, &val);
 
        spin_unlock_irqrestore(master->lock, flags);
 
-       return !!(val & PMC_MCR_EN);
+       return !!(val & AT91_PMC_MCR_V2_EN);
 }
 
 static int clk_sama7g5_master_set_rate(struct clk_hw *hw, unsigned long rate,
@@ -610,7 +864,7 @@ static int clk_sama7g5_master_set_rate(struct clk_hw *hw, unsigned long rate,
 
        if (div == 3)
                div = MASTER_PRES_MAX;
-       else
+       else if (div)
                div = ffs(div) - 1;
 
        spin_lock_irqsave(master->lock, flags);
@@ -620,6 +874,23 @@ static int clk_sama7g5_master_set_rate(struct clk_hw *hw, unsigned long rate,
        return 0;
 }
 
+static int clk_sama7g5_master_save_context(struct clk_hw *hw)
+{
+       struct clk_master *master = to_clk_master(hw);
+
+       master->pms.status = clk_sama7g5_master_is_enabled(hw);
+
+       return 0;
+}
+
+static void clk_sama7g5_master_restore_context(struct clk_hw *hw)
+{
+       struct clk_master *master = to_clk_master(hw);
+
+       if (master->pms.status)
+               clk_sama7g5_master_set(master, master->pms.status);
+}
+
 static const struct clk_ops sama7g5_master_ops = {
        .enable = clk_sama7g5_master_enable,
        .disable = clk_sama7g5_master_disable,
@@ -629,6 +900,8 @@ static const struct clk_ops sama7g5_master_ops = {
        .set_rate = clk_sama7g5_master_set_rate,
        .get_parent = clk_sama7g5_master_get_parent,
        .set_parent = clk_sama7g5_master_set_parent,
+       .save_context = clk_sama7g5_master_save_context,
+       .restore_context = clk_sama7g5_master_restore_context,
 };
 
 struct clk_hw * __init
@@ -672,10 +945,10 @@ at91_clk_sama7g5_register_master(struct regmap *regmap,
        master->mux_table = mux_table;
 
        spin_lock_irqsave(master->lock, flags);
-       regmap_write(master->regmap, PMC_MCR, master->id);
-       regmap_read(master->regmap, PMC_MCR, &val);
-       master->parent = (val & PMC_MCR_CSS) >> PMC_MCR_CSS_SHIFT;
-       master->div = (val & PMC_MCR_DIV) >> MASTER_DIV_SHIFT;
+       regmap_write(master->regmap, AT91_PMC_MCR_V2, master->id);
+       regmap_read(master->regmap, AT91_PMC_MCR_V2, &val);
+       master->parent = (val & AT91_PMC_MCR_V2_CSS) >> PMC_MCR_CSS_SHIFT;
+       master->div = (val & AT91_PMC_MCR_V2_DIV) >> MASTER_DIV_SHIFT;
        spin_unlock_irqrestore(master->lock, flags);
 
        hw = &master->hw;
index 7a27ba8..e14fa5a 100644 (file)
@@ -37,6 +37,7 @@ struct clk_sam9x5_peripheral {
        u32 id;
        u32 div;
        const struct clk_pcr_layout *layout;
+       struct at91_clk_pms pms;
        bool auto_div;
        int chg_pid;
 };
@@ -155,10 +156,11 @@ static void clk_sam9x5_peripheral_autodiv(struct clk_sam9x5_peripheral *periph)
        periph->div = shift;
 }
 
-static int clk_sam9x5_peripheral_enable(struct clk_hw *hw)
+static int clk_sam9x5_peripheral_set(struct clk_sam9x5_peripheral *periph,
+                                    unsigned int status)
 {
-       struct clk_sam9x5_peripheral *periph = to_clk_sam9x5_peripheral(hw);
        unsigned long flags;
+       unsigned int enable = status ? AT91_PMC_PCR_EN : 0;
 
        if (periph->id < PERIPHERAL_ID_MIN)
                return 0;
@@ -168,15 +170,21 @@ static int clk_sam9x5_peripheral_enable(struct clk_hw *hw)
                     (periph->id & periph->layout->pid_mask));
        regmap_update_bits(periph->regmap, periph->layout->offset,
                           periph->layout->div_mask | periph->layout->cmd |
-                          AT91_PMC_PCR_EN,
+                          enable,
                           field_prep(periph->layout->div_mask, periph->div) |
-                          periph->layout->cmd |
-                          AT91_PMC_PCR_EN);
+                          periph->layout->cmd | enable);
        spin_unlock_irqrestore(periph->lock, flags);
 
        return 0;
 }
 
+static int clk_sam9x5_peripheral_enable(struct clk_hw *hw)
+{
+       struct clk_sam9x5_peripheral *periph = to_clk_sam9x5_peripheral(hw);
+
+       return clk_sam9x5_peripheral_set(periph, 1);
+}
+
 static void clk_sam9x5_peripheral_disable(struct clk_hw *hw)
 {
        struct clk_sam9x5_peripheral *periph = to_clk_sam9x5_peripheral(hw);
@@ -393,6 +401,23 @@ static int clk_sam9x5_peripheral_set_rate(struct clk_hw *hw,
        return -EINVAL;
 }
 
+static int clk_sam9x5_peripheral_save_context(struct clk_hw *hw)
+{
+       struct clk_sam9x5_peripheral *periph = to_clk_sam9x5_peripheral(hw);
+
+       periph->pms.status = clk_sam9x5_peripheral_is_enabled(hw);
+
+       return 0;
+}
+
+static void clk_sam9x5_peripheral_restore_context(struct clk_hw *hw)
+{
+       struct clk_sam9x5_peripheral *periph = to_clk_sam9x5_peripheral(hw);
+
+       if (periph->pms.status)
+               clk_sam9x5_peripheral_set(periph, periph->pms.status);
+}
+
 static const struct clk_ops sam9x5_peripheral_ops = {
        .enable = clk_sam9x5_peripheral_enable,
        .disable = clk_sam9x5_peripheral_disable,
@@ -400,6 +425,8 @@ static const struct clk_ops sam9x5_peripheral_ops = {
        .recalc_rate = clk_sam9x5_peripheral_recalc_rate,
        .round_rate = clk_sam9x5_peripheral_round_rate,
        .set_rate = clk_sam9x5_peripheral_set_rate,
+       .save_context = clk_sam9x5_peripheral_save_context,
+       .restore_context = clk_sam9x5_peripheral_restore_context,
 };
 
 static const struct clk_ops sam9x5_peripheral_chg_ops = {
@@ -409,6 +436,8 @@ static const struct clk_ops sam9x5_peripheral_chg_ops = {
        .recalc_rate = clk_sam9x5_peripheral_recalc_rate,
        .determine_rate = clk_sam9x5_peripheral_determine_rate,
        .set_rate = clk_sam9x5_peripheral_set_rate,
+       .save_context = clk_sam9x5_peripheral_save_context,
+       .restore_context = clk_sam9x5_peripheral_restore_context,
 };
 
 struct clk_hw * __init
@@ -460,7 +489,6 @@ at91_clk_register_sam9x5_peripheral(struct regmap *regmap, spinlock_t *lock,
                hw = ERR_PTR(ret);
        } else {
                clk_sam9x5_peripheral_autodiv(periph);
-               pmc_register_id(id);
        }
 
        return hw;
index 6ed986d..249d6a5 100644 (file)
@@ -40,6 +40,7 @@ struct clk_pll {
        u16 mul;
        const struct clk_pll_layout *layout;
        const struct clk_pll_characteristics *characteristics;
+       struct at91_clk_pms pms;
 };
 
 static inline bool clk_pll_ready(struct regmap *regmap, int id)
@@ -260,6 +261,42 @@ static int clk_pll_set_rate(struct clk_hw *hw, unsigned long rate,
        return 0;
 }
 
+static int clk_pll_save_context(struct clk_hw *hw)
+{
+       struct clk_pll *pll = to_clk_pll(hw);
+       struct clk_hw *parent_hw = clk_hw_get_parent(hw);
+
+       pll->pms.parent_rate = clk_hw_get_rate(parent_hw);
+       pll->pms.rate = clk_pll_recalc_rate(&pll->hw, pll->pms.parent_rate);
+       pll->pms.status = clk_pll_ready(pll->regmap, PLL_REG(pll->id));
+
+       return 0;
+}
+
+static void clk_pll_restore_context(struct clk_hw *hw)
+{
+       struct clk_pll *pll = to_clk_pll(hw);
+       unsigned long calc_rate;
+       unsigned int pllr, pllr_out, pllr_count;
+       u8 out = 0;
+
+       if (pll->characteristics->out)
+               out = pll->characteristics->out[pll->range];
+
+       regmap_read(pll->regmap, PLL_REG(pll->id), &pllr);
+
+       calc_rate = (pll->pms.parent_rate / PLL_DIV(pllr)) *
+                    (PLL_MUL(pllr, pll->layout) + 1);
+       pllr_count = (pllr >> PLL_COUNT_SHIFT) & PLL_MAX_COUNT;
+       pllr_out = (pllr >> PLL_OUT_SHIFT) & out;
+
+       if (pll->pms.rate != calc_rate ||
+           pll->pms.status != clk_pll_ready(pll->regmap, PLL_REG(pll->id)) ||
+           pllr_count != PLL_MAX_COUNT ||
+           (out && pllr_out != out))
+               pr_warn("PLLAR was not configured properly by firmware\n");
+}
+
 static const struct clk_ops pll_ops = {
        .prepare = clk_pll_prepare,
        .unprepare = clk_pll_unprepare,
@@ -267,6 +304,8 @@ static const struct clk_ops pll_ops = {
        .recalc_rate = clk_pll_recalc_rate,
        .round_rate = clk_pll_round_rate,
        .set_rate = clk_pll_set_rate,
+       .save_context = clk_pll_save_context,
+       .restore_context = clk_pll_restore_context,
 };
 
 struct clk_hw * __init
index fcf8f6a..6c4b259 100644 (file)
@@ -24,6 +24,7 @@ struct clk_programmable {
        u32 *mux_table;
        u8 id;
        const struct clk_programmable_layout *layout;
+       struct at91_clk_pms pms;
 };
 
 #define to_clk_programmable(hw) container_of(hw, struct clk_programmable, hw)
@@ -177,12 +178,38 @@ static int clk_programmable_set_rate(struct clk_hw *hw, unsigned long rate,
        return 0;
 }
 
+static int clk_programmable_save_context(struct clk_hw *hw)
+{
+       struct clk_programmable *prog = to_clk_programmable(hw);
+       struct clk_hw *parent_hw = clk_hw_get_parent(hw);
+
+       prog->pms.parent = clk_programmable_get_parent(hw);
+       prog->pms.parent_rate = clk_hw_get_rate(parent_hw);
+       prog->pms.rate = clk_programmable_recalc_rate(hw, prog->pms.parent_rate);
+
+       return 0;
+}
+
+static void clk_programmable_restore_context(struct clk_hw *hw)
+{
+       struct clk_programmable *prog = to_clk_programmable(hw);
+       int ret;
+
+       ret = clk_programmable_set_parent(hw, prog->pms.parent);
+       if (ret)
+               return;
+
+       clk_programmable_set_rate(hw, prog->pms.rate, prog->pms.parent_rate);
+}
+
 static const struct clk_ops programmable_ops = {
        .recalc_rate = clk_programmable_recalc_rate,
        .determine_rate = clk_programmable_determine_rate,
        .get_parent = clk_programmable_get_parent,
        .set_parent = clk_programmable_set_parent,
        .set_rate = clk_programmable_set_rate,
+       .save_context = clk_programmable_save_context,
+       .restore_context = clk_programmable_restore_context,
 };
 
 struct clk_hw * __init
@@ -221,8 +248,6 @@ at91_clk_register_programmable(struct regmap *regmap,
        if (ret) {
                kfree(prog);
                hw = ERR_PTR(ret);
-       } else {
-               pmc_register_pck(id);
        }
 
        return hw;
index 34e3ab1..d757003 100644 (file)
@@ -5,6 +5,7 @@
  */
 
 #include <linux/bitfield.h>
+#include <linux/clk.h>
 #include <linux/clk-provider.h>
 #include <linux/clkdev.h>
 #include <linux/clk/at91_pmc.h>
@@ -38,19 +39,24 @@ struct sam9x60_pll_core {
 
 struct sam9x60_frac {
        struct sam9x60_pll_core core;
+       struct at91_clk_pms pms;
        u32 frac;
        u16 mul;
 };
 
 struct sam9x60_div {
        struct sam9x60_pll_core core;
+       struct at91_clk_pms pms;
        u8 div;
+       u8 safe_div;
 };
 
 #define to_sam9x60_pll_core(hw)        container_of(hw, struct sam9x60_pll_core, hw)
 #define to_sam9x60_frac(core)  container_of(core, struct sam9x60_frac, core)
 #define to_sam9x60_div(core)   container_of(core, struct sam9x60_div, core)
 
+static struct sam9x60_div *notifier_div;
+
 static inline bool sam9x60_pll_ready(struct regmap *regmap, int id)
 {
        unsigned int status;
@@ -71,13 +77,12 @@ static unsigned long sam9x60_frac_pll_recalc_rate(struct clk_hw *hw,
        struct sam9x60_pll_core *core = to_sam9x60_pll_core(hw);
        struct sam9x60_frac *frac = to_sam9x60_frac(core);
 
-       return (parent_rate * (frac->mul + 1) +
-               ((u64)parent_rate * frac->frac >> 22));
+       return parent_rate * (frac->mul + 1) +
+               DIV_ROUND_CLOSEST_ULL((u64)parent_rate * frac->frac, (1 << 22));
 }
 
-static int sam9x60_frac_pll_prepare(struct clk_hw *hw)
+static int sam9x60_frac_pll_set(struct sam9x60_pll_core *core)
 {
-       struct sam9x60_pll_core *core = to_sam9x60_pll_core(hw);
        struct sam9x60_frac *frac = to_sam9x60_frac(core);
        struct regmap *regmap = core->regmap;
        unsigned int val, cfrac, cmul;
@@ -141,6 +146,13 @@ unlock:
        return 0;
 }
 
+static int sam9x60_frac_pll_prepare(struct clk_hw *hw)
+{
+       struct sam9x60_pll_core *core = to_sam9x60_pll_core(hw);
+
+       return sam9x60_frac_pll_set(core);
+}
+
 static void sam9x60_frac_pll_unprepare(struct clk_hw *hw)
 {
        struct sam9x60_pll_core *core = to_sam9x60_pll_core(hw);
@@ -280,6 +292,25 @@ unlock:
        return ret;
 }
 
+static int sam9x60_frac_pll_save_context(struct clk_hw *hw)
+{
+       struct sam9x60_pll_core *core = to_sam9x60_pll_core(hw);
+       struct sam9x60_frac *frac = to_sam9x60_frac(core);
+
+       frac->pms.status = sam9x60_pll_ready(core->regmap, core->id);
+
+       return 0;
+}
+
+static void sam9x60_frac_pll_restore_context(struct clk_hw *hw)
+{
+       struct sam9x60_pll_core *core = to_sam9x60_pll_core(hw);
+       struct sam9x60_frac *frac = to_sam9x60_frac(core);
+
+       if (frac->pms.status)
+               sam9x60_frac_pll_set(core);
+}
+
 static const struct clk_ops sam9x60_frac_pll_ops = {
        .prepare = sam9x60_frac_pll_prepare,
        .unprepare = sam9x60_frac_pll_unprepare,
@@ -287,6 +318,8 @@ static const struct clk_ops sam9x60_frac_pll_ops = {
        .recalc_rate = sam9x60_frac_pll_recalc_rate,
        .round_rate = sam9x60_frac_pll_round_rate,
        .set_rate = sam9x60_frac_pll_set_rate,
+       .save_context = sam9x60_frac_pll_save_context,
+       .restore_context = sam9x60_frac_pll_restore_context,
 };
 
 static const struct clk_ops sam9x60_frac_pll_ops_chg = {
@@ -296,11 +329,32 @@ static const struct clk_ops sam9x60_frac_pll_ops_chg = {
        .recalc_rate = sam9x60_frac_pll_recalc_rate,
        .round_rate = sam9x60_frac_pll_round_rate,
        .set_rate = sam9x60_frac_pll_set_rate_chg,
+       .save_context = sam9x60_frac_pll_save_context,
+       .restore_context = sam9x60_frac_pll_restore_context,
 };
 
-static int sam9x60_div_pll_prepare(struct clk_hw *hw)
+/* This function should be called with spinlock acquired. */
+static void sam9x60_div_pll_set_div(struct sam9x60_pll_core *core, u32 div,
+                                   bool enable)
+{
+       struct regmap *regmap = core->regmap;
+       u32 ena_msk = enable ? core->layout->endiv_mask : 0;
+       u32 ena_val = enable ? (1 << core->layout->endiv_shift) : 0;
+
+       regmap_update_bits(regmap, AT91_PMC_PLL_CTRL0,
+                          core->layout->div_mask | ena_msk,
+                          (div << core->layout->div_shift) | ena_val);
+
+       regmap_update_bits(regmap, AT91_PMC_PLL_UPDT,
+                          AT91_PMC_PLL_UPDT_UPDATE | AT91_PMC_PLL_UPDT_ID_MSK,
+                          AT91_PMC_PLL_UPDT_UPDATE | core->id);
+
+       while (!sam9x60_pll_ready(regmap, core->id))
+               cpu_relax();
+}
+
+static int sam9x60_div_pll_set(struct sam9x60_pll_core *core)
 {
-       struct sam9x60_pll_core *core = to_sam9x60_pll_core(hw);
        struct sam9x60_div *div = to_sam9x60_div(core);
        struct regmap *regmap = core->regmap;
        unsigned long flags;
@@ -316,17 +370,7 @@ static int sam9x60_div_pll_prepare(struct clk_hw *hw)
        if (!!(val & core->layout->endiv_mask) && cdiv == div->div)
                goto unlock;
 
-       regmap_update_bits(regmap, AT91_PMC_PLL_CTRL0,
-                          core->layout->div_mask | core->layout->endiv_mask,
-                          (div->div << core->layout->div_shift) |
-                          (1 << core->layout->endiv_shift));
-
-       regmap_update_bits(regmap, AT91_PMC_PLL_UPDT,
-                          AT91_PMC_PLL_UPDT_UPDATE | AT91_PMC_PLL_UPDT_ID_MSK,
-                          AT91_PMC_PLL_UPDT_UPDATE | core->id);
-
-       while (!sam9x60_pll_ready(regmap, core->id))
-               cpu_relax();
+       sam9x60_div_pll_set_div(core, div->div, 1);
 
 unlock:
        spin_unlock_irqrestore(core->lock, flags);
@@ -334,6 +378,13 @@ unlock:
        return 0;
 }
 
+static int sam9x60_div_pll_prepare(struct clk_hw *hw)
+{
+       struct sam9x60_pll_core *core = to_sam9x60_pll_core(hw);
+
+       return sam9x60_div_pll_set(core);
+}
+
 static void sam9x60_div_pll_unprepare(struct clk_hw *hw)
 {
        struct sam9x60_pll_core *core = to_sam9x60_pll_core(hw);
@@ -465,16 +516,7 @@ static int sam9x60_div_pll_set_rate_chg(struct clk_hw *hw, unsigned long rate,
        if (cdiv == div->div)
                goto unlock;
 
-       regmap_update_bits(regmap, AT91_PMC_PLL_CTRL0,
-                          core->layout->div_mask,
-                          (div->div << core->layout->div_shift));
-
-       regmap_update_bits(regmap, AT91_PMC_PLL_UPDT,
-                          AT91_PMC_PLL_UPDT_UPDATE | AT91_PMC_PLL_UPDT_ID_MSK,
-                          AT91_PMC_PLL_UPDT_UPDATE | core->id);
-
-       while (!sam9x60_pll_ready(regmap, core->id))
-               cpu_relax();
+       sam9x60_div_pll_set_div(core, div->div, 0);
 
 unlock:
        spin_unlock_irqrestore(core->lock, irqflags);
@@ -482,6 +524,67 @@ unlock:
        return 0;
 }
 
+static int sam9x60_div_pll_save_context(struct clk_hw *hw)
+{
+       struct sam9x60_pll_core *core = to_sam9x60_pll_core(hw);
+       struct sam9x60_div *div = to_sam9x60_div(core);
+
+       div->pms.status = sam9x60_div_pll_is_prepared(hw);
+
+       return 0;
+}
+
+static void sam9x60_div_pll_restore_context(struct clk_hw *hw)
+{
+       struct sam9x60_pll_core *core = to_sam9x60_pll_core(hw);
+       struct sam9x60_div *div = to_sam9x60_div(core);
+
+       if (div->pms.status)
+               sam9x60_div_pll_set(core);
+}
+
+static int sam9x60_div_pll_notifier_fn(struct notifier_block *notifier,
+                                      unsigned long code, void *data)
+{
+       struct sam9x60_div *div = notifier_div;
+       struct sam9x60_pll_core core = div->core;
+       struct regmap *regmap = core.regmap;
+       unsigned long irqflags;
+       u32 val, cdiv;
+       int ret = NOTIFY_DONE;
+
+       if (code != PRE_RATE_CHANGE)
+               return ret;
+
+       /*
+        * We switch to safe divider to avoid overclocking of other domains
+        * feed by us while the frac PLL (our parent) is changed.
+        */
+       div->div = div->safe_div;
+
+       spin_lock_irqsave(core.lock, irqflags);
+       regmap_update_bits(regmap, AT91_PMC_PLL_UPDT, AT91_PMC_PLL_UPDT_ID_MSK,
+                          core.id);
+       regmap_read(regmap, AT91_PMC_PLL_CTRL0, &val);
+       cdiv = (val & core.layout->div_mask) >> core.layout->div_shift;
+
+       /* Stop if nothing changed. */
+       if (cdiv == div->safe_div)
+               goto unlock;
+
+       sam9x60_div_pll_set_div(&core, div->div, 0);
+       ret = NOTIFY_OK;
+
+unlock:
+       spin_unlock_irqrestore(core.lock, irqflags);
+
+       return ret;
+}
+
+static struct notifier_block sam9x60_div_pll_notifier = {
+       .notifier_call = sam9x60_div_pll_notifier_fn,
+};
+
 static const struct clk_ops sam9x60_div_pll_ops = {
        .prepare = sam9x60_div_pll_prepare,
        .unprepare = sam9x60_div_pll_unprepare,
@@ -489,6 +592,8 @@ static const struct clk_ops sam9x60_div_pll_ops = {
        .recalc_rate = sam9x60_div_pll_recalc_rate,
        .round_rate = sam9x60_div_pll_round_rate,
        .set_rate = sam9x60_div_pll_set_rate,
+       .save_context = sam9x60_div_pll_save_context,
+       .restore_context = sam9x60_div_pll_restore_context,
 };
 
 static const struct clk_ops sam9x60_div_pll_ops_chg = {
@@ -498,6 +603,8 @@ static const struct clk_ops sam9x60_div_pll_ops_chg = {
        .recalc_rate = sam9x60_div_pll_recalc_rate,
        .round_rate = sam9x60_div_pll_round_rate,
        .set_rate = sam9x60_div_pll_set_rate_chg,
+       .save_context = sam9x60_div_pll_save_context,
+       .restore_context = sam9x60_div_pll_restore_context,
 };
 
 struct clk_hw * __init
@@ -587,7 +694,8 @@ struct clk_hw * __init
 sam9x60_clk_register_div_pll(struct regmap *regmap, spinlock_t *lock,
                             const char *name, const char *parent_name, u8 id,
                             const struct clk_pll_characteristics *characteristics,
-                            const struct clk_pll_layout *layout, u32 flags)
+                            const struct clk_pll_layout *layout, u32 flags,
+                            u32 safe_div)
 {
        struct sam9x60_div *div;
        struct clk_hw *hw;
@@ -596,9 +704,13 @@ sam9x60_clk_register_div_pll(struct regmap *regmap, spinlock_t *lock,
        unsigned int val;
        int ret;
 
-       if (id > PLL_MAX_ID || !lock)
+       /* We only support one changeable PLL. */
+       if (id > PLL_MAX_ID || !lock || (safe_div && notifier_div))
                return ERR_PTR(-EINVAL);
 
+       if (safe_div >= PLL_DIV_MAX)
+               safe_div = PLL_DIV_MAX - 1;
+
        div = kzalloc(sizeof(*div), GFP_KERNEL);
        if (!div)
                return ERR_PTR(-ENOMEM);
@@ -618,6 +730,7 @@ sam9x60_clk_register_div_pll(struct regmap *regmap, spinlock_t *lock,
        div->core.layout = layout;
        div->core.regmap = regmap;
        div->core.lock = lock;
+       div->safe_div = safe_div;
 
        spin_lock_irqsave(div->core.lock, irqflags);
 
@@ -633,6 +746,9 @@ sam9x60_clk_register_div_pll(struct regmap *regmap, spinlock_t *lock,
        if (ret) {
                kfree(div);
                hw = ERR_PTR(ret);
+       } else if (div->safe_div) {
+               notifier_div = div;
+               clk_notifier_register(hw->clk, &sam9x60_div_pll_notifier);
        }
 
        return hw;
index f83ec0d..80720fd 100644 (file)
@@ -20,6 +20,7 @@
 struct clk_system {
        struct clk_hw hw;
        struct regmap *regmap;
+       struct at91_clk_pms pms;
        u8 id;
 };
 
@@ -77,10 +78,29 @@ static int clk_system_is_prepared(struct clk_hw *hw)
        return !!(status & (1 << sys->id));
 }
 
+static int clk_system_save_context(struct clk_hw *hw)
+{
+       struct clk_system *sys = to_clk_system(hw);
+
+       sys->pms.status = clk_system_is_prepared(hw);
+
+       return 0;
+}
+
+static void clk_system_restore_context(struct clk_hw *hw)
+{
+       struct clk_system *sys = to_clk_system(hw);
+
+       if (sys->pms.status)
+               clk_system_prepare(&sys->hw);
+}
+
 static const struct clk_ops system_ops = {
        .prepare = clk_system_prepare,
        .unprepare = clk_system_unprepare,
        .is_prepared = clk_system_is_prepared,
+       .save_context = clk_system_save_context,
+       .restore_context = clk_system_restore_context,
 };
 
 struct clk_hw * __init
index 31d5c45..b0696a9 100644 (file)
@@ -24,6 +24,7 @@
 struct at91sam9x5_clk_usb {
        struct clk_hw hw;
        struct regmap *regmap;
+       struct at91_clk_pms pms;
        u32 usbs_mask;
        u8 num_parents;
 };
@@ -148,12 +149,38 @@ static int at91sam9x5_clk_usb_set_rate(struct clk_hw *hw, unsigned long rate,
        return 0;
 }
 
+static int at91sam9x5_usb_save_context(struct clk_hw *hw)
+{
+       struct at91sam9x5_clk_usb *usb = to_at91sam9x5_clk_usb(hw);
+       struct clk_hw *parent_hw = clk_hw_get_parent(hw);
+
+       usb->pms.parent = at91sam9x5_clk_usb_get_parent(hw);
+       usb->pms.parent_rate = clk_hw_get_rate(parent_hw);
+       usb->pms.rate = at91sam9x5_clk_usb_recalc_rate(hw, usb->pms.parent_rate);
+
+       return 0;
+}
+
+static void at91sam9x5_usb_restore_context(struct clk_hw *hw)
+{
+       struct at91sam9x5_clk_usb *usb = to_at91sam9x5_clk_usb(hw);
+       int ret;
+
+       ret = at91sam9x5_clk_usb_set_parent(hw, usb->pms.parent);
+       if (ret)
+               return;
+
+       at91sam9x5_clk_usb_set_rate(hw, usb->pms.rate, usb->pms.parent_rate);
+}
+
 static const struct clk_ops at91sam9x5_usb_ops = {
        .recalc_rate = at91sam9x5_clk_usb_recalc_rate,
        .determine_rate = at91sam9x5_clk_usb_determine_rate,
        .get_parent = at91sam9x5_clk_usb_get_parent,
        .set_parent = at91sam9x5_clk_usb_set_parent,
        .set_rate = at91sam9x5_clk_usb_set_rate,
+       .save_context = at91sam9x5_usb_save_context,
+       .restore_context = at91sam9x5_usb_restore_context,
 };
 
 static int at91sam9n12_clk_usb_enable(struct clk_hw *hw)
index df9f3fc..a22c10d 100644 (file)
@@ -23,6 +23,7 @@ struct clk_utmi {
        struct clk_hw hw;
        struct regmap *regmap_pmc;
        struct regmap *regmap_sfr;
+       struct at91_clk_pms pms;
 };
 
 #define to_clk_utmi(hw) container_of(hw, struct clk_utmi, hw)
@@ -113,11 +114,30 @@ static unsigned long clk_utmi_recalc_rate(struct clk_hw *hw,
        return UTMI_RATE;
 }
 
+static int clk_utmi_save_context(struct clk_hw *hw)
+{
+       struct clk_utmi *utmi = to_clk_utmi(hw);
+
+       utmi->pms.status = clk_utmi_is_prepared(hw);
+
+       return 0;
+}
+
+static void clk_utmi_restore_context(struct clk_hw *hw)
+{
+       struct clk_utmi *utmi = to_clk_utmi(hw);
+
+       if (utmi->pms.status)
+               clk_utmi_prepare(hw);
+}
+
 static const struct clk_ops utmi_ops = {
        .prepare = clk_utmi_prepare,
        .unprepare = clk_utmi_unprepare,
        .is_prepared = clk_utmi_is_prepared,
        .recalc_rate = clk_utmi_recalc_rate,
+       .save_context = clk_utmi_save_context,
+       .restore_context = clk_utmi_restore_context,
 };
 
 static struct clk_hw * __init
@@ -232,10 +252,29 @@ static int clk_utmi_sama7g5_is_prepared(struct clk_hw *hw)
        return 0;
 }
 
+static int clk_utmi_sama7g5_save_context(struct clk_hw *hw)
+{
+       struct clk_utmi *utmi = to_clk_utmi(hw);
+
+       utmi->pms.status = clk_utmi_sama7g5_is_prepared(hw);
+
+       return 0;
+}
+
+static void clk_utmi_sama7g5_restore_context(struct clk_hw *hw)
+{
+       struct clk_utmi *utmi = to_clk_utmi(hw);
+
+       if (utmi->pms.status)
+               clk_utmi_sama7g5_prepare(hw);
+}
+
 static const struct clk_ops sama7g5_utmi_ops = {
        .prepare = clk_utmi_sama7g5_prepare,
        .is_prepared = clk_utmi_sama7g5_is_prepared,
        .recalc_rate = clk_utmi_recalc_rate,
+       .save_context = clk_utmi_sama7g5_save_context,
+       .restore_context = clk_utmi_sama7g5_restore_context,
 };
 
 struct clk_hw * __init
index a97b99c..ca2dbb6 100644 (file)
@@ -399,7 +399,7 @@ of_at91_clk_master_setup(struct device_node *np,
 
        hw = at91_clk_register_master_div(regmap, name, "masterck_pres",
                                          layout, characteristics,
-                                         &mck_lock, CLK_SET_RATE_GATE);
+                                         &mck_lock, CLK_SET_RATE_GATE, 0);
        if (IS_ERR(hw))
                goto out_free_characteristics;
 
index 20ee9dc..5aa9c1f 100644 (file)
@@ -3,10 +3,12 @@
  *  Copyright (C) 2013 Boris BREZILLON <b.brezillon@overkiz.com>
  */
 
+#include <linux/clk.h>
 #include <linux/clk-provider.h>
 #include <linux/clkdev.h>
 #include <linux/clk/at91_pmc.h>
 #include <linux/of.h>
+#include <linux/of_address.h>
 #include <linux/mfd/syscon.h>
 #include <linux/platform_device.h>
 #include <linux/regmap.h>
@@ -14,8 +16,6 @@
 
 #include <asm/proc-fns.h>
 
-#include <dt-bindings/clock/at91.h>
-
 #include "pmc.h"
 
 #define PMC_MAX_IDS 128
@@ -111,151 +111,46 @@ struct pmc_data *pmc_data_allocate(unsigned int ncore, unsigned int nsystem,
 }
 
 #ifdef CONFIG_PM
-static struct regmap *pmcreg;
 
-static u8 registered_ids[PMC_MAX_IDS];
-static u8 registered_pcks[PMC_MAX_PCKS];
+/* Address in SECURAM that say if we suspend to backup mode. */
+static void __iomem *at91_pmc_backup_suspend;
 
-static struct
+static int at91_pmc_suspend(void)
 {
-       u32 scsr;
-       u32 pcsr0;
-       u32 uckr;
-       u32 mor;
-       u32 mcfr;
-       u32 pllar;
-       u32 mckr;
-       u32 usb;
-       u32 imr;
-       u32 pcsr1;
-       u32 pcr[PMC_MAX_IDS];
-       u32 audio_pll0;
-       u32 audio_pll1;
-       u32 pckr[PMC_MAX_PCKS];
-} pmc_cache;
+       unsigned int backup;
 
-/*
- * As Peripheral ID 0 is invalid on AT91 chips, the identifier is stored
- * without alteration in the table, and 0 is for unused clocks.
- */
-void pmc_register_id(u8 id)
-{
-       int i;
-
-       for (i = 0; i < PMC_MAX_IDS; i++) {
-               if (registered_ids[i] == 0) {
-                       registered_ids[i] = id;
-                       break;
-               }
-               if (registered_ids[i] == id)
-                       break;
-       }
-}
+       if (!at91_pmc_backup_suspend)
+               return 0;
 
-/*
- * As Programmable Clock 0 is valid on AT91 chips, there is an offset
- * of 1 between the stored value and the real clock ID.
- */
-void pmc_register_pck(u8 pck)
-{
-       int i;
-
-       for (i = 0; i < PMC_MAX_PCKS; i++) {
-               if (registered_pcks[i] == 0) {
-                       registered_pcks[i] = pck + 1;
-                       break;
-               }
-               if (registered_pcks[i] == (pck + 1))
-                       break;
-       }
-}
-
-static int pmc_suspend(void)
-{
-       int i;
-       u8 num;
-
-       regmap_read(pmcreg, AT91_PMC_SCSR, &pmc_cache.scsr);
-       regmap_read(pmcreg, AT91_PMC_PCSR, &pmc_cache.pcsr0);
-       regmap_read(pmcreg, AT91_CKGR_UCKR, &pmc_cache.uckr);
-       regmap_read(pmcreg, AT91_CKGR_MOR, &pmc_cache.mor);
-       regmap_read(pmcreg, AT91_CKGR_MCFR, &pmc_cache.mcfr);
-       regmap_read(pmcreg, AT91_CKGR_PLLAR, &pmc_cache.pllar);
-       regmap_read(pmcreg, AT91_PMC_MCKR, &pmc_cache.mckr);
-       regmap_read(pmcreg, AT91_PMC_USB, &pmc_cache.usb);
-       regmap_read(pmcreg, AT91_PMC_IMR, &pmc_cache.imr);
-       regmap_read(pmcreg, AT91_PMC_PCSR1, &pmc_cache.pcsr1);
-
-       for (i = 0; registered_ids[i]; i++) {
-               regmap_write(pmcreg, AT91_PMC_PCR,
-                            (registered_ids[i] & AT91_PMC_PCR_PID_MASK));
-               regmap_read(pmcreg, AT91_PMC_PCR,
-                           &pmc_cache.pcr[registered_ids[i]]);
-       }
-       for (i = 0; registered_pcks[i]; i++) {
-               num = registered_pcks[i] - 1;
-               regmap_read(pmcreg, AT91_PMC_PCKR(num), &pmc_cache.pckr[num]);
-       }
+       backup = readl_relaxed(at91_pmc_backup_suspend);
+       if (!backup)
+               return 0;
 
-       return 0;
+       return clk_save_context();
 }
 
-static bool pmc_ready(unsigned int mask)
+static void at91_pmc_resume(void)
 {
-       unsigned int status;
+       unsigned int backup;
 
-       regmap_read(pmcreg, AT91_PMC_SR, &status);
+       if (!at91_pmc_backup_suspend)
+               return;
 
-       return ((status & mask) == mask) ? 1 : 0;
-}
+       backup = readl_relaxed(at91_pmc_backup_suspend);
+       if (!backup)
+               return;
 
-static void pmc_resume(void)
-{
-       int i;
-       u8 num;
-       u32 tmp;
-       u32 mask = AT91_PMC_MCKRDY | AT91_PMC_LOCKA;
-
-       regmap_read(pmcreg, AT91_PMC_MCKR, &tmp);
-       if (pmc_cache.mckr != tmp)
-               pr_warn("MCKR was not configured properly by the firmware\n");
-       regmap_read(pmcreg, AT91_CKGR_PLLAR, &tmp);
-       if (pmc_cache.pllar != tmp)
-               pr_warn("PLLAR was not configured properly by the firmware\n");
-
-       regmap_write(pmcreg, AT91_PMC_SCER, pmc_cache.scsr);
-       regmap_write(pmcreg, AT91_PMC_PCER, pmc_cache.pcsr0);
-       regmap_write(pmcreg, AT91_CKGR_UCKR, pmc_cache.uckr);
-       regmap_write(pmcreg, AT91_CKGR_MOR, pmc_cache.mor);
-       regmap_write(pmcreg, AT91_CKGR_MCFR, pmc_cache.mcfr);
-       regmap_write(pmcreg, AT91_PMC_USB, pmc_cache.usb);
-       regmap_write(pmcreg, AT91_PMC_IMR, pmc_cache.imr);
-       regmap_write(pmcreg, AT91_PMC_PCER1, pmc_cache.pcsr1);
-
-       for (i = 0; registered_ids[i]; i++) {
-               regmap_write(pmcreg, AT91_PMC_PCR,
-                            pmc_cache.pcr[registered_ids[i]] |
-                            AT91_PMC_PCR_CMD);
-       }
-       for (i = 0; registered_pcks[i]; i++) {
-               num = registered_pcks[i] - 1;
-               regmap_write(pmcreg, AT91_PMC_PCKR(num), pmc_cache.pckr[num]);
-       }
-
-       if (pmc_cache.uckr & AT91_PMC_UPLLEN)
-               mask |= AT91_PMC_LOCKU;
-
-       while (!pmc_ready(mask))
-               cpu_relax();
+       clk_restore_context();
 }
 
 static struct syscore_ops pmc_syscore_ops = {
-       .suspend = pmc_suspend,
-       .resume = pmc_resume,
+       .suspend = at91_pmc_suspend,
+       .resume = at91_pmc_resume,
 };
 
-static const struct of_device_id sama5d2_pmc_dt_ids[] = {
+static const struct of_device_id pmc_dt_ids[] = {
        { .compatible = "atmel,sama5d2-pmc" },
+       { .compatible = "microchip,sama7g5-pmc", },
        { /* sentinel */ }
 };
 
@@ -263,14 +158,31 @@ static int __init pmc_register_ops(void)
 {
        struct device_node *np;
 
-       np = of_find_matching_node(NULL, sama5d2_pmc_dt_ids);
+       np = of_find_matching_node(NULL, pmc_dt_ids);
+       if (!np)
+               return -ENODEV;
+
+       if (!of_device_is_available(np)) {
+               of_node_put(np);
+               return -ENODEV;
+       }
+       of_node_put(np);
+
+       np = of_find_compatible_node(NULL, NULL, "atmel,sama5d2-securam");
        if (!np)
                return -ENODEV;
 
-       pmcreg = device_node_to_regmap(np);
+       if (!of_device_is_available(np)) {
+               of_node_put(np);
+               return -ENODEV;
+       }
        of_node_put(np);
-       if (IS_ERR(pmcreg))
-               return PTR_ERR(pmcreg);
+
+       at91_pmc_backup_suspend = of_iomap(np, 0);
+       if (!at91_pmc_backup_suspend) {
+               pr_warn("%s(): unable to map securam\n", __func__);
+               return -ENOMEM;
+       }
 
        register_syscore_ops(&pmc_syscore_ops);
 
index a49076c..3a1bf61 100644 (file)
@@ -13,6 +13,8 @@
 #include <linux/regmap.h>
 #include <linux/spinlock.h>
 
+#include <dt-bindings/clock/at91.h>
+
 extern spinlock_t pmc_pcr_lock;
 
 struct pmc_data {
@@ -98,6 +100,20 @@ struct clk_pcr_layout {
        u32 pid_mask;
 };
 
+/**
+ * struct at91_clk_pms - Power management state for AT91 clock
+ * @rate: clock rate
+ * @parent_rate: clock parent rate
+ * @status: clock status (enabled or disabled)
+ * @parent: clock parent index
+ */
+struct at91_clk_pms {
+       unsigned long rate;
+       unsigned long parent_rate;
+       unsigned int status;
+       unsigned int parent;
+};
+
 #define field_get(_mask, _reg) (((_reg) & (_mask)) >> (ffs(_mask) - 1))
 #define field_prep(_mask, _val) (((_val) << (ffs(_mask) - 1)) & (_mask))
 
@@ -166,7 +182,7 @@ at91_clk_register_master_div(struct regmap *regmap, const char *name,
                             const char *parent_names,
                             const struct clk_master_layout *layout,
                             const struct clk_master_characteristics *characteristics,
-                            spinlock_t *lock, u32 flags);
+                            spinlock_t *lock, u32 flags, u32 safe_div);
 
 struct clk_hw * __init
 at91_clk_sama7g5_register_master(struct regmap *regmap,
@@ -198,7 +214,8 @@ struct clk_hw * __init
 sam9x60_clk_register_div_pll(struct regmap *regmap, spinlock_t *lock,
                             const char *name, const char *parent_name, u8 id,
                             const struct clk_pll_characteristics *characteristics,
-                            const struct clk_pll_layout *layout, u32 flags);
+                            const struct clk_pll_layout *layout, u32 flags,
+                            u32 safe_div);
 
 struct clk_hw * __init
 sam9x60_clk_register_frac_pll(struct regmap *regmap, spinlock_t *lock,
@@ -248,12 +265,4 @@ struct clk_hw * __init
 at91_clk_sama7g5_register_utmi(struct regmap *regmap, const char *name,
                               const char *parent_name);
 
-#ifdef CONFIG_PM
-void pmc_register_id(u8 id);
-void pmc_register_pck(u8 pck);
-#else
-static inline void pmc_register_id(u8 id) {}
-static inline void pmc_register_pck(u8 pck) {}
-#endif
-
 #endif /* __PMC_H_ */
index 5f6fa89..5c26418 100644 (file)
@@ -242,7 +242,7 @@ static void __init sam9x60_pmc_setup(struct device_node *np)
                                            * This feeds CPU. It should not
                                            * be disabled.
                                            */
-                                         CLK_IS_CRITICAL | CLK_SET_RATE_GATE);
+                                         CLK_IS_CRITICAL | CLK_SET_RATE_GATE, 0);
        if (IS_ERR(hw))
                goto err_free;
 
@@ -260,7 +260,7 @@ static void __init sam9x60_pmc_setup(struct device_node *np)
                                          &pll_div_layout,
                                          CLK_SET_RATE_GATE |
                                          CLK_SET_PARENT_GATE |
-                                         CLK_SET_RATE_PARENT);
+                                         CLK_SET_RATE_PARENT, 0);
        if (IS_ERR(hw))
                goto err_free;
 
@@ -279,7 +279,7 @@ static void __init sam9x60_pmc_setup(struct device_node *np)
        hw = at91_clk_register_master_div(regmap, "masterck_div",
                                          "masterck_pres", &sam9x60_master_layout,
                                          &mck_characteristics, &mck_lock,
-                                         CLK_SET_RATE_GATE);
+                                         CLK_SET_RATE_GATE, 0);
        if (IS_ERR(hw))
                goto err_free;
 
index 3d1f781..d027294 100644 (file)
@@ -249,7 +249,7 @@ static void __init sama5d2_pmc_setup(struct device_node *np)
                                          "masterck_pres",
                                          &at91sam9x5_master_layout,
                                          &mck_characteristics, &mck_lock,
-                                         CLK_SET_RATE_GATE);
+                                         CLK_SET_RATE_GATE, 0);
        if (IS_ERR(hw))
                goto err_free;
 
index d376257..339d0f3 100644 (file)
@@ -184,7 +184,7 @@ static void __init sama5d3_pmc_setup(struct device_node *np)
                                          "masterck_pres",
                                          &at91sam9x5_master_layout,
                                          &mck_characteristics, &mck_lock,
-                                         CLK_SET_RATE_GATE);
+                                         CLK_SET_RATE_GATE, 0);
        if (IS_ERR(hw))
                goto err_free;
 
index 5cbaac6..4af75b1 100644 (file)
@@ -199,7 +199,7 @@ static void __init sama5d4_pmc_setup(struct device_node *np)
                                          "masterck_pres",
                                          &at91sam9x5_master_layout,
                                          &mck_characteristics, &mck_lock,
-                                         CLK_SET_RATE_GATE);
+                                         CLK_SET_RATE_GATE, 0);
        if (IS_ERR(hw))
                goto err_free;
 
index cf8c079..369dfaf 100644 (file)
@@ -127,6 +127,8 @@ static const struct clk_pll_characteristics pll_characteristics = {
  * @t:         clock type
  * @f:         clock flags
  * @eid:       export index in sama7g5->chws[] array
+ * @safe_div:  intermediate divider need to be set on PRE_RATE_CHANGE
+ *             notification
  */
 static const struct {
        const char *n;
@@ -136,6 +138,7 @@ static const struct {
        unsigned long f;
        u8 t;
        u8 eid;
+       u8 safe_div;
 } sama7g5_plls[][PLL_ID_MAX] = {
        [PLL_ID_CPU] = {
                { .n = "cpupll_fracck",
@@ -156,7 +159,12 @@ static const struct {
                  .t = PLL_TYPE_DIV,
                   /* This feeds CPU. It should not be disabled. */
                  .f = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
-                 .eid = PMC_CPUPLL, },
+                 .eid = PMC_CPUPLL,
+                 /*
+                  * Safe div=15 should be safe even for switching b/w 1GHz and
+                  * 90MHz (frac pll might go up to 1.2GHz).
+                  */
+                 .safe_div = 15, },
        },
 
        [PLL_ID_SYS] = {
@@ -377,6 +385,7 @@ static const struct {
        u8 id;
 } sama7g5_periphck[] = {
        { .n = "pioA_clk",      .p = "mck0", .id = 11, },
+       { .n = "securam_clk",   .p = "mck0", .id = 18, },
        { .n = "sfr_clk",       .p = "mck1", .id = 19, },
        { .n = "hsmc_clk",      .p = "mck1", .id = 21, },
        { .n = "xdmac0_clk",    .p = "mck1", .id = 22, },
@@ -841,7 +850,7 @@ static const struct {
 
 /* MCK0 characteristics. */
 static const struct clk_master_characteristics mck0_characteristics = {
-       .output = { .min = 50000000, .max = 200000000 },
+       .output = { .min = 32768, .max = 200000000 },
        .divisors = { 1, 2, 4, 3, 5 },
        .have_div3_pres = 1,
 };
@@ -966,7 +975,8 @@ static void __init sama7g5_pmc_setup(struct device_node *np)
                                        sama7g5_plls[i][j].p, i,
                                        sama7g5_plls[i][j].c,
                                        sama7g5_plls[i][j].l,
-                                       sama7g5_plls[i][j].f);
+                                       sama7g5_plls[i][j].f,
+                                       sama7g5_plls[i][j].safe_div);
                                break;
 
                        default:
@@ -982,18 +992,9 @@ static void __init sama7g5_pmc_setup(struct device_node *np)
        }
 
        parent_names[0] = "cpupll_divpmcck";
-       hw = at91_clk_register_master_pres(regmap, "cpuck", 1, parent_names,
-                                          &mck0_layout, &mck0_characteristics,
-                                          &pmc_mck0_lock,
-                                          CLK_SET_RATE_PARENT, 0);
-       if (IS_ERR(hw))
-               goto err_free;
-
-       sama7g5_pmc->chws[PMC_CPU] = hw;
-
-       hw = at91_clk_register_master_div(regmap, "mck0", "cpuck",
+       hw = at91_clk_register_master_div(regmap, "mck0", "cpupll_divpmcck",
                                          &mck0_layout, &mck0_characteristics,
-                                         &pmc_mck0_lock, 0);
+                                         &pmc_mck0_lock, CLK_GET_RATE_NOCACHE, 5);
        if (IS_ERR(hw))
                goto err_free;
 
index 510a996..c04ae0e 100644 (file)
@@ -42,6 +42,29 @@ static unsigned long clk_composite_recalc_rate(struct clk_hw *hw,
        return rate_ops->recalc_rate(rate_hw, parent_rate);
 }
 
+static int clk_composite_determine_rate_for_parent(struct clk_hw *rate_hw,
+                                                  struct clk_rate_request *req,
+                                                  struct clk_hw *parent_hw,
+                                                  const struct clk_ops *rate_ops)
+{
+       long rate;
+
+       req->best_parent_hw = parent_hw;
+       req->best_parent_rate = clk_hw_get_rate(parent_hw);
+
+       if (rate_ops->determine_rate)
+               return rate_ops->determine_rate(rate_hw, req);
+
+       rate = rate_ops->round_rate(rate_hw, req->rate,
+                                   &req->best_parent_rate);
+       if (rate < 0)
+               return rate;
+
+       req->rate = rate;
+
+       return 0;
+}
+
 static int clk_composite_determine_rate(struct clk_hw *hw,
                                        struct clk_rate_request *req)
 {
@@ -51,51 +74,56 @@ static int clk_composite_determine_rate(struct clk_hw *hw,
        struct clk_hw *rate_hw = composite->rate_hw;
        struct clk_hw *mux_hw = composite->mux_hw;
        struct clk_hw *parent;
-       unsigned long parent_rate;
-       long tmp_rate, best_rate = 0;
        unsigned long rate_diff;
        unsigned long best_rate_diff = ULONG_MAX;
-       long rate;
-       int i;
+       unsigned long best_rate = 0;
+       int i, ret;
 
-       if (rate_hw && rate_ops && rate_ops->round_rate &&
+       if (rate_hw && rate_ops &&
+           (rate_ops->determine_rate || rate_ops->round_rate) &&
            mux_hw && mux_ops && mux_ops->set_parent) {
                req->best_parent_hw = NULL;
 
                if (clk_hw_get_flags(hw) & CLK_SET_RATE_NO_REPARENT) {
+                       struct clk_rate_request tmp_req = *req;
+
                        parent = clk_hw_get_parent(mux_hw);
-                       req->best_parent_hw = parent;
-                       req->best_parent_rate = clk_hw_get_rate(parent);
 
-                       rate = rate_ops->round_rate(rate_hw, req->rate,
-                                                   &req->best_parent_rate);
-                       if (rate < 0)
-                               return rate;
+                       ret = clk_composite_determine_rate_for_parent(rate_hw,
+                                                                     &tmp_req,
+                                                                     parent,
+                                                                     rate_ops);
+                       if (ret)
+                               return ret;
+
+                       req->rate = tmp_req.rate;
+                       req->best_parent_rate = tmp_req.best_parent_rate;
 
-                       req->rate = rate;
                        return 0;
                }
 
                for (i = 0; i < clk_hw_get_num_parents(mux_hw); i++) {
+                       struct clk_rate_request tmp_req = *req;
+
                        parent = clk_hw_get_parent_by_index(mux_hw, i);
                        if (!parent)
                                continue;
 
-                       parent_rate = clk_hw_get_rate(parent);
-
-                       tmp_rate = rate_ops->round_rate(rate_hw, req->rate,
-                                                       &parent_rate);
-                       if (tmp_rate < 0)
+                       ret = clk_composite_determine_rate_for_parent(rate_hw,
+                                                                     &tmp_req,
+                                                                     parent,
+                                                                     rate_ops);
+                       if (ret)
                                continue;
 
-                       rate_diff = abs(req->rate - tmp_rate);
+                       rate_diff = abs(req->rate - tmp_req.rate);
 
                        if (!rate_diff || !req->best_parent_hw
                                       || best_rate_diff > rate_diff) {
                                req->best_parent_hw = parent;
-                               req->best_parent_rate = parent_rate;
+                               req->best_parent_rate = tmp_req.best_parent_rate;
                                best_rate_diff = rate_diff;
-                               best_rate = tmp_rate;
+                               best_rate = tmp_req.rate;
                        }
 
                        if (!rate_diff)
@@ -362,6 +390,7 @@ struct clk *clk_register_composite(struct device *dev, const char *name,
                return ERR_CAST(hw);
        return hw->clk;
 }
+EXPORT_SYMBOL_GPL(clk_register_composite);
 
 struct clk *clk_register_composite_pdata(struct device *dev, const char *name,
                        const struct clk_parent_data *parent_data,
index 65508eb..f467d63 100644 (file)
@@ -3108,7 +3108,10 @@ static int clk_rate_get(void *data, u64 *val)
 {
        struct clk_core *core = data;
 
-       *val = core->rate;
+       clk_prepare_lock();
+       *val = clk_core_get_rate_recalc(core);
+       clk_prepare_unlock();
+
        return 0;
 }
 
index 47d9ec3..c08edbd 100644 (file)
@@ -98,3 +98,10 @@ config CLK_IMX8QXP
        select MXC_CLK_SCU
        help
          Build the driver for IMX8QXP SCU based clocks.
+
+config CLK_IMX8ULP
+       tristate "IMX8ULP CCM Clock Driver"
+       depends on ARCH_MXC || COMPILE_TEST
+       select MXC_CLK
+       help
+           Build the driver for i.MX8ULP CCM Clock Driver
index c24a2ac..b5e0400 100644 (file)
@@ -31,6 +31,8 @@ clk-imx-scu-$(CONFIG_CLK_IMX8QXP) += clk-scu.o clk-imx8qxp.o \
                                     clk-imx8qxp-rsrc.o clk-imx8qm-rsrc.o
 clk-imx-lpcg-scu-$(CONFIG_CLK_IMX8QXP) += clk-lpcg-scu.o clk-imx8qxp-lpcg.o
 
+obj-$(CONFIG_CLK_IMX8ULP) += clk-imx8ulp.o
+
 obj-$(CONFIG_CLK_IMX1)   += clk-imx1.o
 obj-$(CONFIG_CLK_IMX25)  += clk-imx25.o
 obj-$(CONFIG_CLK_IMX27)  += clk-imx27.o
index d85ba78..4eedd45 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/bits.h>
 #include <linux/clk-provider.h>
 #include <linux/err.h>
+#include <linux/io.h>
 #include <linux/slab.h>
 
 #include "../clk-fractional-divider.h"
 #define PCG_PCD_WIDTH  3
 #define PCG_PCD_MASK   0x7
 
-struct clk_hw *imx7ulp_clk_hw_composite(const char *name,
+#define SW_RST         BIT(28)
+
+static int pcc_gate_enable(struct clk_hw *hw)
+{
+       struct clk_gate *gate = to_clk_gate(hw);
+       unsigned long flags;
+       u32 val;
+       int ret;
+
+       ret = clk_gate_ops.enable(hw);
+       if (ret)
+               return ret;
+
+       spin_lock_irqsave(gate->lock, flags);
+       /*
+        * release the sw reset for peripherals associated with
+        * with this pcc clock.
+        */
+       val = readl(gate->reg);
+       val |= SW_RST;
+       writel(val, gate->reg);
+
+       spin_unlock_irqrestore(gate->lock, flags);
+
+       return 0;
+}
+
+static void pcc_gate_disable(struct clk_hw *hw)
+{
+       clk_gate_ops.disable(hw);
+}
+
+static int pcc_gate_is_enabled(struct clk_hw *hw)
+{
+       return clk_gate_ops.is_enabled(hw);
+}
+
+static const struct clk_ops pcc_gate_ops = {
+       .enable = pcc_gate_enable,
+       .disable = pcc_gate_disable,
+       .is_enabled = pcc_gate_is_enabled,
+};
+
+static struct clk_hw *imx_ulp_clk_hw_composite(const char *name,
                                     const char * const *parent_names,
                                     int num_parents, bool mux_present,
                                     bool rate_present, bool gate_present,
-                                    void __iomem *reg)
+                                    void __iomem *reg, bool has_swrst)
 {
        struct clk_hw *mux_hw = NULL, *fd_hw = NULL, *gate_hw = NULL;
        struct clk_fractional_divider *fd = NULL;
        struct clk_gate *gate = NULL;
        struct clk_mux *mux = NULL;
        struct clk_hw *hw;
+       u32 val;
 
        if (mux_present) {
                mux = kzalloc(sizeof(*mux), GFP_KERNEL);
@@ -43,6 +88,8 @@ struct clk_hw *imx7ulp_clk_hw_composite(const char *name,
                mux->reg = reg;
                mux->shift = PCG_PCS_SHIFT;
                mux->mask = PCG_PCS_MASK;
+               if (has_swrst)
+                       mux->lock = &imx_ccm_lock;
        }
 
        if (rate_present) {
@@ -60,6 +107,8 @@ struct clk_hw *imx7ulp_clk_hw_composite(const char *name,
                fd->nwidth = PCG_PCD_WIDTH;
                fd->nmask = PCG_PCD_MASK;
                fd->flags = CLK_FRAC_DIVIDER_ZERO_BASED;
+               if (has_swrst)
+                       fd->lock = &imx_ccm_lock;
        }
 
        if (gate_present) {
@@ -72,13 +121,27 @@ struct clk_hw *imx7ulp_clk_hw_composite(const char *name,
                gate_hw = &gate->hw;
                gate->reg = reg;
                gate->bit_idx = PCG_CGC_SHIFT;
+               if (has_swrst)
+                       gate->lock = &imx_ccm_lock;
+               /*
+                * make sure clock is gated during clock tree initialization,
+                * the HW ONLY allow clock parent/rate changed with clock gated,
+                * during clock tree initialization, clocks could be enabled
+                * by bootloader, so the HW status will mismatch with clock tree
+                * prepare count, then clock core driver will allow parent/rate
+                * change since the prepare count is zero, but HW actually
+                * prevent the parent/rate change due to the clock is enabled.
+                */
+               val = readl_relaxed(reg);
+               val &= ~(1 << PCG_CGC_SHIFT);
+               writel_relaxed(val, reg);
        }
 
        hw = clk_hw_register_composite(NULL, name, parent_names, num_parents,
                                       mux_hw, &clk_mux_ops, fd_hw,
                                       &clk_fractional_divider_ops, gate_hw,
-                                      &clk_gate_ops, CLK_SET_RATE_GATE |
-                                      CLK_SET_PARENT_GATE);
+                                      has_swrst ? &pcc_gate_ops : &clk_gate_ops, CLK_SET_RATE_GATE |
+                                      CLK_SET_PARENT_GATE | CLK_SET_RATE_NO_REPARENT);
        if (IS_ERR(hw)) {
                kfree(mux);
                kfree(fd);
@@ -87,3 +150,20 @@ struct clk_hw *imx7ulp_clk_hw_composite(const char *name,
 
        return hw;
 }
+
+struct clk_hw *imx7ulp_clk_hw_composite(const char *name, const char * const *parent_names,
+                               int num_parents, bool mux_present, bool rate_present,
+                               bool gate_present, void __iomem *reg)
+{
+       return imx_ulp_clk_hw_composite(name, parent_names, num_parents, mux_present, rate_present,
+                                       gate_present, reg, false);
+}
+
+struct clk_hw *imx8ulp_clk_hw_composite(const char *name, const char * const *parent_names,
+                               int num_parents, bool mux_present, bool rate_present,
+                               bool gate_present, void __iomem *reg, bool has_swrst)
+{
+       return imx_ulp_clk_hw_composite(name, parent_names, num_parents, mux_present, rate_present,
+                                       gate_present, reg, has_swrst);
+}
+EXPORT_SYMBOL_GPL(imx8ulp_clk_hw_composite);
index 04e7285..2dfd614 100644 (file)
@@ -171,7 +171,7 @@ static const struct clk_ops imx8m_clk_composite_mux_ops = {
        .determine_rate = imx8m_clk_composite_mux_determine_rate,
 };
 
-struct clk_hw *imx8m_clk_hw_composite_flags(const char *name,
+struct clk_hw *__imx8m_clk_hw_composite(const char *name,
                                        const char * const *parent_names,
                                        int num_parents, void __iomem *reg,
                                        u32 composite_flags,
@@ -246,4 +246,4 @@ fail:
        kfree(mux);
        return ERR_CAST(hw);
 }
-EXPORT_SYMBOL_GPL(imx8m_clk_hw_composite_flags);
+EXPORT_SYMBOL_GPL(__imx8m_clk_hw_composite);
index 5dbb6a9..520b100 100644 (file)
@@ -161,7 +161,6 @@ static void __init imx6ul_clocks_init(struct device_node *ccm_node)
        hws[IMX6UL_PLL5_BYPASS] = imx_clk_hw_mux_flags("pll5_bypass", base + 0xa0, 16, 1, pll5_bypass_sels, ARRAY_SIZE(pll5_bypass_sels), CLK_SET_RATE_PARENT);
        hws[IMX6UL_PLL6_BYPASS] = imx_clk_hw_mux_flags("pll6_bypass", base + 0xe0, 16, 1, pll6_bypass_sels, ARRAY_SIZE(pll6_bypass_sels), CLK_SET_RATE_PARENT);
        hws[IMX6UL_PLL7_BYPASS] = imx_clk_hw_mux_flags("pll7_bypass", base + 0x20, 16, 1, pll7_bypass_sels, ARRAY_SIZE(pll7_bypass_sels), CLK_SET_RATE_PARENT);
-       hws[IMX6UL_CLK_CSI_SEL] = imx_clk_hw_mux_flags("csi_sel", base + 0x3c, 9, 2, csi_sels, ARRAY_SIZE(csi_sels), CLK_SET_RATE_PARENT);
 
        /* Do not bypass PLLs initially */
        clk_set_parent(hws[IMX6UL_PLL1_BYPASS]->clk, hws[IMX6UL_CLK_PLL1]->clk);
@@ -270,6 +269,7 @@ static void __init imx6ul_clocks_init(struct device_node *ccm_node)
        hws[IMX6UL_CLK_ECSPI_SEL]         = imx_clk_hw_mux("ecspi_sel", base + 0x38, 18, 1, ecspi_sels, ARRAY_SIZE(ecspi_sels));
        hws[IMX6UL_CLK_LCDIF_PRE_SEL]     = imx_clk_hw_mux_flags("lcdif_pre_sel", base + 0x38, 15, 3, lcdif_pre_sels, ARRAY_SIZE(lcdif_pre_sels), CLK_SET_RATE_PARENT);
        hws[IMX6UL_CLK_LCDIF_SEL]         = imx_clk_hw_mux("lcdif_sel", base + 0x38, 9, 3, lcdif_sels, ARRAY_SIZE(lcdif_sels));
+       hws[IMX6UL_CLK_CSI_SEL]           = imx_clk_hw_mux("csi_sel", base + 0x3c, 9, 2, csi_sels, ARRAY_SIZE(csi_sels));
 
        hws[IMX6UL_CLK_LDB_DI0_DIV_SEL]  = imx_clk_hw_mux("ldb_di0", base + 0x20, 10, 1, ldb_di0_div_sels, ARRAY_SIZE(ldb_di0_div_sels));
        hws[IMX6UL_CLK_LDB_DI1_DIV_SEL]  = imx_clk_hw_mux("ldb_di1", base + 0x20, 11, 1, ldb_di1_div_sels, ARRAY_SIZE(ldb_di1_div_sels));
@@ -380,7 +380,6 @@ static void __init imx6ul_clocks_init(struct device_node *ccm_node)
                hws[IMX6ULL_CLK_ESAI_IPG]       = imx_clk_hw_gate2_shared("esai_ipg",   "ahb",          base + 0x70,    0, &share_count_esai);
                hws[IMX6ULL_CLK_ESAI_MEM]       = imx_clk_hw_gate2_shared("esai_mem",   "ahb",          base + 0x70,    0, &share_count_esai);
        }
-       hws[IMX6UL_CLK_CSI]             = imx_clk_hw_gate2("csi",               "csi_podf",             base + 0x70,    2);
        hws[IMX6UL_CLK_I2C1]            = imx_clk_hw_gate2("i2c1",              "perclk",       base + 0x70,    6);
        hws[IMX6UL_CLK_I2C2]            = imx_clk_hw_gate2("i2c2",              "perclk",       base + 0x70,    8);
        hws[IMX6UL_CLK_I2C3]            = imx_clk_hw_gate2("i2c3",              "perclk",       base + 0x70,    10);
@@ -391,6 +390,12 @@ static void __init imx6ul_clocks_init(struct device_node *ccm_node)
        hws[IMX6UL_CLK_PXP]             = imx_clk_hw_gate2("pxp",               "axi",          base + 0x70,    30);
 
        /* CCGR3 */
+       /*
+        * Although the imx6ull reference manual lists CCGR2 as the csi clk
+        * gate register, tests have shown that it is actually the CCGR3
+        * register bit 0/1, same as for the imx6ul.
+        */
+       hws[IMX6UL_CLK_CSI]             = imx_clk_hw_gate2("csi",       "csi_podf",     base + 0x74,    0);
        hws[IMX6UL_CLK_UART5_IPG]       = imx_clk_hw_gate2("uart5_ipg", "ipg",          base + 0x74,    2);
        hws[IMX6UL_CLK_UART5_SERIAL]    = imx_clk_hw_gate2("uart5_serial",      "uart_podf",    base + 0x74,    2);
        if (clk_on_imx6ul()) {
index 779e091..b6e45e7 100644 (file)
@@ -78,20 +78,20 @@ static void __init imx7ulp_clk_scg1_init(struct device_node *np)
        hws[IMX7ULP_CLK_SPLL_PRE_DIV]   = imx_clk_hw_divider_flags("spll_pre_div", "spll_pre_sel", base + 0x608,        8,      3,      CLK_SET_RATE_GATE);
 
        /*                                              name     parent_name     base */
-       hws[IMX7ULP_CLK_APLL]           = imx_clk_hw_pllv4("apll",  "apll_pre_div", base + 0x500);
-       hws[IMX7ULP_CLK_SPLL]           = imx_clk_hw_pllv4("spll",  "spll_pre_div", base + 0x600);
+       hws[IMX7ULP_CLK_APLL]           = imx_clk_hw_pllv4(IMX_PLLV4_IMX7ULP, "apll",  "apll_pre_div", base + 0x500);
+       hws[IMX7ULP_CLK_SPLL]           = imx_clk_hw_pllv4(IMX_PLLV4_IMX7ULP, "spll",  "spll_pre_div", base + 0x600);
 
        /* APLL PFDs */
-       hws[IMX7ULP_CLK_APLL_PFD0]      = imx_clk_hw_pfdv2("apll_pfd0", "apll", base + 0x50c, 0);
-       hws[IMX7ULP_CLK_APLL_PFD1]      = imx_clk_hw_pfdv2("apll_pfd1", "apll", base + 0x50c, 1);
-       hws[IMX7ULP_CLK_APLL_PFD2]      = imx_clk_hw_pfdv2("apll_pfd2", "apll", base + 0x50c, 2);
-       hws[IMX7ULP_CLK_APLL_PFD3]      = imx_clk_hw_pfdv2("apll_pfd3", "apll", base + 0x50c, 3);
+       hws[IMX7ULP_CLK_APLL_PFD0]      = imx_clk_hw_pfdv2(IMX_PFDV2_IMX7ULP, "apll_pfd0", "apll", base + 0x50c, 0);
+       hws[IMX7ULP_CLK_APLL_PFD1]      = imx_clk_hw_pfdv2(IMX_PFDV2_IMX7ULP, "apll_pfd1", "apll", base + 0x50c, 1);
+       hws[IMX7ULP_CLK_APLL_PFD2]      = imx_clk_hw_pfdv2(IMX_PFDV2_IMX7ULP, "apll_pfd2", "apll", base + 0x50c, 2);
+       hws[IMX7ULP_CLK_APLL_PFD3]      = imx_clk_hw_pfdv2(IMX_PFDV2_IMX7ULP, "apll_pfd3", "apll", base + 0x50c, 3);
 
        /* SPLL PFDs */
-       hws[IMX7ULP_CLK_SPLL_PFD0]      = imx_clk_hw_pfdv2("spll_pfd0", "spll", base + 0x60C, 0);
-       hws[IMX7ULP_CLK_SPLL_PFD1]      = imx_clk_hw_pfdv2("spll_pfd1", "spll", base + 0x60C, 1);
-       hws[IMX7ULP_CLK_SPLL_PFD2]      = imx_clk_hw_pfdv2("spll_pfd2", "spll", base + 0x60C, 2);
-       hws[IMX7ULP_CLK_SPLL_PFD3]      = imx_clk_hw_pfdv2("spll_pfd3", "spll", base + 0x60C, 3);
+       hws[IMX7ULP_CLK_SPLL_PFD0]      = imx_clk_hw_pfdv2(IMX_PFDV2_IMX7ULP, "spll_pfd0", "spll", base + 0x60C, 0);
+       hws[IMX7ULP_CLK_SPLL_PFD1]      = imx_clk_hw_pfdv2(IMX_PFDV2_IMX7ULP, "spll_pfd1", "spll", base + 0x60C, 1);
+       hws[IMX7ULP_CLK_SPLL_PFD2]      = imx_clk_hw_pfdv2(IMX_PFDV2_IMX7ULP, "spll_pfd2", "spll", base + 0x60C, 2);
+       hws[IMX7ULP_CLK_SPLL_PFD3]      = imx_clk_hw_pfdv2(IMX_PFDV2_IMX7ULP, "spll_pfd3", "spll", base + 0x60C, 3);
 
        /* PLL Mux */
        hws[IMX7ULP_CLK_APLL_PFD_SEL]   = imx_clk_hw_mux_flags("apll_pfd_sel", base + 0x508, 14, 2, apll_pfd_sels, ARRAY_SIZE(apll_pfd_sels), CLK_SET_RATE_PARENT | CLK_SET_PARENT_GATE);
diff --git a/drivers/clk/imx/clk-imx8ulp.c b/drivers/clk/imx/clk-imx8ulp.c
new file mode 100644 (file)
index 0000000..6699437
--- /dev/null
@@ -0,0 +1,569 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2021 NXP
+ */
+
+#include <dt-bindings/clock/imx8ulp-clock.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/reset-controller.h>
+#include <linux/slab.h>
+
+#include "clk.h"
+
+static const char * const pll_pre_sels[] = { "sosc", "frosc", };
+static const char * const a35_sels[] = { "frosc", "spll2", "sosc", "lvds", };
+static const char * const nic_sels[] = { "frosc", "spll3_pfd0", "sosc", "lvds", };
+static const char * const pcc3_periph_bus_sels[] = { "dummy", "lposc", "sosc_div2",
+                                                    "frosc_div2", "xbar_divbus", "spll3_pfd1_div1",
+                                                    "spll3_pfd0_div2", "spll3_pfd0_div1", };
+static const char * const pcc4_periph_bus_sels[] = { "dummy", "dummy", "lposc",
+                                                    "sosc_div2", "frosc_div2", "xbar_divbus",
+                                                    "spll3_vcodiv", "spll3_pfd0_div1", };
+static const char * const pcc4_periph_plat_sels[] = { "dummy", "sosc_div1", "frosc_div1",
+                                                     "spll3_pfd3_div2", "spll3_pfd3_div1",
+                                                     "spll3_pfd2_div2", "spll3_pfd2_div1",
+                                                     "spll3_pfd1_div2", };
+static const char * const pcc5_periph_bus_sels[] = { "dummy", "dummy", "lposc",
+                                                    "sosc_div2", "frosc_div2", "lpav_bus_clk",
+                                                    "pll4_vcodiv", "pll4_pfd3_div1", };
+static const char * const pcc5_periph_plat_sels[] = { "dummy", "pll4_pfd3_div2", "pll4_pfd2_div2",
+                                                     "pll4_pfd2_div1", "pll4_pfd1_div2",
+                                                     "pll4_pfd1_div1", "pll4_pfd0_div2",
+                                                     "pll4_pfd0_div1", };
+static const char * const hifi_sels[] = { "frosc", "pll4", "pll4_pfd0", "sosc",
+                                        "lvds", "dummy", "dummy", "dummy", };
+static const char * const ddr_sels[] = { "frosc", "pll4_pfd1", "sosc", "lvds",
+                                        "pll4", "pll4", "pll4", "pll4", };
+static const char * const lpav_sels[] = { "frosc", "pll4_pfd1", "sosc", "lvds", };
+static const char * const sai45_sels[] = { "spll3_pfd1_div1", "aud_clk1", "aud_clk2", "sosc", };
+static const char * const sai67_sels[] = { "spll1_pfd2_div", "spll3_pfd1_div1", "aud_clk0", "aud_clk1", "aud_clk2", "sosc", "dummy", "dummy", };
+static const char * const aud_clk1_sels[] = { "ext_aud_mclk2", "sai4_rx_bclk", "sai4_tx_bclk", "sai5_rx_bclk", "sai5_tx_bclk", "dummy", "dummy", "dummy", };
+static const char * const aud_clk2_sels[] = { "ext_aud_mclk3", "sai6_rx_bclk", "sai6_tx_bclk", "sai7_rx_bclk", "sai7_tx_bclk", "spdif_rx", "dummy", "dummy", };
+static const char * const enet_ts_sels[] = { "ext_rmii_clk", "ext_ts_clk", "rosc", "ext_aud_mclk", "sosc", "dummy", "dummy", "dummy"};
+static const char * const xbar_divbus[] = { "xbar_divbus" };
+static const char * const nic_per_divplat[] = { "nic_per_divplat" };
+static const char * const lpav_axi_div[] = { "lpav_axi_div" };
+static const char * const lpav_bus_div[] = { "lpav_bus_div" };
+
+struct pcc_reset_dev {
+       void __iomem *base;
+       struct reset_controller_dev rcdev;
+       const u32 *resets;
+       /* Set to imx_ccm_lock to protect register access shared with clock control */
+       spinlock_t *lock;
+};
+
+#define PCC_SW_RST     BIT(28)
+#define to_pcc_reset_dev(_rcdev)       container_of(_rcdev, struct pcc_reset_dev, rcdev)
+
+static const u32 pcc3_resets[] = {
+       0xa8, 0xac, 0xc8, 0xcc, 0xd0,
+       0xd4, 0xd8, 0xdc, 0xe0, 0xe4,
+       0xe8, 0xec, 0xf0
+};
+
+static const u32 pcc4_resets[] = {
+       0x4, 0x8, 0xc, 0x10, 0x14,
+       0x18, 0x1c, 0x20, 0x24, 0x34,
+       0x38, 0x3c, 0x40, 0x44, 0x48,
+       0x4c, 0x54
+};
+
+static const u32 pcc5_resets[] = {
+       0xa0, 0xa4, 0xa8, 0xac, 0xb0,
+       0xb4, 0xbc, 0xc0, 0xc8, 0xcc,
+       0xd0, 0xf0, 0xf4, 0xf8
+};
+
+static int imx8ulp_pcc_assert(struct reset_controller_dev *rcdev, unsigned long id)
+{
+       struct pcc_reset_dev *pcc_reset = to_pcc_reset_dev(rcdev);
+       u32 offset = pcc_reset->resets[id];
+       unsigned long flags;
+       u32 val;
+
+       spin_lock_irqsave(pcc_reset->lock, flags);
+
+       val = readl(pcc_reset->base + offset);
+       val &= ~PCC_SW_RST;
+       writel(val, pcc_reset->base + offset);
+
+       spin_unlock_irqrestore(pcc_reset->lock, flags);
+
+       return 0;
+}
+
+static int imx8ulp_pcc_deassert(struct reset_controller_dev *rcdev, unsigned long id)
+{
+       struct pcc_reset_dev *pcc_reset = to_pcc_reset_dev(rcdev);
+       u32 offset = pcc_reset->resets[id];
+       unsigned long flags;
+       u32 val;
+
+       spin_lock_irqsave(pcc_reset->lock, flags);
+
+       val = readl(pcc_reset->base + offset);
+       val |= PCC_SW_RST;
+       writel(val, pcc_reset->base + offset);
+
+       spin_unlock_irqrestore(pcc_reset->lock, flags);
+
+       return 0;
+}
+
+static const struct reset_control_ops imx8ulp_pcc_reset_ops = {
+       .assert = imx8ulp_pcc_assert,
+       .deassert = imx8ulp_pcc_deassert,
+};
+
+static int imx8ulp_pcc_reset_init(struct platform_device *pdev, void __iomem *base,
+        const u32 *resets, unsigned int nr_resets)
+{
+       struct device_node *np = pdev->dev.of_node;
+       struct device *dev = &pdev->dev;
+       struct pcc_reset_dev *pcc_reset;
+
+       pcc_reset = devm_kzalloc(dev, sizeof(*pcc_reset), GFP_KERNEL);
+       if (!pcc_reset)
+               return -ENOMEM;
+
+       pcc_reset->base = base;
+       pcc_reset->lock = &imx_ccm_lock;
+       pcc_reset->resets = resets;
+       pcc_reset->rcdev.owner = THIS_MODULE;
+       pcc_reset->rcdev.nr_resets = nr_resets;
+       pcc_reset->rcdev.ops = &imx8ulp_pcc_reset_ops;
+       pcc_reset->rcdev.of_node = np;
+
+       return devm_reset_controller_register(dev, &pcc_reset->rcdev);
+}
+
+static int imx8ulp_clk_cgc1_init(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct clk_hw_onecell_data *clk_data;
+       struct clk_hw **clks;
+       void __iomem *base;
+
+       clk_data = devm_kzalloc(dev, struct_size(clk_data, hws, IMX8ULP_CLK_CGC1_END),
+                          GFP_KERNEL);
+       if (!clk_data)
+               return -ENOMEM;
+
+       clk_data->num = IMX8ULP_CLK_CGC1_END;
+       clks = clk_data->hws;
+
+       clks[IMX8ULP_CLK_DUMMY] = imx_clk_hw_fixed("dummy", 0);
+
+       /* CGC1 */
+       base = devm_platform_ioremap_resource(pdev, 0);
+       if (WARN_ON(IS_ERR(base)))
+               return PTR_ERR(base);
+
+       clks[IMX8ULP_CLK_SPLL2_PRE_SEL] = imx_clk_hw_mux_flags("spll2_pre_sel", base + 0x510, 0, 1, pll_pre_sels, ARRAY_SIZE(pll_pre_sels), CLK_SET_PARENT_GATE);
+       clks[IMX8ULP_CLK_SPLL3_PRE_SEL] = imx_clk_hw_mux_flags("spll3_pre_sel", base + 0x610, 0, 1, pll_pre_sels, ARRAY_SIZE(pll_pre_sels), CLK_SET_PARENT_GATE);
+
+       clks[IMX8ULP_CLK_SPLL2] = imx_clk_hw_pllv4(IMX_PLLV4_IMX8ULP, "spll2", "spll2_pre_sel", base + 0x500);
+       clks[IMX8ULP_CLK_SPLL3] = imx_clk_hw_pllv4(IMX_PLLV4_IMX8ULP, "spll3", "spll3_pre_sel", base + 0x600);
+       clks[IMX8ULP_CLK_SPLL3_VCODIV] = imx_clk_hw_divider("spll3_vcodiv", "spll3", base + 0x604, 0, 6);
+
+       clks[IMX8ULP_CLK_SPLL3_PFD0] = imx_clk_hw_pfdv2(IMX_PFDV2_IMX8ULP, "spll3_pfd0", "spll3_vcodiv", base + 0x614, 0);
+       clks[IMX8ULP_CLK_SPLL3_PFD1] = imx_clk_hw_pfdv2(IMX_PFDV2_IMX8ULP, "spll3_pfd1", "spll3_vcodiv", base + 0x614, 1);
+       clks[IMX8ULP_CLK_SPLL3_PFD2] = imx_clk_hw_pfdv2(IMX_PFDV2_IMX8ULP, "spll3_pfd2", "spll3_vcodiv", base + 0x614, 2);
+       clks[IMX8ULP_CLK_SPLL3_PFD3] = imx_clk_hw_pfdv2(IMX_PFDV2_IMX8ULP, "spll3_pfd3", "spll3_vcodiv", base + 0x614, 3);
+
+       clks[IMX8ULP_CLK_SPLL3_PFD0_DIV1_GATE] = imx_clk_hw_gate_dis("spll3_pfd0_div1_gate", "spll3_pfd0", base + 0x608, 7);
+       clks[IMX8ULP_CLK_SPLL3_PFD0_DIV2_GATE] = imx_clk_hw_gate_dis("spll3_pfd0_div2_gate", "spll3_pfd0", base + 0x608, 15);
+       clks[IMX8ULP_CLK_SPLL3_PFD1_DIV1_GATE] = imx_clk_hw_gate_dis("spll3_pfd1_div1_gate", "spll3_pfd1", base + 0x608, 23);
+       clks[IMX8ULP_CLK_SPLL3_PFD1_DIV2_GATE] = imx_clk_hw_gate_dis("spll3_pfd1_div2_gate", "spll3_pfd1", base + 0x608, 31);
+       clks[IMX8ULP_CLK_SPLL3_PFD2_DIV1_GATE] = imx_clk_hw_gate_dis("spll3_pfd2_div1_gate", "spll3_pfd2", base + 0x60c, 7);
+       clks[IMX8ULP_CLK_SPLL3_PFD2_DIV2_GATE] = imx_clk_hw_gate_dis("spll3_pfd2_div2_gate", "spll3_pfd2", base + 0x60c, 15);
+       clks[IMX8ULP_CLK_SPLL3_PFD3_DIV1_GATE] = imx_clk_hw_gate_dis("spll3_pfd3_div1_gate", "spll3_pfd3", base + 0x60c, 23);
+       clks[IMX8ULP_CLK_SPLL3_PFD3_DIV2_GATE] = imx_clk_hw_gate_dis("spll3_pfd3_div2_gate", "spll3_pfd3", base + 0x60c, 31);
+       clks[IMX8ULP_CLK_SPLL3_PFD0_DIV1] = imx_clk_hw_divider("spll3_pfd0_div1", "spll3_pfd0_div1_gate", base + 0x608, 0, 6);
+       clks[IMX8ULP_CLK_SPLL3_PFD0_DIV2] = imx_clk_hw_divider("spll3_pfd0_div2", "spll3_pfd0_div2_gate", base + 0x608, 8, 6);
+       clks[IMX8ULP_CLK_SPLL3_PFD1_DIV1] = imx_clk_hw_divider("spll3_pfd1_div1", "spll3_pfd1_div1_gate", base + 0x608, 16, 6);
+       clks[IMX8ULP_CLK_SPLL3_PFD1_DIV2] = imx_clk_hw_divider("spll3_pfd1_div2", "spll3_pfd1_div2_gate", base + 0x608, 24, 6);
+       clks[IMX8ULP_CLK_SPLL3_PFD2_DIV1] = imx_clk_hw_divider("spll3_pfd2_div1", "spll3_pfd2_div1_gate", base + 0x60c, 0, 6);
+       clks[IMX8ULP_CLK_SPLL3_PFD2_DIV2] = imx_clk_hw_divider("spll3_pfd2_div2", "spll3_pfd2_div2_gate", base + 0x60c, 8, 6);
+       clks[IMX8ULP_CLK_SPLL3_PFD3_DIV1] = imx_clk_hw_divider("spll3_pfd3_div1", "spll3_pfd3_div1_gate", base + 0x60c, 16, 6);
+       clks[IMX8ULP_CLK_SPLL3_PFD3_DIV2] = imx_clk_hw_divider("spll3_pfd3_div2", "spll3_pfd3_div2_gate", base + 0x60c, 24, 6);
+
+       clks[IMX8ULP_CLK_A35_SEL] = imx_clk_hw_mux2("a35_sel", base + 0x14, 28, 2, a35_sels, ARRAY_SIZE(a35_sels));
+       clks[IMX8ULP_CLK_A35_DIV] = imx_clk_hw_divider_flags("a35_div", "a35_sel", base + 0x14, 21, 6, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL);
+
+       clks[IMX8ULP_CLK_NIC_SEL] = imx_clk_hw_mux2("nic_sel", base + 0x34, 28, 2, nic_sels, ARRAY_SIZE(nic_sels));
+       clks[IMX8ULP_CLK_NIC_AD_DIVPLAT] = imx_clk_hw_divider_flags("nic_ad_divplat", "nic_sel", base + 0x34, 21, 6, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL);
+       clks[IMX8ULP_CLK_NIC_PER_DIVPLAT] = imx_clk_hw_divider_flags("nic_per_divplat", "nic_ad_divplat", base + 0x34, 14, 6, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL);
+       clks[IMX8ULP_CLK_XBAR_AD_DIVPLAT] = imx_clk_hw_divider_flags("xbar_ad_divplat", "nic_ad_divplat", base + 0x38, 14, 6, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL);
+       clks[IMX8ULP_CLK_XBAR_DIVBUS] = imx_clk_hw_divider_flags("xbar_divbus", "nic_ad_divplat", base + 0x38, 7, 6, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL);
+       clks[IMX8ULP_CLK_XBAR_AD_SLOW] = imx_clk_hw_divider_flags("xbar_ad_slow", "nic_ad_divplat", base + 0x38, 0, 6, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL);
+
+       clks[IMX8ULP_CLK_SOSC_DIV1_GATE] = imx_clk_hw_gate_dis("sosc_div1_gate", "sosc", base + 0x108, 7);
+       clks[IMX8ULP_CLK_SOSC_DIV2_GATE] = imx_clk_hw_gate_dis("sosc_div2_gate", "sosc", base + 0x108, 15);
+       clks[IMX8ULP_CLK_SOSC_DIV3_GATE] = imx_clk_hw_gate_dis("sosc_div3_gate", "sosc", base + 0x108, 23);
+       clks[IMX8ULP_CLK_SOSC_DIV1] = imx_clk_hw_divider("sosc_div1", "sosc_div1_gate", base + 0x108, 0, 6);
+       clks[IMX8ULP_CLK_SOSC_DIV2] = imx_clk_hw_divider("sosc_div2", "sosc_div2_gate", base + 0x108, 8, 6);
+       clks[IMX8ULP_CLK_SOSC_DIV3] = imx_clk_hw_divider("sosc_div3", "sosc_div3_gate", base + 0x108, 16, 6);
+
+       clks[IMX8ULP_CLK_FROSC_DIV1_GATE] = imx_clk_hw_gate_dis("frosc_div1_gate", "frosc", base + 0x208, 7);
+       clks[IMX8ULP_CLK_FROSC_DIV2_GATE] = imx_clk_hw_gate_dis("frosc_div2_gate", "frosc", base + 0x208, 15);
+       clks[IMX8ULP_CLK_FROSC_DIV3_GATE] = imx_clk_hw_gate_dis("frosc_div3_gate", "frosc", base + 0x208, 23);
+       clks[IMX8ULP_CLK_FROSC_DIV1] = imx_clk_hw_divider("frosc_div1", "frosc_div1_gate", base + 0x208, 0, 6);
+       clks[IMX8ULP_CLK_FROSC_DIV2] = imx_clk_hw_divider("frosc_div2", "frosc_div2_gate", base + 0x208, 8, 6);
+       clks[IMX8ULP_CLK_FROSC_DIV3] = imx_clk_hw_divider("frosc_div3", "frosc_div3_gate", base + 0x208, 16, 6);
+       clks[IMX8ULP_CLK_AUD_CLK1] = imx_clk_hw_mux2("aud_clk1", base + 0x900, 0, 3, aud_clk1_sels, ARRAY_SIZE(aud_clk1_sels));
+       clks[IMX8ULP_CLK_SAI4_SEL] = imx_clk_hw_mux2("sai4_sel", base + 0x904, 0, 2, sai45_sels, ARRAY_SIZE(sai45_sels));
+       clks[IMX8ULP_CLK_SAI5_SEL] = imx_clk_hw_mux2("sai5_sel", base + 0x904, 8, 2, sai45_sels, ARRAY_SIZE(sai45_sels));
+       clks[IMX8ULP_CLK_ENET_TS_SEL] = imx_clk_hw_mux2("enet_ts", base + 0x700, 24, 3, enet_ts_sels, ARRAY_SIZE(enet_ts_sels));
+
+       imx_check_clk_hws(clks, clk_data->num);
+
+       return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
+}
+
+static int imx8ulp_clk_cgc2_init(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct clk_hw_onecell_data *clk_data;
+       struct clk_hw **clks;
+       void __iomem *base;
+
+       clk_data = devm_kzalloc(dev, struct_size(clk_data, hws, IMX8ULP_CLK_CGC2_END),
+                          GFP_KERNEL);
+       if (!clk_data)
+               return -ENOMEM;
+
+       clk_data->num = IMX8ULP_CLK_CGC2_END;
+       clks = clk_data->hws;
+
+       /* CGC2 */
+       base = devm_platform_ioremap_resource(pdev, 0);
+       if (WARN_ON(IS_ERR(base)))
+               return PTR_ERR(base);
+
+       clks[IMX8ULP_CLK_PLL4_PRE_SEL] = imx_clk_hw_mux_flags("pll4_pre_sel", base + 0x610, 0, 1, pll_pre_sels, ARRAY_SIZE(pll_pre_sels), CLK_SET_PARENT_GATE);
+
+       clks[IMX8ULP_CLK_PLL4]  = imx_clk_hw_pllv4(IMX_PLLV4_IMX8ULP, "pll4", "pll4_pre_sel", base + 0x600);
+       clks[IMX8ULP_CLK_PLL4_VCODIV] = imx_clk_hw_divider("pll4_vcodiv", "pll4", base + 0x604, 0, 6);
+
+       clks[IMX8ULP_CLK_HIFI_SEL] = imx_clk_hw_mux_flags("hifi_sel", base + 0x14, 28, 3, hifi_sels, ARRAY_SIZE(hifi_sels), CLK_SET_PARENT_GATE);
+       clks[IMX8ULP_CLK_HIFI_DIVCORE] = imx_clk_hw_divider("hifi_core_div", "hifi_sel", base + 0x14, 21, 6);
+       clks[IMX8ULP_CLK_HIFI_DIVPLAT] = imx_clk_hw_divider("hifi_plat_div", "hifi_core_div", base + 0x14, 14, 6);
+
+       clks[IMX8ULP_CLK_DDR_SEL] = imx_clk_hw_mux_flags("ddr_sel", base + 0x40, 28, 3, ddr_sels, ARRAY_SIZE(ddr_sels), CLK_SET_PARENT_GATE);
+       clks[IMX8ULP_CLK_DDR_DIV] = imx_clk_hw_divider_flags("ddr_div", "ddr_sel", base + 0x40, 21, 6, CLK_IS_CRITICAL);
+       clks[IMX8ULP_CLK_LPAV_AXI_SEL] = imx_clk_hw_mux("lpav_sel", base + 0x3c, 28, 2, lpav_sels, ARRAY_SIZE(lpav_sels));
+       clks[IMX8ULP_CLK_LPAV_AXI_DIV] = imx_clk_hw_divider_flags("lpav_axi_div", "lpav_sel", base + 0x3c, 21, 6, CLK_IS_CRITICAL);
+       clks[IMX8ULP_CLK_LPAV_AHB_DIV] = imx_clk_hw_divider_flags("lpav_ahb_div", "lpav_axi_div", base + 0x3c, 14, 6, CLK_IS_CRITICAL);
+       clks[IMX8ULP_CLK_LPAV_BUS_DIV] = imx_clk_hw_divider_flags("lpav_bus_div", "lpav_axi_div", base + 0x3c, 7, 6, CLK_IS_CRITICAL);
+
+       clks[IMX8ULP_CLK_PLL4_PFD0] = imx_clk_hw_pfdv2(IMX_PFDV2_IMX8ULP, "pll4_pfd0", "pll4_vcodiv", base + 0x614, 0);
+       clks[IMX8ULP_CLK_PLL4_PFD1] = imx_clk_hw_pfdv2(IMX_PFDV2_IMX8ULP, "pll4_pfd1", "pll4_vcodiv", base + 0x614, 1);
+       clks[IMX8ULP_CLK_PLL4_PFD2] = imx_clk_hw_pfdv2(IMX_PFDV2_IMX8ULP, "pll4_pfd2", "pll4_vcodiv", base + 0x614, 2);
+       clks[IMX8ULP_CLK_PLL4_PFD3] = imx_clk_hw_pfdv2(IMX_PFDV2_IMX8ULP, "pll4_pfd3", "pll4_vcodiv", base + 0x614, 3);
+
+       clks[IMX8ULP_CLK_PLL4_PFD0_DIV1_GATE] = imx_clk_hw_gate_dis("pll4_pfd0_div1_gate", "pll4_pfd0", base + 0x608, 7);
+       clks[IMX8ULP_CLK_PLL4_PFD0_DIV2_GATE] = imx_clk_hw_gate_dis("pll4_pfd0_div2_gate", "pll4_pfd0", base + 0x608, 15);
+       clks[IMX8ULP_CLK_PLL4_PFD1_DIV1_GATE] = imx_clk_hw_gate_dis("pll4_pfd1_div1_gate", "pll4_pfd1", base + 0x608, 23);
+       clks[IMX8ULP_CLK_PLL4_PFD1_DIV2_GATE] = imx_clk_hw_gate_dis("pll4_pfd1_div2_gate", "pll4_pfd1", base + 0x608, 31);
+       clks[IMX8ULP_CLK_PLL4_PFD2_DIV1_GATE] = imx_clk_hw_gate_dis("pll4_pfd2_div1_gate", "pll4_pfd2", base + 0x60c, 7);
+       clks[IMX8ULP_CLK_PLL4_PFD2_DIV2_GATE] = imx_clk_hw_gate_dis("pll4_pfd2_div2_gate", "pll4_pfd2", base + 0x60c, 15);
+       clks[IMX8ULP_CLK_PLL4_PFD3_DIV1_GATE] = imx_clk_hw_gate_dis("pll4_pfd3_div1_gate", "pll4_pfd3", base + 0x60c, 23);
+       clks[IMX8ULP_CLK_PLL4_PFD3_DIV2_GATE] = imx_clk_hw_gate_dis("pll4_pfd3_div2_gate", "pll4_pfd3", base + 0x60c, 31);
+       clks[IMX8ULP_CLK_PLL4_PFD0_DIV1] = imx_clk_hw_divider("pll4_pfd0_div1", "pll4_pfd0_div1_gate", base + 0x608, 0, 6);
+       clks[IMX8ULP_CLK_PLL4_PFD0_DIV2] = imx_clk_hw_divider("pll4_pfd0_div2", "pll4_pfd0_div2_gate", base + 0x608, 8, 6);
+       clks[IMX8ULP_CLK_PLL4_PFD1_DIV1] = imx_clk_hw_divider("pll4_pfd1_div1", "pll4_pfd1_div1_gate", base + 0x608, 16, 6);
+       clks[IMX8ULP_CLK_PLL4_PFD1_DIV2] = imx_clk_hw_divider("pll4_pfd1_div2", "pll4_pfd1_div2_gate", base + 0x608, 24, 6);
+       clks[IMX8ULP_CLK_PLL4_PFD2_DIV1] = imx_clk_hw_divider("pll4_pfd2_div1", "pll4_pfd2_div1_gate", base + 0x60c, 0, 6);
+       clks[IMX8ULP_CLK_PLL4_PFD2_DIV2] = imx_clk_hw_divider("pll4_pfd2_div2", "pll4_pfd2_div2_gate", base + 0x60c, 8, 6);
+       clks[IMX8ULP_CLK_PLL4_PFD3_DIV1] = imx_clk_hw_divider("pll4_pfd3_div1", "pll4_pfd3_div1_gate", base + 0x60c, 16, 6);
+       clks[IMX8ULP_CLK_PLL4_PFD3_DIV2] = imx_clk_hw_divider("pll4_pfd3_div2", "pll4_pfd3_div2_gate", base + 0x60c, 24, 6);
+
+       clks[IMX8ULP_CLK_CGC2_SOSC_DIV1_GATE] = imx_clk_hw_gate_dis("cgc2_sosc_div1_gate", "sosc", base + 0x108, 7);
+       clks[IMX8ULP_CLK_CGC2_SOSC_DIV2_GATE] = imx_clk_hw_gate_dis("cgc2_sosc_div2_gate", "sosc", base + 0x108, 15);
+       clks[IMX8ULP_CLK_CGC2_SOSC_DIV3_GATE] = imx_clk_hw_gate_dis("cgc2_sosc_div3_gate", "sosc", base + 0x108, 23);
+       clks[IMX8ULP_CLK_CGC2_SOSC_DIV1] = imx_clk_hw_divider("cgc2_sosc_div1", "cgc2_sosc_div1_gate", base + 0x108, 0, 6);
+       clks[IMX8ULP_CLK_CGC2_SOSC_DIV2] = imx_clk_hw_divider("cgc2_sosc_div2", "cgc2_sosc_div2_gate", base + 0x108, 8, 6);
+       clks[IMX8ULP_CLK_CGC2_SOSC_DIV3] = imx_clk_hw_divider("cgc2_sosc_div3", "cgc2_sosc_div3_gate", base + 0x108, 16, 6);
+
+       clks[IMX8ULP_CLK_CGC2_FROSC_DIV1_GATE] = imx_clk_hw_gate_dis("cgc2_frosc_div1_gate", "frosc", base + 0x208, 7);
+       clks[IMX8ULP_CLK_CGC2_FROSC_DIV2_GATE] = imx_clk_hw_gate_dis("cgc2_frosc_div2_gate", "frosc", base + 0x208, 15);
+       clks[IMX8ULP_CLK_CGC2_FROSC_DIV3_GATE] = imx_clk_hw_gate_dis("cgc2_frosc_div3_gate", "frosc", base + 0x208, 23);
+       clks[IMX8ULP_CLK_CGC2_FROSC_DIV1] = imx_clk_hw_divider("cgc2_frosc_div1", "cgc2_frosc_div1_gate", base + 0x208, 0, 6);
+       clks[IMX8ULP_CLK_CGC2_FROSC_DIV2] = imx_clk_hw_divider("cgc2_frosc_div2", "cgc2_frosc_div2_gate", base + 0x208, 8, 6);
+       clks[IMX8ULP_CLK_CGC2_FROSC_DIV3] = imx_clk_hw_divider("cgc2_frosc_div3", "cgc2_frosc_div3_gate", base + 0x208, 16, 6);
+       clks[IMX8ULP_CLK_AUD_CLK2]  = imx_clk_hw_mux2("aud_clk2", base + 0x900, 0, 3, aud_clk2_sels, ARRAY_SIZE(aud_clk2_sels));
+       clks[IMX8ULP_CLK_SAI6_SEL]  = imx_clk_hw_mux2("sai6_sel", base + 0x904, 0, 3, sai67_sels, ARRAY_SIZE(sai67_sels));
+       clks[IMX8ULP_CLK_SAI7_SEL]  = imx_clk_hw_mux2("sai7_sel", base + 0x904, 8, 3, sai67_sels, ARRAY_SIZE(sai67_sels));
+       clks[IMX8ULP_CLK_SPDIF_SEL] = imx_clk_hw_mux2("spdif_sel", base + 0x910, 0, 3, sai67_sels, ARRAY_SIZE(sai67_sels));
+       clks[IMX8ULP_CLK_DSI_PHY_REF] = imx_clk_hw_fixed("dsi_phy_ref", 24000000);
+
+       imx_check_clk_hws(clks, clk_data->num);
+
+       return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
+}
+
+static int imx8ulp_clk_pcc3_init(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct clk_hw_onecell_data *clk_data;
+       struct clk_hw **clks;
+       void __iomem *base;
+       int ret;
+
+       clk_data = devm_kzalloc(dev, struct_size(clk_data, hws, IMX8ULP_CLK_PCC3_END),
+                          GFP_KERNEL);
+       if (!clk_data)
+               return -ENOMEM;
+
+       clk_data->num = IMX8ULP_CLK_PCC3_END;
+       clks = clk_data->hws;
+
+       /* PCC3 */
+       base = devm_platform_ioremap_resource(pdev, 0);
+       if (WARN_ON(IS_ERR(base)))
+               return PTR_ERR(base);
+
+       clks[IMX8ULP_CLK_WDOG3] = imx8ulp_clk_hw_composite("wdog3", pcc3_periph_bus_sels, ARRAY_SIZE(pcc3_periph_bus_sels), true, true, true, base + 0xa8, 1);
+       clks[IMX8ULP_CLK_WDOG4] = imx8ulp_clk_hw_composite("wdog4", pcc3_periph_bus_sels, ARRAY_SIZE(pcc3_periph_bus_sels), true, true, true, base + 0xac, 1);
+       clks[IMX8ULP_CLK_LPIT1] = imx8ulp_clk_hw_composite("lpit1", pcc3_periph_bus_sels, ARRAY_SIZE(pcc3_periph_bus_sels), true, true, true, base + 0xc8, 1);
+       clks[IMX8ULP_CLK_TPM4] = imx8ulp_clk_hw_composite("tpm4", pcc3_periph_bus_sels, ARRAY_SIZE(pcc3_periph_bus_sels), true, true, true, base + 0xcc, 1);
+       clks[IMX8ULP_CLK_TPM5] = imx8ulp_clk_hw_composite("tpm5", pcc3_periph_bus_sels, ARRAY_SIZE(pcc3_periph_bus_sels), true, true, true, base + 0xd0, 1);
+       clks[IMX8ULP_CLK_FLEXIO1] = imx8ulp_clk_hw_composite("flexio1", pcc3_periph_bus_sels, ARRAY_SIZE(pcc3_periph_bus_sels), true, true, true, base + 0xd4, 1);
+       clks[IMX8ULP_CLK_I3C2] = imx8ulp_clk_hw_composite("i3c2", pcc3_periph_bus_sels, ARRAY_SIZE(pcc3_periph_bus_sels), true, true, true, base + 0xd8, 1);
+       clks[IMX8ULP_CLK_LPI2C4] = imx8ulp_clk_hw_composite("lpi2c4", pcc3_periph_bus_sels, ARRAY_SIZE(pcc3_periph_bus_sels), true, true, true, base + 0xdc, 1);
+       clks[IMX8ULP_CLK_LPI2C5] = imx8ulp_clk_hw_composite("lpi2c5", pcc3_periph_bus_sels, ARRAY_SIZE(pcc3_periph_bus_sels), true, true, true, base + 0xe0, 1);
+       clks[IMX8ULP_CLK_LPUART4] = imx8ulp_clk_hw_composite("lpuart4", pcc3_periph_bus_sels, ARRAY_SIZE(pcc3_periph_bus_sels), true, true, true, base + 0xe4, 1);
+       clks[IMX8ULP_CLK_LPUART5] = imx8ulp_clk_hw_composite("lpuart5", pcc3_periph_bus_sels, ARRAY_SIZE(pcc3_periph_bus_sels), true, true, true, base + 0xe8, 1);
+       clks[IMX8ULP_CLK_LPSPI4] = imx8ulp_clk_hw_composite("lpspi4", pcc3_periph_bus_sels, ARRAY_SIZE(pcc3_periph_bus_sels), true, true, true, base + 0xec, 1);
+       clks[IMX8ULP_CLK_LPSPI5] = imx8ulp_clk_hw_composite("lpspi5", pcc3_periph_bus_sels, ARRAY_SIZE(pcc3_periph_bus_sels), true, true, true, base + 0xf0, 1);
+
+       clks[IMX8ULP_CLK_DMA1_MP] = imx_clk_hw_gate("pcc_dma1_mp", "xbar_ad_divplat", base + 0x4, 30);
+       clks[IMX8ULP_CLK_DMA1_CH0] = imx_clk_hw_gate("pcc_dma1_ch0", "xbar_ad_divplat", base + 0x8, 30);
+       clks[IMX8ULP_CLK_DMA1_CH1] = imx_clk_hw_gate("pcc_dma1_ch1", "xbar_ad_divplat", base + 0xc, 30);
+       clks[IMX8ULP_CLK_DMA1_CH2] = imx_clk_hw_gate("pcc_dma1_ch2", "xbar_ad_divplat", base + 0x10, 30);
+       clks[IMX8ULP_CLK_DMA1_CH3] = imx_clk_hw_gate("pcc_dma1_ch3", "xbar_ad_divplat", base + 0x14, 30);
+       clks[IMX8ULP_CLK_DMA1_CH4] = imx_clk_hw_gate("pcc_dma1_ch4", "xbar_ad_divplat", base + 0x18, 30);
+       clks[IMX8ULP_CLK_DMA1_CH5] = imx_clk_hw_gate("pcc_dma1_ch5", "xbar_ad_divplat", base + 0x1c, 30);
+       clks[IMX8ULP_CLK_DMA1_CH6] = imx_clk_hw_gate("pcc_dma1_ch6", "xbar_ad_divplat", base + 0x20, 30);
+       clks[IMX8ULP_CLK_DMA1_CH7] = imx_clk_hw_gate("pcc_dma1_ch7", "xbar_ad_divplat", base + 0x24, 30);
+       clks[IMX8ULP_CLK_DMA1_CH8] = imx_clk_hw_gate("pcc_dma1_ch8", "xbar_ad_divplat", base + 0x28, 30);
+       clks[IMX8ULP_CLK_DMA1_CH9] = imx_clk_hw_gate("pcc_dma1_ch9", "xbar_ad_divplat", base + 0x2c, 30);
+       clks[IMX8ULP_CLK_DMA1_CH10] = imx_clk_hw_gate("pcc_dma1_ch10", "xbar_ad_divplat", base + 0x30, 30);
+       clks[IMX8ULP_CLK_DMA1_CH11] = imx_clk_hw_gate("pcc_dma1_ch11", "xbar_ad_divplat", base + 0x34, 30);
+       clks[IMX8ULP_CLK_DMA1_CH12] = imx_clk_hw_gate("pcc_dma1_ch12", "xbar_ad_divplat", base + 0x38, 30);
+       clks[IMX8ULP_CLK_DMA1_CH13] = imx_clk_hw_gate("pcc_dma1_ch13", "xbar_ad_divplat", base + 0x3c, 30);
+       clks[IMX8ULP_CLK_DMA1_CH14] = imx_clk_hw_gate("pcc_dma1_ch14", "xbar_ad_divplat", base + 0x40, 30);
+       clks[IMX8ULP_CLK_DMA1_CH15] = imx_clk_hw_gate("pcc_dma1_ch15", "xbar_ad_divplat", base + 0x44, 30);
+       clks[IMX8ULP_CLK_DMA1_CH16] = imx_clk_hw_gate("pcc_dma1_ch16", "xbar_ad_divplat", base + 0x48, 30);
+       clks[IMX8ULP_CLK_DMA1_CH17] = imx_clk_hw_gate("pcc_dma1_ch17", "xbar_ad_divplat", base + 0x4c, 30);
+       clks[IMX8ULP_CLK_DMA1_CH18] = imx_clk_hw_gate("pcc_dma1_ch18", "xbar_ad_divplat", base + 0x50, 30);
+       clks[IMX8ULP_CLK_DMA1_CH19] = imx_clk_hw_gate("pcc_dma1_ch19", "xbar_ad_divplat", base + 0x54, 30);
+       clks[IMX8ULP_CLK_DMA1_CH20] = imx_clk_hw_gate("pcc_dma1_ch20", "xbar_ad_divplat", base + 0x58, 30);
+       clks[IMX8ULP_CLK_DMA1_CH21] = imx_clk_hw_gate("pcc_dma1_ch21", "xbar_ad_divplat", base + 0x5c, 30);
+       clks[IMX8ULP_CLK_DMA1_CH22] = imx_clk_hw_gate("pcc_dma1_ch22", "xbar_ad_divplat", base + 0x60, 30);
+       clks[IMX8ULP_CLK_DMA1_CH23] = imx_clk_hw_gate("pcc_dma1_ch23", "xbar_ad_divplat", base + 0x64, 30);
+       clks[IMX8ULP_CLK_DMA1_CH24] = imx_clk_hw_gate("pcc_dma1_ch24", "xbar_ad_divplat", base + 0x68, 30);
+       clks[IMX8ULP_CLK_DMA1_CH25] = imx_clk_hw_gate("pcc_dma1_ch25", "xbar_ad_divplat", base + 0x6c, 30);
+       clks[IMX8ULP_CLK_DMA1_CH26] = imx_clk_hw_gate("pcc_dma1_ch26", "xbar_ad_divplat", base + 0x70, 30);
+       clks[IMX8ULP_CLK_DMA1_CH27] = imx_clk_hw_gate("pcc_dma1_ch27", "xbar_ad_divplat", base + 0x74, 30);
+       clks[IMX8ULP_CLK_DMA1_CH28] = imx_clk_hw_gate("pcc_dma1_ch28", "xbar_ad_divplat", base + 0x78, 30);
+       clks[IMX8ULP_CLK_DMA1_CH29] = imx_clk_hw_gate("pcc_dma1_ch29", "xbar_ad_divplat", base + 0x7c, 30);
+       clks[IMX8ULP_CLK_DMA1_CH30] = imx_clk_hw_gate("pcc_dma1_ch30", "xbar_ad_divplat", base + 0x80, 30);
+       clks[IMX8ULP_CLK_DMA1_CH31] = imx_clk_hw_gate("pcc_dma1_ch31", "xbar_ad_divplat", base + 0x84, 30);
+       clks[IMX8ULP_CLK_MU0_B] = imx_clk_hw_gate("mu0_b", "xbar_ad_divplat", base + 0x88, 30);
+       clks[IMX8ULP_CLK_MU3_A] = imx_clk_hw_gate("mu3_a", "xbar_ad_divplat", base + 0x8c, 30);
+
+       imx_check_clk_hws(clks, clk_data->num);
+
+       ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
+       if (ret)
+               return ret;
+
+       imx_register_uart_clocks(1);
+
+       /* register the pcc3 reset controller */
+       return imx8ulp_pcc_reset_init(pdev, base, pcc3_resets, ARRAY_SIZE(pcc3_resets));
+}
+
+static int imx8ulp_clk_pcc4_init(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct clk_hw_onecell_data *clk_data;
+       struct clk_hw **clks;
+       void __iomem *base;
+       int ret;
+
+       clk_data = devm_kzalloc(dev, struct_size(clk_data, hws, IMX8ULP_CLK_PCC4_END),
+                          GFP_KERNEL);
+       if (!clk_data)
+               return -ENOMEM;
+
+       clk_data->num = IMX8ULP_CLK_PCC4_END;
+       clks = clk_data->hws;
+
+       /* PCC4 */
+       base = devm_platform_ioremap_resource(pdev, 0);
+       if (WARN_ON(IS_ERR(base)))
+               return PTR_ERR(base);
+
+       clks[IMX8ULP_CLK_FLEXSPI2] = imx8ulp_clk_hw_composite("flexspi2", pcc4_periph_plat_sels, ARRAY_SIZE(pcc4_periph_plat_sels), true, true, true, base + 0x4, 1);
+       clks[IMX8ULP_CLK_TPM6] = imx8ulp_clk_hw_composite("tpm6", pcc4_periph_bus_sels, ARRAY_SIZE(pcc4_periph_bus_sels), true, true, true, base + 0x8, 1);
+       clks[IMX8ULP_CLK_TPM7] = imx8ulp_clk_hw_composite("tpm7", pcc4_periph_bus_sels, ARRAY_SIZE(pcc4_periph_bus_sels), true, true, true, base + 0xc, 1);
+       clks[IMX8ULP_CLK_LPI2C6] = imx8ulp_clk_hw_composite("lpi2c6", pcc4_periph_bus_sels, ARRAY_SIZE(pcc4_periph_bus_sels), true, true, true, base + 0x10, 1);
+       clks[IMX8ULP_CLK_LPI2C7] = imx8ulp_clk_hw_composite("lpi2c7", pcc4_periph_bus_sels, ARRAY_SIZE(pcc4_periph_bus_sels), true, true, true, base + 0x14, 1);
+       clks[IMX8ULP_CLK_LPUART6] = imx8ulp_clk_hw_composite("lpuart6", pcc4_periph_bus_sels, ARRAY_SIZE(pcc4_periph_bus_sels), true, true, true, base + 0x18, 1);
+       clks[IMX8ULP_CLK_LPUART7] = imx8ulp_clk_hw_composite("lpuart7", pcc4_periph_bus_sels, ARRAY_SIZE(pcc4_periph_bus_sels), true, true, true, base + 0x1c, 1);
+       clks[IMX8ULP_CLK_SAI4] = imx8ulp_clk_hw_composite("sai4", xbar_divbus, 1, false, false, true, base + 0x20, 1); /* sai ipg, NOT from sai sel */
+       clks[IMX8ULP_CLK_SAI5] = imx8ulp_clk_hw_composite("sai5", xbar_divbus, 1, false, false, true, base + 0x24, 1); /* sai ipg */
+       clks[IMX8ULP_CLK_PCTLE] = imx_clk_hw_gate("pctle", "xbar_divbus", base + 0x28, 30);
+       clks[IMX8ULP_CLK_PCTLF] = imx_clk_hw_gate("pctlf", "xbar_divbus", base + 0x2c, 30);
+       clks[IMX8ULP_CLK_USDHC0] = imx8ulp_clk_hw_composite("usdhc0", pcc4_periph_plat_sels, ARRAY_SIZE(pcc4_periph_plat_sels), true, false, true, base + 0x34, 1);
+       clks[IMX8ULP_CLK_USDHC1] = imx8ulp_clk_hw_composite("usdhc1", pcc4_periph_plat_sels, ARRAY_SIZE(pcc4_periph_plat_sels), true, false, true, base + 0x38, 1);
+       clks[IMX8ULP_CLK_USDHC2] = imx8ulp_clk_hw_composite("usdhc2", pcc4_periph_plat_sels, ARRAY_SIZE(pcc4_periph_plat_sels), true, false, true, base + 0x3c, 1);
+       clks[IMX8ULP_CLK_USB0] = imx8ulp_clk_hw_composite("usb0", nic_per_divplat, 1, false, false, true, base + 0x40, 1);
+       clks[IMX8ULP_CLK_USB0_PHY] = imx8ulp_clk_hw_composite("usb0_phy", xbar_divbus, 1, false, false, true, base + 0x44, 1);
+       clks[IMX8ULP_CLK_USB1] = imx8ulp_clk_hw_composite("usb1", nic_per_divplat, 1, false, false, true, base + 0x48, 1);
+       clks[IMX8ULP_CLK_USB1_PHY] = imx8ulp_clk_hw_composite("usb1_phy", xbar_divbus, 1, false, false, true, base + 0x4c, 1);
+       clks[IMX8ULP_CLK_USB_XBAR] = imx_clk_hw_gate("usb_xbar", "xbar_divbus", base + 0x50, 30);
+       clks[IMX8ULP_CLK_ENET] = imx8ulp_clk_hw_composite("enet", nic_per_divplat, 1, false, false, true, base + 0x54, 1);
+       clks[IMX8ULP_CLK_RGPIOE] = imx_clk_hw_gate("rgpioe", "nic_per_divplat", base + 0x78, 30);
+       clks[IMX8ULP_CLK_RGPIOF] = imx_clk_hw_gate("rgpiof", "nic_per_divplat", base + 0x7c, 30);
+
+       imx_check_clk_hws(clks, clk_data->num);
+
+       ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
+       if (ret)
+               return ret;
+
+       /* register the pcc4 reset controller */
+       return imx8ulp_pcc_reset_init(pdev, base, pcc4_resets, ARRAY_SIZE(pcc4_resets));
+
+}
+
+static int imx8ulp_clk_pcc5_init(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct clk_hw_onecell_data *clk_data;
+       struct clk_hw **clks;
+       void __iomem *base;
+       int ret;
+
+       clk_data = devm_kzalloc(dev, struct_size(clk_data, hws, IMX8ULP_CLK_PCC5_END),
+                          GFP_KERNEL);
+       if (!clk_data)
+               return -ENOMEM;
+
+       clk_data->num = IMX8ULP_CLK_PCC5_END;
+       clks = clk_data->hws;
+
+       /* PCC5 */
+       base = devm_platform_ioremap_resource(pdev, 0);
+       if (WARN_ON(IS_ERR(base)))
+               return PTR_ERR(base);
+
+       clks[IMX8ULP_CLK_DMA2_MP] = imx_clk_hw_gate("pcc_dma2_mp", "lpav_axi_div", base + 0x0, 30);
+       clks[IMX8ULP_CLK_DMA2_CH0] = imx_clk_hw_gate("pcc_dma2_ch0", "lpav_axi_div", base + 0x4, 30);
+       clks[IMX8ULP_CLK_DMA2_CH1] = imx_clk_hw_gate("pcc_dma2_ch1", "lpav_axi_div", base + 0x8, 30);
+       clks[IMX8ULP_CLK_DMA2_CH2] = imx_clk_hw_gate("pcc_dma2_ch2", "lpav_axi_div", base + 0xc, 30);
+       clks[IMX8ULP_CLK_DMA2_CH3] = imx_clk_hw_gate("pcc_dma2_ch3", "lpav_axi_div", base + 0x10, 30);
+       clks[IMX8ULP_CLK_DMA2_CH4] = imx_clk_hw_gate("pcc_dma2_ch4", "lpav_axi_div", base + 0x14, 30);
+       clks[IMX8ULP_CLK_DMA2_CH5] = imx_clk_hw_gate("pcc_dma2_ch5", "lpav_axi_div", base + 0x18, 30);
+       clks[IMX8ULP_CLK_DMA2_CH6] = imx_clk_hw_gate("pcc_dma2_ch6", "lpav_axi_div", base + 0x1c, 30);
+       clks[IMX8ULP_CLK_DMA2_CH7] = imx_clk_hw_gate("pcc_dma2_ch7", "lpav_axi_div", base + 0x20, 30);
+       clks[IMX8ULP_CLK_DMA2_CH8] = imx_clk_hw_gate("pcc_dma2_ch8", "lpav_axi_div", base + 0x24, 30);
+       clks[IMX8ULP_CLK_DMA2_CH9] = imx_clk_hw_gate("pcc_dma2_ch9", "lpav_axi_div", base + 0x28, 30);
+       clks[IMX8ULP_CLK_DMA2_CH10] = imx_clk_hw_gate("pcc_dma2_ch10", "lpav_axi_div", base + 0x2c, 30);
+       clks[IMX8ULP_CLK_DMA2_CH11] = imx_clk_hw_gate("pcc_dma2_ch11", "lpav_axi_div", base + 0x30, 30);
+       clks[IMX8ULP_CLK_DMA2_CH12] = imx_clk_hw_gate("pcc_dma2_ch12", "lpav_axi_div", base + 0x34, 30);
+       clks[IMX8ULP_CLK_DMA2_CH13] = imx_clk_hw_gate("pcc_dma2_ch13", "lpav_axi_div", base + 0x38, 30);
+       clks[IMX8ULP_CLK_DMA2_CH14] = imx_clk_hw_gate("pcc_dma2_ch14", "lpav_axi_div", base + 0x3c, 30);
+       clks[IMX8ULP_CLK_DMA2_CH15] = imx_clk_hw_gate("pcc_dma2_ch15", "lpav_axi_div", base + 0x40, 30);
+       clks[IMX8ULP_CLK_DMA2_CH16] = imx_clk_hw_gate("pcc_dma2_ch16", "lpav_axi_div", base + 0x44, 30);
+       clks[IMX8ULP_CLK_DMA2_CH17] = imx_clk_hw_gate("pcc_dma2_ch17", "lpav_axi_div", base + 0x48, 30);
+       clks[IMX8ULP_CLK_DMA2_CH18] = imx_clk_hw_gate("pcc_dma2_ch18", "lpav_axi_div", base + 0x4c, 30);
+       clks[IMX8ULP_CLK_DMA2_CH19] = imx_clk_hw_gate("pcc_dma2_ch19", "lpav_axi_div", base + 0x50, 30);
+       clks[IMX8ULP_CLK_DMA2_CH20] = imx_clk_hw_gate("pcc_dma2_ch20", "lpav_axi_div", base + 0x54, 30);
+       clks[IMX8ULP_CLK_DMA2_CH21] = imx_clk_hw_gate("pcc_dma2_ch21", "lpav_axi_div", base + 0x58, 30);
+       clks[IMX8ULP_CLK_DMA2_CH22] = imx_clk_hw_gate("pcc_dma2_ch22", "lpav_axi_div", base + 0x5c, 30);
+       clks[IMX8ULP_CLK_DMA2_CH23] = imx_clk_hw_gate("pcc_dma2_ch23", "lpav_axi_div", base + 0x60, 30);
+       clks[IMX8ULP_CLK_DMA2_CH24] = imx_clk_hw_gate("pcc_dma2_ch24", "lpav_axi_div", base + 0x64, 30);
+       clks[IMX8ULP_CLK_DMA2_CH25] = imx_clk_hw_gate("pcc_dma2_ch25", "lpav_axi_div", base + 0x68, 30);
+       clks[IMX8ULP_CLK_DMA2_CH26] = imx_clk_hw_gate("pcc_dma2_ch26", "lpav_axi_div", base + 0x6c, 30);
+       clks[IMX8ULP_CLK_DMA2_CH27] = imx_clk_hw_gate("pcc_dma2_ch27", "lpav_axi_div", base + 0x70, 30);
+       clks[IMX8ULP_CLK_DMA2_CH28] = imx_clk_hw_gate("pcc_dma2_ch28", "lpav_axi_div", base + 0x74, 30);
+       clks[IMX8ULP_CLK_DMA2_CH29] = imx_clk_hw_gate("pcc_dma2_ch29", "lpav_axi_div", base + 0x78, 30);
+       clks[IMX8ULP_CLK_DMA2_CH30] = imx_clk_hw_gate("pcc_dma2_ch30", "lpav_axi_div", base + 0x7c, 30);
+       clks[IMX8ULP_CLK_DMA2_CH31] = imx_clk_hw_gate("pcc_dma2_ch31", "lpav_axi_div", base + 0x80, 30);
+
+       clks[IMX8ULP_CLK_AVD_SIM] = imx_clk_hw_gate("avd_sim", "lpav_bus_div", base + 0x94, 30);
+       clks[IMX8ULP_CLK_TPM8] = imx8ulp_clk_hw_composite("tpm8", pcc5_periph_bus_sels, ARRAY_SIZE(pcc5_periph_bus_sels), true, true, true, base + 0xa0, 1);
+       clks[IMX8ULP_CLK_MU2_B] = imx_clk_hw_gate("mu2_b", "lpav_bus_div", base + 0x84, 30);
+       clks[IMX8ULP_CLK_MU3_B] = imx_clk_hw_gate("mu3_b", "lpav_bus_div", base + 0x88, 30);
+       clks[IMX8ULP_CLK_SAI6] = imx8ulp_clk_hw_composite("sai6", lpav_bus_div, 1, false, false, true, base + 0xa4, 1);
+       clks[IMX8ULP_CLK_SAI7] = imx8ulp_clk_hw_composite("sai7", lpav_bus_div, 1, false, false, true, base + 0xa8, 1);
+       clks[IMX8ULP_CLK_SPDIF] = imx8ulp_clk_hw_composite("spdif", lpav_bus_div, 1, false, false, true, base + 0xac, 1);
+       clks[IMX8ULP_CLK_ISI] = imx8ulp_clk_hw_composite("isi", lpav_axi_div, 1, false, false, true, base + 0xb0, 1);
+       clks[IMX8ULP_CLK_CSI_REGS] = imx8ulp_clk_hw_composite("csi_regs", lpav_bus_div, 1, false, false, true, base + 0xb4, 1);
+       clks[IMX8ULP_CLK_CSI] = imx8ulp_clk_hw_composite("csi", pcc5_periph_plat_sels, ARRAY_SIZE(pcc5_periph_plat_sels), true, true, true, base + 0xbc, 1);
+       clks[IMX8ULP_CLK_DSI] = imx8ulp_clk_hw_composite("dsi", pcc5_periph_plat_sels, ARRAY_SIZE(pcc5_periph_plat_sels), true, true, true, base + 0xc0, 1);
+       clks[IMX8ULP_CLK_WDOG5] = imx8ulp_clk_hw_composite("wdog5", pcc5_periph_bus_sels, ARRAY_SIZE(pcc5_periph_bus_sels), true, true, true, base + 0xc8, 1);
+       clks[IMX8ULP_CLK_EPDC] = imx8ulp_clk_hw_composite("epdc", pcc5_periph_plat_sels, ARRAY_SIZE(pcc5_periph_plat_sels), true, true, true, base + 0xcc, 1);
+       clks[IMX8ULP_CLK_PXP] = imx8ulp_clk_hw_composite("pxp", lpav_axi_div, 1, false, false, true, base + 0xd0, 1);
+       clks[IMX8ULP_CLK_GPU2D] = imx8ulp_clk_hw_composite("gpu2d", pcc5_periph_plat_sels, ARRAY_SIZE(pcc5_periph_plat_sels), true, true, true, base + 0xf0, 1);
+       clks[IMX8ULP_CLK_GPU3D] = imx8ulp_clk_hw_composite("gpu3d", pcc5_periph_plat_sels, ARRAY_SIZE(pcc5_periph_plat_sels), true, true, true, base + 0xf4, 1);
+       clks[IMX8ULP_CLK_DC_NANO] = imx8ulp_clk_hw_composite("dc_nano", pcc5_periph_plat_sels, ARRAY_SIZE(pcc5_periph_plat_sels), true, true, true, base + 0xf8, 1);
+       clks[IMX8ULP_CLK_CSI_CLK_UI] = imx8ulp_clk_hw_composite("csi_clk_ui", pcc5_periph_plat_sels, ARRAY_SIZE(pcc5_periph_plat_sels), true, true, true, base + 0x10c, 1);
+       clks[IMX8ULP_CLK_CSI_CLK_ESC] = imx8ulp_clk_hw_composite("csi_clk_esc", pcc5_periph_plat_sels, ARRAY_SIZE(pcc5_periph_plat_sels), true, true, true, base + 0x110, 1);
+       clks[IMX8ULP_CLK_RGPIOD] = imx_clk_hw_gate("rgpiod", "lpav_axi_div", base + 0x114, 30);
+       clks[IMX8ULP_CLK_DSI_TX_ESC] = imx_clk_hw_fixed_factor("mipi_dsi_tx_esc", "dsi", 1, 4);
+
+       imx_check_clk_hws(clks, clk_data->num);
+
+       ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, clk_data);
+       if (ret)
+               return ret;
+
+       /* register the pcc5 reset controller */
+       return imx8ulp_pcc_reset_init(pdev, base, pcc5_resets, ARRAY_SIZE(pcc5_resets));
+}
+
+static int imx8ulp_clk_probe(struct platform_device *pdev)
+{
+       int (*probe)(struct platform_device *pdev);
+
+       probe = of_device_get_match_data(&pdev->dev);
+
+       if (probe)
+               return probe(pdev);
+
+       return 0;
+}
+
+static const struct of_device_id imx8ulp_clk_dt_ids[] = {
+       { .compatible = "fsl,imx8ulp-pcc3", .data = imx8ulp_clk_pcc3_init },
+       { .compatible = "fsl,imx8ulp-pcc4", .data = imx8ulp_clk_pcc4_init },
+       { .compatible = "fsl,imx8ulp-pcc5", .data = imx8ulp_clk_pcc5_init },
+       { .compatible = "fsl,imx8ulp-cgc2", .data = imx8ulp_clk_cgc2_init },
+       { .compatible = "fsl,imx8ulp-cgc1", .data = imx8ulp_clk_cgc1_init },
+       { /* sentinel */ },
+};
+MODULE_DEVICE_TABLE(of, imx8ulp_clk_dt_ids);
+
+static struct platform_driver imx8ulp_clk_driver = {
+       .probe  = imx8ulp_clk_probe,
+       .driver = {
+               .name           = KBUILD_MODNAME,
+               .of_match_table = imx8ulp_clk_dt_ids,
+       },
+};
+module_platform_driver(imx8ulp_clk_driver);
+
+MODULE_AUTHOR("Peng Fan <peng.fan@nxp.com>");
+MODULE_DESCRIPTION("NXP i.MX8ULP clock driver");
+MODULE_LICENSE("GPL v2");
index 6b744c8..6ca53a9 100644 (file)
@@ -161,8 +161,17 @@ static int clk_pfdv2_set_rate(struct clk_hw *hw, unsigned long rate,
        if (!rate)
                return -EINVAL;
 
-       /* PFD can NOT change rate without gating */
-       WARN_ON(clk_pfdv2_is_enabled(hw));
+       /*
+        * PFD can NOT change rate without gating.
+        * as the PFDs may enabled in HW by default but no
+        * consumer used it, the enable count is '0', so the
+        * 'SET_RATE_GATE' can NOT help on blocking the set_rate
+        * ops especially for 'assigned-clock-xxx'. In order
+        * to simplify the case, just disable the PFD if it is
+        * enabled in HW but not in SW.
+        */
+       if (clk_pfdv2_is_enabled(hw))
+               clk_pfdv2_disable(hw);
 
        tmp = tmp * 18 + rate / 2;
        do_div(tmp, rate);
@@ -191,8 +200,8 @@ static const struct clk_ops clk_pfdv2_ops = {
        .is_enabled     = clk_pfdv2_is_enabled,
 };
 
-struct clk_hw *imx_clk_hw_pfdv2(const char *name, const char *parent_name,
-                            void __iomem *reg, u8 idx)
+struct clk_hw *imx_clk_hw_pfdv2(enum imx_pfdv2_type type, const char *name,
+                            const char *parent_name, void __iomem *reg, u8 idx)
 {
        struct clk_init_data init;
        struct clk_pfdv2 *pfd;
@@ -214,7 +223,10 @@ struct clk_hw *imx_clk_hw_pfdv2(const char *name, const char *parent_name,
        init.ops = &clk_pfdv2_ops;
        init.parent_names = &parent_name;
        init.num_parents = 1;
-       init.flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT;
+       if (type == IMX_PFDV2_IMX7ULP)
+               init.flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT;
+       else
+               init.flags = CLK_SET_RATE_GATE;
 
        pfd->hw.init = &init;
 
@@ -227,3 +239,4 @@ struct clk_hw *imx_clk_hw_pfdv2(const char *name, const char *parent_name,
 
        return hw;
 }
+EXPORT_SYMBOL_GPL(imx_clk_hw_pfdv2);
index 8ec703f..6e7e345 100644 (file)
 
 /* PLL Configuration Register (xPLLCFG) */
 #define PLL_CFG_OFFSET         0x08
+#define IMX8ULP_PLL_CFG_OFFSET 0x10
 #define BP_PLL_MULT            16
 #define BM_PLL_MULT            (0x7f << 16)
 
 /* PLL Numerator Register (xPLLNUM) */
 #define PLL_NUM_OFFSET         0x10
+#define IMX8ULP_PLL_NUM_OFFSET 0x1c
 
 /* PLL Denominator Register (xPLLDENOM) */
 #define PLL_DENOM_OFFSET       0x14
+#define IMX8ULP_PLL_DENOM_OFFSET       0x18
 
 #define MAX_MFD                        0x3fffffff
 #define DEFAULT_MFD            1000000
@@ -38,6 +41,9 @@
 struct clk_pllv4 {
        struct clk_hw   hw;
        void __iomem    *base;
+       u32             cfg_offset;
+       u32             num_offset;
+       u32             denom_offset;
 };
 
 /* Valid PLL MULT Table */
@@ -72,12 +78,12 @@ static unsigned long clk_pllv4_recalc_rate(struct clk_hw *hw,
        u32 mult, mfn, mfd;
        u64 temp64;
 
-       mult = readl_relaxed(pll->base + PLL_CFG_OFFSET);
+       mult = readl_relaxed(pll->base + pll->cfg_offset);
        mult &= BM_PLL_MULT;
        mult >>= BP_PLL_MULT;
 
-       mfn = readl_relaxed(pll->base + PLL_NUM_OFFSET);
-       mfd = readl_relaxed(pll->base + PLL_DENOM_OFFSET);
+       mfn = readl_relaxed(pll->base + pll->num_offset);
+       mfd = readl_relaxed(pll->base + pll->denom_offset);
        temp64 = parent_rate;
        temp64 *= mfn;
        do_div(temp64, mfd);
@@ -165,13 +171,13 @@ static int clk_pllv4_set_rate(struct clk_hw *hw, unsigned long rate,
        do_div(temp64, parent_rate);
        mfn = temp64;
 
-       val = readl_relaxed(pll->base + PLL_CFG_OFFSET);
+       val = readl_relaxed(pll->base + pll->cfg_offset);
        val &= ~BM_PLL_MULT;
        val |= mult << BP_PLL_MULT;
-       writel_relaxed(val, pll->base + PLL_CFG_OFFSET);
+       writel_relaxed(val, pll->base + pll->cfg_offset);
 
-       writel_relaxed(mfn, pll->base + PLL_NUM_OFFSET);
-       writel_relaxed(mfd, pll->base + PLL_DENOM_OFFSET);
+       writel_relaxed(mfn, pll->base + pll->num_offset);
+       writel_relaxed(mfd, pll->base + pll->denom_offset);
 
        return 0;
 }
@@ -207,8 +213,8 @@ static const struct clk_ops clk_pllv4_ops = {
        .is_prepared    = clk_pllv4_is_prepared,
 };
 
-struct clk_hw *imx_clk_hw_pllv4(const char *name, const char *parent_name,
-                         void __iomem *base)
+struct clk_hw *imx_clk_hw_pllv4(enum imx_pllv4_type type, const char *name,
+                const char *parent_name, void __iomem *base)
 {
        struct clk_pllv4 *pll;
        struct clk_hw *hw;
@@ -221,6 +227,16 @@ struct clk_hw *imx_clk_hw_pllv4(const char *name, const char *parent_name,
 
        pll->base = base;
 
+       if (type == IMX_PLLV4_IMX8ULP) {
+               pll->cfg_offset = IMX8ULP_PLL_CFG_OFFSET;
+               pll->num_offset = IMX8ULP_PLL_NUM_OFFSET;
+               pll->denom_offset = IMX8ULP_PLL_DENOM_OFFSET;
+       } else {
+               pll->cfg_offset = PLL_CFG_OFFSET;
+               pll->num_offset = PLL_NUM_OFFSET;
+               pll->denom_offset = PLL_DENOM_OFFSET;
+       }
+
        init.name = name;
        init.ops = &clk_pllv4_ops;
        init.parent_names = &parent_name;
@@ -238,3 +254,4 @@ struct clk_hw *imx_clk_hw_pllv4(const char *name, const char *parent_name,
 
        return hw;
 }
+EXPORT_SYMBOL_GPL(imx_clk_hw_pllv4);
index e144f98..8199499 100644 (file)
@@ -42,6 +42,16 @@ enum imx_pll14xx_type {
        PLL_1443X,
 };
 
+enum imx_pllv4_type {
+       IMX_PLLV4_IMX7ULP,
+       IMX_PLLV4_IMX8ULP,
+};
+
+enum imx_pfdv2_type {
+       IMX_PFDV2_IMX7ULP,
+       IMX_PFDV2_IMX8ULP,
+};
+
 /* NOTE: Rate table should be kept sorted in descending order. */
 struct imx_pll14xx_rate_table {
        unsigned int rate;
@@ -88,9 +98,6 @@ extern struct imx_pll14xx_clk imx_1443x_dram_pll;
 #define imx_clk_divider(name, parent, reg, shift, width) \
        to_clk(imx_clk_hw_divider(name, parent, reg, shift, width))
 
-#define imx_clk_divider2(name, parent, reg, shift, width) \
-       to_clk(imx_clk_hw_divider2(name, parent, reg, shift, width))
-
 #define imx_clk_divider_flags(name, parent, reg, shift, width, flags) \
        to_clk(imx_clk_hw_divider_flags(name, parent, reg, shift, width, flags))
 
@@ -103,40 +110,93 @@ extern struct imx_pll14xx_clk imx_1443x_dram_pll;
 #define imx_clk_gate2(name, parent, reg, shift) \
        to_clk(imx_clk_hw_gate2(name, parent, reg, shift))
 
+#define imx_clk_gate2_cgr(name, parent, reg, shift, cgr_val) \
+       to_clk(__imx_clk_hw_gate2(name, parent, reg, shift, cgr_val, 0, NULL))
+
 #define imx_clk_gate2_flags(name, parent, reg, shift, flags) \
        to_clk(imx_clk_hw_gate2_flags(name, parent, reg, shift, flags))
 
-#define imx_clk_gate2_shared2(name, parent, reg, shift, share_count) \
-       to_clk(imx_clk_hw_gate2_shared2(name, parent, reg, shift, share_count))
-
-#define imx_clk_gate3(name, parent, reg, shift) \
-       to_clk(imx_clk_hw_gate3(name, parent, reg, shift))
-
-#define imx_clk_gate4(name, parent, reg, shift) \
-       to_clk(imx_clk_hw_gate4(name, parent, reg, shift))
-
 #define imx_clk_mux(name, reg, shift, width, parents, num_parents) \
        to_clk(imx_clk_hw_mux(name, reg, shift, width, parents, num_parents))
 
+#define imx_clk_mux_flags(name, reg, shift, width, parents, num_parents, flags) \
+       to_clk(imx_clk_hw_mux_flags(name, reg, shift, width, parents, num_parents, flags))
+
+#define imx_clk_mux2_flags(name, reg, shift, width, parents, num_parents, flags) \
+       to_clk(imx_clk_hw_mux2_flags(name, reg, shift, width, parents, num_parents, flags))
+
 #define imx_clk_pllv1(type, name, parent, base) \
        to_clk(imx_clk_hw_pllv1(type, name, parent, base))
 
 #define imx_clk_pllv2(name, parent, base) \
        to_clk(imx_clk_hw_pllv2(name, parent, base))
 
-#define imx_clk_frac_pll(name, parent_name, base) \
-       to_clk(imx_clk_hw_frac_pll(name, parent_name, base))
+#define imx_clk_mux_flags(name, reg, shift, width, parents, num_parents, flags) \
+       to_clk(imx_clk_hw_mux_flags(name, reg, shift, width, parents, num_parents, flags))
+
+#define imx_clk_hw_gate(name, parent, reg, shift) \
+       imx_clk_hw_gate_flags(name, parent, reg, shift, 0)
+
+#define imx_clk_hw_gate2(name, parent, reg, shift) \
+       imx_clk_hw_gate2_flags(name, parent, reg, shift, 0)
+
+#define imx_clk_hw_gate_dis(name, parent, reg, shift) \
+       imx_clk_hw_gate_dis_flags(name, parent, reg, shift, 0)
+
+#define imx_clk_hw_gate_dis_flags(name, parent, reg, shift, flags) \
+       __imx_clk_hw_gate(name, parent, reg, shift, flags, CLK_GATE_SET_TO_DISABLE)
+
+#define imx_clk_hw_gate_flags(name, parent, reg, shift, flags) \
+       __imx_clk_hw_gate(name, parent, reg, shift, flags, 0)
+
+#define imx_clk_hw_gate2_flags(name, parent, reg, shift, flags) \
+       __imx_clk_hw_gate2(name, parent, reg, shift, 0x3, flags, NULL)
+
+#define imx_clk_hw_gate2_shared(name, parent, reg, shift, shared_count) \
+       __imx_clk_hw_gate2(name, parent, reg, shift, 0x3, 0, shared_count)
 
-#define imx_clk_sscg_pll(name, parent_names, num_parents, parent,\
-                               bypass1, bypass2, base, flags) \
-       to_clk(imx_clk_hw_sscg_pll(name, parent_names, num_parents, parent,\
-                               bypass1, bypass2, base, flags))
+#define imx_clk_hw_gate2_shared2(name, parent, reg, shift, shared_count) \
+       __imx_clk_hw_gate2(name, parent, reg, shift, 0x3, CLK_OPS_PARENT_ENABLE, shared_count)
 
-struct clk *imx_clk_pll14xx(const char *name, const char *parent_name,
-                void __iomem *base, const struct imx_pll14xx_clk *pll_clk);
+#define imx_clk_hw_gate3(name, parent, reg, shift) \
+       imx_clk_hw_gate3_flags(name, parent, reg, shift, 0)
 
-#define imx_clk_pll14xx(name, parent_name, base, pll_clk) \
-       to_clk(imx_clk_hw_pll14xx(name, parent_name, base, pll_clk))
+#define imx_clk_hw_gate3_flags(name, parent, reg, shift, flags) \
+       __imx_clk_hw_gate(name, parent, reg, shift, flags | CLK_OPS_PARENT_ENABLE, 0)
+
+#define imx_clk_hw_gate4(name, parent, reg, shift) \
+       imx_clk_hw_gate4_flags(name, parent, reg, shift, 0)
+
+#define imx_clk_hw_gate4_flags(name, parent, reg, shift, flags) \
+       imx_clk_hw_gate2_flags(name, parent, reg, shift, flags | CLK_OPS_PARENT_ENABLE)
+
+#define imx_clk_hw_mux2(name, reg, shift, width, parents, num_parents) \
+       imx_clk_hw_mux2_flags(name, reg, shift, width, parents, num_parents, 0)
+
+#define imx_clk_hw_mux(name, reg, shift, width, parents, num_parents) \
+       __imx_clk_hw_mux(name, reg, shift, width, parents, num_parents, 0, 0)
+
+#define imx_clk_hw_mux_flags(name, reg, shift, width, parents, num_parents, flags) \
+       __imx_clk_hw_mux(name, reg, shift, width, parents, num_parents, flags, 0)
+
+#define imx_clk_hw_mux_ldb(name, reg, shift, width, parents, num_parents) \
+       __imx_clk_hw_mux(name, reg, shift, width, parents, num_parents, CLK_SET_RATE_PARENT, CLK_MUX_READ_ONLY)
+
+#define imx_clk_hw_mux2_flags(name, reg, shift, width, parents, num_parents, flags) \
+       __imx_clk_hw_mux(name, reg, shift, width, parents, num_parents, flags | CLK_OPS_PARENT_ENABLE, 0)
+
+#define imx_clk_hw_divider(name, parent, reg, shift, width) \
+       __imx_clk_hw_divider(name, parent, reg, shift, width, CLK_SET_RATE_PARENT)
+
+#define imx_clk_hw_divider2(name, parent, reg, shift, width) \
+       __imx_clk_hw_divider(name, parent, reg, shift, width, \
+                               CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE)
+
+#define imx_clk_hw_divider_flags(name, parent, reg, shift, width, flags) \
+       __imx_clk_hw_divider(name, parent, reg, shift, width, flags)
+
+#define imx_clk_hw_pll14xx(name, parent_name, base, pll_clk) \
+       imx_dev_clk_hw_pll14xx(NULL, name, parent_name, base, pll_clk)
 
 struct clk_hw *imx_dev_clk_hw_pll14xx(struct device *dev, const char *name,
                                const char *parent_name, void __iomem *base,
@@ -191,8 +251,8 @@ struct clk_hw *imx_clk_hw_pllv3(enum imx_pllv3_type type, const char *name,
                .kdiv   =       (_k),                   \
        }
 
-struct clk_hw *imx_clk_hw_pllv4(const char *name, const char *parent_name,
-                            void __iomem *base);
+struct clk_hw *imx_clk_hw_pllv4(enum imx_pllv4_type type, const char *name,
+               const char *parent_name, void __iomem *base);
 
 struct clk_hw *clk_hw_register_gate2(struct device *dev, const char *name,
                const char *parent_name, unsigned long flags,
@@ -215,8 +275,8 @@ struct clk_hw *imx_clk_hw_gate_exclusive(const char *name, const char *parent,
 struct clk_hw *imx_clk_hw_pfd(const char *name, const char *parent_name,
                void __iomem *reg, u8 idx);
 
-struct clk_hw *imx_clk_hw_pfdv2(const char *name, const char *parent_name,
-                            void __iomem *reg, u8 idx);
+struct clk_hw *imx_clk_hw_pfdv2(enum imx_pfdv2_type type, const char *name,
+        const char *parent_name, void __iomem *reg, u8 idx);
 
 struct clk_hw *imx_clk_hw_busy_divider(const char *name, const char *parent_name,
                                 void __iomem *reg, u8 shift, u8 width,
@@ -232,6 +292,12 @@ struct clk_hw *imx7ulp_clk_hw_composite(const char *name,
                                     bool rate_present, bool gate_present,
                                     void __iomem *reg);
 
+struct clk_hw *imx8ulp_clk_hw_composite(const char *name,
+                                    const char * const *parent_names,
+                                    int num_parents, bool mux_present,
+                                    bool rate_present, bool gate_present,
+                                    void __iomem *reg, bool has_swrst);
+
 struct clk_hw *imx_clk_hw_fixup_divider(const char *name, const char *parent,
                                  void __iomem *reg, u8 shift, u8 width,
                                  void (*fixup)(u32 *val));
@@ -247,27 +313,11 @@ static inline struct clk *to_clk(struct clk_hw *hw)
        return hw->clk;
 }
 
-static inline struct clk_hw *imx_clk_hw_pll14xx(const char *name, const char *parent_name,
-                                 void __iomem *base,
-                                 const struct imx_pll14xx_clk *pll_clk)
-{
-       return imx_dev_clk_hw_pll14xx(NULL, name, parent_name, base, pll_clk);
-}
-
 static inline struct clk_hw *imx_clk_hw_fixed(const char *name, int rate)
 {
        return clk_hw_register_fixed_rate(NULL, name, NULL, 0, rate);
 }
 
-static inline struct clk_hw *imx_clk_hw_mux_ldb(const char *name, void __iomem *reg,
-                       u8 shift, u8 width, const char * const *parents,
-                       int num_parents)
-{
-       return clk_hw_register_mux(NULL, name, parents, num_parents,
-                       CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT, reg,
-                       shift, width, CLK_MUX_READ_ONLY, &imx_ccm_lock);
-}
-
 static inline struct clk_hw *imx_clk_hw_fixed_factor(const char *name,
                const char *parent, unsigned int mult, unsigned int div)
 {
@@ -275,16 +325,7 @@ static inline struct clk_hw *imx_clk_hw_fixed_factor(const char *name,
                        CLK_SET_RATE_PARENT, mult, div);
 }
 
-static inline struct clk_hw *imx_clk_hw_divider(const char *name,
-                                               const char *parent,
-                                               void __iomem *reg, u8 shift,
-                                               u8 width)
-{
-       return clk_hw_register_divider(NULL, name, parent, CLK_SET_RATE_PARENT,
-                                      reg, shift, width, 0, &imx_ccm_lock);
-}
-
-static inline struct clk_hw *imx_clk_hw_divider_flags(const char *name,
+static inline struct clk_hw *__imx_clk_hw_divider(const char *name,
                                                   const char *parent,
                                                   void __iomem *reg, u8 shift,
                                                   u8 width, unsigned long flags)
@@ -293,237 +334,31 @@ static inline struct clk_hw *imx_clk_hw_divider_flags(const char *name,
                                       reg, shift, width, 0, &imx_ccm_lock);
 }
 
-static inline struct clk_hw *imx_clk_hw_divider2(const char *name, const char *parent,
-               void __iomem *reg, u8 shift, u8 width)
-{
-       return clk_hw_register_divider(NULL, name, parent,
-                       CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
-                       reg, shift, width, 0, &imx_ccm_lock);
-}
-
-static inline struct clk *imx_clk_divider2_flags(const char *name,
-               const char *parent, void __iomem *reg, u8 shift, u8 width,
-               unsigned long flags)
-{
-       return clk_register_divider(NULL, name, parent,
-                       flags | CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
-                       reg, shift, width, 0, &imx_ccm_lock);
-}
-
-static inline struct clk_hw *imx_clk_hw_gate_flags(const char *name, const char *parent,
-               void __iomem *reg, u8 shift, unsigned long flags)
-{
-       return clk_hw_register_gate(NULL, name, parent, flags | CLK_SET_RATE_PARENT, reg,
-                       shift, 0, &imx_ccm_lock);
-}
-
-static inline struct clk_hw *imx_clk_hw_gate(const char *name, const char *parent,
-                                            void __iomem *reg, u8 shift)
-{
-       return clk_hw_register_gate(NULL, name, parent, CLK_SET_RATE_PARENT, reg,
-                                   shift, 0, &imx_ccm_lock);
-}
-
-static inline struct clk_hw *imx_dev_clk_hw_gate(struct device *dev, const char *name,
-                                               const char *parent, void __iomem *reg, u8 shift)
-{
-       return clk_hw_register_gate(dev, name, parent, CLK_SET_RATE_PARENT, reg,
-                                   shift, 0, &imx_ccm_lock);
-}
-
-static inline struct clk_hw *imx_clk_hw_gate_dis(const char *name, const char *parent,
-               void __iomem *reg, u8 shift)
-{
-       return clk_hw_register_gate(NULL, name, parent, CLK_SET_RATE_PARENT, reg,
-                       shift, CLK_GATE_SET_TO_DISABLE, &imx_ccm_lock);
-}
-
-static inline struct clk_hw *imx_clk_hw_gate_dis_flags(const char *name, const char *parent,
-               void __iomem *reg, u8 shift, unsigned long flags)
+static inline struct clk_hw *__imx_clk_hw_gate(const char *name, const char *parent,
+                                               void __iomem *reg, u8 shift,
+                                               unsigned long flags,
+                                               unsigned long clk_gate_flags)
 {
        return clk_hw_register_gate(NULL, name, parent, flags | CLK_SET_RATE_PARENT, reg,
-                       shift, CLK_GATE_SET_TO_DISABLE, &imx_ccm_lock);
+                                       shift, clk_gate_flags, &imx_ccm_lock);
 }
 
-static inline struct clk_hw *imx_clk_hw_gate2(const char *name, const char *parent,
-               void __iomem *reg, u8 shift)
-{
-       return clk_hw_register_gate2(NULL, name, parent, CLK_SET_RATE_PARENT, reg,
-                       shift, 0x3, 0x3, 0, &imx_ccm_lock, NULL);
-}
-
-static inline struct clk_hw *imx_clk_hw_gate2_flags(const char *name, const char *parent,
-               void __iomem *reg, u8 shift, unsigned long flags)
+static inline struct clk_hw *__imx_clk_hw_gate2(const char *name, const char *parent,
+                                               void __iomem *reg, u8 shift, u8 cgr_val,
+                                               unsigned long flags,
+                                               unsigned int *share_count)
 {
        return clk_hw_register_gate2(NULL, name, parent, flags | CLK_SET_RATE_PARENT, reg,
-                       shift, 0x3, 0x3, 0, &imx_ccm_lock, NULL);
-}
-
-static inline struct clk_hw *imx_clk_hw_gate2_shared(const char *name,
-               const char *parent, void __iomem *reg, u8 shift,
-               unsigned int *share_count)
-{
-       return clk_hw_register_gate2(NULL, name, parent, CLK_SET_RATE_PARENT, reg,
-                       shift, 0x3, 0x3, 0, &imx_ccm_lock, share_count);
-}
-
-static inline struct clk_hw *imx_clk_hw_gate2_shared2(const char *name,
-               const char *parent, void __iomem *reg, u8 shift,
-               unsigned int *share_count)
-{
-       return clk_hw_register_gate2(NULL, name, parent, CLK_SET_RATE_PARENT |
-                                 CLK_OPS_PARENT_ENABLE, reg, shift, 0x3, 0x3, 0,
-                                 &imx_ccm_lock, share_count);
-}
-
-static inline struct clk_hw *imx_dev_clk_hw_gate_shared(struct device *dev,
-                               const char *name, const char *parent,
-                               void __iomem *reg, u8 shift,
-                               unsigned int *share_count)
-{
-       return clk_hw_register_gate2(NULL, name, parent, CLK_SET_RATE_PARENT |
-                                       CLK_OPS_PARENT_ENABLE, reg, shift, 0x1,
-                                       0x1, 0, &imx_ccm_lock, share_count);
-}
-
-static inline struct clk *imx_clk_gate2_cgr(const char *name,
-               const char *parent, void __iomem *reg, u8 shift, u8 cgr_val)
-{
-       return clk_register_gate2(NULL, name, parent, CLK_SET_RATE_PARENT, reg,
-                       shift, cgr_val, 0x3, 0, &imx_ccm_lock, NULL);
-}
-
-static inline struct clk_hw *imx_clk_hw_gate3(const char *name, const char *parent,
-               void __iomem *reg, u8 shift)
-{
-       return clk_hw_register_gate(NULL, name, parent,
-                       CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
-                       reg, shift, 0, &imx_ccm_lock);
-}
-
-static inline struct clk_hw *imx_clk_hw_gate3_flags(const char *name,
-               const char *parent, void __iomem *reg, u8 shift,
-               unsigned long flags)
-{
-       return clk_hw_register_gate(NULL, name, parent,
-                       flags | CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
-                       reg, shift, 0, &imx_ccm_lock);
-}
-
-#define imx_clk_gate3_flags(name, parent, reg, shift, flags) \
-       to_clk(imx_clk_hw_gate3_flags(name, parent, reg, shift, flags))
-
-static inline struct clk_hw *imx_clk_hw_gate4(const char *name, const char *parent,
-               void __iomem *reg, u8 shift)
-{
-       return clk_hw_register_gate2(NULL, name, parent,
-                       CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
-                       reg, shift, 0x3, 0x3, 0, &imx_ccm_lock, NULL);
-}
-
-static inline struct clk_hw *imx_clk_hw_gate4_flags(const char *name,
-               const char *parent, void __iomem *reg, u8 shift,
-               unsigned long flags)
-{
-       return clk_hw_register_gate2(NULL, name, parent,
-                       flags | CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
-                       reg, shift, 0x3, 0x3, 0, &imx_ccm_lock, NULL);
-}
-
-#define imx_clk_gate4_flags(name, parent, reg, shift, flags) \
-       to_clk(imx_clk_hw_gate4_flags(name, parent, reg, shift, flags))
-
-static inline struct clk_hw *imx_clk_hw_mux(const char *name, void __iomem *reg,
-                       u8 shift, u8 width, const char * const *parents,
-                       int num_parents)
-{
-       return clk_hw_register_mux(NULL, name, parents, num_parents,
-                       CLK_SET_RATE_NO_REPARENT, reg, shift,
-                       width, 0, &imx_ccm_lock);
-}
-
-static inline struct clk_hw *imx_dev_clk_hw_mux(struct device *dev,
-                       const char *name, void __iomem *reg, u8 shift,
-                       u8 width, const char * const *parents, int num_parents)
-{
-       return clk_hw_register_mux(dev, name, parents, num_parents,
-                       CLK_SET_RATE_NO_REPARENT | CLK_SET_PARENT_GATE,
-                       reg, shift, width, 0, &imx_ccm_lock);
+                                       shift, cgr_val, 0x3, 0, &imx_ccm_lock, share_count);
 }
 
-static inline struct clk *imx_clk_mux2(const char *name, void __iomem *reg,
+static inline struct clk_hw *__imx_clk_hw_mux(const char *name, void __iomem *reg,
                        u8 shift, u8 width, const char * const *parents,
-                       int num_parents)
-{
-       return clk_register_mux(NULL, name, parents, num_parents,
-                       CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE,
-                       reg, shift, width, 0, &imx_ccm_lock);
-}
-
-static inline struct clk_hw *imx_clk_hw_mux2(const char *name, void __iomem *reg,
-                                            u8 shift, u8 width,
-                                            const char * const *parents,
-                                            int num_parents)
-{
-       return clk_hw_register_mux(NULL, name, parents, num_parents,
-                                  CLK_SET_RATE_NO_REPARENT |
-                                  CLK_OPS_PARENT_ENABLE,
-                                  reg, shift, width, 0, &imx_ccm_lock);
-}
-
-static inline struct clk *imx_clk_mux_flags(const char *name,
-                       void __iomem *reg, u8 shift, u8 width,
-                       const char * const *parents, int num_parents,
-                       unsigned long flags)
-{
-       return clk_register_mux(NULL, name, parents, num_parents,
-                       flags | CLK_SET_RATE_NO_REPARENT, reg, shift, width, 0,
-                       &imx_ccm_lock);
-}
-
-static inline struct clk_hw *imx_clk_hw_mux2_flags(const char *name,
-               void __iomem *reg, u8 shift, u8 width,
-               const char * const *parents,
-               int num_parents, unsigned long flags)
-{
-       return clk_hw_register_mux(NULL, name, parents, num_parents,
-                       flags | CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE,
-                       reg, shift, width, 0, &imx_ccm_lock);
-}
-
-static inline struct clk *imx_clk_mux2_flags(const char *name,
-               void __iomem *reg, u8 shift, u8 width,
-               const char * const *parents,
-               int num_parents, unsigned long flags)
-{
-       return clk_register_mux(NULL, name, parents, num_parents,
-                       flags | CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE,
-                       reg, shift, width, 0, &imx_ccm_lock);
-}
-
-static inline struct clk_hw *imx_clk_hw_mux_flags(const char *name,
-                                                 void __iomem *reg, u8 shift,
-                                                 u8 width,
-                                                 const char * const *parents,
-                                                 int num_parents,
-                                                 unsigned long flags)
+                       int num_parents, unsigned long flags, unsigned long clk_mux_flags)
 {
        return clk_hw_register_mux(NULL, name, parents, num_parents,
-                                  flags | CLK_SET_RATE_NO_REPARENT,
-                                  reg, shift, width, 0, &imx_ccm_lock);
-}
-
-static inline struct clk_hw *imx_dev_clk_hw_mux_flags(struct device *dev,
-                                                 const char *name,
-                                                 void __iomem *reg, u8 shift,
-                                                 u8 width,
-                                                 const char * const *parents,
-                                                 int num_parents,
-                                                 unsigned long flags)
-{
-       return clk_hw_register_mux(dev, name, parents, num_parents,
-                                  flags | CLK_SET_RATE_NO_REPARENT,
-                                  reg, shift, width, 0, &imx_ccm_lock);
+                       flags | CLK_SET_RATE_NO_REPARENT, reg, shift,
+                       width, clk_mux_flags, &imx_ccm_lock);
 }
 
 struct clk_hw *imx_clk_hw_cpu(const char *name, const char *parent_name,
@@ -534,65 +369,55 @@ struct clk_hw *imx_clk_hw_cpu(const char *name, const char *parent_name,
 #define IMX_COMPOSITE_BUS              BIT(1)
 #define IMX_COMPOSITE_FW_MANAGED       BIT(2)
 
-struct clk_hw *imx8m_clk_hw_composite_flags(const char *name,
+#define IMX_COMPOSITE_CLK_FLAGS_DEFAULT \
+       (CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE)
+#define IMX_COMPOSITE_CLK_FLAGS_CRITICAL \
+       (IMX_COMPOSITE_CLK_FLAGS_DEFAULT | CLK_IS_CRITICAL)
+#define IMX_COMPOSITE_CLK_FLAGS_GET_RATE_NO_CACHE \
+       (IMX_COMPOSITE_CLK_FLAGS_DEFAULT | CLK_GET_RATE_NOCACHE)
+#define IMX_COMPOSITE_CLK_FLAGS_CRITICAL_GET_RATE_NO_CACHE \
+       (IMX_COMPOSITE_CLK_FLAGS_GET_RATE_NO_CACHE | CLK_IS_CRITICAL)
+
+struct clk_hw *__imx8m_clk_hw_composite(const char *name,
                                            const char * const *parent_names,
                                            int num_parents,
                                            void __iomem *reg,
                                            u32 composite_flags,
                                            unsigned long flags);
 
+#define _imx8m_clk_hw_composite(name, parent_names, reg, composite_flags, flags) \
+       __imx8m_clk_hw_composite(name, parent_names, \
+               ARRAY_SIZE(parent_names), reg, composite_flags, flags)
+
+#define imx8m_clk_hw_composite(name, parent_names, reg) \
+       _imx8m_clk_hw_composite(name, parent_names, reg, \
+                       IMX_COMPOSITE_CORE, IMX_COMPOSITE_CLK_FLAGS_DEFAULT)
+
+#define imx8m_clk_hw_composite_critical(name, parent_names, reg) \
+       _imx8m_clk_hw_composite(name, parent_names, reg, \
+                       IMX_COMPOSITE_CORE, IMX_COMPOSITE_CLK_FLAGS_CRITICAL)
+
 #define imx8m_clk_hw_composite_bus(name, parent_names, reg)    \
-       imx8m_clk_hw_composite_flags(name, parent_names, \
-                       ARRAY_SIZE(parent_names), reg, \
-                       IMX_COMPOSITE_BUS, \
-                       CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE)
+       _imx8m_clk_hw_composite(name, parent_names, reg, \
+                       IMX_COMPOSITE_BUS, IMX_COMPOSITE_CLK_FLAGS_DEFAULT)
 
 #define imx8m_clk_hw_composite_bus_critical(name, parent_names, reg)   \
-       imx8m_clk_hw_composite_flags(name, parent_names, ARRAY_SIZE(parent_names), reg, \
-                       IMX_COMPOSITE_BUS, \
-                       CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE | CLK_IS_CRITICAL)
+       _imx8m_clk_hw_composite(name, parent_names, reg, \
+                       IMX_COMPOSITE_BUS, IMX_COMPOSITE_CLK_FLAGS_CRITICAL)
 
 #define imx8m_clk_hw_composite_core(name, parent_names, reg)   \
-       imx8m_clk_hw_composite_flags(name, parent_names, \
-                       ARRAY_SIZE(parent_names), reg, \
-                       IMX_COMPOSITE_CORE, \
-                       CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE)
-
-#define imx8m_clk_composite_flags(name, parent_names, num_parents, reg, \
-                                 flags) \
-       to_clk(imx8m_clk_hw_composite_flags(name, parent_names, \
-                               num_parents, reg, 0, flags))
-
-#define __imx8m_clk_hw_composite(name, parent_names, reg, flags) \
-       imx8m_clk_hw_composite_flags(name, parent_names, \
-               ARRAY_SIZE(parent_names), reg, 0, \
-               flags | CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE)
-
-#define __imx8m_clk_hw_fw_managed_composite(name, parent_names, reg, flags) \
-       imx8m_clk_hw_composite_flags(name, parent_names, \
-               ARRAY_SIZE(parent_names), reg, IMX_COMPOSITE_FW_MANAGED, \
-               flags | CLK_GET_RATE_NOCACHE | CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE)
+       _imx8m_clk_hw_composite(name, parent_names, reg, \
+                       IMX_COMPOSITE_CORE, IMX_COMPOSITE_CLK_FLAGS_DEFAULT)
 
 #define imx8m_clk_hw_fw_managed_composite(name, parent_names, reg) \
-       __imx8m_clk_hw_fw_managed_composite(name, parent_names, reg, 0)
+       _imx8m_clk_hw_composite(name, parent_names, reg, \
+                       IMX_COMPOSITE_FW_MANAGED, \
+                       IMX_COMPOSITE_CLK_FLAGS_GET_RATE_NO_CACHE)
 
 #define imx8m_clk_hw_fw_managed_composite_critical(name, parent_names, reg) \
-       __imx8m_clk_hw_fw_managed_composite(name, parent_names, reg, CLK_IS_CRITICAL)
-
-#define __imx8m_clk_composite(name, parent_names, reg, flags) \
-       to_clk(__imx8m_clk_hw_composite(name, parent_names, reg, flags))
-
-#define imx8m_clk_hw_composite(name, parent_names, reg) \
-       __imx8m_clk_hw_composite(name, parent_names, reg, 0)
-
-#define imx8m_clk_composite(name, parent_names, reg) \
-       __imx8m_clk_composite(name, parent_names, reg, 0)
-
-#define imx8m_clk_hw_composite_critical(name, parent_names, reg) \
-       __imx8m_clk_hw_composite(name, parent_names, reg, CLK_IS_CRITICAL)
-
-#define imx8m_clk_composite_critical(name, parent_names, reg) \
-       __imx8m_clk_composite(name, parent_names, reg, CLK_IS_CRITICAL)
+       _imx8m_clk_hw_composite(name, parent_names, reg, \
+                       IMX_COMPOSITE_FW_MANAGED, \
+                       IMX_COMPOSITE_CLK_FLAGS_CRITICAL_GET_RATE_NO_CACHE)
 
 struct clk_hw *imx_clk_hw_divider_gate(const char *name, const char *parent_name,
                unsigned long flags, void __iomem *reg, u8 shift, u8 width,
index 439b7c8..3ce6fb0 100644 (file)
@@ -6,7 +6,7 @@ menu "Clock driver for MediaTek SoC"
        depends on ARCH_MEDIATEK || COMPILE_TEST
 
 config COMMON_CLK_MEDIATEK
-       bool
+       tristate
        select RESET_CONTROLLER
        help
          MediaTek SoCs' clock support.
@@ -204,7 +204,7 @@ config COMMON_CLK_MT6765_MIPI2BSYS
          This driver supports MediaTek MT6765 mipi2bsys clocks.
 
 config COMMON_CLK_MT6779
-       bool "Clock driver for MediaTek MT6779"
+       tristate "Clock driver for MediaTek MT6779"
        depends on (ARCH_MEDIATEK && ARM64) || COMPILE_TEST
        select COMMON_CLK_MEDIATEK
        default ARCH_MEDIATEK && ARM64
@@ -212,49 +212,49 @@ config COMMON_CLK_MT6779
          This driver supports MediaTek MT6779 basic clocks.
 
 config COMMON_CLK_MT6779_MMSYS
-       bool "Clock driver for MediaTek MT6779 mmsys"
+       tristate "Clock driver for MediaTek MT6779 mmsys"
        depends on COMMON_CLK_MT6779
        help
          This driver supports MediaTek MT6779 mmsys clocks.
 
 config COMMON_CLK_MT6779_IMGSYS
-       bool "Clock driver for MediaTek MT6779 imgsys"
+       tristate "Clock driver for MediaTek MT6779 imgsys"
        depends on COMMON_CLK_MT6779
        help
          This driver supports MediaTek MT6779 imgsys clocks.
 
 config COMMON_CLK_MT6779_IPESYS
-       bool "Clock driver for MediaTek MT6779 ipesys"
+       tristate "Clock driver for MediaTek MT6779 ipesys"
        depends on COMMON_CLK_MT6779
        help
          This driver supports MediaTek MT6779 ipesys clocks.
 
 config COMMON_CLK_MT6779_CAMSYS
-       bool "Clock driver for MediaTek MT6779 camsys"
+       tristate "Clock driver for MediaTek MT6779 camsys"
        depends on COMMON_CLK_MT6779
        help
          This driver supports MediaTek MT6779 camsys clocks.
 
 config COMMON_CLK_MT6779_VDECSYS
-       bool "Clock driver for MediaTek MT6779 vdecsys"
+       tristate "Clock driver for MediaTek MT6779 vdecsys"
        depends on COMMON_CLK_MT6779
        help
          This driver supports MediaTek MT6779 vdecsys clocks.
 
 config COMMON_CLK_MT6779_VENCSYS
-       bool "Clock driver for MediaTek MT6779 vencsys"
+       tristate "Clock driver for MediaTek MT6779 vencsys"
        depends on COMMON_CLK_MT6779
        help
          This driver supports MediaTek MT6779 vencsys clocks.
 
 config COMMON_CLK_MT6779_MFGCFG
-       bool "Clock driver for MediaTek MT6779 mfgcfg"
+       tristate "Clock driver for MediaTek MT6779 mfgcfg"
        depends on COMMON_CLK_MT6779
        help
          This driver supports MediaTek MT6779 mfgcfg clocks.
 
 config COMMON_CLK_MT6779_AUDSYS
-       bool "Clock driver for Mediatek MT6779 audsys"
+       tristate "Clock driver for Mediatek MT6779 audsys"
        depends on COMMON_CLK_MT6779
        help
          This driver supports Mediatek MT6779 audsys clocks.
@@ -575,6 +575,14 @@ config COMMON_CLK_MT8192_VENCSYS
        help
          This driver supports MediaTek MT8192 vencsys clocks.
 
+config COMMON_CLK_MT8195
+        bool "Clock driver for MediaTek MT8195"
+        depends on ARM64 || COMPILE_TEST
+        select COMMON_CLK_MEDIATEK
+        default ARCH_MEDIATEK
+        help
+          This driver supports MediaTek MT8195 clocks.
+
 config COMMON_CLK_MT8516
        bool "Clock driver for MediaTek MT8516"
        depends on ARCH_MEDIATEK || COMPILE_TEST
index 15bc045..dc96038 100644 (file)
@@ -80,5 +80,13 @@ obj-$(CONFIG_COMMON_CLK_MT8192_MSDC) += clk-mt8192-msdc.o
 obj-$(CONFIG_COMMON_CLK_MT8192_SCP_ADSP) += clk-mt8192-scp_adsp.o
 obj-$(CONFIG_COMMON_CLK_MT8192_VDECSYS) += clk-mt8192-vdec.o
 obj-$(CONFIG_COMMON_CLK_MT8192_VENCSYS) += clk-mt8192-venc.o
+obj-$(CONFIG_COMMON_CLK_MT8195) += clk-mt8195-apmixedsys.o clk-mt8195-topckgen.o \
+                                  clk-mt8195-peri_ao.o clk-mt8195-infra_ao.o \
+                                  clk-mt8195-cam.o clk-mt8195-ccu.o clk-mt8195-img.o \
+                                  clk-mt8195-ipe.o clk-mt8195-mfg.o clk-mt8195-scp_adsp.o \
+                                  clk-mt8195-vdec.o clk-mt8195-vdo0.o clk-mt8195-vdo1.o \
+                                  clk-mt8195-venc.o clk-mt8195-vpp0.o clk-mt8195-vpp1.o \
+                                  clk-mt8195-wpe.o clk-mt8195-imp_iic_wrap.o \
+                                  clk-mt8195-apusys_pll.o
 obj-$(CONFIG_COMMON_CLK_MT8516) += clk-mt8516.o
 obj-$(CONFIG_COMMON_CLK_MT8516_AUDSYS) += clk-mt8516-aud.o
index 258d128..caa9119 100644 (file)
@@ -5,6 +5,7 @@
  */
 
 #include <linux/delay.h>
+#include <linux/module.h>
 #include <linux/of_address.h>
 #include <linux/slab.h>
 
@@ -97,3 +98,5 @@ struct clk * __init mtk_clk_register_ref2usb_tx(const char *name,
 
        return clk;
 }
+
+MODULE_LICENSE("GPL");
index 61eeae4..e188018 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <linux/clk-provider.h>
 #include <linux/mfd/syscon.h>
+#include <linux/module.h>
 #include <linux/slab.h>
 
 #include "clk-mtk.h"
@@ -106,3 +107,5 @@ int mtk_clk_register_cpumuxes(struct device_node *node,
 
        return 0;
 }
+
+MODULE_LICENSE("GPL");
index a35cf0b..b02d2f7 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/slab.h>
 #include <linux/delay.h>
 #include <linux/clkdev.h>
+#include <linux/module.h>
 
 #include "clk-mtk.h"
 #include "clk-gate.h"
@@ -122,24 +123,28 @@ const struct clk_ops mtk_clk_gate_ops_setclr = {
        .enable         = mtk_cg_enable,
        .disable        = mtk_cg_disable,
 };
+EXPORT_SYMBOL_GPL(mtk_clk_gate_ops_setclr);
 
 const struct clk_ops mtk_clk_gate_ops_setclr_inv = {
        .is_enabled     = mtk_cg_bit_is_set,
        .enable         = mtk_cg_enable_inv,
        .disable        = mtk_cg_disable_inv,
 };
+EXPORT_SYMBOL_GPL(mtk_clk_gate_ops_setclr_inv);
 
 const struct clk_ops mtk_clk_gate_ops_no_setclr = {
        .is_enabled     = mtk_cg_bit_is_cleared,
        .enable         = mtk_cg_enable_no_setclr,
        .disable        = mtk_cg_disable_no_setclr,
 };
+EXPORT_SYMBOL_GPL(mtk_clk_gate_ops_no_setclr);
 
 const struct clk_ops mtk_clk_gate_ops_no_setclr_inv = {
        .is_enabled     = mtk_cg_bit_is_set,
        .enable         = mtk_cg_enable_inv_no_setclr,
        .disable        = mtk_cg_disable_inv_no_setclr,
 };
+EXPORT_SYMBOL_GPL(mtk_clk_gate_ops_no_setclr_inv);
 
 struct clk *mtk_clk_register_gate(
                const char *name,
@@ -181,3 +186,6 @@ struct clk *mtk_clk_register_gate(
 
        return clk;
 }
+EXPORT_SYMBOL_GPL(mtk_clk_register_gate);
+
+MODULE_LICENSE("GPL");
index 11b209f..9e889e4 100644 (file)
@@ -4,6 +4,7 @@
  * Author: Wendell Lin <wendell.lin@mediatek.com>
  */
 
+#include <linux/module.h>
 #include <linux/clk-provider.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
@@ -114,4 +115,5 @@ static struct platform_driver clk_mt6779_aud_drv = {
        },
 };
 
-builtin_platform_driver(clk_mt6779_aud_drv);
+module_platform_driver(clk_mt6779_aud_drv);
+MODULE_LICENSE("GPL");
index 244d420..7f07a2a 100644 (file)
@@ -4,6 +4,7 @@
  * Author: Wendell Lin <wendell.lin@mediatek.com>
  */
 
+#include <linux/module.h>
 #include <linux/clk-provider.h>
 #include <linux/platform_device.h>
 #include <dt-bindings/clock/mt6779-clk.h>
@@ -63,4 +64,5 @@ static struct platform_driver clk_mt6779_cam_drv = {
        },
 };
 
-builtin_platform_driver(clk_mt6779_cam_drv);
+module_platform_driver(clk_mt6779_cam_drv);
+MODULE_LICENSE("GPL");
index 26292a4..f0961fa 100644 (file)
@@ -4,6 +4,7 @@
  * Author: Wendell Lin <wendell.lin@mediatek.com>
  */
 
+#include <linux/module.h>
 #include <linux/clk-provider.h>
 #include <linux/platform_device.h>
 #include <dt-bindings/clock/mt6779-clk.h>
@@ -55,4 +56,5 @@ static struct platform_driver clk_mt6779_img_drv = {
        },
 };
 
-builtin_platform_driver(clk_mt6779_img_drv);
+module_platform_driver(clk_mt6779_img_drv);
+MODULE_LICENSE("GPL");
index bb51907..8c6f3e1 100644 (file)
@@ -4,6 +4,7 @@
  * Author: Wendell Lin <wendell.lin@mediatek.com>
  */
 
+#include <linux/module.h>
 #include <linux/clk-provider.h>
 #include <linux/platform_device.h>
 #include <dt-bindings/clock/mt6779-clk.h>
@@ -57,4 +58,5 @@ static struct platform_driver clk_mt6779_ipe_drv = {
        },
 };
 
-builtin_platform_driver(clk_mt6779_ipe_drv);
+module_platform_driver(clk_mt6779_ipe_drv);
+MODULE_LICENSE("GPL");
index c6ee2a8..9f33728 100644 (file)
@@ -4,6 +4,7 @@
  * Author: Wendell Lin <wendell.lin@mediatek.com>
  */
 
+#include <linux/module.h>
 #include <linux/clk-provider.h>
 #include <linux/platform_device.h>
 
@@ -52,4 +53,5 @@ static struct platform_driver clk_mt6779_mfg_drv = {
        },
 };
 
-builtin_platform_driver(clk_mt6779_mfg_drv);
+module_platform_driver(clk_mt6779_mfg_drv);
+MODULE_LICENSE("GPL");
index 059c1a4..33946e6 100644 (file)
@@ -4,6 +4,7 @@
  * Author: Wendell Lin <wendell.lin@mediatek.com>
  */
 
+#include <linux/module.h>
 #include <linux/clk-provider.h>
 #include <linux/platform_device.h>
 #include <dt-bindings/clock/mt6779-clk.h>
@@ -105,4 +106,5 @@ static struct platform_driver clk_mt6779_mm_drv = {
        },
 };
 
-builtin_platform_driver(clk_mt6779_mm_drv);
+module_platform_driver(clk_mt6779_mm_drv);
+MODULE_LICENSE("GPL");
index 1900da2..f435884 100644 (file)
@@ -4,6 +4,7 @@
  * Author: Wendell Lin <wendell.lin@mediatek.com>
  */
 
+#include <linux/module.h>
 #include <linux/clk-provider.h>
 #include <linux/platform_device.h>
 
@@ -64,4 +65,5 @@ static struct platform_driver clk_mt6779_vdec_drv = {
        },
 };
 
-builtin_platform_driver(clk_mt6779_vdec_drv);
+module_platform_driver(clk_mt6779_vdec_drv);
+MODULE_LICENSE("GPL");
index b41d1f8..ff67084 100644 (file)
@@ -4,6 +4,7 @@
  * Author: Wendell Lin <wendell.lin@mediatek.com>
  */
 
+#include <linux/module.h>
 #include <linux/clk-provider.h>
 #include <linux/platform_device.h>
 
@@ -55,4 +56,5 @@ static struct platform_driver clk_mt6779_venc_drv = {
        },
 };
 
-builtin_platform_driver(clk_mt6779_venc_drv);
+module_platform_driver(clk_mt6779_venc_drv);
+MODULE_LICENSE("GPL");
index 6e0d3a1..9825385 100644 (file)
@@ -4,6 +4,7 @@
  * Author: Wendell Lin <wendell.lin@mediatek.com>
  */
 
+#include <linux/module.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/of_device.h>
@@ -1314,3 +1315,4 @@ static int __init clk_mt6779_init(void)
 }
 
 arch_initcall(clk_mt6779_init);
+MODULE_LICENSE("GPL");
diff --git a/drivers/clk/mediatek/clk-mt8195-apmixedsys.c b/drivers/clk/mediatek/clk-mt8195-apmixedsys.c
new file mode 100644 (file)
index 0000000..6156cee
--- /dev/null
@@ -0,0 +1,145 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+#include <dt-bindings/clock/mt8195-clk.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+
+static const struct mtk_gate_regs apmixed_cg_regs = {
+       .set_ofs = 0x8,
+       .clr_ofs = 0x8,
+       .sta_ofs = 0x8,
+};
+
+#define GATE_APMIXED(_id, _name, _parent, _shift)                      \
+       GATE_MTK(_id, _name, _parent, &apmixed_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr_inv)
+
+static const struct mtk_gate apmixed_clks[] = {
+       GATE_APMIXED(CLK_APMIXED_PLL_SSUSB26M, "pll_ssusb26m", "clk26m", 1),
+};
+
+#define MT8195_PLL_FMAX                (3800UL * MHZ)
+#define MT8195_PLL_FMIN                (1500UL * MHZ)
+#define MT8195_INTEGER_BITS    8
+
+#define PLL(_id, _name, _reg, _pwr_reg, _en_mask, _flags,              \
+           _rst_bar_mask, _pcwbits, _pd_reg, _pd_shift,                \
+           _tuner_reg, _tuner_en_reg, _tuner_en_bit,                   \
+           _pcw_reg, _pcw_shift, _pcw_chg_reg,                         \
+           _en_reg, _pll_en_bit) {                                     \
+               .id = _id,                                              \
+               .name = _name,                                          \
+               .reg = _reg,                                            \
+               .pwr_reg = _pwr_reg,                                    \
+               .en_mask = _en_mask,                                    \
+               .flags = _flags,                                        \
+               .rst_bar_mask = _rst_bar_mask,                          \
+               .fmax = MT8195_PLL_FMAX,                                \
+               .fmin = MT8195_PLL_FMIN,                                \
+               .pcwbits = _pcwbits,                                    \
+               .pcwibits = MT8195_INTEGER_BITS,                        \
+               .pd_reg = _pd_reg,                                      \
+               .pd_shift = _pd_shift,                                  \
+               .tuner_reg = _tuner_reg,                                \
+               .tuner_en_reg = _tuner_en_reg,                          \
+               .tuner_en_bit = _tuner_en_bit,                          \
+               .pcw_reg = _pcw_reg,                                    \
+               .pcw_shift = _pcw_shift,                                \
+               .pcw_chg_reg = _pcw_chg_reg,                            \
+               .en_reg = _en_reg,                                      \
+               .pll_en_bit = _pll_en_bit,                              \
+       }
+
+static const struct mtk_pll_data plls[] = {
+       PLL(CLK_APMIXED_NNAPLL, "nnapll", 0x0390, 0x03a0, 0,
+           0, 0, 22, 0x0398, 24, 0, 0, 0, 0x0398, 0, 0x0398, 0, 9),
+       PLL(CLK_APMIXED_RESPLL, "respll", 0x0190, 0x0320, 0,
+           0, 0, 22, 0x0198, 24, 0, 0, 0, 0x0198, 0, 0x0198, 0, 9),
+       PLL(CLK_APMIXED_ETHPLL, "ethpll", 0x0360, 0x0370, 0,
+           0, 0, 22, 0x0368, 24, 0, 0, 0, 0x0368, 0, 0x0368, 0, 9),
+       PLL(CLK_APMIXED_MSDCPLL, "msdcpll", 0x0710, 0x0720, 0,
+           0, 0, 22, 0x0718, 24, 0, 0, 0, 0x0718, 0, 0x0718, 0, 9),
+       PLL(CLK_APMIXED_TVDPLL1, "tvdpll1", 0x00a0, 0x00b0, 0,
+           0, 0, 22, 0x00a8, 24, 0, 0, 0, 0x00a8, 0, 0x00a8, 0, 9),
+       PLL(CLK_APMIXED_TVDPLL2, "tvdpll2", 0x00c0, 0x00d0, 0,
+           0, 0, 22, 0x00c8, 24, 0, 0, 0, 0x00c8, 0, 0x00c8, 0, 9),
+       PLL(CLK_APMIXED_MMPLL, "mmpll", 0x00e0, 0x00f0, 0xff000000,
+           HAVE_RST_BAR, BIT(23), 22, 0x00e8, 24, 0, 0, 0, 0x00e8, 0, 0x00e8, 0, 9),
+       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x01d0, 0x01e0, 0xff000000,
+           HAVE_RST_BAR, BIT(23), 22, 0x01d8, 24, 0, 0, 0, 0x01d8, 0, 0x01d8, 0, 9),
+       PLL(CLK_APMIXED_VDECPLL, "vdecpll", 0x0890, 0x08a0, 0,
+           0, 0, 22, 0x0898, 24, 0, 0, 0, 0x0898, 0, 0x0898, 0, 9),
+       PLL(CLK_APMIXED_IMGPLL, "imgpll", 0x0100, 0x0110, 0,
+           0, 0, 22, 0x0108, 24, 0, 0, 0, 0x0108, 0, 0x0108, 0, 9),
+       PLL(CLK_APMIXED_UNIVPLL, "univpll", 0x01f0, 0x0700, 0xff000000,
+           HAVE_RST_BAR, BIT(23), 22, 0x01f8, 24, 0, 0, 0, 0x01f8, 0, 0x01f8, 0, 9),
+       PLL(CLK_APMIXED_HDMIPLL1, "hdmipll1", 0x08c0, 0x08d0, 0,
+           0, 0, 22, 0x08c8, 24, 0, 0, 0, 0x08c8, 0, 0x08c8, 0, 9),
+       PLL(CLK_APMIXED_HDMIPLL2, "hdmipll2", 0x0870, 0x0880, 0,
+           0, 0, 22, 0x0878, 24, 0, 0, 0, 0x0878, 0, 0x0878, 0, 9),
+       PLL(CLK_APMIXED_HDMIRX_APLL, "hdmirx_apll", 0x08e0, 0x0dd4, 0,
+           0, 0, 32, 0x08e8, 24, 0, 0, 0, 0x08ec, 0, 0x08e8, 0, 9),
+       PLL(CLK_APMIXED_USB1PLL, "usb1pll", 0x01a0, 0x01b0, 0,
+           0, 0, 22, 0x01a8, 24, 0, 0, 0, 0x01a8, 0, 0x01a8, 0, 9),
+       PLL(CLK_APMIXED_ADSPPLL, "adsppll", 0x07e0, 0x07f0, 0,
+           0, 0, 22, 0x07e8, 24, 0, 0, 0, 0x07e8, 0, 0x07e8, 0, 9),
+       PLL(CLK_APMIXED_APLL1, "apll1", 0x07c0, 0x0dc0, 0,
+           0, 0, 32, 0x07c8, 24, 0x0470, 0x0000, 12, 0x07cc, 0, 0x07c8, 0, 9),
+       PLL(CLK_APMIXED_APLL2, "apll2", 0x0780, 0x0dc4, 0,
+           0, 0, 32, 0x0788, 24, 0x0474, 0x0000, 13, 0x078c, 0, 0x0788, 0, 9),
+       PLL(CLK_APMIXED_APLL3, "apll3", 0x0760, 0x0dc8, 0,
+           0, 0, 32, 0x0768, 24, 0x0478, 0x0000, 14, 0x076c, 0, 0x0768, 0, 9),
+       PLL(CLK_APMIXED_APLL4, "apll4", 0x0740, 0x0dcc, 0,
+           0, 0, 32, 0x0748, 24, 0x047C, 0x0000, 15, 0x074c, 0, 0x0748, 0, 9),
+       PLL(CLK_APMIXED_APLL5, "apll5", 0x07a0, 0x0dd0, 0x100000,
+           0, 0, 32, 0x07a8, 24, 0x0480, 0x0000, 16, 0x07ac, 0, 0x07a8, 0, 9),
+       PLL(CLK_APMIXED_MFGPLL, "mfgpll", 0x0340, 0x0350, 0,
+           0, 0, 22, 0x0348, 24, 0, 0, 0, 0x0348, 0, 0x0348, 0, 9),
+       PLL(CLK_APMIXED_DGIPLL, "dgipll", 0x0150, 0x0160, 0,
+           0, 0, 22, 0x0158, 24, 0, 0, 0, 0x0158, 0, 0x0158, 0, 9),
+};
+
+static const struct of_device_id of_match_clk_mt8195_apmixed[] = {
+       { .compatible = "mediatek,mt8195-apmixedsys", },
+       {}
+};
+
+static int clk_mt8195_apmixed_probe(struct platform_device *pdev)
+{
+       struct clk_onecell_data *clk_data;
+       struct device_node *node = pdev->dev.of_node;
+       int r;
+
+       clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK);
+       if (!clk_data)
+               return -ENOMEM;
+
+       mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
+       r = mtk_clk_register_gates(node, apmixed_clks, ARRAY_SIZE(apmixed_clks), clk_data);
+       if (r)
+               goto free_apmixed_data;
+
+       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       if (r)
+               goto free_apmixed_data;
+
+       return r;
+
+free_apmixed_data:
+       mtk_free_clk_data(clk_data);
+       return r;
+}
+
+static struct platform_driver clk_mt8195_apmixed_drv = {
+       .probe = clk_mt8195_apmixed_probe,
+       .driver = {
+               .name = "clk-mt8195-apmixed",
+               .of_match_table = of_match_clk_mt8195_apmixed,
+       },
+};
+builtin_platform_driver(clk_mt8195_apmixed_drv);
diff --git a/drivers/clk/mediatek/clk-mt8195-apusys_pll.c b/drivers/clk/mediatek/clk-mt8195-apusys_pll.c
new file mode 100644 (file)
index 0000000..f1c8418
--- /dev/null
@@ -0,0 +1,92 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include "clk-mtk.h"
+
+#include <dt-bindings/clock/mt8195-clk.h>
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+
+#define MT8195_PLL_FMAX                (3800UL * MHZ)
+#define MT8195_PLL_FMIN                (1500UL * MHZ)
+#define MT8195_INTEGER_BITS    (8)
+#define MT8195_PCW_BITS                (22)
+#define MT8195_POSDIV_SHIFT    (24)
+#define MT8195_PLL_EN_BIT      (0)
+#define MT8195_PCW_SHIFT       (0)
+
+/*
+ * The "en_reg" and "pcw_chg_reg" fields are standard offset register compared
+ * with "reg" field, so set zero to imply it.
+ * No tuner control in apu pll, so set "tuner_XXX" as zero to imply it.
+ * No rst or post divider enable in apu pll, so set "rst_bar_mask" and "en_mask"
+ * as zero to imply it.
+ */
+#define PLL(_id, _name, _reg, _pwr_reg, _pd_reg, _pcw_reg) {           \
+               .id = _id,                                              \
+               .name = _name,                                          \
+               .reg = _reg,                                            \
+               .pwr_reg = _pwr_reg,                                    \
+               .en_mask = 0,                                           \
+               .flags = 0,                                             \
+               .rst_bar_mask = 0,                                      \
+               .fmax = MT8195_PLL_FMAX,                                \
+               .fmin = MT8195_PLL_FMIN,                                \
+               .pcwbits = MT8195_PCW_BITS,                             \
+               .pcwibits = MT8195_INTEGER_BITS,                        \
+               .pd_reg = _pd_reg,                                      \
+               .pd_shift = MT8195_POSDIV_SHIFT,                        \
+               .tuner_reg = 0,                                         \
+               .tuner_en_reg = 0,                                      \
+               .tuner_en_bit = 0,                                      \
+               .pcw_reg = _pcw_reg,                                    \
+               .pcw_shift = MT8195_PCW_SHIFT,                          \
+               .pcw_chg_reg = 0,                                       \
+               .en_reg = 0,                                            \
+               .pll_en_bit = MT8195_PLL_EN_BIT,                        \
+       }
+
+static const struct mtk_pll_data apusys_plls[] = {
+       PLL(CLK_APUSYS_PLL_APUPLL, "apusys_pll_apupll", 0x008, 0x014, 0x00c, 0x00c),
+       PLL(CLK_APUSYS_PLL_NPUPLL, "apusys_pll_npupll", 0x018, 0x024, 0x01c, 0x01c),
+       PLL(CLK_APUSYS_PLL_APUPLL1, "apusys_pll_apupll1", 0x028, 0x034, 0x02c, 0x02c),
+       PLL(CLK_APUSYS_PLL_APUPLL2, "apusys_pll_apupll2", 0x038, 0x044, 0x03c, 0x03c),
+};
+
+static int clk_mt8195_apusys_pll_probe(struct platform_device *pdev)
+{
+       struct clk_onecell_data *clk_data;
+       struct device_node *node = pdev->dev.of_node;
+       int r;
+
+       clk_data = mtk_alloc_clk_data(CLK_APUSYS_PLL_NR_CLK);
+       if (!clk_data)
+               return -ENOMEM;
+
+       mtk_clk_register_plls(node, apusys_plls, ARRAY_SIZE(apusys_plls), clk_data);
+       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       if (r)
+               goto free_apusys_pll_data;
+
+       return r;
+
+free_apusys_pll_data:
+       mtk_free_clk_data(clk_data);
+       return r;
+}
+
+static const struct of_device_id of_match_clk_mt8195_apusys_pll[] = {
+       { .compatible = "mediatek,mt8195-apusys_pll", },
+       {}
+};
+
+static struct platform_driver clk_mt8195_apusys_pll_drv = {
+       .probe = clk_mt8195_apusys_pll_probe,
+       .driver = {
+               .name = "clk-mt8195-apusys_pll",
+               .of_match_table = of_match_clk_mt8195_apusys_pll,
+       },
+};
+builtin_platform_driver(clk_mt8195_apusys_pll_drv);
diff --git a/drivers/clk/mediatek/clk-mt8195-cam.c b/drivers/clk/mediatek/clk-mt8195-cam.c
new file mode 100644 (file)
index 0000000..3d261fc
--- /dev/null
@@ -0,0 +1,142 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+#include <dt-bindings/clock/mt8195-clk.h>
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+
+static const struct mtk_gate_regs cam_cg_regs = {
+       .set_ofs = 0x4,
+       .clr_ofs = 0x8,
+       .sta_ofs = 0x0,
+};
+
+#define GATE_CAM(_id, _name, _parent, _shift)                  \
+       GATE_MTK(_id, _name, _parent, &cam_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+static const struct mtk_gate cam_clks[] = {
+       GATE_CAM(CLK_CAM_LARB13, "cam_larb13", "top_cam", 0),
+       GATE_CAM(CLK_CAM_LARB14, "cam_larb14", "top_cam", 1),
+       GATE_CAM(CLK_CAM_MAIN_CAM, "cam_main_cam", "top_cam", 3),
+       GATE_CAM(CLK_CAM_MAIN_CAMTG, "cam_main_camtg", "top_cam", 4),
+       GATE_CAM(CLK_CAM_SENINF, "cam_seninf", "top_cam", 5),
+       GATE_CAM(CLK_CAM_GCAMSVA, "cam_gcamsva", "top_cam", 6),
+       GATE_CAM(CLK_CAM_GCAMSVB, "cam_gcamsvb", "top_cam", 7),
+       GATE_CAM(CLK_CAM_GCAMSVC, "cam_gcamsvc", "top_cam", 8),
+       GATE_CAM(CLK_CAM_SCAMSA, "cam_scamsa", "top_cam", 9),
+       GATE_CAM(CLK_CAM_SCAMSB, "cam_scamsb", "top_cam", 10),
+       GATE_CAM(CLK_CAM_CAMSV_TOP, "cam_camsv_top", "top_cam", 11),
+       GATE_CAM(CLK_CAM_CAMSV_CQ, "cam_camsv_cq", "top_cam", 12),
+       GATE_CAM(CLK_CAM_ADL, "cam_adl", "top_cam", 16),
+       GATE_CAM(CLK_CAM_ASG, "cam_asg", "top_cam", 17),
+       GATE_CAM(CLK_CAM_PDA, "cam_pda", "top_cam", 18),
+       GATE_CAM(CLK_CAM_FAKE_ENG, "cam_fake_eng", "top_cam", 19),
+       GATE_CAM(CLK_CAM_MAIN_MRAW0, "cam_main_mraw0", "top_cam", 20),
+       GATE_CAM(CLK_CAM_MAIN_MRAW1, "cam_main_mraw1", "top_cam", 21),
+       GATE_CAM(CLK_CAM_MAIN_MRAW2, "cam_main_mraw2", "top_cam", 22),
+       GATE_CAM(CLK_CAM_MAIN_MRAW3, "cam_main_mraw3", "top_cam", 23),
+       GATE_CAM(CLK_CAM_CAM2MM0_GALS, "cam_cam2mm0_gals", "top_cam", 24),
+       GATE_CAM(CLK_CAM_CAM2MM1_GALS, "cam_cam2mm1_gals", "top_cam", 25),
+       GATE_CAM(CLK_CAM_CAM2SYS_GALS, "cam_cam2sys_gals", "top_cam", 26),
+};
+
+static const struct mtk_gate cam_mraw_clks[] = {
+       GATE_CAM(CLK_CAM_MRAW_LARBX, "cam_mraw_larbx", "top_cam", 0),
+       GATE_CAM(CLK_CAM_MRAW_CAMTG, "cam_mraw_camtg", "top_cam", 2),
+       GATE_CAM(CLK_CAM_MRAW_MRAW0, "cam_mraw_mraw0", "top_cam", 3),
+       GATE_CAM(CLK_CAM_MRAW_MRAW1, "cam_mraw_mraw1", "top_cam", 4),
+       GATE_CAM(CLK_CAM_MRAW_MRAW2, "cam_mraw_mraw2", "top_cam", 5),
+       GATE_CAM(CLK_CAM_MRAW_MRAW3, "cam_mraw_mraw3", "top_cam", 6),
+};
+
+static const struct mtk_gate cam_rawa_clks[] = {
+       GATE_CAM(CLK_CAM_RAWA_LARBX, "cam_rawa_larbx", "top_cam", 0),
+       GATE_CAM(CLK_CAM_RAWA_CAM, "cam_rawa_cam", "top_cam", 1),
+       GATE_CAM(CLK_CAM_RAWA_CAMTG, "cam_rawa_camtg", "top_cam", 2),
+};
+
+static const struct mtk_gate cam_rawb_clks[] = {
+       GATE_CAM(CLK_CAM_RAWB_LARBX, "cam_rawb_larbx", "top_cam", 0),
+       GATE_CAM(CLK_CAM_RAWB_CAM, "cam_rawb_cam", "top_cam", 1),
+       GATE_CAM(CLK_CAM_RAWB_CAMTG, "cam_rawb_camtg", "top_cam", 2),
+};
+
+static const struct mtk_gate cam_yuva_clks[] = {
+       GATE_CAM(CLK_CAM_YUVA_LARBX, "cam_yuva_larbx", "top_cam", 0),
+       GATE_CAM(CLK_CAM_YUVA_CAM, "cam_yuva_cam", "top_cam", 1),
+       GATE_CAM(CLK_CAM_YUVA_CAMTG, "cam_yuva_camtg", "top_cam", 2),
+};
+
+static const struct mtk_gate cam_yuvb_clks[] = {
+       GATE_CAM(CLK_CAM_YUVB_LARBX, "cam_yuvb_larbx", "top_cam", 0),
+       GATE_CAM(CLK_CAM_YUVB_CAM, "cam_yuvb_cam", "top_cam", 1),
+       GATE_CAM(CLK_CAM_YUVB_CAMTG, "cam_yuvb_camtg", "top_cam", 2),
+};
+
+static const struct mtk_clk_desc cam_desc = {
+       .clks = cam_clks,
+       .num_clks = ARRAY_SIZE(cam_clks),
+};
+
+static const struct mtk_clk_desc cam_mraw_desc = {
+       .clks = cam_mraw_clks,
+       .num_clks = ARRAY_SIZE(cam_mraw_clks),
+};
+
+static const struct mtk_clk_desc cam_rawa_desc = {
+       .clks = cam_rawa_clks,
+       .num_clks = ARRAY_SIZE(cam_rawa_clks),
+};
+
+static const struct mtk_clk_desc cam_rawb_desc = {
+       .clks = cam_rawb_clks,
+       .num_clks = ARRAY_SIZE(cam_rawb_clks),
+};
+
+static const struct mtk_clk_desc cam_yuva_desc = {
+       .clks = cam_yuva_clks,
+       .num_clks = ARRAY_SIZE(cam_yuva_clks),
+};
+
+static const struct mtk_clk_desc cam_yuvb_desc = {
+       .clks = cam_yuvb_clks,
+       .num_clks = ARRAY_SIZE(cam_yuvb_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8195_cam[] = {
+       {
+               .compatible = "mediatek,mt8195-camsys",
+               .data = &cam_desc,
+       }, {
+               .compatible = "mediatek,mt8195-camsys_mraw",
+               .data = &cam_mraw_desc,
+       }, {
+               .compatible = "mediatek,mt8195-camsys_rawa",
+               .data = &cam_rawa_desc,
+       }, {
+               .compatible = "mediatek,mt8195-camsys_rawb",
+               .data = &cam_rawb_desc,
+       }, {
+               .compatible = "mediatek,mt8195-camsys_yuva",
+               .data = &cam_yuva_desc,
+       }, {
+               .compatible = "mediatek,mt8195-camsys_yuvb",
+               .data = &cam_yuvb_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8195_cam_drv = {
+       .probe = mtk_clk_simple_probe,
+       .driver = {
+               .name = "clk-mt8195-cam",
+               .of_match_table = of_match_clk_mt8195_cam,
+       },
+};
+builtin_platform_driver(clk_mt8195_cam_drv);
diff --git a/drivers/clk/mediatek/clk-mt8195-ccu.c b/drivers/clk/mediatek/clk-mt8195-ccu.c
new file mode 100644 (file)
index 0000000..f846f1d
--- /dev/null
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+#include <dt-bindings/clock/mt8195-clk.h>
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+
+static const struct mtk_gate_regs ccu_cg_regs = {
+       .set_ofs = 0x4,
+       .clr_ofs = 0x8,
+       .sta_ofs = 0x0,
+};
+
+#define GATE_CCU(_id, _name, _parent, _shift)                  \
+       GATE_MTK(_id, _name, _parent, &ccu_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+static const struct mtk_gate ccu_clks[] = {
+       GATE_CCU(CLK_CCU_LARB18, "ccu_larb18", "top_ccu", 0),
+       GATE_CCU(CLK_CCU_AHB, "ccu_ahb", "top_ccu", 1),
+       GATE_CCU(CLK_CCU_CCU0, "ccu_ccu0", "top_ccu", 2),
+       GATE_CCU(CLK_CCU_CCU1, "ccu_ccu1", "top_ccu", 3),
+};
+
+static const struct mtk_clk_desc ccu_desc = {
+       .clks = ccu_clks,
+       .num_clks = ARRAY_SIZE(ccu_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8195_ccu[] = {
+       {
+               .compatible = "mediatek,mt8195-ccusys",
+               .data = &ccu_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8195_ccu_drv = {
+       .probe = mtk_clk_simple_probe,
+       .driver = {
+               .name = "clk-mt8195-ccu",
+               .of_match_table = of_match_clk_mt8195_ccu,
+       },
+};
+builtin_platform_driver(clk_mt8195_ccu_drv);
diff --git a/drivers/clk/mediatek/clk-mt8195-img.c b/drivers/clk/mediatek/clk-mt8195-img.c
new file mode 100644 (file)
index 0000000..22b52a8
--- /dev/null
@@ -0,0 +1,96 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+#include <dt-bindings/clock/mt8195-clk.h>
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+
+static const struct mtk_gate_regs img_cg_regs = {
+       .set_ofs = 0x4,
+       .clr_ofs = 0x8,
+       .sta_ofs = 0x0,
+};
+
+#define GATE_IMG(_id, _name, _parent, _shift)                  \
+       GATE_MTK(_id, _name, _parent, &img_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+static const struct mtk_gate img_clks[] = {
+       GATE_IMG(CLK_IMG_LARB9, "img_larb9", "top_img", 0),
+       GATE_IMG(CLK_IMG_TRAW0, "img_traw0", "top_img", 1),
+       GATE_IMG(CLK_IMG_TRAW1, "img_traw1", "top_img", 2),
+       GATE_IMG(CLK_IMG_TRAW2, "img_traw2", "top_img", 3),
+       GATE_IMG(CLK_IMG_TRAW3, "img_traw3", "top_img", 4),
+       GATE_IMG(CLK_IMG_DIP0, "img_dip0", "top_img", 8),
+       GATE_IMG(CLK_IMG_WPE0, "img_wpe0", "top_img", 9),
+       GATE_IMG(CLK_IMG_IPE, "img_ipe", "top_img", 10),
+       GATE_IMG(CLK_IMG_DIP1, "img_dip1", "top_img", 11),
+       GATE_IMG(CLK_IMG_WPE1, "img_wpe1", "top_img", 12),
+       GATE_IMG(CLK_IMG_GALS, "img_gals", "top_img", 31),
+};
+
+static const struct mtk_gate img1_dip_top_clks[] = {
+       GATE_IMG(CLK_IMG1_DIP_TOP_LARB10, "img1_dip_top_larb10", "top_img", 0),
+       GATE_IMG(CLK_IMG1_DIP_TOP_DIP_TOP, "img1_dip_top_dip_top", "top_img", 1),
+};
+
+static const struct mtk_gate img1_dip_nr_clks[] = {
+       GATE_IMG(CLK_IMG1_DIP_NR_RESERVE, "img1_dip_nr_reserve", "top_img", 0),
+       GATE_IMG(CLK_IMG1_DIP_NR_DIP_NR, "img1_dip_nr_dip_nr", "top_img", 1),
+};
+
+static const struct mtk_gate img1_wpe_clks[] = {
+       GATE_IMG(CLK_IMG1_WPE_LARB11, "img1_wpe_larb11", "top_img", 0),
+       GATE_IMG(CLK_IMG1_WPE_WPE, "img1_wpe_wpe", "top_img", 1),
+};
+
+static const struct mtk_clk_desc img_desc = {
+       .clks = img_clks,
+       .num_clks = ARRAY_SIZE(img_clks),
+};
+
+static const struct mtk_clk_desc img1_dip_top_desc = {
+       .clks = img1_dip_top_clks,
+       .num_clks = ARRAY_SIZE(img1_dip_top_clks),
+};
+
+static const struct mtk_clk_desc img1_dip_nr_desc = {
+       .clks = img1_dip_nr_clks,
+       .num_clks = ARRAY_SIZE(img1_dip_nr_clks),
+};
+
+static const struct mtk_clk_desc img1_wpe_desc = {
+       .clks = img1_wpe_clks,
+       .num_clks = ARRAY_SIZE(img1_wpe_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8195_img[] = {
+       {
+               .compatible = "mediatek,mt8195-imgsys",
+               .data = &img_desc,
+       }, {
+               .compatible = "mediatek,mt8195-imgsys1_dip_top",
+               .data = &img1_dip_top_desc,
+       }, {
+               .compatible = "mediatek,mt8195-imgsys1_dip_nr",
+               .data = &img1_dip_nr_desc,
+       }, {
+               .compatible = "mediatek,mt8195-imgsys1_wpe",
+               .data = &img1_wpe_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8195_img_drv = {
+       .probe = mtk_clk_simple_probe,
+       .driver = {
+               .name = "clk-mt8195-img",
+               .of_match_table = of_match_clk_mt8195_img,
+       },
+};
+builtin_platform_driver(clk_mt8195_img_drv);
diff --git a/drivers/clk/mediatek/clk-mt8195-imp_iic_wrap.c b/drivers/clk/mediatek/clk-mt8195-imp_iic_wrap.c
new file mode 100644 (file)
index 0000000..0e2ac0a
--- /dev/null
@@ -0,0 +1,68 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+#include <dt-bindings/clock/mt8195-clk.h>
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+
+#include <dt-bindings/clock/mt8195-clk.h>
+
+static const struct mtk_gate_regs imp_iic_wrap_cg_regs = {
+       .set_ofs = 0xe08,
+       .clr_ofs = 0xe04,
+       .sta_ofs = 0xe00,
+};
+
+#define GATE_IMP_IIC_WRAP(_id, _name, _parent, _shift)                         \
+       GATE_MTK_FLAGS(_id, _name, _parent, &imp_iic_wrap_cg_regs, _shift,      \
+               &mtk_clk_gate_ops_setclr, CLK_OPS_PARENT_ENABLE)
+
+static const struct mtk_gate imp_iic_wrap_s_clks[] = {
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_S_I2C5, "imp_iic_wrap_s_i2c5", "top_i2c", 0),
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_S_I2C6, "imp_iic_wrap_s_i2c6", "top_i2c", 1),
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_S_I2C7, "imp_iic_wrap_s_i2c7", "top_i2c", 2),
+};
+
+static const struct mtk_gate imp_iic_wrap_w_clks[] = {
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_W_I2C0, "imp_iic_wrap_w_i2c0", "top_i2c", 0),
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_W_I2C1, "imp_iic_wrap_w_i2c1", "top_i2c", 1),
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_W_I2C2, "imp_iic_wrap_w_i2c2", "top_i2c", 2),
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_W_I2C3, "imp_iic_wrap_w_i2c3", "top_i2c", 3),
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_W_I2C4, "imp_iic_wrap_w_i2c4", "top_i2c", 4),
+};
+
+static const struct mtk_clk_desc imp_iic_wrap_s_desc = {
+       .clks = imp_iic_wrap_s_clks,
+       .num_clks = ARRAY_SIZE(imp_iic_wrap_s_clks),
+};
+
+static const struct mtk_clk_desc imp_iic_wrap_w_desc = {
+       .clks = imp_iic_wrap_w_clks,
+       .num_clks = ARRAY_SIZE(imp_iic_wrap_w_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8195_imp_iic_wrap[] = {
+       {
+               .compatible = "mediatek,mt8195-imp_iic_wrap_s",
+               .data = &imp_iic_wrap_s_desc,
+       }, {
+               .compatible = "mediatek,mt8195-imp_iic_wrap_w",
+               .data = &imp_iic_wrap_w_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8195_imp_iic_wrap_drv = {
+       .probe = mtk_clk_simple_probe,
+       .driver = {
+               .name = "clk-mt8195-imp_iic_wrap",
+               .of_match_table = of_match_clk_mt8195_imp_iic_wrap,
+       },
+};
+builtin_platform_driver(clk_mt8195_imp_iic_wrap_drv);
diff --git a/drivers/clk/mediatek/clk-mt8195-infra_ao.c b/drivers/clk/mediatek/clk-mt8195-infra_ao.c
new file mode 100644 (file)
index 0000000..5f9b699
--- /dev/null
@@ -0,0 +1,206 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+#include <dt-bindings/clock/mt8195-clk.h>
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+
+static const struct mtk_gate_regs infra_ao0_cg_regs = {
+       .set_ofs = 0x80,
+       .clr_ofs = 0x84,
+       .sta_ofs = 0x90,
+};
+
+static const struct mtk_gate_regs infra_ao1_cg_regs = {
+       .set_ofs = 0x88,
+       .clr_ofs = 0x8c,
+       .sta_ofs = 0x94,
+};
+
+static const struct mtk_gate_regs infra_ao2_cg_regs = {
+       .set_ofs = 0xa4,
+       .clr_ofs = 0xa8,
+       .sta_ofs = 0xac,
+};
+
+static const struct mtk_gate_regs infra_ao3_cg_regs = {
+       .set_ofs = 0xc0,
+       .clr_ofs = 0xc4,
+       .sta_ofs = 0xc8,
+};
+
+static const struct mtk_gate_regs infra_ao4_cg_regs = {
+       .set_ofs = 0xe0,
+       .clr_ofs = 0xe4,
+       .sta_ofs = 0xe8,
+};
+
+#define GATE_INFRA_AO0_FLAGS(_id, _name, _parent, _shift, _flag)                \
+       GATE_MTK_FLAGS(_id, _name, _parent, &infra_ao0_cg_regs, _shift, \
+               &mtk_clk_gate_ops_setclr, _flag)
+
+#define GATE_INFRA_AO0(_id, _name, _parent, _shift)    \
+       GATE_INFRA_AO0_FLAGS(_id, _name, _parent, _shift, 0)
+
+#define GATE_INFRA_AO1_FLAGS(_id, _name, _parent, _shift, _flag)               \
+       GATE_MTK_FLAGS(_id, _name, _parent, &infra_ao1_cg_regs, _shift, \
+               &mtk_clk_gate_ops_setclr, _flag)
+
+#define GATE_INFRA_AO1(_id, _name, _parent, _shift)    \
+       GATE_INFRA_AO1_FLAGS(_id, _name, _parent, _shift, 0)
+
+#define GATE_INFRA_AO2(_id, _name, _parent, _shift)                    \
+       GATE_MTK(_id, _name, _parent, &infra_ao2_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+#define GATE_INFRA_AO3_FLAGS(_id, _name, _parent, _shift, _flag)               \
+       GATE_MTK_FLAGS(_id, _name, _parent, &infra_ao3_cg_regs, _shift, \
+               &mtk_clk_gate_ops_setclr, _flag)
+
+#define GATE_INFRA_AO3(_id, _name, _parent, _shift)    \
+       GATE_INFRA_AO3_FLAGS(_id, _name, _parent, _shift, 0)
+
+#define GATE_INFRA_AO4_FLAGS(_id, _name, _parent, _shift, _flag)               \
+       GATE_MTK_FLAGS(_id, _name, _parent, &infra_ao4_cg_regs, _shift, \
+               &mtk_clk_gate_ops_setclr, _flag)
+
+#define GATE_INFRA_AO4(_id, _name, _parent, _shift)    \
+       GATE_INFRA_AO4_FLAGS(_id, _name, _parent, _shift, 0)
+
+static const struct mtk_gate infra_ao_clks[] = {
+       /* INFRA_AO0 */
+       GATE_INFRA_AO0(CLK_INFRA_AO_PMIC_TMR, "infra_ao_pmic_tmr", "top_pwrap_ulposc", 0),
+       GATE_INFRA_AO0(CLK_INFRA_AO_PMIC_AP, "infra_ao_pmic_ap", "top_pwrap_ulposc", 1),
+       GATE_INFRA_AO0(CLK_INFRA_AO_PMIC_MD, "infra_ao_pmic_md", "top_pwrap_ulposc", 2),
+       GATE_INFRA_AO0(CLK_INFRA_AO_PMIC_CONN, "infra_ao_pmic_conn", "top_pwrap_ulposc", 3),
+       /* infra_ao_sej is main clock is for secure engine with JTAG support */
+       GATE_INFRA_AO0_FLAGS(CLK_INFRA_AO_SEJ, "infra_ao_sej", "top_axi", 5, CLK_IS_CRITICAL),
+       GATE_INFRA_AO0(CLK_INFRA_AO_APXGPT, "infra_ao_apxgpt", "top_axi", 6),
+       GATE_INFRA_AO0(CLK_INFRA_AO_GCE, "infra_ao_gce", "top_axi", 8),
+       GATE_INFRA_AO0(CLK_INFRA_AO_GCE2, "infra_ao_gce2", "top_axi", 9),
+       GATE_INFRA_AO0(CLK_INFRA_AO_THERM, "infra_ao_therm", "top_axi", 10),
+       GATE_INFRA_AO0(CLK_INFRA_AO_PWM_H, "infra_ao_pwm_h", "top_axi", 15),
+       GATE_INFRA_AO0(CLK_INFRA_AO_PWM1, "infra_ao_pwm1", "top_pwm", 16),
+       GATE_INFRA_AO0(CLK_INFRA_AO_PWM2, "infra_ao_pwm2", "top_pwm", 17),
+       GATE_INFRA_AO0(CLK_INFRA_AO_PWM3, "infra_ao_pwm3", "top_pwm", 18),
+       GATE_INFRA_AO0(CLK_INFRA_AO_PWM4, "infra_ao_pwm4", "top_pwm", 19),
+       GATE_INFRA_AO0(CLK_INFRA_AO_PWM, "infra_ao_pwm", "top_pwm", 21),
+       GATE_INFRA_AO0(CLK_INFRA_AO_UART0, "infra_ao_uart0", "top_uart", 22),
+       GATE_INFRA_AO0(CLK_INFRA_AO_UART1, "infra_ao_uart1", "top_uart", 23),
+       GATE_INFRA_AO0(CLK_INFRA_AO_UART2, "infra_ao_uart2", "top_uart", 24),
+       GATE_INFRA_AO0(CLK_INFRA_AO_UART3, "infra_ao_uart3", "top_uart", 25),
+       GATE_INFRA_AO0(CLK_INFRA_AO_UART4, "infra_ao_uart4", "top_uart", 26),
+       GATE_INFRA_AO0(CLK_INFRA_AO_GCE_26M, "infra_ao_gce_26m", "clk26m", 27),
+       GATE_INFRA_AO0(CLK_INFRA_AO_CQ_DMA_FPC, "infra_ao_cq_dma_fpc", "fpc", 28),
+       GATE_INFRA_AO0(CLK_INFRA_AO_UART5, "infra_ao_uart5", "top_uart", 29),
+       /* INFRA_AO1 */
+       GATE_INFRA_AO1(CLK_INFRA_AO_HDMI_26M, "infra_ao_hdmi_26m", "clk26m", 0),
+       GATE_INFRA_AO1(CLK_INFRA_AO_SPI0, "infra_ao_spi0", "top_spi", 1),
+       GATE_INFRA_AO1(CLK_INFRA_AO_MSDC0, "infra_ao_msdc0", "top_msdc50_0_hclk", 2),
+       GATE_INFRA_AO1(CLK_INFRA_AO_MSDC1, "infra_ao_msdc1", "top_axi", 4),
+       GATE_INFRA_AO1(CLK_INFRA_AO_CG1_MSDC2, "infra_ao_cg1_msdc2", "top_axi", 5),
+       GATE_INFRA_AO1(CLK_INFRA_AO_MSDC0_SRC, "infra_ao_msdc0_src", "top_msdc50_0", 6),
+       GATE_INFRA_AO1(CLK_INFRA_AO_TRNG, "infra_ao_trng", "top_axi", 9),
+       GATE_INFRA_AO1(CLK_INFRA_AO_AUXADC, "infra_ao_auxadc", "clk26m", 10),
+       GATE_INFRA_AO1(CLK_INFRA_AO_CPUM, "infra_ao_cpum", "top_axi", 11),
+       GATE_INFRA_AO1(CLK_INFRA_AO_HDMI_32K, "infra_ao_hdmi_32k", "clk32k", 12),
+       GATE_INFRA_AO1(CLK_INFRA_AO_CEC_66M_H, "infra_ao_cec_66m_h", "top_axi", 13),
+       GATE_INFRA_AO1(CLK_INFRA_AO_IRRX, "infra_ao_irrx", "top_axi", 14),
+       GATE_INFRA_AO1(CLK_INFRA_AO_PCIE_TL_26M, "infra_ao_pcie_tl_26m", "clk26m", 15),
+       GATE_INFRA_AO1(CLK_INFRA_AO_MSDC1_SRC, "infra_ao_msdc1_src", "top_msdc30_1", 16),
+       GATE_INFRA_AO1(CLK_INFRA_AO_CEC_66M_B, "infra_ao_cec_66m_b", "top_axi", 17),
+       GATE_INFRA_AO1(CLK_INFRA_AO_PCIE_TL_96M, "infra_ao_pcie_tl_96m", "top_tl", 18),
+       /* infra_ao_device_apc is for device access permission control module */
+       GATE_INFRA_AO1_FLAGS(CLK_INFRA_AO_DEVICE_APC, "infra_ao_device_apc", "top_axi", 20,
+                            CLK_IS_CRITICAL),
+       GATE_INFRA_AO1(CLK_INFRA_AO_ECC_66M_H, "infra_ao_ecc_66m_h", "top_axi", 23),
+       GATE_INFRA_AO1(CLK_INFRA_AO_DEBUGSYS, "infra_ao_debugsys", "top_axi", 24),
+       GATE_INFRA_AO1(CLK_INFRA_AO_AUDIO, "infra_ao_audio", "top_axi", 25),
+       GATE_INFRA_AO1(CLK_INFRA_AO_PCIE_TL_32K, "infra_ao_pcie_tl_32k", "clk32k", 26),
+       GATE_INFRA_AO1(CLK_INFRA_AO_DBG_TRACE, "infra_ao_dbg_trace", "top_axi", 29),
+       GATE_INFRA_AO1(CLK_INFRA_AO_DRAMC_F26M, "infra_ao_dramc_f26m", "clk26m", 31),
+       /* INFRA_AO2 */
+       GATE_INFRA_AO2(CLK_INFRA_AO_IRTX, "infra_ao_irtx", "top_axi", 0),
+       GATE_INFRA_AO2(CLK_INFRA_AO_SSUSB, "infra_ao_ssusb", "top_usb_top", 1),
+       GATE_INFRA_AO2(CLK_INFRA_AO_DISP_PWM, "infra_ao_disp_pwm", "top_disp_pwm0", 2),
+       GATE_INFRA_AO2(CLK_INFRA_AO_CLDMA_B, "infra_ao_cldma_b", "top_axi", 3),
+       GATE_INFRA_AO2(CLK_INFRA_AO_AUDIO_26M_B, "infra_ao_audio_26m_b", "clk26m", 4),
+       GATE_INFRA_AO2(CLK_INFRA_AO_SPI1, "infra_ao_spi1", "top_spi", 6),
+       GATE_INFRA_AO2(CLK_INFRA_AO_SPI2, "infra_ao_spi2", "top_spi", 9),
+       GATE_INFRA_AO2(CLK_INFRA_AO_SPI3, "infra_ao_spi3", "top_spi", 10),
+       GATE_INFRA_AO2(CLK_INFRA_AO_UNIPRO_SYS, "infra_ao_unipro_sys", "top_ufs", 11),
+       GATE_INFRA_AO2(CLK_INFRA_AO_UNIPRO_TICK, "infra_ao_unipro_tick", "top_ufs_tick1us", 12),
+       GATE_INFRA_AO2(CLK_INFRA_AO_UFS_MP_SAP_B, "infra_ao_ufs_mp_sap_b", "top_ufs_mp_sap_cfg", 13),
+       GATE_INFRA_AO2(CLK_INFRA_AO_PWRMCU, "infra_ao_pwrmcu", "top_pwrmcu", 15),
+       GATE_INFRA_AO2(CLK_INFRA_AO_PWRMCU_BUS_H, "infra_ao_pwrmcu_bus_h", "top_axi", 17),
+       GATE_INFRA_AO2(CLK_INFRA_AO_APDMA_B, "infra_ao_apdma_b", "top_axi", 18),
+       GATE_INFRA_AO2(CLK_INFRA_AO_SPI4, "infra_ao_spi4", "top_spi", 25),
+       GATE_INFRA_AO2(CLK_INFRA_AO_SPI5, "infra_ao_spi5", "top_spi", 26),
+       GATE_INFRA_AO2(CLK_INFRA_AO_CQ_DMA, "infra_ao_cq_dma", "top_axi", 27),
+       GATE_INFRA_AO2(CLK_INFRA_AO_AES_UFSFDE, "infra_ao_aes_ufsfde", "top_ufs", 28),
+       GATE_INFRA_AO2(CLK_INFRA_AO_AES, "infra_ao_aes", "top_aes_ufsfde", 29),
+       GATE_INFRA_AO2(CLK_INFRA_AO_UFS_TICK, "infra_ao_ufs_tick", "top_ufs_tick1us", 30),
+       GATE_INFRA_AO2(CLK_INFRA_AO_SSUSB_XHCI, "infra_ao_ssusb_xhci", "top_ssusb_xhci", 31),
+       /* INFRA_AO3 */
+       GATE_INFRA_AO3(CLK_INFRA_AO_MSDC0_SELF, "infra_ao_msdc0f", "top_msdc50_0", 0),
+       GATE_INFRA_AO3(CLK_INFRA_AO_MSDC1_SELF, "infra_ao_msdc1f", "top_msdc50_0", 1),
+       GATE_INFRA_AO3(CLK_INFRA_AO_MSDC2_SELF, "infra_ao_msdc2f", "top_msdc50_0", 2),
+       GATE_INFRA_AO3(CLK_INFRA_AO_I2S_DMA, "infra_ao_i2s_dma", "top_axi", 5),
+       GATE_INFRA_AO3(CLK_INFRA_AO_AP_MSDC0, "infra_ao_ap_msdc0", "top_msdc50_0", 7),
+       GATE_INFRA_AO3(CLK_INFRA_AO_MD_MSDC0, "infra_ao_md_msdc0", "top_msdc50_0", 8),
+       GATE_INFRA_AO3(CLK_INFRA_AO_CG3_MSDC2, "infra_ao_cg3_msdc2", "top_msdc30_2", 9),
+       GATE_INFRA_AO3(CLK_INFRA_AO_GCPU, "infra_ao_gcpu", "top_gcpu", 10),
+       GATE_INFRA_AO3(CLK_INFRA_AO_PCIE_PERI_26M, "infra_ao_pcie_peri_26m", "clk26m", 15),
+       GATE_INFRA_AO3(CLK_INFRA_AO_GCPU_66M_B, "infra_ao_gcpu_66m_b", "top_axi", 16),
+       GATE_INFRA_AO3(CLK_INFRA_AO_GCPU_133M_B, "infra_ao_gcpu_133m_b", "top_axi", 17),
+       GATE_INFRA_AO3(CLK_INFRA_AO_DISP_PWM1, "infra_ao_disp_pwm1", "top_disp_pwm1", 20),
+       GATE_INFRA_AO3(CLK_INFRA_AO_FBIST2FPC, "infra_ao_fbist2fpc", "top_msdc50_0", 24),
+       /* infra_ao_device_apc_sync is for device access permission control module */
+       GATE_INFRA_AO3_FLAGS(CLK_INFRA_AO_DEVICE_APC_SYNC, "infra_ao_device_apc_sync", "top_axi", 25,
+                            CLK_IS_CRITICAL),
+       GATE_INFRA_AO3(CLK_INFRA_AO_PCIE_P1_PERI_26M, "infra_ao_pcie_p1_peri_26m", "clk26m", 26),
+       GATE_INFRA_AO3(CLK_INFRA_AO_SPIS0, "infra_ao_spis0", "top_spis", 28),
+       GATE_INFRA_AO3(CLK_INFRA_AO_SPIS1, "infra_ao_spis1", "top_spis", 29),
+       /* INFRA_AO4 */
+       /* infra_ao_133m_m_peri infra_ao_66m_m_peri are main clocks of peripheral */
+       GATE_INFRA_AO4_FLAGS(CLK_INFRA_AO_133M_M_PERI, "infra_ao_133m_m_peri", "top_axi", 0,
+                            CLK_IS_CRITICAL),
+       GATE_INFRA_AO4_FLAGS(CLK_INFRA_AO_66M_M_PERI, "infra_ao_66m_m_peri", "top_axi", 1,
+                            CLK_IS_CRITICAL),
+       GATE_INFRA_AO4(CLK_INFRA_AO_PCIE_PL_P_250M_P0, "infra_ao_pcie_pl_p_250m_p0", "pextp_pipe", 7),
+       GATE_INFRA_AO4(CLK_INFRA_AO_PCIE_PL_P_250M_P1, "infra_ao_pcie_pl_p_250m_p1",
+                      "ssusb_u3phy_p1_p_p0", 8),
+       GATE_INFRA_AO4(CLK_INFRA_AO_PCIE_P1_TL_96M, "infra_ao_pcie_p1_tl_96m", "top_tl_p1", 17),
+       GATE_INFRA_AO4(CLK_INFRA_AO_AES_MSDCFDE_0P, "infra_ao_aes_msdcfde_0p", "top_aes_msdcfde", 18),
+       GATE_INFRA_AO4(CLK_INFRA_AO_UFS_TX_SYMBOL, "infra_ao_ufs_tx_symbol", "ufs_tx_symbol", 22),
+       GATE_INFRA_AO4(CLK_INFRA_AO_UFS_RX_SYMBOL, "infra_ao_ufs_rx_symbol", "ufs_rx_symbol", 23),
+       GATE_INFRA_AO4(CLK_INFRA_AO_UFS_RX_SYMBOL1, "infra_ao_ufs_rx_symbol1", "ufs_rx_symbol1", 24),
+       GATE_INFRA_AO4(CLK_INFRA_AO_PERI_UFS_MEM_SUB, "infra_ao_peri_ufs_mem_sub", "mem_466m", 31),
+};
+
+static const struct mtk_clk_desc infra_ao_desc = {
+       .clks = infra_ao_clks,
+       .num_clks = ARRAY_SIZE(infra_ao_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8195_infra_ao[] = {
+       {
+               .compatible = "mediatek,mt8195-infracfg_ao",
+               .data = &infra_ao_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8195_infra_ao_drv = {
+       .probe = mtk_clk_simple_probe,
+       .driver = {
+               .name = "clk-mt8195-infra_ao",
+               .of_match_table = of_match_clk_mt8195_infra_ao,
+       },
+};
+builtin_platform_driver(clk_mt8195_infra_ao_drv);
diff --git a/drivers/clk/mediatek/clk-mt8195-ipe.c b/drivers/clk/mediatek/clk-mt8195-ipe.c
new file mode 100644 (file)
index 0000000..fc1d42b
--- /dev/null
@@ -0,0 +1,51 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+#include <dt-bindings/clock/mt8195-clk.h>
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+
+static const struct mtk_gate_regs ipe_cg_regs = {
+       .set_ofs = 0x0,
+       .clr_ofs = 0x0,
+       .sta_ofs = 0x0,
+};
+
+#define GATE_IPE(_id, _name, _parent, _shift)                  \
+       GATE_MTK(_id, _name, _parent, &ipe_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr)
+
+static const struct mtk_gate ipe_clks[] = {
+       GATE_IPE(CLK_IPE_DPE, "ipe_dpe", "top_ipe", 0),
+       GATE_IPE(CLK_IPE_FDVT, "ipe_fdvt", "top_ipe", 1),
+       GATE_IPE(CLK_IPE_ME, "ipe_me", "top_ipe", 2),
+       GATE_IPE(CLK_IPE_TOP, "ipe_top", "top_ipe", 3),
+       GATE_IPE(CLK_IPE_SMI_LARB12, "ipe_smi_larb12", "top_ipe", 4),
+};
+
+static const struct mtk_clk_desc ipe_desc = {
+       .clks = ipe_clks,
+       .num_clks = ARRAY_SIZE(ipe_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8195_ipe[] = {
+       {
+               .compatible = "mediatek,mt8195-ipesys",
+               .data = &ipe_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8195_ipe_drv = {
+       .probe = mtk_clk_simple_probe,
+       .driver = {
+               .name = "clk-mt8195-ipe",
+               .of_match_table = of_match_clk_mt8195_ipe,
+       },
+};
+builtin_platform_driver(clk_mt8195_ipe_drv);
diff --git a/drivers/clk/mediatek/clk-mt8195-mfg.c b/drivers/clk/mediatek/clk-mt8195-mfg.c
new file mode 100644 (file)
index 0000000..aca6d9c
--- /dev/null
@@ -0,0 +1,47 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+#include <dt-bindings/clock/mt8195-clk.h>
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+
+static const struct mtk_gate_regs mfg_cg_regs = {
+       .set_ofs = 0x4,
+       .clr_ofs = 0x8,
+       .sta_ofs = 0x0,
+};
+
+#define GATE_MFG(_id, _name, _parent, _shift)                  \
+       GATE_MTK(_id, _name, _parent, &mfg_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+static const struct mtk_gate mfg_clks[] = {
+       GATE_MFG(CLK_MFG_BG3D, "mfg_bg3d", "top_mfg_core_tmp", 0),
+};
+
+static const struct mtk_clk_desc mfg_desc = {
+       .clks = mfg_clks,
+       .num_clks = ARRAY_SIZE(mfg_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8195_mfg[] = {
+       {
+               .compatible = "mediatek,mt8195-mfgcfg",
+               .data = &mfg_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8195_mfg_drv = {
+       .probe = mtk_clk_simple_probe,
+       .driver = {
+               .name = "clk-mt8195-mfg",
+               .of_match_table = of_match_clk_mt8195_mfg,
+       },
+};
+builtin_platform_driver(clk_mt8195_mfg_drv);
diff --git a/drivers/clk/mediatek/clk-mt8195-peri_ao.c b/drivers/clk/mediatek/clk-mt8195-peri_ao.c
new file mode 100644 (file)
index 0000000..907a92b
--- /dev/null
@@ -0,0 +1,62 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+#include <dt-bindings/clock/mt8195-clk.h>
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+
+static const struct mtk_gate_regs peri_ao_cg_regs = {
+       .set_ofs = 0x10,
+       .clr_ofs = 0x14,
+       .sta_ofs = 0x18,
+};
+
+#define GATE_PERI_AO(_id, _name, _parent, _shift)                      \
+       GATE_MTK(_id, _name, _parent, &peri_ao_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+static const struct mtk_gate peri_ao_clks[] = {
+       GATE_PERI_AO(CLK_PERI_AO_ETHERNET, "peri_ao_ethernet", "top_axi", 0),
+       GATE_PERI_AO(CLK_PERI_AO_ETHERNET_BUS, "peri_ao_ethernet_bus", "top_axi", 1),
+       GATE_PERI_AO(CLK_PERI_AO_FLASHIF_BUS, "peri_ao_flashif_bus", "top_axi", 3),
+       GATE_PERI_AO(CLK_PERI_AO_FLASHIF_FLASH, "peri_ao_flashif_flash", "top_spinor", 5),
+       GATE_PERI_AO(CLK_PERI_AO_SSUSB_1P_BUS, "peri_ao_ssusb_1p_bus", "top_usb_top_1p", 7),
+       GATE_PERI_AO(CLK_PERI_AO_SSUSB_1P_XHCI, "peri_ao_ssusb_1p_xhci", "top_ssusb_xhci_1p", 8),
+       GATE_PERI_AO(CLK_PERI_AO_SSUSB_2P_BUS, "peri_ao_ssusb_2p_bus", "top_usb_top_2p", 9),
+       GATE_PERI_AO(CLK_PERI_AO_SSUSB_2P_XHCI, "peri_ao_ssusb_2p_xhci", "top_ssusb_xhci_2p", 10),
+       GATE_PERI_AO(CLK_PERI_AO_SSUSB_3P_BUS, "peri_ao_ssusb_3p_bus", "top_usb_top_3p", 11),
+       GATE_PERI_AO(CLK_PERI_AO_SSUSB_3P_XHCI, "peri_ao_ssusb_3p_xhci", "top_ssusb_xhci_3p", 12),
+       GATE_PERI_AO(CLK_PERI_AO_SPINFI, "peri_ao_spinfi", "top_spinfi_bclk", 15),
+       GATE_PERI_AO(CLK_PERI_AO_ETHERNET_MAC, "peri_ao_ethernet_mac", "top_snps_eth_250m", 16),
+       GATE_PERI_AO(CLK_PERI_AO_NFI_H, "peri_ao_nfi_h", "top_axi", 19),
+       GATE_PERI_AO(CLK_PERI_AO_FNFI1X, "peri_ao_fnfi1x", "top_nfi1x", 20),
+       GATE_PERI_AO(CLK_PERI_AO_PCIE_P0_MEM, "peri_ao_pcie_p0_mem", "mem_466m", 24),
+       GATE_PERI_AO(CLK_PERI_AO_PCIE_P1_MEM, "peri_ao_pcie_p1_mem", "mem_466m", 25),
+};
+
+static const struct mtk_clk_desc peri_ao_desc = {
+       .clks = peri_ao_clks,
+       .num_clks = ARRAY_SIZE(peri_ao_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8195_peri_ao[] = {
+       {
+               .compatible = "mediatek,mt8195-pericfg_ao",
+               .data = &peri_ao_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8195_peri_ao_drv = {
+       .probe = mtk_clk_simple_probe,
+       .driver = {
+               .name = "clk-mt8195-peri_ao",
+               .of_match_table = of_match_clk_mt8195_peri_ao,
+       },
+};
+builtin_platform_driver(clk_mt8195_peri_ao_drv);
diff --git a/drivers/clk/mediatek/clk-mt8195-scp_adsp.c b/drivers/clk/mediatek/clk-mt8195-scp_adsp.c
new file mode 100644 (file)
index 0000000..26b4846
--- /dev/null
@@ -0,0 +1,47 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+#include <dt-bindings/clock/mt8195-clk.h>
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+
+static const struct mtk_gate_regs scp_adsp_cg_regs = {
+       .set_ofs = 0x180,
+       .clr_ofs = 0x180,
+       .sta_ofs = 0x180,
+};
+
+#define GATE_SCP_ADSP(_id, _name, _parent, _shift)                     \
+       GATE_MTK(_id, _name, _parent, &scp_adsp_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr)
+
+static const struct mtk_gate scp_adsp_clks[] = {
+       GATE_SCP_ADSP(CLK_SCP_ADSP_AUDIODSP, "scp_adsp_audiodsp", "top_adsp", 0),
+};
+
+static const struct mtk_clk_desc scp_adsp_desc = {
+       .clks = scp_adsp_clks,
+       .num_clks = ARRAY_SIZE(scp_adsp_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8195_scp_adsp[] = {
+       {
+               .compatible = "mediatek,mt8195-scp_adsp",
+               .data = &scp_adsp_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8195_scp_adsp_drv = {
+       .probe = mtk_clk_simple_probe,
+       .driver = {
+               .name = "clk-mt8195-scp_adsp",
+               .of_match_table = of_match_clk_mt8195_scp_adsp,
+       },
+};
+builtin_platform_driver(clk_mt8195_scp_adsp_drv);
diff --git a/drivers/clk/mediatek/clk-mt8195-topckgen.c b/drivers/clk/mediatek/clk-mt8195-topckgen.c
new file mode 100644 (file)
index 0000000..3e2aba9
--- /dev/null
@@ -0,0 +1,1273 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+#include "clk-mux.h"
+
+#include <dt-bindings/clock/mt8195-clk.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+
+static DEFINE_SPINLOCK(mt8195_clk_lock);
+
+static const struct mtk_fixed_clk top_fixed_clks[] = {
+       FIXED_CLK(CLK_TOP_IN_DGI, "in_dgi", NULL, 165000000),
+       FIXED_CLK(CLK_TOP_ULPOSC1, "ulposc1", NULL, 248000000),
+       FIXED_CLK(CLK_TOP_ULPOSC2, "ulposc2", NULL, 326000000),
+       FIXED_CLK(CLK_TOP_MEM_466M, "mem_466m", NULL, 533000000),
+       FIXED_CLK(CLK_TOP_MPHONE_SLAVE_B, "mphone_slave_b", NULL, 49152000),
+       FIXED_CLK(CLK_TOP_PEXTP_PIPE, "pextp_pipe", NULL, 250000000),
+       FIXED_CLK(CLK_TOP_UFS_RX_SYMBOL, "ufs_rx_symbol", NULL, 166000000),
+       FIXED_CLK(CLK_TOP_UFS_TX_SYMBOL, "ufs_tx_symbol", NULL, 166000000),
+       FIXED_CLK(CLK_TOP_SSUSB_U3PHY_P1_P_P0, "ssusb_u3phy_p1_p_p0", NULL, 131000000),
+       FIXED_CLK(CLK_TOP_UFS_RX_SYMBOL1, "ufs_rx_symbol1", NULL, 166000000),
+       FIXED_CLK(CLK_TOP_FPC, "fpc", NULL, 50000000),
+       FIXED_CLK(CLK_TOP_HDMIRX_P, "hdmirx_p", NULL, 594000000),
+};
+
+static const struct mtk_fixed_factor top_divs[] = {
+       FACTOR(CLK_TOP_CLK26M_D2, "clk26m_d2", "clk26m", 1, 2),
+       FACTOR(CLK_TOP_CLK26M_D52, "clk26m_d52", "clk26m", 1, 52),
+       FACTOR(CLK_TOP_IN_DGI_D2, "in_dgi_d2", "in_dgi", 1, 2),
+       FACTOR(CLK_TOP_IN_DGI_D4, "in_dgi_d4", "in_dgi", 1, 4),
+       FACTOR(CLK_TOP_IN_DGI_D6, "in_dgi_d6", "in_dgi", 1, 6),
+       FACTOR(CLK_TOP_IN_DGI_D8, "in_dgi_d8", "in_dgi", 1, 8),
+       FACTOR(CLK_TOP_MAINPLL_D3, "mainpll_d3", "mainpll", 1, 3),
+       FACTOR(CLK_TOP_MAINPLL_D4, "mainpll_d4", "mainpll", 1, 4),
+       FACTOR(CLK_TOP_MAINPLL_D4_D2, "mainpll_d4_d2", "mainpll_d4", 1, 2),
+       FACTOR(CLK_TOP_MAINPLL_D4_D4, "mainpll_d4_d4", "mainpll_d4", 1, 4),
+       FACTOR(CLK_TOP_MAINPLL_D4_D8, "mainpll_d4_d8", "mainpll_d4", 1, 8),
+       FACTOR(CLK_TOP_MAINPLL_D5, "mainpll_d5", "mainpll", 1, 5),
+       FACTOR(CLK_TOP_MAINPLL_D5_D2, "mainpll_d5_d2", "mainpll_d5", 1, 2),
+       FACTOR(CLK_TOP_MAINPLL_D5_D4, "mainpll_d5_d4", "mainpll_d5", 1, 4),
+       FACTOR(CLK_TOP_MAINPLL_D5_D8, "mainpll_d5_d8", "mainpll_d5", 1, 8),
+       FACTOR(CLK_TOP_MAINPLL_D6, "mainpll_d6", "mainpll", 1, 6),
+       FACTOR(CLK_TOP_MAINPLL_D6_D2, "mainpll_d6_d2", "mainpll_d6", 1, 2),
+       FACTOR(CLK_TOP_MAINPLL_D6_D4, "mainpll_d6_d4", "mainpll_d6", 1, 4),
+       FACTOR(CLK_TOP_MAINPLL_D6_D8, "mainpll_d6_d8", "mainpll_d6", 1, 8),
+       FACTOR(CLK_TOP_MAINPLL_D7, "mainpll_d7", "mainpll", 1, 7),
+       FACTOR(CLK_TOP_MAINPLL_D7_D2, "mainpll_d7_d2", "mainpll_d7", 1, 2),
+       FACTOR(CLK_TOP_MAINPLL_D7_D4, "mainpll_d7_d4", "mainpll_d7", 1, 4),
+       FACTOR(CLK_TOP_MAINPLL_D7_D8, "mainpll_d7_d8", "mainpll_d7", 1, 8),
+       FACTOR(CLK_TOP_MAINPLL_D9, "mainpll_d9", "mainpll", 1, 9),
+       FACTOR(CLK_TOP_UNIVPLL_D2, "univpll_d2", "univpll", 1, 2),
+       FACTOR(CLK_TOP_UNIVPLL_D3, "univpll_d3", "univpll", 1, 3),
+       FACTOR(CLK_TOP_UNIVPLL_D4, "univpll_d4", "univpll", 1, 4),
+       FACTOR(CLK_TOP_UNIVPLL_D4_D2, "univpll_d4_d2", "univpll_d4", 1, 2),
+       FACTOR(CLK_TOP_UNIVPLL_D4_D4, "univpll_d4_d4", "univpll_d4", 1, 4),
+       FACTOR(CLK_TOP_UNIVPLL_D4_D8, "univpll_d4_d8", "univpll_d4", 1, 8),
+       FACTOR(CLK_TOP_UNIVPLL_D5, "univpll_d5", "univpll", 1, 5),
+       FACTOR(CLK_TOP_UNIVPLL_D5_D2, "univpll_d5_d2", "univpll_d5", 1, 2),
+       FACTOR(CLK_TOP_UNIVPLL_D5_D4, "univpll_d5_d4", "univpll_d5", 1, 4),
+       FACTOR(CLK_TOP_UNIVPLL_D5_D8, "univpll_d5_d8", "univpll_d5", 1, 8),
+       FACTOR(CLK_TOP_UNIVPLL_D6, "univpll_d6", "univpll", 1, 6),
+       FACTOR(CLK_TOP_UNIVPLL_D6_D2, "univpll_d6_d2", "univpll_d6", 1, 2),
+       FACTOR(CLK_TOP_UNIVPLL_D6_D4, "univpll_d6_d4", "univpll_d6", 1, 4),
+       FACTOR(CLK_TOP_UNIVPLL_D6_D8, "univpll_d6_d8", "univpll_d6", 1, 8),
+       FACTOR(CLK_TOP_UNIVPLL_D6_D16, "univpll_d6_d16", "univpll_d6", 1, 16),
+       FACTOR(CLK_TOP_UNIVPLL_D7, "univpll_d7", "univpll", 1, 7),
+       FACTOR(CLK_TOP_UNIVPLL_192M, "univpll_192m", "univpll", 1, 13),
+       FACTOR(CLK_TOP_UNIVPLL_192M_D4, "univpll_192m_d4", "univpll_192m", 1, 4),
+       FACTOR(CLK_TOP_UNIVPLL_192M_D8, "univpll_192m_d8", "univpll_192m", 1, 8),
+       FACTOR(CLK_TOP_UNIVPLL_192M_D16, "univpll_192m_d16", "univpll_192m", 1, 16),
+       FACTOR(CLK_TOP_UNIVPLL_192M_D32, "univpll_192m_d32", "univpll_192m", 1, 32),
+       FACTOR(CLK_TOP_APLL1_D3, "apll1_d3", "apll1", 1, 3),
+       FACTOR(CLK_TOP_APLL1_D4, "apll1_d4", "apll1", 1, 4),
+       FACTOR(CLK_TOP_APLL2_D3, "apll2_d3", "apll2", 1, 3),
+       FACTOR(CLK_TOP_APLL2_D4, "apll2_d4", "apll2", 1, 4),
+       FACTOR(CLK_TOP_APLL3_D4, "apll3_d4", "apll3", 1, 4),
+       FACTOR(CLK_TOP_APLL4_D4, "apll4_d4", "apll4", 1, 4),
+       FACTOR(CLK_TOP_APLL5_D4, "apll5_d4", "apll5", 1, 4),
+       FACTOR(CLK_TOP_HDMIRX_APLL_D3, "hdmirx_apll_d3", "hdmirx_apll", 1, 3),
+       FACTOR(CLK_TOP_HDMIRX_APLL_D4, "hdmirx_apll_d4", "hdmirx_apll", 1, 4),
+       FACTOR(CLK_TOP_HDMIRX_APLL_D6, "hdmirx_apll_d6", "hdmirx_apll", 1, 6),
+       FACTOR(CLK_TOP_MMPLL_D4, "mmpll_d4", "mmpll", 1, 4),
+       FACTOR(CLK_TOP_MMPLL_D4_D2, "mmpll_d4_d2", "mmpll_d4", 1, 2),
+       FACTOR(CLK_TOP_MMPLL_D4_D4, "mmpll_d4_d4", "mmpll_d4", 1, 4),
+       FACTOR(CLK_TOP_MMPLL_D5, "mmpll_d5", "mmpll", 1, 5),
+       FACTOR(CLK_TOP_MMPLL_D5_D2, "mmpll_d5_d2", "mmpll_d5", 1, 2),
+       FACTOR(CLK_TOP_MMPLL_D5_D4, "mmpll_d5_d4", "mmpll_d5", 1, 4),
+       FACTOR(CLK_TOP_MMPLL_D6, "mmpll_d6", "mmpll", 1, 6),
+       FACTOR(CLK_TOP_MMPLL_D6_D2, "mmpll_d6_d2", "mmpll_d6", 1, 2),
+       FACTOR(CLK_TOP_MMPLL_D7, "mmpll_d7", "mmpll", 1, 7),
+       FACTOR(CLK_TOP_MMPLL_D9, "mmpll_d9", "mmpll", 1, 9),
+       FACTOR(CLK_TOP_TVDPLL1_D2, "tvdpll1_d2", "tvdpll1", 1, 2),
+       FACTOR(CLK_TOP_TVDPLL1_D4, "tvdpll1_d4", "tvdpll1", 1, 4),
+       FACTOR(CLK_TOP_TVDPLL1_D8, "tvdpll1_d8", "tvdpll1", 1, 8),
+       FACTOR(CLK_TOP_TVDPLL1_D16, "tvdpll1_d16", "tvdpll1", 1, 16),
+       FACTOR(CLK_TOP_TVDPLL2_D2, "tvdpll2_d2", "tvdpll2", 1, 2),
+       FACTOR(CLK_TOP_TVDPLL2_D4, "tvdpll2_d4", "tvdpll2", 1, 4),
+       FACTOR(CLK_TOP_TVDPLL2_D8, "tvdpll2_d8", "tvdpll2", 1, 8),
+       FACTOR(CLK_TOP_TVDPLL2_D16, "tvdpll2_d16", "tvdpll2", 1, 16),
+       FACTOR(CLK_TOP_MSDCPLL_D2, "msdcpll_d2", "msdcpll", 1, 2),
+       FACTOR(CLK_TOP_MSDCPLL_D4, "msdcpll_d4", "msdcpll", 1, 4),
+       FACTOR(CLK_TOP_MSDCPLL_D16, "msdcpll_d16", "msdcpll", 1, 16),
+       FACTOR(CLK_TOP_ETHPLL_D2, "ethpll_d2", "ethpll", 1, 2),
+       FACTOR(CLK_TOP_ETHPLL_D8, "ethpll_d8", "ethpll", 1, 8),
+       FACTOR(CLK_TOP_ETHPLL_D10, "ethpll_d10", "ethpll", 1, 10),
+       FACTOR(CLK_TOP_DGIPLL_D2, "dgipll_d2", "dgipll", 1, 2),
+       FACTOR(CLK_TOP_ULPOSC1_D2, "ulposc1_d2", "ulposc1", 1, 2),
+       FACTOR(CLK_TOP_ULPOSC1_D4, "ulposc1_d4", "ulposc1", 1, 4),
+       FACTOR(CLK_TOP_ULPOSC1_D7, "ulposc1_d7", "ulposc1", 1, 7),
+       FACTOR(CLK_TOP_ULPOSC1_D8, "ulposc1_d8", "ulposc1", 1, 8),
+       FACTOR(CLK_TOP_ULPOSC1_D10, "ulposc1_d10", "ulposc1", 1, 10),
+       FACTOR(CLK_TOP_ULPOSC1_D16, "ulposc1_d16", "ulposc1", 1, 16),
+       FACTOR(CLK_TOP_ADSPPLL_D2, "adsppll_d2", "adsppll", 1, 2),
+       FACTOR(CLK_TOP_ADSPPLL_D4, "adsppll_d4", "adsppll", 1, 4),
+       FACTOR(CLK_TOP_ADSPPLL_D8, "adsppll_d8", "adsppll", 1, 8),
+};
+
+static const char * const axi_parents[] = {
+       "clk26m",
+       "mainpll_d4_d4",
+       "mainpll_d7_d2",
+       "mainpll_d4_d2",
+       "mainpll_d5_d2",
+       "mainpll_d6_d2",
+       "ulposc1_d4"
+};
+
+static const char * const spm_parents[] = {
+       "clk26m",
+       "ulposc1_d10",
+       "mainpll_d7_d4",
+       "clk32k"
+};
+
+static const char * const scp_parents[] = {
+       "clk26m",
+       "univpll_d4",
+       "mainpll_d6",
+       "univpll_d6",
+       "univpll_d4_d2",
+       "mainpll_d4_d2",
+       "mainpll_d4",
+       "mainpll_d6_d2"
+};
+
+static const char * const bus_aximem_parents[] = {
+       "clk26m",
+       "mainpll_d7_d2",
+       "mainpll_d4_d2",
+       "mainpll_d5_d2",
+       "mainpll_d6"
+};
+
+static const char * const vpp_parents[] = {
+       "clk26m",
+       "univpll_d6_d2",
+       "mainpll_d5_d2",
+       "mmpll_d6_d2",
+       "univpll_d5_d2",
+       "univpll_d4_d2",
+       "mmpll_d4_d2",
+       "mmpll_d7",
+       "univpll_d6",
+       "mainpll_d4",
+       "mmpll_d5",
+       "tvdpll1",
+       "tvdpll2",
+       "univpll_d4",
+       "mmpll_d4"
+};
+
+static const char * const ethdr_parents[] = {
+       "clk26m",
+       "univpll_d6_d2",
+       "mainpll_d5_d2",
+       "mmpll_d6_d2",
+       "univpll_d5_d2",
+       "univpll_d4_d2",
+       "mmpll_d4_d2",
+       "mmpll_d7",
+       "univpll_d6",
+       "mainpll_d4",
+       "mmpll_d5_d4",
+       "tvdpll1",
+       "tvdpll2",
+       "univpll_d4",
+       "mmpll_d4"
+};
+
+static const char * const ipe_parents[] = {
+       "clk26m",
+       "imgpll",
+       "mainpll_d4",
+       "mmpll_d6",
+       "univpll_d6",
+       "mainpll_d6",
+       "mmpll_d4_d2",
+       "univpll_d4_d2",
+       "mainpll_d4_d2",
+       "mmpll_d6_d2",
+       "univpll_d5_d2"
+};
+
+static const char * const cam_parents[] = {
+       "clk26m",
+       "mainpll_d4",
+       "mmpll_d4",
+       "univpll_d4",
+       "univpll_d5",
+       "univpll_d6",
+       "mmpll_d7",
+       "univpll_d4_d2",
+       "mainpll_d4_d2",
+       "imgpll"
+};
+
+static const char * const ccu_parents[] = {
+       "clk26m",
+       "univpll_d6",
+       "mainpll_d4_d2",
+       "mainpll_d4",
+       "univpll_d5",
+       "mainpll_d6",
+       "mmpll_d6",
+       "mmpll_d7",
+       "univpll_d4_d2",
+       "univpll_d7"
+};
+
+static const char * const img_parents[] = {
+       "clk26m",
+       "imgpll",
+       "univpll_d4",
+       "mainpll_d4",
+       "univpll_d5",
+       "mmpll_d6",
+       "univpll_d6",
+       "mainpll_d6",
+       "mmpll_d4_d2",
+       "univpll_d4_d2",
+       "mainpll_d4_d2",
+       "univpll_d5_d2"
+};
+
+static const char * const camtm_parents[] = {
+       "clk26m",
+       "univpll_d4_d4",
+       "univpll_d6_d2",
+       "univpll_d6_d4"
+};
+
+static const char * const dsp_parents[] = {
+       "clk26m",
+       "univpll_d6_d2",
+       "univpll_d4_d2",
+       "univpll_d5",
+       "univpll_d4",
+       "mmpll_d4",
+       "mainpll_d3",
+       "univpll_d3"
+};
+
+static const char * const dsp1_parents[] = {
+       "clk26m",
+       "univpll_d6_d2",
+       "mainpll_d4_d2",
+       "univpll_d5",
+       "mmpll_d5",
+       "univpll_d4",
+       "mainpll_d3",
+       "univpll_d3"
+};
+
+static const char * const dsp2_parents[] = {
+       "clk26m",
+       "univpll_d6_d2",
+       "univpll_d4_d2",
+       "mainpll_d4",
+       "univpll_d4",
+       "mmpll_d4",
+       "mainpll_d3",
+       "univpll_d3"
+};
+
+static const char * const ipu_if_parents[] = {
+       "clk26m",
+       "univpll_d6_d2",
+       "univpll_d5_d2",
+       "mainpll_d4_d2",
+       "mainpll_d6",
+       "univpll_d5",
+       "univpll_d4",
+       "mmpll_d4"
+};
+
+static const char * const mfg_parents[] = {
+       "clk26m",
+       "mainpll_d5_d2",
+       "univpll_d6",
+       "univpll_d7"
+};
+
+static const char * const camtg_parents[] = {
+       "clk26m",
+       "univpll_192m_d8",
+       "univpll_d6_d8",
+       "univpll_192m_d4",
+       "univpll_d6_d16",
+       "clk26m_d2",
+       "univpll_192m_d16",
+       "univpll_192m_d32"
+};
+
+static const char * const uart_parents[] = {
+       "clk26m",
+       "univpll_d6_d8"
+};
+
+static const char * const spi_parents[] = {
+       "clk26m",
+       "mainpll_d5_d4",
+       "mainpll_d6_d4",
+       "msdcpll_d4",
+       "univpll_d6_d2",
+       "mainpll_d6_d2",
+       "mainpll_d4_d4",
+       "univpll_d5_d4"
+};
+
+static const char * const spis_parents[] = {
+       "clk26m",
+       "univpll_d6",
+       "mainpll_d6",
+       "univpll_d4_d2",
+       "univpll_d6_d2",
+       "univpll_d4_d4",
+       "univpll_d6_d4",
+       "mainpll_d7_d4"
+};
+
+static const char * const msdc50_0_h_parents[] = {
+       "clk26m",
+       "mainpll_d4_d2",
+       "mainpll_d6_d2"
+};
+
+static const char * const msdc50_0_parents[] = {
+       "clk26m",
+       "msdcpll",
+       "msdcpll_d2",
+       "univpll_d4_d4",
+       "mainpll_d6_d2",
+       "univpll_d4_d2"
+};
+
+static const char * const msdc30_parents[] = {
+       "clk26m",
+       "univpll_d6_d2",
+       "mainpll_d6_d2",
+       "mainpll_d7_d2",
+       "msdcpll_d2"
+};
+
+static const char * const intdir_parents[] = {
+       "clk26m",
+       "univpll_d6",
+       "mainpll_d4",
+       "univpll_d4"
+};
+
+static const char * const aud_intbus_parents[] = {
+       "clk26m",
+       "mainpll_d4_d4",
+       "mainpll_d7_d4"
+};
+
+static const char * const audio_h_parents[] = {
+       "clk26m",
+       "univpll_d7",
+       "apll1",
+       "apll2"
+};
+
+static const char * const pwrap_ulposc_parents[] = {
+       "ulposc1_d10",
+       "clk26m",
+       "ulposc1_d4",
+       "ulposc1_d7",
+       "ulposc1_d8",
+       "ulposc1_d16",
+       "mainpll_d4_d8",
+       "univpll_d5_d8"
+};
+
+static const char * const atb_parents[] = {
+       "clk26m",
+       "mainpll_d4_d2",
+       "mainpll_d5_d2"
+};
+
+static const char * const pwrmcu_parents[] = {
+       "clk26m",
+       "mainpll_d7_d2",
+       "mainpll_d6_d2",
+       "mainpll_d5_d2",
+       "mainpll_d9",
+       "mainpll_d4_d2"
+};
+
+static const char * const dp_parents[] = {
+       "clk26m",
+       "tvdpll1_d2",
+       "tvdpll2_d2",
+       "tvdpll1_d4",
+       "tvdpll2_d4",
+       "tvdpll1_d8",
+       "tvdpll2_d8",
+       "tvdpll1_d16",
+       "tvdpll2_d16"
+};
+
+static const char * const disp_pwm_parents[] = {
+       "clk26m",
+       "univpll_d6_d4",
+       "ulposc1_d2",
+       "ulposc1_d4",
+       "ulposc1_d16"
+};
+
+static const char * const usb_parents[] = {
+       "clk26m",
+       "univpll_d5_d4",
+       "univpll_d6_d4",
+       "univpll_d5_d2"
+};
+
+static const char * const i2c_parents[] = {
+       "clk26m",
+       "mainpll_d4_d8",
+       "univpll_d5_d4"
+};
+
+static const char * const seninf_parents[] = {
+       "clk26m",
+       "univpll_d4_d4",
+       "univpll_d6_d2",
+       "univpll_d4_d2",
+       "univpll_d7",
+       "univpll_d6",
+       "mmpll_d6",
+       "univpll_d5"
+};
+
+static const char * const gcpu_parents[] = {
+       "clk26m",
+       "mainpll_d6",
+       "univpll_d4_d2",
+       "mmpll_d5_d2",
+       "univpll_d5_d2"
+};
+
+static const char * const dxcc_parents[] = {
+       "clk26m",
+       "mainpll_d4_d2",
+       "mainpll_d4_d4",
+       "mainpll_d4_d8"
+};
+
+static const char * const dpmaif_parents[] = {
+       "clk26m",
+       "univpll_d4_d4",
+       "mainpll_d6",
+       "mainpll_d4_d2",
+       "univpll_d4_d2"
+};
+
+static const char * const aes_fde_parents[] = {
+       "clk26m",
+       "mainpll_d4_d2",
+       "mainpll_d6",
+       "mainpll_d4_d4",
+       "univpll_d4_d2",
+       "univpll_d6"
+};
+
+static const char * const ufs_parents[] = {
+       "clk26m",
+       "mainpll_d4_d4",
+       "mainpll_d4_d8",
+       "univpll_d4_d4",
+       "mainpll_d6_d2",
+       "univpll_d6_d2",
+       "msdcpll_d2"
+};
+
+static const char * const ufs_tick1us_parents[] = {
+       "clk26m_d52",
+       "clk26m"
+};
+
+static const char * const ufs_mp_sap_parents[] = {
+       "clk26m",
+       "msdcpll_d16"
+};
+
+static const char * const venc_parents[] = {
+       "clk26m",
+       "mmpll_d4_d2",
+       "mainpll_d6",
+       "univpll_d4_d2",
+       "mainpll_d4_d2",
+       "univpll_d6",
+       "mmpll_d6",
+       "mainpll_d5_d2",
+       "mainpll_d6_d2",
+       "mmpll_d9",
+       "univpll_d4_d4",
+       "mainpll_d4",
+       "univpll_d4",
+       "univpll_d5",
+       "univpll_d5_d2",
+       "mainpll_d5"
+};
+
+static const char * const vdec_parents[] = {
+       "clk26m",
+       "mainpll_d5_d2",
+       "mmpll_d6_d2",
+       "univpll_d4_d2",
+       "mmpll_d4_d2",
+       "mainpll_d5",
+       "mmpll_d6",
+       "mmpll_d5",
+       "vdecpll",
+       "univpll_d4",
+       "mmpll_d4",
+       "univpll_d6_d2",
+       "mmpll_d9",
+       "univpll_d6",
+       "univpll_d5",
+       "mainpll_d4"
+};
+
+static const char * const pwm_parents[] = {
+       "clk26m",
+       "univpll_d4_d8"
+};
+
+static const char * const mcupm_parents[] = {
+       "clk26m",
+       "mainpll_d6_d2",
+       "mainpll_d7_d4",
+};
+
+static const char * const spmi_parents[] = {
+       "clk26m",
+       "clk26m_d2",
+       "ulposc1_d8",
+       "ulposc1_d10",
+       "ulposc1_d16",
+       "ulposc1_d7",
+       "clk32k",
+       "mainpll_d7_d8",
+       "mainpll_d6_d8",
+       "mainpll_d5_d8"
+};
+
+static const char * const dvfsrc_parents[] = {
+       "clk26m",
+       "ulposc1_d10",
+       "univpll_d6_d8",
+       "msdcpll_d16"
+};
+
+static const char * const tl_parents[] = {
+       "clk26m",
+       "univpll_d5_d4",
+       "mainpll_d4_d4"
+};
+
+static const char * const dsi_occ_parents[] = {
+       "clk26m",
+       "mainpll_d6_d2",
+       "univpll_d5_d2",
+       "univpll_d4_d2"
+};
+
+static const char * const wpe_vpp_parents[] = {
+       "clk26m",
+       "mainpll_d5_d2",
+       "mmpll_d6_d2",
+       "univpll_d5_d2",
+       "mainpll_d4_d2",
+       "univpll_d4_d2",
+       "mmpll_d4_d2",
+       "mainpll_d6",
+       "mmpll_d7",
+       "univpll_d6",
+       "mainpll_d5",
+       "univpll_d5",
+       "mainpll_d4",
+       "tvdpll1",
+       "univpll_d4"
+};
+
+static const char * const hdcp_parents[] = {
+       "clk26m",
+       "univpll_d4_d8",
+       "mainpll_d5_d8",
+       "univpll_d6_d4"
+};
+
+static const char * const hdcp_24m_parents[] = {
+       "clk26m",
+       "univpll_192m_d4",
+       "univpll_192m_d8",
+       "univpll_d6_d8"
+};
+
+static const char * const hd20_dacr_ref_parents[] = {
+       "clk26m",
+       "univpll_d4_d2",
+       "univpll_d4_d4",
+       "univpll_d4_d8"
+};
+
+static const char * const hd20_hdcp_c_parents[] = {
+       "clk26m",
+       "msdcpll_d4",
+       "univpll_d4_d8",
+       "univpll_d6_d8"
+};
+
+static const char * const hdmi_xtal_parents[] = {
+       "clk26m",
+       "clk26m_d2"
+};
+
+static const char * const hdmi_apb_parents[] = {
+       "clk26m",
+       "univpll_d6_d4",
+       "msdcpll_d2"
+};
+
+static const char * const snps_eth_250m_parents[] = {
+       "clk26m",
+       "ethpll_d2"
+};
+
+static const char * const snps_eth_62p4m_ptp_parents[] = {
+       "apll2_d3",
+       "apll1_d3",
+       "clk26m",
+       "ethpll_d8"
+};
+
+static const char * const snps_eth_50m_rmii_parents[] = {
+       "clk26m",
+       "ethpll_d10"
+};
+
+static const char * const dgi_out_parents[] = {
+       "clk26m",
+       "dgipll",
+       "dgipll_d2",
+       "in_dgi",
+       "in_dgi_d2",
+       "mmpll_d4_d4"
+};
+
+static const char * const nna_parents[] = {
+       "clk26m",
+       "nnapll",
+       "univpll_d4",
+       "mainpll_d4",
+       "univpll_d5",
+       "mmpll_d6",
+       "univpll_d6",
+       "mainpll_d6",
+       "mmpll_d4_d2",
+       "univpll_d4_d2",
+       "mainpll_d4_d2",
+       "mmpll_d6_d2"
+};
+
+static const char * const adsp_parents[] = {
+       "clk26m",
+       "clk26m_d2",
+       "mainpll_d6",
+       "mainpll_d5_d2",
+       "univpll_d4_d4",
+       "univpll_d4",
+       "univpll_d6",
+       "ulposc1",
+       "adsppll",
+       "adsppll_d2",
+       "adsppll_d4",
+       "adsppll_d8"
+};
+
+static const char * const asm_parents[] = {
+       "clk26m",
+       "univpll_d6_d4",
+       "univpll_d6_d2",
+       "mainpll_d5_d2"
+};
+
+static const char * const apll1_parents[] = {
+       "clk26m",
+       "apll1_d4"
+};
+
+static const char * const apll2_parents[] = {
+       "clk26m",
+       "apll2_d4"
+};
+
+static const char * const apll3_parents[] = {
+       "clk26m",
+       "apll3_d4"
+};
+
+static const char * const apll4_parents[] = {
+       "clk26m",
+       "apll4_d4"
+};
+
+static const char * const apll5_parents[] = {
+       "clk26m",
+       "apll5_d4"
+};
+
+static const char * const i2s_parents[] = {
+       "clk26m",
+       "apll1",
+       "apll2",
+       "apll3",
+       "apll4",
+       "apll5",
+       "hdmirx_apll"
+};
+
+static const char * const a1sys_hp_parents[] = {
+       "clk26m",
+       "apll1_d4"
+};
+
+static const char * const a2sys_parents[] = {
+       "clk26m",
+       "apll2_d4"
+};
+
+static const char * const a3sys_parents[] = {
+       "clk26m",
+       "apll3_d4",
+       "apll4_d4",
+       "apll5_d4",
+       "hdmirx_apll_d3",
+       "hdmirx_apll_d4",
+       "hdmirx_apll_d6"
+};
+
+static const char * const spinfi_b_parents[] = {
+       "clk26m",
+       "univpll_d6_d8",
+       "univpll_d5_d8",
+       "mainpll_d4_d8",
+       "mainpll_d7_d4",
+       "mainpll_d6_d4",
+       "univpll_d6_d4",
+       "univpll_d5_d4"
+};
+
+static const char * const nfi1x_parents[] = {
+       "clk26m",
+       "univpll_d5_d4",
+       "mainpll_d7_d4",
+       "mainpll_d6_d4",
+       "univpll_d6_d4",
+       "mainpll_d4_d4",
+       "mainpll_d7_d2",
+       "mainpll_d6_d2"
+};
+
+static const char * const ecc_parents[] = {
+       "clk26m",
+       "mainpll_d4_d4",
+       "mainpll_d5_d2",
+       "mainpll_d4_d2",
+       "mainpll_d6",
+       "univpll_d6"
+};
+
+static const char * const audio_local_bus_parents[] = {
+       "clk26m",
+       "clk26m_d2",
+       "mainpll_d4_d4",
+       "mainpll_d7_d2",
+       "mainpll_d4_d2",
+       "mainpll_d5_d2",
+       "mainpll_d6_d2",
+       "mainpll_d7",
+       "univpll_d6",
+       "ulposc1",
+       "ulposc1_d4",
+       "ulposc1_d2"
+};
+
+static const char * const spinor_parents[] = {
+       "clk26m",
+       "clk26m_d2",
+       "mainpll_d7_d8",
+       "univpll_d6_d8"
+};
+
+static const char * const dvio_dgi_ref_parents[] = {
+       "clk26m",
+       "in_dgi",
+       "in_dgi_d2",
+       "in_dgi_d4",
+       "in_dgi_d6",
+       "in_dgi_d8",
+       "mmpll_d4_d4"
+};
+
+static const char * const ulposc_parents[] = {
+       "ulposc1",
+       "ethpll_d2",
+       "mainpll_d4_d2",
+       "ethpll_d10"
+};
+
+static const char * const ulposc_core_parents[] = {
+       "ulposc2",
+       "univpll_d7",
+       "mainpll_d6",
+       "ethpll_d10"
+};
+
+static const char * const srck_parents[] = {
+       "ulposc1_d10",
+       "clk26m"
+};
+
+static const char * const mfg_fast_parents[] = {
+       "top_mfg_core_tmp",
+       "mfgpll"
+};
+
+static const struct mtk_mux top_mtk_muxes[] = {
+       /*
+        * CLK_CFG_0
+        * top_axi and top_bus_aximem are bus clocks, should not be closed by Linux.
+        * top_spm and top_scp are main clocks in always-on co-processor.
+        */
+       MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_AXI, "top_axi",
+               axi_parents, 0x020, 0x024, 0x028, 0, 3, 7, 0x04, 0, CLK_IS_CRITICAL),
+       MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SPM, "top_spm",
+               spm_parents, 0x020, 0x024, 0x028, 8, 2, 15, 0x04, 1, CLK_IS_CRITICAL),
+       MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SCP, "top_scp",
+               scp_parents, 0x020, 0x024, 0x028, 16, 3, 23, 0x04, 2, CLK_IS_CRITICAL),
+       MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_BUS_AXIMEM, "top_bus_aximem",
+               bus_aximem_parents, 0x020, 0x024, 0x028, 24, 3, 31, 0x04, 3, CLK_IS_CRITICAL),
+       /* CLK_CFG_1 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_VPP, "top_vpp",
+               vpp_parents, 0x02C, 0x030, 0x034, 0, 4, 7, 0x04, 4),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_ETHDR, "top_ethdr",
+               ethdr_parents, 0x02C, 0x030, 0x034, 8, 4, 15, 0x04, 5),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_IPE, "top_ipe",
+               ipe_parents, 0x02C, 0x030, 0x034, 16, 4, 23, 0x04, 6),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAM, "top_cam",
+               cam_parents, 0x02C, 0x030, 0x034, 24, 4, 31, 0x04, 7),
+       /* CLK_CFG_2 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CCU, "top_ccu",
+               ccu_parents, 0x038, 0x03C, 0x040, 0, 4, 7, 0x04, 8),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_IMG, "top_img",
+               img_parents, 0x038, 0x03C, 0x040, 8, 4, 15, 0x04, 9),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTM, "top_camtm",
+               camtm_parents, 0x038, 0x03C, 0x040, 16, 2, 23, 0x04, 10),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DSP, "top_dsp",
+               dsp_parents, 0x038, 0x03C, 0x040, 24, 3, 31, 0x04, 11),
+       /* CLK_CFG_3 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DSP1, "top_dsp1",
+               dsp1_parents, 0x044, 0x048, 0x04C, 0, 3, 7, 0x04, 12),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DSP2, "top_dsp2",
+               dsp1_parents, 0x044, 0x048, 0x04C, 8, 3, 15, 0x04, 13),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DSP3, "top_dsp3",
+               dsp1_parents, 0x044, 0x048, 0x04C, 16, 3, 23, 0x04, 14),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DSP4, "top_dsp4",
+               dsp2_parents, 0x044, 0x048, 0x04C, 24, 3, 31, 0x04, 15),
+       /* CLK_CFG_4 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DSP5, "top_dsp5",
+               dsp2_parents, 0x050, 0x054, 0x058, 0, 3, 7, 0x04, 16),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DSP6, "top_dsp6",
+               dsp2_parents, 0x050, 0x054, 0x058, 8, 3, 15, 0x04, 17),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DSP7, "top_dsp7",
+               dsp_parents, 0x050, 0x054, 0x058, 16, 3, 23, 0x04, 18),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_IPU_IF, "top_ipu_if",
+               ipu_if_parents, 0x050, 0x054, 0x058, 24, 3, 31, 0x04, 19),
+       /* CLK_CFG_5 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_MFG_CORE_TMP, "top_mfg_core_tmp",
+               mfg_parents, 0x05C, 0x060, 0x064, 0, 2, 7, 0x04, 20),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG, "top_camtg",
+               camtg_parents, 0x05C, 0x060, 0x064, 8, 3, 15, 0x04, 21),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG2, "top_camtg2",
+               camtg_parents, 0x05C, 0x060, 0x064, 16, 3, 23, 0x04, 22),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG3, "top_camtg3",
+               camtg_parents, 0x05C, 0x060, 0x064, 24, 3, 31, 0x04, 23),
+       /* CLK_CFG_6 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG4, "top_camtg4",
+               camtg_parents, 0x068, 0x06C, 0x070, 0, 3, 7, 0x04, 24),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG5, "top_camtg5",
+               camtg_parents, 0x068, 0x06C, 0x070, 8, 3, 15, 0x04, 25),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_UART, "top_uart",
+               uart_parents, 0x068, 0x06C, 0x070, 16, 1, 23, 0x04, 26),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SPI, "top_spi",
+               spi_parents, 0x068, 0x06C, 0x070, 24, 3, 31, 0x04, 27),
+       /* CLK_CFG_7 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SPIS, "top_spis",
+               spis_parents, 0x074, 0x078, 0x07C, 0, 3, 7, 0x04, 28),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC50_0_HCLK, "top_msdc50_0_hclk",
+               msdc50_0_h_parents, 0x074, 0x078, 0x07C, 8, 2, 15, 0x04, 29),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC50_0, "top_msdc50_0",
+               msdc50_0_parents, 0x074, 0x078, 0x07C, 16, 3, 23, 0x04, 30),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC30_1, "top_msdc30_1",
+               msdc30_parents, 0x074, 0x078, 0x07C, 24, 3, 31, 0x04, 31),
+       /* CLK_CFG_8 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC30_2, "top_msdc30_2",
+               msdc30_parents, 0x080, 0x084, 0x088, 0, 3, 7, 0x08, 0),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_INTDIR, "top_intdir",
+               intdir_parents, 0x080, 0x084, 0x088, 8, 2, 15, 0x08, 1),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_INTBUS, "top_aud_intbus",
+               aud_intbus_parents, 0x080, 0x084, 0x088, 16, 2, 23, 0x08, 2),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUDIO_H, "top_audio_h",
+               audio_h_parents, 0x080, 0x084, 0x088, 24, 2, 31, 0x08, 3),
+       /*
+        * CLK_CFG_9
+        * top_pwrmcu is main clock in other co-processor, should not be
+        * handled by Linux.
+        */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_PWRAP_ULPOSC, "top_pwrap_ulposc",
+               pwrap_ulposc_parents, 0x08C, 0x090, 0x094, 0, 3, 7, 0x08, 4),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_ATB, "top_atb",
+               atb_parents, 0x08C, 0x090, 0x094, 8, 2, 15, 0x08, 5),
+       MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_PWRMCU, "top_pwrmcu",
+               pwrmcu_parents, 0x08C, 0x090, 0x094, 16, 3, 23, 0x08, 6, CLK_IS_CRITICAL),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DP, "top_dp",
+               dp_parents, 0x08C, 0x090, 0x094, 24, 4, 31, 0x08, 7),
+       /* CLK_CFG_10 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_EDP, "top_edp",
+               dp_parents, 0x098, 0x09C, 0x0A0, 0, 4, 7, 0x08, 8),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DPI, "top_dpi",
+               dp_parents, 0x098, 0x09C, 0x0A0, 8, 4, 15, 0x08, 9),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DISP_PWM0, "top_disp_pwm0",
+               disp_pwm_parents, 0x098, 0x09C, 0x0A0, 16, 3, 23, 0x08, 10),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DISP_PWM1, "top_disp_pwm1",
+               disp_pwm_parents, 0x098, 0x09C, 0x0A0, 24, 3, 31, 0x08, 11),
+       /* CLK_CFG_11 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_TOP, "top_usb_top",
+               usb_parents, 0x0A4, 0x0A8, 0x0AC, 0, 2, 7, 0x08, 12),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SSUSB_XHCI, "top_ssusb_xhci",
+               usb_parents, 0x0A4, 0x0A8, 0x0AC, 8, 2, 15, 0x08, 13),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_TOP_1P, "top_usb_top_1p",
+               usb_parents, 0x0A4, 0x0A8, 0x0AC, 16, 2, 23, 0x08, 14),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SSUSB_XHCI_1P, "top_ssusb_xhci_1p",
+               usb_parents, 0x0A4, 0x0A8, 0x0AC, 24, 2, 31, 0x08, 15),
+       /* CLK_CFG_12 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_TOP_2P, "top_usb_top_2p",
+               usb_parents, 0x0B0, 0x0B4, 0x0B8, 0, 2, 7, 0x08, 16),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SSUSB_XHCI_2P, "top_ssusb_xhci_2p",
+               usb_parents, 0x0B0, 0x0B4, 0x0B8, 8, 2, 15, 0x08, 17),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_TOP_3P, "top_usb_top_3p",
+               usb_parents, 0x0B0, 0x0B4, 0x0B8, 16, 2, 23, 0x08, 18),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SSUSB_XHCI_3P, "top_ssusb_xhci_3p",
+               usb_parents, 0x0B0, 0x0B4, 0x0B8, 24, 2, 31, 0x08, 19),
+       /* CLK_CFG_13 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_I2C, "top_i2c",
+               i2c_parents, 0x0BC, 0x0C0, 0x0C4, 0, 2, 7, 0x08, 20),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SENINF, "top_seninf",
+               seninf_parents, 0x0BC, 0x0C0, 0x0C4, 8, 3, 15, 0x08, 21),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SENINF1, "top_seninf1",
+               seninf_parents, 0x0BC, 0x0C0, 0x0C4, 16, 3, 23, 0x08, 22),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SENINF2, "top_seninf2",
+               seninf_parents, 0x0BC, 0x0C0, 0x0C4, 24, 3, 31, 0x08, 23),
+       /* CLK_CFG_14 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SENINF3, "top_seninf3",
+               seninf_parents, 0x0C8, 0x0CC, 0x0D0, 0, 3, 7, 0x08, 24),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_GCPU, "top_gcpu",
+               gcpu_parents, 0x0C8, 0x0CC, 0x0D0, 8, 3, 15, 0x08, 25),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DXCC, "top_dxcc",
+               dxcc_parents, 0x0C8, 0x0CC, 0x0D0, 16, 2, 23, 0x08, 26),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DPMAIF_MAIN, "top_dpmaif_main",
+               dpmaif_parents, 0x0C8, 0x0CC, 0x0D0, 24, 3, 31, 0x08, 27),
+       /* CLK_CFG_15 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AES_UFSFDE, "top_aes_ufsfde",
+               aes_fde_parents, 0x0D4, 0x0D8, 0x0DC, 0, 3, 7, 0x08, 28),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_UFS, "top_ufs",
+               ufs_parents, 0x0D4, 0x0D8, 0x0DC, 8, 3, 15, 0x08, 29),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_UFS_TICK1US, "top_ufs_tick1us",
+               ufs_tick1us_parents, 0x0D4, 0x0D8, 0x0DC, 16, 1, 23, 0x08, 30),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_UFS_MP_SAP_CFG, "top_ufs_mp_sap_cfg",
+               ufs_mp_sap_parents, 0x0D4, 0x0D8, 0x0DC, 24, 1, 31, 0x08, 31),
+       /*
+        * CLK_CFG_16
+        * top_mcupm is main clock in other co-processor, should not be
+        * handled by Linux.
+        */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_VENC, "top_venc",
+               venc_parents, 0x0E0, 0x0E4, 0x0E8, 0, 4, 7, 0x0C, 0),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_VDEC, "top_vdec",
+               vdec_parents, 0x0E0, 0x0E4, 0x0E8, 8, 4, 15, 0x0C, 1),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_PWM, "top_pwm",
+               pwm_parents, 0x0E0, 0x0E4, 0x0E8, 16, 1, 23, 0x0C, 2),
+       MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_MCUPM, "top_mcupm",
+               mcupm_parents, 0x0E0, 0x0E4, 0x0E8, 24, 2, 31, 0x0C, 3, CLK_IS_CRITICAL),
+       /*
+        * CLK_CFG_17
+        * top_dvfsrc is for internal DVFS usage, should not be handled by Linux.
+        */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SPMI_P_MST, "top_spmi_p_mst",
+               spmi_parents, 0x0EC, 0x0F0, 0x0F4, 0, 4, 7, 0x0C, 4),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SPMI_M_MST, "top_spmi_m_mst",
+               spmi_parents, 0x0EC, 0x0F0, 0x0F4, 8, 4, 15, 0x0C, 5),
+       MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_DVFSRC, "top_dvfsrc",
+               dvfsrc_parents, 0x0EC, 0x0F0, 0x0F4, 16, 2, 23, 0x0C, 6, CLK_IS_CRITICAL),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_TL, "top_tl",
+               tl_parents, 0x0EC, 0x0F0, 0x0F4, 24, 2, 31, 0x0C, 7),
+       /* CLK_CFG_18 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_TL_P1, "top_tl_p1",
+               tl_parents, 0x0F8, 0x0FC, 0x0100, 0, 2, 7, 0x0C, 8),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AES_MSDCFDE, "top_aes_msdcfde",
+               aes_fde_parents, 0x0F8, 0x0FC, 0x0100, 8, 3, 15, 0x0C, 9),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DSI_OCC, "top_dsi_occ",
+               dsi_occ_parents, 0x0F8, 0x0FC, 0x0100, 16, 2, 23, 0x0C, 10),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_WPE_VPP, "top_wpe_vpp",
+               wpe_vpp_parents, 0x0F8, 0x0FC, 0x0100, 24, 4, 31, 0x0C, 11),
+       /* CLK_CFG_19 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_HDCP, "top_hdcp",
+               hdcp_parents, 0x0104, 0x0108, 0x010C, 0, 2, 7, 0x0C, 12),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_HDCP_24M, "top_hdcp_24m",
+               hdcp_24m_parents, 0x0104, 0x0108, 0x010C, 8, 2, 15, 0x0C, 13),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_HD20_DACR_REF_CLK, "top_hd20_dacr_ref_clk",
+               hd20_dacr_ref_parents, 0x0104, 0x0108, 0x010C, 16, 2, 23, 0x0C, 14),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_HD20_HDCP_CCLK, "top_hd20_hdcp_cclk",
+               hd20_hdcp_c_parents, 0x0104, 0x0108, 0x010C, 24, 2, 31, 0x0C, 15),
+       /* CLK_CFG_20 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_HDMI_XTAL, "top_hdmi_xtal",
+               hdmi_xtal_parents, 0x0110, 0x0114, 0x0118, 0, 1, 7, 0x0C, 16),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_HDMI_APB, "top_hdmi_apb",
+               hdmi_apb_parents, 0x0110, 0x0114, 0x0118, 8, 2, 15, 0x0C, 17),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SNPS_ETH_250M, "top_snps_eth_250m",
+               snps_eth_250m_parents, 0x0110, 0x0114, 0x0118, 16, 1, 23, 0x0C, 18),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SNPS_ETH_62P4M_PTP, "top_snps_eth_62p4m_ptp",
+               snps_eth_62p4m_ptp_parents, 0x0110, 0x0114, 0x0118, 24, 2, 31, 0x0C, 19),
+       /* CLK_CFG_21 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SNPS_ETH_50M_RMII, "snps_eth_50m_rmii",
+               snps_eth_50m_rmii_parents, 0x011C, 0x0120, 0x0124, 0, 1, 7, 0x0C, 20),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DGI_OUT, "top_dgi_out",
+               dgi_out_parents, 0x011C, 0x0120, 0x0124, 8, 3, 15, 0x0C, 21),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_NNA0, "top_nna0",
+               nna_parents, 0x011C, 0x0120, 0x0124, 16, 4, 23, 0x0C, 22),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_NNA1, "top_nna1",
+               nna_parents, 0x011C, 0x0120, 0x0124, 24, 4, 31, 0x0C, 23),
+       /* CLK_CFG_22 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_ADSP, "top_adsp",
+               adsp_parents, 0x0128, 0x012C, 0x0130, 0, 4, 7, 0x0C, 24),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_ASM_H, "top_asm_h",
+               asm_parents, 0x0128, 0x012C, 0x0130, 8, 2, 15, 0x0C, 25),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_ASM_M, "top_asm_m",
+               asm_parents, 0x0128, 0x012C, 0x0130, 16, 2, 23, 0x0C, 26),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_ASM_L, "top_asm_l",
+               asm_parents, 0x0128, 0x012C, 0x0130, 24, 2, 31, 0x0C, 27),
+       /* CLK_CFG_23 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_APLL1, "top_apll1",
+               apll1_parents, 0x0134, 0x0138, 0x013C, 0, 1, 7, 0x0C, 28),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_APLL2, "top_apll2",
+               apll2_parents, 0x0134, 0x0138, 0x013C, 8, 1, 15, 0x0C, 29),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_APLL3, "top_apll3",
+               apll3_parents, 0x0134, 0x0138, 0x013C, 16, 1, 23, 0x0C, 30),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_APLL4, "top_apll4",
+               apll4_parents, 0x0134, 0x0138, 0x013C, 24, 1, 31, 0x0C, 31),
+       /*
+        * CLK_CFG_24
+        * i2so4_mck is not used in MT8195.
+        */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_APLL5, "top_apll5",
+               apll5_parents, 0x0140, 0x0144, 0x0148, 0, 1, 7, 0x010, 0),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_I2SO1_MCK, "top_i2so1_mck",
+               i2s_parents, 0x0140, 0x0144, 0x0148, 8, 3, 15, 0x010, 1),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_I2SO2_MCK, "top_i2so2_mck",
+               i2s_parents, 0x0140, 0x0144, 0x0148, 16, 3, 23, 0x010, 2),
+       /*
+        * CLK_CFG_25
+        * i2so5_mck and i2si4_mck are not used in MT8195.
+        */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_I2SI1_MCK, "top_i2si1_mck",
+               i2s_parents, 0x014C, 0x0150, 0x0154, 8, 3, 15, 0x010, 5),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_I2SI2_MCK, "top_i2si2_mck",
+               i2s_parents, 0x014C, 0x0150, 0x0154, 16, 3, 23, 0x010, 6),
+       /*
+        * CLK_CFG_26
+        * i2si5_mck is not used in MT8195.
+        */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DPTX_MCK, "top_dptx_mck",
+               i2s_parents, 0x0158, 0x015C, 0x0160, 8, 3, 15, 0x010, 9),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_IEC_CLK, "top_aud_iec_clk",
+               i2s_parents, 0x0158, 0x015C, 0x0160, 16, 3, 23, 0x010, 10),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_A1SYS_HP, "top_a1sys_hp",
+               a1sys_hp_parents, 0x0158, 0x015C, 0x0160, 24, 1, 31, 0x010, 11),
+       /* CLK_CFG_27 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_A2SYS_HF, "top_a2sys_hf",
+               a2sys_parents, 0x0164, 0x0168, 0x016C, 0, 1, 7, 0x010, 12),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_A3SYS_HF, "top_a3sys_hf",
+               a3sys_parents, 0x0164, 0x0168, 0x016C, 8, 3, 15, 0x010, 13),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_A4SYS_HF, "top_a4sys_hf",
+               a3sys_parents, 0x0164, 0x0168, 0x016C, 16, 3, 23, 0x010, 14),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SPINFI_BCLK, "top_spinfi_bclk",
+               spinfi_b_parents, 0x0164, 0x0168, 0x016C, 24, 3, 31, 0x010, 15),
+       /* CLK_CFG_28 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_NFI1X, "top_nfi1x",
+               nfi1x_parents, 0x0170, 0x0174, 0x0178, 0, 3, 7, 0x010, 16),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_ECC, "top_ecc",
+               ecc_parents, 0x0170, 0x0174, 0x0178, 8, 3, 15, 0x010, 17),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUDIO_LOCAL_BUS, "top_audio_local_bus",
+               audio_local_bus_parents, 0x0170, 0x0174, 0x0178, 16, 4, 23, 0x010, 18),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SPINOR, "top_spinor",
+               spinor_parents, 0x0170, 0x0174, 0x0178, 24, 2, 31, 0x010, 19),
+       /*
+        * CLK_CFG_29
+        * top_ulposc/top_ulposc_core/top_srck are clock source of always on co-processor,
+        * should not be closed by Linux.
+        */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DVIO_DGI_REF, "top_dvio_dgi_ref",
+               dvio_dgi_ref_parents, 0x017C, 0x0180, 0x0184, 0, 3, 7, 0x010, 20),
+       MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_ULPOSC, "top_ulposc",
+               ulposc_parents, 0x017C, 0x0180, 0x0184, 8, 2, 15, 0x010, 21, CLK_IS_CRITICAL),
+       MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_ULPOSC_CORE, "top_ulposc_core",
+               ulposc_core_parents, 0x017C, 0x0180, 0x0184, 16, 2, 23, 0x010, 22, CLK_IS_CRITICAL),
+       MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SRCK, "top_srck",
+               srck_parents, 0x017C, 0x0180, 0x0184, 24, 1, 31, 0x010, 23, CLK_IS_CRITICAL),
+       /*
+        * the clocks in CLK_CFG_30 ~ 37 are backup clock source, no need to handled
+        * by Linux.
+        */
+};
+
+static struct mtk_composite top_muxes[] = {
+       /* CLK_MISC_CFG_3 */
+       MUX(CLK_TOP_MFG_CK_FAST_REF, "mfg_ck_fast_ref", mfg_fast_parents, 0x0250, 8, 1),
+};
+
+static const struct mtk_composite top_adj_divs[] = {
+       DIV_GATE(CLK_TOP_APLL12_DIV0, "apll12_div0", "top_i2si1_mck", 0x0320, 0, 0x0328, 8, 0),
+       DIV_GATE(CLK_TOP_APLL12_DIV1, "apll12_div1", "top_i2si2_mck", 0x0320, 1, 0x0328, 8, 8),
+       DIV_GATE(CLK_TOP_APLL12_DIV2, "apll12_div2", "top_i2so1_mck", 0x0320, 2, 0x0328, 8, 16),
+       DIV_GATE(CLK_TOP_APLL12_DIV3, "apll12_div3", "top_i2so2_mck", 0x0320, 3, 0x0328, 8, 24),
+       DIV_GATE(CLK_TOP_APLL12_DIV4, "apll12_div4", "top_aud_iec_clk", 0x0320, 4, 0x0334, 8, 0),
+       /* apll12_div5 ~ 8 are not used in MT8195. */
+       DIV_GATE(CLK_TOP_APLL12_DIV9, "apll12_div9", "top_dptx_mck", 0x0320, 9, 0x0338, 8, 8),
+};
+
+static const struct mtk_gate_regs top0_cg_regs = {
+       .set_ofs = 0x238,
+       .clr_ofs = 0x238,
+       .sta_ofs = 0x238,
+};
+
+static const struct mtk_gate_regs top1_cg_regs = {
+       .set_ofs = 0x250,
+       .clr_ofs = 0x250,
+       .sta_ofs = 0x250,
+};
+
+#define GATE_TOP0_FLAGS(_id, _name, _parent, _shift, _flag)            \
+       GATE_MTK_FLAGS(_id, _name, _parent, &top0_cg_regs, _shift,      \
+               &mtk_clk_gate_ops_no_setclr_inv, _flag)
+
+#define GATE_TOP0(_id, _name, _parent, _shift)                 \
+       GATE_TOP0_FLAGS(_id, _name, _parent, _shift, 0)
+
+#define GATE_TOP1(_id, _name, _parent, _shift)                 \
+       GATE_MTK(_id, _name, _parent, &top1_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr_inv)
+
+static const struct mtk_gate top_clks[] = {
+       /* TOP0 */
+       GATE_TOP0(CLK_TOP_CFG_VPP0, "cfg_vpp0", "top_vpp", 0),
+       GATE_TOP0(CLK_TOP_CFG_VPP1, "cfg_vpp1", "top_vpp", 1),
+       GATE_TOP0(CLK_TOP_CFG_VDO0, "cfg_vdo0", "top_vpp", 2),
+       GATE_TOP0(CLK_TOP_CFG_VDO1, "cfg_vdo1", "top_vpp", 3),
+       GATE_TOP0(CLK_TOP_CFG_UNIPLL_SES, "cfg_unipll_ses", "univpll_d2", 4),
+       GATE_TOP0(CLK_TOP_CFG_26M_VPP0, "cfg_26m_vpp0", "clk26m", 5),
+       GATE_TOP0(CLK_TOP_CFG_26M_VPP1, "cfg_26m_vpp1", "clk26m", 6),
+       GATE_TOP0(CLK_TOP_CFG_26M_AUD, "cfg_26m_aud", "clk26m", 9),
+       /*
+        * cfg_axi_east, cfg_axi_east_north, cfg_axi_north and cfg_axi_south
+        * are peripheral bus clock branches.
+        */
+       GATE_TOP0_FLAGS(CLK_TOP_CFG_AXI_EAST, "cfg_axi_east", "top_axi", 10, CLK_IS_CRITICAL),
+       GATE_TOP0_FLAGS(CLK_TOP_CFG_AXI_EAST_NORTH, "cfg_axi_east_north", "top_axi", 11,
+               CLK_IS_CRITICAL),
+       GATE_TOP0_FLAGS(CLK_TOP_CFG_AXI_NORTH, "cfg_axi_north", "top_axi", 12, CLK_IS_CRITICAL),
+       GATE_TOP0_FLAGS(CLK_TOP_CFG_AXI_SOUTH, "cfg_axi_south", "top_axi", 13, CLK_IS_CRITICAL),
+       GATE_TOP0(CLK_TOP_CFG_EXT_TEST, "cfg_ext_test", "msdcpll_d2", 15),
+       /* TOP1 */
+       GATE_TOP1(CLK_TOP_SSUSB_REF, "ssusb_ref", "clk26m", 0),
+       GATE_TOP1(CLK_TOP_SSUSB_PHY_REF, "ssusb_phy_ref", "clk26m", 1),
+       GATE_TOP1(CLK_TOP_SSUSB_P1_REF, "ssusb_p1_ref", "clk26m", 2),
+       GATE_TOP1(CLK_TOP_SSUSB_PHY_P1_REF, "ssusb_phy_p1_ref", "clk26m", 3),
+       GATE_TOP1(CLK_TOP_SSUSB_P2_REF, "ssusb_p2_ref", "clk26m", 4),
+       GATE_TOP1(CLK_TOP_SSUSB_PHY_P2_REF, "ssusb_phy_p2_ref", "clk26m", 5),
+       GATE_TOP1(CLK_TOP_SSUSB_P3_REF, "ssusb_p3_ref", "clk26m", 6),
+       GATE_TOP1(CLK_TOP_SSUSB_PHY_P3_REF, "ssusb_phy_p3_ref", "clk26m", 7),
+};
+
+static const struct of_device_id of_match_clk_mt8195_topck[] = {
+       { .compatible = "mediatek,mt8195-topckgen", },
+       {}
+};
+
+static int clk_mt8195_topck_probe(struct platform_device *pdev)
+{
+       struct clk_onecell_data *top_clk_data;
+       struct device_node *node = pdev->dev.of_node;
+       int r;
+       void __iomem *base;
+
+       top_clk_data = mtk_alloc_clk_data(CLK_TOP_NR_CLK);
+       if (!top_clk_data)
+               return -ENOMEM;
+
+       base = devm_platform_ioremap_resource(pdev, 0);
+       if (IS_ERR(base)) {
+               r = PTR_ERR(base);
+               goto free_top_data;
+       }
+
+       mtk_clk_register_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks),
+                                   top_clk_data);
+       mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), top_clk_data);
+       mtk_clk_register_muxes(top_mtk_muxes, ARRAY_SIZE(top_mtk_muxes), node,
+                              &mt8195_clk_lock, top_clk_data);
+       mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
+                                   &mt8195_clk_lock, top_clk_data);
+       mtk_clk_register_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), base,
+                                   &mt8195_clk_lock, top_clk_data);
+       r = mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks), top_clk_data);
+       if (r)
+               goto free_top_data;
+
+       r = of_clk_add_provider(node, of_clk_src_onecell_get, top_clk_data);
+       if (r)
+               goto free_top_data;
+
+       return r;
+
+free_top_data:
+       mtk_free_clk_data(top_clk_data);
+       return r;
+}
+
+static struct platform_driver clk_mt8195_topck_drv = {
+       .probe = clk_mt8195_topck_probe,
+       .driver = {
+               .name = "clk-mt8195-topck",
+               .of_match_table = of_match_clk_mt8195_topck,
+       },
+};
+builtin_platform_driver(clk_mt8195_topck_drv);
diff --git a/drivers/clk/mediatek/clk-mt8195-vdec.c b/drivers/clk/mediatek/clk-mt8195-vdec.c
new file mode 100644 (file)
index 0000000..a1df04f
--- /dev/null
@@ -0,0 +1,104 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+#include <dt-bindings/clock/mt8195-clk.h>
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+
+static const struct mtk_gate_regs vdec0_cg_regs = {
+       .set_ofs = 0x0,
+       .clr_ofs = 0x4,
+       .sta_ofs = 0x0,
+};
+
+static const struct mtk_gate_regs vdec1_cg_regs = {
+       .set_ofs = 0x200,
+       .clr_ofs = 0x204,
+       .sta_ofs = 0x200,
+};
+
+static const struct mtk_gate_regs vdec2_cg_regs = {
+       .set_ofs = 0x8,
+       .clr_ofs = 0xc,
+       .sta_ofs = 0x8,
+};
+
+#define GATE_VDEC0(_id, _name, _parent, _shift)                        \
+       GATE_MTK(_id, _name, _parent, &vdec0_cg_regs, _shift, &mtk_clk_gate_ops_setclr_inv)
+
+#define GATE_VDEC1(_id, _name, _parent, _shift)                        \
+       GATE_MTK(_id, _name, _parent, &vdec1_cg_regs, _shift, &mtk_clk_gate_ops_setclr_inv)
+
+#define GATE_VDEC2(_id, _name, _parent, _shift)                        \
+       GATE_MTK(_id, _name, _parent, &vdec2_cg_regs, _shift, &mtk_clk_gate_ops_setclr_inv)
+
+static const struct mtk_gate vdec_clks[] = {
+       /* VDEC0 */
+       GATE_VDEC0(CLK_VDEC_VDEC, "vdec_vdec", "top_vdec", 0),
+       /* VDEC1 */
+       GATE_VDEC1(CLK_VDEC_LAT, "vdec_lat", "top_vdec", 0),
+       /* VDEC2 */
+       GATE_VDEC2(CLK_VDEC_LARB1, "vdec_larb1", "top_vdec", 0),
+};
+
+static const struct mtk_gate vdec_core1_clks[] = {
+       /* VDEC0 */
+       GATE_VDEC0(CLK_VDEC_CORE1_VDEC, "vdec_core1_vdec", "top_vdec", 0),
+       /* VDEC1 */
+       GATE_VDEC1(CLK_VDEC_CORE1_LAT, "vdec_core1_lat", "top_vdec", 0),
+       /* VDEC2 */
+       GATE_VDEC2(CLK_VDEC_CORE1_LARB1, "vdec_core1_larb1", "top_vdec", 0),
+};
+
+static const struct mtk_gate vdec_soc_clks[] = {
+       /* VDEC0 */
+       GATE_VDEC0(CLK_VDEC_SOC_VDEC, "vdec_soc_vdec", "top_vdec", 0),
+       /* VDEC1 */
+       GATE_VDEC1(CLK_VDEC_SOC_LAT, "vdec_soc_lat", "top_vdec", 0),
+       /* VDEC2 */
+       GATE_VDEC2(CLK_VDEC_SOC_LARB1, "vdec_soc_larb1", "top_vdec", 0),
+};
+
+static const struct mtk_clk_desc vdec_desc = {
+       .clks = vdec_clks,
+       .num_clks = ARRAY_SIZE(vdec_clks),
+};
+
+static const struct mtk_clk_desc vdec_core1_desc = {
+       .clks = vdec_core1_clks,
+       .num_clks = ARRAY_SIZE(vdec_core1_clks),
+};
+
+static const struct mtk_clk_desc vdec_soc_desc = {
+       .clks = vdec_soc_clks,
+       .num_clks = ARRAY_SIZE(vdec_soc_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8195_vdec[] = {
+       {
+               .compatible = "mediatek,mt8195-vdecsys",
+               .data = &vdec_desc,
+       }, {
+               .compatible = "mediatek,mt8195-vdecsys_core1",
+               .data = &vdec_core1_desc,
+       }, {
+               .compatible = "mediatek,mt8195-vdecsys_soc",
+               .data = &vdec_soc_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8195_vdec_drv = {
+       .probe = mtk_clk_simple_probe,
+       .driver = {
+               .name = "clk-mt8195-vdec",
+               .of_match_table = of_match_clk_mt8195_vdec,
+       },
+};
+builtin_platform_driver(clk_mt8195_vdec_drv);
diff --git a/drivers/clk/mediatek/clk-mt8195-vdo0.c b/drivers/clk/mediatek/clk-mt8195-vdo0.c
new file mode 100644 (file)
index 0000000..f7ff761
--- /dev/null
@@ -0,0 +1,123 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+#include <dt-bindings/clock/mt8195-clk.h>
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+
+static const struct mtk_gate_regs vdo0_0_cg_regs = {
+       .set_ofs = 0x104,
+       .clr_ofs = 0x108,
+       .sta_ofs = 0x100,
+};
+
+static const struct mtk_gate_regs vdo0_1_cg_regs = {
+       .set_ofs = 0x114,
+       .clr_ofs = 0x118,
+       .sta_ofs = 0x110,
+};
+
+static const struct mtk_gate_regs vdo0_2_cg_regs = {
+       .set_ofs = 0x124,
+       .clr_ofs = 0x128,
+       .sta_ofs = 0x120,
+};
+
+#define GATE_VDO0_0(_id, _name, _parent, _shift)                       \
+       GATE_MTK(_id, _name, _parent, &vdo0_0_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+#define GATE_VDO0_1(_id, _name, _parent, _shift)                       \
+       GATE_MTK(_id, _name, _parent, &vdo0_1_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+#define GATE_VDO0_2(_id, _name, _parent, _shift)                       \
+       GATE_MTK(_id, _name, _parent, &vdo0_2_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+static const struct mtk_gate vdo0_clks[] = {
+       /* VDO0_0 */
+       GATE_VDO0_0(CLK_VDO0_DISP_OVL0, "vdo0_disp_ovl0", "top_vpp", 0),
+       GATE_VDO0_0(CLK_VDO0_DISP_COLOR0, "vdo0_disp_color0", "top_vpp", 2),
+       GATE_VDO0_0(CLK_VDO0_DISP_COLOR1, "vdo0_disp_color1", "top_vpp", 3),
+       GATE_VDO0_0(CLK_VDO0_DISP_CCORR0, "vdo0_disp_ccorr0", "top_vpp", 4),
+       GATE_VDO0_0(CLK_VDO0_DISP_CCORR1, "vdo0_disp_ccorr1", "top_vpp", 5),
+       GATE_VDO0_0(CLK_VDO0_DISP_AAL0, "vdo0_disp_aal0", "top_vpp", 6),
+       GATE_VDO0_0(CLK_VDO0_DISP_AAL1, "vdo0_disp_aal1", "top_vpp", 7),
+       GATE_VDO0_0(CLK_VDO0_DISP_GAMMA0, "vdo0_disp_gamma0", "top_vpp", 8),
+       GATE_VDO0_0(CLK_VDO0_DISP_GAMMA1, "vdo0_disp_gamma1", "top_vpp", 9),
+       GATE_VDO0_0(CLK_VDO0_DISP_DITHER0, "vdo0_disp_dither0", "top_vpp", 10),
+       GATE_VDO0_0(CLK_VDO0_DISP_DITHER1, "vdo0_disp_dither1", "top_vpp", 11),
+       GATE_VDO0_0(CLK_VDO0_DISP_OVL1, "vdo0_disp_ovl1", "top_vpp", 16),
+       GATE_VDO0_0(CLK_VDO0_DISP_WDMA0, "vdo0_disp_wdma0", "top_vpp", 17),
+       GATE_VDO0_0(CLK_VDO0_DISP_WDMA1, "vdo0_disp_wdma1", "top_vpp", 18),
+       GATE_VDO0_0(CLK_VDO0_DISP_RDMA0, "vdo0_disp_rdma0", "top_vpp", 19),
+       GATE_VDO0_0(CLK_VDO0_DISP_RDMA1, "vdo0_disp_rdma1", "top_vpp", 20),
+       GATE_VDO0_0(CLK_VDO0_DSI0, "vdo0_dsi0", "top_vpp", 21),
+       GATE_VDO0_0(CLK_VDO0_DSI1, "vdo0_dsi1", "top_vpp", 22),
+       GATE_VDO0_0(CLK_VDO0_DSC_WRAP0, "vdo0_dsc_wrap0", "top_vpp", 23),
+       GATE_VDO0_0(CLK_VDO0_VPP_MERGE0, "vdo0_vpp_merge0", "top_vpp", 24),
+       GATE_VDO0_0(CLK_VDO0_DP_INTF0, "vdo0_dp_intf0", "top_vpp", 25),
+       GATE_VDO0_0(CLK_VDO0_DISP_MUTEX0, "vdo0_disp_mutex0", "top_vpp", 26),
+       GATE_VDO0_0(CLK_VDO0_DISP_IL_ROT0, "vdo0_disp_il_rot0", "top_vpp", 27),
+       GATE_VDO0_0(CLK_VDO0_APB_BUS, "vdo0_apb_bus", "top_vpp", 28),
+       GATE_VDO0_0(CLK_VDO0_FAKE_ENG0, "vdo0_fake_eng0", "top_vpp", 29),
+       GATE_VDO0_0(CLK_VDO0_FAKE_ENG1, "vdo0_fake_eng1", "top_vpp", 30),
+       /* VDO0_1 */
+       GATE_VDO0_1(CLK_VDO0_DL_ASYNC0, "vdo0_dl_async0", "top_vpp", 0),
+       GATE_VDO0_1(CLK_VDO0_DL_ASYNC1, "vdo0_dl_async1", "top_vpp", 1),
+       GATE_VDO0_1(CLK_VDO0_DL_ASYNC2, "vdo0_dl_async2", "top_vpp", 2),
+       GATE_VDO0_1(CLK_VDO0_DL_ASYNC3, "vdo0_dl_async3", "top_vpp", 3),
+       GATE_VDO0_1(CLK_VDO0_DL_ASYNC4, "vdo0_dl_async4", "top_vpp", 4),
+       GATE_VDO0_1(CLK_VDO0_DISP_MONITOR0, "vdo0_disp_monitor0", "top_vpp", 5),
+       GATE_VDO0_1(CLK_VDO0_DISP_MONITOR1, "vdo0_disp_monitor1", "top_vpp", 6),
+       GATE_VDO0_1(CLK_VDO0_DISP_MONITOR2, "vdo0_disp_monitor2", "top_vpp", 7),
+       GATE_VDO0_1(CLK_VDO0_DISP_MONITOR3, "vdo0_disp_monitor3", "top_vpp", 8),
+       GATE_VDO0_1(CLK_VDO0_DISP_MONITOR4, "vdo0_disp_monitor4", "top_vpp", 9),
+       GATE_VDO0_1(CLK_VDO0_SMI_GALS, "vdo0_smi_gals", "top_vpp", 10),
+       GATE_VDO0_1(CLK_VDO0_SMI_COMMON, "vdo0_smi_common", "top_vpp", 11),
+       GATE_VDO0_1(CLK_VDO0_SMI_EMI, "vdo0_smi_emi", "top_vpp", 12),
+       GATE_VDO0_1(CLK_VDO0_SMI_IOMMU, "vdo0_smi_iommu", "top_vpp", 13),
+       GATE_VDO0_1(CLK_VDO0_SMI_LARB, "vdo0_smi_larb", "top_vpp", 14),
+       GATE_VDO0_1(CLK_VDO0_SMI_RSI, "vdo0_smi_rsi", "top_vpp", 15),
+       /* VDO0_2 */
+       GATE_VDO0_2(CLK_VDO0_DSI0_DSI, "vdo0_dsi0_dsi", "top_dsi_occ", 0),
+       GATE_VDO0_2(CLK_VDO0_DSI1_DSI, "vdo0_dsi1_dsi", "top_dsi_occ", 8),
+       GATE_VDO0_2(CLK_VDO0_DP_INTF0_DP_INTF, "vdo0_dp_intf0_dp_intf", "top_edp", 16),
+};
+
+static int clk_mt8195_vdo0_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *node = dev->parent->of_node;
+       struct clk_onecell_data *clk_data;
+       int r;
+
+       clk_data = mtk_alloc_clk_data(CLK_VDO0_NR_CLK);
+       if (!clk_data)
+               return -ENOMEM;
+
+       r = mtk_clk_register_gates(node, vdo0_clks, ARRAY_SIZE(vdo0_clks), clk_data);
+       if (r)
+               goto free_vdo0_data;
+
+       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       if (r)
+               goto free_vdo0_data;
+
+       return r;
+
+free_vdo0_data:
+       mtk_free_clk_data(clk_data);
+       return r;
+}
+
+static struct platform_driver clk_mt8195_vdo0_drv = {
+       .probe = clk_mt8195_vdo0_probe,
+       .driver = {
+               .name = "clk-mt8195-vdo0",
+       },
+};
+builtin_platform_driver(clk_mt8195_vdo0_drv);
diff --git a/drivers/clk/mediatek/clk-mt8195-vdo1.c b/drivers/clk/mediatek/clk-mt8195-vdo1.c
new file mode 100644 (file)
index 0000000..03df8ea
--- /dev/null
@@ -0,0 +1,140 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+#include <dt-bindings/clock/mt8195-clk.h>
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+
+static const struct mtk_gate_regs vdo1_0_cg_regs = {
+       .set_ofs = 0x104,
+       .clr_ofs = 0x108,
+       .sta_ofs = 0x100,
+};
+
+static const struct mtk_gate_regs vdo1_1_cg_regs = {
+       .set_ofs = 0x124,
+       .clr_ofs = 0x128,
+       .sta_ofs = 0x120,
+};
+
+static const struct mtk_gate_regs vdo1_2_cg_regs = {
+       .set_ofs = 0x134,
+       .clr_ofs = 0x138,
+       .sta_ofs = 0x130,
+};
+
+static const struct mtk_gate_regs vdo1_3_cg_regs = {
+       .set_ofs = 0x144,
+       .clr_ofs = 0x148,
+       .sta_ofs = 0x140,
+};
+
+#define GATE_VDO1_0(_id, _name, _parent, _shift)                       \
+       GATE_MTK(_id, _name, _parent, &vdo1_0_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+#define GATE_VDO1_1(_id, _name, _parent, _shift)                       \
+       GATE_MTK(_id, _name, _parent, &vdo1_1_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+#define GATE_VDO1_2(_id, _name, _parent, _shift)                       \
+       GATE_MTK(_id, _name, _parent, &vdo1_2_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+#define GATE_VDO1_3(_id, _name, _parent, _shift)                       \
+       GATE_MTK(_id, _name, _parent, &vdo1_3_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+static const struct mtk_gate vdo1_clks[] = {
+       /* VDO1_0 */
+       GATE_VDO1_0(CLK_VDO1_SMI_LARB2, "vdo1_smi_larb2", "top_vpp", 0),
+       GATE_VDO1_0(CLK_VDO1_SMI_LARB3, "vdo1_smi_larb3", "top_vpp", 1),
+       GATE_VDO1_0(CLK_VDO1_GALS, "vdo1_gals", "top_vpp", 2),
+       GATE_VDO1_0(CLK_VDO1_FAKE_ENG0, "vdo1_fake_eng0", "top_vpp", 3),
+       GATE_VDO1_0(CLK_VDO1_FAKE_ENG, "vdo1_fake_eng", "top_vpp", 4),
+       GATE_VDO1_0(CLK_VDO1_MDP_RDMA0, "vdo1_mdp_rdma0", "top_vpp", 5),
+       GATE_VDO1_0(CLK_VDO1_MDP_RDMA1, "vdo1_mdp_rdma1", "top_vpp", 6),
+       GATE_VDO1_0(CLK_VDO1_MDP_RDMA2, "vdo1_mdp_rdma2", "top_vpp", 7),
+       GATE_VDO1_0(CLK_VDO1_MDP_RDMA3, "vdo1_mdp_rdma3", "top_vpp", 8),
+       GATE_VDO1_0(CLK_VDO1_VPP_MERGE0, "vdo1_vpp_merge0", "top_vpp", 9),
+       GATE_VDO1_0(CLK_VDO1_VPP_MERGE1, "vdo1_vpp_merge1", "top_vpp", 10),
+       GATE_VDO1_0(CLK_VDO1_VPP_MERGE2, "vdo1_vpp_merge2", "top_vpp", 11),
+       GATE_VDO1_0(CLK_VDO1_VPP_MERGE3, "vdo1_vpp_merge3", "top_vpp", 12),
+       GATE_VDO1_0(CLK_VDO1_VPP_MERGE4, "vdo1_vpp_merge4", "top_vpp", 13),
+       GATE_VDO1_0(CLK_VDO1_VPP2_TO_VDO1_DL_ASYNC, "vdo1_vpp2_to_vdo1_dl_async", "top_vpp", 14),
+       GATE_VDO1_0(CLK_VDO1_VPP3_TO_VDO1_DL_ASYNC, "vdo1_vpp3_to_vdo1_dl_async", "top_vpp", 15),
+       GATE_VDO1_0(CLK_VDO1_DISP_MUTEX, "vdo1_disp_mutex", "top_vpp", 16),
+       GATE_VDO1_0(CLK_VDO1_MDP_RDMA4, "vdo1_mdp_rdma4", "top_vpp", 17),
+       GATE_VDO1_0(CLK_VDO1_MDP_RDMA5, "vdo1_mdp_rdma5", "top_vpp", 18),
+       GATE_VDO1_0(CLK_VDO1_MDP_RDMA6, "vdo1_mdp_rdma6", "top_vpp", 19),
+       GATE_VDO1_0(CLK_VDO1_MDP_RDMA7, "vdo1_mdp_rdma7", "top_vpp", 20),
+       GATE_VDO1_0(CLK_VDO1_DP_INTF0_MM, "vdo1_dp_intf0_mm", "top_vpp", 21),
+       GATE_VDO1_0(CLK_VDO1_DPI0_MM, "vdo1_dpi0_mm", "top_vpp", 22),
+       GATE_VDO1_0(CLK_VDO1_DPI1_MM, "vdo1_dpi1_mm", "top_vpp", 23),
+       GATE_VDO1_0(CLK_VDO1_DISP_MONITOR, "vdo1_disp_monitor", "top_vpp", 24),
+       GATE_VDO1_0(CLK_VDO1_MERGE0_DL_ASYNC, "vdo1_merge0_dl_async", "top_vpp", 25),
+       GATE_VDO1_0(CLK_VDO1_MERGE1_DL_ASYNC, "vdo1_merge1_dl_async", "top_vpp", 26),
+       GATE_VDO1_0(CLK_VDO1_MERGE2_DL_ASYNC, "vdo1_merge2_dl_async", "top_vpp", 27),
+       GATE_VDO1_0(CLK_VDO1_MERGE3_DL_ASYNC, "vdo1_merge3_dl_async", "top_vpp", 28),
+       GATE_VDO1_0(CLK_VDO1_MERGE4_DL_ASYNC, "vdo1_merge4_dl_async", "top_vpp", 29),
+       GATE_VDO1_0(CLK_VDO1_VDO0_DSC_TO_VDO1_DL_ASYNC, "vdo1_vdo0_dsc_to_vdo1_dl_async",
+                   "top_vpp", 30),
+       GATE_VDO1_0(CLK_VDO1_VDO0_MERGE_TO_VDO1_DL_ASYNC, "vdo1_vdo0_merge_to_vdo1_dl_async",
+                   "top_vpp", 31),
+       /* VDO1_1 */
+       GATE_VDO1_1(CLK_VDO1_HDR_VDO_FE0, "vdo1_hdr_vdo_fe0", "top_vpp", 0),
+       GATE_VDO1_1(CLK_VDO1_HDR_GFX_FE0, "vdo1_hdr_gfx_fe0", "top_vpp", 1),
+       GATE_VDO1_1(CLK_VDO1_HDR_VDO_BE, "vdo1_hdr_vdo_be", "top_vpp", 2),
+       GATE_VDO1_1(CLK_VDO1_HDR_VDO_FE1, "vdo1_hdr_vdo_fe1", "top_vpp", 16),
+       GATE_VDO1_1(CLK_VDO1_HDR_GFX_FE1, "vdo1_hdr_gfx_fe1", "top_vpp", 17),
+       GATE_VDO1_1(CLK_VDO1_DISP_MIXER, "vdo1_disp_mixer", "top_vpp", 18),
+       GATE_VDO1_1(CLK_VDO1_HDR_VDO_FE0_DL_ASYNC, "vdo1_hdr_vdo_fe0_dl_async", "top_vpp", 19),
+       GATE_VDO1_1(CLK_VDO1_HDR_VDO_FE1_DL_ASYNC, "vdo1_hdr_vdo_fe1_dl_async", "top_vpp", 20),
+       GATE_VDO1_1(CLK_VDO1_HDR_GFX_FE0_DL_ASYNC, "vdo1_hdr_gfx_fe0_dl_async", "top_vpp", 21),
+       GATE_VDO1_1(CLK_VDO1_HDR_GFX_FE1_DL_ASYNC, "vdo1_hdr_gfx_fe1_dl_async", "top_vpp", 22),
+       GATE_VDO1_1(CLK_VDO1_HDR_VDO_BE_DL_ASYNC, "vdo1_hdr_vdo_be_dl_async", "top_vpp", 23),
+       /* VDO1_2 */
+       GATE_VDO1_2(CLK_VDO1_DPI0, "vdo1_dpi0", "top_vpp", 0),
+       GATE_VDO1_2(CLK_VDO1_DISP_MONITOR_DPI0, "vdo1_disp_monitor_dpi0", "top_vpp", 1),
+       GATE_VDO1_2(CLK_VDO1_DPI1, "vdo1_dpi1", "top_vpp", 8),
+       GATE_VDO1_2(CLK_VDO1_DISP_MONITOR_DPI1, "vdo1_disp_monitor_dpi1", "top_vpp", 9),
+       GATE_VDO1_2(CLK_VDO1_DPINTF, "vdo1_dpintf", "top_vpp", 16),
+       GATE_VDO1_2(CLK_VDO1_DISP_MONITOR_DPINTF, "vdo1_disp_monitor_dpintf", "top_vpp", 17),
+       /* VDO1_3 */
+       GATE_VDO1_3(CLK_VDO1_26M_SLOW, "vdo1_26m_slow", "clk26m", 8),
+};
+
+static int clk_mt8195_vdo1_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *node = dev->parent->of_node;
+       struct clk_onecell_data *clk_data;
+       int r;
+
+       clk_data = mtk_alloc_clk_data(CLK_VDO1_NR_CLK);
+       if (!clk_data)
+               return -ENOMEM;
+
+       r = mtk_clk_register_gates(node, vdo1_clks, ARRAY_SIZE(vdo1_clks), clk_data);
+       if (r)
+               goto free_vdo1_data;
+
+       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       if (r)
+               goto free_vdo1_data;
+
+       return r;
+
+free_vdo1_data:
+       mtk_free_clk_data(clk_data);
+       return r;
+}
+
+static struct platform_driver clk_mt8195_vdo1_drv = {
+       .probe = clk_mt8195_vdo1_probe,
+       .driver = {
+               .name = "clk-mt8195-vdo1",
+       },
+};
+builtin_platform_driver(clk_mt8195_vdo1_drv);
diff --git a/drivers/clk/mediatek/clk-mt8195-venc.c b/drivers/clk/mediatek/clk-mt8195-venc.c
new file mode 100644 (file)
index 0000000..7339851
--- /dev/null
@@ -0,0 +1,69 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+#include <dt-bindings/clock/mt8195-clk.h>
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+
+static const struct mtk_gate_regs venc_cg_regs = {
+       .set_ofs = 0x4,
+       .clr_ofs = 0x8,
+       .sta_ofs = 0x0,
+};
+
+#define GATE_VENC(_id, _name, _parent, _shift)                 \
+       GATE_MTK(_id, _name, _parent, &venc_cg_regs, _shift, &mtk_clk_gate_ops_setclr_inv)
+
+static const struct mtk_gate venc_clks[] = {
+       GATE_VENC(CLK_VENC_LARB, "venc_larb", "top_venc", 0),
+       GATE_VENC(CLK_VENC_VENC, "venc_venc", "top_venc", 4),
+       GATE_VENC(CLK_VENC_JPGENC, "venc_jpgenc", "top_venc", 8),
+       GATE_VENC(CLK_VENC_JPGDEC, "venc_jpgdec", "top_venc", 12),
+       GATE_VENC(CLK_VENC_JPGDEC_C1, "venc_jpgdec_c1", "top_venc", 16),
+       GATE_VENC(CLK_VENC_GALS, "venc_gals", "top_venc", 28),
+};
+
+static const struct mtk_gate venc_core1_clks[] = {
+       GATE_VENC(CLK_VENC_CORE1_LARB, "venc_core1_larb", "top_venc", 0),
+       GATE_VENC(CLK_VENC_CORE1_VENC, "venc_core1_venc", "top_venc", 4),
+       GATE_VENC(CLK_VENC_CORE1_JPGENC, "venc_core1_jpgenc", "top_venc", 8),
+       GATE_VENC(CLK_VENC_CORE1_JPGDEC, "venc_core1_jpgdec", "top_venc", 12),
+       GATE_VENC(CLK_VENC_CORE1_JPGDEC_C1, "venc_core1_jpgdec_c1", "top_venc", 16),
+       GATE_VENC(CLK_VENC_CORE1_GALS, "venc_core1_gals", "top_venc", 28),
+};
+
+static const struct mtk_clk_desc venc_desc = {
+       .clks = venc_clks,
+       .num_clks = ARRAY_SIZE(venc_clks),
+};
+
+static const struct mtk_clk_desc venc_core1_desc = {
+       .clks = venc_core1_clks,
+       .num_clks = ARRAY_SIZE(venc_core1_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8195_venc[] = {
+       {
+               .compatible = "mediatek,mt8195-vencsys",
+               .data = &venc_desc,
+       }, {
+               .compatible = "mediatek,mt8195-vencsys_core1",
+               .data = &venc_core1_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8195_venc_drv = {
+       .probe = mtk_clk_simple_probe,
+       .driver = {
+               .name = "clk-mt8195-venc",
+               .of_match_table = of_match_clk_mt8195_venc,
+       },
+};
+builtin_platform_driver(clk_mt8195_venc_drv);
diff --git a/drivers/clk/mediatek/clk-mt8195-vpp0.c b/drivers/clk/mediatek/clk-mt8195-vpp0.c
new file mode 100644 (file)
index 0000000..c324146
--- /dev/null
@@ -0,0 +1,110 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+#include <dt-bindings/clock/mt8195-clk.h>
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+
+static const struct mtk_gate_regs vpp0_0_cg_regs = {
+       .set_ofs = 0x24,
+       .clr_ofs = 0x28,
+       .sta_ofs = 0x20,
+};
+
+static const struct mtk_gate_regs vpp0_1_cg_regs = {
+       .set_ofs = 0x30,
+       .clr_ofs = 0x34,
+       .sta_ofs = 0x2c,
+};
+
+static const struct mtk_gate_regs vpp0_2_cg_regs = {
+       .set_ofs = 0x3c,
+       .clr_ofs = 0x40,
+       .sta_ofs = 0x38,
+};
+
+#define GATE_VPP0_0(_id, _name, _parent, _shift)                       \
+       GATE_MTK(_id, _name, _parent, &vpp0_0_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+#define GATE_VPP0_1(_id, _name, _parent, _shift)                       \
+       GATE_MTK(_id, _name, _parent, &vpp0_1_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+#define GATE_VPP0_2(_id, _name, _parent, _shift)                       \
+       GATE_MTK(_id, _name, _parent, &vpp0_2_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+static const struct mtk_gate vpp0_clks[] = {
+       /* VPP0_0 */
+       GATE_VPP0_0(CLK_VPP0_MDP_FG, "vpp0_mdp_fg", "top_vpp", 1),
+       GATE_VPP0_0(CLK_VPP0_STITCH, "vpp0_stitch", "top_vpp", 2),
+       GATE_VPP0_0(CLK_VPP0_PADDING, "vpp0_padding", "top_vpp", 7),
+       GATE_VPP0_0(CLK_VPP0_MDP_TCC, "vpp0_mdp_tcc", "top_vpp", 8),
+       GATE_VPP0_0(CLK_VPP0_WARP0_ASYNC_TX, "vpp0_warp0_async_tx", "top_vpp", 10),
+       GATE_VPP0_0(CLK_VPP0_WARP1_ASYNC_TX, "vpp0_warp1_async_tx", "top_vpp", 11),
+       GATE_VPP0_0(CLK_VPP0_MUTEX, "vpp0_mutex", "top_vpp", 13),
+       GATE_VPP0_0(CLK_VPP0_VPP02VPP1_RELAY, "vpp0_vpp02vpp1_relay", "top_vpp", 14),
+       GATE_VPP0_0(CLK_VPP0_VPP12VPP0_ASYNC, "vpp0_vpp12vpp0_async", "top_vpp", 15),
+       GATE_VPP0_0(CLK_VPP0_MMSYSRAM_TOP, "vpp0_mmsysram_top", "top_vpp", 16),
+       GATE_VPP0_0(CLK_VPP0_MDP_AAL, "vpp0_mdp_aal", "top_vpp", 17),
+       GATE_VPP0_0(CLK_VPP0_MDP_RSZ, "vpp0_mdp_rsz", "top_vpp", 18),
+       /* VPP0_1 */
+       GATE_VPP0_1(CLK_VPP0_SMI_COMMON, "vpp0_smi_common", "top_vpp", 0),
+       GATE_VPP0_1(CLK_VPP0_GALS_VDO0_LARB0, "vpp0_gals_vdo0_larb0", "top_vpp", 1),
+       GATE_VPP0_1(CLK_VPP0_GALS_VDO0_LARB1, "vpp0_gals_vdo0_larb1", "top_vpp", 2),
+       GATE_VPP0_1(CLK_VPP0_GALS_VENCSYS, "vpp0_gals_vencsys", "top_vpp", 3),
+       GATE_VPP0_1(CLK_VPP0_GALS_VENCSYS_CORE1, "vpp0_gals_vencsys_core1", "top_vpp", 4),
+       GATE_VPP0_1(CLK_VPP0_GALS_INFRA, "vpp0_gals_infra", "top_vpp", 5),
+       GATE_VPP0_1(CLK_VPP0_GALS_CAMSYS, "vpp0_gals_camsys", "top_vpp", 6),
+       GATE_VPP0_1(CLK_VPP0_GALS_VPP1_LARB5, "vpp0_gals_vpp1_larb5", "top_vpp", 7),
+       GATE_VPP0_1(CLK_VPP0_GALS_VPP1_LARB6, "vpp0_gals_vpp1_larb6", "top_vpp", 8),
+       GATE_VPP0_1(CLK_VPP0_SMI_REORDER, "vpp0_smi_reorder", "top_vpp", 9),
+       GATE_VPP0_1(CLK_VPP0_SMI_IOMMU, "vpp0_smi_iommu", "top_vpp", 10),
+       GATE_VPP0_1(CLK_VPP0_GALS_IMGSYS_CAMSYS, "vpp0_gals_imgsys_camsys", "top_vpp", 11),
+       GATE_VPP0_1(CLK_VPP0_MDP_RDMA, "vpp0_mdp_rdma", "top_vpp", 12),
+       GATE_VPP0_1(CLK_VPP0_MDP_WROT, "vpp0_mdp_wrot", "top_vpp", 13),
+       GATE_VPP0_1(CLK_VPP0_GALS_EMI0_EMI1, "vpp0_gals_emi0_emi1", "top_vpp", 16),
+       GATE_VPP0_1(CLK_VPP0_SMI_SUB_COMMON_REORDER, "vpp0_smi_sub_common_reorder", "top_vpp", 17),
+       GATE_VPP0_1(CLK_VPP0_SMI_RSI, "vpp0_smi_rsi", "top_vpp", 18),
+       GATE_VPP0_1(CLK_VPP0_SMI_COMMON_LARB4, "vpp0_smi_common_larb4", "top_vpp", 19),
+       GATE_VPP0_1(CLK_VPP0_GALS_VDEC_VDEC_CORE1, "vpp0_gals_vdec_vdec_core1", "top_vpp", 20),
+       GATE_VPP0_1(CLK_VPP0_GALS_VPP1_WPE, "vpp0_gals_vpp1_wpe", "top_vpp", 21),
+       GATE_VPP0_1(CLK_VPP0_GALS_VDO0_VDO1_VENCSYS_CORE1, "vpp0_gals_vdo0_vdo1_vencsys_core1",
+                   "top_vpp", 22),
+       GATE_VPP0_1(CLK_VPP0_FAKE_ENG, "vpp0_fake_eng", "top_vpp", 23),
+       GATE_VPP0_1(CLK_VPP0_MDP_HDR, "vpp0_mdp_hdr", "top_vpp", 24),
+       GATE_VPP0_1(CLK_VPP0_MDP_TDSHP, "vpp0_mdp_tdshp", "top_vpp", 25),
+       GATE_VPP0_1(CLK_VPP0_MDP_COLOR, "vpp0_mdp_color", "top_vpp", 26),
+       GATE_VPP0_1(CLK_VPP0_MDP_OVL, "vpp0_mdp_ovl", "top_vpp", 27),
+       /* VPP0_2 */
+       GATE_VPP0_2(CLK_VPP0_WARP0_RELAY, "vpp0_warp0_relay", "top_wpe_vpp", 0),
+       GATE_VPP0_2(CLK_VPP0_WARP0_MDP_DL_ASYNC, "vpp0_warp0_mdp_dl_async", "top_wpe_vpp", 1),
+       GATE_VPP0_2(CLK_VPP0_WARP1_RELAY, "vpp0_warp1_relay", "top_wpe_vpp", 2),
+       GATE_VPP0_2(CLK_VPP0_WARP1_MDP_DL_ASYNC, "vpp0_warp1_mdp_dl_async", "top_wpe_vpp", 3),
+};
+
+static const struct mtk_clk_desc vpp0_desc = {
+       .clks = vpp0_clks,
+       .num_clks = ARRAY_SIZE(vpp0_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8195_vpp0[] = {
+       {
+               .compatible = "mediatek,mt8195-vppsys0",
+               .data = &vpp0_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8195_vpp0_drv = {
+       .probe = mtk_clk_simple_probe,
+       .driver = {
+               .name = "clk-mt8195-vpp0",
+               .of_match_table = of_match_clk_mt8195_vpp0,
+       },
+};
+builtin_platform_driver(clk_mt8195_vpp0_drv);
diff --git a/drivers/clk/mediatek/clk-mt8195-vpp1.c b/drivers/clk/mediatek/clk-mt8195-vpp1.c
new file mode 100644 (file)
index 0000000..ce0b9a4
--- /dev/null
@@ -0,0 +1,108 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+#include <dt-bindings/clock/mt8195-clk.h>
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+
+static const struct mtk_gate_regs vpp1_0_cg_regs = {
+       .set_ofs = 0x104,
+       .clr_ofs = 0x108,
+       .sta_ofs = 0x100,
+};
+
+static const struct mtk_gate_regs vpp1_1_cg_regs = {
+       .set_ofs = 0x114,
+       .clr_ofs = 0x118,
+       .sta_ofs = 0x110,
+};
+
+#define GATE_VPP1_0(_id, _name, _parent, _shift)                       \
+       GATE_MTK(_id, _name, _parent, &vpp1_0_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+#define GATE_VPP1_1(_id, _name, _parent, _shift)                       \
+       GATE_MTK(_id, _name, _parent, &vpp1_1_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+static const struct mtk_gate vpp1_clks[] = {
+       /* VPP1_0 */
+       GATE_VPP1_0(CLK_VPP1_SVPP1_MDP_OVL, "vpp1_svpp1_mdp_ovl", "top_vpp", 0),
+       GATE_VPP1_0(CLK_VPP1_SVPP1_MDP_TCC, "vpp1_svpp1_mdp_tcc", "top_vpp", 1),
+       GATE_VPP1_0(CLK_VPP1_SVPP1_MDP_WROT, "vpp1_svpp1_mdp_wrot", "top_vpp", 2),
+       GATE_VPP1_0(CLK_VPP1_SVPP1_VPP_PAD, "vpp1_svpp1_vpp_pad", "top_vpp", 3),
+       GATE_VPP1_0(CLK_VPP1_SVPP2_MDP_WROT, "vpp1_svpp2_mdp_wrot", "top_vpp", 4),
+       GATE_VPP1_0(CLK_VPP1_SVPP2_VPP_PAD, "vpp1_svpp2_vpp_pad", "top_vpp", 5),
+       GATE_VPP1_0(CLK_VPP1_SVPP3_MDP_WROT, "vpp1_svpp3_mdp_wrot", "top_vpp", 6),
+       GATE_VPP1_0(CLK_VPP1_SVPP3_VPP_PAD, "vpp1_svpp3_vpp_pad", "top_vpp", 7),
+       GATE_VPP1_0(CLK_VPP1_SVPP1_MDP_RDMA, "vpp1_svpp1_mdp_rdma", "top_vpp", 8),
+       GATE_VPP1_0(CLK_VPP1_SVPP1_MDP_FG, "vpp1_svpp1_mdp_fg", "top_vpp", 9),
+       GATE_VPP1_0(CLK_VPP1_SVPP2_MDP_RDMA, "vpp1_svpp2_mdp_rdma", "top_vpp", 10),
+       GATE_VPP1_0(CLK_VPP1_SVPP2_MDP_FG, "vpp1_svpp2_mdp_fg", "top_vpp", 11),
+       GATE_VPP1_0(CLK_VPP1_SVPP3_MDP_RDMA, "vpp1_svpp3_mdp_rdma", "top_vpp", 12),
+       GATE_VPP1_0(CLK_VPP1_SVPP3_MDP_FG, "vpp1_svpp3_mdp_fg", "top_vpp", 13),
+       GATE_VPP1_0(CLK_VPP1_VPP_SPLIT, "vpp1_vpp_split", "top_vpp", 14),
+       GATE_VPP1_0(CLK_VPP1_SVPP2_VDO0_DL_RELAY, "vpp1_svpp2_vdo0_dl_relay", "top_vpp", 15),
+       GATE_VPP1_0(CLK_VPP1_SVPP1_MDP_TDSHP, "vpp1_svpp1_mdp_tdshp", "top_vpp", 16),
+       GATE_VPP1_0(CLK_VPP1_SVPP1_MDP_COLOR, "vpp1_svpp1_mdp_color", "top_vpp", 17),
+       GATE_VPP1_0(CLK_VPP1_SVPP3_VDO1_DL_RELAY, "vpp1_svpp3_vdo1_dl_relay", "top_vpp", 18),
+       GATE_VPP1_0(CLK_VPP1_SVPP2_VPP_MERGE, "vpp1_svpp2_vpp_merge", "top_vpp", 19),
+       GATE_VPP1_0(CLK_VPP1_SVPP2_MDP_COLOR, "vpp1_svpp2_mdp_color", "top_vpp", 20),
+       GATE_VPP1_0(CLK_VPP1_VPPSYS1_GALS, "vpp1_vppsys1_gals", "top_vpp", 21),
+       GATE_VPP1_0(CLK_VPP1_SVPP3_VPP_MERGE, "vpp1_svpp3_vpp_merge", "top_vpp", 22),
+       GATE_VPP1_0(CLK_VPP1_SVPP3_MDP_COLOR, "vpp1_svpp3_mdp_color", "top_vpp", 23),
+       GATE_VPP1_0(CLK_VPP1_VPPSYS1_LARB, "vpp1_vppsys1_larb", "top_vpp", 24),
+       GATE_VPP1_0(CLK_VPP1_SVPP1_MDP_RSZ, "vpp1_svpp1_mdp_rsz", "top_vpp", 25),
+       GATE_VPP1_0(CLK_VPP1_SVPP1_MDP_HDR, "vpp1_svpp1_mdp_hdr", "top_vpp", 26),
+       GATE_VPP1_0(CLK_VPP1_SVPP1_MDP_AAL, "vpp1_svpp1_mdp_aal", "top_vpp", 27),
+       GATE_VPP1_0(CLK_VPP1_SVPP2_MDP_HDR, "vpp1_svpp2_mdp_hdr", "top_vpp", 28),
+       GATE_VPP1_0(CLK_VPP1_SVPP2_MDP_AAL, "vpp1_svpp2_mdp_aal", "top_vpp", 29),
+       GATE_VPP1_0(CLK_VPP1_DL_ASYNC, "vpp1_dl_async", "top_vpp", 30),
+       GATE_VPP1_0(CLK_VPP1_LARB5_FAKE_ENG, "vpp1_larb5_fake_eng", "top_vpp", 31),
+       /* VPP1_1 */
+       GATE_VPP1_1(CLK_VPP1_SVPP3_MDP_HDR, "vpp1_svpp3_mdp_hdr", "top_vpp", 0),
+       GATE_VPP1_1(CLK_VPP1_SVPP3_MDP_AAL, "vpp1_svpp3_mdp_aal", "top_vpp", 1),
+       GATE_VPP1_1(CLK_VPP1_SVPP2_VDO1_DL_RELAY, "vpp1_svpp2_vdo1_dl_relay", "top_vpp", 2),
+       GATE_VPP1_1(CLK_VPP1_LARB6_FAKE_ENG, "vpp1_larb6_fake_eng", "top_vpp", 3),
+       GATE_VPP1_1(CLK_VPP1_SVPP2_MDP_RSZ, "vpp1_svpp2_mdp_rsz", "top_vpp", 4),
+       GATE_VPP1_1(CLK_VPP1_SVPP3_MDP_RSZ, "vpp1_svpp3_mdp_rsz", "top_vpp", 5),
+       GATE_VPP1_1(CLK_VPP1_SVPP3_VDO0_DL_RELAY, "vpp1_svpp3_vdo0_dl_relay", "top_vpp", 6),
+       GATE_VPP1_1(CLK_VPP1_DISP_MUTEX, "vpp1_disp_mutex", "top_vpp", 7),
+       GATE_VPP1_1(CLK_VPP1_SVPP2_MDP_TDSHP, "vpp1_svpp2_mdp_tdshp", "top_vpp", 8),
+       GATE_VPP1_1(CLK_VPP1_SVPP3_MDP_TDSHP, "vpp1_svpp3_mdp_tdshp", "top_vpp", 9),
+       GATE_VPP1_1(CLK_VPP1_VPP0_DL1_RELAY, "vpp1_vpp0_dl1_relay", "top_vpp", 10),
+       GATE_VPP1_1(CLK_VPP1_HDMI_META, "vpp1_hdmi_meta", "hdmirx_p", 11),
+       GATE_VPP1_1(CLK_VPP1_VPP_SPLIT_HDMI, "vpp1_vpp_split_hdmi", "hdmirx_p", 12),
+       GATE_VPP1_1(CLK_VPP1_DGI_IN, "vpp1_dgi_in", "in_dgi", 13),
+       GATE_VPP1_1(CLK_VPP1_DGI_OUT, "vpp1_dgi_out", "top_dgi_out", 14),
+       GATE_VPP1_1(CLK_VPP1_VPP_SPLIT_DGI, "vpp1_vpp_split_dgi", "top_dgi_out", 15),
+       GATE_VPP1_1(CLK_VPP1_VPP0_DL_ASYNC, "vpp1_vpp0_dl_async", "top_vpp", 16),
+       GATE_VPP1_1(CLK_VPP1_VPP0_DL_RELAY, "vpp1_vpp0_dl_relay", "top_vpp", 17),
+       GATE_VPP1_1(CLK_VPP1_VPP_SPLIT_26M, "vpp1_vpp_split_26m", "clk26m", 26),
+};
+
+static const struct mtk_clk_desc vpp1_desc = {
+       .clks = vpp1_clks,
+       .num_clks = ARRAY_SIZE(vpp1_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8195_vpp1[] = {
+       {
+               .compatible = "mediatek,mt8195-vppsys1",
+               .data = &vpp1_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8195_vpp1_drv = {
+       .probe = mtk_clk_simple_probe,
+       .driver = {
+               .name = "clk-mt8195-vpp1",
+               .of_match_table = of_match_clk_mt8195_vpp1,
+       },
+};
+builtin_platform_driver(clk_mt8195_vpp1_drv);
diff --git a/drivers/clk/mediatek/clk-mt8195-wpe.c b/drivers/clk/mediatek/clk-mt8195-wpe.c
new file mode 100644 (file)
index 0000000..274d608
--- /dev/null
@@ -0,0 +1,143 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+#include <dt-bindings/clock/mt8195-clk.h>
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+
+static const struct mtk_gate_regs wpe_cg_regs = {
+       .set_ofs = 0x0,
+       .clr_ofs = 0x0,
+       .sta_ofs = 0x0,
+};
+
+static const struct mtk_gate_regs wpe_vpp0_cg_regs = {
+       .set_ofs = 0x58,
+       .clr_ofs = 0x58,
+       .sta_ofs = 0x58,
+};
+
+static const struct mtk_gate_regs wpe_vpp1_cg_regs = {
+       .set_ofs = 0x5c,
+       .clr_ofs = 0x5c,
+       .sta_ofs = 0x5c,
+};
+
+#define GATE_WPE(_id, _name, _parent, _shift)                  \
+       GATE_MTK(_id, _name, _parent, &wpe_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr_inv)
+
+#define GATE_WPE_VPP0(_id, _name, _parent, _shift)                     \
+       GATE_MTK(_id, _name, _parent, &wpe_vpp0_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr_inv)
+
+#define GATE_WPE_VPP1(_id, _name, _parent, _shift)                     \
+       GATE_MTK(_id, _name, _parent, &wpe_vpp1_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr_inv)
+
+static const struct mtk_gate wpe_clks[] = {
+       GATE_WPE(CLK_WPE_VPP0, "wpe_vpp0", "top_wpe_vpp", 16),
+       GATE_WPE(CLK_WPE_VPP1, "wpe_vpp1", "top_wpe_vpp", 17),
+       GATE_WPE(CLK_WPE_SMI_LARB7, "wpe_smi_larb7", "top_wpe_vpp", 18),
+       GATE_WPE(CLK_WPE_SMI_LARB8, "wpe_smi_larb8", "top_wpe_vpp", 19),
+       GATE_WPE(CLK_WPE_EVENT_TX, "wpe_event_tx", "top_wpe_vpp", 20),
+       GATE_WPE(CLK_WPE_SMI_LARB7_P, "wpe_smi_larb7_p", "top_wpe_vpp", 24),
+       GATE_WPE(CLK_WPE_SMI_LARB8_P, "wpe_smi_larb8_p", "top_wpe_vpp", 25),
+};
+
+static const struct mtk_gate wpe_vpp0_clks[] = {
+       /* WPE_VPP0 */
+       GATE_WPE_VPP0(CLK_WPE_VPP0_VGEN, "wpe_vpp0_vgen", "top_img", 0),
+       GATE_WPE_VPP0(CLK_WPE_VPP0_EXT, "wpe_vpp0_ext", "top_img", 1),
+       GATE_WPE_VPP0(CLK_WPE_VPP0_VFC, "wpe_vpp0_vfc", "top_img", 2),
+       GATE_WPE_VPP0(CLK_WPE_VPP0_CACH0_TOP, "wpe_vpp0_cach0_top", "top_img", 3),
+       GATE_WPE_VPP0(CLK_WPE_VPP0_CACH0_DMA, "wpe_vpp0_cach0_dma", "top_img", 4),
+       GATE_WPE_VPP0(CLK_WPE_VPP0_CACH1_TOP, "wpe_vpp0_cach1_top", "top_img", 5),
+       GATE_WPE_VPP0(CLK_WPE_VPP0_CACH1_DMA, "wpe_vpp0_cach1_dma", "top_img", 6),
+       GATE_WPE_VPP0(CLK_WPE_VPP0_CACH2_TOP, "wpe_vpp0_cach2_top", "top_img", 7),
+       GATE_WPE_VPP0(CLK_WPE_VPP0_CACH2_DMA, "wpe_vpp0_cach2_dma", "top_img", 8),
+       GATE_WPE_VPP0(CLK_WPE_VPP0_CACH3_TOP, "wpe_vpp0_cach3_top", "top_img", 9),
+       GATE_WPE_VPP0(CLK_WPE_VPP0_CACH3_DMA, "wpe_vpp0_cach3_dma", "top_img", 10),
+       GATE_WPE_VPP0(CLK_WPE_VPP0_PSP, "wpe_vpp0_psp", "top_img", 11),
+       GATE_WPE_VPP0(CLK_WPE_VPP0_PSP2, "wpe_vpp0_psp2", "top_img", 12),
+       GATE_WPE_VPP0(CLK_WPE_VPP0_SYNC, "wpe_vpp0_sync", "top_img", 13),
+       GATE_WPE_VPP0(CLK_WPE_VPP0_C24, "wpe_vpp0_c24", "top_img", 14),
+       GATE_WPE_VPP0(CLK_WPE_VPP0_MDP_CROP, "wpe_vpp0_mdp_crop", "top_img", 15),
+       GATE_WPE_VPP0(CLK_WPE_VPP0_ISP_CROP, "wpe_vpp0_isp_crop", "top_img", 16),
+       GATE_WPE_VPP0(CLK_WPE_VPP0_TOP, "wpe_vpp0_top", "top_img", 17),
+       /* WPE_VPP1 */
+       GATE_WPE_VPP1(CLK_WPE_VPP0_VECI, "wpe_vpp0_veci", "top_img", 0),
+       GATE_WPE_VPP1(CLK_WPE_VPP0_VEC2I, "wpe_vpp0_vec2i", "top_img", 1),
+       GATE_WPE_VPP1(CLK_WPE_VPP0_VEC3I, "wpe_vpp0_vec3i", "top_img", 2),
+       GATE_WPE_VPP1(CLK_WPE_VPP0_WPEO, "wpe_vpp0_wpeo", "top_img", 3),
+       GATE_WPE_VPP1(CLK_WPE_VPP0_MSKO, "wpe_vpp0_msko", "top_img", 4),
+};
+
+static const struct mtk_gate wpe_vpp1_clks[] = {
+       /* WPE_VPP0 */
+       GATE_WPE_VPP0(CLK_WPE_VPP1_VGEN, "wpe_vpp1_vgen", "top_img", 0),
+       GATE_WPE_VPP0(CLK_WPE_VPP1_EXT, "wpe_vpp1_ext", "top_img", 1),
+       GATE_WPE_VPP0(CLK_WPE_VPP1_VFC, "wpe_vpp1_vfc", "top_img", 2),
+       GATE_WPE_VPP0(CLK_WPE_VPP1_CACH0_TOP, "wpe_vpp1_cach0_top", "top_img", 3),
+       GATE_WPE_VPP0(CLK_WPE_VPP1_CACH0_DMA, "wpe_vpp1_cach0_dma", "top_img", 4),
+       GATE_WPE_VPP0(CLK_WPE_VPP1_CACH1_TOP, "wpe_vpp1_cach1_top", "top_img", 5),
+       GATE_WPE_VPP0(CLK_WPE_VPP1_CACH1_DMA, "wpe_vpp1_cach1_dma", "top_img", 6),
+       GATE_WPE_VPP0(CLK_WPE_VPP1_CACH2_TOP, "wpe_vpp1_cach2_top", "top_img", 7),
+       GATE_WPE_VPP0(CLK_WPE_VPP1_CACH2_DMA, "wpe_vpp1_cach2_dma", "top_img", 8),
+       GATE_WPE_VPP0(CLK_WPE_VPP1_CACH3_TOP, "wpe_vpp1_cach3_top", "top_img", 9),
+       GATE_WPE_VPP0(CLK_WPE_VPP1_CACH3_DMA, "wpe_vpp1_cach3_dma", "top_img", 10),
+       GATE_WPE_VPP0(CLK_WPE_VPP1_PSP, "wpe_vpp1_psp", "top_img", 11),
+       GATE_WPE_VPP0(CLK_WPE_VPP1_PSP2, "wpe_vpp1_psp2", "top_img", 12),
+       GATE_WPE_VPP0(CLK_WPE_VPP1_SYNC, "wpe_vpp1_sync", "top_img", 13),
+       GATE_WPE_VPP0(CLK_WPE_VPP1_C24, "wpe_vpp1_c24", "top_img", 14),
+       GATE_WPE_VPP0(CLK_WPE_VPP1_MDP_CROP, "wpe_vpp1_mdp_crop", "top_img", 15),
+       GATE_WPE_VPP0(CLK_WPE_VPP1_ISP_CROP, "wpe_vpp1_isp_crop", "top_img", 16),
+       GATE_WPE_VPP0(CLK_WPE_VPP1_TOP, "wpe_vpp1_top", "top_img", 17),
+       /* WPE_VPP1 */
+       GATE_WPE_VPP1(CLK_WPE_VPP1_VECI, "wpe_vpp1_veci", "top_img", 0),
+       GATE_WPE_VPP1(CLK_WPE_VPP1_VEC2I, "wpe_vpp1_vec2i", "top_img", 1),
+       GATE_WPE_VPP1(CLK_WPE_VPP1_VEC3I, "wpe_vpp1_vec3i", "top_img", 2),
+       GATE_WPE_VPP1(CLK_WPE_VPP1_WPEO, "wpe_vpp1_wpeo", "top_img", 3),
+       GATE_WPE_VPP1(CLK_WPE_VPP1_MSKO, "wpe_vpp1_msko", "top_img", 4),
+};
+
+static const struct mtk_clk_desc wpe_desc = {
+       .clks = wpe_clks,
+       .num_clks = ARRAY_SIZE(wpe_clks),
+};
+
+static const struct mtk_clk_desc wpe_vpp0_desc = {
+       .clks = wpe_vpp0_clks,
+       .num_clks = ARRAY_SIZE(wpe_vpp0_clks),
+};
+
+static const struct mtk_clk_desc wpe_vpp1_desc = {
+       .clks = wpe_vpp1_clks,
+       .num_clks = ARRAY_SIZE(wpe_vpp1_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8195_wpe[] = {
+       {
+               .compatible = "mediatek,mt8195-wpesys",
+               .data = &wpe_desc,
+       }, {
+               .compatible = "mediatek,mt8195-wpesys_vpp0",
+               .data = &wpe_vpp0_desc,
+       }, {
+               .compatible = "mediatek,mt8195-wpesys_vpp1",
+               .data = &wpe_vpp1_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8195_wpe_drv = {
+       .probe = mtk_clk_simple_probe,
+       .driver = {
+               .name = "clk-mt8195-wpe",
+               .of_match_table = of_match_clk_mt8195_wpe,
+       },
+};
+builtin_platform_driver(clk_mt8195_wpe_drv);
index 4b6096c..8d5791b 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/slab.h>
 #include <linux/delay.h>
 #include <linux/clkdev.h>
+#include <linux/module.h>
 #include <linux/mfd/syscon.h>
 #include <linux/device.h>
 #include <linux/of_device.h>
@@ -42,6 +43,16 @@ err_out:
 
        return NULL;
 }
+EXPORT_SYMBOL_GPL(mtk_alloc_clk_data);
+
+void mtk_free_clk_data(struct clk_onecell_data *clk_data)
+{
+       if (!clk_data)
+               return;
+
+       kfree(clk_data->clks);
+       kfree(clk_data);
+}
 
 void mtk_clk_register_fixed_clks(const struct mtk_fixed_clk *clks,
                int num, struct clk_onecell_data *clk_data)
@@ -68,6 +79,7 @@ void mtk_clk_register_fixed_clks(const struct mtk_fixed_clk *clks,
                        clk_data->clks[rc->id] = clk;
        }
 }
+EXPORT_SYMBOL_GPL(mtk_clk_register_fixed_clks);
 
 void mtk_clk_register_factors(const struct mtk_fixed_factor *clks,
                int num, struct clk_onecell_data *clk_data)
@@ -94,6 +106,7 @@ void mtk_clk_register_factors(const struct mtk_fixed_factor *clks,
                        clk_data->clks[ff->id] = clk;
        }
 }
+EXPORT_SYMBOL_GPL(mtk_clk_register_factors);
 
 int mtk_clk_register_gates_with_dev(struct device_node *node,
                const struct mtk_gate *clks,
@@ -146,6 +159,7 @@ int mtk_clk_register_gates(struct device_node *node,
        return mtk_clk_register_gates_with_dev(node,
                clks, num, clk_data, NULL);
 }
+EXPORT_SYMBOL_GPL(mtk_clk_register_gates);
 
 struct clk *mtk_clk_register_composite(const struct mtk_composite *mc,
                void __iomem *base, spinlock_t *lock)
@@ -259,6 +273,7 @@ void mtk_clk_register_composites(const struct mtk_composite *mcs,
                        clk_data->clks[mc->id] = clk;
        }
 }
+EXPORT_SYMBOL_GPL(mtk_clk_register_composites);
 
 void mtk_clk_register_dividers(const struct mtk_clk_divider *mcds,
                        int num, void __iomem *base, spinlock_t *lock,
@@ -305,7 +320,17 @@ int mtk_clk_simple_probe(struct platform_device *pdev)
 
        r = mtk_clk_register_gates(node, mcd->clks, mcd->num_clks, clk_data);
        if (r)
-               return r;
+               goto free_data;
+
+       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       if (r)
+               goto free_data;
 
-       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       return r;
+
+free_data:
+       mtk_free_clk_data(clk_data);
+       return r;
 }
+
+MODULE_LICENSE("GPL");
index 7de41c3..0ff289d 100644 (file)
@@ -202,6 +202,7 @@ void mtk_clk_register_dividers(const struct mtk_clk_divider *mcds,
                                struct clk_onecell_data *clk_data);
 
 struct clk_onecell_data *mtk_alloc_clk_data(unsigned int clk_num);
+void mtk_free_clk_data(struct clk_onecell_data *clk_data);
 
 #define HAVE_RST_BAR   BIT(0)
 #define PLL_AO         BIT(1)
index 855b0a1..6d3a50e 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/of_address.h>
 #include <linux/slab.h>
 #include <linux/mfd/syscon.h>
+#include <linux/module.h>
 
 #include "clk-mtk.h"
 #include "clk-mux.h"
@@ -120,6 +121,7 @@ const struct clk_ops mtk_mux_clr_set_upd_ops = {
        .get_parent = mtk_clk_mux_get_parent,
        .set_parent = mtk_clk_mux_set_parent_setclr_lock,
 };
+EXPORT_SYMBOL_GPL(mtk_mux_clr_set_upd_ops);
 
 const struct clk_ops mtk_mux_gate_clr_set_upd_ops  = {
        .enable = mtk_clk_mux_enable_setclr,
@@ -128,6 +130,7 @@ const struct clk_ops mtk_mux_gate_clr_set_upd_ops  = {
        .get_parent = mtk_clk_mux_get_parent,
        .set_parent = mtk_clk_mux_set_parent_setclr_lock,
 };
+EXPORT_SYMBOL_GPL(mtk_mux_gate_clr_set_upd_ops);
 
 static struct clk *mtk_clk_register_mux(const struct mtk_mux *mux,
                                 struct regmap *regmap,
@@ -195,3 +198,6 @@ int mtk_clk_register_muxes(const struct mtk_mux *muxes,
 
        return 0;
 }
+EXPORT_SYMBOL_GPL(mtk_clk_register_muxes);
+
+MODULE_LICENSE("GPL");
index 7fb001a..60d7ffa 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/io.h>
+#include <linux/module.h>
 #include <linux/slab.h>
 #include <linux/clkdev.h>
 #include <linux/delay.h>
@@ -332,7 +333,7 @@ static struct clk *mtk_clk_register_pll(const struct mtk_pll_data *data,
                pll->pcw_chg_addr = pll->base_addr + REG_CON1;
        if (data->tuner_reg)
                pll->tuner_addr = base + data->tuner_reg;
-       if (data->tuner_en_reg)
+       if (data->tuner_en_reg || data->tuner_en_bit)
                pll->tuner_en_addr = base + data->tuner_en_reg;
        if (data->en_reg)
                pll->en_addr = base + data->en_reg;
@@ -385,3 +386,6 @@ void mtk_clk_register_plls(struct device_node *node,
                clk_data->clks[pll->id] = clk;
        }
 }
+EXPORT_SYMBOL_GPL(mtk_clk_register_plls);
+
+MODULE_LICENSE("GPL");
index e562dc3..ffe464c 100644 (file)
@@ -137,3 +137,5 @@ void mtk_register_reset_controller_set_clr(struct device_node *np,
        mtk_register_reset_controller_common(np, num_regs, regofs,
                &mtk_reset_ops_set_clr);
 }
+
+MODULE_LICENSE("GPL");
index a844d35..cd0f5ba 100644 (file)
@@ -118,6 +118,56 @@ static struct clk_regmap meson8b_fixed_pll = {
        },
 };
 
+static struct clk_fixed_factor hdmi_pll_dco_in = {
+       .mult = 2,
+       .div = 1,
+       .hw.init = &(struct clk_init_data){
+               .name = "hdmi_pll_dco_in",
+               .ops = &clk_fixed_factor_ops,
+               .parent_data = &(const struct clk_parent_data) {
+                       .fw_name = "xtal",
+                       .index = -1,
+               },
+               .num_parents = 1,
+       },
+};
+
+/*
+ * Taken from the vendor driver for the 2970/2975MHz (both only differ in the
+ * FRAC part in HHI_VID_PLL_CNTL2) where these values are identical for Meson8,
+ * Meson8b and Meson8m2. This doubles the input (or output - it's not clear
+ * which one but the result is the same) clock. The vendor driver additionally
+ * has the following comment about: "optimise HPLL VCO 2.97GHz performance".
+ */
+static const struct reg_sequence meson8b_hdmi_pll_init_regs[] = {
+       { .reg = HHI_VID_PLL_CNTL2,     .def = 0x69c84000 },
+       { .reg = HHI_VID_PLL_CNTL3,     .def = 0x8a46c023 },
+       { .reg = HHI_VID_PLL_CNTL4,     .def = 0x4123b100 },
+       { .reg = HHI_VID_PLL_CNTL5,     .def = 0x00012385 },
+       { .reg = HHI_VID2_PLL_CNTL2,    .def = 0x0430a800 },
+};
+
+static const struct pll_params_table hdmi_pll_params_table[] = {
+       PLL_PARAMS(40, 1),
+       PLL_PARAMS(42, 1),
+       PLL_PARAMS(44, 1),
+       PLL_PARAMS(45, 1),
+       PLL_PARAMS(49, 1),
+       PLL_PARAMS(52, 1),
+       PLL_PARAMS(54, 1),
+       PLL_PARAMS(56, 1),
+       PLL_PARAMS(59, 1),
+       PLL_PARAMS(60, 1),
+       PLL_PARAMS(61, 1),
+       PLL_PARAMS(62, 1),
+       PLL_PARAMS(64, 1),
+       PLL_PARAMS(66, 1),
+       PLL_PARAMS(68, 1),
+       PLL_PARAMS(71, 1),
+       PLL_PARAMS(82, 1),
+       { /* sentinel */ }
+};
+
 static struct clk_regmap meson8b_hdmi_pll_dco = {
        .data = &(struct meson_clk_pll_data){
                .en = {
@@ -150,15 +200,16 @@ static struct clk_regmap meson8b_hdmi_pll_dco = {
                        .shift   = 29,
                        .width   = 1,
                },
+               .table = hdmi_pll_params_table,
+               .init_regs = meson8b_hdmi_pll_init_regs,
+               .init_count = ARRAY_SIZE(meson8b_hdmi_pll_init_regs),
        },
        .hw.init = &(struct clk_init_data){
                /* sometimes also called "HPLL" or "HPLL PLL" */
                .name = "hdmi_pll_dco",
-               .ops = &meson_clk_pll_ro_ops,
-               .parent_data = &(const struct clk_parent_data) {
-                       .fw_name = "xtal",
-                       .name = "xtal",
-                       .index = -1,
+               .ops = &meson_clk_pll_ops,
+               .parent_hws = (const struct clk_hw *[]) {
+                       &hdmi_pll_dco_in.hw
                },
                .num_parents = 1,
        },
@@ -173,7 +224,7 @@ static struct clk_regmap meson8b_hdmi_pll_lvds_out = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "hdmi_pll_lvds_out",
-               .ops = &clk_regmap_divider_ro_ops,
+               .ops = &clk_regmap_divider_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_hdmi_pll_dco.hw
                },
@@ -191,7 +242,7 @@ static struct clk_regmap meson8b_hdmi_pll_hdmi_out = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "hdmi_pll_hdmi_out",
-               .ops = &clk_regmap_divider_ro_ops,
+               .ops = &clk_regmap_divider_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_hdmi_pll_dco.hw
                },
@@ -1045,6 +1096,23 @@ static struct clk_regmap meson8b_l2_dram_clk_gate = {
        },
 };
 
+/* also called LVDS_CLK_EN */
+static struct clk_regmap meson8b_vid_pll_lvds_en = {
+       .data = &(struct clk_regmap_gate_data){
+               .offset = HHI_VID_DIVIDER_CNTL,
+               .bit_idx = 11,
+       },
+       .hw.init = &(struct clk_init_data){
+               .name = "vid_pll_lvds_en",
+               .ops = &clk_regmap_gate_ops,
+               .parent_hws = (const struct clk_hw *[]) {
+                       &meson8b_hdmi_pll_lvds_out.hw
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
 static struct clk_regmap meson8b_vid_pll_in_sel = {
        .data = &(struct clk_regmap_mux_data){
                .offset = HHI_VID_DIVIDER_CNTL,
@@ -1053,7 +1121,7 @@ static struct clk_regmap meson8b_vid_pll_in_sel = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "vid_pll_in_sel",
-               .ops = &clk_regmap_mux_ro_ops,
+               .ops = &clk_regmap_mux_ops,
                /*
                 * TODO: depending on the SoC there is also a second parent:
                 * Meson8: unknown
@@ -1061,7 +1129,7 @@ static struct clk_regmap meson8b_vid_pll_in_sel = {
                 * Meson8m2: vid2_pll
                 */
                .parent_hws = (const struct clk_hw *[]) {
-                       &meson8b_hdmi_pll_lvds_out.hw
+                       &meson8b_vid_pll_lvds_en.hw
                },
                .num_parents = 1,
                .flags = CLK_SET_RATE_PARENT,
@@ -1075,7 +1143,7 @@ static struct clk_regmap meson8b_vid_pll_in_en = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "vid_pll_in_en",
-               .ops = &clk_regmap_gate_ro_ops,
+               .ops = &clk_regmap_gate_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_vid_pll_in_sel.hw
                },
@@ -1092,7 +1160,7 @@ static struct clk_regmap meson8b_vid_pll_pre_div = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "vid_pll_pre_div",
-               .ops = &clk_regmap_divider_ro_ops,
+               .ops = &clk_regmap_divider_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_vid_pll_in_en.hw
                },
@@ -1109,7 +1177,7 @@ static struct clk_regmap meson8b_vid_pll_post_div = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "vid_pll_post_div",
-               .ops = &clk_regmap_divider_ro_ops,
+               .ops = &clk_regmap_divider_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_vid_pll_pre_div.hw
                },
@@ -1126,7 +1194,7 @@ static struct clk_regmap meson8b_vid_pll = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "vid_pll",
-               .ops = &clk_regmap_mux_ro_ops,
+               .ops = &clk_regmap_mux_ops,
                /* TODO: parent 0x2 is vid_pll_pre_div_mult7_div2 */
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_vid_pll_pre_div.hw,
@@ -1145,7 +1213,7 @@ static struct clk_regmap meson8b_vid_pll_final_div = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "vid_pll_final_div",
-               .ops = &clk_regmap_divider_ro_ops,
+               .ops = &clk_regmap_divider_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_vid_pll.hw
                },
@@ -1172,10 +1240,10 @@ static struct clk_regmap meson8b_vclk_in_sel = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "vclk_in_sel",
-               .ops = &clk_regmap_mux_ro_ops,
+               .ops = &clk_regmap_mux_ops,
                .parent_hws = meson8b_vclk_mux_parent_hws,
                .num_parents = ARRAY_SIZE(meson8b_vclk_mux_parent_hws),
-               .flags = CLK_SET_RATE_PARENT,
+               .flags = CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
        },
 };
 
@@ -1186,7 +1254,7 @@ static struct clk_regmap meson8b_vclk_in_en = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "vclk_in_en",
-               .ops = &clk_regmap_gate_ro_ops,
+               .ops = &clk_regmap_gate_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_vclk_in_sel.hw
                },
@@ -1202,7 +1270,7 @@ static struct clk_regmap meson8b_vclk_en = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "vclk_en",
-               .ops = &clk_regmap_gate_ro_ops,
+               .ops = &clk_regmap_gate_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_vclk_in_en.hw
                },
@@ -1218,7 +1286,7 @@ static struct clk_regmap meson8b_vclk_div1_gate = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "vclk_div1_en",
-               .ops = &clk_regmap_gate_ro_ops,
+               .ops = &clk_regmap_gate_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_vclk_en.hw
                },
@@ -1248,7 +1316,7 @@ static struct clk_regmap meson8b_vclk_div2_div_gate = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "vclk_div2_en",
-               .ops = &clk_regmap_gate_ro_ops,
+               .ops = &clk_regmap_gate_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_vclk_div2_div.hw
                },
@@ -1278,7 +1346,7 @@ static struct clk_regmap meson8b_vclk_div4_div_gate = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "vclk_div4_en",
-               .ops = &clk_regmap_gate_ro_ops,
+               .ops = &clk_regmap_gate_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_vclk_div4_div.hw
                },
@@ -1308,7 +1376,7 @@ static struct clk_regmap meson8b_vclk_div6_div_gate = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "vclk_div6_en",
-               .ops = &clk_regmap_gate_ro_ops,
+               .ops = &clk_regmap_gate_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_vclk_div6_div.hw
                },
@@ -1338,7 +1406,7 @@ static struct clk_regmap meson8b_vclk_div12_div_gate = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "vclk_div12_en",
-               .ops = &clk_regmap_gate_ro_ops,
+               .ops = &clk_regmap_gate_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_vclk_div12_div.hw
                },
@@ -1355,10 +1423,10 @@ static struct clk_regmap meson8b_vclk2_in_sel = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "vclk2_in_sel",
-               .ops = &clk_regmap_mux_ro_ops,
+               .ops = &clk_regmap_mux_ops,
                .parent_hws = meson8b_vclk_mux_parent_hws,
                .num_parents = ARRAY_SIZE(meson8b_vclk_mux_parent_hws),
-               .flags = CLK_SET_RATE_PARENT,
+               .flags = CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
        },
 };
 
@@ -1369,7 +1437,7 @@ static struct clk_regmap meson8b_vclk2_clk_in_en = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "vclk2_in_en",
-               .ops = &clk_regmap_gate_ro_ops,
+               .ops = &clk_regmap_gate_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_vclk2_in_sel.hw
                },
@@ -1385,7 +1453,7 @@ static struct clk_regmap meson8b_vclk2_clk_en = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "vclk2_en",
-               .ops = &clk_regmap_gate_ro_ops,
+               .ops = &clk_regmap_gate_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_vclk2_clk_in_en.hw
                },
@@ -1401,7 +1469,7 @@ static struct clk_regmap meson8b_vclk2_div1_gate = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "vclk2_div1_en",
-               .ops = &clk_regmap_gate_ro_ops,
+               .ops = &clk_regmap_gate_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_vclk2_clk_en.hw
                },
@@ -1431,7 +1499,7 @@ static struct clk_regmap meson8b_vclk2_div2_div_gate = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "vclk2_div2_en",
-               .ops = &clk_regmap_gate_ro_ops,
+               .ops = &clk_regmap_gate_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_vclk2_div2_div.hw
                },
@@ -1461,7 +1529,7 @@ static struct clk_regmap meson8b_vclk2_div4_div_gate = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "vclk2_div4_en",
-               .ops = &clk_regmap_gate_ro_ops,
+               .ops = &clk_regmap_gate_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_vclk2_div4_div.hw
                },
@@ -1491,7 +1559,7 @@ static struct clk_regmap meson8b_vclk2_div6_div_gate = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "vclk2_div6_en",
-               .ops = &clk_regmap_gate_ro_ops,
+               .ops = &clk_regmap_gate_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_vclk2_div6_div.hw
                },
@@ -1521,7 +1589,7 @@ static struct clk_regmap meson8b_vclk2_div12_div_gate = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "vclk2_div12_en",
-               .ops = &clk_regmap_gate_ro_ops,
+               .ops = &clk_regmap_gate_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_vclk2_div12_div.hw
                },
@@ -1546,7 +1614,7 @@ static struct clk_regmap meson8b_cts_enct_sel = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "cts_enct_sel",
-               .ops = &clk_regmap_mux_ro_ops,
+               .ops = &clk_regmap_mux_ops,
                .parent_hws = meson8b_vclk_enc_mux_parent_hws,
                .num_parents = ARRAY_SIZE(meson8b_vclk_enc_mux_parent_hws),
                .flags = CLK_SET_RATE_PARENT,
@@ -1560,7 +1628,7 @@ static struct clk_regmap meson8b_cts_enct = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "cts_enct",
-               .ops = &clk_regmap_gate_ro_ops,
+               .ops = &clk_regmap_gate_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_cts_enct_sel.hw
                },
@@ -1577,7 +1645,7 @@ static struct clk_regmap meson8b_cts_encp_sel = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "cts_encp_sel",
-               .ops = &clk_regmap_mux_ro_ops,
+               .ops = &clk_regmap_mux_ops,
                .parent_hws = meson8b_vclk_enc_mux_parent_hws,
                .num_parents = ARRAY_SIZE(meson8b_vclk_enc_mux_parent_hws),
                .flags = CLK_SET_RATE_PARENT,
@@ -1591,7 +1659,7 @@ static struct clk_regmap meson8b_cts_encp = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "cts_encp",
-               .ops = &clk_regmap_gate_ro_ops,
+               .ops = &clk_regmap_gate_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_cts_encp_sel.hw
                },
@@ -1608,7 +1676,7 @@ static struct clk_regmap meson8b_cts_enci_sel = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "cts_enci_sel",
-               .ops = &clk_regmap_mux_ro_ops,
+               .ops = &clk_regmap_mux_ops,
                .parent_hws = meson8b_vclk_enc_mux_parent_hws,
                .num_parents = ARRAY_SIZE(meson8b_vclk_enc_mux_parent_hws),
                .flags = CLK_SET_RATE_PARENT,
@@ -1622,7 +1690,7 @@ static struct clk_regmap meson8b_cts_enci = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "cts_enci",
-               .ops = &clk_regmap_gate_ro_ops,
+               .ops = &clk_regmap_gate_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_cts_enci_sel.hw
                },
@@ -1639,7 +1707,7 @@ static struct clk_regmap meson8b_hdmi_tx_pixel_sel = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "hdmi_tx_pixel_sel",
-               .ops = &clk_regmap_mux_ro_ops,
+               .ops = &clk_regmap_mux_ops,
                .parent_hws = meson8b_vclk_enc_mux_parent_hws,
                .num_parents = ARRAY_SIZE(meson8b_vclk_enc_mux_parent_hws),
                .flags = CLK_SET_RATE_PARENT,
@@ -1653,7 +1721,7 @@ static struct clk_regmap meson8b_hdmi_tx_pixel = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "hdmi_tx_pixel",
-               .ops = &clk_regmap_gate_ro_ops,
+               .ops = &clk_regmap_gate_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_hdmi_tx_pixel_sel.hw
                },
@@ -1678,7 +1746,7 @@ static struct clk_regmap meson8b_cts_encl_sel = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "cts_encl_sel",
-               .ops = &clk_regmap_mux_ro_ops,
+               .ops = &clk_regmap_mux_ops,
                .parent_hws = meson8b_vclk2_enc_mux_parent_hws,
                .num_parents = ARRAY_SIZE(meson8b_vclk2_enc_mux_parent_hws),
                .flags = CLK_SET_RATE_PARENT,
@@ -1692,7 +1760,7 @@ static struct clk_regmap meson8b_cts_encl = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "cts_encl",
-               .ops = &clk_regmap_gate_ro_ops,
+               .ops = &clk_regmap_gate_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_cts_encl_sel.hw
                },
@@ -1709,7 +1777,7 @@ static struct clk_regmap meson8b_cts_vdac0_sel = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "cts_vdac0_sel",
-               .ops = &clk_regmap_mux_ro_ops,
+               .ops = &clk_regmap_mux_ops,
                .parent_hws = meson8b_vclk2_enc_mux_parent_hws,
                .num_parents = ARRAY_SIZE(meson8b_vclk2_enc_mux_parent_hws),
                .flags = CLK_SET_RATE_PARENT,
@@ -1723,7 +1791,7 @@ static struct clk_regmap meson8b_cts_vdac0 = {
        },
        .hw.init = &(struct clk_init_data){
                .name = "cts_vdac0",
-               .ops = &clk_regmap_gate_ro_ops,
+               .ops = &clk_regmap_gate_ops,
                .parent_hws = (const struct clk_hw *[]) {
                        &meson8b_cts_vdac0_sel.hw
                },
@@ -2905,6 +2973,8 @@ static struct clk_hw_onecell_data meson8_hw_onecell_data = {
                [CLKID_CTS_MCLK_I958_DIV]   = &meson8b_cts_mclk_i958_div.hw,
                [CLKID_CTS_MCLK_I958]       = &meson8b_cts_mclk_i958.hw,
                [CLKID_CTS_I958]            = &meson8b_cts_i958.hw,
+               [CLKID_VID_PLL_LVDS_EN]     = &meson8b_vid_pll_lvds_en.hw,
+               [CLKID_HDMI_PLL_DCO_IN]     = &hdmi_pll_dco_in.hw,
                [CLK_NR_CLKS]               = NULL,
        },
        .num = CLK_NR_CLKS,
@@ -3122,6 +3192,8 @@ static struct clk_hw_onecell_data meson8b_hw_onecell_data = {
                [CLKID_CTS_MCLK_I958_DIV]   = &meson8b_cts_mclk_i958_div.hw,
                [CLKID_CTS_MCLK_I958]       = &meson8b_cts_mclk_i958.hw,
                [CLKID_CTS_I958]            = &meson8b_cts_i958.hw,
+               [CLKID_VID_PLL_LVDS_EN]     = &meson8b_vid_pll_lvds_en.hw,
+               [CLKID_HDMI_PLL_DCO_IN]     = &hdmi_pll_dco_in.hw,
                [CLK_NR_CLKS]               = NULL,
        },
        .num = CLK_NR_CLKS,
@@ -3341,6 +3413,8 @@ static struct clk_hw_onecell_data meson8m2_hw_onecell_data = {
                [CLKID_CTS_MCLK_I958_DIV]   = &meson8b_cts_mclk_i958_div.hw,
                [CLKID_CTS_MCLK_I958]       = &meson8b_cts_mclk_i958.hw,
                [CLKID_CTS_I958]            = &meson8b_cts_i958.hw,
+               [CLKID_VID_PLL_LVDS_EN]     = &meson8b_vid_pll_lvds_en.hw,
+               [CLKID_HDMI_PLL_DCO_IN]     = &hdmi_pll_dco_in.hw,
                [CLK_NR_CLKS]               = NULL,
        },
        .num = CLK_NR_CLKS,
@@ -3539,6 +3613,7 @@ static struct clk_regmap *const meson8b_clk_regmaps[] = {
        &meson8b_cts_mclk_i958_div,
        &meson8b_cts_mclk_i958,
        &meson8b_cts_i958,
+       &meson8b_vid_pll_lvds_en,
 };
 
 static const struct meson8b_clk_reset_line {
index b1a5074..ce62ed4 100644 (file)
 #define HHI_SYS_PLL_CNTL               0x300 /* 0xc0 offset in data sheet */
 #define HHI_VID_PLL_CNTL               0x320 /* 0xc8 offset in data sheet */
 #define HHI_VID_PLL_CNTL2              0x324 /* 0xc9 offset in data sheet */
+#define HHI_VID_PLL_CNTL3              0x328 /* 0xca offset in data sheet */
+#define HHI_VID_PLL_CNTL4              0x32c /* 0xcb offset in data sheet */
+#define HHI_VID_PLL_CNTL5              0x330 /* 0xcc offset in data sheet */
+#define HHI_VID_PLL_CNTL6              0x334 /* 0xcd offset in data sheet */
+#define HHI_VID2_PLL_CNTL              0x380 /* 0xe0 offset in data sheet */
+#define HHI_VID2_PLL_CNTL2             0x384 /* 0xe1 offset in data sheet */
+#define HHI_VID2_PLL_CNTL3             0x388 /* 0xe2 offset in data sheet */
+#define HHI_VID2_PLL_CNTL4             0x38c /* 0xe3 offset in data sheet */
+#define HHI_VID2_PLL_CNTL5             0x390 /* 0xe4 offset in data sheet */
+#define HHI_VID2_PLL_CNTL6             0x394 /* 0xe5 offset in data sheet */
 
 /*
  * MPLL register offeset taken from the S905 datasheet. Vendor kernel source
 #define CLKID_PERIPH_SEL       125
 #define CLKID_AXI_SEL          127
 #define CLKID_L2_DRAM_SEL      129
-#define CLKID_HDMI_PLL_LVDS_OUT        131
-#define CLKID_HDMI_PLL_HDMI_OUT        132
+#define CLKID_HDMI_PLL_LVDS_OUT 131
 #define CLKID_VID_PLL_IN_SEL   133
 #define CLKID_VID_PLL_IN_EN    134
 #define CLKID_VID_PLL_PRE_DIV  135
 #define CLKID_VID_PLL_POST_DIV 136
-#define CLKID_VID_PLL_FINAL_DIV        137
-#define CLKID_VCLK_IN_SEL      138
 #define CLKID_VCLK_IN_EN       139
 #define CLKID_VCLK_DIV1                140
 #define CLKID_VCLK_DIV2_DIV    141
 #define CLKID_VCLK_DIV6                146
 #define CLKID_VCLK_DIV12_DIV   147
 #define CLKID_VCLK_DIV12       148
-#define CLKID_VCLK2_IN_SEL     149
 #define CLKID_VCLK2_IN_EN      150
 #define CLKID_VCLK2_DIV1       151
 #define CLKID_VCLK2_DIV2_DIV   152
 #define CLKID_VCLK2_DIV12_DIV  158
 #define CLKID_VCLK2_DIV12      159
 #define CLKID_CTS_ENCT_SEL     160
-#define CLKID_CTS_ENCT         161
 #define CLKID_CTS_ENCP_SEL     162
-#define CLKID_CTS_ENCP         163
 #define CLKID_CTS_ENCI_SEL     164
-#define CLKID_CTS_ENCI         165
 #define CLKID_HDMI_TX_PIXEL_SEL        166
-#define CLKID_HDMI_TX_PIXEL    167
 #define CLKID_CTS_ENCL_SEL     168
-#define CLKID_CTS_ENCL         169
 #define CLKID_CTS_VDAC0_SEL    170
-#define CLKID_CTS_VDAC0                171
 #define CLKID_HDMI_SYS_SEL     172
 #define CLKID_HDMI_SYS_DIV     173
 #define CLKID_MALI_0_SEL       175
 #define CLKID_CTS_MCLK_I958_DIV        211
 #define CLKID_VCLK_EN          214
 #define CLKID_VCLK2_EN         215
+#define CLKID_VID_PLL_LVDS_EN  216
+#define CLKID_HDMI_PLL_DCO_IN   217
 
-#define CLK_NR_CLKS            216
+#define CLK_NR_CLKS            218
 
 /*
  * include the CLKID and RESETID that have
index 08ba59e..71bdd7c 100644 (file)
@@ -256,12 +256,15 @@ static int ap_cpu_clock_probe(struct platform_device *pdev)
                int cpu, err;
 
                err = of_property_read_u32(dn, "reg", &cpu);
-               if (WARN_ON(err))
+               if (WARN_ON(err)) {
+                       of_node_put(dn);
                        return err;
+               }
 
                /* If cpu2 or cpu3 is enabled */
                if (cpu & APN806_CLUSTER_NUM_MASK) {
                        nclusters = 2;
+                       of_node_put(dn);
                        break;
                }
        }
@@ -288,8 +291,10 @@ static int ap_cpu_clock_probe(struct platform_device *pdev)
                int cpu, err;
 
                err = of_property_read_u32(dn, "reg", &cpu);
-               if (WARN_ON(err))
+               if (WARN_ON(err)) {
+                       of_node_put(dn);
                        return err;
+               }
 
                cluster_index = cpu & APN806_CLUSTER_NUM_MASK;
                cluster_index >>= APN806_CLUSTER_NUM_OFFSET;
@@ -301,6 +306,7 @@ static int ap_cpu_clock_probe(struct platform_device *pdev)
                parent = of_clk_get(np, cluster_index);
                if (IS_ERR(parent)) {
                        dev_err(dev, "Could not get the clock parent\n");
+                       of_node_put(dn);
                        return -EINVAL;
                }
                parent_name =  __clk_get_name(parent);
@@ -319,8 +325,10 @@ static int ap_cpu_clock_probe(struct platform_device *pdev)
                init.parent_names = &parent_name;
 
                ret = devm_clk_hw_register(dev, &ap_cpu_clk[cluster_index].hw);
-               if (ret)
+               if (ret) {
+                       of_node_put(dn);
                        return ret;
+               }
                ap_cpu_data->hws[cluster_index] = &ap_cpu_clk[cluster_index].hw;
        }
 
index 9ef007b..74efc82 100644 (file)
@@ -324,6 +324,14 @@ config MSM_MMCC_8998
          Say Y if you want to support multimedia devices such as display,
          graphics, video encode/decode, camera, etc.
 
+config QCM_GCC_2290
+       tristate "QCM2290 Global Clock Controller"
+       select QCOM_GDSC
+       help
+         Support for the global clock controller on QCM2290 devices.
+         Say Y if you want to use multimedia devices or peripheral
+         devices such as UART, SPI, I2C, USB, SD/eMMC etc.
+
 config QCS_GCC_404
        tristate "QCS404 Global Clock Controller"
        help
@@ -340,6 +348,15 @@ config SC_CAMCC_7180
          Say Y if you want to support camera devices and functionality such as
          capturing pictures.
 
+config SC_CAMCC_7280
+       tristate "SC7280 Camera Clock Controller"
+       select SC_GCC_7280
+       help
+         Support for the camera clock controller on Qualcomm Technologies, Inc
+         SC7280 devices.
+         Say Y if you want to support camera devices and functionality such as
+         capturing pictures.
+
 config SC_DISPCC_7180
        tristate "SC7180 Display Clock Controller"
        select SC_GCC_7180
@@ -385,15 +402,6 @@ config SC_GCC_8180X
          Say Y if you want to use peripheral devices such as UART, SPI,
          I2C, USB, UFS, SDCC, etc.
 
-config SC_LPASS_CORECC_7180
-       tristate "SC7180 LPASS Core Clock Controller"
-       select SC_GCC_7180
-       help
-         Support for the LPASS(Low Power Audio Subsystem) core clock controller
-         on SC7180 devices.
-         Say Y if you want to use LPASS clocks and power domains of the LPASS
-         core clock controller.
-
 config SC_GPUCC_7180
        tristate "SC7180 Graphics Clock Controller"
        select SC_GCC_7180
@@ -410,6 +418,23 @@ config SC_GPUCC_7280
          Say Y if you want to support graphics controller devices and
          functionality such as 3D graphics.
 
+config SC_LPASSCC_7280
+       tristate "SC7280 Low Power Audio Subsystem (LPASS) Clock Controller"
+       select SC_GCC_7280
+       help
+         Support for the LPASS clock controller on SC7280 devices.
+         Say Y if you want to use the LPASS branch clocks of the LPASS clock
+         controller to reset the LPASS subsystem.
+
+config SC_LPASS_CORECC_7180
+       tristate "SC7180 LPASS Core Clock Controller"
+       select SC_GCC_7180
+       help
+         Support for the LPASS(Low Power Audio Subsystem) core clock controller
+         on SC7180 devices.
+         Say Y if you want to use LPASS clocks and power domains of the LPASS
+         core clock controller.
+
 config SC_MSS_7180
        tristate "SC7180 Modem Clock Controller"
        select SC_GCC_7180
index 9825ef8..1718c34 100644 (file)
@@ -54,10 +54,12 @@ obj-$(CONFIG_QCOM_CLK_APCS_SDX55) += apcs-sdx55.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_QCM_GCC_2290) += gcc-qcm2290.o
 obj-$(CONFIG_QCS_GCC_404) += gcc-qcs404.o
 obj-$(CONFIG_QCS_Q6SSTOP_404) += q6sstop-qcs404.o
 obj-$(CONFIG_QCS_TURING_404) += turingcc-qcs404.o
 obj-$(CONFIG_SC_CAMCC_7180) += camcc-sc7180.o
+obj-$(CONFIG_SC_CAMCC_7280) += camcc-sc7280.o
 obj-$(CONFIG_SC_DISPCC_7180) += dispcc-sc7180.o
 obj-$(CONFIG_SC_DISPCC_7280) += dispcc-sc7280.o
 obj-$(CONFIG_SC_GCC_7180) += gcc-sc7180.o
@@ -65,6 +67,7 @@ obj-$(CONFIG_SC_GCC_7280) += gcc-sc7280.o
 obj-$(CONFIG_SC_GCC_8180X) += gcc-sc8180x.o
 obj-$(CONFIG_SC_GPUCC_7180) += gpucc-sc7180.o
 obj-$(CONFIG_SC_GPUCC_7280) += gpucc-sc7280.o
+obj-$(CONFIG_SC_LPASSCC_7280) += lpasscc-sc7280.o
 obj-$(CONFIG_SC_LPASS_CORECC_7180) += lpasscorecc-sc7180.o
 obj-$(CONFIG_SC_MSS_7180) += mss-sc7180.o
 obj-$(CONFIG_SC_VIDEOCC_7180) += videocc-sc7180.o
index 9e6decb..329d2c5 100644 (file)
@@ -90,7 +90,6 @@ static int qcom_a53pll_probe(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct device_node *np = dev->of_node;
        struct regmap *regmap;
-       struct resource *res;
        struct clk_pll *pll;
        void __iomem *base;
        struct clk_init_data init = { };
@@ -100,8 +99,7 @@ static int qcom_a53pll_probe(struct platform_device *pdev)
        if (!pll)
                return -ENOMEM;
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       base = devm_ioremap_resource(dev, res);
+       base = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(base))
                return PTR_ERR(base);
 
diff --git a/drivers/clk/qcom/camcc-sc7280.c b/drivers/clk/qcom/camcc-sc7280.c
new file mode 100644 (file)
index 0000000..ec163ea
--- /dev/null
@@ -0,0 +1,2484 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/err.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/of.h>
+#include <linux/regmap.h>
+
+#include <dt-bindings/clock/qcom,camcc-sc7280.h>
+
+#include "clk-alpha-pll.h"
+#include "clk-branch.h"
+#include "clk-rcg.h"
+#include "common.h"
+#include "gdsc.h"
+#include "reset.h"
+
+enum {
+       P_BI_TCXO,
+       P_CAM_CC_PLL0_OUT_EVEN,
+       P_CAM_CC_PLL0_OUT_MAIN,
+       P_CAM_CC_PLL0_OUT_ODD,
+       P_CAM_CC_PLL1_OUT_EVEN,
+       P_CAM_CC_PLL2_OUT_AUX2,
+       P_CAM_CC_PLL2_OUT_EARLY,
+       P_CAM_CC_PLL3_OUT_EVEN,
+       P_CAM_CC_PLL4_OUT_EVEN,
+       P_CAM_CC_PLL5_OUT_EVEN,
+       P_CAM_CC_PLL6_OUT_EVEN,
+       P_CAM_CC_PLL6_OUT_MAIN,
+       P_CAM_CC_PLL6_OUT_ODD,
+       P_SLEEP_CLK,
+};
+
+static struct pll_vco lucid_vco[] = {
+       { 249600000, 2000000000, 0 },
+};
+
+static struct pll_vco zonda_vco[] = {
+       { 595200000UL, 3600000000UL, 0 },
+};
+
+/* 1200MHz Configuration */
+static const struct alpha_pll_config cam_cc_pll0_config = {
+       .l = 0x3E,
+       .alpha = 0x8000,
+       .config_ctl_val = 0x20485699,
+       .config_ctl_hi_val = 0x00002261,
+       .config_ctl_hi1_val = 0x329A299C,
+       .user_ctl_val = 0x00003101,
+       .user_ctl_hi_val = 0x00000805,
+       .user_ctl_hi1_val = 0x00000000,
+};
+
+static struct clk_alpha_pll cam_cc_pll0 = {
+       .offset = 0x0,
+       .vco_table = lucid_vco,
+       .num_vco = ARRAY_SIZE(lucid_vco),
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_pll0",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "bi_tcxo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_lucid_ops,
+               },
+       },
+};
+
+static const struct clk_div_table post_div_table_cam_cc_pll0_out_even[] = {
+       { 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_cam_cc_pll0_out_even,
+       .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll0_out_even),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_pll0_out_even",
+               .parent_data = &(const struct clk_parent_data){
+                       .hw = &cam_cc_pll0.clkr.hw,
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_alpha_pll_postdiv_lucid_ops,
+       },
+};
+
+static const struct clk_div_table post_div_table_cam_cc_pll0_out_odd[] = {
+       { 0x3, 3 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv cam_cc_pll0_out_odd = {
+       .offset = 0x0,
+       .post_div_shift = 12,
+       .post_div_table = post_div_table_cam_cc_pll0_out_odd,
+       .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll0_out_odd),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_pll0_out_odd",
+               .parent_data = &(const struct clk_parent_data){
+                       .hw = &cam_cc_pll0.clkr.hw,
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_alpha_pll_postdiv_lucid_ops,
+       },
+};
+
+/* 600MHz Configuration */
+static const struct alpha_pll_config cam_cc_pll1_config = {
+       .l = 0x1F,
+       .alpha = 0x4000,
+       .config_ctl_val = 0x20485699,
+       .config_ctl_hi_val = 0x00002261,
+       .config_ctl_hi1_val = 0x329A299C,
+       .user_ctl_val = 0x00000101,
+       .user_ctl_hi_val = 0x00000805,
+       .user_ctl_hi1_val = 0x00000000,
+};
+
+static struct clk_alpha_pll cam_cc_pll1 = {
+       .offset = 0x1000,
+       .vco_table = lucid_vco,
+       .num_vco = ARRAY_SIZE(lucid_vco),
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_pll1",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "bi_tcxo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_lucid_ops,
+               },
+       },
+};
+
+static const struct clk_div_table post_div_table_cam_cc_pll1_out_even[] = {
+       { 0x1, 2 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv cam_cc_pll1_out_even = {
+       .offset = 0x1000,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_cam_cc_pll1_out_even,
+       .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll1_out_even),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_pll1_out_even",
+               .parent_data = &(const struct clk_parent_data){
+                       .hw = &cam_cc_pll1.clkr.hw,
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_alpha_pll_postdiv_lucid_ops,
+       },
+};
+
+/* 1440MHz Configuration */
+static const struct alpha_pll_config cam_cc_pll2_config = {
+       .l = 0x4B,
+       .alpha = 0x0,
+       .config_ctl_val = 0x08200800,
+       .config_ctl_hi_val = 0x05022011,
+       .config_ctl_hi1_val = 0x08000000,
+       .user_ctl_val = 0x00000301,
+};
+
+static struct clk_alpha_pll cam_cc_pll2 = {
+       .offset = 0x2000,
+       .vco_table = zonda_vco,
+       .num_vco = ARRAY_SIZE(zonda_vco),
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_ZONDA],
+       .clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_pll2",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "bi_tcxo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_zonda_ops,
+               },
+       },
+};
+
+static const struct clk_div_table post_div_table_cam_cc_pll2_out_aux[] = {
+       { 0x3, 4 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv cam_cc_pll2_out_aux = {
+       .offset = 0x2000,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_cam_cc_pll2_out_aux,
+       .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll2_out_aux),
+       .width = 2,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_ZONDA],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_pll2_out_aux",
+               .parent_data = &(const struct clk_parent_data){
+                       .hw = &cam_cc_pll2.clkr.hw,
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_alpha_pll_postdiv_zonda_ops,
+       },
+};
+
+static const struct clk_div_table post_div_table_cam_cc_pll2_out_aux2[] = {
+       { 0x3, 4 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv cam_cc_pll2_out_aux2 = {
+       .offset = 0x2000,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_cam_cc_pll2_out_aux2,
+       .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll2_out_aux2),
+       .width = 2,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_ZONDA],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_pll2_out_aux2",
+               .parent_data = &(const struct clk_parent_data){
+                       .hw = &cam_cc_pll2.clkr.hw,
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_alpha_pll_postdiv_zonda_ops,
+       },
+};
+
+/* 760MHz Configuration */
+static const struct alpha_pll_config cam_cc_pll3_config = {
+       .l = 0x27,
+       .alpha = 0x9555,
+       .config_ctl_val = 0x20485699,
+       .config_ctl_hi_val = 0x00002261,
+       .config_ctl_hi1_val = 0x329A299C,
+       .user_ctl_val = 0x00000101,
+       .user_ctl_hi_val = 0x00000805,
+       .user_ctl_hi1_val = 0x00000000,
+};
+
+static struct clk_alpha_pll cam_cc_pll3 = {
+       .offset = 0x3000,
+       .vco_table = lucid_vco,
+       .num_vco = ARRAY_SIZE(lucid_vco),
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_pll3",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "bi_tcxo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_lucid_ops,
+               },
+       },
+};
+
+static const struct clk_div_table post_div_table_cam_cc_pll3_out_even[] = {
+       { 0x1, 2 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv cam_cc_pll3_out_even = {
+       .offset = 0x3000,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_cam_cc_pll3_out_even,
+       .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll3_out_even),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_pll3_out_even",
+               .parent_data = &(const struct clk_parent_data){
+                       .hw = &cam_cc_pll3.clkr.hw,
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_alpha_pll_postdiv_lucid_ops,
+       },
+};
+
+/* 760MHz Configuration */
+static const struct alpha_pll_config cam_cc_pll4_config = {
+       .l = 0x27,
+       .alpha = 0x9555,
+       .config_ctl_val = 0x20485699,
+       .config_ctl_hi_val = 0x00002261,
+       .config_ctl_hi1_val = 0x329A299C,
+       .user_ctl_val = 0x00000101,
+       .user_ctl_hi_val = 0x00000805,
+       .user_ctl_hi1_val = 0x00000000,
+};
+
+static struct clk_alpha_pll cam_cc_pll4 = {
+       .offset = 0x4000,
+       .vco_table = lucid_vco,
+       .num_vco = ARRAY_SIZE(lucid_vco),
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_pll4",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "bi_tcxo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_lucid_ops,
+               },
+       },
+};
+
+static const struct clk_div_table post_div_table_cam_cc_pll4_out_even[] = {
+       { 0x1, 2 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv cam_cc_pll4_out_even = {
+       .offset = 0x4000,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_cam_cc_pll4_out_even,
+       .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll4_out_even),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_pll4_out_even",
+               .parent_data = &(const struct clk_parent_data){
+                       .hw = &cam_cc_pll4.clkr.hw,
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_alpha_pll_postdiv_lucid_ops,
+       },
+};
+
+/* 760MHz Configuration */
+static const struct alpha_pll_config cam_cc_pll5_config = {
+       .l = 0x27,
+       .alpha = 0x9555,
+       .config_ctl_val = 0x20485699,
+       .config_ctl_hi_val = 0x00002261,
+       .config_ctl_hi1_val = 0x329A299C,
+       .user_ctl_val = 0x00000101,
+       .user_ctl_hi_val = 0x00000805,
+       .user_ctl_hi1_val = 0x00000000,
+};
+
+static struct clk_alpha_pll cam_cc_pll5 = {
+       .offset = 0x5000,
+       .vco_table = lucid_vco,
+       .num_vco = ARRAY_SIZE(lucid_vco),
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_pll5",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "bi_tcxo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_lucid_ops,
+               },
+       },
+};
+
+static const struct clk_div_table post_div_table_cam_cc_pll5_out_even[] = {
+       { 0x1, 2 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv cam_cc_pll5_out_even = {
+       .offset = 0x5000,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_cam_cc_pll5_out_even,
+       .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll5_out_even),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_pll5_out_even",
+               .parent_data = &(const struct clk_parent_data){
+                       .hw = &cam_cc_pll5.clkr.hw,
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_alpha_pll_postdiv_lucid_ops,
+       },
+};
+
+/* 960MHz Configuration */
+static const struct alpha_pll_config cam_cc_pll6_config = {
+       .l = 0x32,
+       .alpha = 0x0,
+       .config_ctl_val = 0x20485699,
+       .config_ctl_hi_val = 0x00002261,
+       .config_ctl_hi1_val = 0x329A299C,
+       .user_ctl_val = 0x00003101,
+       .user_ctl_hi_val = 0x00000805,
+       .user_ctl_hi1_val = 0x00000000,
+};
+
+static struct clk_alpha_pll cam_cc_pll6 = {
+       .offset = 0x6000,
+       .vco_table = lucid_vco,
+       .num_vco = ARRAY_SIZE(lucid_vco),
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_pll6",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "bi_tcxo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_lucid_ops,
+               },
+       },
+};
+
+static const struct clk_div_table post_div_table_cam_cc_pll6_out_even[] = {
+       { 0x1, 2 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv cam_cc_pll6_out_even = {
+       .offset = 0x6000,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_cam_cc_pll6_out_even,
+       .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll6_out_even),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_pll6_out_even",
+               .parent_data = &(const struct clk_parent_data){
+                       .hw = &cam_cc_pll6.clkr.hw,
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_alpha_pll_postdiv_lucid_ops,
+       },
+};
+
+static const struct clk_div_table post_div_table_cam_cc_pll6_out_odd[] = {
+       { 0x3, 3 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv cam_cc_pll6_out_odd = {
+       .offset = 0x6000,
+       .post_div_shift = 12,
+       .post_div_table = post_div_table_cam_cc_pll6_out_odd,
+       .num_post_div = ARRAY_SIZE(post_div_table_cam_cc_pll6_out_odd),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_pll6_out_odd",
+               .parent_data = &(const struct clk_parent_data){
+                       .hw = &cam_cc_pll6.clkr.hw,
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_alpha_pll_postdiv_lucid_ops,
+       },
+};
+
+static const struct parent_map cam_cc_parent_map_0[] = {
+       { P_BI_TCXO, 0 },
+       { P_CAM_CC_PLL0_OUT_MAIN, 1 },
+       { P_CAM_CC_PLL0_OUT_EVEN, 2 },
+       { P_CAM_CC_PLL0_OUT_ODD, 3 },
+       { P_CAM_CC_PLL6_OUT_EVEN, 5 },
+};
+
+static const struct clk_parent_data cam_cc_parent_data_0[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &cam_cc_pll0.clkr.hw },
+       { .hw = &cam_cc_pll0_out_even.clkr.hw },
+       { .hw = &cam_cc_pll0_out_odd.clkr.hw },
+       { .hw = &cam_cc_pll6_out_even.clkr.hw },
+};
+
+static const struct parent_map cam_cc_parent_map_1[] = {
+       { P_BI_TCXO, 0 },
+       { P_CAM_CC_PLL0_OUT_MAIN, 1 },
+       { P_CAM_CC_PLL0_OUT_EVEN, 2 },
+       { P_CAM_CC_PLL0_OUT_ODD, 3 },
+       { P_CAM_CC_PLL6_OUT_MAIN, 4 },
+       { P_CAM_CC_PLL6_OUT_EVEN, 5 },
+};
+
+static const struct clk_parent_data cam_cc_parent_data_1[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &cam_cc_pll0.clkr.hw },
+       { .hw = &cam_cc_pll0_out_even.clkr.hw },
+       { .hw = &cam_cc_pll0_out_odd.clkr.hw },
+       { .hw = &cam_cc_pll6.clkr.hw },
+       { .hw = &cam_cc_pll6_out_even.clkr.hw },
+};
+
+static const struct parent_map cam_cc_parent_map_2[] = {
+       { P_BI_TCXO, 0 },
+       { P_CAM_CC_PLL2_OUT_AUX2, 3 },
+       { P_CAM_CC_PLL2_OUT_EARLY, 5 },
+};
+
+static const struct clk_parent_data cam_cc_parent_data_2[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &cam_cc_pll2_out_aux2.clkr.hw },
+       { .hw = &cam_cc_pll2.clkr.hw },
+};
+
+static const struct parent_map cam_cc_parent_map_3[] = {
+       { P_BI_TCXO, 0 },
+       { P_CAM_CC_PLL0_OUT_MAIN, 1 },
+       { P_CAM_CC_PLL0_OUT_EVEN, 2 },
+       { P_CAM_CC_PLL0_OUT_ODD, 3 },
+       { P_CAM_CC_PLL6_OUT_EVEN, 5 },
+       { P_CAM_CC_PLL6_OUT_ODD, 6 },
+};
+
+static const struct clk_parent_data cam_cc_parent_data_3[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &cam_cc_pll0.clkr.hw },
+       { .hw = &cam_cc_pll0_out_even.clkr.hw },
+       { .hw = &cam_cc_pll0_out_odd.clkr.hw },
+       { .hw = &cam_cc_pll6_out_even.clkr.hw },
+       { .hw = &cam_cc_pll6_out_odd.clkr.hw },
+};
+
+static const struct parent_map cam_cc_parent_map_4[] = {
+       { P_BI_TCXO, 0 },
+       { P_CAM_CC_PLL3_OUT_EVEN, 6 },
+};
+
+static const struct clk_parent_data cam_cc_parent_data_4[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &cam_cc_pll3_out_even.clkr.hw },
+};
+
+static const struct parent_map cam_cc_parent_map_5[] = {
+       { P_BI_TCXO, 0 },
+       { P_CAM_CC_PLL4_OUT_EVEN, 6 },
+};
+
+static const struct clk_parent_data cam_cc_parent_data_5[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &cam_cc_pll4_out_even.clkr.hw },
+};
+
+static const struct parent_map cam_cc_parent_map_6[] = {
+       { P_BI_TCXO, 0 },
+       { P_CAM_CC_PLL5_OUT_EVEN, 6 },
+};
+
+static const struct clk_parent_data cam_cc_parent_data_6[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &cam_cc_pll5_out_even.clkr.hw },
+};
+
+static const struct parent_map cam_cc_parent_map_7[] = {
+       { P_BI_TCXO, 0 },
+       { P_CAM_CC_PLL1_OUT_EVEN, 4 },
+};
+
+static const struct clk_parent_data cam_cc_parent_data_7[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &cam_cc_pll1_out_even.clkr.hw },
+};
+
+static const struct parent_map cam_cc_parent_map_8[] = {
+       { P_SLEEP_CLK, 0 },
+};
+
+static const struct clk_parent_data cam_cc_parent_data_8[] = {
+       { .fw_name = "sleep_clk" },
+};
+
+static const struct parent_map cam_cc_parent_map_9[] = {
+       { P_BI_TCXO, 0 },
+};
+
+static const struct clk_parent_data cam_cc_parent_data_9_ao[] = {
+       { .fw_name = "bi_tcxo_ao" },
+};
+
+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_ODD, 4, 0, 0),
+       F(200000000, P_CAM_CC_PLL0_OUT_ODD, 2, 0, 0),
+       F(400000000, P_CAM_CC_PLL0_OUT_ODD, 1, 0, 0),
+       F(480000000, P_CAM_CC_PLL6_OUT_EVEN, 1, 0, 0),
+       F(600000000, P_CAM_CC_PLL0_OUT_MAIN, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_bps_clk_src = {
+       .cmd_rcgr = 0x7010,
+       .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_data = cam_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_cam_cc_camnoc_axi_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(150000000, P_CAM_CC_PLL0_OUT_EVEN, 4, 0, 0),
+       F(240000000, P_CAM_CC_PLL6_OUT_EVEN, 2, 0, 0),
+       F(320000000, P_CAM_CC_PLL6_OUT_ODD, 1, 0, 0),
+       F(400000000, P_CAM_CC_PLL0_OUT_MAIN, 3, 0, 0),
+       F(480000000, P_CAM_CC_PLL6_OUT_EVEN, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_camnoc_axi_clk_src = {
+       .cmd_rcgr = 0xc124,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_3,
+       .freq_tbl = ftbl_cam_cc_camnoc_axi_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_camnoc_axi_clk_src",
+               .parent_data = cam_cc_parent_data_3,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_3),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_cam_cc_cci_0_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(37500000, P_CAM_CC_PLL0_OUT_EVEN, 16, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_cci_0_clk_src = {
+       .cmd_rcgr = 0xc0e0,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_cci_0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_cci_0_clk_src",
+               .parent_data = cam_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_cci_1_clk_src = {
+       .cmd_rcgr = 0xc0fc,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_0,
+       .freq_tbl = ftbl_cam_cc_cci_0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_cci_1_clk_src",
+               .parent_data = cam_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_cam_cc_cphy_rx_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 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_cphy_rx_clk_src = {
+       .cmd_rcgr = 0xa064,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_1,
+       .freq_tbl = ftbl_cam_cc_cphy_rx_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_cphy_rx_clk_src",
+               .parent_data = cam_cc_parent_data_1,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_cam_cc_csi0phytimer_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(300000000, P_CAM_CC_PLL0_OUT_EVEN, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_csi0phytimer_clk_src = {
+       .cmd_rcgr = 0xe0ac,
+       .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_data = cam_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_csi1phytimer_clk_src = {
+       .cmd_rcgr = 0xe0d0,
+       .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_data = cam_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_csi2phytimer_clk_src = {
+       .cmd_rcgr = 0xe0f4,
+       .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_data = cam_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_csi3phytimer_clk_src = {
+       .cmd_rcgr = 0xe11c,
+       .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_data = cam_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
+               .ops = &clk_rcg2_shared_ops,
+               },
+};
+
+static struct clk_rcg2 cam_cc_csi4phytimer_clk_src = {
+       .cmd_rcgr = 0xe140,
+       .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_csi4phytimer_clk_src",
+               .parent_data = cam_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
+               .ops = &clk_rcg2_shared_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_MAIN, 4, 0, 0),
+       F(400000000, P_CAM_CC_PLL0_OUT_MAIN, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_fast_ahb_clk_src = {
+       .cmd_rcgr = 0x703c,
+       .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_data = cam_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
+               .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(400000000, P_CAM_CC_PLL0_OUT_ODD, 1, 0, 0),
+       F(480000000, P_CAM_CC_PLL6_OUT_EVEN, 1, 0, 0),
+       F(600000000, P_CAM_CC_PLL0_OUT_MAIN, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_icp_clk_src = {
+       .cmd_rcgr = 0xc0b8,
+       .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_data = cam_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
+               .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(380000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0),
+       F(510000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0),
+       F(637000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0),
+       F(760000000, P_CAM_CC_PLL3_OUT_EVEN, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_ife_0_clk_src = {
+       .cmd_rcgr = 0xa010,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_4,
+       .freq_tbl = ftbl_cam_cc_ife_0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_ife_0_clk_src",
+               .parent_data = cam_cc_parent_data_4,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_4),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_cam_cc_ife_1_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(380000000, P_CAM_CC_PLL4_OUT_EVEN, 1, 0, 0),
+       F(510000000, P_CAM_CC_PLL4_OUT_EVEN, 1, 0, 0),
+       F(637000000, P_CAM_CC_PLL4_OUT_EVEN, 1, 0, 0),
+       F(760000000, P_CAM_CC_PLL4_OUT_EVEN, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_ife_1_clk_src = {
+       .cmd_rcgr = 0xb010,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_5,
+       .freq_tbl = ftbl_cam_cc_ife_1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_ife_1_clk_src",
+               .parent_data = cam_cc_parent_data_5,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_5),
+               .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(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_ife_0_csid_clk_src = {
+       .cmd_rcgr = 0xa03c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_1,
+       .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_data = cam_cc_parent_data_1,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_ife_1_csid_clk_src = {
+       .cmd_rcgr = 0xb03c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_1,
+       .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_data = cam_cc_parent_data_1,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_cam_cc_ife_2_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(380000000, P_CAM_CC_PLL5_OUT_EVEN, 1, 0, 0),
+       F(510000000, P_CAM_CC_PLL5_OUT_EVEN, 1, 0, 0),
+       F(637000000, P_CAM_CC_PLL5_OUT_EVEN, 1, 0, 0),
+       F(760000000, P_CAM_CC_PLL5_OUT_EVEN, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_ife_2_clk_src = {
+       .cmd_rcgr = 0xb07c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_6,
+       .freq_tbl = ftbl_cam_cc_ife_2_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_ife_2_clk_src",
+               .parent_data = cam_cc_parent_data_6,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_6),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_ife_2_csid_clk_src = {
+       .cmd_rcgr = 0xb0a8,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_1,
+       .freq_tbl = ftbl_cam_cc_ife_0_csid_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_ife_2_csid_clk_src",
+               .parent_data = cam_cc_parent_data_1,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_cam_cc_ife_lite_0_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(320000000, P_CAM_CC_PLL6_OUT_ODD, 1, 0, 0),
+       F(400000000, P_CAM_CC_PLL0_OUT_ODD, 1, 0, 0),
+       F(480000000, P_CAM_CC_PLL6_OUT_EVEN, 1, 0, 0),
+       F(600000000, P_CAM_CC_PLL0_OUT_MAIN, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_ife_lite_0_clk_src = {
+       .cmd_rcgr = 0xc004,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_3,
+       .freq_tbl = ftbl_cam_cc_ife_lite_0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_ife_lite_0_clk_src",
+               .parent_data = cam_cc_parent_data_3,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_3),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_ife_lite_0_csid_clk_src = {
+       .cmd_rcgr = 0xc020,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_1,
+       .freq_tbl = ftbl_cam_cc_ife_0_csid_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_ife_lite_0_csid_clk_src",
+               .parent_data = cam_cc_parent_data_1,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_ife_lite_1_clk_src = {
+       .cmd_rcgr = 0xc048,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_3,
+       .freq_tbl = ftbl_cam_cc_ife_lite_0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_ife_lite_1_clk_src",
+               .parent_data = cam_cc_parent_data_3,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_3),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_ife_lite_1_csid_clk_src = {
+       .cmd_rcgr = 0xc064,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_1,
+       .freq_tbl = ftbl_cam_cc_ife_0_csid_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_ife_lite_1_csid_clk_src",
+               .parent_data = cam_cc_parent_data_1,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_1),
+               .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(300000000, P_CAM_CC_PLL1_OUT_EVEN, 1, 0, 0),
+       F(430000000, P_CAM_CC_PLL1_OUT_EVEN, 1, 0, 0),
+       F(520000000, P_CAM_CC_PLL1_OUT_EVEN, 1, 0, 0),
+       F(600000000, P_CAM_CC_PLL1_OUT_EVEN, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_ipe_0_clk_src = {
+       .cmd_rcgr = 0x8010,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_7,
+       .freq_tbl = ftbl_cam_cc_ipe_0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_ipe_0_clk_src",
+               .parent_data = cam_cc_parent_data_7,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_7),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_jpeg_clk_src = {
+       .cmd_rcgr = 0xc08c,
+       .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_data = cam_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
+               .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(240000000, P_CAM_CC_PLL6_OUT_EVEN, 2, 0, 0),
+       F(300000000, P_CAM_CC_PLL0_OUT_EVEN, 2, 0, 0),
+       F(320000000, P_CAM_CC_PLL6_OUT_ODD, 1, 0, 0),
+       F(400000000, P_CAM_CC_PLL0_OUT_MAIN, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_lrme_clk_src = {
+       .cmd_rcgr = 0xc150,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_3,
+       .freq_tbl = ftbl_cam_cc_lrme_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_lrme_clk_src",
+               .parent_data = cam_cc_parent_data_3,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_3),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_cam_cc_mclk0_clk_src[] = {
+       F(19200000, P_CAM_CC_PLL2_OUT_EARLY, 1, 1, 75),
+       F(24000000, P_CAM_CC_PLL2_OUT_EARLY, 10, 1, 6),
+       F(34285714, P_CAM_CC_PLL2_OUT_EARLY, 2, 1, 21),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_mclk0_clk_src = {
+       .cmd_rcgr = 0xe000,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_2,
+       .freq_tbl = ftbl_cam_cc_mclk0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_mclk0_clk_src",
+               .parent_data = cam_cc_parent_data_2,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_2),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_mclk1_clk_src = {
+       .cmd_rcgr = 0xe01c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_2,
+       .freq_tbl = ftbl_cam_cc_mclk0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_mclk1_clk_src",
+               .parent_data = cam_cc_parent_data_2,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_2),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_mclk2_clk_src = {
+       .cmd_rcgr = 0xe038,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_2,
+       .freq_tbl = ftbl_cam_cc_mclk0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_mclk2_clk_src",
+               .parent_data = cam_cc_parent_data_2,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_2),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_mclk3_clk_src = {
+       .cmd_rcgr = 0xe054,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_2,
+       .freq_tbl = ftbl_cam_cc_mclk0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_mclk3_clk_src",
+               .parent_data = cam_cc_parent_data_2,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_2),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_mclk4_clk_src = {
+       .cmd_rcgr = 0xe070,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_2,
+       .freq_tbl = ftbl_cam_cc_mclk0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_mclk4_clk_src",
+               .parent_data = cam_cc_parent_data_2,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_2),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 cam_cc_mclk5_clk_src = {
+       .cmd_rcgr = 0xe08c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_2,
+       .freq_tbl = ftbl_cam_cc_mclk0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_mclk5_clk_src",
+               .parent_data = cam_cc_parent_data_2,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_2),
+               .ops = &clk_rcg2_shared_ops,
+               },
+};
+
+static const struct freq_tbl ftbl_cam_cc_sleep_clk_src[] = {
+       F(32000, P_SLEEP_CLK, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_sleep_clk_src = {
+       .cmd_rcgr = 0xc1c0,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_8,
+       .freq_tbl = ftbl_cam_cc_sleep_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_sleep_clk_src",
+               .parent_data = cam_cc_parent_data_8,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_8),
+               .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(80000000, P_CAM_CC_PLL0_OUT_EVEN, 7.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_slow_ahb_clk_src = {
+       .cmd_rcgr = 0x7058,
+       .mnd_width = 8,
+       .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_data = cam_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_0),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_cam_cc_xo_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cam_cc_xo_clk_src = {
+       .cmd_rcgr = 0xc1a4,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = cam_cc_parent_map_9,
+       .freq_tbl = ftbl_cam_cc_xo_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cam_cc_xo_clk_src",
+               .parent_data = cam_cc_parent_data_9_ao,
+               .num_parents = ARRAY_SIZE(cam_cc_parent_data_9_ao),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch cam_cc_bps_ahb_clk = {
+       .halt_reg = 0x7070,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x7070,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_bps_ahb_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_slow_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_bps_areg_clk = {
+       .halt_reg = 0x7054,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x7054,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_bps_areg_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_fast_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_bps_axi_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_bps_axi_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_camnoc_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_bps_clk = {
+       .halt_reg = 0x7028,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x7028,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_bps_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_bps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_camnoc_axi_clk = {
+       .halt_reg = 0xc140,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xc140,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_camnoc_axi_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_camnoc_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_camnoc_dcd_xo_clk = {
+       .halt_reg = 0xc148,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xc148,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_camnoc_dcd_xo_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_xo_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_cci_0_clk = {
+       .halt_reg = 0xc0f8,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xc0f8,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_cci_0_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_cci_0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_cci_1_clk = {
+       .halt_reg = 0xc114,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xc114,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_cci_1_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_cci_1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_core_ahb_clk = {
+       .halt_reg = 0xc1a0,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0xc1a0,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_core_ahb_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_slow_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_cpas_ahb_clk = {
+       .halt_reg = 0xc11c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xc11c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_cpas_ahb_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_slow_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_csi0phytimer_clk = {
+       .halt_reg = 0xe0c4,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xe0c4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_csi0phytimer_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_csi0phytimer_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_csi1phytimer_clk = {
+       .halt_reg = 0xe0e8,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xe0e8,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_csi1phytimer_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_csi1phytimer_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_csi2phytimer_clk = {
+       .halt_reg = 0xe10c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xe10c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_csi2phytimer_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_csi2phytimer_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_csi3phytimer_clk = {
+       .halt_reg = 0xe134,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xe134,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_csi3phytimer_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_csi3phytimer_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_csi4phytimer_clk = {
+       .halt_reg = 0xe158,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xe158,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_csi4phytimer_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_csi4phytimer_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_csiphy0_clk = {
+       .halt_reg = 0xe0c8,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xe0c8,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_csiphy0_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_cphy_rx_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_csiphy1_clk = {
+       .halt_reg = 0xe0ec,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xe0ec,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_csiphy1_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_cphy_rx_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_csiphy2_clk = {
+       .halt_reg = 0xe110,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xe110,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_csiphy2_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_cphy_rx_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_csiphy3_clk = {
+       .halt_reg = 0xe138,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xe138,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_csiphy3_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_cphy_rx_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_csiphy4_clk = {
+       .halt_reg = 0xe15c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xe15c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_csiphy4_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_cphy_rx_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_gdsc_clk = {
+       .halt_reg = 0xc1bc,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xc1bc,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_gdsc_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_xo_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_icp_ahb_clk = {
+       .halt_reg = 0xc0d8,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xc0d8,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_icp_ahb_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_slow_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_icp_clk = {
+       .halt_reg = 0xc0d0,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xc0d0,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_icp_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_icp_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_0_axi_clk = {
+       .halt_reg = 0xa080,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xa080,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_0_axi_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_camnoc_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_0_clk = {
+       .halt_reg = 0xa028,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xa028,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_0_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_ife_0_clk_src.clkr.hw,
+                       },
+                       .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 = 0xa07c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xa07c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_0_cphy_rx_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_cphy_rx_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_0_csid_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_0_csid_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_ife_0_csid_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_0_dsp_clk = {
+       .halt_reg = 0xa038,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xa038,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_0_dsp_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_ife_0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_1_axi_clk = {
+       .halt_reg = 0xb068,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb068,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_1_axi_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_camnoc_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_1_clk = {
+       .halt_reg = 0xb028,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb028,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_1_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_ife_1_clk_src.clkr.hw,
+                       },
+                       .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 = 0xb064,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb064,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_1_cphy_rx_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_cphy_rx_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_1_csid_clk = {
+       .halt_reg = 0xb054,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb054,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_1_csid_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_ife_1_csid_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_1_dsp_clk = {
+       .halt_reg = 0xb038,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb038,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_1_dsp_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_ife_1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_2_axi_clk = {
+       .halt_reg = 0xb0d4,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb0d4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_2_axi_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_camnoc_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_2_clk = {
+       .halt_reg = 0xb094,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb094,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_2_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_ife_2_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_2_cphy_rx_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_ife_2_cphy_rx_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_cphy_rx_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_2_csid_clk = {
+       .halt_reg = 0xb0c0,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb0c0,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_2_csid_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_ife_2_csid_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_2_dsp_clk = {
+       .halt_reg = 0xb0a4,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb0a4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_2_dsp_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_ife_2_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_lite_0_clk = {
+       .halt_reg = 0xc01c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xc01c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_lite_0_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_ife_lite_0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_lite_0_cphy_rx_clk = {
+       .halt_reg = 0xc040,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xc040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_lite_0_cphy_rx_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_cphy_rx_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_lite_0_csid_clk = {
+       .halt_reg = 0xc038,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xc038,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_lite_0_csid_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_ife_lite_0_csid_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_lite_1_clk = {
+       .halt_reg = 0xc060,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xc060,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_lite_1_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_ife_lite_1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_lite_1_cphy_rx_clk = {
+       .halt_reg = 0xc084,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xc084,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_lite_1_cphy_rx_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_cphy_rx_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ife_lite_1_csid_clk = {
+       .halt_reg = 0xc07c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xc07c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ife_lite_1_csid_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_ife_lite_1_csid_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ipe_0_ahb_clk = {
+       .halt_reg = 0x8040,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ipe_0_ahb_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_slow_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ipe_0_areg_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_0_areg_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_fast_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ipe_0_axi_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_0_axi_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_camnoc_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_ipe_0_clk = {
+       .halt_reg = 0x8028,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8028,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_ipe_0_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_ipe_0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_jpeg_clk = {
+       .halt_reg = 0xc0a4,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xc0a4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_jpeg_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_jpeg_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_lrme_clk = {
+       .halt_reg = 0xc168,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xc168,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_lrme_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_lrme_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_mclk0_clk = {
+       .halt_reg = 0xe018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xe018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_mclk0_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_mclk0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_mclk1_clk = {
+       .halt_reg = 0xe034,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xe034,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_mclk1_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_mclk1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_mclk2_clk = {
+       .halt_reg = 0xe050,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xe050,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_mclk2_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_mclk2_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_mclk3_clk = {
+       .halt_reg = 0xe06c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xe06c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_mclk3_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_mclk3_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_mclk4_clk = {
+       .halt_reg = 0xe088,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xe088,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_mclk4_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_mclk4_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_mclk5_clk = {
+       .halt_reg = 0xe0a4,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xe0a4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_mclk5_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_mclk5_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch cam_cc_sleep_clk = {
+       .halt_reg = 0xc1d8,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xc1d8,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "cam_cc_sleep_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &cam_cc_sleep_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct gdsc cam_cc_titan_top_gdsc = {
+       .gdscr = 0xc194,
+       .pd = {
+               .name = "cam_cc_titan_top_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = RETAIN_FF_ENABLE,
+};
+
+static struct gdsc cam_cc_bps_gdsc = {
+       .gdscr = 0x7004,
+       .pd = {
+               .name = "cam_cc_bps_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = HW_CTRL | RETAIN_FF_ENABLE,
+};
+
+static struct gdsc cam_cc_ife_0_gdsc = {
+       .gdscr = 0xa004,
+       .pd = {
+               .name = "cam_cc_ife_0_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = RETAIN_FF_ENABLE,
+};
+
+static struct gdsc cam_cc_ife_1_gdsc = {
+       .gdscr = 0xb004,
+       .pd = {
+               .name = "cam_cc_ife_1_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = RETAIN_FF_ENABLE,
+};
+
+static struct gdsc cam_cc_ife_2_gdsc = {
+       .gdscr = 0xb070,
+       .pd = {
+               .name = "cam_cc_ife_2_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = RETAIN_FF_ENABLE,
+};
+
+static struct gdsc cam_cc_ipe_0_gdsc = {
+       .gdscr = 0x8004,
+       .pd = {
+               .name = "cam_cc_ipe_0_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = HW_CTRL | RETAIN_FF_ENABLE,
+};
+
+static struct clk_regmap *cam_cc_sc7280_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_AXI_CLK] = &cam_cc_camnoc_axi_clk.clkr,
+       [CAM_CC_CAMNOC_AXI_CLK_SRC] = &cam_cc_camnoc_axi_clk_src.clkr,
+       [CAM_CC_CAMNOC_DCD_XO_CLK] = &cam_cc_camnoc_dcd_xo_clk.clkr,
+       [CAM_CC_CCI_0_CLK] = &cam_cc_cci_0_clk.clkr,
+       [CAM_CC_CCI_0_CLK_SRC] = &cam_cc_cci_0_clk_src.clkr,
+       [CAM_CC_CCI_1_CLK] = &cam_cc_cci_1_clk.clkr,
+       [CAM_CC_CCI_1_CLK_SRC] = &cam_cc_cci_1_clk_src.clkr,
+       [CAM_CC_CORE_AHB_CLK] = &cam_cc_core_ahb_clk.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_CSI4PHYTIMER_CLK] = &cam_cc_csi4phytimer_clk.clkr,
+       [CAM_CC_CSI4PHYTIMER_CLK_SRC] = &cam_cc_csi4phytimer_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_CSIPHY4_CLK] = &cam_cc_csiphy4_clk.clkr,
+       [CAM_CC_FAST_AHB_CLK_SRC] = &cam_cc_fast_ahb_clk_src.clkr,
+       [CAM_CC_GDSC_CLK] = &cam_cc_gdsc_clk.clkr,
+       [CAM_CC_ICP_AHB_CLK] = &cam_cc_icp_ahb_clk.clkr,
+       [CAM_CC_ICP_CLK] = &cam_cc_icp_clk.clkr,
+       [CAM_CC_ICP_CLK_SRC] = &cam_cc_icp_clk_src.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_2_AXI_CLK] = &cam_cc_ife_2_axi_clk.clkr,
+       [CAM_CC_IFE_2_CLK] = &cam_cc_ife_2_clk.clkr,
+       [CAM_CC_IFE_2_CLK_SRC] = &cam_cc_ife_2_clk_src.clkr,
+       [CAM_CC_IFE_2_CPHY_RX_CLK] = &cam_cc_ife_2_cphy_rx_clk.clkr,
+       [CAM_CC_IFE_2_CSID_CLK] = &cam_cc_ife_2_csid_clk.clkr,
+       [CAM_CC_IFE_2_CSID_CLK_SRC] = &cam_cc_ife_2_csid_clk_src.clkr,
+       [CAM_CC_IFE_2_DSP_CLK] = &cam_cc_ife_2_dsp_clk.clkr,
+       [CAM_CC_IFE_LITE_0_CLK] = &cam_cc_ife_lite_0_clk.clkr,
+       [CAM_CC_IFE_LITE_0_CLK_SRC] = &cam_cc_ife_lite_0_clk_src.clkr,
+       [CAM_CC_IFE_LITE_0_CPHY_RX_CLK] = &cam_cc_ife_lite_0_cphy_rx_clk.clkr,
+       [CAM_CC_IFE_LITE_0_CSID_CLK] = &cam_cc_ife_lite_0_csid_clk.clkr,
+       [CAM_CC_IFE_LITE_0_CSID_CLK_SRC] = &cam_cc_ife_lite_0_csid_clk_src.clkr,
+       [CAM_CC_IFE_LITE_1_CLK] = &cam_cc_ife_lite_1_clk.clkr,
+       [CAM_CC_IFE_LITE_1_CLK_SRC] = &cam_cc_ife_lite_1_clk_src.clkr,
+       [CAM_CC_IFE_LITE_1_CPHY_RX_CLK] = &cam_cc_ife_lite_1_cphy_rx_clk.clkr,
+       [CAM_CC_IFE_LITE_1_CSID_CLK] = &cam_cc_ife_lite_1_csid_clk.clkr,
+       [CAM_CC_IFE_LITE_1_CSID_CLK_SRC] = &cam_cc_ife_lite_1_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_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_MCLK4_CLK] = &cam_cc_mclk4_clk.clkr,
+       [CAM_CC_MCLK4_CLK_SRC] = &cam_cc_mclk4_clk_src.clkr,
+       [CAM_CC_MCLK5_CLK] = &cam_cc_mclk5_clk.clkr,
+       [CAM_CC_MCLK5_CLK_SRC] = &cam_cc_mclk5_clk_src.clkr,
+       [CAM_CC_PLL0] = &cam_cc_pll0.clkr,
+       [CAM_CC_PLL0_OUT_EVEN] = &cam_cc_pll0_out_even.clkr,
+       [CAM_CC_PLL0_OUT_ODD] = &cam_cc_pll0_out_odd.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_AUX] = &cam_cc_pll2_out_aux.clkr,
+       [CAM_CC_PLL2_OUT_AUX2] = &cam_cc_pll2_out_aux2.clkr,
+       [CAM_CC_PLL3] = &cam_cc_pll3.clkr,
+       [CAM_CC_PLL3_OUT_EVEN] = &cam_cc_pll3_out_even.clkr,
+       [CAM_CC_PLL4] = &cam_cc_pll4.clkr,
+       [CAM_CC_PLL4_OUT_EVEN] = &cam_cc_pll4_out_even.clkr,
+       [CAM_CC_PLL5] = &cam_cc_pll5.clkr,
+       [CAM_CC_PLL5_OUT_EVEN] = &cam_cc_pll5_out_even.clkr,
+       [CAM_CC_PLL6] = &cam_cc_pll6.clkr,
+       [CAM_CC_PLL6_OUT_EVEN] = &cam_cc_pll6_out_even.clkr,
+       [CAM_CC_PLL6_OUT_ODD] = &cam_cc_pll6_out_odd.clkr,
+       [CAM_CC_SLEEP_CLK] = &cam_cc_sleep_clk.clkr,
+       [CAM_CC_SLEEP_CLK_SRC] = &cam_cc_sleep_clk_src.clkr,
+       [CAM_CC_SLOW_AHB_CLK_SRC] = &cam_cc_slow_ahb_clk_src.clkr,
+       [CAM_CC_XO_CLK_SRC] = &cam_cc_xo_clk_src.clkr,
+};
+
+static struct gdsc *cam_cc_sc7280_gdscs[] = {
+       [CAM_CC_TITAN_TOP_GDSC] = &cam_cc_titan_top_gdsc,
+       [CAM_CC_BPS_GDSC] = &cam_cc_bps_gdsc,
+       [CAM_CC_IFE_0_GDSC] = &cam_cc_ife_0_gdsc,
+       [CAM_CC_IFE_1_GDSC] = &cam_cc_ife_1_gdsc,
+       [CAM_CC_IFE_2_GDSC] = &cam_cc_ife_2_gdsc,
+       [CAM_CC_IPE_0_GDSC] = &cam_cc_ipe_0_gdsc,
+};
+
+static const struct regmap_config cam_cc_sc7280_regmap_config = {
+       .reg_bits = 32,
+       .reg_stride = 4,
+       .val_bits = 32,
+       .max_register = 0xf00c,
+       .fast_io = true,
+};
+
+static const struct qcom_cc_desc cam_cc_sc7280_desc = {
+       .config = &cam_cc_sc7280_regmap_config,
+       .clks = cam_cc_sc7280_clocks,
+       .num_clks = ARRAY_SIZE(cam_cc_sc7280_clocks),
+       .gdscs = cam_cc_sc7280_gdscs,
+       .num_gdscs = ARRAY_SIZE(cam_cc_sc7280_gdscs),
+};
+
+static const struct of_device_id cam_cc_sc7280_match_table[] = {
+       { .compatible = "qcom,sc7280-camcc" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, cam_cc_sc7280_match_table);
+
+static int cam_cc_sc7280_probe(struct platform_device *pdev)
+{
+       struct regmap *regmap;
+
+       regmap = qcom_cc_map(pdev, &cam_cc_sc7280_desc);
+       if (IS_ERR(regmap))
+               return PTR_ERR(regmap);
+
+       clk_lucid_pll_configure(&cam_cc_pll0, regmap, &cam_cc_pll0_config);
+       clk_lucid_pll_configure(&cam_cc_pll1, regmap, &cam_cc_pll1_config);
+       clk_zonda_pll_configure(&cam_cc_pll2, regmap, &cam_cc_pll2_config);
+       clk_lucid_pll_configure(&cam_cc_pll3, regmap, &cam_cc_pll3_config);
+       clk_lucid_pll_configure(&cam_cc_pll4, regmap, &cam_cc_pll4_config);
+       clk_lucid_pll_configure(&cam_cc_pll5, regmap, &cam_cc_pll5_config);
+       clk_lucid_pll_configure(&cam_cc_pll6, regmap, &cam_cc_pll6_config);
+
+       return qcom_cc_really_probe(pdev, &cam_cc_sc7280_desc, regmap);
+}
+
+static struct platform_driver cam_cc_sc7280_driver = {
+       .probe = cam_cc_sc7280_probe,
+       .driver = {
+               .name = "cam_cc-sc7280",
+               .of_match_table = cam_cc_sc7280_match_table,
+       },
+};
+
+static int __init cam_cc_sc7280_init(void)
+{
+       return platform_driver_register(&cam_cc_sc7280_driver);
+}
+subsys_initcall(cam_cc_sc7280_init);
+
+static void __exit cam_cc_sc7280_exit(void)
+{
+       platform_driver_unregister(&cam_cc_sc7280_driver);
+}
+module_exit(cam_cc_sc7280_exit);
+
+MODULE_DESCRIPTION("QTI CAM_CC SC7280 Driver");
+MODULE_LICENSE("GPL v2");
index 66d7807..5776d85 100644 (file)
                __DEFINE_CLK_SMD_RPM(_platform, _name, _active, type, r_id,   \
                0, QCOM_RPM_SMD_KEY_STATE)
 
-#define DEFINE_CLK_SMD_RPM_XO_BUFFER(_platform, _name, _active, r_id)        \
+#define DEFINE_CLK_SMD_RPM_XO_BUFFER(_platform, _name, _active, r_id, r)      \
                __DEFINE_CLK_SMD_RPM_BRANCH(_platform, _name, _active,        \
-               QCOM_SMD_RPM_CLK_BUF_A, r_id, 0, 1000,                        \
+               QCOM_SMD_RPM_CLK_BUF_A, r_id, 0, r,                           \
                QCOM_RPM_KEY_SOFTWARE_ENABLE)
 
-#define DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(_platform, _name, _active, r_id) \
+#define DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(_platform, _name, _active,              \
+                                            r_id, r)                         \
                __DEFINE_CLK_SMD_RPM_BRANCH(_platform, _name, _active,        \
-               QCOM_SMD_RPM_CLK_BUF_A, r_id, 0, 1000,                        \
+               QCOM_SMD_RPM_CLK_BUF_A, r_id, 0, r,                           \
                QCOM_RPM_KEY_PIN_CTRL_CLK_BUFFER_ENABLE_KEY)
 
 #define to_clk_smd_rpm(_hw) container_of(_hw, struct clk_smd_rpm, hw)
@@ -195,6 +196,10 @@ static int clk_smd_rpm_set_rate_active(struct clk_smd_rpm *r,
                .value = cpu_to_le32(DIV_ROUND_UP(rate, 1000)), /* to kHz */
        };
 
+       /* Buffered clock needs a binary value */
+       if (r->rpm_res_type == QCOM_SMD_RPM_CLK_BUF_A)
+               req.value = cpu_to_le32(!!req.value);
+
        return qcom_rpm_smd_write(r->rpm, QCOM_SMD_RPM_ACTIVE_STATE,
                                  r->rpm_res_type, r->rpm_clk_id, &req,
                                  sizeof(req));
@@ -209,6 +214,10 @@ static int clk_smd_rpm_set_rate_sleep(struct clk_smd_rpm *r,
                .value = cpu_to_le32(DIV_ROUND_UP(rate, 1000)), /* to kHz */
        };
 
+       /* Buffered clock needs a binary value */
+       if (r->rpm_res_type == QCOM_SMD_RPM_CLK_BUF_A)
+               req.value = cpu_to_le32(!!req.value);
+
        return qcom_rpm_smd_write(r->rpm, QCOM_SMD_RPM_SLEEP_STATE,
                                  r->rpm_res_type, r->rpm_clk_id, &req,
                                  sizeof(req));
@@ -416,20 +425,21 @@ static const struct clk_ops clk_smd_rpm_ops = {
 static const struct clk_ops clk_smd_rpm_branch_ops = {
        .prepare        = clk_smd_rpm_prepare,
        .unprepare      = clk_smd_rpm_unprepare,
+       .recalc_rate    = clk_smd_rpm_recalc_rate,
 };
 
 DEFINE_CLK_SMD_RPM(msm8916, pcnoc_clk, pcnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 0);
 DEFINE_CLK_SMD_RPM(msm8916, snoc_clk, snoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 1);
 DEFINE_CLK_SMD_RPM(msm8916, bimc_clk, bimc_a_clk, QCOM_SMD_RPM_MEM_CLK, 0);
 DEFINE_CLK_SMD_RPM_QDSS(msm8916, qdss_clk, qdss_a_clk, QCOM_SMD_RPM_MISC_CLK, 1);
-DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8916, bb_clk1, bb_clk1_a, 1);
-DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8916, bb_clk2, bb_clk2_a, 2);
-DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8916, rf_clk1, rf_clk1_a, 4);
-DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8916, rf_clk2, rf_clk2_a, 5);
-DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8916, bb_clk1_pin, bb_clk1_a_pin, 1);
-DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8916, bb_clk2_pin, bb_clk2_a_pin, 2);
-DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8916, rf_clk1_pin, rf_clk1_a_pin, 4);
-DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8916, rf_clk2_pin, rf_clk2_a_pin, 5);
+DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8916, bb_clk1, bb_clk1_a, 1, 19200000);
+DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8916, bb_clk2, bb_clk2_a, 2, 19200000);
+DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8916, rf_clk1, rf_clk1_a, 4, 19200000);
+DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8916, rf_clk2, rf_clk2_a, 5, 19200000);
+DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8916, bb_clk1_pin, bb_clk1_a_pin, 1, 19200000);
+DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8916, bb_clk2_pin, bb_clk2_a_pin, 2, 19200000);
+DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8916, rf_clk1_pin, rf_clk1_a_pin, 4, 19200000);
+DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8916, rf_clk2_pin, rf_clk2_a_pin, 5, 19200000);
 
 static struct clk_smd_rpm *msm8916_clks[] = {
        [RPM_SMD_PCNOC_CLK]             = &msm8916_pcnoc_clk,
@@ -503,19 +513,19 @@ DEFINE_CLK_SMD_RPM(msm8974, cnoc_clk, cnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 2);
 DEFINE_CLK_SMD_RPM(msm8974, mmssnoc_ahb_clk, mmssnoc_ahb_a_clk, QCOM_SMD_RPM_BUS_CLK, 3);
 DEFINE_CLK_SMD_RPM(msm8974, gfx3d_clk_src, gfx3d_a_clk_src, QCOM_SMD_RPM_MEM_CLK, 1);
 DEFINE_CLK_SMD_RPM(msm8974, ocmemgx_clk, ocmemgx_a_clk, QCOM_SMD_RPM_MEM_CLK, 2);
-DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8974, cxo_d0, cxo_d0_a, 1);
-DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8974, cxo_d1, cxo_d1_a, 2);
-DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8974, cxo_a0, cxo_a0_a, 4);
-DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8974, cxo_a1, cxo_a1_a, 5);
-DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8974, cxo_a2, cxo_a2_a, 6);
-DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8974, diff_clk, diff_a_clk, 7);
-DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8974, div_clk1, div_a_clk1, 11);
-DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8974, div_clk2, div_a_clk2, 12);
-DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8974, cxo_d0_pin, cxo_d0_a_pin, 1);
-DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8974, cxo_d1_pin, cxo_d1_a_pin, 2);
-DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8974, cxo_a0_pin, cxo_a0_a_pin, 4);
-DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8974, cxo_a1_pin, cxo_a1_a_pin, 5);
-DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8974, cxo_a2_pin, cxo_a2_a_pin, 6);
+DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8974, cxo_d0, cxo_d0_a, 1, 19200000);
+DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8974, cxo_d1, cxo_d1_a, 2, 19200000);
+DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8974, cxo_a0, cxo_a0_a, 4, 19200000);
+DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8974, cxo_a1, cxo_a1_a, 5, 19200000);
+DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8974, cxo_a2, cxo_a2_a, 6, 19200000);
+DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8974, diff_clk, diff_a_clk, 7, 19200000);
+DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8974, div_clk1, div_a_clk1, 11, 19200000);
+DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8974, div_clk2, div_a_clk2, 12, 19200000);
+DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8974, cxo_d0_pin, cxo_d0_a_pin, 1, 19200000);
+DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8974, cxo_d1_pin, cxo_d1_a_pin, 2, 19200000);
+DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8974, cxo_a0_pin, cxo_a0_a_pin, 4, 19200000);
+DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8974, cxo_a1_pin, cxo_a1_a_pin, 5, 19200000);
+DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8974, cxo_a2_pin, cxo_a2_a_pin, 6, 19200000);
 
 static struct clk_smd_rpm *msm8974_clks[] = {
        [RPM_SMD_PNOC_CLK]              = &msm8916_pcnoc_clk,
@@ -603,8 +613,8 @@ static const struct rpm_smd_clk_desc rpm_clk_msm8976 = {
        .num_clks = ARRAY_SIZE(msm8976_clks),
 };
 
-DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8992, div_clk3, div_clk3_a, 13);
-DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8992, ln_bb_clk, ln_bb_a_clk, 8);
+DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8992, div_clk3, div_clk3_a, 13, 19200000);
+DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8992, ln_bb_clk, ln_bb_a_clk, 8, 19200000);
 
 DEFINE_CLK_SMD_RPM(msm8992, ce1_clk, ce1_a_clk, QCOM_SMD_RPM_CE_CLK, 0);
 DEFINE_CLK_SMD_RPM(msm8992, ce2_clk, ce2_a_clk, QCOM_SMD_RPM_CE_CLK, 1);
@@ -782,7 +792,7 @@ static const struct rpm_smd_clk_desc rpm_clk_msm8996 = {
 
 DEFINE_CLK_SMD_RPM(qcs404, bimc_gpu_clk, bimc_gpu_a_clk, QCOM_SMD_RPM_MEM_CLK, 2);
 DEFINE_CLK_SMD_RPM(qcs404, qpic_clk, qpic_a_clk, QCOM_SMD_RPM_QPIC_CLK, 0);
-DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(qcs404, ln_bb_clk_pin, ln_bb_clk_a_pin, 8);
+DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(qcs404, ln_bb_clk_pin, ln_bb_clk_a_pin, 8, 19200000);
 
 static struct clk_smd_rpm *qcs404_clks[] = {
        [RPM_SMD_QDSS_CLK] = &msm8916_qdss_clk,
@@ -811,13 +821,13 @@ static const struct rpm_smd_clk_desc rpm_clk_qcs404 = {
 };
 
 DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8998, ln_bb_clk3_pin, ln_bb_clk3_a_pin,
-                                    3);
+                                    3, 19200000);
 DEFINE_CLK_SMD_RPM(msm8998, aggre1_noc_clk, aggre1_noc_a_clk,
                   QCOM_SMD_RPM_AGGR_CLK, 1);
 DEFINE_CLK_SMD_RPM(msm8998, aggre2_noc_clk, aggre2_noc_a_clk,
                   QCOM_SMD_RPM_AGGR_CLK, 2);
-DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8998, rf_clk3, rf_clk3_a, 6);
-DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8998, rf_clk3_pin, rf_clk3_a_pin, 6);
+DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8998, rf_clk3, rf_clk3_a, 6, 19200000);
+DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8998, rf_clk3_pin, rf_clk3_a_pin, 6, 19200000);
 static struct clk_smd_rpm *msm8998_clks[] = {
        [RPM_SMD_BIMC_CLK] = &msm8916_bimc_clk,
        [RPM_SMD_BIMC_A_CLK] = &msm8916_bimc_a_clk,
@@ -864,8 +874,8 @@ static const struct rpm_smd_clk_desc rpm_clk_msm8998 = {
 
 DEFINE_CLK_SMD_RPM_BRANCH(sdm660, bi_tcxo, bi_tcxo_a, QCOM_SMD_RPM_MISC_CLK, 0,
                                                                19200000);
-DEFINE_CLK_SMD_RPM_XO_BUFFER(sdm660, ln_bb_clk3, ln_bb_clk3_a, 3);
-DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(sdm660, ln_bb_clk3_pin, ln_bb_clk3_pin_a, 3);
+DEFINE_CLK_SMD_RPM_XO_BUFFER(sdm660, ln_bb_clk3, ln_bb_clk3_a, 3, 19200000);
+DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(sdm660, ln_bb_clk3_pin, ln_bb_clk3_pin_a, 3, 19200000);
 
 static struct clk_smd_rpm *sdm660_clks[] = {
        [RPM_SMD_XO_CLK_SRC] = &sdm660_bi_tcxo,
@@ -1067,6 +1077,64 @@ static const struct rpm_smd_clk_desc rpm_clk_sm6115 = {
        .num_clks = ARRAY_SIZE(sm6115_clks),
 };
 
+/* QCM2290 */
+DEFINE_CLK_SMD_RPM_XO_BUFFER(qcm2290, ln_bb_clk2, ln_bb_clk2_a, 0x2, 19200000);
+DEFINE_CLK_SMD_RPM_XO_BUFFER(qcm2290, rf_clk3, rf_clk3_a, 6, 38400000);
+
+DEFINE_CLK_SMD_RPM(qcm2290, qpic_clk, qpic_a_clk, QCOM_SMD_RPM_QPIC_CLK, 0);
+DEFINE_CLK_SMD_RPM(qcm2290, hwkm_clk, hwkm_a_clk, QCOM_SMD_RPM_HWKM_CLK, 0);
+DEFINE_CLK_SMD_RPM(qcm2290, pka_clk, pka_a_clk, QCOM_SMD_RPM_PKA_CLK, 0);
+DEFINE_CLK_SMD_RPM(qcm2290, cpuss_gnoc_clk, cpuss_gnoc_a_clk,
+                  QCOM_SMD_RPM_MEM_CLK, 1);
+DEFINE_CLK_SMD_RPM(qcm2290, bimc_gpu_clk, bimc_gpu_a_clk,
+                  QCOM_SMD_RPM_MEM_CLK, 2);
+
+static struct clk_smd_rpm *qcm2290_clks[] = {
+       [RPM_SMD_XO_CLK_SRC] = &sdm660_bi_tcxo,
+       [RPM_SMD_XO_A_CLK_SRC] = &sdm660_bi_tcxo_a,
+       [RPM_SMD_SNOC_CLK] = &sm6125_snoc_clk,
+       [RPM_SMD_SNOC_A_CLK] = &sm6125_snoc_a_clk,
+       [RPM_SMD_BIMC_CLK] = &msm8916_bimc_clk,
+       [RPM_SMD_BIMC_A_CLK] = &msm8916_bimc_a_clk,
+       [RPM_SMD_QDSS_CLK] = &sm6125_qdss_clk,
+       [RPM_SMD_QDSS_A_CLK] = &sm6125_qdss_a_clk,
+       [RPM_SMD_LN_BB_CLK2] = &qcm2290_ln_bb_clk2,
+       [RPM_SMD_LN_BB_CLK2_A] = &qcm2290_ln_bb_clk2_a,
+       [RPM_SMD_RF_CLK3] = &qcm2290_rf_clk3,
+       [RPM_SMD_RF_CLK3_A] = &qcm2290_rf_clk3_a,
+       [RPM_SMD_CNOC_CLK] = &sm6125_cnoc_clk,
+       [RPM_SMD_CNOC_A_CLK] = &sm6125_cnoc_a_clk,
+       [RPM_SMD_IPA_CLK] = &msm8976_ipa_clk,
+       [RPM_SMD_IPA_A_CLK] = &msm8976_ipa_a_clk,
+       [RPM_SMD_QUP_CLK] = &sm6125_qup_clk,
+       [RPM_SMD_QUP_A_CLK] = &sm6125_qup_a_clk,
+       [RPM_SMD_MMRT_CLK] = &sm6125_mmrt_clk,
+       [RPM_SMD_MMRT_A_CLK] = &sm6125_mmrt_a_clk,
+       [RPM_SMD_MMNRT_CLK] = &sm6125_mmnrt_clk,
+       [RPM_SMD_MMNRT_A_CLK] = &sm6125_mmnrt_a_clk,
+       [RPM_SMD_SNOC_PERIPH_CLK] = &sm6125_snoc_periph_clk,
+       [RPM_SMD_SNOC_PERIPH_A_CLK] = &sm6125_snoc_periph_a_clk,
+       [RPM_SMD_SNOC_LPASS_CLK] = &sm6125_snoc_lpass_clk,
+       [RPM_SMD_SNOC_LPASS_A_CLK] = &sm6125_snoc_lpass_a_clk,
+       [RPM_SMD_CE1_CLK] = &msm8992_ce1_clk,
+       [RPM_SMD_CE1_A_CLK] = &msm8992_ce1_a_clk,
+       [RPM_SMD_QPIC_CLK] = &qcm2290_qpic_clk,
+       [RPM_SMD_QPIC_CLK_A] = &qcm2290_qpic_a_clk,
+       [RPM_SMD_HWKM_CLK] = &qcm2290_hwkm_clk,
+       [RPM_SMD_HWKM_A_CLK] = &qcm2290_hwkm_a_clk,
+       [RPM_SMD_PKA_CLK] = &qcm2290_pka_clk,
+       [RPM_SMD_PKA_A_CLK] = &qcm2290_pka_a_clk,
+       [RPM_SMD_BIMC_GPU_CLK] = &qcm2290_bimc_gpu_clk,
+       [RPM_SMD_BIMC_GPU_A_CLK] = &qcm2290_bimc_gpu_a_clk,
+       [RPM_SMD_CPUSS_GNOC_CLK] = &qcm2290_cpuss_gnoc_clk,
+       [RPM_SMD_CPUSS_GNOC_A_CLK] = &qcm2290_cpuss_gnoc_a_clk,
+};
+
+static const struct rpm_smd_clk_desc rpm_clk_qcm2290 = {
+       .clks = qcm2290_clks,
+       .num_clks = ARRAY_SIZE(qcm2290_clks),
+};
+
 static const struct of_device_id rpm_smd_clk_match_table[] = {
        { .compatible = "qcom,rpmcc-mdm9607", .data = &rpm_clk_mdm9607 },
        { .compatible = "qcom,rpmcc-msm8226", .data = &rpm_clk_msm8974 },
@@ -1079,6 +1147,7 @@ static const struct of_device_id rpm_smd_clk_match_table[] = {
        { .compatible = "qcom,rpmcc-msm8994", .data = &rpm_clk_msm8994 },
        { .compatible = "qcom,rpmcc-msm8996", .data = &rpm_clk_msm8996 },
        { .compatible = "qcom,rpmcc-msm8998", .data = &rpm_clk_msm8998 },
+       { .compatible = "qcom,rpmcc-qcm2290", .data = &rpm_clk_qcm2290 },
        { .compatible = "qcom,rpmcc-qcs404",  .data = &rpm_clk_qcs404  },
        { .compatible = "qcom,rpmcc-sdm660",  .data = &rpm_clk_sdm660  },
        { .compatible = "qcom,rpmcc-sm6115",  .data = &rpm_clk_sm6115  },
index 60d2a78..0932e01 100644 (file)
@@ -73,11 +73,9 @@ struct regmap *
 qcom_cc_map(struct platform_device *pdev, const struct qcom_cc_desc *desc)
 {
        void __iomem *base;
-       struct resource *res;
        struct device *dev = &pdev->dev;
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       base = devm_ioremap_resource(dev, res);
+       base = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(base))
                return ERR_CAST(base);
 
@@ -313,11 +311,9 @@ int qcom_cc_probe_by_index(struct platform_device *pdev, int index,
                           const struct qcom_cc_desc *desc)
 {
        struct regmap *regmap;
-       struct resource *res;
        void __iomem *base;
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, index);
-       base = devm_ioremap_resource(&pdev->dev, res);
+       base = devm_platform_ioremap_resource(pdev, index);
        if (IS_ERR(base))
                return -ENOMEM;
 
index bf9ffe1..566fdfa 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/clk-provider.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
 #include <linux/regmap.h>
 #include <linux/reset-controller.h>
 
@@ -1228,13 +1229,31 @@ static const struct of_device_id disp_cc_sm8250_match_table[] = {
 };
 MODULE_DEVICE_TABLE(of, disp_cc_sm8250_match_table);
 
+static void disp_cc_sm8250_pm_runtime_disable(void *data)
+{
+       pm_runtime_disable(data);
+}
+
 static int disp_cc_sm8250_probe(struct platform_device *pdev)
 {
        struct regmap *regmap;
+       int ret;
+
+       pm_runtime_enable(&pdev->dev);
+
+       ret = devm_add_action_or_reset(&pdev->dev, disp_cc_sm8250_pm_runtime_disable, &pdev->dev);
+       if (ret)
+               return ret;
+
+       ret = pm_runtime_resume_and_get(&pdev->dev);
+       if (ret)
+               return ret;
 
        regmap = qcom_cc_map(pdev, &disp_cc_sm8250_desc);
-       if (IS_ERR(regmap))
+       if (IS_ERR(regmap)) {
+               pm_runtime_put(&pdev->dev);
                return PTR_ERR(regmap);
+       }
 
        /* note: trion == lucid, except for the prepare() op */
        BUILD_BUG_ON(CLK_ALPHA_PLL_TYPE_TRION != CLK_ALPHA_PLL_TYPE_LUCID);
@@ -1259,7 +1278,11 @@ static int disp_cc_sm8250_probe(struct platform_device *pdev)
        /* DISP_CC_XO_CLK always-on */
        regmap_update_bits(regmap, 0x605c, BIT(0), BIT(0));
 
-       return qcom_cc_really_probe(pdev, &disp_cc_sm8250_desc, regmap);
+       ret = qcom_cc_really_probe(pdev, &disp_cc_sm8250_desc, regmap);
+
+       pm_runtime_put(&pdev->dev);
+
+       return ret;
 }
 
 static struct platform_driver disp_cc_sm8250_driver = {
index 49513f1..8aafa65 100644 (file)
@@ -4230,7 +4230,6 @@ static struct platform_driver gcc_msm8953_driver = {
        .driver = {
                .name = "gcc-msm8953",
                .of_match_table = gcc_msm8953_match_table,
-               .owner = THIS_MODULE,
        },
 };
 
index 144d2ba..702a9bd 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/ctype.h>
 #include <linux/io.h>
 #include <linux/of.h>
+#include <linux/of_device.h>
 #include <linux/platform_device.h>
 #include <linux/module.h>
 #include <linux/regmap.h>
@@ -28,50 +29,17 @@ enum {
        P_GPLL4,
 };
 
-static const struct parent_map gcc_xo_gpll0_map[] = {
-       { P_XO, 0 },
-       { P_GPLL0, 1 },
-};
-
-static const char * const gcc_xo_gpll0[] = {
-       "xo",
-       "gpll0",
-};
-
-static const struct parent_map gcc_xo_gpll0_gpll4_map[] = {
-       { P_XO, 0 },
-       { P_GPLL0, 1 },
-       { P_GPLL4, 5 },
-};
-
-static const char * const gcc_xo_gpll0_gpll4[] = {
-       "xo",
-       "gpll0",
-       "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 = 0x00000,
+       .offset = 0,
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
        .clkr = {
                .enable_reg = 0x1480,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gpll0_early",
-                       .parent_names = (const char *[]) { "xo" },
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+                       },
                        .num_parents = 1,
                        .ops = &clk_alpha_pll_ops,
                },
@@ -79,10 +47,9 @@ static struct clk_alpha_pll gpll0_early = {
 };
 
 static struct clk_alpha_pll_postdiv gpll0 = {
-       .offset = 0x00000,
+       .offset = 0,
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll0",
                .parent_names = (const char *[]) { "gpll0_early" },
                .num_parents = 1,
@@ -96,10 +63,11 @@ static struct clk_alpha_pll gpll4_early = {
        .clkr = {
                .enable_reg = 0x1480,
                .enable_mask = BIT(4),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gpll4_early",
-                       .parent_names = (const char *[]) { "xo" },
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+                       },
                        .num_parents = 1,
                        .ops = &clk_alpha_pll_ops,
                },
@@ -109,8 +77,7 @@ static struct clk_alpha_pll gpll4_early = {
 static struct clk_alpha_pll_postdiv gpll4 = {
        .offset = 0x1dc0,
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll4",
                .parent_names = (const char *[]) { "gpll4_early" },
                .num_parents = 1,
@@ -118,6 +85,64 @@ static struct clk_alpha_pll_postdiv gpll4 = {
        },
 };
 
+static const struct parent_map gcc_xo_gpll0_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+};
+
+static const struct clk_parent_data gcc_xo_gpll0[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0.clkr.hw },
+};
+
+static const struct parent_map gcc_xo_gpll0_gpll4_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL4, 5 },
+};
+
+static const struct clk_parent_data gcc_xo_gpll0_gpll4[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll4.clkr.hw },
+};
+
+static struct clk_rcg2 system_noc_clk_src = {
+       .cmd_rcgr = 0x0120,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "system_noc_clk_src",
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 config_noc_clk_src = {
+       .cmd_rcgr = 0x0150,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "config_noc_clk_src",
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 periph_noc_clk_src = {
+       .cmd_rcgr = 0x0190,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "periph_noc_clk_src",
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
 static struct freq_tbl ftbl_ufs_axi_clk_src[] = {
        F(50000000, P_GPLL0, 12, 0, 0),
        F(100000000, P_GPLL0, 6, 0, 0),
@@ -134,11 +159,10 @@ static struct clk_rcg2 ufs_axi_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_ufs_axi_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "ufs_axi_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -155,11 +179,10 @@ static struct clk_rcg2 usb30_master_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_usb30_master_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "usb30_master_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -175,16 +198,15 @@ static struct clk_rcg2 blsp1_qup1_i2c_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup1_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
 
-static struct freq_tbl ftbl_blspqup_spi_apps_clk_src[] = {
+static 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),
@@ -197,17 +219,27 @@ static struct freq_tbl ftbl_blspqup_spi_apps_clk_src[] = {
        { }
 };
 
+static struct freq_tbl ftbl_blsp1_qup_spi_apps_clk_src_8992[] = {
+       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 = 0x064c,
        .mnd_width = 8,
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
-       .freq_tbl = ftbl_blspqup_spi_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .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_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -217,26 +249,37 @@ static struct clk_rcg2 blsp1_qup2_i2c_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup2_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
 
+static 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, 10, 1, 4),
+       F(19200000, P_XO, 1, 0, 0),
+       F(24000000, P_GPLL0, 12.5, 1, 2),
+       F(25000000, P_GPLL0, 12, 1, 2),
+       F(42860000, P_GPLL0, 14, 0, 0),
+       F(46150000, P_GPLL0, 13, 0, 0),
+       { }
+};
+
 static struct clk_rcg2 blsp1_qup2_spi_apps_clk_src = {
        .cmd_rcgr = 0x06cc,
        .mnd_width = 8,
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
-       .freq_tbl = ftbl_blspqup_spi_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .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_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -246,26 +289,37 @@ static struct clk_rcg2 blsp1_qup3_i2c_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup3_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
 
+static struct freq_tbl ftbl_blsp1_qup3_4_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(24000000, P_GPLL0, 12.5, 1, 2),
+       F(25000000, P_GPLL0, 12, 1, 2),
+       F(42860000, P_GPLL0, 14, 0, 0),
+       F(44440000, P_GPLL0, 13.5, 0, 0),
+       { }
+};
+
 static struct clk_rcg2 blsp1_qup3_spi_apps_clk_src = {
        .cmd_rcgr = 0x074c,
        .mnd_width = 8,
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
-       .freq_tbl = ftbl_blspqup_spi_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .freq_tbl = ftbl_blsp1_qup3_4_spi_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup3_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -275,11 +329,10 @@ static struct clk_rcg2 blsp1_qup4_i2c_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup4_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -289,12 +342,11 @@ static struct clk_rcg2 blsp1_qup4_spi_apps_clk_src = {
        .mnd_width = 8,
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
-       .freq_tbl = ftbl_blspqup_spi_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .freq_tbl = ftbl_blsp1_qup3_4_spi_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup4_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -304,26 +356,37 @@ static struct clk_rcg2 blsp1_qup5_i2c_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup5_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
 
+static struct freq_tbl ftbl_blsp1_qup5_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(24000000, P_GPLL0, 12.5, 1, 2),
+       F(25000000, P_GPLL0, 12, 1, 2),
+       F(40000000, P_GPLL0, 15, 0, 0),
+       F(42860000, P_GPLL0, 14, 0, 0),
+       { }
+};
+
 static struct clk_rcg2 blsp1_qup5_spi_apps_clk_src = {
        .cmd_rcgr = 0x084c,
        .mnd_width = 8,
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
-       .freq_tbl = ftbl_blspqup_spi_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .freq_tbl = ftbl_blsp1_qup5_spi_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup5_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -333,26 +396,37 @@ static struct clk_rcg2 blsp1_qup6_i2c_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup6_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
 
+static struct freq_tbl ftbl_blsp1_qup6_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(24000000, P_GPLL0, 12.5, 1, 2),
+       F(27906976, P_GPLL0, 1, 2, 43),
+       F(41380000, P_GPLL0, 15, 0, 0),
+       F(42860000, P_GPLL0, 14, 0, 0),
+       { }
+};
+
 static struct clk_rcg2 blsp1_qup6_spi_apps_clk_src = {
        .cmd_rcgr = 0x08cc,
        .mnd_width = 8,
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
-       .freq_tbl = ftbl_blspqup_spi_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .freq_tbl = ftbl_blsp1_qup6_spi_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup6_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -382,11 +456,10 @@ static struct clk_rcg2 blsp1_uart1_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_blsp_uart_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_uart1_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -397,11 +470,10 @@ static struct clk_rcg2 blsp1_uart2_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_blsp_uart_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_uart2_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -412,11 +484,10 @@ static struct clk_rcg2 blsp1_uart3_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_blsp_uart_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_uart3_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -427,11 +498,10 @@ static struct clk_rcg2 blsp1_uart4_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_blsp_uart_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_uart4_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -442,11 +512,10 @@ static struct clk_rcg2 blsp1_uart5_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_blsp_uart_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_uart5_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -457,11 +526,10 @@ static struct clk_rcg2 blsp1_uart6_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_blsp_uart_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_uart6_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -471,26 +539,37 @@ static struct clk_rcg2 blsp2_qup1_i2c_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup1_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
 
+static struct freq_tbl ftbl_blsp2_qup1_2_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(24000000, P_GPLL0, 12.5, 1, 2),
+       F(25000000, P_GPLL0, 12, 1, 2),
+       F(42860000, P_GPLL0, 14, 0, 0),
+       F(44440000, P_GPLL0, 13.5, 0, 0),
+       { }
+};
+
 static struct clk_rcg2 blsp2_qup1_spi_apps_clk_src = {
        .cmd_rcgr = 0x098c,
        .mnd_width = 8,
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
-       .freq_tbl = ftbl_blspqup_spi_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .freq_tbl = ftbl_blsp2_qup1_2_spi_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup1_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -500,11 +579,10 @@ static struct clk_rcg2 blsp2_qup2_i2c_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup2_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -514,26 +592,37 @@ static struct clk_rcg2 blsp2_qup2_spi_apps_clk_src = {
        .mnd_width = 8,
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
-       .freq_tbl = ftbl_blspqup_spi_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .freq_tbl = ftbl_blsp2_qup1_2_spi_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup2_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
 
+static struct freq_tbl ftbl_blsp2_qup3_4_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(24000000, P_GPLL0, 12.5, 1, 2),
+       F(25000000, P_GPLL0, 12, 1, 2),
+       F(42860000, P_GPLL0, 14, 0, 0),
+       F(48000000, P_GPLL0, 12.5, 0, 0),
+       { }
+};
+
 static struct clk_rcg2 blsp2_qup3_i2c_apps_clk_src = {
        .cmd_rcgr = 0x0aa0,
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup3_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -543,12 +632,11 @@ static struct clk_rcg2 blsp2_qup3_spi_apps_clk_src = {
        .mnd_width = 8,
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
-       .freq_tbl = ftbl_blspqup_spi_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .freq_tbl = ftbl_blsp2_qup3_4_spi_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup3_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -558,11 +646,10 @@ static struct clk_rcg2 blsp2_qup4_i2c_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup4_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -572,12 +659,11 @@ static struct clk_rcg2 blsp2_qup4_spi_apps_clk_src = {
        .mnd_width = 8,
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
-       .freq_tbl = ftbl_blspqup_spi_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .freq_tbl = ftbl_blsp2_qup3_4_spi_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup4_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -587,11 +673,10 @@ static struct clk_rcg2 blsp2_qup5_i2c_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup5_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -601,12 +686,12 @@ static struct clk_rcg2 blsp2_qup5_spi_apps_clk_src = {
        .mnd_width = 8,
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
-       .freq_tbl = ftbl_blspqup_spi_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       /* BLSP1 QUP1 and BLSP2 QUP5 use the same freqs */
+       .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup5_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -616,26 +701,37 @@ static struct clk_rcg2 blsp2_qup6_i2c_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup6_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
 
+static struct freq_tbl ftbl_blsp2_qup6_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(24000000, P_GPLL0, 12.5, 1, 2),
+       F(25000000, P_GPLL0, 12, 1, 2),
+       F(44440000, P_GPLL0, 13.5, 0, 0),
+       F(48000000, P_GPLL0, 12.5, 0, 0),
+       { }
+};
+
 static struct clk_rcg2 blsp2_qup6_spi_apps_clk_src = {
        .cmd_rcgr = 0x0c0c,
        .mnd_width = 8,
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
-       .freq_tbl = ftbl_blspqup_spi_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .freq_tbl = ftbl_blsp2_qup6_spi_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup6_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -646,11 +742,10 @@ static struct clk_rcg2 blsp2_uart1_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_blsp_uart_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_uart1_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -661,11 +756,10 @@ static struct clk_rcg2 blsp2_uart2_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_blsp_uart_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_uart2_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -676,11 +770,10 @@ static struct clk_rcg2 blsp2_uart3_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_blsp_uart_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_uart3_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -691,11 +784,10 @@ static struct clk_rcg2 blsp2_uart4_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_blsp_uart_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_uart4_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -706,11 +798,10 @@ static struct clk_rcg2 blsp2_uart5_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_blsp_uart_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_uart5_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -721,11 +812,10 @@ static struct clk_rcg2 blsp2_uart6_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_blsp_uart_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_uart6_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -743,11 +833,10 @@ static struct clk_rcg2 gp1_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_gp1_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "gp1_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -765,11 +854,10 @@ static struct clk_rcg2 gp2_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_gp2_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "gp2_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -787,11 +875,10 @@ static struct clk_rcg2 gp3_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_gp3_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "gp3_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -806,10 +893,11 @@ static struct clk_rcg2 pcie_0_aux_clk_src = {
        .mnd_width = 8,
        .hid_width = 5,
        .freq_tbl = ftbl_pcie_0_aux_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "pcie_0_aux_clk_src",
-               .parent_names = (const char *[]) { "xo" },
+               .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+               },
                .num_parents = 1,
                .ops = &clk_rcg2_ops,
        },
@@ -824,10 +912,11 @@ static struct clk_rcg2 pcie_0_pipe_clk_src = {
        .cmd_rcgr = 0x1adc,
        .hid_width = 5,
        .freq_tbl = ftbl_pcie_pipe_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "pcie_0_pipe_clk_src",
-               .parent_names = (const char *[]) { "xo" },
+               .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+               },
                .num_parents = 1,
                .ops = &clk_rcg2_ops,
        },
@@ -843,10 +932,11 @@ static struct clk_rcg2 pcie_1_aux_clk_src = {
        .mnd_width = 8,
        .hid_width = 5,
        .freq_tbl = ftbl_pcie_1_aux_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "pcie_1_aux_clk_src",
-               .parent_names = (const char *[]) { "xo" },
+               .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+               },
                .num_parents = 1,
                .ops = &clk_rcg2_ops,
        },
@@ -856,10 +946,11 @@ static struct clk_rcg2 pcie_1_pipe_clk_src = {
        .cmd_rcgr = 0x1b5c,
        .hid_width = 5,
        .freq_tbl = ftbl_pcie_pipe_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "pcie_1_pipe_clk_src",
-               .parent_names = (const char *[]) { "xo" },
+               .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+               },
                .num_parents = 1,
                .ops = &clk_rcg2_ops,
        },
@@ -875,11 +966,10 @@ static struct clk_rcg2 pdm2_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_pdm2_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "pdm2_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -896,17 +986,28 @@ static struct freq_tbl ftbl_sdcc1_apps_clk_src[] = {
        { }
 };
 
+static struct freq_tbl ftbl_sdcc1_apps_clk_src_8992[] = {
+       F(144000, P_XO, 16, 3, 25),
+       F(400000, P_XO, 12, 1, 4),
+       F(20000000, P_GPLL0, 15, 1, 2),
+       F(25000000, P_GPLL0, 12, 1, 2),
+       F(50000000, P_GPLL0, 12, 0, 0),
+       F(100000000, P_GPLL0, 6, 0, 0),
+       F(172000000, P_GPLL4, 2, 0, 0),
+       F(344000000, P_GPLL4, 1, 0, 0),
+       { }
+};
+
 static struct clk_rcg2 sdcc1_apps_clk_src = {
        .cmd_rcgr = 0x04d0,
        .mnd_width = 8,
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_gpll4_map,
        .freq_tbl = ftbl_sdcc1_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "sdcc1_apps_clk_src",
-               .parent_names = gcc_xo_gpll0_gpll4,
-               .num_parents = 3,
+               .parent_data = gcc_xo_gpll0_gpll4,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll4),
                .ops = &clk_rcg2_floor_ops,
        },
 };
@@ -928,11 +1029,10 @@ static struct clk_rcg2 sdcc2_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_sdcc2_4_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "sdcc2_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_floor_ops,
        },
 };
@@ -943,11 +1043,10 @@ static struct clk_rcg2 sdcc3_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_sdcc2_4_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "sdcc3_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_floor_ops,
        },
 };
@@ -958,11 +1057,10 @@ static struct clk_rcg2 sdcc4_apps_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_sdcc2_4_apps_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "sdcc4_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_floor_ops,
        },
 };
@@ -977,10 +1075,11 @@ static struct clk_rcg2 tsif_ref_clk_src = {
        .mnd_width = 8,
        .hid_width = 5,
        .freq_tbl = ftbl_tsif_ref_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "tsif_ref_clk_src",
-               .parent_names = (const char *[]) { "xo" },
+               .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+               },
                .num_parents = 1,
                .ops = &clk_rcg2_ops,
        },
@@ -997,11 +1096,10 @@ static struct clk_rcg2 usb30_mock_utmi_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_usb30_mock_utmi_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "usb30_mock_utmi_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1015,10 +1113,11 @@ static struct clk_rcg2 usb3_phy_aux_clk_src = {
        .cmd_rcgr = 0x1414,
        .hid_width = 5,
        .freq_tbl = ftbl_usb3_phy_aux_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "usb3_phy_aux_clk_src",
-               .parent_names = (const char *[]) { "xo" },
+               .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+               },
                .num_parents = 1,
                .ops = &clk_rcg2_ops,
        },
@@ -1034,11 +1133,10 @@ static struct clk_rcg2 usb_hs_system_clk_src = {
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0_map,
        .freq_tbl = ftbl_usb_hs_system_clk_src,
-       .clkr.hw.init = &(struct clk_init_data)
-       {
+       .clkr.hw.init = &(struct clk_init_data){
                .name = "usb_hs_system_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1049,9 +1147,10 @@ static struct clk_branch gcc_blsp1_ahb_clk = {
        .clkr = {
                .enable_reg = 0x1484,
                .enable_mask = BIT(17),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &periph_noc_clk_src.clkr.hw },
+                       .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
        },
@@ -1062,12 +1161,9 @@ static struct clk_branch gcc_blsp1_qup1_i2c_apps_clk = {
        .clkr = {
                .enable_reg = 0x0648,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup1_i2c_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp1_qup1_i2c_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp1_qup1_i2c_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1080,12 +1176,9 @@ static struct clk_branch gcc_blsp1_qup1_spi_apps_clk = {
        .clkr = {
                .enable_reg = 0x0644,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup1_spi_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp1_qup1_spi_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp1_qup1_spi_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1098,12 +1191,9 @@ static struct clk_branch gcc_blsp1_qup2_i2c_apps_clk = {
        .clkr = {
                .enable_reg = 0x06c8,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup2_i2c_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp1_qup2_i2c_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp1_qup2_i2c_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1116,12 +1206,9 @@ static struct clk_branch gcc_blsp1_qup2_spi_apps_clk = {
        .clkr = {
                .enable_reg = 0x06c4,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup2_spi_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp1_qup2_spi_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp1_qup2_spi_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1134,12 +1221,9 @@ static struct clk_branch gcc_blsp1_qup3_i2c_apps_clk = {
        .clkr = {
                .enable_reg = 0x0748,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup3_i2c_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp1_qup3_i2c_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp1_qup3_i2c_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1152,12 +1236,9 @@ static struct clk_branch gcc_blsp1_qup3_spi_apps_clk = {
        .clkr = {
                .enable_reg = 0x0744,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup3_spi_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp1_qup3_spi_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp1_qup3_spi_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1170,12 +1251,9 @@ static struct clk_branch gcc_blsp1_qup4_i2c_apps_clk = {
        .clkr = {
                .enable_reg = 0x07c8,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup4_i2c_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp1_qup4_i2c_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp1_qup4_i2c_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1188,12 +1266,9 @@ static struct clk_branch gcc_blsp1_qup4_spi_apps_clk = {
        .clkr = {
                .enable_reg = 0x07c4,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup4_spi_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp1_qup4_spi_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp1_qup4_spi_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1206,12 +1281,9 @@ static struct clk_branch gcc_blsp1_qup5_i2c_apps_clk = {
        .clkr = {
                .enable_reg = 0x0848,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup5_i2c_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp1_qup5_i2c_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp1_qup5_i2c_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1224,12 +1296,9 @@ static struct clk_branch gcc_blsp1_qup5_spi_apps_clk = {
        .clkr = {
                .enable_reg = 0x0844,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup5_spi_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp1_qup5_spi_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp1_qup5_spi_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1242,12 +1311,9 @@ static struct clk_branch gcc_blsp1_qup6_i2c_apps_clk = {
        .clkr = {
                .enable_reg = 0x08c8,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup6_i2c_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp1_qup6_i2c_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp1_qup6_i2c_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1260,12 +1326,9 @@ static struct clk_branch gcc_blsp1_qup6_spi_apps_clk = {
        .clkr = {
                .enable_reg = 0x08c4,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup6_spi_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp1_qup6_spi_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp1_qup6_spi_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1278,12 +1341,9 @@ static struct clk_branch gcc_blsp1_uart1_apps_clk = {
        .clkr = {
                .enable_reg = 0x0684,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_uart1_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp1_uart1_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp1_uart1_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1296,12 +1356,9 @@ static struct clk_branch gcc_blsp1_uart2_apps_clk = {
        .clkr = {
                .enable_reg = 0x0704,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_uart2_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp1_uart2_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp1_uart2_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1314,12 +1371,9 @@ static struct clk_branch gcc_blsp1_uart3_apps_clk = {
        .clkr = {
                .enable_reg = 0x0784,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_uart3_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp1_uart3_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp1_uart3_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1332,12 +1386,9 @@ static struct clk_branch gcc_blsp1_uart4_apps_clk = {
        .clkr = {
                .enable_reg = 0x0804,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_uart4_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp1_uart4_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp1_uart4_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1350,12 +1401,9 @@ static struct clk_branch gcc_blsp1_uart5_apps_clk = {
        .clkr = {
                .enable_reg = 0x0884,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_uart5_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp1_uart5_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp1_uart5_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1368,12 +1416,9 @@ static struct clk_branch gcc_blsp1_uart6_apps_clk = {
        .clkr = {
                .enable_reg = 0x0904,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_uart6_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp1_uart6_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp1_uart6_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1387,9 +1432,10 @@ static struct clk_branch gcc_blsp2_ahb_clk = {
        .clkr = {
                .enable_reg = 0x1484,
                .enable_mask = BIT(15),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &periph_noc_clk_src.clkr.hw },
+                       .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
        },
@@ -1400,12 +1446,9 @@ static struct clk_branch gcc_blsp2_qup1_i2c_apps_clk = {
        .clkr = {
                .enable_reg = 0x0988,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup1_i2c_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp2_qup1_i2c_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp2_qup1_i2c_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1418,12 +1461,9 @@ static struct clk_branch gcc_blsp2_qup1_spi_apps_clk = {
        .clkr = {
                .enable_reg = 0x0984,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup1_spi_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp2_qup1_spi_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp2_qup1_spi_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1436,12 +1476,9 @@ static struct clk_branch gcc_blsp2_qup2_i2c_apps_clk = {
        .clkr = {
                .enable_reg = 0x0a08,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup2_i2c_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp2_qup2_i2c_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp2_qup2_i2c_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1454,12 +1491,9 @@ static struct clk_branch gcc_blsp2_qup2_spi_apps_clk = {
        .clkr = {
                .enable_reg = 0x0a04,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup2_spi_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp2_qup2_spi_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp2_qup2_spi_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1472,12 +1506,9 @@ static struct clk_branch gcc_blsp2_qup3_i2c_apps_clk = {
        .clkr = {
                .enable_reg = 0x0a88,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup3_i2c_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp2_qup3_i2c_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp2_qup3_i2c_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1490,12 +1521,9 @@ static struct clk_branch gcc_blsp2_qup3_spi_apps_clk = {
        .clkr = {
                .enable_reg = 0x0a84,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup3_spi_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp2_qup3_spi_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp2_qup3_spi_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1508,12 +1536,9 @@ static struct clk_branch gcc_blsp2_qup4_i2c_apps_clk = {
        .clkr = {
                .enable_reg = 0x0b08,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup4_i2c_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp2_qup4_i2c_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp2_qup4_i2c_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1526,12 +1551,9 @@ static struct clk_branch gcc_blsp2_qup4_spi_apps_clk = {
        .clkr = {
                .enable_reg = 0x0b04,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup4_spi_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp2_qup4_spi_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp2_qup4_spi_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1544,12 +1566,9 @@ static struct clk_branch gcc_blsp2_qup5_i2c_apps_clk = {
        .clkr = {
                .enable_reg = 0x0b88,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup5_i2c_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp2_qup5_i2c_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp2_qup5_i2c_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1562,12 +1581,9 @@ static struct clk_branch gcc_blsp2_qup5_spi_apps_clk = {
        .clkr = {
                .enable_reg = 0x0b84,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup5_spi_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp2_qup5_spi_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp2_qup5_spi_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1580,12 +1596,9 @@ static struct clk_branch gcc_blsp2_qup6_i2c_apps_clk = {
        .clkr = {
                .enable_reg = 0x0c08,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup6_i2c_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp2_qup6_i2c_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp2_qup6_i2c_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1598,12 +1611,9 @@ static struct clk_branch gcc_blsp2_qup6_spi_apps_clk = {
        .clkr = {
                .enable_reg = 0x0c04,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup6_spi_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp2_qup6_spi_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp2_qup6_spi_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1616,12 +1626,9 @@ static struct clk_branch gcc_blsp2_uart1_apps_clk = {
        .clkr = {
                .enable_reg = 0x09c4,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_uart1_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp2_uart1_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp2_uart1_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1634,12 +1641,9 @@ static struct clk_branch gcc_blsp2_uart2_apps_clk = {
        .clkr = {
                .enable_reg = 0x0a44,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_uart2_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp2_uart2_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp2_uart2_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1652,12 +1656,9 @@ static struct clk_branch gcc_blsp2_uart3_apps_clk = {
        .clkr = {
                .enable_reg = 0x0ac4,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_uart3_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp2_uart3_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp2_uart3_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1670,12 +1671,9 @@ static struct clk_branch gcc_blsp2_uart4_apps_clk = {
        .clkr = {
                .enable_reg = 0x0b44,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_uart4_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp2_uart4_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp2_uart4_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1688,12 +1686,9 @@ static struct clk_branch gcc_blsp2_uart5_apps_clk = {
        .clkr = {
                .enable_reg = 0x0bc4,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_uart5_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp2_uart5_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp2_uart5_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1706,12 +1701,9 @@ static struct clk_branch gcc_blsp2_uart6_apps_clk = {
        .clkr = {
                .enable_reg = 0x0c44,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_uart6_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "blsp2_uart6_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &blsp2_uart6_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1724,12 +1716,9 @@ static struct clk_branch gcc_gp1_clk = {
        .clkr = {
                .enable_reg = 0x1900,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_gp1_clk",
-                       .parent_names = (const char *[]) {
-                               "gp1_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &gp1_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1742,12 +1731,9 @@ static struct clk_branch gcc_gp2_clk = {
        .clkr = {
                .enable_reg = 0x1940,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_gp2_clk",
-                       .parent_names = (const char *[]) {
-                               "gp2_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &gp2_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1760,12 +1746,9 @@ static struct clk_branch gcc_gp3_clk = {
        .clkr = {
                .enable_reg = 0x1980,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_gp3_clk",
-                       .parent_names = (const char *[]) {
-                               "gp3_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &gp3_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1778,9 +1761,10 @@ static struct clk_branch gcc_lpass_q6_axi_clk = {
        .clkr = {
                .enable_reg = 0x0280,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_lpass_q6_axi_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &system_noc_clk_src.clkr.hw },
+                       .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
        },
@@ -1791,9 +1775,10 @@ static struct clk_branch gcc_mss_q6_bimc_axi_clk = {
        .clkr = {
                .enable_reg = 0x0284,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_mss_q6_bimc_axi_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &system_noc_clk_src.clkr.hw },
+                       .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
        },
@@ -1804,12 +1789,9 @@ static struct clk_branch gcc_pcie_0_aux_clk = {
        .clkr = {
                .enable_reg = 0x1ad4,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_pcie_0_aux_clk",
-                       .parent_names = (const char *[]) {
-                               "pcie_0_aux_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &pcie_0_aux_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1822,9 +1804,11 @@ static struct clk_branch gcc_pcie_0_cfg_ahb_clk = {
        .clkr = {
                .enable_reg = 0x1ad0,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_pcie_0_cfg_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &config_noc_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
                },
        },
@@ -1835,9 +1819,11 @@ static struct clk_branch gcc_pcie_0_mstr_axi_clk = {
        .clkr = {
                .enable_reg = 0x1acc,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_pcie_0_mstr_axi_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &system_noc_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
                },
        },
@@ -1849,12 +1835,9 @@ static struct clk_branch gcc_pcie_0_pipe_clk = {
        .clkr = {
                .enable_reg = 0x1ad8,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_pcie_0_pipe_clk",
-                       .parent_names = (const char *[]) {
-                               "pcie_0_pipe_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &pcie_0_pipe_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1868,9 +1851,11 @@ static struct clk_branch gcc_pcie_0_slv_axi_clk = {
        .clkr = {
                .enable_reg = 0x1ac8,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_pcie_0_slv_axi_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &system_noc_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
                },
        },
@@ -1881,12 +1866,9 @@ static struct clk_branch gcc_pcie_1_aux_clk = {
        .clkr = {
                .enable_reg = 0x1b54,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_pcie_1_aux_clk",
-                       .parent_names = (const char *[]) {
-                               "pcie_1_aux_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &pcie_1_aux_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1899,9 +1881,11 @@ static struct clk_branch gcc_pcie_1_cfg_ahb_clk = {
        .clkr = {
                .enable_reg = 0x1b54,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_pcie_1_cfg_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &config_noc_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
                },
        },
@@ -1912,9 +1896,11 @@ static struct clk_branch gcc_pcie_1_mstr_axi_clk = {
        .clkr = {
                .enable_reg = 0x1b50,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_pcie_1_mstr_axi_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &system_noc_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
                },
        },
@@ -1926,12 +1912,9 @@ static struct clk_branch gcc_pcie_1_pipe_clk = {
        .clkr = {
                .enable_reg = 0x1b58,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_pcie_1_pipe_clk",
-                       .parent_names = (const char *[]) {
-                               "pcie_1_pipe_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &pcie_1_pipe_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1944,9 +1927,11 @@ static struct clk_branch gcc_pcie_1_slv_axi_clk = {
        .clkr = {
                .enable_reg = 0x1b48,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_pcie_1_slv_axi_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &system_noc_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
                },
        },
@@ -1957,12 +1942,9 @@ static struct clk_branch gcc_pdm2_clk = {
        .clkr = {
                .enable_reg = 0x0ccc,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_pdm2_clk",
-                       .parent_names = (const char *[]) {
-                               "pdm2_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &pdm2_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -1975,9 +1957,10 @@ static struct clk_branch gcc_pdm_ahb_clk = {
        .clkr = {
                .enable_reg = 0x0cc4,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_pdm_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &periph_noc_clk_src.clkr.hw },
+                       .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
        },
@@ -1988,12 +1971,9 @@ static struct clk_branch gcc_sdcc1_apps_clk = {
        .clkr = {
                .enable_reg = 0x04c4,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc1_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "sdcc1_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &sdcc1_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -2006,13 +1986,11 @@ static struct clk_branch gcc_sdcc1_ahb_clk = {
        .clkr = {
                .enable_reg = 0x04c8,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc1_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "periph_noc_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &periph_noc_clk_src.clkr.hw },
                        .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
                },
        },
@@ -2023,13 +2001,11 @@ static struct clk_branch gcc_sdcc2_ahb_clk = {
        .clkr = {
                .enable_reg = 0x0508,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc2_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "periph_noc_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &periph_noc_clk_src.clkr.hw },
                        .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
                },
        },
@@ -2040,12 +2016,9 @@ static struct clk_branch gcc_sdcc2_apps_clk = {
        .clkr = {
                .enable_reg = 0x0504,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc2_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "sdcc2_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &sdcc2_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -2058,13 +2031,11 @@ static struct clk_branch gcc_sdcc3_ahb_clk = {
        .clkr = {
                .enable_reg = 0x0548,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc3_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "periph_noc_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &periph_noc_clk_src.clkr.hw },
                        .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
                },
        },
@@ -2075,12 +2046,9 @@ static struct clk_branch gcc_sdcc3_apps_clk = {
        .clkr = {
                .enable_reg = 0x0544,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc3_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "sdcc3_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &sdcc3_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -2093,13 +2061,11 @@ static struct clk_branch gcc_sdcc4_ahb_clk = {
        .clkr = {
                .enable_reg = 0x0588,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc4_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "periph_noc_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &periph_noc_clk_src.clkr.hw },
                        .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
                },
        },
@@ -2110,12 +2076,9 @@ static struct clk_branch gcc_sdcc4_apps_clk = {
        .clkr = {
                .enable_reg = 0x0584,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc4_apps_clk",
-                       .parent_names = (const char *[]) {
-                               "sdcc4_apps_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &sdcc4_apps_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -2128,12 +2091,9 @@ static struct clk_branch gcc_sys_noc_ufs_axi_clk = {
        .clkr = {
                .enable_reg = 0x1d7c,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_sys_noc_ufs_axi_clk",
-                       .parent_names = (const char *[]) {
-                               "ufs_axi_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &ufs_axi_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -2146,12 +2106,9 @@ static struct clk_branch gcc_sys_noc_usb3_axi_clk = {
        .clkr = {
                .enable_reg = 0x03fc,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_sys_noc_usb3_axi_clk",
-                       .parent_names = (const char *[]) {
-                               "usb30_master_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &usb30_master_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -2164,9 +2121,10 @@ static struct clk_branch gcc_tsif_ahb_clk = {
        .clkr = {
                .enable_reg = 0x0d84,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_tsif_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &periph_noc_clk_src.clkr.hw },
+                       .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
        },
@@ -2177,12 +2135,9 @@ static struct clk_branch gcc_tsif_ref_clk = {
        .clkr = {
                .enable_reg = 0x0d88,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_tsif_ref_clk",
-                       .parent_names = (const char *[]) {
-                               "tsif_ref_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &tsif_ref_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -2195,9 +2150,10 @@ static struct clk_branch gcc_ufs_ahb_clk = {
        .clkr = {
                .enable_reg = 0x1d4c,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_ufs_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &config_noc_clk_src.clkr.hw },
+                       .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
        },
@@ -2208,12 +2164,9 @@ static struct clk_branch gcc_ufs_axi_clk = {
        .clkr = {
                .enable_reg = 0x1d48,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_ufs_axi_clk",
-                       .parent_names = (const char *[]) {
-                               "ufs_axi_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &ufs_axi_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -2226,12 +2179,9 @@ static struct clk_branch gcc_ufs_rx_cfg_clk = {
        .clkr = {
                .enable_reg = 0x1d54,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_ufs_rx_cfg_clk",
-                       .parent_names = (const char *[]) {
-                               "ufs_axi_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &ufs_axi_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -2245,9 +2195,10 @@ static struct clk_branch gcc_ufs_rx_symbol_0_clk = {
        .clkr = {
                .enable_reg = 0x1d60,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_ufs_rx_symbol_0_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &system_noc_clk_src.clkr.hw },
+                       .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
        },
@@ -2259,9 +2210,10 @@ static struct clk_branch gcc_ufs_rx_symbol_1_clk = {
        .clkr = {
                .enable_reg = 0x1d64,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_ufs_rx_symbol_1_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &system_noc_clk_src.clkr.hw },
+                       .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
        },
@@ -2272,12 +2224,9 @@ static struct clk_branch gcc_ufs_tx_cfg_clk = {
        .clkr = {
                .enable_reg = 0x1d50,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_ufs_tx_cfg_clk",
-                       .parent_names = (const char *[]) {
-                               "ufs_axi_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &ufs_axi_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -2291,9 +2240,10 @@ static struct clk_branch gcc_ufs_tx_symbol_0_clk = {
        .clkr = {
                .enable_reg = 0x1d58,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_ufs_tx_symbol_0_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &system_noc_clk_src.clkr.hw },
+                       .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
        },
@@ -2305,9 +2255,10 @@ static struct clk_branch gcc_ufs_tx_symbol_1_clk = {
        .clkr = {
                .enable_reg = 0x1d5c,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_ufs_tx_symbol_1_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &system_noc_clk_src.clkr.hw },
+                       .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
        },
@@ -2318,9 +2269,13 @@ static struct clk_branch gcc_usb2_hs_phy_sleep_clk = {
        .clkr = {
                .enable_reg = 0x04ac,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb2_hs_phy_sleep_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "sleep",
+                               .name = "sleep"
+                       },
+                       .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
        },
@@ -2331,12 +2286,9 @@ static struct clk_branch gcc_usb30_master_clk = {
        .clkr = {
                .enable_reg = 0x03c8,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb30_master_clk",
-                       .parent_names = (const char *[]) {
-                               "usb30_master_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &usb30_master_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -2349,12 +2301,9 @@ static struct clk_branch gcc_usb30_mock_utmi_clk = {
        .clkr = {
                .enable_reg = 0x03d0,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb30_mock_utmi_clk",
-                       .parent_names = (const char *[]) {
-                               "usb30_mock_utmi_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &usb30_mock_utmi_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -2367,9 +2316,13 @@ static struct clk_branch gcc_usb30_sleep_clk = {
        .clkr = {
                .enable_reg = 0x03cc,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb30_sleep_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "sleep",
+                               .name = "sleep"
+                       },
+                       .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
        },
@@ -2380,12 +2333,9 @@ static struct clk_branch gcc_usb3_phy_aux_clk = {
        .clkr = {
                .enable_reg = 0x1408,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb3_phy_aux_clk",
-                       .parent_names = (const char *[]) {
-                               "usb3_phy_aux_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &usb3_phy_aux_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -2393,14 +2343,28 @@ static struct clk_branch gcc_usb3_phy_aux_clk = {
        },
 };
 
+static struct clk_branch gcc_usb3_phy_pipe_clk = {
+       .halt_reg = 0x140c,
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x140c,
+               .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_ahb_clk = {
        .halt_reg = 0x0488,
        .clkr = {
                .enable_reg = 0x0488,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb_hs_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &periph_noc_clk_src.clkr.hw },
+                       .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
        },
@@ -2411,12 +2375,9 @@ static struct clk_branch gcc_usb_hs_system_clk = {
        .clkr = {
                .enable_reg = 0x0484,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb_hs_system_clk",
-                       .parent_names = (const char *[]) {
-                               "usb_hs_system_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){ &usb_hs_system_clk_src.clkr.hw },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
                        .ops = &clk_branch2_ops,
@@ -2429,20 +2390,123 @@ static struct clk_branch gcc_usb_phy_cfg_ahb2phy_clk = {
        .clkr = {
                .enable_reg = 0x1a84,
                .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data)
-               {
+               .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb_phy_cfg_ahb2phy_clk",
                        .ops = &clk_branch2_ops,
                },
        },
 };
 
-static struct gdsc pcie_gdsc = {
-               .gdscr = 0x1e18,
-               .pd = {
-                       .name = "pcie",
+static struct clk_branch gpll0_out_mmsscc = {
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x1484,
+               .enable_mask = BIT(26),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll0_out_mmsscc",
+                       .parent_hws = (const struct clk_hw *[]){ &gpll0.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
                },
-               .pwrsts = PWRSTS_OFF_ON,
+       },
+};
+
+static struct clk_branch gpll0_out_msscc = {
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x1484,
+               .enable_mask = BIT(27),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll0_out_msscc",
+                       .parent_hws = (const struct clk_hw *[]){ &gpll0.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch pcie_0_phy_ldo = {
+       .halt_reg = 0x1e00,
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x1E00,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "pcie_0_phy_ldo",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch pcie_1_phy_ldo = {
+       .halt_reg = 0x1e04,
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x1E04,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "pcie_1_phy_ldo",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch ufs_phy_ldo = {
+       .halt_reg = 0x1e0c,
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x1E0C,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "ufs_phy_ldo",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch usb_ss_phy_ldo = {
+       .halt_reg = 0x1e08,
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x1E08,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "usb_ss_phy_ldo",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_boot_rom_ahb_clk = {
+       .halt_reg = 0x0e04,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x0e04,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x1484,
+               .enable_mask = BIT(10),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_boot_rom_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &config_noc_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_prng_ahb_clk = {
+       .halt_reg = 0x0d04,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x1484,
+               .enable_mask = BIT(13),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_prng_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &periph_noc_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
 };
 
 static struct gdsc pcie_0_gdsc = {
@@ -2482,6 +2546,9 @@ static struct clk_regmap *gcc_msm8994_clocks[] = {
        [GPLL0] = &gpll0.clkr,
        [GPLL4_EARLY] = &gpll4_early.clkr,
        [GPLL4] = &gpll4.clkr,
+       [CONFIG_NOC_CLK_SRC] = &config_noc_clk_src.clkr,
+       [PERIPH_NOC_CLK_SRC] = &periph_noc_clk_src.clkr,
+       [SYSTEM_NOC_CLK_SRC] = &system_noc_clk_src.clkr,
        [UFS_AXI_CLK_SRC] = &ufs_axi_clk_src.clkr,
        [USB30_MASTER_CLK_SRC] = &usb30_master_clk_src.clkr,
        [BLSP1_QUP1_I2C_APPS_CLK_SRC] = &blsp1_qup1_i2c_apps_clk_src.clkr,
@@ -2616,13 +2683,23 @@ static struct clk_regmap *gcc_msm8994_clocks[] = {
        [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_AHB_CLK] = &gcc_usb_hs_ahb_clk.clkr,
        [GCC_USB_HS_SYSTEM_CLK] = &gcc_usb_hs_system_clk.clkr,
        [GCC_USB_PHY_CFG_AHB2PHY_CLK] = &gcc_usb_phy_cfg_ahb2phy_clk.clkr,
+       [GPLL0_OUT_MMSSCC] = &gpll0_out_mmsscc.clkr,
+       [GPLL0_OUT_MSSCC] = &gpll0_out_msscc.clkr,
+       [PCIE_0_PHY_LDO] = &pcie_0_phy_ldo.clkr,
+       [PCIE_1_PHY_LDO] = &pcie_1_phy_ldo.clkr,
+       [UFS_PHY_LDO] = &ufs_phy_ldo.clkr,
+       [USB_SS_PHY_LDO] = &usb_ss_phy_ldo.clkr,
+       [GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr,
+       [GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr,
 };
 
 static struct gdsc *gcc_msm8994_gdscs[] = {
-       [PCIE_GDSC] = &pcie_gdsc,
+       /* This GDSC does not exist, but ABI has to remain intact */
+       [PCIE_GDSC] = NULL,
        [PCIE_0_GDSC] = &pcie_0_gdsc,
        [PCIE_1_GDSC] = &pcie_1_gdsc,
        [USB30_GDSC] = &usb30_gdsc,
@@ -2632,6 +2709,7 @@ static struct gdsc *gcc_msm8994_gdscs[] = {
 static const struct qcom_reset_map gcc_msm8994_resets[] = {
        [USB3_PHY_RESET] = { 0x1400 },
        [USB3PHY_PHY_RESET] = { 0x1404 },
+       [MSS_RESET] = { 0x1680 },
        [PCIE_PHY_0_RESET] = { 0x1b18 },
        [PCIE_PHY_1_RESET] = { 0x1b98 },
        [QUSB2_PHY_RESET] = { 0x04b8 },
@@ -2656,19 +2734,57 @@ static const struct qcom_cc_desc gcc_msm8994_desc = {
 };
 
 static const struct of_device_id gcc_msm8994_match_table[] = {
-       { .compatible = "qcom,gcc-msm8994" },
+       { .compatible = "qcom,gcc-msm8992" },
+       { .compatible = "qcom,gcc-msm8994" }, /* V2 and V2.1 */
        {}
 };
 MODULE_DEVICE_TABLE(of, gcc_msm8994_match_table);
 
 static int gcc_msm8994_probe(struct platform_device *pdev)
 {
-       struct device *dev = &pdev->dev;
-       struct clk *clk;
-
-       clk = devm_clk_register(dev, &xo.hw);
-       if (IS_ERR(clk))
-               return PTR_ERR(clk);
+       if (of_device_is_compatible(pdev->dev.of_node, "qcom,gcc-msm8992")) {
+               /* MSM8992 features less clocks and some have different freq tables */
+               gcc_msm8994_desc.clks[UFS_AXI_CLK_SRC] = NULL;
+               gcc_msm8994_desc.clks[GCC_LPASS_Q6_AXI_CLK] = NULL;
+               gcc_msm8994_desc.clks[UFS_PHY_LDO] = NULL;
+               gcc_msm8994_desc.clks[GCC_UFS_AHB_CLK] = NULL;
+               gcc_msm8994_desc.clks[GCC_UFS_AXI_CLK] = NULL;
+               gcc_msm8994_desc.clks[GCC_UFS_RX_CFG_CLK] = NULL;
+               gcc_msm8994_desc.clks[GCC_UFS_RX_SYMBOL_0_CLK] = NULL;
+               gcc_msm8994_desc.clks[GCC_UFS_RX_SYMBOL_1_CLK] = NULL;
+               gcc_msm8994_desc.clks[GCC_UFS_TX_CFG_CLK] = NULL;
+               gcc_msm8994_desc.clks[GCC_UFS_TX_SYMBOL_0_CLK] = NULL;
+               gcc_msm8994_desc.clks[GCC_UFS_TX_SYMBOL_1_CLK] = NULL;
+
+               sdcc1_apps_clk_src.freq_tbl = ftbl_sdcc1_apps_clk_src_8992;
+               blsp1_qup1_i2c_apps_clk_src.freq_tbl = ftbl_blsp1_qup_spi_apps_clk_src_8992;
+               blsp1_qup2_i2c_apps_clk_src.freq_tbl = ftbl_blsp1_qup_spi_apps_clk_src_8992;
+               blsp1_qup3_i2c_apps_clk_src.freq_tbl = ftbl_blsp1_qup_spi_apps_clk_src_8992;
+               blsp1_qup4_i2c_apps_clk_src.freq_tbl = ftbl_blsp1_qup_spi_apps_clk_src_8992;
+               blsp1_qup5_i2c_apps_clk_src.freq_tbl = ftbl_blsp1_qup_spi_apps_clk_src_8992;
+               blsp1_qup6_i2c_apps_clk_src.freq_tbl = ftbl_blsp1_qup_spi_apps_clk_src_8992;
+               blsp2_qup1_i2c_apps_clk_src.freq_tbl = ftbl_blsp1_qup_spi_apps_clk_src_8992;
+               blsp2_qup2_i2c_apps_clk_src.freq_tbl = ftbl_blsp1_qup_spi_apps_clk_src_8992;
+               blsp2_qup3_i2c_apps_clk_src.freq_tbl = ftbl_blsp1_qup_spi_apps_clk_src_8992;
+               blsp2_qup4_i2c_apps_clk_src.freq_tbl = ftbl_blsp1_qup_spi_apps_clk_src_8992;
+               blsp2_qup5_i2c_apps_clk_src.freq_tbl = ftbl_blsp1_qup_spi_apps_clk_src_8992;
+               blsp2_qup6_i2c_apps_clk_src.freq_tbl = ftbl_blsp1_qup_spi_apps_clk_src_8992;
+
+               /*
+                * Some 8992 boards might *possibly* use
+                * PCIe1 clocks and controller, but it's not
+                * standard and they should be disabled otherwise.
+                */
+               gcc_msm8994_desc.clks[PCIE_1_AUX_CLK_SRC] = NULL;
+               gcc_msm8994_desc.clks[PCIE_1_PIPE_CLK_SRC] = NULL;
+               gcc_msm8994_desc.clks[PCIE_1_PHY_LDO] = NULL;
+               gcc_msm8994_desc.clks[GCC_PCIE_1_AUX_CLK] = NULL;
+               gcc_msm8994_desc.clks[GCC_PCIE_1_CFG_AHB_CLK] = NULL;
+               gcc_msm8994_desc.clks[GCC_PCIE_1_MSTR_AXI_CLK] = NULL;
+               gcc_msm8994_desc.clks[GCC_PCIE_1_PIPE_CLK] = NULL;
+               gcc_msm8994_desc.clks[GCC_PCIE_1_SLV_AXI_CLK] = NULL;
+               gcc_msm8994_desc.clks[GCC_SYS_NOC_UFS_AXI_CLK] = NULL;
+       }
 
        return qcom_cc_probe(pdev, &gcc_msm8994_desc);
 }
index 050c91a..407e2c5 100644 (file)
 #include "reset.h"
 #include "gdsc.h"
 
-enum {
-       P_AUD_REF_CLK,
-       P_CORE_BI_PLL_TEST_SE,
-       P_GPLL0_OUT_MAIN,
-       P_GPLL4_OUT_MAIN,
-       P_PLL0_EARLY_DIV_CLK_SRC,
-       P_SLEEP_CLK,
-       P_XO,
-};
-
-static const struct parent_map gcc_parent_map_0[] = {
-       { P_XO, 0 },
-       { P_GPLL0_OUT_MAIN, 1 },
-       { P_PLL0_EARLY_DIV_CLK_SRC, 6 },
-       { P_CORE_BI_PLL_TEST_SE, 7 },
-};
-
-static const char * const gcc_parent_names_0[] = {
-       "xo",
-       "gpll0_out_main",
-       "gpll0_out_main",
-       "core_bi_pll_test_se",
-};
-
-static const struct parent_map gcc_parent_map_1[] = {
-       { P_XO, 0 },
-       { P_GPLL0_OUT_MAIN, 1 },
-       { P_CORE_BI_PLL_TEST_SE, 7 },
-};
-
-static const char * const gcc_parent_names_1[] = {
-       "xo",
-       "gpll0_out_main",
-       "core_bi_pll_test_se",
-};
-
-static const struct parent_map gcc_parent_map_2[] = {
-       { P_XO, 0 },
-       { P_GPLL0_OUT_MAIN, 1 },
-       { P_SLEEP_CLK, 5 },
-       { P_PLL0_EARLY_DIV_CLK_SRC, 6 },
-       { P_CORE_BI_PLL_TEST_SE, 7 },
-};
-
-static const char * const gcc_parent_names_2[] = {
-       "xo",
-       "gpll0_out_main",
-       "core_pi_sleep_clk",
-       "gpll0_out_main",
-       "core_bi_pll_test_se",
-};
-
-static const struct parent_map gcc_parent_map_3[] = {
-       { P_XO, 0 },
-       { P_SLEEP_CLK, 5 },
-       { P_CORE_BI_PLL_TEST_SE, 7 },
-};
-
-static const char * const gcc_parent_names_3[] = {
-       "xo",
-       "core_pi_sleep_clk",
-       "core_bi_pll_test_se",
-};
-
-static const struct parent_map gcc_parent_map_4[] = {
-       { P_XO, 0 },
-       { P_GPLL0_OUT_MAIN, 1 },
-       { P_GPLL4_OUT_MAIN, 5 },
-       { P_CORE_BI_PLL_TEST_SE, 7 },
-};
-
-static const char * const gcc_parent_names_4[] = {
-       "xo",
-       "gpll0_out_main",
-       "gpll4_out_main",
-       "core_bi_pll_test_se",
-};
-
-static const struct parent_map gcc_parent_map_5[] = {
-       { P_XO, 0 },
-       { P_GPLL0_OUT_MAIN, 1 },
-       { P_AUD_REF_CLK, 2 },
-       { P_CORE_BI_PLL_TEST_SE, 7 },
-};
-
-static const char * const gcc_parent_names_5[] = {
-       "xo",
-       "gpll0_out_main",
-       "aud_ref_clk",
-       "core_bi_pll_test_se",
-};
-
-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 pll_vco fabia_vco[] = {
        { 250000000, 2000000000, 0 },
        { 125000000, 1000000000, 1 },
@@ -143,7 +40,9 @@ static struct clk_alpha_pll gpll0 = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gpll0",
-                       .parent_names = (const char *[]){ "xo" },
+                       .parent_data = (const struct clk_parent_data []) {
+                               { .fw_name = "xo" },
+                       },
                        .num_parents = 1,
                        .ops = &clk_alpha_pll_fixed_fabia_ops,
                }
@@ -155,7 +54,9 @@ static struct clk_alpha_pll_postdiv gpll0_out_even = {
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll0_out_even",
-               .parent_names = (const char *[]){ "gpll0" },
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gpll0.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_alpha_pll_postdiv_fabia_ops,
        },
@@ -166,7 +67,9 @@ static struct clk_alpha_pll_postdiv gpll0_out_main = {
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll0_out_main",
-               .parent_names = (const char *[]){ "gpll0" },
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gpll0.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_alpha_pll_postdiv_fabia_ops,
        },
@@ -177,7 +80,9 @@ static struct clk_alpha_pll_postdiv gpll0_out_odd = {
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll0_out_odd",
-               .parent_names = (const char *[]){ "gpll0" },
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gpll0.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_alpha_pll_postdiv_fabia_ops,
        },
@@ -188,7 +93,9 @@ static struct clk_alpha_pll_postdiv gpll0_out_test = {
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll0_out_test",
-               .parent_names = (const char *[]){ "gpll0" },
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gpll0.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_alpha_pll_postdiv_fabia_ops,
        },
@@ -204,7 +111,9 @@ static struct clk_alpha_pll gpll1 = {
                .enable_mask = BIT(1),
                .hw.init = &(struct clk_init_data){
                        .name = "gpll1",
-                       .parent_names = (const char *[]){ "xo" },
+                       .parent_data = (const struct clk_parent_data []) {
+                               { .fw_name = "xo" },
+                       },
                        .num_parents = 1,
                        .ops = &clk_alpha_pll_fixed_fabia_ops,
                }
@@ -216,7 +125,9 @@ static struct clk_alpha_pll_postdiv gpll1_out_even = {
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll1_out_even",
-               .parent_names = (const char *[]){ "gpll1" },
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gpll1.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_alpha_pll_postdiv_fabia_ops,
        },
@@ -227,7 +138,9 @@ static struct clk_alpha_pll_postdiv gpll1_out_main = {
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll1_out_main",
-               .parent_names = (const char *[]){ "gpll1" },
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gpll1.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_alpha_pll_postdiv_fabia_ops,
        },
@@ -238,7 +151,9 @@ static struct clk_alpha_pll_postdiv gpll1_out_odd = {
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll1_out_odd",
-               .parent_names = (const char *[]){ "gpll1" },
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gpll1.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_alpha_pll_postdiv_fabia_ops,
        },
@@ -249,7 +164,9 @@ static struct clk_alpha_pll_postdiv gpll1_out_test = {
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll1_out_test",
-               .parent_names = (const char *[]){ "gpll1" },
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gpll1.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_alpha_pll_postdiv_fabia_ops,
        },
@@ -265,7 +182,9 @@ static struct clk_alpha_pll gpll2 = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "gpll2",
-                       .parent_names = (const char *[]){ "xo" },
+                       .parent_data = (const struct clk_parent_data []) {
+                               { .fw_name = "xo" },
+                       },
                        .num_parents = 1,
                        .ops = &clk_alpha_pll_fixed_fabia_ops,
                }
@@ -277,7 +196,9 @@ static struct clk_alpha_pll_postdiv gpll2_out_even = {
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll2_out_even",
-               .parent_names = (const char *[]){ "gpll2" },
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gpll2.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_alpha_pll_postdiv_fabia_ops,
        },
@@ -288,7 +209,9 @@ static struct clk_alpha_pll_postdiv gpll2_out_main = {
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll2_out_main",
-               .parent_names = (const char *[]){ "gpll2" },
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gpll2.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_alpha_pll_postdiv_fabia_ops,
        },
@@ -299,7 +222,9 @@ static struct clk_alpha_pll_postdiv gpll2_out_odd = {
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll2_out_odd",
-               .parent_names = (const char *[]){ "gpll2" },
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gpll2.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_alpha_pll_postdiv_fabia_ops,
        },
@@ -310,7 +235,9 @@ static struct clk_alpha_pll_postdiv gpll2_out_test = {
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll2_out_test",
-               .parent_names = (const char *[]){ "gpll2" },
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gpll2.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_alpha_pll_postdiv_fabia_ops,
        },
@@ -326,7 +253,9 @@ static struct clk_alpha_pll gpll3 = {
                .enable_mask = BIT(3),
                .hw.init = &(struct clk_init_data){
                        .name = "gpll3",
-                       .parent_names = (const char *[]){ "xo" },
+                       .parent_data = (const struct clk_parent_data []) {
+                               { .fw_name = "xo" },
+                       },
                        .num_parents = 1,
                        .ops = &clk_alpha_pll_fixed_fabia_ops,
                }
@@ -338,7 +267,9 @@ static struct clk_alpha_pll_postdiv gpll3_out_even = {
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll3_out_even",
-               .parent_names = (const char *[]){ "gpll3" },
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gpll3.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_alpha_pll_postdiv_fabia_ops,
        },
@@ -349,7 +280,9 @@ static struct clk_alpha_pll_postdiv gpll3_out_main = {
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll3_out_main",
-               .parent_names = (const char *[]){ "gpll3" },
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gpll3.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_alpha_pll_postdiv_fabia_ops,
        },
@@ -360,7 +293,9 @@ static struct clk_alpha_pll_postdiv gpll3_out_odd = {
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll3_out_odd",
-               .parent_names = (const char *[]){ "gpll3" },
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gpll3.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_alpha_pll_postdiv_fabia_ops,
        },
@@ -371,7 +306,9 @@ static struct clk_alpha_pll_postdiv gpll3_out_test = {
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll3_out_test",
-               .parent_names = (const char *[]){ "gpll3" },
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gpll3.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_alpha_pll_postdiv_fabia_ops,
        },
@@ -387,7 +324,9 @@ static struct clk_alpha_pll gpll4 = {
                .enable_mask = BIT(4),
                .hw.init = &(struct clk_init_data){
                        .name = "gpll4",
-                       .parent_names = (const char *[]){ "xo" },
+                       .parent_data = (const struct clk_parent_data []) {
+                               { .fw_name = "xo" },
+                       },
                        .num_parents = 1,
                        .ops = &clk_alpha_pll_fixed_fabia_ops,
                }
@@ -399,7 +338,9 @@ static struct clk_alpha_pll_postdiv gpll4_out_even = {
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll4_out_even",
-               .parent_names = (const char *[]){ "gpll4" },
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gpll4.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_alpha_pll_postdiv_fabia_ops,
        },
@@ -410,7 +351,9 @@ static struct clk_alpha_pll_postdiv gpll4_out_main = {
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll4_out_main",
-               .parent_names = (const char *[]){ "gpll4" },
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gpll4.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_alpha_pll_postdiv_fabia_ops,
        },
@@ -421,7 +364,9 @@ static struct clk_alpha_pll_postdiv gpll4_out_odd = {
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll4_out_odd",
-               .parent_names = (const char *[]){ "gpll4" },
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gpll4.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_alpha_pll_postdiv_fabia_ops,
        },
@@ -432,12 +377,106 @@ static struct clk_alpha_pll_postdiv gpll4_out_test = {
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll4_out_test",
-               .parent_names = (const char *[]){ "gpll4" },
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gpll4.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_alpha_pll_postdiv_fabia_ops,
        },
 };
 
+enum {
+       P_AUD_REF_CLK,
+       P_CORE_BI_PLL_TEST_SE,
+       P_GPLL0_OUT_MAIN,
+       P_GPLL4_OUT_MAIN,
+       P_PLL0_EARLY_DIV_CLK_SRC,
+       P_SLEEP_CLK,
+       P_XO,
+};
+
+static const struct parent_map gcc_parent_map_0[] = {
+       { P_XO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_PLL0_EARLY_DIV_CLK_SRC, 6 },
+       { P_CORE_BI_PLL_TEST_SE, 7 },
+};
+
+static const struct clk_parent_data gcc_parent_data_0[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0_out_main.clkr.hw },
+       { .hw = &gpll0_out_main.clkr.hw },
+       { .fw_name = "core_bi_pll_test_se" },
+};
+
+static const struct parent_map gcc_parent_map_1[] = {
+       { P_XO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_CORE_BI_PLL_TEST_SE, 7 },
+};
+
+static const struct clk_parent_data gcc_parent_data_1[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0_out_main.clkr.hw },
+       { .fw_name = "core_bi_pll_test_se" },
+};
+
+static const struct parent_map gcc_parent_map_2[] = {
+       { P_XO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_SLEEP_CLK, 5 },
+       { P_PLL0_EARLY_DIV_CLK_SRC, 6 },
+       { P_CORE_BI_PLL_TEST_SE, 7 },
+};
+
+static const struct clk_parent_data gcc_parent_data_2[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0_out_main.clkr.hw },
+       { .fw_name = "sleep_clk" },
+       { .hw = &gpll0_out_main.clkr.hw },
+       { .fw_name = "core_bi_pll_test_se" },
+};
+
+static const struct parent_map gcc_parent_map_3[] = {
+       { P_XO, 0 },
+       { P_SLEEP_CLK, 5 },
+       { P_CORE_BI_PLL_TEST_SE, 7 },
+};
+
+static const struct clk_parent_data gcc_parent_data_3[] = {
+       { .fw_name = "xo" },
+       { .fw_name = "sleep_clk" },
+       { .fw_name = "core_bi_pll_test_se" },
+};
+
+static const struct parent_map gcc_parent_map_4[] = {
+       { P_XO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL4_OUT_MAIN, 5 },
+       { P_CORE_BI_PLL_TEST_SE, 7 },
+};
+
+static const struct clk_parent_data gcc_parent_data_4[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0_out_main.clkr.hw },
+       { .hw = &gpll4_out_main.clkr.hw },
+       { .fw_name = "core_bi_pll_test_se" },
+};
+
+static const struct parent_map gcc_parent_map_5[] = {
+       { P_XO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_AUD_REF_CLK, 2 },
+       { P_CORE_BI_PLL_TEST_SE, 7 },
+};
+
+static const struct clk_parent_data gcc_parent_data_5[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0_out_main.clkr.hw },
+       { .fw_name = "aud_ref_clk" },
+       { .fw_name = "core_bi_pll_test_se" },
+};
+
 static const struct freq_tbl ftbl_blsp1_qup1_i2c_apps_clk_src[] = {
        F(19200000, P_XO, 1, 0, 0),
        F(50000000, P_GPLL0_OUT_MAIN, 12, 0, 0),
@@ -452,8 +491,8 @@ static struct clk_rcg2 blsp1_qup1_i2c_apps_clk_src = {
        .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_1,
-               .num_parents = 3,
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -477,8 +516,8 @@ static struct clk_rcg2 blsp1_qup1_spi_apps_clk_src = {
        .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 = 4,
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -491,8 +530,8 @@ static struct clk_rcg2 blsp1_qup2_i2c_apps_clk_src = {
        .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_1,
-               .num_parents = 3,
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -505,8 +544,8 @@ static struct clk_rcg2 blsp1_qup2_spi_apps_clk_src = {
        .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_0,
-               .num_parents = 4,
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -519,8 +558,8 @@ static struct clk_rcg2 blsp1_qup3_i2c_apps_clk_src = {
        .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_1,
-               .num_parents = 3,
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -533,8 +572,8 @@ static struct clk_rcg2 blsp1_qup3_spi_apps_clk_src = {
        .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_0,
-               .num_parents = 4,
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -547,8 +586,8 @@ static struct clk_rcg2 blsp1_qup4_i2c_apps_clk_src = {
        .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_1,
-               .num_parents = 3,
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -561,8 +600,8 @@ static struct clk_rcg2 blsp1_qup4_spi_apps_clk_src = {
        .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_0,
-               .num_parents = 4,
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -575,8 +614,8 @@ static struct clk_rcg2 blsp1_qup5_i2c_apps_clk_src = {
        .freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup5_i2c_apps_clk_src",
-               .parent_names = gcc_parent_names_1,
-               .num_parents = 3,
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -589,8 +628,8 @@ static struct clk_rcg2 blsp1_qup5_spi_apps_clk_src = {
        .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup5_spi_apps_clk_src",
-               .parent_names = gcc_parent_names_0,
-               .num_parents = 4,
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -603,8 +642,8 @@ static struct clk_rcg2 blsp1_qup6_i2c_apps_clk_src = {
        .freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup6_i2c_apps_clk_src",
-               .parent_names = gcc_parent_names_1,
-               .num_parents = 3,
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -617,8 +656,8 @@ static struct clk_rcg2 blsp1_qup6_spi_apps_clk_src = {
        .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup6_spi_apps_clk_src",
-               .parent_names = gcc_parent_names_0,
-               .num_parents = 4,
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -650,8 +689,8 @@ static struct clk_rcg2 blsp1_uart1_apps_clk_src = {
        .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_0,
-               .num_parents = 4,
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -664,8 +703,8 @@ static struct clk_rcg2 blsp1_uart2_apps_clk_src = {
        .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_0,
-               .num_parents = 4,
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -678,8 +717,8 @@ static struct clk_rcg2 blsp1_uart3_apps_clk_src = {
        .freq_tbl = ftbl_blsp1_uart1_apps_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_uart3_apps_clk_src",
-               .parent_names = gcc_parent_names_0,
-               .num_parents = 4,
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -692,8 +731,8 @@ static struct clk_rcg2 blsp2_qup1_i2c_apps_clk_src = {
        .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_1,
-               .num_parents = 3,
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -706,8 +745,8 @@ static struct clk_rcg2 blsp2_qup1_spi_apps_clk_src = {
        .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_0,
-               .num_parents = 4,
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -720,8 +759,8 @@ static struct clk_rcg2 blsp2_qup2_i2c_apps_clk_src = {
        .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_1,
-               .num_parents = 3,
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -734,8 +773,8 @@ static struct clk_rcg2 blsp2_qup2_spi_apps_clk_src = {
        .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_0,
-               .num_parents = 4,
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -748,8 +787,8 @@ static struct clk_rcg2 blsp2_qup3_i2c_apps_clk_src = {
        .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_1,
-               .num_parents = 3,
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -762,8 +801,8 @@ static struct clk_rcg2 blsp2_qup3_spi_apps_clk_src = {
        .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_0,
-               .num_parents = 4,
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -776,8 +815,8 @@ static struct clk_rcg2 blsp2_qup4_i2c_apps_clk_src = {
        .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_1,
-               .num_parents = 3,
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -790,8 +829,8 @@ static struct clk_rcg2 blsp2_qup4_spi_apps_clk_src = {
        .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_0,
-               .num_parents = 4,
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -804,8 +843,8 @@ static struct clk_rcg2 blsp2_qup5_i2c_apps_clk_src = {
        .freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup5_i2c_apps_clk_src",
-               .parent_names = gcc_parent_names_1,
-               .num_parents = 3,
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -818,8 +857,8 @@ static struct clk_rcg2 blsp2_qup5_spi_apps_clk_src = {
        .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup5_spi_apps_clk_src",
-               .parent_names = gcc_parent_names_0,
-               .num_parents = 4,
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -832,8 +871,8 @@ static struct clk_rcg2 blsp2_qup6_i2c_apps_clk_src = {
        .freq_tbl = ftbl_blsp1_qup1_i2c_apps_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup6_i2c_apps_clk_src",
-               .parent_names = gcc_parent_names_1,
-               .num_parents = 3,
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -846,8 +885,8 @@ static struct clk_rcg2 blsp2_qup6_spi_apps_clk_src = {
        .freq_tbl = ftbl_blsp1_qup1_spi_apps_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup6_spi_apps_clk_src",
-               .parent_names = gcc_parent_names_0,
-               .num_parents = 4,
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -860,8 +899,8 @@ static struct clk_rcg2 blsp2_uart1_apps_clk_src = {
        .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_0,
-               .num_parents = 4,
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -874,8 +913,8 @@ static struct clk_rcg2 blsp2_uart2_apps_clk_src = {
        .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_0,
-               .num_parents = 4,
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -888,8 +927,8 @@ static struct clk_rcg2 blsp2_uart3_apps_clk_src = {
        .freq_tbl = ftbl_blsp1_uart1_apps_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_uart3_apps_clk_src",
-               .parent_names = gcc_parent_names_0,
-               .num_parents = 4,
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -909,8 +948,8 @@ static struct clk_rcg2 gp1_clk_src = {
        .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 = 5,
+               .parent_data = gcc_parent_data_2,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_2),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -923,8 +962,8 @@ static struct clk_rcg2 gp2_clk_src = {
        .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 = 5,
+               .parent_data = gcc_parent_data_2,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_2),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -937,8 +976,8 @@ static struct clk_rcg2 gp3_clk_src = {
        .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 = 5,
+               .parent_data = gcc_parent_data_2,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_2),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -958,8 +997,8 @@ static struct clk_rcg2 hmss_ahb_clk_src = {
        .freq_tbl = ftbl_hmss_ahb_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "hmss_ahb_clk_src",
-               .parent_names = gcc_parent_names_1,
-               .num_parents = 3,
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -977,8 +1016,8 @@ static struct clk_rcg2 hmss_rbcpr_clk_src = {
        .freq_tbl = ftbl_hmss_rbcpr_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "hmss_rbcpr_clk_src",
-               .parent_names = gcc_parent_names_1,
-               .num_parents = 3,
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -996,8 +1035,8 @@ static struct clk_rcg2 pcie_aux_clk_src = {
        .freq_tbl = ftbl_pcie_aux_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pcie_aux_clk_src",
-               .parent_names = gcc_parent_names_3,
-               .num_parents = 3,
+               .parent_data = gcc_parent_data_3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_3),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1015,8 +1054,8 @@ static struct clk_rcg2 pdm2_clk_src = {
        .freq_tbl = ftbl_pdm2_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pdm2_clk_src",
-               .parent_names = gcc_parent_names_1,
-               .num_parents = 3,
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1040,8 +1079,8 @@ static struct clk_rcg2 sdcc2_apps_clk_src = {
        .freq_tbl = ftbl_sdcc2_apps_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "sdcc2_apps_clk_src",
-               .parent_names = gcc_parent_names_4,
-               .num_parents = 4,
+               .parent_data = gcc_parent_data_4,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_4),
                .ops = &clk_rcg2_floor_ops,
        },
 };
@@ -1064,8 +1103,8 @@ static struct clk_rcg2 sdcc4_apps_clk_src = {
        .freq_tbl = ftbl_sdcc4_apps_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "sdcc4_apps_clk_src",
-               .parent_names = gcc_parent_names_1,
-               .num_parents = 3,
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
                .ops = &clk_rcg2_floor_ops,
        },
 };
@@ -1083,8 +1122,8 @@ static struct clk_rcg2 tsif_ref_clk_src = {
        .freq_tbl = ftbl_tsif_ref_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "tsif_ref_clk_src",
-               .parent_names = gcc_parent_names_5,
-               .num_parents = 4,
+               .parent_data = gcc_parent_data_5,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_5),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1104,8 +1143,8 @@ static struct clk_rcg2 ufs_axi_clk_src = {
        .freq_tbl = ftbl_ufs_axi_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "ufs_axi_clk_src",
-               .parent_names = gcc_parent_names_0,
-               .num_parents = 4,
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1125,8 +1164,8 @@ static struct clk_rcg2 ufs_unipro_core_clk_src = {
        .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_0,
-               .num_parents = 4,
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1147,8 +1186,8 @@ static struct clk_rcg2 usb30_master_clk_src = {
        .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 = 4,
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1161,8 +1200,8 @@ static struct clk_rcg2 usb30_mock_utmi_clk_src = {
        .freq_tbl = ftbl_hmss_rbcpr_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "usb30_mock_utmi_clk_src",
-               .parent_names = gcc_parent_names_0,
-               .num_parents = 4,
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1180,8 +1219,8 @@ static struct clk_rcg2 usb3_phy_aux_clk_src = {
        .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_3,
-               .num_parents = 3,
+               .parent_data = gcc_parent_data_3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_3),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1207,8 +1246,8 @@ static struct clk_branch gcc_aggre1_ufs_axi_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_aggre1_ufs_axi_clk",
-                       .parent_names = (const char *[]){
-                               "ufs_axi_clk_src",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &ufs_axi_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1225,8 +1264,8 @@ static struct clk_branch gcc_aggre1_usb3_axi_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_aggre1_usb3_axi_clk",
-                       .parent_names = (const char *[]){
-                               "usb30_master_clk_src",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &usb30_master_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1348,8 +1387,8 @@ static struct clk_branch gcc_mmss_gpll0_clk = {
                .enable_mask = BIT(1),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mmss_gpll0_clk",
-                       .parent_names = (const char *[]){
-                               "gpll0_out_main",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &gpll0_out_main.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -1390,8 +1429,8 @@ static struct clk_branch gcc_blsp1_qup1_i2c_apps_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp1_qup1_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1408,8 +1447,8 @@ static struct clk_branch gcc_blsp1_qup1_spi_apps_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp1_qup1_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1426,8 +1465,8 @@ static struct clk_branch gcc_blsp1_qup2_i2c_apps_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp1_qup2_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1444,8 +1483,8 @@ static struct clk_branch gcc_blsp1_qup2_spi_apps_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp1_qup2_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1462,8 +1501,8 @@ static struct clk_branch gcc_blsp1_qup3_i2c_apps_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp1_qup3_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1480,8 +1519,8 @@ static struct clk_branch gcc_blsp1_qup3_spi_apps_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp1_qup3_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1498,8 +1537,8 @@ static struct clk_branch gcc_blsp1_qup4_i2c_apps_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp1_qup4_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1516,8 +1555,8 @@ static struct clk_branch gcc_blsp1_qup4_spi_apps_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp1_qup4_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1534,8 +1573,8 @@ static struct clk_branch gcc_blsp1_qup5_i2c_apps_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup5_i2c_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_qup5_i2c_apps_clk_src",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp1_qup5_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1552,8 +1591,8 @@ static struct clk_branch gcc_blsp1_qup5_spi_apps_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup5_spi_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_qup5_spi_apps_clk_src",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp1_qup5_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1570,8 +1609,8 @@ static struct clk_branch gcc_blsp1_qup6_i2c_apps_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup6_i2c_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_qup6_i2c_apps_clk_src",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp1_qup6_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1588,8 +1627,8 @@ static struct clk_branch gcc_blsp1_qup6_spi_apps_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup6_spi_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_qup6_spi_apps_clk_src",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp1_qup6_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1619,8 +1658,8 @@ static struct clk_branch gcc_blsp1_uart1_apps_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp1_uart1_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1637,8 +1676,8 @@ static struct clk_branch gcc_blsp1_uart2_apps_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp1_uart2_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1655,8 +1694,8 @@ static struct clk_branch gcc_blsp1_uart3_apps_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp1_uart3_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1686,8 +1725,8 @@ static struct clk_branch gcc_blsp2_qup1_i2c_apps_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp2_qup1_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1704,8 +1743,8 @@ static struct clk_branch gcc_blsp2_qup1_spi_apps_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp2_qup1_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1722,8 +1761,8 @@ static struct clk_branch gcc_blsp2_qup2_i2c_apps_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp2_qup2_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1740,8 +1779,8 @@ static struct clk_branch gcc_blsp2_qup2_spi_apps_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp2_qup2_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1758,8 +1797,8 @@ static struct clk_branch gcc_blsp2_qup3_i2c_apps_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp2_qup3_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1776,8 +1815,8 @@ static struct clk_branch gcc_blsp2_qup3_spi_apps_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp2_qup3_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1794,8 +1833,8 @@ static struct clk_branch gcc_blsp2_qup4_i2c_apps_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp2_qup4_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1812,8 +1851,8 @@ static struct clk_branch gcc_blsp2_qup4_spi_apps_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp2_qup4_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1830,8 +1869,8 @@ static struct clk_branch gcc_blsp2_qup5_i2c_apps_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup5_i2c_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp2_qup5_i2c_apps_clk_src",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp2_qup5_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1848,8 +1887,8 @@ static struct clk_branch gcc_blsp2_qup5_spi_apps_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup5_spi_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp2_qup5_spi_apps_clk_src",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp2_qup5_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1866,8 +1905,8 @@ static struct clk_branch gcc_blsp2_qup6_i2c_apps_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup6_i2c_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp2_qup6_i2c_apps_clk_src",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp2_qup6_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1884,8 +1923,8 @@ static struct clk_branch gcc_blsp2_qup6_spi_apps_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_qup6_spi_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp2_qup6_spi_apps_clk_src",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp2_qup6_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1915,8 +1954,8 @@ static struct clk_branch gcc_blsp2_uart1_apps_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp2_uart1_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1933,8 +1972,8 @@ static struct clk_branch gcc_blsp2_uart2_apps_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp2_uart2_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1951,8 +1990,8 @@ static struct clk_branch gcc_blsp2_uart3_apps_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp2_uart3_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp2_uart3_apps_clk_src",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp2_uart3_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1969,8 +2008,8 @@ static struct clk_branch gcc_cfg_noc_usb3_axi_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &usb30_master_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1987,8 +2026,8 @@ static struct clk_branch gcc_gp1_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_gp1_clk",
-                       .parent_names = (const char *[]){
-                               "gp1_clk_src",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &gp1_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2005,8 +2044,8 @@ static struct clk_branch gcc_gp2_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_gp2_clk",
-                       .parent_names = (const char *[]){
-                               "gp2_clk_src",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &gp2_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2023,8 +2062,8 @@ static struct clk_branch gcc_gp3_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_gp3_clk",
-                       .parent_names = (const char *[]){
-                               "gp3_clk_src",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &gp3_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2112,8 +2151,8 @@ static struct clk_branch gcc_hmss_ahb_clk = {
                .enable_mask = BIT(21),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_hmss_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "hmss_ahb_clk_src",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &hmss_ahb_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2143,8 +2182,8 @@ static struct clk_branch gcc_hmss_rbcpr_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_hmss_rbcpr_clk",
-                       .parent_names = (const char *[]){
-                               "hmss_rbcpr_clk_src",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &hmss_rbcpr_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2179,8 +2218,8 @@ static struct clk_rcg2 hmss_gpll0_clk_src = {
        .freq_tbl = ftbl_hmss_gpll0_clk_src,
        .clkr.hw.init = &(struct clk_init_data) {
                .name = "hmss_gpll0_clk_src",
-               .parent_names = gcc_parent_names_1,
-               .num_parents = ARRAY_SIZE(gcc_parent_names_1),
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -2264,8 +2303,8 @@ static struct clk_branch gcc_pcie_0_aux_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_pcie_0_aux_clk",
-                       .parent_names = (const char *[]){
-                               "pcie_aux_clk_src",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie_aux_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2334,8 +2373,8 @@ static struct clk_branch gcc_pcie_phy_aux_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_pcie_phy_aux_clk",
-                       .parent_names = (const char *[]){
-                               "pcie_aux_clk_src",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie_aux_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2352,8 +2391,8 @@ static struct clk_branch gcc_pdm2_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_pdm2_clk",
-                       .parent_names = (const char *[]){
-                               "pdm2_clk_src",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pdm2_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2422,8 +2461,8 @@ static struct clk_branch gcc_sdcc2_apps_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc2_apps_clk",
-                       .parent_names = (const char *[]){
-                               "sdcc2_apps_clk_src",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &sdcc2_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2453,8 +2492,8 @@ static struct clk_branch gcc_sdcc4_apps_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc4_apps_clk",
-                       .parent_names = (const char *[]){
-                               "sdcc4_apps_clk_src",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &sdcc4_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2497,8 +2536,8 @@ static struct clk_branch gcc_tsif_ref_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_tsif_ref_clk",
-                       .parent_names = (const char *[]){
-                               "tsif_ref_clk_src",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &tsif_ref_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2528,8 +2567,8 @@ static struct clk_branch gcc_ufs_axi_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ufs_axi_clk",
-                       .parent_names = (const char *[]){
-                               "ufs_axi_clk_src",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &ufs_axi_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2611,8 +2650,8 @@ static struct clk_branch gcc_ufs_unipro_core_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &ufs_unipro_core_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2629,8 +2668,8 @@ static struct clk_branch gcc_usb30_master_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb30_master_clk",
-                       .parent_names = (const char *[]){
-                               "usb30_master_clk_src",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &usb30_master_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2647,8 +2686,8 @@ static struct clk_branch gcc_usb30_mock_utmi_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &usb30_mock_utmi_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2678,8 +2717,8 @@ static struct clk_branch gcc_usb3_phy_aux_clk = {
                .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",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &usb3_phy_aux_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2721,7 +2760,9 @@ static struct clk_branch gcc_hdmi_clkref_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_hdmi_clkref_clk",
-                       .parent_names = (const char *[]){ "xo" },
+                       .parent_data = (const struct clk_parent_data []) {
+                               { .fw_name = "xo" },
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
@@ -2735,7 +2776,9 @@ static struct clk_branch gcc_ufs_clkref_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ufs_clkref_clk",
-                       .parent_names = (const char *[]){ "xo" },
+                       .parent_data = (const struct clk_parent_data []) {
+                               { .fw_name = "xo" },
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
@@ -2749,7 +2792,9 @@ static struct clk_branch gcc_usb3_clkref_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb3_clkref_clk",
-                       .parent_names = (const char *[]){ "xo" },
+                       .parent_data = (const struct clk_parent_data []) {
+                               { .fw_name = "xo" },
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
@@ -2763,7 +2808,9 @@ static struct clk_branch gcc_pcie_clkref_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_pcie_clkref_clk",
-                       .parent_names = (const char *[]){ "xo" },
+                       .parent_data = (const struct clk_parent_data []) {
+                               { .fw_name = "xo" },
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
@@ -2777,7 +2824,9 @@ static struct clk_branch gcc_rx1_usb2_clkref_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_rx1_usb2_clkref_clk",
-                       .parent_names = (const char *[]){ "xo" },
+                       .parent_data = (const struct clk_parent_data []) {
+                               { .fw_name = "xo" },
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
@@ -3115,10 +3164,6 @@ static const struct regmap_config gcc_msm8998_regmap_config = {
        .fast_io        = true,
 };
 
-static struct clk_hw *gcc_msm8998_hws[] = {
-       &xo.hw,
-};
-
 static const struct qcom_cc_desc gcc_msm8998_desc = {
        .config = &gcc_msm8998_regmap_config,
        .clks = gcc_msm8998_clocks,
@@ -3127,8 +3172,6 @@ static const struct qcom_cc_desc gcc_msm8998_desc = {
        .num_resets = ARRAY_SIZE(gcc_msm8998_resets),
        .gdscs = gcc_msm8998_gdscs,
        .num_gdscs = ARRAY_SIZE(gcc_msm8998_gdscs),
-       .clk_hws = gcc_msm8998_hws,
-       .num_clk_hws = ARRAY_SIZE(gcc_msm8998_hws),
 };
 
 static int gcc_msm8998_probe(struct platform_device *pdev)
diff --git a/drivers/clk/qcom/gcc-qcm2290.c b/drivers/clk/qcom/gcc-qcm2290.c
new file mode 100644 (file)
index 0000000..b6fa7b8
--- /dev/null
@@ -0,0 +1,3044 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/err.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+
+#include <dt-bindings/clock/qcom,gcc-qcm2290.h>
+
+#include "clk-alpha-pll.h"
+#include "clk-branch.h"
+#include "clk-rcg.h"
+#include "clk-regmap-divider.h"
+#include "common.h"
+#include "gdsc.h"
+#include "reset.h"
+
+enum {
+       P_BI_TCXO,
+       P_GPLL0_OUT_AUX2,
+       P_GPLL0_OUT_EARLY,
+       P_GPLL10_OUT_MAIN,
+       P_GPLL11_OUT_AUX,
+       P_GPLL11_OUT_AUX2,
+       P_GPLL11_OUT_MAIN,
+       P_GPLL3_OUT_EARLY,
+       P_GPLL3_OUT_MAIN,
+       P_GPLL4_OUT_MAIN,
+       P_GPLL5_OUT_MAIN,
+       P_GPLL6_OUT_EARLY,
+       P_GPLL6_OUT_MAIN,
+       P_GPLL7_OUT_MAIN,
+       P_GPLL8_OUT_EARLY,
+       P_GPLL8_OUT_MAIN,
+       P_GPLL9_OUT_EARLY,
+       P_GPLL9_OUT_MAIN,
+       P_SLEEP_CLK,
+};
+
+static const struct pll_vco brammo_vco[] = {
+       { 500000000, 1250000000, 0 },
+};
+
+static const struct pll_vco default_vco[] = {
+       { 500000000, 1000000000, 2 },
+};
+
+static const struct pll_vco spark_vco[] = {
+       { 750000000, 1500000000, 1 },
+};
+
+static const u8 clk_alpha_pll_regs_offset[][PLL_OFF_MAX_REGS] = {
+       [CLK_ALPHA_PLL_TYPE_DEFAULT] =  {
+               [PLL_OFF_L_VAL] = 0x04,
+               [PLL_OFF_ALPHA_VAL] = 0x08,
+               [PLL_OFF_ALPHA_VAL_U] = 0x0c,
+               [PLL_OFF_TEST_CTL] = 0x10,
+               [PLL_OFF_TEST_CTL_U] = 0x14,
+               [PLL_OFF_USER_CTL] = 0x18,
+               [PLL_OFF_USER_CTL_U] = 0x1C,
+               [PLL_OFF_CONFIG_CTL] = 0x20,
+               [PLL_OFF_STATUS] = 0x24,
+       },
+       [CLK_ALPHA_PLL_TYPE_BRAMMO] =  {
+               [PLL_OFF_L_VAL] = 0x04,
+               [PLL_OFF_ALPHA_VAL] = 0x08,
+               [PLL_OFF_ALPHA_VAL_U] = 0x0c,
+               [PLL_OFF_TEST_CTL] = 0x10,
+               [PLL_OFF_TEST_CTL_U] = 0x14,
+               [PLL_OFF_USER_CTL] = 0x18,
+               [PLL_OFF_CONFIG_CTL] = 0x1C,
+               [PLL_OFF_STATUS] = 0x20,
+       },
+};
+
+static struct clk_alpha_pll gpll0 = {
+       .offset = 0x0,
+       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .enable_reg = 0x79000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll0",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "bi_tcxo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static const struct clk_div_table post_div_table_gpll0_out_aux2[] = {
+       { 0x1, 2 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv gpll0_out_aux2 = {
+       .offset = 0x0,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_gpll0_out_aux2,
+       .num_post_div = ARRAY_SIZE(post_div_table_gpll0_out_aux2),
+       .width = 4,
+       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll0_out_aux2",
+               .parent_hws = (const struct clk_hw *[]){ &gpll0.clkr.hw },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_ro_ops,
+       },
+};
+
+static struct clk_alpha_pll gpll1 = {
+       .offset = 0x1000,
+       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .enable_reg = 0x79000,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll1",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "bi_tcxo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+/* 1152MHz configuration */
+static const struct alpha_pll_config gpll10_config = {
+       .l = 0x3c,
+       .alpha = 0x0,
+       .vco_val = 0x1 << 20,
+       .vco_mask = GENMASK(21, 20),
+       .main_output_mask = BIT(0),
+       .config_ctl_val = 0x4001055B,
+       .test_ctl_hi1_val = 0x1,
+};
+
+static struct clk_alpha_pll gpll10 = {
+       .offset = 0xa000,
+       .vco_table = spark_vco,
+       .num_vco = ARRAY_SIZE(spark_vco),
+       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .enable_reg = 0x79000,
+               .enable_mask = BIT(10),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll10",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "bi_tcxo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+/* 532MHz configuration */
+static const struct alpha_pll_config gpll11_config = {
+       .l = 0x1B,
+       .alpha = 0x55555555,
+       .alpha_hi = 0xB5,
+       .alpha_en_mask = BIT(24),
+       .vco_val = 0x2 << 20,
+       .vco_mask = GENMASK(21, 20),
+       .main_output_mask = BIT(0),
+       .config_ctl_val = 0x4001055B,
+       .test_ctl_hi1_val = 0x1,
+};
+
+static struct clk_alpha_pll gpll11 = {
+       .offset = 0xb000,
+       .vco_table = default_vco,
+       .num_vco = ARRAY_SIZE(default_vco),
+       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .flags = SUPPORTS_DYNAMIC_UPDATE,
+       .clkr = {
+               .enable_reg = 0x79000,
+               .enable_mask = BIT(11),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll11",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "bi_tcxo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll gpll3 = {
+       .offset = 0x3000,
+       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .enable_reg = 0x79000,
+               .enable_mask = BIT(3),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll3",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "bi_tcxo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static const struct clk_div_table post_div_table_gpll3_out_main[] = {
+       { 0x1, 2 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv gpll3_out_main = {
+       .offset = 0x3000,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_gpll3_out_main,
+       .num_post_div = ARRAY_SIZE(post_div_table_gpll3_out_main),
+       .width = 4,
+       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll3_out_main",
+               .parent_hws = (const struct clk_hw *[]){ &gpll3.clkr.hw },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_ro_ops,
+       },
+};
+
+static struct clk_alpha_pll gpll4 = {
+       .offset = 0x4000,
+       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .enable_reg = 0x79000,
+               .enable_mask = BIT(4),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll4",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "bi_tcxo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll gpll5 = {
+       .offset = 0x5000,
+       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .enable_reg = 0x79000,
+               .enable_mask = BIT(5),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll5",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "bi_tcxo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll gpll6 = {
+       .offset = 0x6000,
+       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .enable_reg = 0x79000,
+               .enable_mask = BIT(6),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll6",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "bi_tcxo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static const struct clk_div_table post_div_table_gpll6_out_main[] = {
+       { 0x1, 2 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv gpll6_out_main = {
+       .offset = 0x6000,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_gpll6_out_main,
+       .num_post_div = ARRAY_SIZE(post_div_table_gpll6_out_main),
+       .width = 4,
+       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll6_out_main",
+               .parent_hws = (const struct clk_hw *[]){ &gpll6.clkr.hw },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_ro_ops,
+       },
+};
+
+static struct clk_alpha_pll gpll7 = {
+       .offset = 0x7000,
+       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .enable_reg = 0x79000,
+               .enable_mask = BIT(7),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll7",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "bi_tcxo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+/* 533.2MHz configuration */
+static const struct alpha_pll_config gpll8_config = {
+       .l = 0x1B,
+       .alpha = 0x55555555,
+       .alpha_hi = 0xC5,
+       .alpha_en_mask = BIT(24),
+       .vco_val = 0x2 << 20,
+       .vco_mask = GENMASK(21, 20),
+       .main_output_mask = BIT(0),
+       .early_output_mask = BIT(3),
+       .post_div_val = 0x1 << 8,
+       .post_div_mask = GENMASK(11, 8),
+       .config_ctl_val = 0x4001055B,
+       .test_ctl_hi1_val = 0x1,
+};
+
+static struct clk_alpha_pll gpll8 = {
+       .offset = 0x8000,
+       .vco_table = default_vco,
+       .num_vco = ARRAY_SIZE(default_vco),
+       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .flags = SUPPORTS_DYNAMIC_UPDATE,
+       .clkr = {
+               .enable_reg = 0x79000,
+               .enable_mask = BIT(8),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll8",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "bi_tcxo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static const struct clk_div_table post_div_table_gpll8_out_main[] = {
+       { 0x1, 2 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv gpll8_out_main = {
+       .offset = 0x8000,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_gpll8_out_main,
+       .num_post_div = ARRAY_SIZE(post_div_table_gpll8_out_main),
+       .width = 4,
+       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll8_out_main",
+               .parent_hws = (const struct clk_hw *[]){ &gpll8.clkr.hw },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_alpha_pll_postdiv_ro_ops,
+       },
+};
+
+/* 1152MHz configuration */
+static const struct alpha_pll_config gpll9_config = {
+       .l = 0x3C,
+       .alpha = 0x0,
+       .post_div_val = 0x1 << 8,
+       .post_div_mask = GENMASK(9, 8),
+       .main_output_mask = BIT(0),
+       .early_output_mask = BIT(3),
+       .config_ctl_val = 0x00004289,
+       .test_ctl_val = 0x08000000,
+};
+
+static struct clk_alpha_pll gpll9 = {
+       .offset = 0x9000,
+       .vco_table = brammo_vco,
+       .num_vco = ARRAY_SIZE(brammo_vco),
+       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_BRAMMO],
+       .clkr = {
+               .enable_reg = 0x79000,
+               .enable_mask = BIT(9),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll9",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "bi_tcxo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static const struct clk_div_table post_div_table_gpll9_out_main[] = {
+       { 0x1, 2 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv gpll9_out_main = {
+       .offset = 0x9000,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_gpll9_out_main,
+       .num_post_div = ARRAY_SIZE(post_div_table_gpll9_out_main),
+       .width = 2,
+       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_BRAMMO],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll9_out_main",
+               .parent_hws = (const struct clk_hw *[]){ &gpll9.clkr.hw },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_alpha_pll_postdiv_ro_ops,
+       },
+};
+
+static const struct parent_map gcc_parent_map_0[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_EARLY, 1 },
+       { P_GPLL0_OUT_AUX2, 2 },
+};
+
+static const struct clk_parent_data gcc_parents_0[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_aux2.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_1[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_EARLY, 1 },
+       { P_GPLL0_OUT_AUX2, 2 },
+       { P_GPLL6_OUT_MAIN, 4 },
+};
+
+static const struct clk_parent_data gcc_parents_1[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_aux2.clkr.hw },
+       { .hw = &gpll6_out_main.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_2[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_EARLY, 1 },
+       { P_GPLL0_OUT_AUX2, 2 },
+       { P_SLEEP_CLK, 5 },
+};
+
+static const struct clk_parent_data gcc_parents_2[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_aux2.clkr.hw },
+       { .fw_name = "sleep_clk" },
+};
+
+static const struct parent_map gcc_parent_map_3[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_EARLY, 1 },
+       { P_GPLL9_OUT_EARLY, 2 },
+       { P_GPLL10_OUT_MAIN, 3 },
+       { P_GPLL9_OUT_MAIN, 5 },
+       { P_GPLL3_OUT_MAIN, 6 },
+};
+
+static const struct clk_parent_data gcc_parents_3[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll9.clkr.hw },
+       { .hw = &gpll10.clkr.hw },
+       { .hw = &gpll9_out_main.clkr.hw },
+       { .hw = &gpll3_out_main.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_4[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_EARLY, 1 },
+       { P_GPLL0_OUT_AUX2, 2 },
+       { P_GPLL10_OUT_MAIN, 3 },
+       { P_GPLL4_OUT_MAIN, 5 },
+       { P_GPLL3_OUT_EARLY, 6 },
+};
+
+static const struct clk_parent_data gcc_parents_4[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_aux2.clkr.hw },
+       { .hw = &gpll10.clkr.hw },
+       { .hw = &gpll4.clkr.hw },
+       { .hw = &gpll3.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_5[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_EARLY, 1 },
+       { P_GPLL0_OUT_AUX2, 2 },
+       { P_GPLL4_OUT_MAIN, 5 },
+       { P_GPLL3_OUT_MAIN, 6 },
+};
+
+static const struct clk_parent_data gcc_parents_5[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_aux2.clkr.hw },
+       { .hw = &gpll4.clkr.hw },
+       { .hw = &gpll3_out_main.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_6[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_EARLY, 1 },
+       { P_GPLL8_OUT_EARLY, 2 },
+       { P_GPLL10_OUT_MAIN, 3 },
+       { P_GPLL8_OUT_MAIN, 4 },
+       { P_GPLL9_OUT_MAIN, 5 },
+       { P_GPLL3_OUT_EARLY, 6 },
+};
+
+static const struct clk_parent_data gcc_parents_6[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll8.clkr.hw },
+       { .hw = &gpll10.clkr.hw },
+       { .hw = &gpll8_out_main.clkr.hw },
+       { .hw = &gpll9_out_main.clkr.hw },
+       { .hw = &gpll3.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_7[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_EARLY, 1 },
+       { P_GPLL8_OUT_EARLY, 2 },
+       { P_GPLL10_OUT_MAIN, 3 },
+       { P_GPLL8_OUT_MAIN, 4 },
+       { P_GPLL9_OUT_MAIN, 5 },
+       { P_GPLL3_OUT_MAIN, 6 },
+};
+
+static const struct clk_parent_data gcc_parents_7[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll8.clkr.hw },
+       { .hw = &gpll10.clkr.hw },
+       { .hw = &gpll8_out_main.clkr.hw },
+       { .hw = &gpll9_out_main.clkr.hw },
+       { .hw = &gpll3_out_main.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_8[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_EARLY, 1 },
+       { P_GPLL8_OUT_EARLY, 2 },
+       { P_GPLL10_OUT_MAIN, 3 },
+       { P_GPLL6_OUT_MAIN, 4 },
+       { P_GPLL9_OUT_MAIN, 5 },
+       { P_GPLL3_OUT_EARLY, 6 },
+};
+
+static const struct clk_parent_data gcc_parents_8[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll8.clkr.hw },
+       { .hw = &gpll10.clkr.hw },
+       { .hw = &gpll6_out_main.clkr.hw },
+       { .hw = &gpll9_out_main.clkr.hw },
+       { .hw = &gpll3.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_9[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_EARLY, 1 },
+       { P_GPLL0_OUT_AUX2, 2 },
+       { P_GPLL10_OUT_MAIN, 3 },
+       { P_GPLL8_OUT_MAIN, 4 },
+       { P_GPLL9_OUT_MAIN, 5 },
+       { P_GPLL3_OUT_EARLY, 6 },
+};
+
+static const struct clk_parent_data gcc_parents_9[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_aux2.clkr.hw },
+       { .hw = &gpll10.clkr.hw },
+       { .hw = &gpll8_out_main.clkr.hw },
+       { .hw = &gpll9_out_main.clkr.hw },
+       { .hw = &gpll3.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_10[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_EARLY, 1 },
+       { P_GPLL8_OUT_EARLY, 2 },
+       { P_GPLL10_OUT_MAIN, 3 },
+       { P_GPLL6_OUT_EARLY, 5 },
+       { P_GPLL3_OUT_MAIN, 6 },
+};
+
+static const struct clk_parent_data gcc_parents_10[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll8.clkr.hw },
+       { .hw = &gpll10.clkr.hw },
+       { .hw = &gpll6.clkr.hw },
+       { .hw = &gpll3_out_main.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_12[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_EARLY, 1 },
+       { P_GPLL0_OUT_AUX2, 2 },
+       { P_GPLL7_OUT_MAIN, 3 },
+       { P_GPLL4_OUT_MAIN, 5 },
+};
+
+static const struct clk_parent_data gcc_parents_12[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_aux2.clkr.hw },
+       { .hw = &gpll7.clkr.hw },
+       { .hw = &gpll4.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_13[] = {
+       { P_BI_TCXO, 0 },
+       { P_SLEEP_CLK, 5 },
+};
+
+static const struct clk_parent_data gcc_parents_13[] = {
+       { .fw_name = "bi_tcxo" },
+       { .fw_name = "sleep_clk" },
+};
+
+static const struct parent_map gcc_parent_map_14[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL11_OUT_MAIN, 1 },
+       { P_GPLL11_OUT_AUX, 2 },
+       { P_GPLL11_OUT_AUX2, 3 },
+};
+
+static const struct clk_parent_data gcc_parents_14[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll11.clkr.hw },
+       { .hw = &gpll11.clkr.hw },
+       { .hw = &gpll11.clkr.hw },
+};
+
+static const struct freq_tbl ftbl_gcc_usb30_prim_mock_utmi_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_usb30_prim_mock_utmi_clk_src = {
+       .cmd_rcgr = 0x1a034,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_usb30_prim_mock_utmi_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_usb30_prim_mock_utmi_clk_src",
+               .parent_data = gcc_parents_0,
+               .num_parents = ARRAY_SIZE(gcc_parents_0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_regmap_div gcc_usb30_prim_mock_utmi_postdiv = {
+       .reg = 0x1a04c,
+       .shift = 0,
+       .width = 2,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gcc_usb30_prim_mock_utmi_postdiv",
+               .parent_hws = (const struct clk_hw *[])
+                               { &gcc_usb30_prim_mock_utmi_clk_src.clkr.hw },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_regmap_div_ro_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_camss_axi_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(150000000, P_GPLL0_OUT_AUX2, 2, 0, 0),
+       F(200000000, P_GPLL0_OUT_AUX2, 1.5, 0, 0),
+       F(300000000, P_GPLL0_OUT_AUX2, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_camss_axi_clk_src = {
+       .cmd_rcgr = 0x5802c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_4,
+       .freq_tbl = ftbl_gcc_camss_axi_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_camss_axi_clk_src",
+               .parent_data = gcc_parents_4,
+               .num_parents = ARRAY_SIZE(gcc_parents_4),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_camss_cci_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(37500000, P_GPLL0_OUT_AUX2, 8, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_camss_cci_clk_src = {
+       .cmd_rcgr = 0x56000,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_9,
+       .freq_tbl = ftbl_gcc_camss_cci_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_camss_cci_clk_src",
+               .parent_data = gcc_parents_9,
+               .num_parents = ARRAY_SIZE(gcc_parents_9),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_camss_csi0phytimer_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(100000000, P_GPLL0_OUT_AUX2, 3, 0, 0),
+       F(200000000, P_GPLL0_OUT_AUX2, 1.5, 0, 0),
+       F(268800000, P_GPLL4_OUT_MAIN, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_camss_csi0phytimer_clk_src = {
+       .cmd_rcgr = 0x45000,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_5,
+       .freq_tbl = ftbl_gcc_camss_csi0phytimer_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_camss_csi0phytimer_clk_src",
+               .parent_data = gcc_parents_5,
+               .num_parents = ARRAY_SIZE(gcc_parents_5),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_camss_csi1phytimer_clk_src = {
+       .cmd_rcgr = 0x4501c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_5,
+       .freq_tbl = ftbl_gcc_camss_csi0phytimer_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_camss_csi1phytimer_clk_src",
+               .parent_data = gcc_parents_5,
+               .num_parents = ARRAY_SIZE(gcc_parents_5),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_camss_mclk0_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(24000000, P_GPLL9_OUT_MAIN, 1, 1, 24),
+       F(64000000, P_GPLL9_OUT_EARLY, 9, 1, 2),
+       { }
+};
+
+static struct clk_rcg2 gcc_camss_mclk0_clk_src = {
+       .cmd_rcgr = 0x51000,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_3,
+       .freq_tbl = ftbl_gcc_camss_mclk0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_camss_mclk0_clk_src",
+               .parent_data = gcc_parents_3,
+               .num_parents = ARRAY_SIZE(gcc_parents_3),
+               .flags = CLK_OPS_PARENT_ENABLE,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_camss_mclk1_clk_src = {
+       .cmd_rcgr = 0x5101c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_3,
+       .freq_tbl = ftbl_gcc_camss_mclk0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_camss_mclk1_clk_src",
+               .parent_data = gcc_parents_3,
+               .num_parents = ARRAY_SIZE(gcc_parents_3),
+               .flags = CLK_OPS_PARENT_ENABLE,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_camss_mclk2_clk_src = {
+       .cmd_rcgr = 0x51038,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_3,
+       .freq_tbl = ftbl_gcc_camss_mclk0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_camss_mclk2_clk_src",
+               .parent_data = gcc_parents_3,
+               .num_parents = ARRAY_SIZE(gcc_parents_3),
+               .flags = CLK_OPS_PARENT_ENABLE,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_camss_mclk3_clk_src = {
+       .cmd_rcgr = 0x51054,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_3,
+       .freq_tbl = ftbl_gcc_camss_mclk0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_camss_mclk3_clk_src",
+               .parent_data = gcc_parents_3,
+               .num_parents = ARRAY_SIZE(gcc_parents_3),
+               .flags = CLK_OPS_PARENT_ENABLE,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_camss_ope_ahb_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(171428571, P_GPLL0_OUT_EARLY, 3.5, 0, 0),
+       F(240000000, P_GPLL0_OUT_EARLY, 2.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_camss_ope_ahb_clk_src = {
+       .cmd_rcgr = 0x55024,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_6,
+       .freq_tbl = ftbl_gcc_camss_ope_ahb_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_camss_ope_ahb_clk_src",
+               .parent_data = gcc_parents_6,
+               .num_parents = ARRAY_SIZE(gcc_parents_6),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_camss_ope_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(200000000, P_GPLL8_OUT_MAIN, 2, 0, 0),
+       F(266600000, P_GPLL8_OUT_MAIN, 1, 0, 0),
+       F(465000000, P_GPLL8_OUT_MAIN, 1, 0, 0),
+       F(580000000, P_GPLL8_OUT_EARLY, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_camss_ope_clk_src = {
+       .cmd_rcgr = 0x55004,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_6,
+       .freq_tbl = ftbl_gcc_camss_ope_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_camss_ope_clk_src",
+               .parent_data = gcc_parents_6,
+               .num_parents = ARRAY_SIZE(gcc_parents_6),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_camss_tfe_0_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(128000000, P_GPLL10_OUT_MAIN, 9, 0, 0),
+       F(135529412, P_GPLL10_OUT_MAIN, 8.5, 0, 0),
+       F(144000000, P_GPLL10_OUT_MAIN, 8, 0, 0),
+       F(153600000, P_GPLL10_OUT_MAIN, 7.5, 0, 0),
+       F(164571429, P_GPLL10_OUT_MAIN, 7, 0, 0),
+       F(177230769, P_GPLL10_OUT_MAIN, 6.5, 0, 0),
+       F(192000000, P_GPLL10_OUT_MAIN, 6, 0, 0),
+       F(209454545, P_GPLL10_OUT_MAIN, 5.5, 0, 0),
+       F(230400000, P_GPLL10_OUT_MAIN, 5, 0, 0),
+       F(256000000, P_GPLL10_OUT_MAIN, 4.5, 0, 0),
+       F(288000000, P_GPLL10_OUT_MAIN, 4, 0, 0),
+       F(329142857, P_GPLL10_OUT_MAIN, 3.5, 0, 0),
+       F(384000000, P_GPLL10_OUT_MAIN, 3, 0, 0),
+       F(460800000, P_GPLL10_OUT_MAIN, 2.5, 0, 0),
+       F(576000000, P_GPLL10_OUT_MAIN, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_camss_tfe_0_clk_src = {
+       .cmd_rcgr = 0x52004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_7,
+       .freq_tbl = ftbl_gcc_camss_tfe_0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_camss_tfe_0_clk_src",
+               .parent_data = gcc_parents_7,
+               .num_parents = ARRAY_SIZE(gcc_parents_7),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_camss_tfe_0_csid_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(120000000, P_GPLL0_OUT_EARLY, 5, 0, 0),
+       F(192000000, P_GPLL6_OUT_MAIN, 2, 0, 0),
+       F(240000000, P_GPLL0_OUT_EARLY, 2.5, 0, 0),
+       F(384000000, P_GPLL6_OUT_MAIN, 1, 0, 0),
+       F(426400000, P_GPLL3_OUT_EARLY, 2.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_camss_tfe_0_csid_clk_src = {
+       .cmd_rcgr = 0x52094,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_8,
+       .freq_tbl = ftbl_gcc_camss_tfe_0_csid_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_camss_tfe_0_csid_clk_src",
+               .parent_data = gcc_parents_8,
+               .num_parents = ARRAY_SIZE(gcc_parents_8),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_camss_tfe_1_clk_src = {
+       .cmd_rcgr = 0x52024,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_7,
+       .freq_tbl = ftbl_gcc_camss_tfe_0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_camss_tfe_1_clk_src",
+               .parent_data = gcc_parents_7,
+               .num_parents = ARRAY_SIZE(gcc_parents_7),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_camss_tfe_1_csid_clk_src = {
+       .cmd_rcgr = 0x520b4,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_8,
+       .freq_tbl = ftbl_gcc_camss_tfe_0_csid_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_camss_tfe_1_csid_clk_src",
+               .parent_data = gcc_parents_8,
+               .num_parents = ARRAY_SIZE(gcc_parents_8),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_camss_tfe_cphy_rx_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(240000000, P_GPLL0_OUT_EARLY, 2.5, 0, 0),
+       F(341333333, P_GPLL6_OUT_EARLY, 1, 4, 9),
+       F(384000000, P_GPLL6_OUT_EARLY, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_camss_tfe_cphy_rx_clk_src = {
+       .cmd_rcgr = 0x52064,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_10,
+       .freq_tbl = ftbl_gcc_camss_tfe_cphy_rx_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_camss_tfe_cphy_rx_clk_src",
+               .parent_data = gcc_parents_10,
+               .num_parents = ARRAY_SIZE(gcc_parents_10),
+               .flags = CLK_OPS_PARENT_ENABLE,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_camss_top_ahb_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(40000000, P_GPLL0_OUT_AUX2, 7.5, 0, 0),
+       F(80000000, P_GPLL0_OUT_EARLY, 7.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_camss_top_ahb_clk_src = {
+       .cmd_rcgr = 0x58010,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_4,
+       .freq_tbl = ftbl_gcc_camss_top_ahb_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_camss_top_ahb_clk_src",
+               .parent_data = gcc_parents_4,
+               .num_parents = ARRAY_SIZE(gcc_parents_4),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_gp1_clk_src[] = {
+       F(25000000, P_GPLL0_OUT_AUX2, 12, 0, 0),
+       F(50000000, P_GPLL0_OUT_AUX2, 6, 0, 0),
+       F(100000000, P_GPLL0_OUT_AUX2, 3, 0, 0),
+       F(200000000, P_GPLL0_OUT_AUX2, 1.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_gp1_clk_src = {
+       .cmd_rcgr = 0x4d004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_2,
+       .freq_tbl = ftbl_gcc_gp1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_gp1_clk_src",
+               .parent_data = gcc_parents_2,
+               .num_parents = ARRAY_SIZE(gcc_parents_2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_gp2_clk_src = {
+       .cmd_rcgr = 0x4e004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_2,
+       .freq_tbl = ftbl_gcc_gp1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_gp2_clk_src",
+               .parent_data = gcc_parents_2,
+               .num_parents = ARRAY_SIZE(gcc_parents_2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_gp3_clk_src = {
+       .cmd_rcgr = 0x4f004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_2,
+       .freq_tbl = ftbl_gcc_gp1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_gp3_clk_src",
+               .parent_data = gcc_parents_2,
+               .num_parents = ARRAY_SIZE(gcc_parents_2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_pdm2_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(60000000, P_GPLL0_OUT_AUX2, 5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_pdm2_clk_src = {
+       .cmd_rcgr = 0x20010,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_pdm2_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_pdm2_clk_src",
+               .parent_data = gcc_parents_0,
+               .num_parents = ARRAY_SIZE(gcc_parents_0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_qupv3_wrap0_s0_clk_src[] = {
+       F(7372800, P_GPLL0_OUT_AUX2, 1, 384, 15625),
+       F(14745600, P_GPLL0_OUT_AUX2, 1, 768, 15625),
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(29491200, P_GPLL0_OUT_AUX2, 1, 1536, 15625),
+       F(32000000, P_GPLL0_OUT_AUX2, 1, 8, 75),
+       F(48000000, P_GPLL0_OUT_AUX2, 1, 4, 25),
+       F(64000000, P_GPLL0_OUT_AUX2, 1, 16, 75),
+       F(75000000, P_GPLL0_OUT_AUX2, 4, 0, 0),
+       F(80000000, P_GPLL0_OUT_AUX2, 1, 4, 15),
+       F(96000000, P_GPLL0_OUT_AUX2, 1, 8, 25),
+       F(100000000, P_GPLL0_OUT_AUX2, 3, 0, 0),
+       F(102400000, P_GPLL0_OUT_AUX2, 1, 128, 375),
+       F(112000000, P_GPLL0_OUT_AUX2, 1, 28, 75),
+       F(117964800, P_GPLL0_OUT_AUX2, 1, 6144, 15625),
+       F(120000000, P_GPLL0_OUT_AUX2, 2.5, 0, 0),
+       F(128000000, P_GPLL6_OUT_MAIN, 3, 0, 0),
+       { }
+};
+
+static struct clk_init_data gcc_qupv3_wrap0_s0_clk_src_init = {
+       .name = "gcc_qupv3_wrap0_s0_clk_src",
+       .parent_data = gcc_parents_1,
+       .num_parents = ARRAY_SIZE(gcc_parents_1),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap0_s0_clk_src = {
+       .cmd_rcgr = 0x1f148,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_1,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap0_s0_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap0_s1_clk_src_init = {
+       .name = "gcc_qupv3_wrap0_s1_clk_src",
+       .parent_data = gcc_parents_1,
+       .num_parents = ARRAY_SIZE(gcc_parents_1),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap0_s1_clk_src = {
+       .cmd_rcgr = 0x1f278,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_1,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap0_s1_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap0_s2_clk_src_init = {
+       .name = "gcc_qupv3_wrap0_s2_clk_src",
+       .parent_data = gcc_parents_1,
+       .num_parents = ARRAY_SIZE(gcc_parents_1),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap0_s2_clk_src = {
+       .cmd_rcgr = 0x1f3a8,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_1,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap0_s2_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap0_s3_clk_src_init = {
+       .name = "gcc_qupv3_wrap0_s3_clk_src",
+       .parent_data = gcc_parents_1,
+       .num_parents = ARRAY_SIZE(gcc_parents_1),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap0_s3_clk_src = {
+       .cmd_rcgr = 0x1f4d8,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_1,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap0_s3_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap0_s4_clk_src_init = {
+       .name = "gcc_qupv3_wrap0_s4_clk_src",
+       .parent_data = gcc_parents_1,
+       .num_parents = ARRAY_SIZE(gcc_parents_1),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap0_s4_clk_src = {
+       .cmd_rcgr = 0x1f608,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_1,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap0_s4_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap0_s5_clk_src_init = {
+       .name = "gcc_qupv3_wrap0_s5_clk_src",
+       .parent_data = gcc_parents_1,
+       .num_parents = ARRAY_SIZE(gcc_parents_1),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap0_s5_clk_src = {
+       .cmd_rcgr = 0x1f738,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_1,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap0_s5_clk_src_init,
+};
+
+static const struct freq_tbl ftbl_gcc_sdcc1_apps_clk_src[] = {
+       F(144000, P_BI_TCXO, 16, 3, 25),
+       F(400000, P_BI_TCXO, 12, 1, 4),
+       F(20000000, P_GPLL0_OUT_AUX2, 5, 1, 3),
+       F(25000000, P_GPLL0_OUT_AUX2, 6, 1, 2),
+       F(50000000, P_GPLL0_OUT_AUX2, 6, 0, 0),
+       F(100000000, P_GPLL0_OUT_AUX2, 3, 0, 0),
+       F(192000000, P_GPLL6_OUT_MAIN, 2, 0, 0),
+       F(384000000, P_GPLL6_OUT_MAIN, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_sdcc1_apps_clk_src = {
+       .cmd_rcgr = 0x38028,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_1,
+       .freq_tbl = ftbl_gcc_sdcc1_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_sdcc1_apps_clk_src",
+               .parent_data = gcc_parents_1,
+               .num_parents = ARRAY_SIZE(gcc_parents_1),
+               .ops = &clk_rcg2_floor_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_sdcc1_ice_core_clk_src[] = {
+       F(75000000, P_GPLL0_OUT_AUX2, 4, 0, 0),
+       F(100000000, P_GPLL0_OUT_AUX2, 3, 0, 0),
+       F(150000000, P_GPLL0_OUT_AUX2, 2, 0, 0),
+       F(200000000, P_GPLL0_OUT_EARLY, 3, 0, 0),
+       F(300000000, P_GPLL0_OUT_AUX2, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_sdcc1_ice_core_clk_src = {
+       .cmd_rcgr = 0x38010,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_sdcc1_ice_core_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_sdcc1_ice_core_clk_src",
+               .parent_data = gcc_parents_0,
+               .num_parents = ARRAY_SIZE(gcc_parents_0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_sdcc2_apps_clk_src[] = {
+       F(400000, P_BI_TCXO, 12, 1, 4),
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(25000000, P_GPLL0_OUT_AUX2, 12, 0, 0),
+       F(50000000, P_GPLL0_OUT_AUX2, 6, 0, 0),
+       F(100000000, P_GPLL0_OUT_AUX2, 3, 0, 0),
+       F(202000000, P_GPLL7_OUT_MAIN, 4, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_sdcc2_apps_clk_src = {
+       .cmd_rcgr = 0x1e00c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_12,
+       .freq_tbl = ftbl_gcc_sdcc2_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_sdcc2_apps_clk_src",
+               .parent_data = gcc_parents_12,
+               .num_parents = ARRAY_SIZE(gcc_parents_12),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_usb30_prim_master_clk_src[] = {
+       F(66666667, P_GPLL0_OUT_AUX2, 4.5, 0, 0),
+       F(133333333, P_GPLL0_OUT_EARLY, 4.5, 0, 0),
+       F(200000000, P_GPLL0_OUT_EARLY, 3, 0, 0),
+       F(240000000, P_GPLL0_OUT_EARLY, 2.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_usb30_prim_master_clk_src = {
+       .cmd_rcgr = 0x1a01c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_usb30_prim_master_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_usb30_prim_master_clk_src",
+               .parent_data = gcc_parents_0,
+               .num_parents = ARRAY_SIZE(gcc_parents_0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_usb3_prim_phy_aux_clk_src = {
+       .cmd_rcgr = 0x1a060,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_13,
+       .freq_tbl = ftbl_gcc_usb30_prim_mock_utmi_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_usb3_prim_phy_aux_clk_src",
+               .parent_data = gcc_parents_13,
+               .num_parents = ARRAY_SIZE(gcc_parents_13),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_video_venus_clk_src[] = {
+       F(133333333, P_GPLL11_OUT_MAIN, 4.5, 0, 0),
+       F(240000000, P_GPLL11_OUT_MAIN, 2.5, 0, 0),
+       F(300000000, P_GPLL11_OUT_MAIN, 2, 0, 0),
+       F(384000000, P_GPLL11_OUT_MAIN, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_video_venus_clk_src = {
+       .cmd_rcgr = 0x58060,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_14,
+       .freq_tbl = ftbl_gcc_video_venus_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_video_venus_clk_src",
+               .parent_data = gcc_parents_14,
+               .num_parents = ARRAY_SIZE(gcc_parents_14),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_ahb2phy_csi_clk = {
+       .halt_reg = 0x1d004,
+       .halt_check = BRANCH_HALT_DELAY,
+       .hwcg_reg = 0x1d004,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x1d004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ahb2phy_csi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ahb2phy_usb_clk = {
+       .halt_reg = 0x1d008,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x1d008,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x1d008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ahb2phy_usb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_bimc_gpu_axi_clk = {
+       .halt_reg = 0x71154,
+       .halt_check = BRANCH_HALT_DELAY,
+       .hwcg_reg = 0x71154,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x71154,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_bimc_gpu_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_boot_rom_ahb_clk = {
+       .halt_reg = 0x23004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x23004,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x79004,
+               .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_cam_throttle_nrt_clk = {
+       .halt_reg = 0x17070,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x17070,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x79004,
+               .enable_mask = BIT(27),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_cam_throttle_nrt_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_cam_throttle_rt_clk = {
+       .halt_reg = 0x1706c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x1706c,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x79004,
+               .enable_mask = BIT(26),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_cam_throttle_rt_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camera_ahb_clk = {
+       .halt_reg = 0x17008,
+       .halt_check = BRANCH_HALT_DELAY,
+       .hwcg_reg = 0x17008,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x17008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camera_ahb_clk",
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camera_xo_clk = {
+       .halt_reg = 0x17028,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x17028,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camera_xo_clk",
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_axi_clk = {
+       .halt_reg = 0x58044,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x58044,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_axi_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_camss_axi_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_camnoc_atb_clk = {
+       .halt_reg = 0x5804c,
+       .halt_check = BRANCH_HALT_DELAY,
+       .hwcg_reg = 0x5804c,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x5804c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_camnoc_atb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_camnoc_nts_xo_clk = {
+       .halt_reg = 0x58050,
+       .halt_check = BRANCH_HALT_DELAY,
+       .hwcg_reg = 0x58050,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x58050,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_camnoc_nts_xo_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_cci_0_clk = {
+       .halt_reg = 0x56018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x56018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_cci_0_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_camss_cci_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_cphy_0_clk = {
+       .halt_reg = 0x52088,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x52088,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_cphy_0_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                               { &gcc_camss_tfe_cphy_rx_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_cphy_1_clk = {
+       .halt_reg = 0x5208c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5208c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_cphy_1_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                               { &gcc_camss_tfe_cphy_rx_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_csi0phytimer_clk = {
+       .halt_reg = 0x45018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x45018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_csi0phytimer_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                               { &gcc_camss_csi0phytimer_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_csi1phytimer_clk = {
+       .halt_reg = 0x45034,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x45034,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_csi1phytimer_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                               { &gcc_camss_csi1phytimer_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_mclk0_clk = {
+       .halt_reg = 0x51018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x51018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_mclk0_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_camss_mclk0_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_mclk1_clk = {
+       .halt_reg = 0x51034,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x51034,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_mclk1_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_camss_mclk1_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_mclk2_clk = {
+       .halt_reg = 0x51050,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x51050,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_mclk2_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_camss_mclk2_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_mclk3_clk = {
+       .halt_reg = 0x5106c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5106c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_mclk3_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_camss_mclk3_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_nrt_axi_clk = {
+       .halt_reg = 0x58054,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x58054,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_nrt_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_ope_ahb_clk = {
+       .halt_reg = 0x5503c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5503c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_ope_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_camss_ope_ahb_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_ope_clk = {
+       .halt_reg = 0x5501c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5501c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_ope_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_camss_ope_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_rt_axi_clk = {
+       .halt_reg = 0x5805c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5805c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_rt_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_tfe_0_clk = {
+       .halt_reg = 0x5201c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5201c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_tfe_0_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_camss_tfe_0_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_tfe_0_cphy_rx_clk = {
+       .halt_reg = 0x5207c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5207c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_tfe_0_cphy_rx_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                               { &gcc_camss_tfe_cphy_rx_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_tfe_0_csid_clk = {
+       .halt_reg = 0x520ac,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x520ac,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_tfe_0_csid_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                               { &gcc_camss_tfe_0_csid_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_tfe_1_clk = {
+       .halt_reg = 0x5203c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5203c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_tfe_1_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_camss_tfe_1_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_tfe_1_cphy_rx_clk = {
+       .halt_reg = 0x52080,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x52080,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_tfe_1_cphy_rx_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                               { &gcc_camss_tfe_cphy_rx_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_tfe_1_csid_clk = {
+       .halt_reg = 0x520cc,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x520cc,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_tfe_1_csid_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                               { &gcc_camss_tfe_1_csid_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_top_ahb_clk = {
+       .halt_reg = 0x58028,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x58028,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_top_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_camss_top_ahb_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_cfg_noc_usb3_prim_axi_clk = {
+       .halt_reg = 0x1a084,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x1a084,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x1a084,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_cfg_noc_usb3_prim_axi_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                               { &gcc_usb30_prim_master_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_disp_ahb_clk = {
+       .halt_reg = 0x1700c,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x1700c,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x1700c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_disp_ahb_clk",
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_regmap_div gcc_disp_gpll0_clk_src = {
+       .reg = 0x17058,
+       .shift = 0,
+       .width = 2,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gcc_disp_gpll0_clk_src",
+               .parent_hws = (const struct clk_hw *[]){ &gpll0.clkr.hw },
+               .num_parents = 1,
+               .ops = &clk_regmap_div_ops,
+       },
+};
+
+static struct clk_branch gcc_disp_gpll0_div_clk_src = {
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x79004,
+               .enable_mask = BIT(20),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_disp_gpll0_div_clk_src",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_disp_gpll0_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_disp_hf_axi_clk = {
+       .halt_reg = 0x17020,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x17020,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x17020,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_disp_hf_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_disp_throttle_core_clk = {
+       .halt_reg = 0x17064,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x17064,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(5),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_disp_throttle_core_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_disp_xo_clk = {
+       .halt_reg = 0x1702c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1702c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_disp_xo_clk",
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gp1_clk = {
+       .halt_reg = 0x4d000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gp1_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_gp1_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gp2_clk = {
+       .halt_reg = 0x4e000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4e000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gp2_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_gp2_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gp3_clk = {
+       .halt_reg = 0x4f000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4f000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gp3_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_gp3_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gpu_cfg_ahb_clk = {
+       .halt_reg = 0x36004,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x36004,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x36004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gpu_cfg_ahb_clk",
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gpu_gpll0_clk_src = {
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x79004,
+               .enable_mask = BIT(15),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gpu_gpll0_clk_src",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gpll0.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gpu_gpll0_div_clk_src = {
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x79004,
+               .enable_mask = BIT(16),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gpu_gpll0_div_clk_src",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gpll0_out_aux2.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gpu_iref_clk = {
+       .halt_reg = 0x36100,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x36100,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gpu_iref_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gpu_memnoc_gfx_clk = {
+       .halt_reg = 0x3600c,
+       .halt_check = BRANCH_VOTED,
+       .hwcg_reg = 0x3600c,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x3600c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gpu_memnoc_gfx_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gpu_snoc_dvm_gfx_clk = {
+       .halt_reg = 0x36018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x36018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gpu_snoc_dvm_gfx_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gpu_throttle_core_clk = {
+       .halt_reg = 0x36048,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x36048,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x79004,
+               .enable_mask = BIT(31),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gpu_throttle_core_clk",
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pdm2_clk = {
+       .halt_reg = 0x2000c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2000c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pdm2_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_pdm2_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pdm_ahb_clk = {
+       .halt_reg = 0x20004,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x20004,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x20004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pdm_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pdm_xo4_clk = {
+       .halt_reg = 0x20008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x20008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pdm_xo4_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pwm0_xo512_clk = {
+       .halt_reg = 0x2002c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2002c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pwm0_xo512_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qmip_camera_nrt_ahb_clk = {
+       .halt_reg = 0x17014,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x17014,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qmip_camera_nrt_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qmip_camera_rt_ahb_clk = {
+       .halt_reg = 0x17060,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x17060,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(2),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qmip_camera_rt_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qmip_disp_ahb_clk = {
+       .halt_reg = 0x17018,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x17018,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qmip_disp_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qmip_gpu_cfg_ahb_clk = {
+       .halt_reg = 0x36040,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x36040,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(4),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qmip_gpu_cfg_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qmip_video_vcodec_ahb_clk = {
+       .halt_reg = 0x17010,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x17010,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x79004,
+               .enable_mask = BIT(25),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qmip_video_vcodec_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap0_core_2x_clk = {
+       .halt_reg = 0x1f014,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(9),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap0_core_2x_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap0_core_clk = {
+       .halt_reg = 0x1f00c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(8),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap0_core_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap0_s0_clk = {
+       .halt_reg = 0x1f144,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(10),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap0_s0_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_qupv3_wrap0_s0_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap0_s1_clk = {
+       .halt_reg = 0x1f274,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(11),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap0_s1_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_qupv3_wrap0_s1_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap0_s2_clk = {
+       .halt_reg = 0x1f3a4,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(12),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap0_s2_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_qupv3_wrap0_s2_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap0_s3_clk = {
+       .halt_reg = 0x1f4d4,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(13),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap0_s3_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_qupv3_wrap0_s3_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap0_s4_clk = {
+       .halt_reg = 0x1f604,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(14),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap0_s4_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_qupv3_wrap0_s4_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap0_s5_clk = {
+       .halt_reg = 0x1f734,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(15),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap0_s5_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_qupv3_wrap0_s5_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap_0_m_ahb_clk = {
+       .halt_reg = 0x1f004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x1f004,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(6),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap_0_m_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap_0_s_ahb_clk = {
+       .halt_reg = 0x1f008,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x1f008,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(7),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap_0_s_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sdcc1_ahb_clk = {
+       .halt_reg = 0x38008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x38008,
+               .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 = 0x38004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x38004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_sdcc1_apps_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_sdcc1_apps_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sdcc1_ice_core_clk = {
+       .halt_reg = 0x3800c,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x3800c,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x3800c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_sdcc1_ice_core_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_sdcc1_ice_core_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sdcc2_ahb_clk = {
+       .halt_reg = 0x1e008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1e008,
+               .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 = 0x1e004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1e004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_sdcc2_apps_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_sdcc2_apps_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sys_noc_cpuss_ahb_clk = {
+       .halt_reg = 0x2b06c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x2b06c,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x79004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_sys_noc_cpuss_ahb_clk",
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sys_noc_usb3_prim_axi_clk = {
+       .halt_reg = 0x1a080,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x1a080,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x1a080,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_sys_noc_usb3_prim_axi_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                               { &gcc_usb30_prim_master_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb30_prim_master_clk = {
+       .halt_reg = 0x1a010,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1a010,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb30_prim_master_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                               { &gcc_usb30_prim_master_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb30_prim_mock_utmi_clk = {
+       .halt_reg = 0x1a018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1a018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb30_prim_mock_utmi_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                               { &gcc_usb30_prim_mock_utmi_postdiv.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb30_prim_sleep_clk = {
+       .halt_reg = 0x1a014,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1a014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb30_prim_sleep_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb3_prim_clkref_clk = {
+       .halt_reg = 0x9f000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x9f000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb3_prim_clkref_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb3_prim_phy_com_aux_clk = {
+       .halt_reg = 0x1a054,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1a054,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb3_prim_phy_com_aux_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                               { &gcc_usb3_prim_phy_aux_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb3_prim_phy_pipe_clk = {
+       .halt_reg = 0x1a058,
+       .halt_check = BRANCH_HALT_SKIP,
+       .hwcg_reg = 0x1a058,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x1a058,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb3_prim_phy_pipe_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_vcodec0_axi_clk = {
+       .halt_reg = 0x6e008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x6e008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_vcodec0_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_venus_ahb_clk = {
+       .halt_reg = 0x6e010,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x6e010,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_venus_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_venus_ctl_axi_clk = {
+       .halt_reg = 0x6e004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x6e004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_venus_ctl_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_video_ahb_clk = {
+       .halt_reg = 0x17004,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x17004,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x17004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_video_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_video_axi0_clk = {
+       .halt_reg = 0x1701c,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x1701c,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x1701c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_video_axi0_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_video_throttle_core_clk = {
+       .halt_reg = 0x17068,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x17068,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x79004,
+               .enable_mask = BIT(28),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_video_throttle_core_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_video_vcodec0_sys_clk = {
+       .halt_reg = 0x580a4,
+       .halt_check = BRANCH_HALT_DELAY,
+       .hwcg_reg = 0x580a4,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x580a4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_video_vcodec0_sys_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_video_venus_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_video_venus_ctl_clk = {
+       .halt_reg = 0x5808c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5808c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_video_venus_ctl_clk",
+                       .parent_hws = (const struct clk_hw *[])
+                                       { &gcc_video_venus_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_video_xo_clk = {
+       .halt_reg = 0x17024,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x17024,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_video_xo_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct gdsc gcc_camss_top_gdsc = {
+       .gdscr = 0x58004,
+       .pd = {
+               .name = "gcc_camss_top",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc gcc_usb30_prim_gdsc = {
+       .gdscr = 0x1a004,
+       .pd = {
+               .name = "gcc_usb30_prim",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc gcc_vcodec0_gdsc = {
+       .gdscr = 0x58098,
+       .pd = {
+               .name = "gcc_vcodec0",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc gcc_venus_gdsc = {
+       .gdscr = 0x5807c,
+       .pd = {
+               .name = "gcc_venus",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc hlos1_vote_turing_mmu_tbu1_gdsc = {
+       .gdscr = 0x7d060,
+       .pd = {
+               .name = "hlos1_vote_turing_mmu_tbu1",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE,
+};
+
+static struct gdsc hlos1_vote_turing_mmu_tbu0_gdsc = {
+       .gdscr = 0x7d07c,
+       .pd = {
+               .name = "hlos1_vote_turing_mmu_tbu0",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE,
+};
+
+static struct gdsc hlos1_vote_mm_snoc_mmu_tbu_rt_gdsc = {
+       .gdscr = 0x7d074,
+       .pd = {
+               .name = "hlos1_vote_mm_snoc_mmu_tbu_rt",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE,
+};
+
+static struct gdsc hlos1_vote_mm_snoc_mmu_tbu_nrt_gdsc = {
+       .gdscr = 0x7d078,
+       .pd = {
+               .name = "hlos1_vote_mm_snoc_mmu_tbu_nrt",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE,
+};
+
+static struct clk_regmap *gcc_qcm2290_clocks[] = {
+       [GCC_AHB2PHY_CSI_CLK] = &gcc_ahb2phy_csi_clk.clkr,
+       [GCC_AHB2PHY_USB_CLK] = &gcc_ahb2phy_usb_clk.clkr,
+       [GCC_BIMC_GPU_AXI_CLK] = &gcc_bimc_gpu_axi_clk.clkr,
+       [GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr,
+       [GCC_CAM_THROTTLE_NRT_CLK] = &gcc_cam_throttle_nrt_clk.clkr,
+       [GCC_CAM_THROTTLE_RT_CLK] = &gcc_cam_throttle_rt_clk.clkr,
+       [GCC_CAMERA_AHB_CLK] = &gcc_camera_ahb_clk.clkr,
+       [GCC_CAMERA_XO_CLK] = &gcc_camera_xo_clk.clkr,
+       [GCC_CAMSS_AXI_CLK] = &gcc_camss_axi_clk.clkr,
+       [GCC_CAMSS_AXI_CLK_SRC] = &gcc_camss_axi_clk_src.clkr,
+       [GCC_CAMSS_CAMNOC_ATB_CLK] = &gcc_camss_camnoc_atb_clk.clkr,
+       [GCC_CAMSS_CAMNOC_NTS_XO_CLK] = &gcc_camss_camnoc_nts_xo_clk.clkr,
+       [GCC_CAMSS_CCI_0_CLK] = &gcc_camss_cci_0_clk.clkr,
+       [GCC_CAMSS_CCI_CLK_SRC] = &gcc_camss_cci_clk_src.clkr,
+       [GCC_CAMSS_CPHY_0_CLK] = &gcc_camss_cphy_0_clk.clkr,
+       [GCC_CAMSS_CPHY_1_CLK] = &gcc_camss_cphy_1_clk.clkr,
+       [GCC_CAMSS_CSI0PHYTIMER_CLK] = &gcc_camss_csi0phytimer_clk.clkr,
+       [GCC_CAMSS_CSI0PHYTIMER_CLK_SRC] = &gcc_camss_csi0phytimer_clk_src.clkr,
+       [GCC_CAMSS_CSI1PHYTIMER_CLK] = &gcc_camss_csi1phytimer_clk.clkr,
+       [GCC_CAMSS_CSI1PHYTIMER_CLK_SRC] = &gcc_camss_csi1phytimer_clk_src.clkr,
+       [GCC_CAMSS_MCLK0_CLK] = &gcc_camss_mclk0_clk.clkr,
+       [GCC_CAMSS_MCLK0_CLK_SRC] = &gcc_camss_mclk0_clk_src.clkr,
+       [GCC_CAMSS_MCLK1_CLK] = &gcc_camss_mclk1_clk.clkr,
+       [GCC_CAMSS_MCLK1_CLK_SRC] = &gcc_camss_mclk1_clk_src.clkr,
+       [GCC_CAMSS_MCLK2_CLK] = &gcc_camss_mclk2_clk.clkr,
+       [GCC_CAMSS_MCLK2_CLK_SRC] = &gcc_camss_mclk2_clk_src.clkr,
+       [GCC_CAMSS_MCLK3_CLK] = &gcc_camss_mclk3_clk.clkr,
+       [GCC_CAMSS_MCLK3_CLK_SRC] = &gcc_camss_mclk3_clk_src.clkr,
+       [GCC_CAMSS_NRT_AXI_CLK] = &gcc_camss_nrt_axi_clk.clkr,
+       [GCC_CAMSS_OPE_AHB_CLK] = &gcc_camss_ope_ahb_clk.clkr,
+       [GCC_CAMSS_OPE_AHB_CLK_SRC] = &gcc_camss_ope_ahb_clk_src.clkr,
+       [GCC_CAMSS_OPE_CLK] = &gcc_camss_ope_clk.clkr,
+       [GCC_CAMSS_OPE_CLK_SRC] = &gcc_camss_ope_clk_src.clkr,
+       [GCC_CAMSS_RT_AXI_CLK] = &gcc_camss_rt_axi_clk.clkr,
+       [GCC_CAMSS_TFE_0_CLK] = &gcc_camss_tfe_0_clk.clkr,
+       [GCC_CAMSS_TFE_0_CLK_SRC] = &gcc_camss_tfe_0_clk_src.clkr,
+       [GCC_CAMSS_TFE_0_CPHY_RX_CLK] = &gcc_camss_tfe_0_cphy_rx_clk.clkr,
+       [GCC_CAMSS_TFE_0_CSID_CLK] = &gcc_camss_tfe_0_csid_clk.clkr,
+       [GCC_CAMSS_TFE_0_CSID_CLK_SRC] = &gcc_camss_tfe_0_csid_clk_src.clkr,
+       [GCC_CAMSS_TFE_1_CLK] = &gcc_camss_tfe_1_clk.clkr,
+       [GCC_CAMSS_TFE_1_CLK_SRC] = &gcc_camss_tfe_1_clk_src.clkr,
+       [GCC_CAMSS_TFE_1_CPHY_RX_CLK] = &gcc_camss_tfe_1_cphy_rx_clk.clkr,
+       [GCC_CAMSS_TFE_1_CSID_CLK] = &gcc_camss_tfe_1_csid_clk.clkr,
+       [GCC_CAMSS_TFE_1_CSID_CLK_SRC] = &gcc_camss_tfe_1_csid_clk_src.clkr,
+       [GCC_CAMSS_TFE_CPHY_RX_CLK_SRC] = &gcc_camss_tfe_cphy_rx_clk_src.clkr,
+       [GCC_CAMSS_TOP_AHB_CLK] = &gcc_camss_top_ahb_clk.clkr,
+       [GCC_CAMSS_TOP_AHB_CLK_SRC] = &gcc_camss_top_ahb_clk_src.clkr,
+       [GCC_CFG_NOC_USB3_PRIM_AXI_CLK] = &gcc_cfg_noc_usb3_prim_axi_clk.clkr,
+       [GCC_DISP_AHB_CLK] = &gcc_disp_ahb_clk.clkr,
+       [GCC_DISP_GPLL0_CLK_SRC] = &gcc_disp_gpll0_clk_src.clkr,
+       [GCC_DISP_GPLL0_DIV_CLK_SRC] = &gcc_disp_gpll0_div_clk_src.clkr,
+       [GCC_DISP_HF_AXI_CLK] = &gcc_disp_hf_axi_clk.clkr,
+       [GCC_DISP_THROTTLE_CORE_CLK] = &gcc_disp_throttle_core_clk.clkr,
+       [GCC_DISP_XO_CLK] = &gcc_disp_xo_clk.clkr,
+       [GCC_GP1_CLK] = &gcc_gp1_clk.clkr,
+       [GCC_GP1_CLK_SRC] = &gcc_gp1_clk_src.clkr,
+       [GCC_GP2_CLK] = &gcc_gp2_clk.clkr,
+       [GCC_GP2_CLK_SRC] = &gcc_gp2_clk_src.clkr,
+       [GCC_GP3_CLK] = &gcc_gp3_clk.clkr,
+       [GCC_GP3_CLK_SRC] = &gcc_gp3_clk_src.clkr,
+       [GCC_GPU_CFG_AHB_CLK] = &gcc_gpu_cfg_ahb_clk.clkr,
+       [GCC_GPU_GPLL0_CLK_SRC] = &gcc_gpu_gpll0_clk_src.clkr,
+       [GCC_GPU_GPLL0_DIV_CLK_SRC] = &gcc_gpu_gpll0_div_clk_src.clkr,
+       [GCC_GPU_IREF_CLK] = &gcc_gpu_iref_clk.clkr,
+       [GCC_GPU_MEMNOC_GFX_CLK] = &gcc_gpu_memnoc_gfx_clk.clkr,
+       [GCC_GPU_SNOC_DVM_GFX_CLK] = &gcc_gpu_snoc_dvm_gfx_clk.clkr,
+       [GCC_GPU_THROTTLE_CORE_CLK] = &gcc_gpu_throttle_core_clk.clkr,
+       [GCC_PDM2_CLK] = &gcc_pdm2_clk.clkr,
+       [GCC_PDM2_CLK_SRC] = &gcc_pdm2_clk_src.clkr,
+       [GCC_PDM_AHB_CLK] = &gcc_pdm_ahb_clk.clkr,
+       [GCC_PDM_XO4_CLK] = &gcc_pdm_xo4_clk.clkr,
+       [GCC_PWM0_XO512_CLK] = &gcc_pwm0_xo512_clk.clkr,
+       [GCC_QMIP_CAMERA_NRT_AHB_CLK] = &gcc_qmip_camera_nrt_ahb_clk.clkr,
+       [GCC_QMIP_CAMERA_RT_AHB_CLK] = &gcc_qmip_camera_rt_ahb_clk.clkr,
+       [GCC_QMIP_DISP_AHB_CLK] = &gcc_qmip_disp_ahb_clk.clkr,
+       [GCC_QMIP_GPU_CFG_AHB_CLK] = &gcc_qmip_gpu_cfg_ahb_clk.clkr,
+       [GCC_QMIP_VIDEO_VCODEC_AHB_CLK] = &gcc_qmip_video_vcodec_ahb_clk.clkr,
+       [GCC_QUPV3_WRAP0_CORE_2X_CLK] = &gcc_qupv3_wrap0_core_2x_clk.clkr,
+       [GCC_QUPV3_WRAP0_CORE_CLK] = &gcc_qupv3_wrap0_core_clk.clkr,
+       [GCC_QUPV3_WRAP0_S0_CLK] = &gcc_qupv3_wrap0_s0_clk.clkr,
+       [GCC_QUPV3_WRAP0_S0_CLK_SRC] = &gcc_qupv3_wrap0_s0_clk_src.clkr,
+       [GCC_QUPV3_WRAP0_S1_CLK] = &gcc_qupv3_wrap0_s1_clk.clkr,
+       [GCC_QUPV3_WRAP0_S1_CLK_SRC] = &gcc_qupv3_wrap0_s1_clk_src.clkr,
+       [GCC_QUPV3_WRAP0_S2_CLK] = &gcc_qupv3_wrap0_s2_clk.clkr,
+       [GCC_QUPV3_WRAP0_S2_CLK_SRC] = &gcc_qupv3_wrap0_s2_clk_src.clkr,
+       [GCC_QUPV3_WRAP0_S3_CLK] = &gcc_qupv3_wrap0_s3_clk.clkr,
+       [GCC_QUPV3_WRAP0_S3_CLK_SRC] = &gcc_qupv3_wrap0_s3_clk_src.clkr,
+       [GCC_QUPV3_WRAP0_S4_CLK] = &gcc_qupv3_wrap0_s4_clk.clkr,
+       [GCC_QUPV3_WRAP0_S4_CLK_SRC] = &gcc_qupv3_wrap0_s4_clk_src.clkr,
+       [GCC_QUPV3_WRAP0_S5_CLK] = &gcc_qupv3_wrap0_s5_clk.clkr,
+       [GCC_QUPV3_WRAP0_S5_CLK_SRC] = &gcc_qupv3_wrap0_s5_clk_src.clkr,
+       [GCC_QUPV3_WRAP_0_M_AHB_CLK] = &gcc_qupv3_wrap_0_m_ahb_clk.clkr,
+       [GCC_QUPV3_WRAP_0_S_AHB_CLK] = &gcc_qupv3_wrap_0_s_ahb_clk.clkr,
+       [GCC_SDCC1_AHB_CLK] = &gcc_sdcc1_ahb_clk.clkr,
+       [GCC_SDCC1_APPS_CLK] = &gcc_sdcc1_apps_clk.clkr,
+       [GCC_SDCC1_APPS_CLK_SRC] = &gcc_sdcc1_apps_clk_src.clkr,
+       [GCC_SDCC1_ICE_CORE_CLK] = &gcc_sdcc1_ice_core_clk.clkr,
+       [GCC_SDCC1_ICE_CORE_CLK_SRC] = &gcc_sdcc1_ice_core_clk_src.clkr,
+       [GCC_SDCC2_AHB_CLK] = &gcc_sdcc2_ahb_clk.clkr,
+       [GCC_SDCC2_APPS_CLK] = &gcc_sdcc2_apps_clk.clkr,
+       [GCC_SDCC2_APPS_CLK_SRC] = &gcc_sdcc2_apps_clk_src.clkr,
+       [GCC_SYS_NOC_CPUSS_AHB_CLK] = &gcc_sys_noc_cpuss_ahb_clk.clkr,
+       [GCC_SYS_NOC_USB3_PRIM_AXI_CLK] = &gcc_sys_noc_usb3_prim_axi_clk.clkr,
+       [GCC_USB30_PRIM_MASTER_CLK] = &gcc_usb30_prim_master_clk.clkr,
+       [GCC_USB30_PRIM_MASTER_CLK_SRC] = &gcc_usb30_prim_master_clk_src.clkr,
+       [GCC_USB30_PRIM_MOCK_UTMI_CLK] = &gcc_usb30_prim_mock_utmi_clk.clkr,
+       [GCC_USB30_PRIM_MOCK_UTMI_CLK_SRC] =
+               &gcc_usb30_prim_mock_utmi_clk_src.clkr,
+       [GCC_USB30_PRIM_MOCK_UTMI_POSTDIV] =
+               &gcc_usb30_prim_mock_utmi_postdiv.clkr,
+       [GCC_USB30_PRIM_SLEEP_CLK] = &gcc_usb30_prim_sleep_clk.clkr,
+       [GCC_USB3_PRIM_CLKREF_CLK] = &gcc_usb3_prim_clkref_clk.clkr,
+       [GCC_USB3_PRIM_PHY_AUX_CLK_SRC] = &gcc_usb3_prim_phy_aux_clk_src.clkr,
+       [GCC_USB3_PRIM_PHY_COM_AUX_CLK] = &gcc_usb3_prim_phy_com_aux_clk.clkr,
+       [GCC_USB3_PRIM_PHY_PIPE_CLK] = &gcc_usb3_prim_phy_pipe_clk.clkr,
+       [GCC_VCODEC0_AXI_CLK] = &gcc_vcodec0_axi_clk.clkr,
+       [GCC_VENUS_AHB_CLK] = &gcc_venus_ahb_clk.clkr,
+       [GCC_VENUS_CTL_AXI_CLK] = &gcc_venus_ctl_axi_clk.clkr,
+       [GCC_VIDEO_AHB_CLK] = &gcc_video_ahb_clk.clkr,
+       [GCC_VIDEO_AXI0_CLK] = &gcc_video_axi0_clk.clkr,
+       [GCC_VIDEO_THROTTLE_CORE_CLK] = &gcc_video_throttle_core_clk.clkr,
+       [GCC_VIDEO_VCODEC0_SYS_CLK] = &gcc_video_vcodec0_sys_clk.clkr,
+       [GCC_VIDEO_VENUS_CLK_SRC] = &gcc_video_venus_clk_src.clkr,
+       [GCC_VIDEO_VENUS_CTL_CLK] = &gcc_video_venus_ctl_clk.clkr,
+       [GCC_VIDEO_XO_CLK] = &gcc_video_xo_clk.clkr,
+       [GPLL0] = &gpll0.clkr,
+       [GPLL0_OUT_AUX2] = &gpll0_out_aux2.clkr,
+       [GPLL1] = &gpll1.clkr,
+       [GPLL10] = &gpll10.clkr,
+       [GPLL11] = &gpll11.clkr,
+       [GPLL3] = &gpll3.clkr,
+       [GPLL3_OUT_MAIN] = &gpll3_out_main.clkr,
+       [GPLL4] = &gpll4.clkr,
+       [GPLL5] = &gpll5.clkr,
+       [GPLL6] = &gpll6.clkr,
+       [GPLL6_OUT_MAIN] = &gpll6_out_main.clkr,
+       [GPLL7] = &gpll7.clkr,
+       [GPLL8] = &gpll8.clkr,
+       [GPLL8_OUT_MAIN] = &gpll8_out_main.clkr,
+       [GPLL9] = &gpll9.clkr,
+       [GPLL9_OUT_MAIN] = &gpll9_out_main.clkr,
+};
+
+static const struct qcom_reset_map gcc_qcm2290_resets[] = {
+       [GCC_CAMSS_OPE_BCR] = { 0x55000 },
+       [GCC_CAMSS_TFE_BCR] = { 0x52000 },
+       [GCC_CAMSS_TOP_BCR] = { 0x58000 },
+       [GCC_GPU_BCR] = { 0x36000 },
+       [GCC_MMSS_BCR] = { 0x17000 },
+       [GCC_PDM_BCR] = { 0x20000 },
+       [GCC_QUPV3_WRAPPER_0_BCR] = { 0x1f000 },
+       [GCC_QUSB2PHY_PRIM_BCR] = { 0x1c000 },
+       [GCC_SDCC1_BCR] = { 0x38000 },
+       [GCC_SDCC2_BCR] = { 0x1e000 },
+       [GCC_USB30_PRIM_BCR] = { 0x1a000 },
+       [GCC_USB3_PHY_PRIM_SP0_BCR] = { 0x1b000 },
+       [GCC_USB3PHY_PHY_PRIM_SP0_BCR] = { 0x1b008 },
+       [GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x1d000 },
+       [GCC_VCODEC0_BCR] = { 0x58094 },
+       [GCC_VENUS_BCR] = { 0x58078 },
+       [GCC_VIDEO_INTERFACE_BCR] = { 0x6e000 },
+};
+
+static struct gdsc *gcc_qcm2290_gdscs[] = {
+       [GCC_CAMSS_TOP_GDSC] = &gcc_camss_top_gdsc,
+       [GCC_USB30_PRIM_GDSC] = &gcc_usb30_prim_gdsc,
+       [GCC_VCODEC0_GDSC] = &gcc_vcodec0_gdsc,
+       [GCC_VENUS_GDSC] = &gcc_venus_gdsc,
+       [HLOS1_VOTE_TURING_MMU_TBU1_GDSC] = &hlos1_vote_turing_mmu_tbu1_gdsc,
+       [HLOS1_VOTE_TURING_MMU_TBU0_GDSC] = &hlos1_vote_turing_mmu_tbu0_gdsc,
+       [HLOS1_VOTE_MM_SNOC_MMU_TBU_RT_GDSC] = &hlos1_vote_mm_snoc_mmu_tbu_rt_gdsc,
+       [HLOS1_VOTE_MM_SNOC_MMU_TBU_NRT_GDSC] = &hlos1_vote_mm_snoc_mmu_tbu_nrt_gdsc,
+};
+
+static const struct clk_rcg_dfs_data gcc_dfs_clocks[] = {
+       DEFINE_RCG_DFS(gcc_qupv3_wrap0_s0_clk_src),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap0_s1_clk_src),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap0_s2_clk_src),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap0_s3_clk_src),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap0_s4_clk_src),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap0_s5_clk_src),
+};
+
+static const struct regmap_config gcc_qcm2290_regmap_config = {
+       .reg_bits = 32,
+       .reg_stride = 4,
+       .val_bits = 32,
+       .max_register = 0xc7000,
+       .fast_io = true,
+};
+
+static const struct qcom_cc_desc gcc_qcm2290_desc = {
+       .config = &gcc_qcm2290_regmap_config,
+       .clks = gcc_qcm2290_clocks,
+       .num_clks = ARRAY_SIZE(gcc_qcm2290_clocks),
+       .resets = gcc_qcm2290_resets,
+       .num_resets = ARRAY_SIZE(gcc_qcm2290_resets),
+       .gdscs = gcc_qcm2290_gdscs,
+       .num_gdscs = ARRAY_SIZE(gcc_qcm2290_gdscs),
+};
+
+static const struct of_device_id gcc_qcm2290_match_table[] = {
+       { .compatible = "qcom,gcc-qcm2290" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, gcc_qcm2290_match_table);
+
+static int gcc_qcm2290_probe(struct platform_device *pdev)
+{
+       struct regmap *regmap;
+       int ret;
+
+       regmap = qcom_cc_map(pdev, &gcc_qcm2290_desc);
+       if (IS_ERR(regmap))
+               return PTR_ERR(regmap);
+
+       ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks,
+                                      ARRAY_SIZE(gcc_dfs_clocks));
+       if (ret)
+               return ret;
+
+       clk_alpha_pll_configure(&gpll10, regmap, &gpll10_config);
+       clk_alpha_pll_configure(&gpll11, regmap, &gpll11_config);
+       clk_alpha_pll_configure(&gpll8, regmap, &gpll8_config);
+       clk_alpha_pll_configure(&gpll9, regmap, &gpll9_config);
+
+       return qcom_cc_really_probe(pdev, &gcc_qcm2290_desc, regmap);
+}
+
+static struct platform_driver gcc_qcm2290_driver = {
+       .probe = gcc_qcm2290_probe,
+       .driver = {
+               .name = "gcc-qcm2290",
+               .of_match_table = gcc_qcm2290_match_table,
+       },
+};
+
+static int __init gcc_qcm2290_init(void)
+{
+       return platform_driver_register(&gcc_qcm2290_driver);
+}
+subsys_initcall(gcc_qcm2290_init);
+
+static void __exit gcc_qcm2290_exit(void)
+{
+       platform_driver_unregister(&gcc_qcm2290_driver);
+}
+module_exit(gcc_qcm2290_exit);
+
+MODULE_DESCRIPTION("QTI GCC QCM2290 Driver");
+MODULE_LICENSE("GPL v2");
index 6cefcdc..8fb6bd6 100644 (file)
@@ -197,12 +197,6 @@ static const struct clk_parent_data gcc_parent_data_0[] = {
        { .hw = &gcc_gpll0_out_even.clkr.hw },
 };
 
-static const struct clk_parent_data gcc_parent_data_0_ao[] = {
-       { .fw_name = "bi_tcxo_ao" },
-       { .hw = &gcc_gpll0.clkr.hw },
-       { .hw = &gcc_gpll0_out_even.clkr.hw },
-};
-
 static const struct parent_map gcc_parent_map_1[] = {
        { P_BI_TCXO, 0 },
        { P_GCC_GPLL0_OUT_MAIN, 1 },
@@ -479,24 +473,6 @@ static struct clk_regmap_mux gcc_usb3_sec_phy_pipe_clk_src = {
                },
        },
 };
-static const struct freq_tbl ftbl_gcc_cpuss_ahb_clk_src[] = {
-       F(19200000, P_BI_TCXO, 1, 0, 0),
-       { }
-};
-
-static struct clk_rcg2 gcc_cpuss_ahb_clk_src = {
-       .cmd_rcgr = 0x4800c,
-       .mnd_width = 0,
-       .hid_width = 5,
-       .parent_map = gcc_parent_map_0,
-       .freq_tbl = ftbl_gcc_cpuss_ahb_clk_src,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "gcc_cpuss_ahb_clk_src",
-               .parent_data = gcc_parent_data_0_ao,
-               .num_parents = ARRAY_SIZE(gcc_parent_data_0_ao),
-               .ops = &clk_rcg2_ops,
-       },
-};
 
 static const struct freq_tbl ftbl_gcc_gp1_clk_src[] = {
        F(50000000, P_GCC_GPLL0_OUT_EVEN, 6, 0, 0),
@@ -1239,21 +1215,6 @@ static struct clk_rcg2 gcc_sec_ctrl_clk_src = {
        },
 };
 
-static struct clk_regmap_div gcc_cpuss_ahb_postdiv_clk_src = {
-       .reg = 0x48024,
-       .shift = 0,
-       .width = 4,
-       .clkr.hw.init = &(struct clk_init_data) {
-               .name = "gcc_cpuss_ahb_postdiv_clk_src",
-               .parent_hws = (const struct clk_hw*[]){
-                       &gcc_cpuss_ahb_clk_src.clkr.hw,
-               },
-               .num_parents = 1,
-               .flags = CLK_SET_RATE_PARENT,
-               .ops = &clk_regmap_div_ro_ops,
-       },
-};
-
 static struct clk_regmap_div gcc_usb30_prim_mock_utmi_postdiv_clk_src = {
        .reg = 0xf050,
        .shift = 0,
@@ -1500,27 +1461,6 @@ static struct clk_branch gcc_cfg_noc_usb3_sec_axi_clk = {
        },
 };
 
-/* For CPUSS functionality the AHB clock needs to be left enabled */
-static struct clk_branch gcc_cpuss_ahb_clk = {
-       .halt_reg = 0x48000,
-       .halt_check = BRANCH_HALT_VOTED,
-       .hwcg_reg = 0x48000,
-       .hwcg_bit = 1,
-       .clkr = {
-               .enable_reg = 0x52000,
-               .enable_mask = BIT(21),
-               .hw.init = &(struct clk_init_data){
-                       .name = "gcc_cpuss_ahb_clk",
-                       .parent_hws = (const struct clk_hw*[]){
-                               &gcc_cpuss_ahb_postdiv_clk_src.clkr.hw,
-                       },
-                       .num_parents = 1,
-                       .flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
-                       .ops = &clk_branch2_ops,
-               },
-       },
-};
-
 static struct clk_branch gcc_ddrss_gpu_axi_clk = {
        .halt_reg = 0x71154,
        .halt_check = BRANCH_HALT_SKIP,
@@ -2608,27 +2548,6 @@ static struct clk_branch gcc_sdcc4_apps_clk = {
        },
 };
 
-/* For CPUSS functionality the AHB clock needs to be left enabled */
-static struct clk_branch gcc_sys_noc_cpuss_ahb_clk = {
-       .halt_reg = 0x48178,
-       .halt_check = BRANCH_HALT_VOTED,
-       .hwcg_reg = 0x48178,
-       .hwcg_bit = 1,
-       .clkr = {
-               .enable_reg = 0x52000,
-               .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data){
-                       .name = "gcc_sys_noc_cpuss_ahb_clk",
-                       .parent_hws = (const struct clk_hw*[]){
-                               &gcc_cpuss_ahb_postdiv_clk_src.clkr.hw,
-                       },
-                       .num_parents = 1,
-                       .flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
-                       .ops = &clk_branch2_ops,
-               },
-       },
-};
-
 static struct clk_branch gcc_throttle_pcie_ahb_clk = {
        .halt_reg = 0x9001c,
        .halt_check = BRANCH_HALT,
@@ -3294,9 +3213,6 @@ static struct clk_regmap *gcc_sc7280_clocks[] = {
        [GCC_CAMERA_SF_AXI_CLK] = &gcc_camera_sf_axi_clk.clkr,
        [GCC_CFG_NOC_USB3_PRIM_AXI_CLK] = &gcc_cfg_noc_usb3_prim_axi_clk.clkr,
        [GCC_CFG_NOC_USB3_SEC_AXI_CLK] = &gcc_cfg_noc_usb3_sec_axi_clk.clkr,
-       [GCC_CPUSS_AHB_CLK] = &gcc_cpuss_ahb_clk.clkr,
-       [GCC_CPUSS_AHB_CLK_SRC] = &gcc_cpuss_ahb_clk_src.clkr,
-       [GCC_CPUSS_AHB_POSTDIV_CLK_SRC] = &gcc_cpuss_ahb_postdiv_clk_src.clkr,
        [GCC_DDRSS_GPU_AXI_CLK] = &gcc_ddrss_gpu_axi_clk.clkr,
        [GCC_DDRSS_PCIE_SF_CLK] = &gcc_ddrss_pcie_sf_clk.clkr,
        [GCC_DISP_GPLL0_CLK_SRC] = &gcc_disp_gpll0_clk_src.clkr,
@@ -3403,7 +3319,6 @@ static struct clk_regmap *gcc_sc7280_clocks[] = {
        [GCC_SDCC4_AHB_CLK] = &gcc_sdcc4_ahb_clk.clkr,
        [GCC_SDCC4_APPS_CLK] = &gcc_sdcc4_apps_clk.clkr,
        [GCC_SDCC4_APPS_CLK_SRC] = &gcc_sdcc4_apps_clk_src.clkr,
-       [GCC_SYS_NOC_CPUSS_AHB_CLK] = &gcc_sys_noc_cpuss_ahb_clk.clkr,
        [GCC_THROTTLE_PCIE_AHB_CLK] = &gcc_throttle_pcie_ahb_clk.clkr,
        [GCC_TITAN_NRT_THROTTLE_CORE_CLK] =
                &gcc_titan_nrt_throttle_core_clk.clkr,
index 4d36f96..9b97425 100644 (file)
@@ -284,7 +284,7 @@ static struct clk_rcg2 blsp1_qup1_i2c_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup1_i2c_apps_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -309,7 +309,7 @@ static struct clk_rcg2 blsp1_qup1_spi_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup1_spi_apps_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -323,7 +323,7 @@ static struct clk_rcg2 blsp1_qup2_i2c_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup2_i2c_apps_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -337,7 +337,7 @@ static struct clk_rcg2 blsp1_qup2_spi_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup2_spi_apps_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -351,7 +351,7 @@ static struct clk_rcg2 blsp1_qup3_i2c_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup3_i2c_apps_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -365,7 +365,7 @@ static struct clk_rcg2 blsp1_qup3_spi_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup3_spi_apps_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -379,7 +379,7 @@ static struct clk_rcg2 blsp1_qup4_i2c_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup4_i2c_apps_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -393,7 +393,7 @@ static struct clk_rcg2 blsp1_qup4_spi_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup4_spi_apps_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -426,7 +426,7 @@ static struct clk_rcg2 blsp1_uart1_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_uart1_apps_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -440,7 +440,7 @@ static struct clk_rcg2 blsp1_uart2_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_uart2_apps_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -454,7 +454,7 @@ static struct clk_rcg2 blsp2_qup1_i2c_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup1_i2c_apps_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -468,7 +468,7 @@ static struct clk_rcg2 blsp2_qup1_spi_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup1_spi_apps_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -482,7 +482,7 @@ static struct clk_rcg2 blsp2_qup2_i2c_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup2_i2c_apps_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -496,7 +496,7 @@ static struct clk_rcg2 blsp2_qup2_spi_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup2_spi_apps_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -510,7 +510,7 @@ static struct clk_rcg2 blsp2_qup3_i2c_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup3_i2c_apps_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -524,7 +524,7 @@ static struct clk_rcg2 blsp2_qup3_spi_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup3_spi_apps_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -538,7 +538,7 @@ static struct clk_rcg2 blsp2_qup4_i2c_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup4_i2c_apps_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -552,7 +552,7 @@ static struct clk_rcg2 blsp2_qup4_spi_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_qup4_spi_apps_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -566,7 +566,7 @@ static struct clk_rcg2 blsp2_uart1_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_uart1_apps_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -580,7 +580,7 @@ static struct clk_rcg2 blsp2_uart2_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp2_uart2_apps_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -601,7 +601,7 @@ static struct clk_rcg2 gp1_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gp1_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_sleep_clk_gpll0_early_div,
-               .num_parents = 4,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_sleep_clk_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -615,7 +615,7 @@ static struct clk_rcg2 gp2_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gp2_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_sleep_clk_gpll0_early_div,
-               .num_parents = 4,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_sleep_clk_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -629,7 +629,7 @@ static struct clk_rcg2 gp3_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gp3_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_sleep_clk_gpll0_early_div,
-               .num_parents = 4,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_sleep_clk_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -649,7 +649,7 @@ static struct clk_rcg2 hmss_gpll0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "hmss_gpll0_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -670,7 +670,7 @@ static struct clk_rcg2 hmss_gpll4_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "hmss_gpll4_clk_src",
                .parent_data = gcc_parent_data_xo_gpll4,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll4),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -689,7 +689,7 @@ static struct clk_rcg2 hmss_rbcpr_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "hmss_rbcpr_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -708,7 +708,7 @@ static struct clk_rcg2 pdm2_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pdm2_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -730,7 +730,7 @@ static struct clk_rcg2 qspi_ser_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "qspi_ser_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div_gpll1_gpll4_gpll1_early_div,
-               .num_parents = 6,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div_gpll1_gpll4_gpll1_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -756,7 +756,7 @@ static struct clk_rcg2 sdcc1_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "sdcc1_apps_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll4_gpll0_early_div,
-               .num_parents = 4,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll4_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -778,7 +778,7 @@ static struct clk_rcg2 sdcc1_ice_core_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "sdcc1_ice_core_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -804,7 +804,7 @@ static struct clk_rcg2 sdcc2_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "sdcc2_apps_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div_gpll4,
-               .num_parents = 4,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div_gpll4),
                .ops = &clk_rcg2_floor_ops,
        },
 };
@@ -827,7 +827,7 @@ static struct clk_rcg2 ufs_axi_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "ufs_axi_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -848,7 +848,7 @@ static struct clk_rcg2 ufs_ice_core_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "ufs_ice_core_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -862,7 +862,7 @@ static struct clk_rcg2 ufs_phy_aux_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "ufs_phy_aux_clk_src",
                .parent_data = gcc_parent_data_xo_sleep_clk,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_sleep_clk),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -883,7 +883,7 @@ static struct clk_rcg2 ufs_unipro_core_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "ufs_unipro_core_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -904,7 +904,7 @@ static struct clk_rcg2 usb20_master_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "usb20_master_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -924,7 +924,7 @@ static struct clk_rcg2 usb20_mock_utmi_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "usb20_mock_utmi_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -949,7 +949,7 @@ static struct clk_rcg2 usb30_master_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "usb30_master_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -970,7 +970,7 @@ static struct clk_rcg2 usb30_mock_utmi_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "usb30_mock_utmi_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll0_early_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -990,7 +990,7 @@ static struct clk_rcg2 usb3_phy_aux_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "usb3_phy_aux_clk_src",
                .parent_data = gcc_parent_data_xo_sleep_clk,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_xo_sleep_clk),
                .ops = &clk_rcg2_ops,
        },
 };
index 4ece326..7e1dd8c 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/kernel.h>
 #include <linux/ktime.h>
 #include <linux/pm_domain.h>
+#include <linux/pm_runtime.h>
 #include <linux/regmap.h>
 #include <linux/regulator/consumer.h>
 #include <linux/reset-controller.h>
@@ -50,6 +51,22 @@ enum gdsc_status {
        GDSC_ON
 };
 
+static int gdsc_pm_runtime_get(struct gdsc *sc)
+{
+       if (!sc->dev)
+               return 0;
+
+       return pm_runtime_resume_and_get(sc->dev);
+}
+
+static int gdsc_pm_runtime_put(struct gdsc *sc)
+{
+       if (!sc->dev)
+               return 0;
+
+       return pm_runtime_put_sync(sc->dev);
+}
+
 /* Returns 1 if GDSC status is status, 0 if not, and < 0 on error */
 static int gdsc_check_status(struct gdsc *sc, enum gdsc_status status)
 {
@@ -232,9 +249,8 @@ static void gdsc_retain_ff_on(struct gdsc *sc)
        regmap_update_bits(sc->regmap, sc->gdscr, mask, mask);
 }
 
-static int gdsc_enable(struct generic_pm_domain *domain)
+static int _gdsc_enable(struct gdsc *sc)
 {
-       struct gdsc *sc = domain_to_gdsc(domain);
        int ret;
 
        if (sc->pwrsts == PWRSTS_ON)
@@ -290,11 +306,22 @@ static int gdsc_enable(struct generic_pm_domain *domain)
        return 0;
 }
 
-static int gdsc_disable(struct generic_pm_domain *domain)
+static int gdsc_enable(struct generic_pm_domain *domain)
 {
        struct gdsc *sc = domain_to_gdsc(domain);
        int ret;
 
+       ret = gdsc_pm_runtime_get(sc);
+       if (ret)
+               return ret;
+
+       return _gdsc_enable(sc);
+}
+
+static int _gdsc_disable(struct gdsc *sc)
+{
+       int ret;
+
        if (sc->pwrsts == PWRSTS_ON)
                return gdsc_assert_reset(sc);
 
@@ -329,6 +356,18 @@ static int gdsc_disable(struct generic_pm_domain *domain)
        return 0;
 }
 
+static int gdsc_disable(struct generic_pm_domain *domain)
+{
+       struct gdsc *sc = domain_to_gdsc(domain);
+       int ret;
+
+       ret = _gdsc_disable(sc);
+
+       gdsc_pm_runtime_put(sc);
+
+       return ret;
+}
+
 static int gdsc_init(struct gdsc *sc)
 {
        u32 mask, val;
@@ -443,6 +482,8 @@ int gdsc_register(struct gdsc_desc *desc,
        for (i = 0; i < num; i++) {
                if (!scs[i])
                        continue;
+               if (pm_runtime_enabled(dev))
+                       scs[i]->dev = dev;
                scs[i]->regmap = regmap;
                scs[i]->rcdev = rcdev;
                ret = gdsc_init(scs[i]);
@@ -457,6 +498,8 @@ int gdsc_register(struct gdsc_desc *desc,
                        continue;
                if (scs[i]->parent)
                        pm_genpd_add_subdomain(scs[i]->parent, &scs[i]->pd);
+               else if (!IS_ERR_OR_NULL(dev->pm_domain))
+                       pm_genpd_add_subdomain(pd_to_genpd(dev->pm_domain), &scs[i]->pd);
        }
 
        return of_genpd_add_provider_onecell(dev->of_node, data);
@@ -475,6 +518,8 @@ void gdsc_unregister(struct gdsc_desc *desc)
                        continue;
                if (scs[i]->parent)
                        pm_genpd_remove_subdomain(scs[i]->parent, &scs[i]->pd);
+               else if (!IS_ERR_OR_NULL(dev->pm_domain))
+                       pm_genpd_remove_subdomain(pd_to_genpd(dev->pm_domain), &scs[i]->pd);
        }
        of_genpd_del_provider(dev->of_node);
 }
index 5bb396b..d7cc4c2 100644 (file)
@@ -25,6 +25,7 @@ struct reset_controller_dev;
  * @resets: ids of resets associated with this gdsc
  * @reset_count: number of @resets
  * @rcdev: reset controller
+ * @dev: the device holding the GDSC, used for pm_runtime calls
  */
 struct gdsc {
        struct generic_pm_domain        pd;
@@ -58,6 +59,7 @@ struct gdsc {
 
        const char                      *supply;
        struct regulator                *rsupply;
+       struct device                   *dev;
 };
 
 struct gdsc_desc {
index fedfffa..a925ac9 100644 (file)
@@ -40,8 +40,7 @@ static struct clk_branch gpucc_cxo_clk = {
                .hw.init = &(struct clk_init_data){
                        .name = "gpucc_cxo_clk",
                        .parent_data = &(const struct clk_parent_data){
-                               .fw_name = "xo",
-                               .name = "xo"
+                               .fw_name = "xo"
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -99,7 +98,7 @@ static const struct parent_map gpu_xo_gpll0_map[] = {
 
 static const struct clk_parent_data gpu_xo_gpll0[] = {
        { .hw = &gpucc_cxo_clk.clkr.hw },
-       { .fw_name = "gpll0", .name = "gpll0" },
+       { .fw_name = "gpll0" },
 };
 
 static const struct parent_map gpu_xo_gpupll0_map[] = {
@@ -126,7 +125,7 @@ static struct clk_rcg2 rbcpr_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "rbcpr_clk_src",
                .parent_data = gpu_xo_gpll0,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gpu_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -144,7 +143,7 @@ static struct clk_rcg2 gfx3d_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gfx3d_clk_src",
                .parent_data = gpu_xo_gpupll0,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gpu_xo_gpupll0),
                .ops = &clk_rcg2_ops,
                .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
        },
@@ -163,7 +162,7 @@ static struct clk_rcg2 rbbmtimer_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "rbbmtimer_clk_src",
                .parent_data = gpu_xo_gpll0,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gpu_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -184,7 +183,7 @@ static struct clk_rcg2 gfx3d_isense_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gfx3d_isense_clk_src",
                .parent_data = gpu_xo_gpll0,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gpu_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
index 1ebcceb..41bba96 100644 (file)
@@ -44,8 +44,7 @@ static struct clk_branch gpucc_cxo_clk = {
                .hw.init = &(struct clk_init_data){
                        .name = "gpucc_cxo_clk",
                        .parent_data = &(const struct clk_parent_data){
-                               .fw_name = "xo",
-                               .name = "xo"
+                               .fw_name = "xo"
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -101,7 +100,7 @@ static const struct clk_parent_data gpucc_parent_data_1[] = {
        { .hw = &gpucc_cxo_clk.clkr.hw },
        { .hw = &gpu_pll0_pll_out_main.clkr.hw },
        { .hw = &gpu_pll1_pll_out_main.clkr.hw },
-       { .fw_name = "gcc_gpu_gpll0_clk", .name = "gcc_gpu_gpll0_clk" },
+       { .fw_name = "gcc_gpu_gpll0_clk" },
 };
 
 static struct clk_rcg2_gfx3d gfx3d_clk_src = {
@@ -114,7 +113,7 @@ static struct clk_rcg2_gfx3d gfx3d_clk_src = {
                .clkr.hw.init = &(struct clk_init_data){
                        .name = "gfx3d_clk_src",
                        .parent_data = gpucc_parent_data_1,
-                       .num_parents = 4,
+                       .num_parents = ARRAY_SIZE(gpucc_parent_data_1),
                        .ops = &clk_gfx3d_ops,
                        .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
                },
@@ -154,8 +153,8 @@ static const struct parent_map gpucc_parent_map_0[] = {
 
 static const struct clk_parent_data gpucc_parent_data_0[] = {
        { .hw = &gpucc_cxo_clk.clkr.hw },
-       { .fw_name = "gcc_gpu_gpll0_clk", .name = "gcc_gpu_gpll0_clk" },
-       { .fw_name = "gcc_gpu_gpll0_div_clk", .name = "gcc_gpu_gpll0_div_clk" },
+       { .fw_name = "gcc_gpu_gpll0_clk" },
+       { .fw_name = "gcc_gpu_gpll0_div_clk" },
 };
 
 static const struct freq_tbl ftbl_rbbmtimer_clk_src[] = {
@@ -172,7 +171,7 @@ static struct clk_rcg2 rbbmtimer_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "rbbmtimer_clk_src",
                .parent_data = gpucc_parent_data_0,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gpucc_parent_data_0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -192,7 +191,7 @@ static struct clk_rcg2 rbcpr_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "rbcpr_clk_src",
                .parent_data = gpucc_parent_data_0,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gpucc_parent_data_0),
                .ops = &clk_rcg2_ops,
        },
 };
index 8590b5e..4fec1f9 100644 (file)
@@ -33,7 +33,6 @@ 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;
 
@@ -41,8 +40,7 @@ static int kpss_xcc_driver_probe(struct platform_device *pdev)
        if (!id)
                return -ENODEV;
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       base = devm_ioremap_resource(&pdev->dev, res);
+       base = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(base))
                return PTR_ERR(base);
 
diff --git a/drivers/clk/qcom/lpasscc-sc7280.c b/drivers/clk/qcom/lpasscc-sc7280.c
new file mode 100644 (file)
index 0000000..89f1ad6
--- /dev/null
@@ -0,0 +1,216 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ */
+
+#include <linux/platform_device.h>
+#include <linux/pm_clock.h>
+#include <linux/pm_runtime.h>
+#include <linux/module.h>
+#include <linux/of_address.h>
+#include <linux/regmap.h>
+
+#include <dt-bindings/clock/qcom,lpass-sc7280.h>
+
+#include "clk-regmap.h"
+#include "clk-branch.h"
+#include "common.h"
+
+static struct clk_branch lpass_q6ss_ahbm_clk = {
+       .halt_reg = 0x1c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "lpass_q6ss_ahbm_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch lpass_q6ss_ahbs_clk = {
+       .halt_reg = 0x20,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x20,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "lpass_q6ss_ahbs_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch lpass_top_cc_lpi_q6_axim_hs_clk = {
+       .halt_reg = 0x0,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "lpass_top_cc_lpi_q6_axim_hs_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch lpass_qdsp6ss_core_clk = {
+       .halt_reg = 0x20,
+       /* CLK_OFF would not toggle until LPASS is out of reset */
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x20,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "lpass_qdsp6ss_core_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch lpass_qdsp6ss_xo_clk = {
+       .halt_reg = 0x38,
+       /* CLK_OFF would not toggle until LPASS is out of reset */
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x38,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "lpass_qdsp6ss_xo_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch lpass_qdsp6ss_sleep_clk = {
+       .halt_reg = 0x3c,
+       /* CLK_OFF would not toggle until LPASS is out of reset */
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x3c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "lpass_qdsp6ss_sleep_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct regmap_config lpass_regmap_config = {
+       .reg_bits       = 32,
+       .reg_stride     = 4,
+       .val_bits       = 32,
+       .fast_io        = true,
+};
+
+static struct clk_regmap *lpass_cc_sc7280_clocks[] = {
+       [LPASS_Q6SS_AHBM_CLK] = &lpass_q6ss_ahbm_clk.clkr,
+       [LPASS_Q6SS_AHBS_CLK] = &lpass_q6ss_ahbs_clk.clkr,
+};
+
+static const struct qcom_cc_desc lpass_cc_sc7280_desc = {
+       .config = &lpass_regmap_config,
+       .clks = lpass_cc_sc7280_clocks,
+       .num_clks = ARRAY_SIZE(lpass_cc_sc7280_clocks),
+};
+
+static struct clk_regmap *lpass_cc_top_sc7280_clocks[] = {
+       [LPASS_TOP_CC_LPI_Q6_AXIM_HS_CLK] =
+                               &lpass_top_cc_lpi_q6_axim_hs_clk.clkr,
+};
+
+static const struct qcom_cc_desc lpass_cc_top_sc7280_desc = {
+       .config = &lpass_regmap_config,
+       .clks = lpass_cc_top_sc7280_clocks,
+       .num_clks = ARRAY_SIZE(lpass_cc_top_sc7280_clocks),
+};
+
+static struct clk_regmap *lpass_qdsp6ss_sc7280_clocks[] = {
+       [LPASS_QDSP6SS_XO_CLK] = &lpass_qdsp6ss_xo_clk.clkr,
+       [LPASS_QDSP6SS_SLEEP_CLK] = &lpass_qdsp6ss_sleep_clk.clkr,
+       [LPASS_QDSP6SS_CORE_CLK] = &lpass_qdsp6ss_core_clk.clkr,
+};
+
+static const struct qcom_cc_desc lpass_qdsp6ss_sc7280_desc = {
+       .config = &lpass_regmap_config,
+       .clks = lpass_qdsp6ss_sc7280_clocks,
+       .num_clks = ARRAY_SIZE(lpass_qdsp6ss_sc7280_clocks),
+};
+
+static int lpass_cc_sc7280_probe(struct platform_device *pdev)
+{
+       const struct qcom_cc_desc *desc;
+       int ret;
+
+       pm_runtime_enable(&pdev->dev);
+       ret = pm_clk_create(&pdev->dev);
+       if (ret)
+               goto disable_pm_runtime;
+
+       ret = pm_clk_add(&pdev->dev, "iface");
+       if (ret < 0) {
+               dev_err(&pdev->dev, "failed to acquire iface clock\n");
+               goto destroy_pm_clk;
+       }
+
+       lpass_regmap_config.name = "qdsp6ss";
+       desc = &lpass_qdsp6ss_sc7280_desc;
+
+       ret = qcom_cc_probe_by_index(pdev, 0, desc);
+       if (ret)
+               goto destroy_pm_clk;
+
+       lpass_regmap_config.name = "top_cc";
+       desc = &lpass_cc_top_sc7280_desc;
+
+       ret = qcom_cc_probe_by_index(pdev, 1, desc);
+       if (ret)
+               goto destroy_pm_clk;
+
+       lpass_regmap_config.name = "cc";
+       desc = &lpass_cc_sc7280_desc;
+
+       ret = qcom_cc_probe_by_index(pdev, 2, desc);
+       if (ret)
+               goto destroy_pm_clk;
+
+       return 0;
+
+destroy_pm_clk:
+       pm_clk_destroy(&pdev->dev);
+
+disable_pm_runtime:
+       pm_runtime_disable(&pdev->dev);
+
+       return ret;
+}
+
+static const struct of_device_id lpass_cc_sc7280_match_table[] = {
+       { .compatible = "qcom,sc7280-lpasscc" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, lpass_cc_sc7280_match_table);
+
+static struct platform_driver lpass_cc_sc7280_driver = {
+       .probe          = lpass_cc_sc7280_probe,
+       .driver         = {
+               .name   = "sc7280-lpasscc",
+               .of_match_table = lpass_cc_sc7280_match_table,
+       },
+};
+
+static int __init lpass_cc_sc7280_init(void)
+{
+       return platform_driver_register(&lpass_cc_sc7280_driver);
+}
+subsys_initcall(lpass_cc_sc7280_init);
+
+static void __exit lpass_cc_sc7280_exit(void)
+{
+       platform_driver_unregister(&lpass_cc_sc7280_driver);
+}
+module_exit(lpass_cc_sc7280_exit);
+
+MODULE_DESCRIPTION("QTI LPASS_CC SC7280 Driver");
+MODULE_LICENSE("GPL v2");
index 467dadc..c421b12 100644 (file)
@@ -53,8 +53,7 @@ static struct clk_fixed_factor gpll0_div = {
        .hw.init = &(struct clk_init_data){
                .name = "mmss_gpll0_div",
                .parent_data = &(const struct clk_parent_data){
-                       .fw_name = "gpll0",
-                       .name = "gpll0"
+                       .fw_name = "gpll0"
                },
                .num_parents = 1,
                .ops = &clk_fixed_factor_ops,
@@ -78,8 +77,7 @@ static struct clk_alpha_pll mmpll0 = {
                .hw.init = &(struct clk_init_data){
                        .name = "mmpll0",
                        .parent_data = &(const struct clk_parent_data){
-                               .fw_name = "xo",
-                               .name = "xo"
+                               .fw_name = "xo"
                        },
                        .num_parents = 1,
                        .ops = &clk_alpha_pll_fixed_fabia_ops,
@@ -111,8 +109,7 @@ static struct clk_alpha_pll mmpll1 = {
                .hw.init = &(struct clk_init_data){
                        .name = "mmpll1",
                        .parent_data = &(const struct clk_parent_data){
-                               .fw_name = "xo",
-                               .name = "xo"
+                               .fw_name = "xo"
                        },
                        .num_parents = 1,
                        .ops = &clk_alpha_pll_fixed_fabia_ops,
@@ -141,8 +138,7 @@ static struct clk_alpha_pll mmpll3 = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "mmpll3",
                .parent_data = &(const struct clk_parent_data){
-                       .fw_name = "xo",
-                       .name = "xo"
+                       .fw_name = "xo"
                },
                .num_parents = 1,
                .ops = &clk_alpha_pll_fixed_fabia_ops,
@@ -170,8 +166,7 @@ static struct clk_alpha_pll mmpll4 = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "mmpll4",
                .parent_data = &(const struct clk_parent_data){
-                       .fw_name = "xo",
-                       .name = "xo"
+                       .fw_name = "xo"
                },
                .num_parents = 1,
                .ops = &clk_alpha_pll_fixed_fabia_ops,
@@ -199,8 +194,7 @@ static struct clk_alpha_pll mmpll5 = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "mmpll5",
                .parent_data = &(const struct clk_parent_data){
-                       .fw_name = "xo",
-                       .name = "xo"
+                       .fw_name = "xo"
                },
                .num_parents = 1,
                .ops = &clk_alpha_pll_fixed_fabia_ops,
@@ -228,8 +222,7 @@ static struct clk_alpha_pll mmpll6 = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "mmpll6",
                .parent_data = &(const struct clk_parent_data){
-                       .fw_name = "xo",
-                       .name = "xo"
+                       .fw_name = "xo"
                },
                .num_parents = 1,
                .ops = &clk_alpha_pll_fixed_fabia_ops,
@@ -257,8 +250,7 @@ static struct clk_alpha_pll mmpll7 = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "mmpll7",
                .parent_data = &(const struct clk_parent_data){
-                       .fw_name = "xo",
-                       .name = "xo"
+                       .fw_name = "xo"
                },
                .num_parents = 1,
                .ops = &clk_alpha_pll_fixed_fabia_ops,
@@ -286,8 +278,7 @@ static struct clk_alpha_pll mmpll10 = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "mmpll10",
                .parent_data = &(const struct clk_parent_data){
-                       .fw_name = "xo",
-                       .name = "xo"
+                       .fw_name = "xo"
                },
                .num_parents = 1,
                .ops = &clk_alpha_pll_fixed_fabia_ops,
@@ -316,9 +307,9 @@ static const struct parent_map mmss_xo_hdmi_map[] = {
 };
 
 static const struct clk_parent_data mmss_xo_hdmi[] = {
-       { .fw_name = "xo", .name = "xo" },
-       { .fw_name = "hdmipll", .name = "hdmipll" },
-       { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
+       { .fw_name = "xo" },
+       { .fw_name = "hdmipll" },
+       { .fw_name = "core_bi_pll_test_se" },
 };
 
 static const struct parent_map mmss_xo_dsi0pll_dsi1pll_map[] = {
@@ -329,10 +320,10 @@ static const struct parent_map mmss_xo_dsi0pll_dsi1pll_map[] = {
 };
 
 static const struct clk_parent_data mmss_xo_dsi0pll_dsi1pll[] = {
-       { .fw_name = "xo", .name = "xo" },
-       { .fw_name = "dsi0dsi", .name = "dsi0dsi" },
-       { .fw_name = "dsi1dsi", .name = "dsi1dsi" },
-       { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
+       { .fw_name = "xo" },
+       { .fw_name = "dsi0dsi" },
+       { .fw_name = "dsi1dsi" },
+       { .fw_name = "core_bi_pll_test_se" },
 };
 
 static const struct parent_map mmss_xo_dsibyte_map[] = {
@@ -343,10 +334,10 @@ static const struct parent_map mmss_xo_dsibyte_map[] = {
 };
 
 static const struct clk_parent_data mmss_xo_dsibyte[] = {
-       { .fw_name = "xo", .name = "xo" },
-       { .fw_name = "dsi0byte", .name = "dsi0byte" },
-       { .fw_name = "dsi1byte", .name = "dsi1byte" },
-       { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
+       { .fw_name = "xo" },
+       { .fw_name = "dsi0byte" },
+       { .fw_name = "dsi1byte" },
+       { .fw_name = "core_bi_pll_test_se" },
 };
 
 static const struct parent_map mmss_xo_dp_map[] = {
@@ -357,10 +348,10 @@ static const struct parent_map mmss_xo_dp_map[] = {
 };
 
 static const struct clk_parent_data mmss_xo_dp[] = {
-       { .fw_name = "xo", .name = "xo" },
-       { .fw_name = "dplink", .name = "dplink" },
-       { .fw_name = "dpvco", .name = "dpvco" },
-       { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
+       { .fw_name = "xo" },
+       { .fw_name = "dplink" },
+       { .fw_name = "dpvco" },
+       { .fw_name = "core_bi_pll_test_se" },
 };
 
 static const struct parent_map mmss_xo_gpll0_gpll0_div_map[] = {
@@ -371,10 +362,10 @@ static const struct parent_map mmss_xo_gpll0_gpll0_div_map[] = {
 };
 
 static const struct clk_parent_data mmss_xo_gpll0_gpll0_div[] = {
-       { .fw_name = "xo", .name = "xo" },
-       { .fw_name = "gpll0", .name = "gpll0" },
+       { .fw_name = "xo" },
+       { .fw_name = "gpll0" },
        { .hw = &gpll0_div.hw },
-       { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
+       { .fw_name = "core_bi_pll_test_se" },
 };
 
 static const struct parent_map mmss_xo_mmpll0_gpll0_gpll0_div_map[] = {
@@ -386,11 +377,11 @@ static const struct parent_map mmss_xo_mmpll0_gpll0_gpll0_div_map[] = {
 };
 
 static const struct clk_parent_data mmss_xo_mmpll0_gpll0_gpll0_div[] = {
-       { .fw_name = "xo", .name = "xo" },
+       { .fw_name = "xo" },
        { .hw = &mmpll0_out_even.clkr.hw },
-       { .fw_name = "gpll0", .name = "gpll0" },
+       { .fw_name = "gpll0" },
        { .hw = &gpll0_div.hw },
-       { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
+       { .fw_name = "core_bi_pll_test_se" },
 };
 
 static const struct parent_map mmss_xo_mmpll0_mmpll1_gpll0_gpll0_div_map[] = {
@@ -403,12 +394,12 @@ static const struct parent_map mmss_xo_mmpll0_mmpll1_gpll0_gpll0_div_map[] = {
 };
 
 static const struct clk_parent_data mmss_xo_mmpll0_mmpll1_gpll0_gpll0_div[] = {
-       { .fw_name = "xo", .name = "xo" },
+       { .fw_name = "xo" },
        { .hw = &mmpll0_out_even.clkr.hw },
        { .hw = &mmpll1_out_even.clkr.hw },
-       { .fw_name = "gpll0", .name = "gpll0" },
+       { .fw_name = "gpll0" },
        { .hw = &gpll0_div.hw },
-       { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
+       { .fw_name = "core_bi_pll_test_se" },
 };
 
 static const struct parent_map mmss_xo_mmpll0_mmpll5_gpll0_gpll0_div_map[] = {
@@ -421,12 +412,12 @@ static const struct parent_map mmss_xo_mmpll0_mmpll5_gpll0_gpll0_div_map[] = {
 };
 
 static const struct clk_parent_data mmss_xo_mmpll0_mmpll5_gpll0_gpll0_div[] = {
-       { .fw_name = "xo", .name = "xo" },
+       { .fw_name = "xo" },
        { .hw = &mmpll0_out_even.clkr.hw },
        { .hw = &mmpll5_out_even.clkr.hw },
-       { .fw_name = "gpll0", .name = "gpll0" },
+       { .fw_name = "gpll0" },
        { .hw = &gpll0_div.hw },
-       { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
+       { .fw_name = "core_bi_pll_test_se" },
 };
 
 static const struct parent_map mmss_xo_mmpll0_mmpll3_mmpll6_gpll0_gpll0_div_map[] = {
@@ -440,13 +431,13 @@ static const struct parent_map mmss_xo_mmpll0_mmpll3_mmpll6_gpll0_gpll0_div_map[
 };
 
 static const struct clk_parent_data mmss_xo_mmpll0_mmpll3_mmpll6_gpll0_gpll0_div[] = {
-       { .fw_name = "xo", .name = "xo" },
+       { .fw_name = "xo" },
        { .hw = &mmpll0_out_even.clkr.hw },
        { .hw = &mmpll3_out_even.clkr.hw },
        { .hw = &mmpll6_out_even.clkr.hw },
-       { .fw_name = "gpll0", .name = "gpll0" },
+       { .fw_name = "gpll0" },
        { .hw = &gpll0_div.hw },
-       { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
+       { .fw_name = "core_bi_pll_test_se" },
 };
 
 static const struct parent_map mmss_xo_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map[] = {
@@ -460,13 +451,13 @@ static const struct parent_map mmss_xo_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map
 };
 
 static const struct clk_parent_data mmss_xo_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div[] = {
-       { .fw_name = "xo", .name = "xo" },
+       { .fw_name = "xo" },
        { .hw = &mmpll4_out_even.clkr.hw },
        { .hw = &mmpll7_out_even.clkr.hw },
        { .hw = &mmpll10_out_even.clkr.hw },
-       { .fw_name = "gpll0", .name = "gpll0" },
+       { .fw_name = "gpll0" },
        { .hw = &gpll0_div.hw },
-       { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
+       { .fw_name = "core_bi_pll_test_se" },
 };
 
 static const struct parent_map mmss_xo_mmpll0_mmpll7_mmpll10_gpll0_gpll0_div_map[] = {
@@ -480,13 +471,13 @@ static const struct parent_map mmss_xo_mmpll0_mmpll7_mmpll10_gpll0_gpll0_div_map
 };
 
 static const struct clk_parent_data mmss_xo_mmpll0_mmpll7_mmpll10_gpll0_gpll0_div[] = {
-       { .fw_name = "xo", .name = "xo" },
+       { .fw_name = "xo" },
        { .hw = &mmpll0_out_even.clkr.hw },
        { .hw = &mmpll7_out_even.clkr.hw },
        { .hw = &mmpll10_out_even.clkr.hw },
-       { .fw_name = "gpll0", .name = "gpll0" },
+       { .fw_name = "gpll0" },
        { .hw = &gpll0_div.hw },
-       { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
+       { .fw_name = "core_bi_pll_test_se" },
 };
 
 static const struct parent_map mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div_map[] = {
@@ -501,14 +492,14 @@ static const struct parent_map mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_
 };
 
 static const struct clk_parent_data mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div[] = {
-       { .fw_name = "xo", .name = "xo" },
+       { .fw_name = "xo" },
        { .hw = &mmpll0_out_even.clkr.hw },
        { .hw = &mmpll4_out_even.clkr.hw },
        { .hw = &mmpll7_out_even.clkr.hw },
        { .hw = &mmpll10_out_even.clkr.hw },
-       { .fw_name = "gpll0", .name = "gpll0" },
+       { .fw_name = "gpll0" },
        { .hw = &gpll0_div.hw },
-       { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" },
+       { .fw_name = "core_bi_pll_test_se" },
 };
 
 static struct clk_rcg2 byte0_clk_src = {
@@ -518,7 +509,7 @@ static struct clk_rcg2 byte0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "byte0_clk_src",
                .parent_data = mmss_xo_dsibyte,
-               .num_parents = 4,
+               .num_parents = ARRAY_SIZE(mmss_xo_dsibyte),
                .ops = &clk_byte2_ops,
                .flags = CLK_SET_RATE_PARENT,
        },
@@ -531,7 +522,7 @@ static struct clk_rcg2 byte1_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "byte1_clk_src",
                .parent_data = mmss_xo_dsibyte,
-               .num_parents = 4,
+               .num_parents = ARRAY_SIZE(mmss_xo_dsibyte),
                .ops = &clk_byte2_ops,
                .flags = CLK_SET_RATE_PARENT,
        },
@@ -552,7 +543,7 @@ static struct clk_rcg2 cci_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "cci_clk_src",
                .parent_data = mmss_xo_mmpll0_mmpll7_mmpll10_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll7_mmpll10_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -576,7 +567,7 @@ static struct clk_rcg2 cpp_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "cpp_clk_src",
                .parent_data = mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
-               .num_parents = 8,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -599,7 +590,7 @@ static struct clk_rcg2 csi0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "csi0_clk_src",
                .parent_data = mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
-               .num_parents = 8,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -612,7 +603,7 @@ static struct clk_rcg2 csi1_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "csi1_clk_src",
                .parent_data = mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
-               .num_parents = 8,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -625,7 +616,7 @@ static struct clk_rcg2 csi2_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "csi2_clk_src",
                .parent_data = mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
-               .num_parents = 8,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -638,7 +629,7 @@ static struct clk_rcg2 csi3_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "csi3_clk_src",
                .parent_data = mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
-               .num_parents = 8,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -660,7 +651,7 @@ static struct clk_rcg2 csiphy_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "csiphy_clk_src",
                .parent_data = mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
-               .num_parents = 8,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -679,7 +670,7 @@ static struct clk_rcg2 csi0phytimer_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "csi0phytimer_clk_src",
                .parent_data = mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
-               .num_parents = 8,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -692,7 +683,7 @@ static struct clk_rcg2 csi1phytimer_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "csi1phytimer_clk_src",
                .parent_data = mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
-               .num_parents = 8,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -705,7 +696,7 @@ static struct clk_rcg2 csi2phytimer_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "csi2phytimer_clk_src",
                .parent_data = mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
-               .num_parents = 8,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -723,7 +714,7 @@ static struct clk_rcg2 dp_aux_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "dp_aux_clk_src",
                .parent_data = mmss_xo_gpll0_gpll0_div,
-               .num_parents = 4,
+               .num_parents = ARRAY_SIZE(mmss_xo_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -743,7 +734,7 @@ static struct clk_rcg2 dp_crypto_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "dp_crypto_clk_src",
                .parent_data = mmss_xo_dp,
-               .num_parents = 4,
+               .num_parents = ARRAY_SIZE(mmss_xo_dp),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -763,7 +754,7 @@ static struct clk_rcg2 dp_link_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "dp_link_clk_src",
                .parent_data = mmss_xo_dp,
-               .num_parents = 4,
+               .num_parents = ARRAY_SIZE(mmss_xo_dp),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -783,7 +774,7 @@ static struct clk_rcg2 dp_pixel_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "dp_pixel_clk_src",
                .parent_data = mmss_xo_dp,
-               .num_parents = 4,
+               .num_parents = ARRAY_SIZE(mmss_xo_dp),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -801,7 +792,7 @@ static struct clk_rcg2 esc0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "esc0_clk_src",
                .parent_data = mmss_xo_dsibyte,
-               .num_parents = 4,
+               .num_parents = ARRAY_SIZE(mmss_xo_dsibyte),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -814,7 +805,7 @@ static struct clk_rcg2 esc1_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "esc1_clk_src",
                .parent_data = mmss_xo_dsibyte,
-               .num_parents = 4,
+               .num_parents = ARRAY_SIZE(mmss_xo_dsibyte),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -832,7 +823,7 @@ static struct clk_rcg2 extpclk_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "extpclk_clk_src",
                .parent_data = mmss_xo_hdmi,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(mmss_xo_hdmi),
                .ops = &clk_byte_ops,
                .flags = CLK_SET_RATE_PARENT,
        },
@@ -855,7 +846,7 @@ static struct clk_rcg2 fd_core_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "fd_core_clk_src",
                .parent_data = mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
-               .num_parents = 8,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -873,7 +864,7 @@ static struct clk_rcg2 hdmi_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "hdmi_clk_src",
                .parent_data = mmss_xo_gpll0_gpll0_div,
-               .num_parents = 4,
+               .num_parents = ARRAY_SIZE(mmss_xo_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -894,7 +885,7 @@ static struct clk_rcg2 jpeg0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "jpeg0_clk_src",
                .parent_data = mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
-               .num_parents = 8,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -916,7 +907,7 @@ static struct clk_rcg2 maxi_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "maxi_clk_src",
                .parent_data = mmss_xo_mmpll0_mmpll1_gpll0_gpll0_div,
-               .num_parents = 6,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll1_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -943,7 +934,7 @@ static struct clk_rcg2 mclk0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "mclk0_clk_src",
                .parent_data = mmss_xo_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -956,7 +947,7 @@ static struct clk_rcg2 mclk1_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "mclk1_clk_src",
                .parent_data = mmss_xo_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -969,7 +960,7 @@ static struct clk_rcg2 mclk2_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "mclk2_clk_src",
                .parent_data = mmss_xo_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -982,7 +973,7 @@ static struct clk_rcg2 mclk3_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "mclk3_clk_src",
                .parent_data = mmss_xo_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1008,7 +999,7 @@ static struct clk_rcg2 mdp_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "mdp_clk_src",
                .parent_data = mmss_xo_mmpll0_mmpll5_gpll0_gpll0_div,
-               .num_parents = 6,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll5_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1026,7 +1017,7 @@ static struct clk_rcg2 vsync_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "vsync_clk_src",
                .parent_data = mmss_xo_gpll0_gpll0_div,
-               .num_parents = 4,
+               .num_parents = ARRAY_SIZE(mmss_xo_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1046,7 +1037,7 @@ static struct clk_rcg2 ahb_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "ahb_clk_src",
                .parent_data = mmss_xo_mmpll0_gpll0_gpll0_div,
-               .num_parents = 5,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll0_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1069,7 +1060,7 @@ static struct clk_rcg2 axi_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "axi_clk_src",
                .parent_data = mmss_xo_mmpll0_mmpll1_gpll0_gpll0_div,
-               .num_parents = 6,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll1_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1082,7 +1073,7 @@ static struct clk_rcg2 pclk0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pclk0_clk_src",
                .parent_data = mmss_xo_dsi0pll_dsi1pll,
-               .num_parents = 4,
+               .num_parents = ARRAY_SIZE(mmss_xo_dsi0pll_dsi1pll),
                .ops = &clk_pixel_ops,
                .flags = CLK_SET_RATE_PARENT,
        },
@@ -1096,7 +1087,7 @@ static struct clk_rcg2 pclk1_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pclk1_clk_src",
                .parent_data = mmss_xo_dsi0pll_dsi1pll,
-               .num_parents = 4,
+               .num_parents = ARRAY_SIZE(mmss_xo_dsi0pll_dsi1pll),
                .ops = &clk_pixel_ops,
                .flags = CLK_SET_RATE_PARENT,
        },
@@ -1118,7 +1109,7 @@ static struct clk_rcg2 rot_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "rot_clk_src",
                .parent_data = mmss_xo_mmpll0_mmpll5_gpll0_gpll0_div,
-               .num_parents = 6,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll5_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1140,7 +1131,7 @@ static struct clk_rcg2 video_core_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "video_core_clk_src",
                .parent_data = mmss_xo_mmpll0_mmpll3_mmpll6_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll3_mmpll6_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1153,7 +1144,7 @@ static struct clk_rcg2 video_subcore0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "video_subcore0_clk_src",
                .parent_data = mmss_xo_mmpll0_mmpll3_mmpll6_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll3_mmpll6_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1166,7 +1157,7 @@ static struct clk_rcg2 video_subcore1_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "video_subcore1_clk_src",
                .parent_data = mmss_xo_mmpll0_mmpll3_mmpll6_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll3_mmpll6_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1191,7 +1182,7 @@ static struct clk_rcg2 vfe0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "vfe0_clk_src",
                .parent_data = mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
-               .num_parents = 8,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1204,7 +1195,7 @@ static struct clk_rcg2 vfe1_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "vfe1_clk_src",
                .parent_data = mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
-               .num_parents = 8,
+               .num_parents = ARRAY_SIZE(mmss_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
index 941993b..bc19a23 100644 (file)
@@ -483,7 +483,7 @@ static struct clk_rcg2 ahb_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "ahb_clk_src",
                .parent_data = mmcc_xo_mmpll0_gpll0_gpll0_div,
-               .num_parents = 4,
+               .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -496,7 +496,7 @@ static struct clk_rcg2 byte0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "byte0_clk_src",
                .parent_data = mmcc_xo_dsibyte,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
                .ops = &clk_byte2_ops,
                .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
        },
@@ -510,7 +510,7 @@ static struct clk_rcg2 byte1_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "byte1_clk_src",
                .parent_data = mmcc_xo_dsibyte,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
                .ops = &clk_byte2_ops,
                .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
        },
@@ -538,7 +538,7 @@ static struct clk_rcg2 camss_gp0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "camss_gp0_clk_src",
                .parent_data = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -552,7 +552,7 @@ static struct clk_rcg2 camss_gp1_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "camss_gp1_clk_src",
                .parent_data = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -573,7 +573,7 @@ static struct clk_rcg2 cci_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "cci_clk_src",
                .parent_data = mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -597,7 +597,7 @@ static struct clk_rcg2 cpp_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "cpp_clk_src",
                .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_mmpll6),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -620,7 +620,7 @@ static struct clk_rcg2 csi0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "csi0_clk_src",
                .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -641,7 +641,7 @@ static struct clk_rcg2 csi0phytimer_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "csi0phytimer_clk_src",
                .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -655,7 +655,7 @@ static struct clk_rcg2 csi1_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "csi1_clk_src",
                .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -669,7 +669,7 @@ static struct clk_rcg2 csi1phytimer_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "csi1phytimer_clk_src",
                .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -683,7 +683,7 @@ static struct clk_rcg2 csi2_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "csi2_clk_src",
                .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -697,7 +697,7 @@ static struct clk_rcg2 csi2phytimer_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "csi2phytimer_clk_src",
                .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -711,7 +711,7 @@ static struct clk_rcg2 csi3_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "csi3_clk_src",
                .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -733,7 +733,7 @@ static struct clk_rcg2 csiphy_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "csiphy_clk_src",
                .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll8_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -752,7 +752,7 @@ static struct clk_rcg2 dp_aux_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "dp_aux_clk_src",
                .parent_data = mmcc_xo_gpll0_gpll0_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -773,7 +773,7 @@ static struct clk_rcg2 dp_crypto_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "dp_crypto_clk_src",
                .parent_data = mmcc_xo_dplink_dpvco,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(mmcc_xo_dplink_dpvco),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -793,7 +793,7 @@ static struct clk_rcg2 dp_gtc_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "dp_gtc_clk_src",
                .parent_data = mmcc_xo_gpll0_gpll0_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -814,7 +814,7 @@ static struct clk_rcg2 dp_link_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "dp_link_clk_src",
                .parent_data = mmcc_xo_dplink_dpvco,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(mmcc_xo_dplink_dpvco),
                .ops = &clk_rcg2_ops,
                .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
        },
@@ -828,7 +828,7 @@ static struct clk_rcg2 dp_pixel_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "dp_pixel_clk_src",
                .parent_data = mmcc_xo_dplink_dpvco,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(mmcc_xo_dplink_dpvco),
                .ops = &clk_dp_ops,
                .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
        },
@@ -842,7 +842,7 @@ static struct clk_rcg2 esc0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "esc0_clk_src",
                .parent_data = mmcc_xo_dsibyte,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -855,7 +855,7 @@ static struct clk_rcg2 esc1_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "esc1_clk_src",
                .parent_data = mmcc_xo_dsibyte,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -878,7 +878,7 @@ static struct clk_rcg2 jpeg0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "jpeg0_clk_src",
                .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -906,7 +906,7 @@ static struct clk_rcg2 mclk0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "mclk0_clk_src",
                .parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -920,7 +920,7 @@ static struct clk_rcg2 mclk1_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "mclk1_clk_src",
                .parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -934,7 +934,7 @@ static struct clk_rcg2 mclk2_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "mclk2_clk_src",
                .parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -948,7 +948,7 @@ static struct clk_rcg2 mclk3_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "mclk3_clk_src",
                .parent_data = mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmcc_xo_mmpll4_mmpll7_mmpll10_sleep_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -974,7 +974,7 @@ static struct clk_rcg2 mdp_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "mdp_clk_src",
                .parent_data = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div,
-               .num_parents = 6,
+               .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -987,7 +987,7 @@ static struct clk_rcg2 pclk0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pclk0_clk_src",
                .parent_data = mmcc_xo_dsi0pll_dsi1pll,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(mmcc_xo_dsi0pll_dsi1pll),
                .ops = &clk_pixel_ops,
                .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
        },
@@ -1001,7 +1001,7 @@ static struct clk_rcg2 pclk1_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pclk1_clk_src",
                .parent_data = mmcc_xo_dsi0pll_dsi1pll,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(mmcc_xo_dsi0pll_dsi1pll),
                .ops = &clk_pixel_ops,
                .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
        },
@@ -1025,7 +1025,7 @@ static struct clk_rcg2 rot_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "rot_clk_src",
                .parent_data = mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div,
-               .num_parents = 6,
+               .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll5_mmpll7_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1051,7 +1051,7 @@ static struct clk_rcg2 vfe0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "vfe0_clk_src",
                .parent_data = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1065,7 +1065,7 @@ static struct clk_rcg2 vfe1_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "vfe1_clk_src",
                .parent_data = mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmcc_mmpll0_mmpll4_mmpll7_mmpll10_mmpll6_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1089,7 +1089,7 @@ static struct clk_rcg2 video_core_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "video_core_clk_src",
                .parent_data = mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll8_mmpll3_mmpll6_gpll0_mmpll7),
                .ops = &clk_rcg2_ops,
                .flags = CLK_IS_CRITICAL,
        },
@@ -1104,7 +1104,7 @@ static struct clk_rcg2 vsync_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "vsync_clk_src",
                .parent_data = mmcc_xo_gpll0_gpll0_div,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -2055,7 +2055,7 @@ static struct clk_rcg2 axi_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "axi_clk_src",
                .parent_data = mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div,
-               .num_parents = 7,
+               .num_parents = ARRAY_SIZE(mmcc_xo_mmpll0_mmpll4_mmpll7_mmpll10_gpll0_gpll0_div),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -2560,6 +2560,8 @@ static struct clk_branch video_subcore0_clk = {
 
 static struct gdsc venus_gdsc = {
        .gdscr = 0x1024,
+       .cxcs = (unsigned int[]){ 0x1028, 0x1034, 0x1048 },
+       .cxc_count = 3,
        .pd = {
                .name = "venus",
        },
@@ -2573,6 +2575,7 @@ static struct gdsc venus_core0_gdsc = {
        },
        .parent = &venus_gdsc.pd,
        .pwrsts = PWRSTS_OFF_ON,
+       .flags = HW_CTRL,
 };
 
 static struct gdsc mdss_gdsc = {
index 7b435a1..8617454 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/clk-provider.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
 #include <linux/regmap.h>
 
 #include <dt-bindings/clock/qcom,videocc-sm8250.h>
@@ -364,13 +365,31 @@ static const struct of_device_id video_cc_sm8250_match_table[] = {
 };
 MODULE_DEVICE_TABLE(of, video_cc_sm8250_match_table);
 
+static void video_cc_sm8250_pm_runtime_disable(void *data)
+{
+       pm_runtime_disable(data);
+}
+
 static int video_cc_sm8250_probe(struct platform_device *pdev)
 {
        struct regmap *regmap;
+       int ret;
+
+       pm_runtime_enable(&pdev->dev);
+
+       ret = devm_add_action_or_reset(&pdev->dev, video_cc_sm8250_pm_runtime_disable, &pdev->dev);
+       if (ret)
+               return ret;
+
+       ret = pm_runtime_resume_and_get(&pdev->dev);
+       if (ret)
+               return ret;
 
        regmap = qcom_cc_map(pdev, &video_cc_sm8250_desc);
-       if (IS_ERR(regmap))
+       if (IS_ERR(regmap)) {
+               pm_runtime_put(&pdev->dev);
                return PTR_ERR(regmap);
+       }
 
        clk_lucid_pll_configure(&video_pll0, regmap, &video_pll0_config);
        clk_lucid_pll_configure(&video_pll1, regmap, &video_pll1_config);
@@ -379,7 +398,11 @@ static int video_cc_sm8250_probe(struct platform_device *pdev)
        regmap_update_bits(regmap, 0xe58, BIT(0), BIT(0));
        regmap_update_bits(regmap, 0xeec, BIT(0), BIT(0));
 
-       return qcom_cc_really_probe(pdev, &video_cc_sm8250_desc, regmap);
+       ret = qcom_cc_really_probe(pdev, &video_cc_sm8250_desc, regmap);
+
+       pm_runtime_put(&pdev->dev);
+
+       return ret;
 }
 
 static struct platform_driver video_cc_sm8250_driver = {
index c32d2c6..d6b1d01 100644 (file)
@@ -229,6 +229,7 @@ static struct mssr_mod_clk r8a7795_mod_clks[] __initdata = {
        DEF_MOD("lvds",                  727,   R8A7795_CLK_S0D4),
        DEF_MOD("hdmi1",                 728,   R8A7795_CLK_HDMI),
        DEF_MOD("hdmi0",                 729,   R8A7795_CLK_HDMI),
+       DEF_MOD("mlp",                   802,   R8A7795_CLK_S2D1),
        DEF_MOD("vin7",                  804,   R8A7795_CLK_S0D2),
        DEF_MOD("vin6",                  805,   R8A7795_CLK_S0D2),
        DEF_MOD("vin5",                  806,   R8A7795_CLK_S0D2),
index 41593c1..9c22977 100644 (file)
@@ -207,6 +207,7 @@ static struct mssr_mod_clk r8a7796_mod_clks[] __initdata = {
        DEF_MOD("du0",                   724,   R8A7796_CLK_S2D1),
        DEF_MOD("lvds",                  727,   R8A7796_CLK_S2D1),
        DEF_MOD("hdmi0",                 729,   R8A7796_CLK_HDMI),
+       DEF_MOD("mlp",                   802,   R8A7796_CLK_S2D1),
        DEF_MOD("vin7",                  804,   R8A7796_CLK_S0D2),
        DEF_MOD("vin6",                  805,   R8A7796_CLK_S0D2),
        DEF_MOD("vin5",                  806,   R8A7796_CLK_S0D2),
index bc1be8b..7eee45a 100644 (file)
@@ -205,6 +205,7 @@ static const struct mssr_mod_clk r8a77965_mod_clks[] __initconst = {
        DEF_MOD("lvds",                 727,    R8A77965_CLK_S2D1),
        DEF_MOD("hdmi0",                729,    R8A77965_CLK_HDMI),
 
+       DEF_MOD("mlp",                  802,    R8A77965_CLK_S2D1),
        DEF_MOD("vin7",                 804,    R8A77965_CLK_S0D2),
        DEF_MOD("vin6",                 805,    R8A77965_CLK_S0D2),
        DEF_MOD("vin5",                 806,    R8A77965_CLK_S0D2),
index f16d125..fbd7454 100644 (file)
@@ -33,9 +33,13 @@ enum rcar_r8a779a0_clk_types {
        CLK_TYPE_R8A779A0_PLL1,
        CLK_TYPE_R8A779A0_PLL2X_3X,     /* PLL[23][01] */
        CLK_TYPE_R8A779A0_PLL5,
+       CLK_TYPE_R8A779A0_Z,
        CLK_TYPE_R8A779A0_SD,
        CLK_TYPE_R8A779A0_MDSEL,        /* Select parent/divider using mode pin */
        CLK_TYPE_R8A779A0_OSC,  /* OSC EXTAL predivider and fixed divider */
+       CLK_TYPE_R8A779A0_RPCSRC,
+       CLK_TYPE_R8A779A0_RPC,
+       CLK_TYPE_R8A779A0_RPCD2,
 };
 
 struct rcar_r8a779a0_cpg_pll_config {
@@ -84,6 +88,10 @@ enum clk_ids {
        DEF_BASE(_name, _id, CLK_TYPE_R8A779A0_PLL2X_3X, CLK_MAIN, \
                 .offset = _offset)
 
+#define DEF_Z(_name, _id, _parent, _div, _offset)      \
+       DEF_BASE(_name, _id, CLK_TYPE_R8A779A0_Z, _parent, .div = _div, \
+                .offset = _offset)
+
 #define DEF_SD(_name, _id, _parent, _offset)   \
        DEF_BASE(_name, _id, CLK_TYPE_R8A779A0_SD, _parent, .offset = _offset)
 
@@ -120,8 +128,14 @@ static const struct cpg_core_clk r8a779a0_core_clks[] __initconst = {
        DEF_FIXED(".s3",                CLK_S3,         CLK_PLL1_DIV2,  4, 1),
        DEF_FIXED(".sdsrc",             CLK_SDSRC,      CLK_PLL5_DIV4,  1, 1),
        DEF_RATE(".oco",                CLK_OCO,        32768),
+       DEF_BASE(".rpcsrc",      CLK_RPCSRC,       CLK_TYPE_R8A779A0_RPCSRC, CLK_PLL5),
+       DEF_BASE("rpc",          R8A779A0_CLK_RPC, CLK_TYPE_R8A779A0_RPC, CLK_RPCSRC),
+       DEF_BASE("rpcd2",        R8A779A0_CLK_RPCD2, CLK_TYPE_R8A779A0_RPCD2,
+                R8A779A0_CLK_RPC),
 
        /* Core Clock Outputs */
+       DEF_Z("z0",             R8A779A0_CLK_Z0,        CLK_PLL20,      2, 0),
+       DEF_Z("z1",             R8A779A0_CLK_Z1,        CLK_PLL21,      2, 8),
        DEF_FIXED("zx",         R8A779A0_CLK_ZX,        CLK_PLL20_DIV2, 2, 1),
        DEF_FIXED("s1d1",       R8A779A0_CLK_S1D1,      CLK_S1,         1, 1),
        DEF_FIXED("s1d2",       R8A779A0_CLK_S1D2,      CLK_S1,         2, 1),
@@ -193,6 +207,7 @@ static const struct mssr_mod_clk r8a779a0_mod_clks[] __initconst = {
        DEF_MOD("msi3",         621,    R8A779A0_CLK_MSO),
        DEF_MOD("msi4",         622,    R8A779A0_CLK_MSO),
        DEF_MOD("msi5",         623,    R8A779A0_CLK_MSO),
+       DEF_MOD("rpc-if",       629,    R8A779A0_CLK_RPCD2),
        DEF_MOD("scif0",        702,    R8A779A0_CLK_S1D8),
        DEF_MOD("scif1",        703,    R8A779A0_CLK_S1D8),
        DEF_MOD("scif3",        704,    R8A779A0_CLK_S1D8),
@@ -205,6 +220,7 @@ static const struct mssr_mod_clk r8a779a0_mod_clks[] __initconst = {
        DEF_MOD("tmu2",         715,    R8A779A0_CLK_S1D4),
        DEF_MOD("tmu3",         716,    R8A779A0_CLK_S1D4),
        DEF_MOD("tmu4",         717,    R8A779A0_CLK_S1D4),
+       DEF_MOD("tpu0",         718,    R8A779A0_CLK_S1D8),
        DEF_MOD("vin00",        730,    R8A779A0_CLK_S1D1),
        DEF_MOD("vin01",        731,    R8A779A0_CLK_S1D1),
        DEF_MOD("vin02",        800,    R8A779A0_CLK_S1D1),
@@ -259,6 +275,162 @@ static const struct rcar_r8a779a0_cpg_pll_config *cpg_pll_config __initdata;
 static unsigned int cpg_clk_extalr __initdata;
 static u32 cpg_mode __initdata;
 
+/*
+ * Z0 Clock & Z1 Clock
+ */
+#define CPG_FRQCRB                     0x00000804
+#define CPG_FRQCRB_KICK                        BIT(31)
+#define CPG_FRQCRC                     0x00000808
+
+struct cpg_z_clk {
+       struct clk_hw hw;
+       void __iomem *reg;
+       void __iomem *kick_reg;
+       unsigned long max_rate;         /* Maximum rate for normal mode */
+       unsigned int fixed_div;
+       u32 mask;
+};
+
+#define to_z_clk(_hw)  container_of(_hw, struct cpg_z_clk, hw)
+
+static unsigned long cpg_z_clk_recalc_rate(struct clk_hw *hw,
+                                          unsigned long parent_rate)
+{
+       struct cpg_z_clk *zclk = to_z_clk(hw);
+       unsigned int mult;
+       u32 val;
+
+       val = readl(zclk->reg) & zclk->mask;
+       mult = 32 - (val >> __ffs(zclk->mask));
+
+       return DIV_ROUND_CLOSEST_ULL((u64)parent_rate * mult,
+                                    32 * zclk->fixed_div);
+}
+
+static int cpg_z_clk_determine_rate(struct clk_hw *hw,
+                                   struct clk_rate_request *req)
+{
+       struct cpg_z_clk *zclk = to_z_clk(hw);
+       unsigned int min_mult, max_mult, mult;
+       unsigned long rate, prate;
+
+       rate = min(req->rate, req->max_rate);
+       if (rate <= zclk->max_rate) {
+               /* Set parent rate to initial value for normal modes */
+               prate = zclk->max_rate;
+       } else {
+               /* Set increased parent rate for boost modes */
+               prate = rate;
+       }
+       req->best_parent_rate = clk_hw_round_rate(clk_hw_get_parent(hw),
+                                                 prate * zclk->fixed_div);
+
+       prate = req->best_parent_rate / zclk->fixed_div;
+       min_mult = max(div64_ul(req->min_rate * 32ULL, prate), 1ULL);
+       max_mult = min(div64_ul(req->max_rate * 32ULL, prate), 32ULL);
+       if (max_mult < min_mult)
+               return -EINVAL;
+
+       mult = DIV_ROUND_CLOSEST_ULL(rate * 32ULL, prate);
+       mult = clamp(mult, min_mult, max_mult);
+
+       req->rate = DIV_ROUND_CLOSEST_ULL((u64)prate * mult, 32);
+       return 0;
+}
+
+static int cpg_z_clk_set_rate(struct clk_hw *hw, unsigned long rate,
+                             unsigned long parent_rate)
+{
+       struct cpg_z_clk *zclk = to_z_clk(hw);
+       unsigned int mult;
+       unsigned int i;
+
+       mult = DIV64_U64_ROUND_CLOSEST(rate * 32ULL * zclk->fixed_div,
+                                      parent_rate);
+       mult = clamp(mult, 1U, 32U);
+
+       if (readl(zclk->kick_reg) & CPG_FRQCRB_KICK)
+               return -EBUSY;
+
+       cpg_reg_modify(zclk->reg, zclk->mask, (32 - mult) << __ffs(zclk->mask));
+
+       /*
+        * Set KICK bit in FRQCRB to update hardware setting and wait for
+        * clock change completion.
+        */
+       cpg_reg_modify(zclk->kick_reg, 0, CPG_FRQCRB_KICK);
+
+       /*
+        * Note: There is no HW information about the worst case latency.
+        *
+        * Using experimental measurements, it seems that no more than
+        * ~10 iterations are needed, independently of the CPU rate.
+        * Since this value might be dependent on external xtal rate, pll1
+        * rate or even the other emulation clocks rate, use 1000 as a
+        * "super" safe value.
+        */
+       for (i = 1000; i; i--) {
+               if (!(readl(zclk->kick_reg) & CPG_FRQCRB_KICK))
+                       return 0;
+
+               cpu_relax();
+       }
+
+       return -ETIMEDOUT;
+}
+
+static const struct clk_ops cpg_z_clk_ops = {
+       .recalc_rate = cpg_z_clk_recalc_rate,
+       .determine_rate = cpg_z_clk_determine_rate,
+       .set_rate = cpg_z_clk_set_rate,
+};
+
+static struct clk * __init cpg_z_clk_register(const char *name,
+                                             const char *parent_name,
+                                             void __iomem *reg,
+                                             unsigned int div,
+                                             unsigned int offset)
+{
+       struct clk_init_data init = {};
+       struct cpg_z_clk *zclk;
+       struct clk *clk;
+
+       zclk = kzalloc(sizeof(*zclk), GFP_KERNEL);
+       if (!zclk)
+               return ERR_PTR(-ENOMEM);
+
+       init.name = name;
+       init.ops = &cpg_z_clk_ops;
+       init.flags = CLK_SET_RATE_PARENT;
+       init.parent_names = &parent_name;
+       init.num_parents = 1;
+
+       zclk->reg = reg + CPG_FRQCRC;
+       zclk->kick_reg = reg + CPG_FRQCRB;
+       zclk->hw.init = &init;
+       zclk->mask = GENMASK(offset + 4, offset);
+       zclk->fixed_div = div; /* PLLVCO x 1/div x SYS-CPU divider */
+
+       clk = clk_register(NULL, &zclk->hw);
+       if (IS_ERR(clk)) {
+               kfree(zclk);
+               return clk;
+       }
+
+       zclk->max_rate = clk_hw_get_rate(clk_hw_get_parent(&zclk->hw)) /
+                        zclk->fixed_div;
+       return clk;
+}
+
+/*
+ * RPC Clocks
+ */
+#define CPG_RPCCKCR 0x874
+
+static const struct clk_div_table cpg_rpcsrc_div_table[] = {
+       { 0, 4 }, { 1, 6 }, { 2, 5 }, { 3, 6 }, { 0, 0 },
+};
+
 static struct clk * __init rcar_r8a779a0_cpg_clk_register(struct device *dev,
        const struct cpg_core_clk *core, const struct cpg_mssr_info *info,
        struct clk **clks, void __iomem *base,
@@ -293,6 +465,10 @@ static struct clk * __init rcar_r8a779a0_cpg_clk_register(struct device *dev,
                div = cpg_pll_config->pll5_div;
                break;
 
+       case CLK_TYPE_R8A779A0_Z:
+               return cpg_z_clk_register(core->name, __clk_get_name(parent),
+                                         base, core->div, core->offset);
+
        case CLK_TYPE_R8A779A0_SD:
                return cpg_sd_clk_register(core->name, base, core->offset,
                                           __clk_get_name(parent), notifiers,
@@ -322,6 +498,21 @@ static struct clk * __init rcar_r8a779a0_cpg_clk_register(struct device *dev,
                div = cpg_pll_config->osc_prediv * core->div;
                break;
 
+       case CLK_TYPE_R8A779A0_RPCSRC:
+               return clk_register_divider_table(NULL, core->name,
+                                                 __clk_get_name(parent), 0,
+                                                 base + CPG_RPCCKCR, 3, 2, 0,
+                                                 cpg_rpcsrc_div_table,
+                                                 &cpg_lock);
+
+       case CLK_TYPE_R8A779A0_RPC:
+               return cpg_rpc_clk_register(core->name, base + CPG_RPCCKCR,
+                                           __clk_get_name(parent), notifiers);
+
+       case CLK_TYPE_R8A779A0_RPCD2:
+               return cpg_rpcd2_clk_register(core->name, base + CPG_RPCCKCR,
+                                             __clk_get_name(parent));
+
        default:
                return ERR_PTR(-EINVAL);
        }
index 1490446..47c1626 100644 (file)
@@ -29,15 +29,27 @@ enum clk_ids {
        CLK_PLL2_DIV16,
        CLK_PLL2_DIV20,
        CLK_PLL3,
+       CLK_PLL3_400,
+       CLK_PLL3_533,
        CLK_PLL3_DIV2,
        CLK_PLL3_DIV2_4,
        CLK_PLL3_DIV2_4_2,
        CLK_PLL3_DIV4,
+       CLK_SEL_PLL3_3,
+       CLK_DIV_PLL3_C,
        CLK_PLL4,
        CLK_PLL5,
-       CLK_PLL5_DIV2,
+       CLK_PLL5_FOUT3,
+       CLK_PLL5_250,
        CLK_PLL6,
+       CLK_PLL6_250,
        CLK_P1_DIV2,
+       CLK_PLL2_800,
+       CLK_PLL2_SDHI_533,
+       CLK_PLL2_SDHI_400,
+       CLK_PLL2_SDHI_266,
+       CLK_SD0_DIV4,
+       CLK_SD1_DIV4,
 
        /* Module Clocks */
        MOD_CLK_BASE,
@@ -53,6 +65,11 @@ static const struct clk_div_table dtable_1_32[] = {
        {0, 0},
 };
 
+/* Mux clock tables */
+static const char * const sel_pll3_3[] = { ".pll3_533", ".pll3_400" };
+static const char * const sel_pll6_2[] = { ".pll6_250", ".pll5_250" };
+static const char * const sel_shdi[] = { ".clk_533", ".clk_400", ".clk_266" };
+
 static const struct cpg_core_clk r9a07g044_core_clks[] __initconst = {
        /* External Clock Inputs */
        DEF_INPUT("extal", CLK_EXTAL),
@@ -63,8 +80,20 @@ static const struct cpg_core_clk r9a07g044_core_clks[] __initconst = {
        DEF_SAMPLL(".pll1", CLK_PLL1, CLK_EXTAL, PLL146_CONF(0)),
        DEF_FIXED(".pll2", CLK_PLL2, CLK_EXTAL, 133, 2),
        DEF_FIXED(".pll3", CLK_PLL3, CLK_EXTAL, 133, 2),
+       DEF_FIXED(".pll3_400", CLK_PLL3_400, CLK_PLL3, 1, 4),
+       DEF_FIXED(".pll3_533", CLK_PLL3_533, CLK_PLL3, 1, 3),
+
+       DEF_FIXED(".pll5", CLK_PLL5, CLK_EXTAL, 125, 1),
+       DEF_FIXED(".pll5_fout3", CLK_PLL5_FOUT3, CLK_PLL5, 1, 6),
+
+       DEF_FIXED(".pll6", CLK_PLL6, CLK_EXTAL, 125, 6),
 
        DEF_FIXED(".pll2_div2", CLK_PLL2_DIV2, CLK_PLL2, 1, 2),
+       DEF_FIXED(".clk_800", CLK_PLL2_800, CLK_PLL2, 1, 2),
+       DEF_FIXED(".clk_533", CLK_PLL2_SDHI_533, CLK_PLL2, 1, 3),
+       DEF_FIXED(".clk_400", CLK_PLL2_SDHI_400, CLK_PLL2_800, 1, 2),
+       DEF_FIXED(".clk_266", CLK_PLL2_SDHI_266, CLK_PLL2_SDHI_533, 1, 2),
+
        DEF_FIXED(".pll2_div16", CLK_PLL2_DIV16, CLK_PLL2, 1, 16),
        DEF_FIXED(".pll2_div20", CLK_PLL2_DIV20, CLK_PLL2, 1, 20),
 
@@ -72,6 +101,13 @@ static const struct cpg_core_clk r9a07g044_core_clks[] __initconst = {
        DEF_FIXED(".pll3_div2_4", CLK_PLL3_DIV2_4, CLK_PLL3_DIV2, 1, 4),
        DEF_FIXED(".pll3_div2_4_2", CLK_PLL3_DIV2_4_2, CLK_PLL3_DIV2_4, 1, 2),
        DEF_FIXED(".pll3_div4", CLK_PLL3_DIV4, CLK_PLL3, 1, 4),
+       DEF_MUX(".sel_pll3_3", CLK_SEL_PLL3_3, SEL_PLL3_3,
+               sel_pll3_3, ARRAY_SIZE(sel_pll3_3), 0, CLK_MUX_READ_ONLY),
+       DEF_DIV("divpl3c", CLK_DIV_PLL3_C, CLK_SEL_PLL3_3,
+               DIVPL3C, dtable_1_32, CLK_DIVIDER_HIWORD_MASK),
+
+       DEF_FIXED(".pll5_250", CLK_PLL5_250, CLK_PLL5_FOUT3, 1, 2),
+       DEF_FIXED(".pll6_250", CLK_PLL6_250, CLK_PLL6, 1, 2),
 
        /* Core output clk */
        DEF_FIXED("I", R9A07G044_CLK_I, CLK_PLL1, 1, 1),
@@ -84,6 +120,18 @@ static const struct cpg_core_clk r9a07g044_core_clks[] __initconst = {
        DEF_FIXED("P1_DIV2", CLK_P1_DIV2, R9A07G044_CLK_P1, 1, 2),
        DEF_DIV("P2", R9A07G044_CLK_P2, CLK_PLL3_DIV2_4_2,
                DIVPL3A, dtable_1_32, CLK_DIVIDER_HIWORD_MASK),
+       DEF_FIXED("M0", R9A07G044_CLK_M0, CLK_PLL3_DIV2_4, 1, 1),
+       DEF_FIXED("ZT", R9A07G044_CLK_ZT, CLK_PLL3_DIV2_4_2, 1, 1),
+       DEF_MUX("HP", R9A07G044_CLK_HP, SEL_PLL6_2,
+               sel_pll6_2, ARRAY_SIZE(sel_pll6_2), 0, CLK_MUX_HIWORD_MASK),
+       DEF_FIXED("SPI0", R9A07G044_CLK_SPI0, CLK_DIV_PLL3_C, 1, 2),
+       DEF_FIXED("SPI1", R9A07G044_CLK_SPI1, CLK_DIV_PLL3_C, 1, 4),
+       DEF_SD_MUX("SD0", R9A07G044_CLK_SD0, SEL_SDHI0,
+                  sel_shdi, ARRAY_SIZE(sel_shdi)),
+       DEF_SD_MUX("SD1", R9A07G044_CLK_SD1, SEL_SDHI1,
+                  sel_shdi, ARRAY_SIZE(sel_shdi)),
+       DEF_FIXED("SD0_DIV4", CLK_SD0_DIV4, R9A07G044_CLK_SD0, 1, 4),
+       DEF_FIXED("SD1_DIV4", CLK_SD1_DIV4, R9A07G044_CLK_SD1, 1, 4),
 };
 
 static struct rzg2l_mod_clk r9a07g044_mod_clks[] = {
@@ -97,6 +145,26 @@ static struct rzg2l_mod_clk r9a07g044_mod_clks[] = {
                                0x52c, 0),
        DEF_MOD("dmac_pclk",    R9A07G044_DMAC_PCLK, CLK_P1_DIV2,
                                0x52c, 1),
+       DEF_MOD("spi_clk2",     R9A07G044_SPI_CLK2, R9A07G044_CLK_SPI1,
+                               0x550, 0),
+       DEF_MOD("spi_clk",      R9A07G044_SPI_CLK, R9A07G044_CLK_SPI0,
+                               0x550, 1),
+       DEF_MOD("sdhi0_imclk",  R9A07G044_SDHI0_IMCLK, CLK_SD0_DIV4,
+                               0x554, 0),
+       DEF_MOD("sdhi0_imclk2", R9A07G044_SDHI0_IMCLK2, CLK_SD0_DIV4,
+                               0x554, 1),
+       DEF_MOD("sdhi0_clk_hs", R9A07G044_SDHI0_CLK_HS, R9A07G044_CLK_SD0,
+                               0x554, 2),
+       DEF_MOD("sdhi0_aclk",   R9A07G044_SDHI0_ACLK, R9A07G044_CLK_P1,
+                               0x554, 3),
+       DEF_MOD("sdhi1_imclk",  R9A07G044_SDHI1_IMCLK, CLK_SD1_DIV4,
+                               0x554, 4),
+       DEF_MOD("sdhi1_imclk2", R9A07G044_SDHI1_IMCLK2, CLK_SD1_DIV4,
+                               0x554, 5),
+       DEF_MOD("sdhi1_clk_hs", R9A07G044_SDHI1_CLK_HS, R9A07G044_CLK_SD1,
+                               0x554, 6),
+       DEF_MOD("sdhi1_aclk",   R9A07G044_SDHI1_ACLK, R9A07G044_CLK_P1,
+                               0x554, 7),
        DEF_MOD("ssi0_pclk",    R9A07G044_SSI0_PCLK2, R9A07G044_CLK_P0,
                                0x570, 0),
        DEF_MOD("ssi0_sfr",     R9A07G044_SSI0_PCLK_SFR, R9A07G044_CLK_P0,
@@ -121,6 +189,14 @@ static struct rzg2l_mod_clk r9a07g044_mod_clks[] = {
                                0x578, 2),
        DEF_MOD("usb_pclk",     R9A07G044_USB_PCLK, R9A07G044_CLK_P1,
                                0x578, 3),
+       DEF_COUPLED("eth0_axi", R9A07G044_ETH0_CLK_AXI, R9A07G044_CLK_M0,
+                               0x57c, 0),
+       DEF_COUPLED("eth0_chi", R9A07G044_ETH0_CLK_CHI, R9A07G044_CLK_ZT,
+                               0x57c, 0),
+       DEF_COUPLED("eth1_axi", R9A07G044_ETH1_CLK_AXI, R9A07G044_CLK_M0,
+                               0x57c, 1),
+       DEF_COUPLED("eth1_chi", R9A07G044_ETH1_CLK_CHI, R9A07G044_CLK_ZT,
+                               0x57c, 1),
        DEF_MOD("i2c0",         R9A07G044_I2C0_PCLK, R9A07G044_CLK_P0,
                                0x580, 0),
        DEF_MOD("i2c1",         R9A07G044_I2C1_PCLK, R9A07G044_CLK_P0,
@@ -157,6 +233,9 @@ static struct rzg2l_reset r9a07g044_resets[] = {
        DEF_RST(R9A07G044_IA55_RESETN, 0x818, 0),
        DEF_RST(R9A07G044_DMAC_ARESETN, 0x82c, 0),
        DEF_RST(R9A07G044_DMAC_RST_ASYNC, 0x82c, 1),
+       DEF_RST(R9A07G044_SPI_RST, 0x850, 0),
+       DEF_RST(R9A07G044_SDHI0_IXRST, 0x854, 0),
+       DEF_RST(R9A07G044_SDHI1_IXRST, 0x854, 1),
        DEF_RST(R9A07G044_SSI0_RST_M2_REG, 0x870, 0),
        DEF_RST(R9A07G044_SSI1_RST_M2_REG, 0x870, 1),
        DEF_RST(R9A07G044_SSI2_RST_M2_REG, 0x870, 2),
@@ -165,6 +244,8 @@ static struct rzg2l_reset r9a07g044_resets[] = {
        DEF_RST(R9A07G044_USB_U2H1_HRESETN, 0x878, 1),
        DEF_RST(R9A07G044_USB_U2P_EXL_SYSRST, 0x878, 2),
        DEF_RST(R9A07G044_USB_PRESETN, 0x878, 3),
+       DEF_RST(R9A07G044_ETH0_RST_HW_N, 0x87c, 0),
+       DEF_RST(R9A07G044_ETH1_RST_HW_N, 0x87c, 1),
        DEF_RST(R9A07G044_I2C0_MRST, 0x880, 0),
        DEF_RST(R9A07G044_I2C1_MRST, 0x880, 1),
        DEF_RST(R9A07G044_I2C2_MRST, 0x880, 2),
index 5678768..e93f001 100644 (file)
@@ -267,4 +267,87 @@ free_clock:
        return clk;
 }
 
+struct rpc_clock {
+       struct clk_divider div;
+       struct clk_gate gate;
+       /*
+        * One notifier covers both RPC and RPCD2 clocks as they are both
+        * controlled by the same RPCCKCR register...
+        */
+       struct cpg_simple_notifier csn;
+};
+
+static const struct clk_div_table cpg_rpc_div_table[] = {
+       { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 }, { 0, 0 },
+};
+
+struct clk * __init cpg_rpc_clk_register(const char *name,
+       void __iomem *rpcckcr, const char *parent_name,
+       struct raw_notifier_head *notifiers)
+{
+       struct rpc_clock *rpc;
+       struct clk *clk;
+
+       rpc = kzalloc(sizeof(*rpc), GFP_KERNEL);
+       if (!rpc)
+               return ERR_PTR(-ENOMEM);
+
+       rpc->div.reg = rpcckcr;
+       rpc->div.width = 3;
+       rpc->div.table = cpg_rpc_div_table;
+       rpc->div.lock = &cpg_lock;
+
+       rpc->gate.reg = rpcckcr;
+       rpc->gate.bit_idx = 8;
+       rpc->gate.flags = CLK_GATE_SET_TO_DISABLE;
+       rpc->gate.lock = &cpg_lock;
+
+       rpc->csn.reg = rpcckcr;
+
+       clk = clk_register_composite(NULL, name, &parent_name, 1, NULL, NULL,
+                                    &rpc->div.hw,  &clk_divider_ops,
+                                    &rpc->gate.hw, &clk_gate_ops,
+                                    CLK_SET_RATE_PARENT);
+       if (IS_ERR(clk)) {
+               kfree(rpc);
+               return clk;
+       }
+
+       cpg_simple_notifier_register(notifiers, &rpc->csn);
+       return clk;
+}
+
+struct rpcd2_clock {
+       struct clk_fixed_factor fixed;
+       struct clk_gate gate;
+};
+
+struct clk * __init cpg_rpcd2_clk_register(const char *name,
+                                          void __iomem *rpcckcr,
+                                          const char *parent_name)
+{
+       struct rpcd2_clock *rpcd2;
+       struct clk *clk;
+
+       rpcd2 = kzalloc(sizeof(*rpcd2), GFP_KERNEL);
+       if (!rpcd2)
+               return ERR_PTR(-ENOMEM);
+
+       rpcd2->fixed.mult = 1;
+       rpcd2->fixed.div = 2;
+
+       rpcd2->gate.reg = rpcckcr;
+       rpcd2->gate.bit_idx = 9;
+       rpcd2->gate.flags = CLK_GATE_SET_TO_DISABLE;
+       rpcd2->gate.lock = &cpg_lock;
+
+       clk = clk_register_composite(NULL, name, &parent_name, 1, NULL, NULL,
+                                    &rpcd2->fixed.hw, &clk_fixed_factor_ops,
+                                    &rpcd2->gate.hw, &clk_gate_ops,
+                                    CLK_SET_RATE_PARENT);
+       if (IS_ERR(clk))
+               kfree(rpcd2);
+
+       return clk;
+}
 
index d00c91b..35c0217 100644 (file)
@@ -30,4 +30,11 @@ struct clk * __init cpg_sd_clk_register(const char *name,
        void __iomem *base, unsigned int offset, const char *parent_name,
        struct raw_notifier_head *notifiers, bool skip_first);
 
+struct clk * __init cpg_rpc_clk_register(const char *name,
+       void __iomem *rpcckcr, const char *parent_name,
+       struct raw_notifier_head *notifiers);
+
+struct clk * __init cpg_rpcd2_clk_register(const char *name,
+                                          void __iomem *rpcckcr,
+                                          const char *parent_name);
 #endif
index 558191c..741f6e7 100644 (file)
@@ -301,95 +301,10 @@ static struct clk * __init cpg_z_clk_register(const char *name,
        return clk;
 }
 
-struct rpc_clock {
-       struct clk_divider div;
-       struct clk_gate gate;
-       /*
-        * One notifier covers both RPC and RPCD2 clocks as they are both
-        * controlled by the same RPCCKCR register...
-        */
-       struct cpg_simple_notifier csn;
-};
-
 static const struct clk_div_table cpg_rpcsrc_div_table[] = {
        { 2, 5 }, { 3, 6 }, { 0, 0 },
 };
 
-static const struct clk_div_table cpg_rpc_div_table[] = {
-       { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 }, { 0, 0 },
-};
-
-static struct clk * __init cpg_rpc_clk_register(const char *name,
-       void __iomem *base, const char *parent_name,
-       struct raw_notifier_head *notifiers)
-{
-       struct rpc_clock *rpc;
-       struct clk *clk;
-
-       rpc = kzalloc(sizeof(*rpc), GFP_KERNEL);
-       if (!rpc)
-               return ERR_PTR(-ENOMEM);
-
-       rpc->div.reg = base + CPG_RPCCKCR;
-       rpc->div.width = 3;
-       rpc->div.table = cpg_rpc_div_table;
-       rpc->div.lock = &cpg_lock;
-
-       rpc->gate.reg = base + CPG_RPCCKCR;
-       rpc->gate.bit_idx = 8;
-       rpc->gate.flags = CLK_GATE_SET_TO_DISABLE;
-       rpc->gate.lock = &cpg_lock;
-
-       rpc->csn.reg = base + CPG_RPCCKCR;
-
-       clk = clk_register_composite(NULL, name, &parent_name, 1, NULL, NULL,
-                                    &rpc->div.hw,  &clk_divider_ops,
-                                    &rpc->gate.hw, &clk_gate_ops,
-                                    CLK_SET_RATE_PARENT);
-       if (IS_ERR(clk)) {
-               kfree(rpc);
-               return clk;
-       }
-
-       cpg_simple_notifier_register(notifiers, &rpc->csn);
-       return clk;
-}
-
-struct rpcd2_clock {
-       struct clk_fixed_factor fixed;
-       struct clk_gate gate;
-};
-
-static struct clk * __init cpg_rpcd2_clk_register(const char *name,
-                                                 void __iomem *base,
-                                                 const char *parent_name)
-{
-       struct rpcd2_clock *rpcd2;
-       struct clk *clk;
-
-       rpcd2 = kzalloc(sizeof(*rpcd2), GFP_KERNEL);
-       if (!rpcd2)
-               return ERR_PTR(-ENOMEM);
-
-       rpcd2->fixed.mult = 1;
-       rpcd2->fixed.div = 2;
-
-       rpcd2->gate.reg = base + CPG_RPCCKCR;
-       rpcd2->gate.bit_idx = 9;
-       rpcd2->gate.flags = CLK_GATE_SET_TO_DISABLE;
-       rpcd2->gate.lock = &cpg_lock;
-
-       clk = clk_register_composite(NULL, name, &parent_name, 1, NULL, NULL,
-                                    &rpcd2->fixed.hw, &clk_fixed_factor_ops,
-                                    &rpcd2->gate.hw, &clk_gate_ops,
-                                    CLK_SET_RATE_PARENT);
-       if (IS_ERR(clk))
-               kfree(rpcd2);
-
-       return clk;
-}
-
-
 static const struct rcar_gen3_cpg_pll_config *cpg_pll_config __initdata;
 static unsigned int cpg_clk_extalr __initdata;
 static u32 cpg_mode __initdata;
@@ -600,11 +515,11 @@ struct clk * __init rcar_gen3_cpg_clk_register(struct device *dev,
                break;
 
        case CLK_TYPE_GEN3_RPC:
-               return cpg_rpc_clk_register(core->name, base,
+               return cpg_rpc_clk_register(core->name, base + CPG_RPCCKCR,
                                            __clk_get_name(parent), notifiers);
 
        case CLK_TYPE_GEN3_RPCD2:
-               return cpg_rpcd2_clk_register(core->name, base,
+               return cpg_rpcd2_clk_register(core->name, base + CPG_RPCCKCR,
                                              __clk_get_name(parent));
 
        default:
index 761922e..4021f6c 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/delay.h>
 #include <linux/device.h>
 #include <linux/init.h>
+#include <linux/iopoll.h>
 #include <linux/mod_devicetable.h>
 #include <linux/module.h>
 #include <linux/of_address.h>
 #define GET_REG_SAMPLL_CLK1(val)       ((val >> 22) & 0xfff)
 #define GET_REG_SAMPLL_CLK2(val)       ((val >> 12) & 0xfff)
 
+struct sd_hw_data {
+       struct clk_hw hw;
+       u32 conf;
+       struct rzg2l_cpg_priv *priv;
+};
+
+#define to_sd_hw_data(_hw)     container_of(_hw, struct sd_hw_data, hw)
+
 /**
  * struct rzg2l_cpg_priv - Clock Pulse Generator Private Data
  *
@@ -130,6 +139,132 @@ rzg2l_cpg_div_clk_register(const struct cpg_core_clk *core,
        return clk_hw->clk;
 }
 
+static struct clk * __init
+rzg2l_cpg_mux_clk_register(const struct cpg_core_clk *core,
+                          void __iomem *base,
+                          struct rzg2l_cpg_priv *priv)
+{
+       const struct clk_hw *clk_hw;
+
+       clk_hw = devm_clk_hw_register_mux(priv->dev, core->name,
+                                         core->parent_names, core->num_parents,
+                                         core->flag,
+                                         base + GET_REG_OFFSET(core->conf),
+                                         GET_SHIFT(core->conf),
+                                         GET_WIDTH(core->conf),
+                                         core->mux_flags, &priv->rmw_lock);
+       if (IS_ERR(clk_hw))
+               return ERR_CAST(clk_hw);
+
+       return clk_hw->clk;
+}
+
+static int rzg2l_cpg_sd_clk_mux_determine_rate(struct clk_hw *hw,
+                                              struct clk_rate_request *req)
+{
+       return clk_mux_determine_rate_flags(hw, req, 0);
+}
+
+static int rzg2l_cpg_sd_clk_mux_set_parent(struct clk_hw *hw, u8 index)
+{
+       struct sd_hw_data *hwdata = to_sd_hw_data(hw);
+       struct rzg2l_cpg_priv *priv = hwdata->priv;
+       u32 off = GET_REG_OFFSET(hwdata->conf);
+       u32 shift = GET_SHIFT(hwdata->conf);
+       const u32 clk_src_266 = 2;
+       u32 bitmask;
+
+       /*
+        * As per the HW manual, we should not directly switch from 533 MHz to
+        * 400 MHz and vice versa. To change the setting from 2’b01 (533 MHz)
+        * to 2’b10 (400 MHz) or vice versa, Switch to 2’b11 (266 MHz) first,
+        * and then switch to the target setting (2’b01 (533 MHz) or 2’b10
+        * (400 MHz)).
+        * Setting a value of '0' to the SEL_SDHI0_SET or SEL_SDHI1_SET clock
+        * switching register is prohibited.
+        * The clock mux has 3 input clocks(533 MHz, 400 MHz, and 266 MHz), and
+        * the index to value mapping is done by adding 1 to the index.
+        */
+       bitmask = (GENMASK(GET_WIDTH(hwdata->conf) - 1, 0) << shift) << 16;
+       if (index != clk_src_266) {
+               u32 msk, val;
+               int ret;
+
+               writel(bitmask | ((clk_src_266 + 1) << shift), priv->base + off);
+
+               msk = off ? CPG_CLKSTATUS_SELSDHI1_STS : CPG_CLKSTATUS_SELSDHI0_STS;
+
+               ret = readl_poll_timeout(priv->base + CPG_CLKSTATUS, val,
+                                        !(val & msk), 100,
+                                        CPG_SDHI_CLK_SWITCH_STATUS_TIMEOUT_US);
+               if (ret) {
+                       dev_err(priv->dev, "failed to switch clk source\n");
+                       return ret;
+               }
+       }
+
+       writel(bitmask | ((index + 1) << shift), priv->base + off);
+
+       return 0;
+}
+
+static u8 rzg2l_cpg_sd_clk_mux_get_parent(struct clk_hw *hw)
+{
+       struct sd_hw_data *hwdata = to_sd_hw_data(hw);
+       struct rzg2l_cpg_priv *priv = hwdata->priv;
+       u32 val = readl(priv->base + GET_REG_OFFSET(hwdata->conf));
+
+       val >>= GET_SHIFT(hwdata->conf);
+       val &= GENMASK(GET_WIDTH(hwdata->conf) - 1, 0);
+       if (val) {
+               val--;
+       } else {
+               /* Prohibited clk source, change it to 533 MHz(reset value) */
+               rzg2l_cpg_sd_clk_mux_set_parent(hw, 0);
+       }
+
+       return val;
+}
+
+static const struct clk_ops rzg2l_cpg_sd_clk_mux_ops = {
+       .determine_rate = rzg2l_cpg_sd_clk_mux_determine_rate,
+       .set_parent     = rzg2l_cpg_sd_clk_mux_set_parent,
+       .get_parent     = rzg2l_cpg_sd_clk_mux_get_parent,
+};
+
+static struct clk * __init
+rzg2l_cpg_sd_mux_clk_register(const struct cpg_core_clk *core,
+                             void __iomem *base,
+                             struct rzg2l_cpg_priv *priv)
+{
+       struct sd_hw_data *clk_hw_data;
+       struct clk_init_data init;
+       struct clk_hw *clk_hw;
+       int ret;
+
+       clk_hw_data = devm_kzalloc(priv->dev, sizeof(*clk_hw_data), GFP_KERNEL);
+       if (!clk_hw_data)
+               return ERR_PTR(-ENOMEM);
+
+       clk_hw_data->priv = priv;
+       clk_hw_data->conf = core->conf;
+
+       init.name = GET_SHIFT(core->conf) ? "sd1" : "sd0";
+       init.ops = &rzg2l_cpg_sd_clk_mux_ops;
+       init.flags = 0;
+       init.num_parents = core->num_parents;
+       init.parent_names = core->parent_names;
+
+       clk_hw = &clk_hw_data->hw;
+       clk_hw->init = &init;
+
+       ret = devm_clk_hw_register(priv->dev, clk_hw);
+       if (ret)
+               return ERR_PTR(ret);
+
+       return clk_hw->clk;
+}
+
 struct pll_clk {
        struct clk_hw hw;
        unsigned int conf;
@@ -288,6 +423,12 @@ rzg2l_cpg_register_core_clk(const struct cpg_core_clk *core,
                clk = rzg2l_cpg_div_clk_register(core, priv->clks,
                                                 priv->base, priv);
                break;
+       case CLK_TYPE_MUX:
+               clk = rzg2l_cpg_mux_clk_register(core, priv->base, priv);
+               break;
+       case CLK_TYPE_SD_MUX:
+               clk = rzg2l_cpg_sd_mux_clk_register(core, priv->base, priv);
+               break;
        default:
                goto fail;
        }
@@ -310,13 +451,17 @@ fail:
  * @hw: handle between common and hardware-specific interfaces
  * @off: register offset
  * @bit: ON/MON bit
+ * @enabled: soft state of the clock, if it is coupled with another clock
  * @priv: CPG/MSTP private data
+ * @sibling: pointer to the other coupled clock
  */
 struct mstp_clock {
        struct clk_hw hw;
        u16 off;
        u8 bit;
+       bool enabled;
        struct rzg2l_cpg_priv *priv;
+       struct mstp_clock *sibling;
 };
 
 #define to_mod_clock(_hw) container_of(_hw, struct mstp_clock, hw)
@@ -369,11 +514,41 @@ static int rzg2l_mod_clock_endisable(struct clk_hw *hw, bool enable)
 
 static int rzg2l_mod_clock_enable(struct clk_hw *hw)
 {
+       struct mstp_clock *clock = to_mod_clock(hw);
+
+       if (clock->sibling) {
+               struct rzg2l_cpg_priv *priv = clock->priv;
+               unsigned long flags;
+               bool enabled;
+
+               spin_lock_irqsave(&priv->rmw_lock, flags);
+               enabled = clock->sibling->enabled;
+               clock->enabled = true;
+               spin_unlock_irqrestore(&priv->rmw_lock, flags);
+               if (enabled)
+                       return 0;
+       }
+
        return rzg2l_mod_clock_endisable(hw, true);
 }
 
 static void rzg2l_mod_clock_disable(struct clk_hw *hw)
 {
+       struct mstp_clock *clock = to_mod_clock(hw);
+
+       if (clock->sibling) {
+               struct rzg2l_cpg_priv *priv = clock->priv;
+               unsigned long flags;
+               bool enabled;
+
+               spin_lock_irqsave(&priv->rmw_lock, flags);
+               enabled = clock->sibling->enabled;
+               clock->enabled = false;
+               spin_unlock_irqrestore(&priv->rmw_lock, flags);
+               if (enabled)
+                       return;
+       }
+
        rzg2l_mod_clock_endisable(hw, false);
 }
 
@@ -389,6 +564,9 @@ static int rzg2l_mod_clock_is_enabled(struct clk_hw *hw)
                return 1;
        }
 
+       if (clock->sibling)
+               return clock->enabled;
+
        value = readl(priv->base + CLK_MON_R(clock->off));
 
        return value & bitmask;
@@ -400,6 +578,28 @@ static const struct clk_ops rzg2l_mod_clock_ops = {
        .is_enabled = rzg2l_mod_clock_is_enabled,
 };
 
+static struct mstp_clock
+*rzg2l_mod_clock__get_sibling(struct mstp_clock *clock,
+                             struct rzg2l_cpg_priv *priv)
+{
+       struct clk_hw *hw;
+       unsigned int i;
+
+       for (i = 0; i < priv->num_mod_clks; i++) {
+               struct mstp_clock *clk;
+
+               if (priv->clks[priv->num_core_clks + i] == ERR_PTR(-ENOENT))
+                       continue;
+
+               hw = __clk_get_hw(priv->clks[priv->num_core_clks + i]);
+               clk = to_mod_clock(hw);
+               if (clock->off == clk->off && clock->bit == clk->bit)
+                       return clk;
+       }
+
+       return NULL;
+}
+
 static void __init
 rzg2l_cpg_register_mod_clk(const struct rzg2l_mod_clk *mod,
                           const struct rzg2l_cpg_info *info,
@@ -461,6 +661,18 @@ rzg2l_cpg_register_mod_clk(const struct rzg2l_mod_clk *mod,
 
        dev_dbg(dev, "Module clock %pC at %lu Hz\n", clk, clk_get_rate(clk));
        priv->clks[id] = clk;
+
+       if (mod->is_coupled) {
+               struct mstp_clock *sibling;
+
+               clock->enabled = rzg2l_mod_clock_is_enabled(&clock->hw);
+               sibling = rzg2l_mod_clock__get_sibling(clock, priv);
+               if (sibling) {
+                       clock->sibling = sibling;
+                       sibling->sibling = clock;
+               }
+       }
+
        return;
 
 fail:
index 6369528..7fb6b40 100644 (file)
 
 #define CPG_PL2_DDIV           (0x204)
 #define CPG_PL3A_DDIV          (0x208)
+#define CPG_PL2SDHI_DSEL       (0x218)
+#define CPG_CLKSTATUS          (0x280)
+#define CPG_PL3_SSEL           (0x408)
+#define CPG_PL6_ETH_SSEL       (0x418)
+
+#define CPG_CLKSTATUS_SELSDHI0_STS     BIT(28)
+#define CPG_CLKSTATUS_SELSDHI1_STS     BIT(29)
+
+#define CPG_SDHI_CLK_SWITCH_STATUS_TIMEOUT_US  20000
 
 /* n = 0/1/2 for PLL1/4/6 */
 #define CPG_SAMPLL_CLK1(n)     (0x04 + (16 * n))
 #define DIVPL2A                DDIV_PACK(CPG_PL2_DDIV, 0, 3)
 #define DIVPL3A                DDIV_PACK(CPG_PL3A_DDIV, 0, 3)
 #define DIVPL3B                DDIV_PACK(CPG_PL3A_DDIV, 4, 3)
+#define DIVPL3C                DDIV_PACK(CPG_PL3A_DDIV, 8, 3)
+
+#define SEL_PLL_PACK(offset, bitpos, size) \
+               (((offset) << 20) | ((bitpos) << 12) | ((size) << 8))
+
+#define SEL_PLL3_3     SEL_PLL_PACK(CPG_PL3_SSEL, 8, 1)
+#define SEL_PLL6_2     SEL_PLL_PACK(CPG_PL6_ETH_SSEL, 0, 1)
+
+#define SEL_SDHI0      DDIV_PACK(CPG_PL2SDHI_DSEL, 0, 2)
+#define SEL_SDHI1      DDIV_PACK(CPG_PL2SDHI_DSEL, 4, 2)
 
 /**
  * Definitions of CPG Core Clocks
@@ -43,6 +62,7 @@ struct cpg_core_clk {
        const struct clk_div_table *dtable;
        const char * const *parent_names;
        int flag;
+       int mux_flags;
        int num_parents;
 };
 
@@ -54,6 +74,12 @@ enum clk_types {
 
        /* Clock with divider */
        CLK_TYPE_DIV,
+
+       /* Clock with clock source selector */
+       CLK_TYPE_MUX,
+
+       /* Clock with SD clock source selector */
+       CLK_TYPE_SD_MUX,
 };
 
 #define DEF_TYPE(_name, _id, _type...) \
@@ -69,6 +95,14 @@ enum clk_types {
 #define DEF_DIV(_name, _id, _parent, _conf, _dtable, _flag) \
        DEF_TYPE(_name, _id, CLK_TYPE_DIV, .conf = _conf, \
                 .parent = _parent, .dtable = _dtable, .flag = _flag)
+#define DEF_MUX(_name, _id, _conf, _parent_names, _num_parents, _flag, \
+               _mux_flags) \
+       DEF_TYPE(_name, _id, CLK_TYPE_MUX, .conf = _conf, \
+                .parent_names = _parent_names, .num_parents = _num_parents, \
+                .flag = _flag, .mux_flags = _mux_flags)
+#define DEF_SD_MUX(_name, _id, _conf, _parent_names, _num_parents) \
+       DEF_TYPE(_name, _id, CLK_TYPE_SD_MUX, .conf = _conf, \
+                .parent_names = _parent_names, .num_parents = _num_parents)
 
 /**
  * struct rzg2l_mod_clk - Module Clocks definitions
@@ -78,6 +112,7 @@ enum clk_types {
  * @parent: id of parent clock
  * @off: register offset
  * @bit: ON/MON bit
+ * @is_coupled: flag to indicate coupled clock
  */
 struct rzg2l_mod_clk {
        const char *name;
@@ -85,17 +120,25 @@ struct rzg2l_mod_clk {
        unsigned int parent;
        u16 off;
        u8 bit;
+       bool is_coupled;
 };
 
-#define DEF_MOD(_name, _id, _parent, _off, _bit)       \
+#define DEF_MOD_BASE(_name, _id, _parent, _off, _bit, _is_coupled)     \
        { \
                .name = _name, \
                .id = MOD_CLK_BASE + (_id), \
                .parent = (_parent), \
                .off = (_off), \
                .bit = (_bit), \
+               .is_coupled = (_is_coupled), \
        }
 
+#define DEF_MOD(_name, _id, _parent, _off, _bit)       \
+       DEF_MOD_BASE(_name, _id, _parent, _off, _bit, false)
+
+#define DEF_COUPLED(_name, _id, _parent, _off, _bit)   \
+       DEF_MOD_BASE(_name, _id, _parent, _off, _bit, true)
+
 /**
  * struct rzg2l_reset - Reset definitions
  *
index 62a4f25..7924598 100644 (file)
@@ -481,7 +481,7 @@ static struct rockchip_clk_branch rk3399_clk_branches[] __initdata = {
        COMPOSITE_NOMUX(0, "atclk_core_l", "armclkl", CLK_IGNORE_UNUSED,
                        RK3399_CLKSEL_CON(1), 0, 5, DFLAGS | CLK_DIVIDER_READ_ONLY,
                        RK3399_CLKGATE_CON(0), 5, GFLAGS),
-       COMPOSITE_NOMUX(0, "pclk_dbg_core_l", "armclkl", CLK_IGNORE_UNUSED,
+       COMPOSITE_NOMUX(PCLK_COREDBG_L, "pclk_dbg_core_l", "armclkl", CLK_IGNORE_UNUSED,
                        RK3399_CLKSEL_CON(1), 8, 5, DFLAGS | CLK_DIVIDER_READ_ONLY,
                        RK3399_CLKGATE_CON(0), 6, GFLAGS),
 
@@ -531,7 +531,7 @@ static struct rockchip_clk_branch rk3399_clk_branches[] __initdata = {
        GATE(ACLK_GIC_ADB400_CORE_B_2_GIC, "aclk_core_adb400_core_b_2_gic", "armclkb", CLK_IGNORE_UNUSED,
                        RK3399_CLKGATE_CON(14), 4, GFLAGS),
 
-       DIV(0, "pclken_dbg_core_b", "pclk_dbg_core_b", CLK_IGNORE_UNUSED,
+       DIV(PCLK_COREDBG_B, "pclken_dbg_core_b", "pclk_dbg_core_b", CLK_IGNORE_UNUSED,
                        RK3399_CLKSEL_CON(3), 13, 2, DFLAGS | CLK_DIVIDER_READ_ONLY),
 
        GATE(0, "pclk_dbg_cxcs_pd_core_b", "pclk_dbg_core_b", CLK_IGNORE_UNUSED,
@@ -1514,7 +1514,10 @@ static const char *const rk3399_cru_critical_clocks[] __initconst = {
        "aclk_vio_noc",
 
        /* ddrc */
-       "sclk_ddrc"
+       "sclk_ddrc",
+
+       "armclkl",
+       "armclkb",
 };
 
 static const char *const rk3399_pmucru_critical_clocks[] __initconst = {
@@ -1549,9 +1552,6 @@ static void __init rk3399_clk_init(struct device_node *np)
        rockchip_clk_register_branches(ctx, rk3399_clk_branches,
                                  ARRAY_SIZE(rk3399_clk_branches));
 
-       rockchip_clk_protect_critical(rk3399_cru_critical_clocks,
-                                     ARRAY_SIZE(rk3399_cru_critical_clocks));
-
        rockchip_clk_register_armclk(ctx, ARMCLKL, "armclkl",
                        mux_armclkl_p, ARRAY_SIZE(mux_armclkl_p),
                        &rk3399_cpuclkl_data, rk3399_cpuclkl_rates,
@@ -1562,6 +1562,9 @@ static void __init rk3399_clk_init(struct device_node *np)
                        &rk3399_cpuclkb_data, rk3399_cpuclkb_rates,
                        ARRAY_SIZE(rk3399_cpuclkb_rates));
 
+       rockchip_clk_protect_critical(rk3399_cru_critical_clocks,
+                                     ARRAY_SIZE(rk3399_cru_critical_clocks));
+
        rockchip_register_softrst(np, 21, reg_base + RK3399_SOFTRST_CON(0),
                                  ROCKCHIP_SOFTRST_HIWORD_MASK);
 
@@ -1653,7 +1656,7 @@ static struct platform_driver clk_rk3399_driver = {
                .suppress_bind_attrs = true,
        },
 };
-builtin_platform_driver_probe(clk_rk3399_driver, clk_rk3399_probe);
+module_platform_driver_probe(clk_rk3399_driver, clk_rk3399_probe);
 
 MODULE_DESCRIPTION("Rockchip RK3399 Clock Driver");
 MODULE_LICENSE("GPL");
index 75ca855..939e707 100644 (file)
@@ -1719,7 +1719,7 @@ static struct platform_driver clk_rk3568_driver = {
                .suppress_bind_attrs = true,
        },
 };
-builtin_platform_driver_probe(clk_rk3568_driver, clk_rk3568_probe);
+module_platform_driver_probe(clk_rk3568_driver, clk_rk3568_probe);
 
 MODULE_DESCRIPTION("Rockchip RK3568 Clock Driver");
 MODULE_LICENSE("GPL");
index 0441c4f..0e18d6f 100644 (file)
@@ -67,7 +67,8 @@ config EXYNOS_5420_COMMON_CLK
        depends on COMMON_CLK_SAMSUNG
        help
          Support for the clock controller present on the Samsung
-         Exynos5420 SoCs. Choose Y here only if you build for this SoC.
+         Exynos5420/Exynos5422/Exynos5800 SoCs. Choose Y here only if you
+         build for this SoC.
 
 config EXYNOS_ARM64_COMMON_CLK
        bool "Samsung Exynos ARMv8-family clock controller support" if COMPILE_TEST
@@ -79,38 +80,47 @@ config EXYNOS_AUDSS_CLK_CON
        default y if ARCH_EXYNOS
        help
          Support for the Audio Subsystem CLKCON clock controller present
-         on some Exynos SoC variants. Choose M or Y here if you want to
-         use audio devices such as I2S, PCM, etc.
+         on some Samsung Exynos SoC variants. Choose M or Y here if you want
+         to use audio devices such as I2S, PCM, etc.
 
 config EXYNOS_CLKOUT
        tristate "Samsung Exynos clock output driver"
        depends on COMMON_CLK_SAMSUNG
        default y if ARCH_EXYNOS
        help
-         Support for the clock output (XCLKOUT) present on some of Exynos SoC
-         variants. Usually the XCLKOUT is used to monitor the status of the
-         certains clocks from SoC, but it could also be tied to other devices
-         as an input clock.
+         Support for the clock output (XCLKOUT) present on some of Samsung
+         Exynos SoC variants. Usually the XCLKOUT is used to monitor the
+         status of the certains clocks from SoC, but it could also be tied to
+         other devices as an input clock.
 
 # For S3C24XX platforms, select following symbols:
 config S3C2410_COMMON_CLK
        bool "Samsung S3C2410 clock controller support" if COMPILE_TEST
        select COMMON_CLK_SAMSUNG
        help
-         Build the s3c2410 clock driver based on the common clock framework.
+         Support for the clock controller present on the Samsung
+         S3C2410/S3C2440/S3C2442 SoCs. Choose Y here only if you build for
+         this SoC.
 
 config S3C2410_COMMON_DCLK
        bool
        select COMMON_CLK_SAMSUNG
        select REGMAP_MMIO
        help
-         Temporary symbol to build the dclk driver based on the common clock
-         framework.
+         Support for the dclk clock controller present on the Samsung
+         S3C2410/S3C2412/S3C2440/S3C2443 SoCs. Choose Y here only if you build
+         for this SoC.
 
 config S3C2412_COMMON_CLK
        bool "Samsung S3C2412 clock controller support" if COMPILE_TEST
        select COMMON_CLK_SAMSUNG
+       help
+         Support for the clock controller present on the Samsung S3C2412 SoCs.
+         Choose Y here only if you build for this SoC.
 
 config S3C2443_COMMON_CLK
        bool "Samsung S3C2443 clock controller support" if COMPILE_TEST
        select COMMON_CLK_SAMSUNG
+       help
+         Support for the clock controller present on the Samsung
+         S3C2416/S3C2443 SoCs. Choose Y here only if you build for this SoC.
index 028b2e2..c46cf11 100644 (file)
@@ -17,6 +17,7 @@ obj-$(CONFIG_EXYNOS_ARM64_COMMON_CLK) += clk-exynos5433.o
 obj-$(CONFIG_EXYNOS_AUDSS_CLK_CON) += clk-exynos-audss.o
 obj-$(CONFIG_EXYNOS_CLKOUT)    += clk-exynos-clkout.o
 obj-$(CONFIG_EXYNOS_ARM64_COMMON_CLK)  += clk-exynos7.o
+obj-$(CONFIG_EXYNOS_ARM64_COMMON_CLK)  += clk-exynos850.o
 obj-$(CONFIG_S3C2410_COMMON_CLK)+= clk-s3c2410.o
 obj-$(CONFIG_S3C2410_COMMON_DCLK)+= clk-s3c2410-dclk.o
 obj-$(CONFIG_S3C2412_COMMON_CLK)+= clk-s3c2412.o
index 00ef4d1..7f20d9a 100644 (file)
@@ -469,3 +469,21 @@ free_cpuclk:
        kfree(cpuclk);
        return ret;
 }
+
+void __init samsung_clk_register_cpu(struct samsung_clk_provider *ctx,
+               const struct samsung_cpu_clock *list, unsigned int nr_clk)
+{
+       unsigned int idx;
+       unsigned int num_cfgs;
+       struct clk_hw **hws = ctx->clk_data.hws;
+
+       for (idx = 0; idx < nr_clk; idx++, list++) {
+               /* find count of configuration rates in cfg */
+               for (num_cfgs = 0; list->cfg[num_cfgs].prate != 0; )
+                       num_cfgs++;
+
+               exynos_register_cpu_clock(ctx, list->id, list->name, hws[list->parent_id],
+                               hws[list->alt_parent_id], list->offset, list->cfg, num_cfgs,
+                               list->flags);
+       }
+}
index 42b5d32..9cc127a 100644 (file)
@@ -129,7 +129,6 @@ static int exynos_audss_clk_probe(struct platform_device *pdev)
        struct clk *pll_ref, *pll_in, *cdclk, *sclk_audio, *sclk_pcm_in;
        const struct exynos_audss_clk_drvdata *variant;
        struct clk_hw **clk_table;
-       struct resource *res;
        struct device *dev = &pdev->dev;
        int i, ret = 0;
 
@@ -137,8 +136,7 @@ static int exynos_audss_clk_probe(struct platform_device *pdev)
        if (!variant)
                return -EINVAL;
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       reg_base = devm_ioremap_resource(dev, res);
+       reg_base = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(reg_base))
                return PTR_ERR(reg_base);
 
index b69e381..471a6fb 100644 (file)
@@ -110,11 +110,9 @@ static int __init exynos4x12_isp_clk_probe(struct platform_device *pdev)
        struct samsung_clk_provider *ctx;
        struct device *dev = &pdev->dev;
        struct device_node *np = dev->of_node;
-       struct resource *res;
        void __iomem *reg_base;
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       reg_base = devm_ioremap_resource(dev, res);
+       reg_base = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(reg_base))
                return PTR_ERR(reg_base);
 
index f203074..f9daae2 100644 (file)
@@ -3675,44 +3675,32 @@ static const struct exynos_cpuclk_cfg_data exynos5433_apolloclk_d[] __initconst
        {  0 },
 };
 
+static const struct samsung_cpu_clock apollo_cpu_clks[] __initconst = {
+       CPU_CLK(CLK_SCLK_APOLLO, "apolloclk", CLK_MOUT_APOLLO_PLL,
+                       CLK_MOUT_BUS_PLL_APOLLO_USER,
+                       CLK_CPU_HAS_E5433_REGS_LAYOUT, 0x200,
+                       exynos5433_apolloclk_d),
+};
+
+static const struct samsung_cmu_info apollo_cmu_info __initconst = {
+       .pll_clks       = apollo_pll_clks,
+       .nr_pll_clks    = ARRAY_SIZE(apollo_pll_clks),
+       .mux_clks       = apollo_mux_clks,
+       .nr_mux_clks    = ARRAY_SIZE(apollo_mux_clks),
+       .div_clks       = apollo_div_clks,
+       .nr_div_clks    = ARRAY_SIZE(apollo_div_clks),
+       .gate_clks      = apollo_gate_clks,
+       .nr_gate_clks   = ARRAY_SIZE(apollo_gate_clks),
+       .cpu_clks       = apollo_cpu_clks,
+       .nr_cpu_clks    = ARRAY_SIZE(apollo_cpu_clks),
+       .nr_clk_ids     = APOLLO_NR_CLK,
+       .clk_regs       = apollo_clk_regs,
+       .nr_clk_regs    = ARRAY_SIZE(apollo_clk_regs),
+};
+
 static void __init exynos5433_cmu_apollo_init(struct device_node *np)
 {
-       void __iomem *reg_base;
-       struct samsung_clk_provider *ctx;
-       struct clk_hw **hws;
-
-       reg_base = of_iomap(np, 0);
-       if (!reg_base) {
-               panic("%s: failed to map registers\n", __func__);
-               return;
-       }
-
-       ctx = samsung_clk_init(np, reg_base, APOLLO_NR_CLK);
-       if (!ctx) {
-               panic("%s: unable to allocate ctx\n", __func__);
-               return;
-       }
-
-       samsung_clk_register_pll(ctx, apollo_pll_clks,
-                                ARRAY_SIZE(apollo_pll_clks), reg_base);
-       samsung_clk_register_mux(ctx, apollo_mux_clks,
-                                ARRAY_SIZE(apollo_mux_clks));
-       samsung_clk_register_div(ctx, apollo_div_clks,
-                                ARRAY_SIZE(apollo_div_clks));
-       samsung_clk_register_gate(ctx, apollo_gate_clks,
-                                 ARRAY_SIZE(apollo_gate_clks));
-
-       hws = ctx->clk_data.hws;
-
-       exynos_register_cpu_clock(ctx, CLK_SCLK_APOLLO, "apolloclk",
-               hws[CLK_MOUT_APOLLO_PLL], hws[CLK_MOUT_BUS_PLL_APOLLO_USER], 0x200,
-               exynos5433_apolloclk_d, ARRAY_SIZE(exynos5433_apolloclk_d),
-               CLK_CPU_HAS_E5433_REGS_LAYOUT);
-
-       samsung_clk_sleep_init(reg_base, apollo_clk_regs,
-                              ARRAY_SIZE(apollo_clk_regs));
-
-       samsung_clk_of_add_provider(np, ctx);
+       samsung_cmu_register_one(np, &apollo_cmu_info);
 }
 CLK_OF_DECLARE(exynos5433_cmu_apollo, "samsung,exynos5433-cmu-apollo",
                exynos5433_cmu_apollo_init);
@@ -3932,44 +3920,32 @@ static const struct exynos_cpuclk_cfg_data exynos5433_atlasclk_d[] __initconst =
        {  0 },
 };
 
-static void __init exynos5433_cmu_atlas_init(struct device_node *np)
-{
-       void __iomem *reg_base;
-       struct samsung_clk_provider *ctx;
-       struct clk_hw **hws;
-
-       reg_base = of_iomap(np, 0);
-       if (!reg_base) {
-               panic("%s: failed to map registers\n", __func__);
-               return;
-       }
-
-       ctx = samsung_clk_init(np, reg_base, ATLAS_NR_CLK);
-       if (!ctx) {
-               panic("%s: unable to allocate ctx\n", __func__);
-               return;
-       }
-
-       samsung_clk_register_pll(ctx, atlas_pll_clks,
-                                ARRAY_SIZE(atlas_pll_clks), reg_base);
-       samsung_clk_register_mux(ctx, atlas_mux_clks,
-                                ARRAY_SIZE(atlas_mux_clks));
-       samsung_clk_register_div(ctx, atlas_div_clks,
-                                ARRAY_SIZE(atlas_div_clks));
-       samsung_clk_register_gate(ctx, atlas_gate_clks,
-                                 ARRAY_SIZE(atlas_gate_clks));
-
-       hws = ctx->clk_data.hws;
-
-       exynos_register_cpu_clock(ctx, CLK_SCLK_ATLAS, "atlasclk",
-               hws[CLK_MOUT_ATLAS_PLL], hws[CLK_MOUT_BUS_PLL_ATLAS_USER], 0x200,
-               exynos5433_atlasclk_d, ARRAY_SIZE(exynos5433_atlasclk_d),
-               CLK_CPU_HAS_E5433_REGS_LAYOUT);
+static const struct samsung_cpu_clock atlas_cpu_clks[] __initconst = {
+       CPU_CLK(CLK_SCLK_ATLAS, "atlasclk", CLK_MOUT_ATLAS_PLL,
+                       CLK_MOUT_BUS_PLL_ATLAS_USER,
+                       CLK_CPU_HAS_E5433_REGS_LAYOUT, 0x200,
+                       exynos5433_atlasclk_d),
+};
 
-       samsung_clk_sleep_init(reg_base, atlas_clk_regs,
-                              ARRAY_SIZE(atlas_clk_regs));
+static const struct samsung_cmu_info atlas_cmu_info __initconst = {
+       .pll_clks       = atlas_pll_clks,
+       .nr_pll_clks    = ARRAY_SIZE(atlas_pll_clks),
+       .mux_clks       = atlas_mux_clks,
+       .nr_mux_clks    = ARRAY_SIZE(atlas_mux_clks),
+       .div_clks       = atlas_div_clks,
+       .nr_div_clks    = ARRAY_SIZE(atlas_div_clks),
+       .gate_clks      = atlas_gate_clks,
+       .nr_gate_clks   = ARRAY_SIZE(atlas_gate_clks),
+       .cpu_clks       = atlas_cpu_clks,
+       .nr_cpu_clks    = ARRAY_SIZE(atlas_cpu_clks),
+       .nr_clk_ids     = ATLAS_NR_CLK,
+       .clk_regs       = atlas_clk_regs,
+       .nr_clk_regs    = ARRAY_SIZE(atlas_clk_regs),
+};
 
-       samsung_clk_of_add_provider(np, ctx);
+static void __init exynos5433_cmu_atlas_init(struct device_node *np)
+{
+       samsung_cmu_register_one(np, &atlas_cmu_info);
 }
 CLK_OF_DECLARE(exynos5433_cmu_atlas, "samsung,exynos5433-cmu-atlas",
                exynos5433_cmu_atlas_init);
@@ -5564,7 +5540,6 @@ static int __init exynos5433_cmu_probe(struct platform_device *pdev)
        struct exynos5433_cmu_data *data;
        struct samsung_clk_provider *ctx;
        struct device *dev = &pdev->dev;
-       struct resource *res;
        void __iomem *reg_base;
        int i;
 
@@ -5577,8 +5552,7 @@ static int __init exynos5433_cmu_probe(struct platform_device *pdev)
                return -ENOMEM;
        ctx = &data->ctx;
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       reg_base = devm_ioremap_resource(dev, res);
+       reg_base = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(reg_base))
                return PTR_ERR(reg_base);
 
diff --git a/drivers/clk/samsung/clk-exynos850.c b/drivers/clk/samsung/clk-exynos850.c
new file mode 100644 (file)
index 0000000..2294989
--- /dev/null
@@ -0,0 +1,835 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (C) 2021 Linaro Ltd.
+ * Author: Sam Protsenko <semen.protsenko@linaro.org>
+ *
+ * Common Clock Framework support for Exynos850 SoC.
+ */
+
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+
+#include <dt-bindings/clock/exynos850.h>
+
+#include "clk.h"
+
+/* Gate register bits */
+#define GATE_MANUAL            BIT(20)
+#define GATE_ENABLE_HWACG      BIT(28)
+
+/* Gate register offsets range */
+#define GATE_OFF_START         0x2000
+#define GATE_OFF_END           0x2fff
+
+/**
+ * exynos850_init_clocks - Set clocks initial configuration
+ * @np:                        CMU device tree node with "reg" property (CMU addr)
+ * @reg_offs:          Register offsets array for clocks to init
+ * @reg_offs_len:      Number of register offsets in reg_offs array
+ *
+ * Set manual control mode for all gate clocks.
+ */
+static void __init exynos850_init_clocks(struct device_node *np,
+               const unsigned long *reg_offs, size_t reg_offs_len)
+{
+       void __iomem *reg_base;
+       size_t i;
+
+       reg_base = of_iomap(np, 0);
+       if (!reg_base)
+               panic("%s: failed to map registers\n", __func__);
+
+       for (i = 0; i < reg_offs_len; ++i) {
+               void __iomem *reg = reg_base + reg_offs[i];
+               u32 val;
+
+               /* Modify only gate clock registers */
+               if (reg_offs[i] < GATE_OFF_START || reg_offs[i] > GATE_OFF_END)
+                       continue;
+
+               val = readl(reg);
+               val |= GATE_MANUAL;
+               val &= ~GATE_ENABLE_HWACG;
+               writel(val, reg);
+       }
+
+       iounmap(reg_base);
+}
+
+/* ---- CMU_TOP ------------------------------------------------------------- */
+
+/* Register Offset definitions for CMU_TOP (0x120e0000) */
+#define PLL_LOCKTIME_PLL_MMC                   0x0000
+#define PLL_LOCKTIME_PLL_SHARED0               0x0004
+#define PLL_LOCKTIME_PLL_SHARED1               0x0008
+#define PLL_CON0_PLL_MMC                       0x0100
+#define PLL_CON3_PLL_MMC                       0x010c
+#define PLL_CON0_PLL_SHARED0                   0x0140
+#define PLL_CON3_PLL_SHARED0                   0x014c
+#define PLL_CON0_PLL_SHARED1                   0x0180
+#define PLL_CON3_PLL_SHARED1                   0x018c
+#define CLK_CON_MUX_MUX_CLKCMU_CORE_BUS                0x1014
+#define CLK_CON_MUX_MUX_CLKCMU_CORE_CCI                0x1018
+#define CLK_CON_MUX_MUX_CLKCMU_CORE_MMC_EMBD   0x101c
+#define CLK_CON_MUX_MUX_CLKCMU_CORE_SSS                0x1020
+#define CLK_CON_MUX_MUX_CLKCMU_DPU             0x1034
+#define CLK_CON_MUX_MUX_CLKCMU_HSI_BUS         0x103c
+#define CLK_CON_MUX_MUX_CLKCMU_HSI_MMC_CARD    0x1040
+#define CLK_CON_MUX_MUX_CLKCMU_HSI_USB20DRD    0x1044
+#define CLK_CON_MUX_MUX_CLKCMU_PERI_BUS                0x1070
+#define CLK_CON_MUX_MUX_CLKCMU_PERI_IP         0x1074
+#define CLK_CON_MUX_MUX_CLKCMU_PERI_UART       0x1078
+#define CLK_CON_DIV_CLKCMU_CORE_BUS            0x1820
+#define CLK_CON_DIV_CLKCMU_CORE_CCI            0x1824
+#define CLK_CON_DIV_CLKCMU_CORE_MMC_EMBD       0x1828
+#define CLK_CON_DIV_CLKCMU_CORE_SSS            0x182c
+#define CLK_CON_DIV_CLKCMU_DPU                 0x1840
+#define CLK_CON_DIV_CLKCMU_HSI_BUS             0x1848
+#define CLK_CON_DIV_CLKCMU_HSI_MMC_CARD                0x184c
+#define CLK_CON_DIV_CLKCMU_HSI_USB20DRD                0x1850
+#define CLK_CON_DIV_CLKCMU_PERI_BUS            0x187c
+#define CLK_CON_DIV_CLKCMU_PERI_IP             0x1880
+#define CLK_CON_DIV_CLKCMU_PERI_UART           0x1884
+#define CLK_CON_DIV_PLL_SHARED0_DIV2           0x188c
+#define CLK_CON_DIV_PLL_SHARED0_DIV3           0x1890
+#define CLK_CON_DIV_PLL_SHARED0_DIV4           0x1894
+#define CLK_CON_DIV_PLL_SHARED1_DIV2           0x1898
+#define CLK_CON_DIV_PLL_SHARED1_DIV3           0x189c
+#define CLK_CON_DIV_PLL_SHARED1_DIV4           0x18a0
+#define CLK_CON_GAT_GATE_CLKCMU_CORE_BUS       0x201c
+#define CLK_CON_GAT_GATE_CLKCMU_CORE_CCI       0x2020
+#define CLK_CON_GAT_GATE_CLKCMU_CORE_MMC_EMBD  0x2024
+#define CLK_CON_GAT_GATE_CLKCMU_CORE_SSS       0x2028
+#define CLK_CON_GAT_GATE_CLKCMU_DPU            0x203c
+#define CLK_CON_GAT_GATE_CLKCMU_HSI_BUS                0x2044
+#define CLK_CON_GAT_GATE_CLKCMU_HSI_MMC_CARD   0x2048
+#define CLK_CON_GAT_GATE_CLKCMU_HSI_USB20DRD   0x204c
+#define CLK_CON_GAT_GATE_CLKCMU_PERI_BUS       0x2080
+#define CLK_CON_GAT_GATE_CLKCMU_PERI_IP                0x2084
+#define CLK_CON_GAT_GATE_CLKCMU_PERI_UART      0x2088
+
+static const unsigned long top_clk_regs[] __initconst = {
+       PLL_LOCKTIME_PLL_MMC,
+       PLL_LOCKTIME_PLL_SHARED0,
+       PLL_LOCKTIME_PLL_SHARED1,
+       PLL_CON0_PLL_MMC,
+       PLL_CON3_PLL_MMC,
+       PLL_CON0_PLL_SHARED0,
+       PLL_CON3_PLL_SHARED0,
+       PLL_CON0_PLL_SHARED1,
+       PLL_CON3_PLL_SHARED1,
+       CLK_CON_MUX_MUX_CLKCMU_CORE_BUS,
+       CLK_CON_MUX_MUX_CLKCMU_CORE_CCI,
+       CLK_CON_MUX_MUX_CLKCMU_CORE_MMC_EMBD,
+       CLK_CON_MUX_MUX_CLKCMU_CORE_SSS,
+       CLK_CON_MUX_MUX_CLKCMU_DPU,
+       CLK_CON_MUX_MUX_CLKCMU_HSI_BUS,
+       CLK_CON_MUX_MUX_CLKCMU_HSI_MMC_CARD,
+       CLK_CON_MUX_MUX_CLKCMU_HSI_USB20DRD,
+       CLK_CON_MUX_MUX_CLKCMU_PERI_BUS,
+       CLK_CON_MUX_MUX_CLKCMU_PERI_IP,
+       CLK_CON_MUX_MUX_CLKCMU_PERI_UART,
+       CLK_CON_DIV_CLKCMU_CORE_BUS,
+       CLK_CON_DIV_CLKCMU_CORE_CCI,
+       CLK_CON_DIV_CLKCMU_CORE_MMC_EMBD,
+       CLK_CON_DIV_CLKCMU_CORE_SSS,
+       CLK_CON_DIV_CLKCMU_DPU,
+       CLK_CON_DIV_CLKCMU_HSI_BUS,
+       CLK_CON_DIV_CLKCMU_HSI_MMC_CARD,
+       CLK_CON_DIV_CLKCMU_HSI_USB20DRD,
+       CLK_CON_DIV_CLKCMU_PERI_BUS,
+       CLK_CON_DIV_CLKCMU_PERI_IP,
+       CLK_CON_DIV_CLKCMU_PERI_UART,
+       CLK_CON_DIV_PLL_SHARED0_DIV2,
+       CLK_CON_DIV_PLL_SHARED0_DIV3,
+       CLK_CON_DIV_PLL_SHARED0_DIV4,
+       CLK_CON_DIV_PLL_SHARED1_DIV2,
+       CLK_CON_DIV_PLL_SHARED1_DIV3,
+       CLK_CON_DIV_PLL_SHARED1_DIV4,
+       CLK_CON_GAT_GATE_CLKCMU_CORE_BUS,
+       CLK_CON_GAT_GATE_CLKCMU_CORE_CCI,
+       CLK_CON_GAT_GATE_CLKCMU_CORE_MMC_EMBD,
+       CLK_CON_GAT_GATE_CLKCMU_CORE_SSS,
+       CLK_CON_GAT_GATE_CLKCMU_DPU,
+       CLK_CON_GAT_GATE_CLKCMU_HSI_BUS,
+       CLK_CON_GAT_GATE_CLKCMU_HSI_MMC_CARD,
+       CLK_CON_GAT_GATE_CLKCMU_HSI_USB20DRD,
+       CLK_CON_GAT_GATE_CLKCMU_PERI_BUS,
+       CLK_CON_GAT_GATE_CLKCMU_PERI_IP,
+       CLK_CON_GAT_GATE_CLKCMU_PERI_UART,
+};
+
+/*
+ * Do not provide PLL tables to core PLLs, as MANUAL_PLL_CTRL bit is not set
+ * for those PLLs by default, so set_rate operation would fail.
+ */
+static const struct samsung_pll_clock top_pll_clks[] __initconst = {
+       /* CMU_TOP_PURECLKCOMP */
+       PLL(pll_0822x, CLK_FOUT_SHARED0_PLL, "fout_shared0_pll", "oscclk",
+           PLL_LOCKTIME_PLL_SHARED0, PLL_CON3_PLL_SHARED0,
+           NULL),
+       PLL(pll_0822x, CLK_FOUT_SHARED1_PLL, "fout_shared1_pll", "oscclk",
+           PLL_LOCKTIME_PLL_SHARED1, PLL_CON3_PLL_SHARED1,
+           NULL),
+       PLL(pll_0831x, CLK_FOUT_MMC_PLL, "fout_mmc_pll", "oscclk",
+           PLL_LOCKTIME_PLL_MMC, PLL_CON3_PLL_MMC, NULL),
+};
+
+/* List of parent clocks for Muxes in CMU_TOP */
+PNAME(mout_shared0_pll_p)      = { "oscclk", "fout_shared0_pll" };
+PNAME(mout_shared1_pll_p)      = { "oscclk", "fout_shared1_pll" };
+PNAME(mout_mmc_pll_p)          = { "oscclk", "fout_mmc_pll" };
+/* List of parent clocks for Muxes in CMU_TOP: for CMU_CORE */
+PNAME(mout_core_bus_p)         = { "dout_shared1_div2", "dout_shared0_div3",
+                                   "dout_shared1_div3", "dout_shared0_div4" };
+PNAME(mout_core_cci_p)         = { "dout_shared0_div2", "dout_shared1_div2",
+                                   "dout_shared0_div3", "dout_shared1_div3" };
+PNAME(mout_core_mmc_embd_p)    = { "oscclk", "dout_shared0_div2",
+                                   "dout_shared1_div2", "dout_shared0_div3",
+                                   "dout_shared1_div3", "mout_mmc_pll",
+                                   "oscclk", "oscclk" };
+PNAME(mout_core_sss_p)         = { "dout_shared0_div3", "dout_shared1_div3",
+                                   "dout_shared0_div4", "dout_shared1_div4" };
+/* List of parent clocks for Muxes in CMU_TOP: for CMU_HSI */
+PNAME(mout_hsi_bus_p)          = { "dout_shared0_div2", "dout_shared1_div2" };
+PNAME(mout_hsi_mmc_card_p)     = { "oscclk", "dout_shared0_div2",
+                                   "dout_shared1_div2", "dout_shared0_div3",
+                                   "dout_shared1_div3", "mout_mmc_pll",
+                                   "oscclk", "oscclk" };
+PNAME(mout_hsi_usb20drd_p)     = { "oscclk", "dout_shared0_div4",
+                                   "dout_shared1_div4", "oscclk" };
+/* List of parent clocks for Muxes in CMU_TOP: for CMU_PERI */
+PNAME(mout_peri_bus_p)         = { "dout_shared0_div4", "dout_shared1_div4" };
+PNAME(mout_peri_uart_p)                = { "oscclk", "dout_shared0_div4",
+                                   "dout_shared1_div4", "oscclk" };
+PNAME(mout_peri_ip_p)          = { "oscclk", "dout_shared0_div4",
+                                   "dout_shared1_div4", "oscclk" };
+
+/* List of parent clocks for Muxes in CMU_TOP: for CMU_DPU */
+PNAME(mout_dpu_p)              = { "dout_shared0_div3", "dout_shared1_div3",
+                                   "dout_shared0_div4", "dout_shared1_div4" };
+
+static const struct samsung_mux_clock top_mux_clks[] __initconst = {
+       /* CMU_TOP_PURECLKCOMP */
+       MUX(CLK_MOUT_SHARED0_PLL, "mout_shared0_pll", mout_shared0_pll_p,
+           PLL_CON0_PLL_SHARED0, 4, 1),
+       MUX(CLK_MOUT_SHARED1_PLL, "mout_shared1_pll", mout_shared1_pll_p,
+           PLL_CON0_PLL_SHARED1, 4, 1),
+       MUX(CLK_MOUT_MMC_PLL, "mout_mmc_pll", mout_mmc_pll_p,
+           PLL_CON0_PLL_MMC, 4, 1),
+
+       /* CORE */
+       MUX(CLK_MOUT_CORE_BUS, "mout_core_bus", mout_core_bus_p,
+           CLK_CON_MUX_MUX_CLKCMU_CORE_BUS, 0, 2),
+       MUX(CLK_MOUT_CORE_CCI, "mout_core_cci", mout_core_cci_p,
+           CLK_CON_MUX_MUX_CLKCMU_CORE_CCI, 0, 2),
+       MUX(CLK_MOUT_CORE_MMC_EMBD, "mout_core_mmc_embd", mout_core_mmc_embd_p,
+           CLK_CON_MUX_MUX_CLKCMU_CORE_MMC_EMBD, 0, 3),
+       MUX(CLK_MOUT_CORE_SSS, "mout_core_sss", mout_core_sss_p,
+           CLK_CON_MUX_MUX_CLKCMU_CORE_SSS, 0, 2),
+
+       /* DPU */
+       MUX(CLK_MOUT_DPU, "mout_dpu", mout_dpu_p,
+           CLK_CON_MUX_MUX_CLKCMU_DPU, 0, 2),
+
+       /* HSI */
+       MUX(CLK_MOUT_HSI_BUS, "mout_hsi_bus", mout_hsi_bus_p,
+           CLK_CON_MUX_MUX_CLKCMU_HSI_BUS, 0, 1),
+       MUX(CLK_MOUT_HSI_MMC_CARD, "mout_hsi_mmc_card", mout_hsi_mmc_card_p,
+           CLK_CON_MUX_MUX_CLKCMU_HSI_MMC_CARD, 0, 3),
+       MUX(CLK_MOUT_HSI_USB20DRD, "mout_hsi_usb20drd", mout_hsi_usb20drd_p,
+           CLK_CON_MUX_MUX_CLKCMU_HSI_USB20DRD, 0, 2),
+
+       /* PERI */
+       MUX(CLK_MOUT_PERI_BUS, "mout_peri_bus", mout_peri_bus_p,
+           CLK_CON_MUX_MUX_CLKCMU_PERI_BUS, 0, 1),
+       MUX(CLK_MOUT_PERI_UART, "mout_peri_uart", mout_peri_uart_p,
+           CLK_CON_MUX_MUX_CLKCMU_PERI_UART, 0, 2),
+       MUX(CLK_MOUT_PERI_IP, "mout_peri_ip", mout_peri_ip_p,
+           CLK_CON_MUX_MUX_CLKCMU_PERI_IP, 0, 2),
+};
+
+static const struct samsung_div_clock top_div_clks[] __initconst = {
+       /* CMU_TOP_PURECLKCOMP */
+       DIV(CLK_DOUT_SHARED0_DIV3, "dout_shared0_div3", "mout_shared0_pll",
+           CLK_CON_DIV_PLL_SHARED0_DIV3, 0, 2),
+       DIV(CLK_DOUT_SHARED0_DIV2, "dout_shared0_div2", "mout_shared0_pll",
+           CLK_CON_DIV_PLL_SHARED0_DIV2, 0, 1),
+       DIV(CLK_DOUT_SHARED1_DIV3, "dout_shared1_div3", "mout_shared1_pll",
+           CLK_CON_DIV_PLL_SHARED1_DIV3, 0, 2),
+       DIV(CLK_DOUT_SHARED1_DIV2, "dout_shared1_div2", "mout_shared1_pll",
+           CLK_CON_DIV_PLL_SHARED1_DIV2, 0, 1),
+       DIV(CLK_DOUT_SHARED0_DIV4, "dout_shared0_div4", "dout_shared0_div2",
+           CLK_CON_DIV_PLL_SHARED0_DIV4, 0, 1),
+       DIV(CLK_DOUT_SHARED1_DIV4, "dout_shared1_div4", "dout_shared1_div2",
+           CLK_CON_DIV_PLL_SHARED1_DIV4, 0, 1),
+
+       /* CORE */
+       DIV(CLK_DOUT_CORE_BUS, "dout_core_bus", "gout_core_bus",
+           CLK_CON_DIV_CLKCMU_CORE_BUS, 0, 4),
+       DIV(CLK_DOUT_CORE_CCI, "dout_core_cci", "gout_core_cci",
+           CLK_CON_DIV_CLKCMU_CORE_CCI, 0, 4),
+       DIV(CLK_DOUT_CORE_MMC_EMBD, "dout_core_mmc_embd", "gout_core_mmc_embd",
+           CLK_CON_DIV_CLKCMU_CORE_MMC_EMBD, 0, 9),
+       DIV(CLK_DOUT_CORE_SSS, "dout_core_sss", "gout_core_sss",
+           CLK_CON_DIV_CLKCMU_CORE_SSS, 0, 4),
+
+       /* DPU */
+       DIV(CLK_DOUT_DPU, "dout_dpu", "gout_dpu",
+           CLK_CON_DIV_CLKCMU_DPU, 0, 4),
+
+       /* HSI */
+       DIV(CLK_DOUT_HSI_BUS, "dout_hsi_bus", "gout_hsi_bus",
+           CLK_CON_DIV_CLKCMU_HSI_BUS, 0, 4),
+       DIV(CLK_DOUT_HSI_MMC_CARD, "dout_hsi_mmc_card", "gout_hsi_mmc_card",
+           CLK_CON_DIV_CLKCMU_HSI_MMC_CARD, 0, 9),
+       DIV(CLK_DOUT_HSI_USB20DRD, "dout_hsi_usb20drd", "gout_hsi_usb20drd",
+           CLK_CON_DIV_CLKCMU_HSI_USB20DRD, 0, 4),
+
+       /* PERI */
+       DIV(CLK_DOUT_PERI_BUS, "dout_peri_bus", "gout_peri_bus",
+           CLK_CON_DIV_CLKCMU_PERI_BUS, 0, 4),
+       DIV(CLK_DOUT_PERI_UART, "dout_peri_uart", "gout_peri_uart",
+           CLK_CON_DIV_CLKCMU_PERI_UART, 0, 4),
+       DIV(CLK_DOUT_PERI_IP, "dout_peri_ip", "gout_peri_ip",
+           CLK_CON_DIV_CLKCMU_PERI_IP, 0, 4),
+};
+
+static const struct samsung_gate_clock top_gate_clks[] __initconst = {
+       /* CORE */
+       GATE(CLK_GOUT_CORE_BUS, "gout_core_bus", "mout_core_bus",
+            CLK_CON_GAT_GATE_CLKCMU_CORE_BUS, 21, 0, 0),
+       GATE(CLK_GOUT_CORE_CCI, "gout_core_cci", "mout_core_cci",
+            CLK_CON_GAT_GATE_CLKCMU_CORE_CCI, 21, 0, 0),
+       GATE(CLK_GOUT_CORE_MMC_EMBD, "gout_core_mmc_embd", "mout_core_mmc_embd",
+            CLK_CON_GAT_GATE_CLKCMU_CORE_MMC_EMBD, 21, 0, 0),
+       GATE(CLK_GOUT_CORE_SSS, "gout_core_sss", "mout_core_sss",
+            CLK_CON_GAT_GATE_CLKCMU_CORE_SSS, 21, 0, 0),
+
+       /* DPU */
+       GATE(CLK_GOUT_DPU, "gout_dpu", "mout_dpu",
+            CLK_CON_GAT_GATE_CLKCMU_DPU, 21, 0, 0),
+
+       /* HSI */
+       GATE(CLK_GOUT_HSI_BUS, "gout_hsi_bus", "mout_hsi_bus",
+            CLK_CON_GAT_GATE_CLKCMU_HSI_BUS, 21, 0, 0),
+       GATE(CLK_GOUT_HSI_MMC_CARD, "gout_hsi_mmc_card", "mout_hsi_mmc_card",
+            CLK_CON_GAT_GATE_CLKCMU_HSI_MMC_CARD, 21, 0, 0),
+       GATE(CLK_GOUT_HSI_USB20DRD, "gout_hsi_usb20drd", "mout_hsi_usb20drd",
+            CLK_CON_GAT_GATE_CLKCMU_HSI_USB20DRD, 21, 0, 0),
+
+       /* PERI */
+       GATE(CLK_GOUT_PERI_BUS, "gout_peri_bus", "mout_peri_bus",
+            CLK_CON_GAT_GATE_CLKCMU_PERI_BUS, 21, 0, 0),
+       GATE(CLK_GOUT_PERI_UART, "gout_peri_uart", "mout_peri_uart",
+            CLK_CON_GAT_GATE_CLKCMU_PERI_UART, 21, 0, 0),
+       GATE(CLK_GOUT_PERI_IP, "gout_peri_ip", "mout_peri_ip",
+            CLK_CON_GAT_GATE_CLKCMU_PERI_IP, 21, 0, 0),
+};
+
+static const struct samsung_cmu_info top_cmu_info __initconst = {
+       .pll_clks               = top_pll_clks,
+       .nr_pll_clks            = ARRAY_SIZE(top_pll_clks),
+       .mux_clks               = top_mux_clks,
+       .nr_mux_clks            = ARRAY_SIZE(top_mux_clks),
+       .div_clks               = top_div_clks,
+       .nr_div_clks            = ARRAY_SIZE(top_div_clks),
+       .gate_clks              = top_gate_clks,
+       .nr_gate_clks           = ARRAY_SIZE(top_gate_clks),
+       .nr_clk_ids             = TOP_NR_CLK,
+       .clk_regs               = top_clk_regs,
+       .nr_clk_regs            = ARRAY_SIZE(top_clk_regs),
+};
+
+static void __init exynos850_cmu_top_init(struct device_node *np)
+{
+       exynos850_init_clocks(np, top_clk_regs, ARRAY_SIZE(top_clk_regs));
+       samsung_cmu_register_one(np, &top_cmu_info);
+}
+
+CLK_OF_DECLARE(exynos850_cmu_top, "samsung,exynos850-cmu-top",
+              exynos850_cmu_top_init);
+
+/* ---- CMU_HSI ------------------------------------------------------------- */
+
+/* Register Offset definitions for CMU_HSI (0x13400000) */
+#define PLL_CON0_MUX_CLKCMU_HSI_BUS_USER                       0x0600
+#define PLL_CON0_MUX_CLKCMU_HSI_MMC_CARD_USER                  0x0610
+#define PLL_CON0_MUX_CLKCMU_HSI_USB20DRD_USER                  0x0620
+#define CLK_CON_MUX_MUX_CLK_HSI_RTC                            0x1000
+#define CLK_CON_GAT_HSI_USB20DRD_TOP_I_RTC_CLK__ALV            0x2008
+#define CLK_CON_GAT_HSI_USB20DRD_TOP_I_REF_CLK_50              0x200c
+#define CLK_CON_GAT_HSI_USB20DRD_TOP_I_PHY_REFCLK_26           0x2010
+#define CLK_CON_GAT_GOUT_HSI_GPIO_HSI_PCLK                     0x2018
+#define CLK_CON_GAT_GOUT_HSI_MMC_CARD_I_ACLK                   0x2024
+#define CLK_CON_GAT_GOUT_HSI_MMC_CARD_SDCLKIN                  0x2028
+#define CLK_CON_GAT_GOUT_HSI_SYSREG_HSI_PCLK                   0x2038
+#define CLK_CON_GAT_GOUT_HSI_USB20DRD_TOP_ACLK_PHYCTRL_20      0x203c
+#define CLK_CON_GAT_GOUT_HSI_USB20DRD_TOP_BUS_CLK_EARLY                0x2040
+
+static const unsigned long hsi_clk_regs[] __initconst = {
+       PLL_CON0_MUX_CLKCMU_HSI_BUS_USER,
+       PLL_CON0_MUX_CLKCMU_HSI_MMC_CARD_USER,
+       PLL_CON0_MUX_CLKCMU_HSI_USB20DRD_USER,
+       CLK_CON_MUX_MUX_CLK_HSI_RTC,
+       CLK_CON_GAT_HSI_USB20DRD_TOP_I_RTC_CLK__ALV,
+       CLK_CON_GAT_HSI_USB20DRD_TOP_I_REF_CLK_50,
+       CLK_CON_GAT_HSI_USB20DRD_TOP_I_PHY_REFCLK_26,
+       CLK_CON_GAT_GOUT_HSI_GPIO_HSI_PCLK,
+       CLK_CON_GAT_GOUT_HSI_MMC_CARD_I_ACLK,
+       CLK_CON_GAT_GOUT_HSI_MMC_CARD_SDCLKIN,
+       CLK_CON_GAT_GOUT_HSI_SYSREG_HSI_PCLK,
+       CLK_CON_GAT_GOUT_HSI_USB20DRD_TOP_ACLK_PHYCTRL_20,
+       CLK_CON_GAT_GOUT_HSI_USB20DRD_TOP_BUS_CLK_EARLY,
+};
+
+/* List of parent clocks for Muxes in CMU_PERI */
+PNAME(mout_hsi_bus_user_p)     = { "oscclk", "dout_hsi_bus" };
+PNAME(mout_hsi_mmc_card_user_p)        = { "oscclk", "dout_hsi_mmc_card" };
+PNAME(mout_hsi_usb20drd_user_p)        = { "oscclk", "dout_hsi_usb20drd" };
+PNAME(mout_hsi_rtc_p)          = { "rtcclk", "oscclk" };
+
+static const struct samsung_mux_clock hsi_mux_clks[] __initconst = {
+       MUX(CLK_MOUT_HSI_BUS_USER, "mout_hsi_bus_user", mout_hsi_bus_user_p,
+           PLL_CON0_MUX_CLKCMU_HSI_BUS_USER, 4, 1),
+       MUX_F(CLK_MOUT_HSI_MMC_CARD_USER, "mout_hsi_mmc_card_user",
+             mout_hsi_mmc_card_user_p, PLL_CON0_MUX_CLKCMU_HSI_MMC_CARD_USER,
+             4, 1, CLK_SET_RATE_PARENT, 0),
+       MUX(CLK_MOUT_HSI_USB20DRD_USER, "mout_hsi_usb20drd_user",
+           mout_hsi_usb20drd_user_p, PLL_CON0_MUX_CLKCMU_HSI_USB20DRD_USER,
+           4, 1),
+       MUX(CLK_MOUT_HSI_RTC, "mout_hsi_rtc", mout_hsi_rtc_p,
+           CLK_CON_MUX_MUX_CLK_HSI_RTC, 0, 1),
+};
+
+static const struct samsung_gate_clock hsi_gate_clks[] __initconst = {
+       GATE(CLK_GOUT_USB_RTC_CLK, "gout_usb_rtc", "mout_hsi_rtc",
+            CLK_CON_GAT_HSI_USB20DRD_TOP_I_RTC_CLK__ALV, 21, 0, 0),
+       GATE(CLK_GOUT_USB_REF_CLK, "gout_usb_ref", "mout_hsi_usb20drd_user",
+            CLK_CON_GAT_HSI_USB20DRD_TOP_I_REF_CLK_50, 21, 0, 0),
+       GATE(CLK_GOUT_USB_PHY_REF_CLK, "gout_usb_phy_ref", "oscclk",
+            CLK_CON_GAT_HSI_USB20DRD_TOP_I_PHY_REFCLK_26, 21, 0, 0),
+       GATE(CLK_GOUT_GPIO_HSI_PCLK, "gout_gpio_hsi_pclk", "mout_hsi_bus_user",
+            CLK_CON_GAT_GOUT_HSI_GPIO_HSI_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_MMC_CARD_ACLK, "gout_mmc_card_aclk", "mout_hsi_bus_user",
+            CLK_CON_GAT_GOUT_HSI_MMC_CARD_I_ACLK, 21, 0, 0),
+       GATE(CLK_GOUT_MMC_CARD_SDCLKIN, "gout_mmc_card_sdclkin",
+            "mout_hsi_mmc_card_user",
+            CLK_CON_GAT_GOUT_HSI_MMC_CARD_SDCLKIN, 21, CLK_SET_RATE_PARENT, 0),
+       GATE(CLK_GOUT_SYSREG_HSI_PCLK, "gout_sysreg_hsi_pclk",
+            "mout_hsi_bus_user",
+            CLK_CON_GAT_GOUT_HSI_SYSREG_HSI_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_USB_PHY_ACLK, "gout_usb_phy_aclk", "mout_hsi_bus_user",
+            CLK_CON_GAT_GOUT_HSI_USB20DRD_TOP_ACLK_PHYCTRL_20, 21, 0, 0),
+       GATE(CLK_GOUT_USB_BUS_EARLY_CLK, "gout_usb_bus_early",
+            "mout_hsi_bus_user",
+            CLK_CON_GAT_GOUT_HSI_USB20DRD_TOP_BUS_CLK_EARLY, 21, 0, 0),
+};
+
+static const struct samsung_cmu_info hsi_cmu_info __initconst = {
+       .mux_clks               = hsi_mux_clks,
+       .nr_mux_clks            = ARRAY_SIZE(hsi_mux_clks),
+       .gate_clks              = hsi_gate_clks,
+       .nr_gate_clks           = ARRAY_SIZE(hsi_gate_clks),
+       .nr_clk_ids             = HSI_NR_CLK,
+       .clk_regs               = hsi_clk_regs,
+       .nr_clk_regs            = ARRAY_SIZE(hsi_clk_regs),
+       .clk_name               = "dout_hsi_bus",
+};
+
+/* ---- CMU_PERI ------------------------------------------------------------ */
+
+/* Register Offset definitions for CMU_PERI (0x10030000) */
+#define PLL_CON0_MUX_CLKCMU_PERI_BUS_USER      0x0600
+#define PLL_CON0_MUX_CLKCMU_PERI_HSI2C_USER    0x0610
+#define PLL_CON0_MUX_CLKCMU_PERI_SPI_USER      0x0620
+#define PLL_CON0_MUX_CLKCMU_PERI_UART_USER     0x0630
+#define CLK_CON_DIV_DIV_CLK_PERI_HSI2C_0       0x1800
+#define CLK_CON_DIV_DIV_CLK_PERI_HSI2C_1       0x1804
+#define CLK_CON_DIV_DIV_CLK_PERI_HSI2C_2       0x1808
+#define CLK_CON_DIV_DIV_CLK_PERI_SPI_0         0x180c
+#define CLK_CON_GAT_GATE_CLK_PERI_HSI2C_0      0x200c
+#define CLK_CON_GAT_GATE_CLK_PERI_HSI2C_1      0x2010
+#define CLK_CON_GAT_GATE_CLK_PERI_HSI2C_2      0x2014
+#define CLK_CON_GAT_GOUT_PERI_GPIO_PERI_PCLK   0x2020
+#define CLK_CON_GAT_GOUT_PERI_HSI2C_0_IPCLK    0x2024
+#define CLK_CON_GAT_GOUT_PERI_HSI2C_0_PCLK     0x2028
+#define CLK_CON_GAT_GOUT_PERI_HSI2C_1_IPCLK    0x202c
+#define CLK_CON_GAT_GOUT_PERI_HSI2C_1_PCLK     0x2030
+#define CLK_CON_GAT_GOUT_PERI_HSI2C_2_IPCLK    0x2034
+#define CLK_CON_GAT_GOUT_PERI_HSI2C_2_PCLK     0x2038
+#define CLK_CON_GAT_GOUT_PERI_I2C_0_PCLK       0x203c
+#define CLK_CON_GAT_GOUT_PERI_I2C_1_PCLK       0x2040
+#define CLK_CON_GAT_GOUT_PERI_I2C_2_PCLK       0x2044
+#define CLK_CON_GAT_GOUT_PERI_I2C_3_PCLK       0x2048
+#define CLK_CON_GAT_GOUT_PERI_I2C_4_PCLK       0x204c
+#define CLK_CON_GAT_GOUT_PERI_I2C_5_PCLK       0x2050
+#define CLK_CON_GAT_GOUT_PERI_I2C_6_PCLK       0x2054
+#define CLK_CON_GAT_GOUT_PERI_MCT_PCLK         0x205c
+#define CLK_CON_GAT_GOUT_PERI_PWM_MOTOR_PCLK   0x2064
+#define CLK_CON_GAT_GOUT_PERI_SPI_0_IPCLK      0x209c
+#define CLK_CON_GAT_GOUT_PERI_SPI_0_PCLK       0x20a0
+#define CLK_CON_GAT_GOUT_PERI_SYSREG_PERI_PCLK 0x20a4
+#define CLK_CON_GAT_GOUT_PERI_UART_IPCLK       0x20a8
+#define CLK_CON_GAT_GOUT_PERI_UART_PCLK                0x20ac
+#define CLK_CON_GAT_GOUT_PERI_WDT_0_PCLK       0x20b0
+#define CLK_CON_GAT_GOUT_PERI_WDT_1_PCLK       0x20b4
+
+static const unsigned long peri_clk_regs[] __initconst = {
+       PLL_CON0_MUX_CLKCMU_PERI_BUS_USER,
+       PLL_CON0_MUX_CLKCMU_PERI_HSI2C_USER,
+       PLL_CON0_MUX_CLKCMU_PERI_SPI_USER,
+       PLL_CON0_MUX_CLKCMU_PERI_UART_USER,
+       CLK_CON_DIV_DIV_CLK_PERI_HSI2C_0,
+       CLK_CON_DIV_DIV_CLK_PERI_HSI2C_1,
+       CLK_CON_DIV_DIV_CLK_PERI_HSI2C_2,
+       CLK_CON_DIV_DIV_CLK_PERI_SPI_0,
+       CLK_CON_GAT_GATE_CLK_PERI_HSI2C_0,
+       CLK_CON_GAT_GATE_CLK_PERI_HSI2C_1,
+       CLK_CON_GAT_GATE_CLK_PERI_HSI2C_2,
+       CLK_CON_GAT_GOUT_PERI_GPIO_PERI_PCLK,
+       CLK_CON_GAT_GOUT_PERI_HSI2C_0_IPCLK,
+       CLK_CON_GAT_GOUT_PERI_HSI2C_0_PCLK,
+       CLK_CON_GAT_GOUT_PERI_HSI2C_1_IPCLK,
+       CLK_CON_GAT_GOUT_PERI_HSI2C_1_PCLK,
+       CLK_CON_GAT_GOUT_PERI_HSI2C_2_IPCLK,
+       CLK_CON_GAT_GOUT_PERI_HSI2C_2_PCLK,
+       CLK_CON_GAT_GOUT_PERI_I2C_0_PCLK,
+       CLK_CON_GAT_GOUT_PERI_I2C_1_PCLK,
+       CLK_CON_GAT_GOUT_PERI_I2C_2_PCLK,
+       CLK_CON_GAT_GOUT_PERI_I2C_3_PCLK,
+       CLK_CON_GAT_GOUT_PERI_I2C_4_PCLK,
+       CLK_CON_GAT_GOUT_PERI_I2C_5_PCLK,
+       CLK_CON_GAT_GOUT_PERI_I2C_6_PCLK,
+       CLK_CON_GAT_GOUT_PERI_MCT_PCLK,
+       CLK_CON_GAT_GOUT_PERI_PWM_MOTOR_PCLK,
+       CLK_CON_GAT_GOUT_PERI_SPI_0_IPCLK,
+       CLK_CON_GAT_GOUT_PERI_SPI_0_PCLK,
+       CLK_CON_GAT_GOUT_PERI_SYSREG_PERI_PCLK,
+       CLK_CON_GAT_GOUT_PERI_UART_IPCLK,
+       CLK_CON_GAT_GOUT_PERI_UART_PCLK,
+       CLK_CON_GAT_GOUT_PERI_WDT_0_PCLK,
+       CLK_CON_GAT_GOUT_PERI_WDT_1_PCLK,
+};
+
+/* List of parent clocks for Muxes in CMU_PERI */
+PNAME(mout_peri_bus_user_p)    = { "oscclk", "dout_peri_bus" };
+PNAME(mout_peri_uart_user_p)   = { "oscclk", "dout_peri_uart" };
+PNAME(mout_peri_hsi2c_user_p)  = { "oscclk", "dout_peri_ip" };
+PNAME(mout_peri_spi_user_p)    = { "oscclk", "dout_peri_ip" };
+
+static const struct samsung_mux_clock peri_mux_clks[] __initconst = {
+       MUX(CLK_MOUT_PERI_BUS_USER, "mout_peri_bus_user", mout_peri_bus_user_p,
+           PLL_CON0_MUX_CLKCMU_PERI_BUS_USER, 4, 1),
+       MUX(CLK_MOUT_PERI_UART_USER, "mout_peri_uart_user",
+           mout_peri_uart_user_p, PLL_CON0_MUX_CLKCMU_PERI_UART_USER, 4, 1),
+       MUX(CLK_MOUT_PERI_HSI2C_USER, "mout_peri_hsi2c_user",
+           mout_peri_hsi2c_user_p, PLL_CON0_MUX_CLKCMU_PERI_HSI2C_USER, 4, 1),
+       MUX(CLK_MOUT_PERI_SPI_USER, "mout_peri_spi_user", mout_peri_spi_user_p,
+           PLL_CON0_MUX_CLKCMU_PERI_SPI_USER, 4, 1),
+};
+
+static const struct samsung_div_clock peri_div_clks[] __initconst = {
+       DIV(CLK_DOUT_PERI_HSI2C0, "dout_peri_hsi2c0", "gout_peri_hsi2c0",
+           CLK_CON_DIV_DIV_CLK_PERI_HSI2C_0, 0, 5),
+       DIV(CLK_DOUT_PERI_HSI2C1, "dout_peri_hsi2c1", "gout_peri_hsi2c1",
+           CLK_CON_DIV_DIV_CLK_PERI_HSI2C_1, 0, 5),
+       DIV(CLK_DOUT_PERI_HSI2C2, "dout_peri_hsi2c2", "gout_peri_hsi2c2",
+           CLK_CON_DIV_DIV_CLK_PERI_HSI2C_2, 0, 5),
+       DIV(CLK_DOUT_PERI_SPI0, "dout_peri_spi0", "mout_peri_spi_user",
+           CLK_CON_DIV_DIV_CLK_PERI_SPI_0, 0, 5),
+};
+
+static const struct samsung_gate_clock peri_gate_clks[] __initconst = {
+       GATE(CLK_GOUT_PERI_HSI2C0, "gout_peri_hsi2c0", "mout_peri_hsi2c_user",
+            CLK_CON_GAT_GATE_CLK_PERI_HSI2C_0, 21, 0, 0),
+       GATE(CLK_GOUT_PERI_HSI2C1, "gout_peri_hsi2c1", "mout_peri_hsi2c_user",
+            CLK_CON_GAT_GATE_CLK_PERI_HSI2C_1, 21, 0, 0),
+       GATE(CLK_GOUT_PERI_HSI2C2, "gout_peri_hsi2c2", "mout_peri_hsi2c_user",
+            CLK_CON_GAT_GATE_CLK_PERI_HSI2C_2, 21, 0, 0),
+       GATE(CLK_GOUT_HSI2C0_IPCLK, "gout_hsi2c0_ipclk", "dout_peri_hsi2c0",
+            CLK_CON_GAT_GOUT_PERI_HSI2C_0_IPCLK, 21, 0, 0),
+       GATE(CLK_GOUT_HSI2C0_PCLK, "gout_hsi2c0_pclk", "mout_peri_bus_user",
+            CLK_CON_GAT_GOUT_PERI_HSI2C_0_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_HSI2C1_IPCLK, "gout_hsi2c1_ipclk", "dout_peri_hsi2c1",
+            CLK_CON_GAT_GOUT_PERI_HSI2C_1_IPCLK, 21, 0, 0),
+       GATE(CLK_GOUT_HSI2C1_PCLK, "gout_hsi2c1_pclk", "mout_peri_bus_user",
+            CLK_CON_GAT_GOUT_PERI_HSI2C_1_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_HSI2C2_IPCLK, "gout_hsi2c2_ipclk", "dout_peri_hsi2c2",
+            CLK_CON_GAT_GOUT_PERI_HSI2C_2_IPCLK, 21, 0, 0),
+       GATE(CLK_GOUT_HSI2C2_PCLK, "gout_hsi2c2_pclk", "mout_peri_bus_user",
+            CLK_CON_GAT_GOUT_PERI_HSI2C_2_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_I2C0_PCLK, "gout_i2c0_pclk", "mout_peri_bus_user",
+            CLK_CON_GAT_GOUT_PERI_I2C_0_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_I2C1_PCLK, "gout_i2c1_pclk", "mout_peri_bus_user",
+            CLK_CON_GAT_GOUT_PERI_I2C_1_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_I2C2_PCLK, "gout_i2c2_pclk", "mout_peri_bus_user",
+            CLK_CON_GAT_GOUT_PERI_I2C_2_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_I2C3_PCLK, "gout_i2c3_pclk", "mout_peri_bus_user",
+            CLK_CON_GAT_GOUT_PERI_I2C_3_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_I2C4_PCLK, "gout_i2c4_pclk", "mout_peri_bus_user",
+            CLK_CON_GAT_GOUT_PERI_I2C_4_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_I2C5_PCLK, "gout_i2c5_pclk", "mout_peri_bus_user",
+            CLK_CON_GAT_GOUT_PERI_I2C_5_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_I2C6_PCLK, "gout_i2c6_pclk", "mout_peri_bus_user",
+            CLK_CON_GAT_GOUT_PERI_I2C_6_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_MCT_PCLK, "gout_mct_pclk", "mout_peri_bus_user",
+            CLK_CON_GAT_GOUT_PERI_MCT_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_PWM_MOTOR_PCLK, "gout_pwm_motor_pclk",
+            "mout_peri_bus_user",
+            CLK_CON_GAT_GOUT_PERI_PWM_MOTOR_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_SPI0_IPCLK, "gout_spi0_ipclk", "dout_peri_spi0",
+            CLK_CON_GAT_GOUT_PERI_SPI_0_IPCLK, 21, 0, 0),
+       GATE(CLK_GOUT_SPI0_PCLK, "gout_spi0_pclk", "mout_peri_bus_user",
+            CLK_CON_GAT_GOUT_PERI_SPI_0_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_SYSREG_PERI_PCLK, "gout_sysreg_peri_pclk",
+            "mout_peri_bus_user",
+            CLK_CON_GAT_GOUT_PERI_SYSREG_PERI_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_UART_IPCLK, "gout_uart_ipclk", "mout_peri_uart_user",
+            CLK_CON_GAT_GOUT_PERI_UART_IPCLK, 21, 0, 0),
+       GATE(CLK_GOUT_UART_PCLK, "gout_uart_pclk", "mout_peri_bus_user",
+            CLK_CON_GAT_GOUT_PERI_UART_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_WDT0_PCLK, "gout_wdt0_pclk", "mout_peri_bus_user",
+            CLK_CON_GAT_GOUT_PERI_WDT_0_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_WDT1_PCLK, "gout_wdt1_pclk", "mout_peri_bus_user",
+            CLK_CON_GAT_GOUT_PERI_WDT_1_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_GPIO_PERI_PCLK, "gout_gpio_peri_pclk",
+            "mout_peri_bus_user",
+            CLK_CON_GAT_GOUT_PERI_GPIO_PERI_PCLK, 21, 0, 0),
+};
+
+static const struct samsung_cmu_info peri_cmu_info __initconst = {
+       .mux_clks               = peri_mux_clks,
+       .nr_mux_clks            = ARRAY_SIZE(peri_mux_clks),
+       .div_clks               = peri_div_clks,
+       .nr_div_clks            = ARRAY_SIZE(peri_div_clks),
+       .gate_clks              = peri_gate_clks,
+       .nr_gate_clks           = ARRAY_SIZE(peri_gate_clks),
+       .nr_clk_ids             = PERI_NR_CLK,
+       .clk_regs               = peri_clk_regs,
+       .nr_clk_regs            = ARRAY_SIZE(peri_clk_regs),
+       .clk_name               = "dout_peri_bus",
+};
+
+/* ---- CMU_CORE ------------------------------------------------------------ */
+
+/* Register Offset definitions for CMU_CORE (0x12000000) */
+#define PLL_CON0_MUX_CLKCMU_CORE_BUS_USER      0x0600
+#define PLL_CON0_MUX_CLKCMU_CORE_CCI_USER      0x0610
+#define PLL_CON0_MUX_CLKCMU_CORE_MMC_EMBD_USER 0x0620
+#define PLL_CON0_MUX_CLKCMU_CORE_SSS_USER      0x0630
+#define CLK_CON_MUX_MUX_CLK_CORE_GIC           0x1000
+#define CLK_CON_DIV_DIV_CLK_CORE_BUSP          0x1800
+#define CLK_CON_GAT_GOUT_CORE_CCI_550_ACLK     0x2038
+#define CLK_CON_GAT_GOUT_CORE_GIC_CLK          0x2040
+#define CLK_CON_GAT_GOUT_CORE_MMC_EMBD_I_ACLK  0x20e8
+#define CLK_CON_GAT_GOUT_CORE_MMC_EMBD_SDCLKIN 0x20ec
+#define CLK_CON_GAT_GOUT_CORE_SSS_I_ACLK       0x2128
+#define CLK_CON_GAT_GOUT_CORE_SSS_I_PCLK       0x212c
+
+static const unsigned long core_clk_regs[] __initconst = {
+       PLL_CON0_MUX_CLKCMU_CORE_BUS_USER,
+       PLL_CON0_MUX_CLKCMU_CORE_CCI_USER,
+       PLL_CON0_MUX_CLKCMU_CORE_MMC_EMBD_USER,
+       PLL_CON0_MUX_CLKCMU_CORE_SSS_USER,
+       CLK_CON_MUX_MUX_CLK_CORE_GIC,
+       CLK_CON_DIV_DIV_CLK_CORE_BUSP,
+       CLK_CON_GAT_GOUT_CORE_CCI_550_ACLK,
+       CLK_CON_GAT_GOUT_CORE_GIC_CLK,
+       CLK_CON_GAT_GOUT_CORE_MMC_EMBD_I_ACLK,
+       CLK_CON_GAT_GOUT_CORE_MMC_EMBD_SDCLKIN,
+       CLK_CON_GAT_GOUT_CORE_SSS_I_ACLK,
+       CLK_CON_GAT_GOUT_CORE_SSS_I_PCLK,
+};
+
+/* List of parent clocks for Muxes in CMU_CORE */
+PNAME(mout_core_bus_user_p)            = { "oscclk", "dout_core_bus" };
+PNAME(mout_core_cci_user_p)            = { "oscclk", "dout_core_cci" };
+PNAME(mout_core_mmc_embd_user_p)       = { "oscclk", "dout_core_mmc_embd" };
+PNAME(mout_core_sss_user_p)            = { "oscclk", "dout_core_sss" };
+PNAME(mout_core_gic_p)                 = { "dout_core_busp", "oscclk" };
+
+static const struct samsung_mux_clock core_mux_clks[] __initconst = {
+       MUX(CLK_MOUT_CORE_BUS_USER, "mout_core_bus_user", mout_core_bus_user_p,
+           PLL_CON0_MUX_CLKCMU_CORE_BUS_USER, 4, 1),
+       MUX(CLK_MOUT_CORE_CCI_USER, "mout_core_cci_user", mout_core_cci_user_p,
+           PLL_CON0_MUX_CLKCMU_CORE_CCI_USER, 4, 1),
+       MUX_F(CLK_MOUT_CORE_MMC_EMBD_USER, "mout_core_mmc_embd_user",
+             mout_core_mmc_embd_user_p, PLL_CON0_MUX_CLKCMU_CORE_MMC_EMBD_USER,
+             4, 1, CLK_SET_RATE_PARENT, 0),
+       MUX(CLK_MOUT_CORE_SSS_USER, "mout_core_sss_user", mout_core_sss_user_p,
+           PLL_CON0_MUX_CLKCMU_CORE_SSS_USER, 4, 1),
+       MUX(CLK_MOUT_CORE_GIC, "mout_core_gic", mout_core_gic_p,
+           CLK_CON_MUX_MUX_CLK_CORE_GIC, 0, 1),
+};
+
+static const struct samsung_div_clock core_div_clks[] __initconst = {
+       DIV(CLK_DOUT_CORE_BUSP, "dout_core_busp", "mout_core_bus_user",
+           CLK_CON_DIV_DIV_CLK_CORE_BUSP, 0, 2),
+};
+
+static const struct samsung_gate_clock core_gate_clks[] __initconst = {
+       GATE(CLK_GOUT_CCI_ACLK, "gout_cci_aclk", "mout_core_cci_user",
+            CLK_CON_GAT_GOUT_CORE_CCI_550_ACLK, 21, 0, 0),
+       GATE(CLK_GOUT_GIC_CLK, "gout_gic_clk", "mout_core_gic",
+            CLK_CON_GAT_GOUT_CORE_GIC_CLK, 21, 0, 0),
+       GATE(CLK_GOUT_MMC_EMBD_ACLK, "gout_mmc_embd_aclk", "dout_core_busp",
+            CLK_CON_GAT_GOUT_CORE_MMC_EMBD_I_ACLK, 21, 0, 0),
+       GATE(CLK_GOUT_MMC_EMBD_SDCLKIN, "gout_mmc_embd_sdclkin",
+            "mout_core_mmc_embd_user", CLK_CON_GAT_GOUT_CORE_MMC_EMBD_SDCLKIN,
+            21, CLK_SET_RATE_PARENT, 0),
+       GATE(CLK_GOUT_SSS_ACLK, "gout_sss_aclk", "mout_core_sss_user",
+            CLK_CON_GAT_GOUT_CORE_SSS_I_ACLK, 21, 0, 0),
+       GATE(CLK_GOUT_SSS_PCLK, "gout_sss_pclk", "dout_core_busp",
+            CLK_CON_GAT_GOUT_CORE_SSS_I_PCLK, 21, 0, 0),
+};
+
+static const struct samsung_cmu_info core_cmu_info __initconst = {
+       .mux_clks               = core_mux_clks,
+       .nr_mux_clks            = ARRAY_SIZE(core_mux_clks),
+       .div_clks               = core_div_clks,
+       .nr_div_clks            = ARRAY_SIZE(core_div_clks),
+       .gate_clks              = core_gate_clks,
+       .nr_gate_clks           = ARRAY_SIZE(core_gate_clks),
+       .nr_clk_ids             = CORE_NR_CLK,
+       .clk_regs               = core_clk_regs,
+       .nr_clk_regs            = ARRAY_SIZE(core_clk_regs),
+       .clk_name               = "dout_core_bus",
+};
+
+/* ---- CMU_DPU ------------------------------------------------------------- */
+
+/* Register Offset definitions for CMU_DPU (0x13000000) */
+#define PLL_CON0_MUX_CLKCMU_DPU_USER           0x0600
+#define CLK_CON_DIV_DIV_CLK_DPU_BUSP           0x1800
+#define CLK_CON_GAT_CLK_DPU_CMU_DPU_PCLK       0x2004
+#define CLK_CON_GAT_GOUT_DPU_ACLK_DECON0       0x2010
+#define CLK_CON_GAT_GOUT_DPU_ACLK_DMA          0x2014
+#define CLK_CON_GAT_GOUT_DPU_ACLK_DPP          0x2018
+#define CLK_CON_GAT_GOUT_DPU_PPMU_ACLK         0x2028
+#define CLK_CON_GAT_GOUT_DPU_PPMU_PCLK         0x202c
+#define CLK_CON_GAT_GOUT_DPU_SMMU_CLK          0x2038
+#define CLK_CON_GAT_GOUT_DPU_SYSREG_PCLK       0x203c
+
+static const unsigned long dpu_clk_regs[] __initconst = {
+       PLL_CON0_MUX_CLKCMU_DPU_USER,
+       CLK_CON_DIV_DIV_CLK_DPU_BUSP,
+       CLK_CON_GAT_CLK_DPU_CMU_DPU_PCLK,
+       CLK_CON_GAT_GOUT_DPU_ACLK_DECON0,
+       CLK_CON_GAT_GOUT_DPU_ACLK_DMA,
+       CLK_CON_GAT_GOUT_DPU_ACLK_DPP,
+       CLK_CON_GAT_GOUT_DPU_PPMU_ACLK,
+       CLK_CON_GAT_GOUT_DPU_PPMU_PCLK,
+       CLK_CON_GAT_GOUT_DPU_SMMU_CLK,
+       CLK_CON_GAT_GOUT_DPU_SYSREG_PCLK,
+};
+
+/* List of parent clocks for Muxes in CMU_CORE */
+PNAME(mout_dpu_user_p)         = { "oscclk", "dout_dpu" };
+
+static const struct samsung_mux_clock dpu_mux_clks[] __initconst = {
+       MUX(CLK_MOUT_DPU_USER, "mout_dpu_user", mout_dpu_user_p,
+           PLL_CON0_MUX_CLKCMU_DPU_USER, 4, 1),
+};
+
+static const struct samsung_div_clock dpu_div_clks[] __initconst = {
+       DIV(CLK_DOUT_DPU_BUSP, "dout_dpu_busp", "mout_dpu_user",
+           CLK_CON_DIV_DIV_CLK_DPU_BUSP, 0, 3),
+};
+
+static const struct samsung_gate_clock dpu_gate_clks[] __initconst = {
+       GATE(CLK_GOUT_DPU_CMU_DPU_PCLK, "gout_dpu_cmu_dpu_pclk",
+            "dout_dpu_busp", CLK_CON_GAT_CLK_DPU_CMU_DPU_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_DPU_DECON0_ACLK, "gout_dpu_decon0_aclk", "mout_dpu_user",
+            CLK_CON_GAT_GOUT_DPU_ACLK_DECON0, 21, 0, 0),
+       GATE(CLK_GOUT_DPU_DMA_ACLK, "gout_dpu_dma_aclk", "mout_dpu_user",
+            CLK_CON_GAT_GOUT_DPU_ACLK_DMA, 21, 0, 0),
+       GATE(CLK_GOUT_DPU_DPP_ACLK, "gout_dpu_dpp_aclk", "mout_dpu_user",
+            CLK_CON_GAT_GOUT_DPU_ACLK_DPP, 21, 0, 0),
+       GATE(CLK_GOUT_DPU_PPMU_ACLK, "gout_dpu_ppmu_aclk", "mout_dpu_user",
+            CLK_CON_GAT_GOUT_DPU_PPMU_ACLK, 21, 0, 0),
+       GATE(CLK_GOUT_DPU_PPMU_PCLK, "gout_dpu_ppmu_pclk", "dout_dpu_busp",
+            CLK_CON_GAT_GOUT_DPU_PPMU_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_DPU_SMMU_CLK, "gout_dpu_smmu_clk", "mout_dpu_user",
+            CLK_CON_GAT_GOUT_DPU_SMMU_CLK, 21, 0, 0),
+       GATE(CLK_GOUT_DPU_SYSREG_PCLK, "gout_dpu_sysreg_pclk", "dout_dpu_busp",
+            CLK_CON_GAT_GOUT_DPU_SYSREG_PCLK, 21, 0, 0),
+};
+
+static const struct samsung_cmu_info dpu_cmu_info __initconst = {
+       .mux_clks               = dpu_mux_clks,
+       .nr_mux_clks            = ARRAY_SIZE(dpu_mux_clks),
+       .div_clks               = dpu_div_clks,
+       .nr_div_clks            = ARRAY_SIZE(dpu_div_clks),
+       .gate_clks              = dpu_gate_clks,
+       .nr_gate_clks           = ARRAY_SIZE(dpu_gate_clks),
+       .nr_clk_ids             = DPU_NR_CLK,
+       .clk_regs               = dpu_clk_regs,
+       .nr_clk_regs            = ARRAY_SIZE(dpu_clk_regs),
+       .clk_name               = "dout_dpu",
+};
+
+/* ---- platform_driver ----------------------------------------------------- */
+
+static int __init exynos850_cmu_probe(struct platform_device *pdev)
+{
+       const struct samsung_cmu_info *info;
+       struct device *dev = &pdev->dev;
+       struct device_node *np = dev->of_node;
+
+       info = of_device_get_match_data(dev);
+       exynos850_init_clocks(np, info->clk_regs, info->nr_clk_regs);
+       samsung_cmu_register_one(np, info);
+
+       /* Keep bus clock running, so it's possible to access CMU registers */
+       if (info->clk_name) {
+               struct clk *bus_clk;
+
+               bus_clk = clk_get(dev, info->clk_name);
+               if (IS_ERR(bus_clk)) {
+                       pr_err("%s: could not find bus clock %s; err = %ld\n",
+                              __func__, info->clk_name, PTR_ERR(bus_clk));
+               } else {
+                       clk_prepare_enable(bus_clk);
+               }
+       }
+
+       return 0;
+}
+
+/* CMUs which belong to Power Domains and need runtime PM to be implemented */
+static const struct of_device_id exynos850_cmu_of_match[] = {
+       {
+               .compatible = "samsung,exynos850-cmu-hsi",
+               .data = &hsi_cmu_info,
+       }, {
+               .compatible = "samsung,exynos850-cmu-peri",
+               .data = &peri_cmu_info,
+       }, {
+               .compatible = "samsung,exynos850-cmu-core",
+               .data = &core_cmu_info,
+       }, {
+               .compatible = "samsung,exynos850-cmu-dpu",
+               .data = &dpu_cmu_info,
+       }, {
+       },
+};
+
+static struct platform_driver exynos850_cmu_driver __refdata = {
+       .driver = {
+               .name = "exynos850-cmu",
+               .of_match_table = exynos850_cmu_of_match,
+               .suppress_bind_attrs = true,
+       },
+       .probe = exynos850_cmu_probe,
+};
+
+static int __init exynos850_cmu_init(void)
+{
+       return platform_driver_register(&exynos850_cmu_driver);
+}
+core_initcall(exynos850_cmu_init);
index 5873a93..83d1b03 100644 (file)
@@ -415,6 +415,186 @@ static const struct clk_ops samsung_pll36xx_clk_min_ops = {
        .recalc_rate = samsung_pll36xx_recalc_rate,
 };
 
+/*
+ * PLL0822x Clock Type
+ */
+/* Maximum lock time can be 150 * PDIV cycles */
+#define PLL0822X_LOCK_FACTOR           (150)
+
+#define PLL0822X_MDIV_MASK             (0x3FF)
+#define PLL0822X_PDIV_MASK             (0x3F)
+#define PLL0822X_SDIV_MASK             (0x7)
+#define PLL0822X_MDIV_SHIFT            (16)
+#define PLL0822X_PDIV_SHIFT            (8)
+#define PLL0822X_SDIV_SHIFT            (0)
+#define PLL0822X_LOCK_STAT_SHIFT       (29)
+#define PLL0822X_ENABLE_SHIFT          (31)
+
+static unsigned long samsung_pll0822x_recalc_rate(struct clk_hw *hw,
+                                                 unsigned long parent_rate)
+{
+       struct samsung_clk_pll *pll = to_clk_pll(hw);
+       u32 mdiv, pdiv, sdiv, pll_con3;
+       u64 fvco = parent_rate;
+
+       pll_con3 = readl_relaxed(pll->con_reg);
+       mdiv = (pll_con3 >> PLL0822X_MDIV_SHIFT) & PLL0822X_MDIV_MASK;
+       pdiv = (pll_con3 >> PLL0822X_PDIV_SHIFT) & PLL0822X_PDIV_MASK;
+       sdiv = (pll_con3 >> PLL0822X_SDIV_SHIFT) & PLL0822X_SDIV_MASK;
+
+       fvco *= mdiv;
+       do_div(fvco, (pdiv << sdiv));
+
+       return (unsigned long)fvco;
+}
+
+static int samsung_pll0822x_set_rate(struct clk_hw *hw, unsigned long drate,
+                                    unsigned long prate)
+{
+       const struct samsung_pll_rate_table *rate;
+       struct samsung_clk_pll *pll = to_clk_pll(hw);
+       u32 pll_con3;
+
+       /* Get required rate settings from table */
+       rate = samsung_get_pll_settings(pll, drate);
+       if (!rate) {
+               pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__,
+                       drate, clk_hw_get_name(hw));
+               return -EINVAL;
+       }
+
+       /* Change PLL PMS values */
+       pll_con3 = readl_relaxed(pll->con_reg);
+       pll_con3 &= ~((PLL0822X_MDIV_MASK << PLL0822X_MDIV_SHIFT) |
+                       (PLL0822X_PDIV_MASK << PLL0822X_PDIV_SHIFT) |
+                       (PLL0822X_SDIV_MASK << PLL0822X_SDIV_SHIFT));
+       pll_con3 |= (rate->mdiv << PLL0822X_MDIV_SHIFT) |
+                       (rate->pdiv << PLL0822X_PDIV_SHIFT) |
+                       (rate->sdiv << PLL0822X_SDIV_SHIFT);
+
+       /* Set PLL lock time */
+       writel_relaxed(rate->pdiv * PLL0822X_LOCK_FACTOR,
+                       pll->lock_reg);
+
+       /* Write PMS values */
+       writel_relaxed(pll_con3, pll->con_reg);
+
+       /* Wait for PLL lock if the PLL is enabled */
+       if (pll_con3 & BIT(pll->enable_offs))
+               return samsung_pll_lock_wait(pll, BIT(pll->lock_offs));
+
+       return 0;
+}
+
+static const struct clk_ops samsung_pll0822x_clk_ops = {
+       .recalc_rate = samsung_pll0822x_recalc_rate,
+       .round_rate = samsung_pll_round_rate,
+       .set_rate = samsung_pll0822x_set_rate,
+       .enable = samsung_pll3xxx_enable,
+       .disable = samsung_pll3xxx_disable,
+};
+
+static const struct clk_ops samsung_pll0822x_clk_min_ops = {
+       .recalc_rate = samsung_pll0822x_recalc_rate,
+};
+
+/*
+ * PLL0831x Clock Type
+ */
+/* Maximum lock time can be 500 * PDIV cycles */
+#define PLL0831X_LOCK_FACTOR           (500)
+
+#define PLL0831X_KDIV_MASK             (0xFFFF)
+#define PLL0831X_MDIV_MASK             (0x1FF)
+#define PLL0831X_PDIV_MASK             (0x3F)
+#define PLL0831X_SDIV_MASK             (0x7)
+#define PLL0831X_MDIV_SHIFT            (16)
+#define PLL0831X_PDIV_SHIFT            (8)
+#define PLL0831X_SDIV_SHIFT            (0)
+#define PLL0831X_KDIV_SHIFT            (0)
+#define PLL0831X_LOCK_STAT_SHIFT       (29)
+#define PLL0831X_ENABLE_SHIFT          (31)
+
+static unsigned long samsung_pll0831x_recalc_rate(struct clk_hw *hw,
+                                                 unsigned long parent_rate)
+{
+       struct samsung_clk_pll *pll = to_clk_pll(hw);
+       u32 mdiv, pdiv, sdiv, pll_con3, pll_con5;
+       s16 kdiv;
+       u64 fvco = parent_rate;
+
+       pll_con3 = readl_relaxed(pll->con_reg);
+       pll_con5 = readl_relaxed(pll->con_reg + 8);
+       mdiv = (pll_con3 >> PLL0831X_MDIV_SHIFT) & PLL0831X_MDIV_MASK;
+       pdiv = (pll_con3 >> PLL0831X_PDIV_SHIFT) & PLL0831X_PDIV_MASK;
+       sdiv = (pll_con3 >> PLL0831X_SDIV_SHIFT) & PLL0831X_SDIV_MASK;
+       kdiv = (s16)((pll_con5 >> PLL0831X_KDIV_SHIFT) & PLL0831X_KDIV_MASK);
+
+       fvco *= (mdiv << 16) + kdiv;
+       do_div(fvco, (pdiv << sdiv));
+       fvco >>= 16;
+
+       return (unsigned long)fvco;
+}
+
+static int samsung_pll0831x_set_rate(struct clk_hw *hw, unsigned long drate,
+                                    unsigned long parent_rate)
+{
+       const struct samsung_pll_rate_table *rate;
+       struct samsung_clk_pll *pll = to_clk_pll(hw);
+       u32 pll_con3, pll_con5;
+
+       /* Get required rate settings from table */
+       rate = samsung_get_pll_settings(pll, drate);
+       if (!rate) {
+               pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__,
+                       drate, clk_hw_get_name(hw));
+               return -EINVAL;
+       }
+
+       pll_con3 = readl_relaxed(pll->con_reg);
+       pll_con5 = readl_relaxed(pll->con_reg + 8);
+
+       /* Change PLL PMSK values */
+       pll_con3 &= ~((PLL0831X_MDIV_MASK << PLL0831X_MDIV_SHIFT) |
+                       (PLL0831X_PDIV_MASK << PLL0831X_PDIV_SHIFT) |
+                       (PLL0831X_SDIV_MASK << PLL0831X_SDIV_SHIFT));
+       pll_con3 |= (rate->mdiv << PLL0831X_MDIV_SHIFT) |
+                       (rate->pdiv << PLL0831X_PDIV_SHIFT) |
+                       (rate->sdiv << PLL0831X_SDIV_SHIFT);
+       pll_con5 &= ~(PLL0831X_KDIV_MASK << PLL0831X_KDIV_SHIFT);
+       /*
+        * kdiv is 16-bit 2's complement (s16), but stored as unsigned int.
+        * Cast it to u16 to avoid leading 0xffff's in case of negative value.
+        */
+       pll_con5 |= ((u16)rate->kdiv << PLL0831X_KDIV_SHIFT);
+
+       /* Set PLL lock time */
+       writel_relaxed(rate->pdiv * PLL0831X_LOCK_FACTOR, pll->lock_reg);
+
+       /* Write PMSK values */
+       writel_relaxed(pll_con3, pll->con_reg);
+       writel_relaxed(pll_con5, pll->con_reg + 8);
+
+       /* Wait for PLL lock if the PLL is enabled */
+       if (pll_con3 & BIT(pll->enable_offs))
+               return samsung_pll_lock_wait(pll, BIT(pll->lock_offs));
+
+       return 0;
+}
+
+static const struct clk_ops samsung_pll0831x_clk_ops = {
+       .recalc_rate = samsung_pll0831x_recalc_rate,
+       .set_rate = samsung_pll0831x_set_rate,
+       .round_rate = samsung_pll_round_rate,
+       .enable = samsung_pll3xxx_enable,
+       .disable = samsung_pll3xxx_disable,
+};
+
+static const struct clk_ops samsung_pll0831x_clk_min_ops = {
+       .recalc_rate = samsung_pll0831x_recalc_rate,
+};
+
 /*
  * PLL45xx Clock Type
  */
@@ -1296,6 +1476,14 @@ static void __init _samsung_clk_register_pll(struct samsung_clk_provider *ctx,
                else
                        init.ops = &samsung_pll35xx_clk_ops;
                break;
+       case pll_0822x:
+               pll->enable_offs = PLL0822X_ENABLE_SHIFT;
+               pll->lock_offs = PLL0822X_LOCK_STAT_SHIFT;
+               if (!pll->rate_table)
+                       init.ops = &samsung_pll0822x_clk_min_ops;
+               else
+                       init.ops = &samsung_pll0822x_clk_ops;
+               break;
        case pll_4500:
                init.ops = &samsung_pll45xx_clk_min_ops;
                break;
@@ -1316,6 +1504,14 @@ static void __init _samsung_clk_register_pll(struct samsung_clk_provider *ctx,
                else
                        init.ops = &samsung_pll36xx_clk_ops;
                break;
+       case pll_0831x:
+               pll->enable_offs = PLL0831X_ENABLE_SHIFT;
+               pll->lock_offs = PLL0831X_LOCK_STAT_SHIFT;
+               if (!pll->rate_table)
+                       init.ops = &samsung_pll0831x_clk_min_ops;
+               else
+                       init.ops = &samsung_pll0831x_clk_ops;
+               break;
        case pll_6552:
        case pll_6552_s3c2416:
                init.ops = &samsung_pll6552_clk_ops;
index 79e41c2..a739f2b 100644 (file)
@@ -36,6 +36,8 @@ enum samsung_pll_type {
        pll_1451x,
        pll_1452x,
        pll_1460x,
+       pll_0822x,
+       pll_0831x,
 };
 
 #define PLL_RATE(_fin, _m, _p, _s, _k, _ks) \
index a7827a1..b31c00e 100644 (file)
@@ -63,15 +63,13 @@ static struct syscore_ops s5pv210_audss_clk_syscore_ops = {
 static int s5pv210_audss_clk_probe(struct platform_device *pdev)
 {
        int i, ret = 0;
-       struct resource *res;
        const char *mout_audss_p[2];
        const char *mout_i2s_p[3];
        const char *hclk_p;
        struct clk_hw **clk_table;
        struct clk *hclk, *pll_ref, *pll_in, *cdclk, *sclk_audio;
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       reg_base = devm_ioremap_resource(&pdev->dev, res);
+       reg_base = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(reg_base))
                return PTR_ERR(reg_base);
 
index 1949ae7..336243c 100644 (file)
@@ -378,6 +378,8 @@ struct samsung_clk_provider * __init samsung_cmu_register_one(
                samsung_clk_extended_sleep_init(reg_base,
                        cmu->clk_regs, cmu->nr_clk_regs,
                        cmu->suspend_regs, cmu->nr_suspend_regs);
+       if (cmu->cpu_clks)
+               samsung_clk_register_cpu(ctx, cmu->cpu_clks, cmu->nr_cpu_clks);
 
        samsung_clk_of_add_provider(np, ctx);
 
index c1e1a6b..26499e9 100644 (file)
@@ -271,6 +271,27 @@ struct samsung_pll_clock {
        __PLL(_typ, _id, _name, _pname, CLK_GET_RATE_NOCACHE, _lock,    \
              _con, _rtable)
 
+struct samsung_cpu_clock {
+       unsigned int    id;
+       const char      *name;
+       unsigned int    parent_id;
+       unsigned int    alt_parent_id;
+       unsigned long   flags;
+       int             offset;
+       const struct exynos_cpuclk_cfg_data *cfg;
+};
+
+#define CPU_CLK(_id, _name, _pid, _apid, _flags, _offset, _cfg) \
+       {                                                       \
+               .id               = _id,                        \
+               .name             = _name,                      \
+               .parent_id        = _pid,                       \
+               .alt_parent_id    = _apid,                      \
+               .flags            = _flags,                     \
+               .offset           = _offset,                    \
+               .cfg              = _cfg,                       \
+       }
+
 struct samsung_clock_reg_cache {
        struct list_head node;
        void __iomem *reg_base;
@@ -301,6 +322,9 @@ struct samsung_cmu_info {
        unsigned int nr_fixed_factor_clks;
        /* total number of clocks with IDs assigned*/
        unsigned int nr_clk_ids;
+       /* list of cpu clocks and respective count */
+       const struct samsung_cpu_clock *cpu_clks;
+       unsigned int nr_cpu_clks;
 
        /* list and number of clocks registers */
        const unsigned long *clk_regs;
@@ -350,6 +374,8 @@ extern void __init samsung_clk_register_gate(struct samsung_clk_provider *ctx,
 extern void __init samsung_clk_register_pll(struct samsung_clk_provider *ctx,
                        const struct samsung_pll_clock *pll_list,
                        unsigned int nr_clk, void __iomem *base);
+extern void samsung_clk_register_cpu(struct samsung_clk_provider *ctx,
+               const struct samsung_cpu_clock *list, unsigned int nr_clk);
 
 extern struct samsung_clk_provider __init *samsung_cmu_register_one(
                        struct device_node *,
index cd46d88..e76e167 100644 (file)
@@ -71,6 +71,7 @@ config SUN8I_A33_CCU
 config SUN8I_A83T_CCU
        bool "Support for the Allwinner A83T CCU"
        default MACH_SUN8I
+       depends on MACH_SUN8I || COMPILE_TEST
 
 config SUN8I_H3_CCU
        bool "Support for the Allwinner H3 CCU"
index f32366d..bd9a878 100644 (file)
@@ -1464,7 +1464,7 @@ static void __init sun4i_ccu_init(struct device_node *node,
        val &= ~GENMASK(7, 6);
        writel(val | (2 << 6), reg + SUN4I_AHB_REG);
 
-       sunxi_ccu_probe(node, reg, desc);
+       of_sunxi_ccu_probe(node, reg, desc);
 }
 
 static void __init sun4i_a10_ccu_setup(struct device_node *node)
index a56142b..804729e 100644 (file)
@@ -196,7 +196,7 @@ static int sun50i_a100_r_ccu_probe(struct platform_device *pdev)
        if (IS_ERR(reg))
                return PTR_ERR(reg);
 
-       return sunxi_ccu_probe(pdev->dev.of_node, reg, &sun50i_a100_r_ccu_desc);
+       return devm_sunxi_ccu_probe(&pdev->dev, reg, &sun50i_a100_r_ccu_desc);
 }
 
 static const struct of_device_id sun50i_a100_r_ccu_ids[] = {
@@ -208,6 +208,7 @@ static struct platform_driver sun50i_a100_r_ccu_driver = {
        .probe  = sun50i_a100_r_ccu_probe,
        .driver = {
                .name   = "sun50i-a100-r-ccu",
+               .suppress_bind_attrs = true,
                .of_match_table = sun50i_a100_r_ccu_ids,
        },
 };
index 81b48c7..1d475d5 100644 (file)
@@ -1247,7 +1247,7 @@ static int sun50i_a100_ccu_probe(struct platform_device *pdev)
                writel(val, reg + sun50i_a100_usb2_clk_regs[i]);
        }
 
-       ret = sunxi_ccu_probe(pdev->dev.of_node, reg, &sun50i_a100_ccu_desc);
+       ret = devm_sunxi_ccu_probe(&pdev->dev, reg, &sun50i_a100_ccu_desc);
        if (ret)
                return ret;
 
@@ -1270,6 +1270,7 @@ static struct platform_driver sun50i_a100_ccu_driver = {
        .probe  = sun50i_a100_ccu_probe,
        .driver = {
                .name   = "sun50i-a100-ccu",
+               .suppress_bind_attrs = true,
                .of_match_table = sun50i_a100_ccu_ids,
        },
 };
index 149cfde..a8c5a92 100644 (file)
@@ -938,13 +938,11 @@ static struct ccu_mux_nb sun50i_a64_cpu_nb = {
 
 static int sun50i_a64_ccu_probe(struct platform_device *pdev)
 {
-       struct resource *res;
        void __iomem *reg;
        u32 val;
        int ret;
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       reg = devm_ioremap_resource(&pdev->dev, res);
+       reg = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(reg))
                return PTR_ERR(reg);
 
@@ -955,7 +953,7 @@ static int sun50i_a64_ccu_probe(struct platform_device *pdev)
 
        writel(0x515, reg + SUN50I_A64_PLL_MIPI_REG);
 
-       ret = sunxi_ccu_probe(pdev->dev.of_node, reg, &sun50i_a64_ccu_desc);
+       ret = devm_sunxi_ccu_probe(&pdev->dev, reg, &sun50i_a64_ccu_desc);
        if (ret)
                return ret;
 
@@ -978,6 +976,7 @@ static struct platform_driver sun50i_a64_ccu_driver = {
        .probe  = sun50i_a64_ccu_probe,
        .driver = {
                .name   = "sun50i-a64-ccu",
+               .suppress_bind_attrs = true,
                .of_match_table = sun50i_a64_ccu_ids,
        },
 };
index f8909a7..f30d7eb 100644 (file)
@@ -232,7 +232,7 @@ static void __init sunxi_r_ccu_init(struct device_node *node,
                return;
        }
 
-       sunxi_ccu_probe(node, reg, desc);
+       of_sunxi_ccu_probe(node, reg, desc);
 }
 
 static void __init sun50i_h6_r_ccu_setup(struct device_node *node)
index bff446b..e5672c1 100644 (file)
@@ -1183,13 +1183,11 @@ static const u32 usb2_clk_regs[] = {
 
 static int sun50i_h6_ccu_probe(struct platform_device *pdev)
 {
-       struct resource *res;
        void __iomem *reg;
        u32 val;
        int i;
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       reg = devm_ioremap_resource(&pdev->dev, res);
+       reg = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(reg))
                return PTR_ERR(reg);
 
@@ -1240,7 +1238,7 @@ static int sun50i_h6_ccu_probe(struct platform_device *pdev)
        val |= BIT(24);
        writel(val, reg + SUN50I_H6_HDMI_CEC_CLK_REG);
 
-       return sunxi_ccu_probe(pdev->dev.of_node, reg, &sun50i_h6_ccu_desc);
+       return devm_sunxi_ccu_probe(&pdev->dev, reg, &sun50i_h6_ccu_desc);
 }
 
 static const struct of_device_id sun50i_h6_ccu_ids[] = {
@@ -1252,6 +1250,7 @@ static struct platform_driver sun50i_h6_ccu_driver = {
        .probe  = sun50i_h6_ccu_probe,
        .driver = {
                .name   = "sun50i-h6-ccu",
+               .suppress_bind_attrs = true,
                .of_match_table = sun50i_h6_ccu_ids,
        },
 };
index 2253073..22eb180 100644 (file)
@@ -1141,9 +1141,7 @@ static void __init sun50i_h616_ccu_setup(struct device_node *node)
        val |= BIT(24);
        writel(val, reg + SUN50I_H616_HDMI_CEC_CLK_REG);
 
-       i = sunxi_ccu_probe(node, reg, &sun50i_h616_ccu_desc);
-       if (i)
-               pr_err("%pOF: probing clocks fails: %d\n", node, i);
+       of_sunxi_ccu_probe(node, reg, &sun50i_h616_ccu_desc);
 }
 
 CLK_OF_DECLARE(sun50i_h616_ccu, "allwinner,sun50i-h616-ccu",
index b78e9b5..1f4bc0e 100644 (file)
@@ -1012,7 +1012,7 @@ static void __init sun5i_ccu_init(struct device_node *node,
        val &= ~GENMASK(7, 6);
        writel(val | (2 << 6), reg + SUN5I_AHB_REG);
 
-       sunxi_ccu_probe(node, reg, desc);
+       of_sunxi_ccu_probe(node, reg, desc);
 }
 
 static void __init sun5i_a10s_ccu_setup(struct device_node *node)
index 9b40d53..3df5c0b 100644 (file)
@@ -1257,7 +1257,7 @@ static void __init sun6i_a31_ccu_setup(struct device_node *node)
        val |= 0x3 << 12;
        writel(val, reg + SUN6I_A31_AHB1_REG);
 
-       sunxi_ccu_probe(node, reg, &sun6i_a31_ccu_desc);
+       of_sunxi_ccu_probe(node, reg, &sun6i_a31_ccu_desc);
 
        ccu_mux_notifier_register(pll_cpu_clk.common.hw.clk,
                                  &sun6i_a31_cpu_nb);
index 103aa50..577bb23 100644 (file)
@@ -745,7 +745,7 @@ static void __init sun8i_a23_ccu_setup(struct device_node *node)
        val &= ~BIT(16);
        writel(val, reg + SUN8I_A23_PLL_MIPI_REG);
 
-       sunxi_ccu_probe(node, reg, &sun8i_a23_ccu_desc);
+       of_sunxi_ccu_probe(node, reg, &sun8i_a23_ccu_desc);
 }
 CLK_OF_DECLARE(sun8i_a23_ccu, "allwinner,sun8i-a23-ccu",
               sun8i_a23_ccu_setup);
index 91838cd..8f65cd0 100644 (file)
@@ -805,7 +805,7 @@ static void __init sun8i_a33_ccu_setup(struct device_node *node)
        val &= ~BIT(16);
        writel(val, reg + SUN8I_A33_PLL_MIPI_REG);
 
-       sunxi_ccu_probe(node, reg, &sun8i_a33_ccu_desc);
+       of_sunxi_ccu_probe(node, reg, &sun8i_a33_ccu_desc);
 
        /* Gate then ungate PLL CPU after any rate changes */
        ccu_pll_notifier_register(&sun8i_a33_pll_cpu_nb);
index 2b43452..3c310ae 100644 (file)
@@ -887,12 +887,10 @@ static void sun8i_a83t_cpu_pll_fixup(void __iomem *reg)
 
 static int sun8i_a83t_ccu_probe(struct platform_device *pdev)
 {
-       struct resource *res;
        void __iomem *reg;
        u32 val;
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       reg = devm_ioremap_resource(&pdev->dev, res);
+       reg = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(reg))
                return PTR_ERR(reg);
 
@@ -906,7 +904,7 @@ static int sun8i_a83t_ccu_probe(struct platform_device *pdev)
        sun8i_a83t_cpu_pll_fixup(reg + SUN8I_A83T_PLL_C0CPUX_REG);
        sun8i_a83t_cpu_pll_fixup(reg + SUN8I_A83T_PLL_C1CPUX_REG);
 
-       return sunxi_ccu_probe(pdev->dev.of_node, reg, &sun8i_a83t_ccu_desc);
+       return devm_sunxi_ccu_probe(&pdev->dev, reg, &sun8i_a83t_ccu_desc);
 }
 
 static const struct of_device_id sun8i_a83t_ccu_ids[] = {
@@ -918,6 +916,7 @@ static struct platform_driver sun8i_a83t_ccu_driver = {
        .probe  = sun8i_a83t_ccu_probe,
        .driver = {
                .name   = "sun8i-a83t-ccu",
+               .suppress_bind_attrs = true,
                .of_match_table = sun8i_a83t_ccu_ids,
        },
 };
index 524f332..573b505 100644 (file)
@@ -280,7 +280,6 @@ static const struct sunxi_ccu_desc sun50i_h5_de2_clk_desc = {
 
 static int sunxi_de2_clk_probe(struct platform_device *pdev)
 {
-       struct resource *res;
        struct clk *bus_clk, *mod_clk;
        struct reset_control *rstc;
        void __iomem *reg;
@@ -291,8 +290,7 @@ static int sunxi_de2_clk_probe(struct platform_device *pdev)
        if (!ccu_desc)
                return -EINVAL;
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       reg = devm_ioremap_resource(&pdev->dev, res);
+       reg = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(reg))
                return PTR_ERR(reg);
 
@@ -342,7 +340,7 @@ static int sunxi_de2_clk_probe(struct platform_device *pdev)
                goto err_disable_mod_clk;
        }
 
-       ret = sunxi_ccu_probe(pdev->dev.of_node, reg, ccu_desc);
+       ret = devm_sunxi_ccu_probe(&pdev->dev, reg, ccu_desc);
        if (ret)
                goto err_assert_reset;
 
index 7e629a4..d2fc290 100644 (file)
@@ -1154,7 +1154,7 @@ static void __init sunxi_h3_h5_ccu_init(struct device_node *node,
        val &= ~GENMASK(19, 16);
        writel(val | (0 << 16), reg + SUN8I_H3_PLL_AUDIO_REG);
 
-       sunxi_ccu_probe(node, reg, desc);
+       of_sunxi_ccu_probe(node, reg, desc);
 
        /* Gate then ungate PLL CPU after any rate changes */
        ccu_pll_notifier_register(&sun8i_h3_pll_cpu_nb);
index 4c8c491..9e754d1 100644 (file)
@@ -265,7 +265,7 @@ static void __init sunxi_r_ccu_init(struct device_node *node,
                return;
        }
 
-       sunxi_ccu_probe(node, reg, desc);
+       of_sunxi_ccu_probe(node, reg, desc);
 }
 
 static void __init sun8i_a83t_r_ccu_setup(struct device_node *node)
index 8415341..8bb18d9 100644 (file)
@@ -1307,14 +1307,12 @@ static struct regmap_config sun8i_r40_ccu_regmap_config = {
 
 static int sun8i_r40_ccu_probe(struct platform_device *pdev)
 {
-       struct resource *res;
        struct regmap *regmap;
        void __iomem *reg;
        u32 val;
        int ret;
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       reg = devm_ioremap_resource(&pdev->dev, res);
+       reg = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(reg))
                return PTR_ERR(reg);
 
@@ -1346,7 +1344,7 @@ static int sun8i_r40_ccu_probe(struct platform_device *pdev)
        if (IS_ERR(regmap))
                return PTR_ERR(regmap);
 
-       ret = sunxi_ccu_probe(pdev->dev.of_node, reg, &sun8i_r40_ccu_desc);
+       ret = devm_sunxi_ccu_probe(&pdev->dev, reg, &sun8i_r40_ccu_desc);
        if (ret)
                return ret;
 
@@ -1369,6 +1367,7 @@ static struct platform_driver sun8i_r40_ccu_driver = {
        .probe  = sun8i_r40_ccu_probe,
        .driver = {
                .name   = "sun8i-r40-ccu",
+               .suppress_bind_attrs = true,
                .of_match_table = sun8i_r40_ccu_ids,
        },
 };
index f49724a..ce150f8 100644 (file)
@@ -822,7 +822,7 @@ static void __init sun8i_v3_v3s_ccu_init(struct device_node *node,
        val &= ~GENMASK(19, 16);
        writel(val, reg + SUN8I_V3S_PLL_AUDIO_REG);
 
-       sunxi_ccu_probe(node, reg, ccu_desc);
+       of_sunxi_ccu_probe(node, reg, ccu_desc);
 }
 
 static void __init sun8i_v3s_ccu_setup(struct device_node *node)
index 6616e81..3cde261 100644 (file)
@@ -203,14 +203,12 @@ static const struct sunxi_ccu_desc sun9i_a80_de_clk_desc = {
 
 static int sun9i_a80_de_clk_probe(struct platform_device *pdev)
 {
-       struct resource *res;
        struct clk *bus_clk;
        struct reset_control *rstc;
        void __iomem *reg;
        int ret;
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       reg = devm_ioremap_resource(&pdev->dev, res);
+       reg = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(reg))
                return PTR_ERR(reg);
 
@@ -246,8 +244,7 @@ static int sun9i_a80_de_clk_probe(struct platform_device *pdev)
                goto err_disable_clk;
        }
 
-       ret = sunxi_ccu_probe(pdev->dev.of_node, reg,
-                             &sun9i_a80_de_clk_desc);
+       ret = devm_sunxi_ccu_probe(&pdev->dev, reg, &sun9i_a80_de_clk_desc);
        if (ret)
                goto err_assert_reset;
 
@@ -269,6 +266,7 @@ static struct platform_driver sun9i_a80_de_clk_driver = {
        .probe  = sun9i_a80_de_clk_probe,
        .driver = {
                .name   = "sun9i-a80-de-clks",
+               .suppress_bind_attrs = true,
                .of_match_table = sun9i_a80_de_clk_ids,
        },
 };
index 4b4a507..0740e89 100644 (file)
@@ -92,13 +92,11 @@ static const struct sunxi_ccu_desc sun9i_a80_usb_clk_desc = {
 
 static int sun9i_a80_usb_clk_probe(struct platform_device *pdev)
 {
-       struct resource *res;
        struct clk *bus_clk;
        void __iomem *reg;
        int ret;
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       reg = devm_ioremap_resource(&pdev->dev, res);
+       reg = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(reg))
                return PTR_ERR(reg);
 
@@ -117,8 +115,7 @@ static int sun9i_a80_usb_clk_probe(struct platform_device *pdev)
                return ret;
        }
 
-       ret = sunxi_ccu_probe(pdev->dev.of_node, reg,
-                             &sun9i_a80_usb_clk_desc);
+       ret = devm_sunxi_ccu_probe(&pdev->dev, reg, &sun9i_a80_usb_clk_desc);
        if (ret)
                goto err_disable_clk;
 
index ef29582..d416af2 100644 (file)
@@ -1213,12 +1213,10 @@ static void sun9i_a80_cpu_pll_fixup(void __iomem *reg)
 
 static int sun9i_a80_ccu_probe(struct platform_device *pdev)
 {
-       struct resource *res;
        void __iomem *reg;
        u32 val;
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       reg = devm_ioremap_resource(&pdev->dev, res);
+       reg = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(reg))
                return PTR_ERR(reg);
 
@@ -1231,7 +1229,7 @@ static int sun9i_a80_ccu_probe(struct platform_device *pdev)
        sun9i_a80_cpu_pll_fixup(reg + SUN9I_A80_PLL_C0CPUX_REG);
        sun9i_a80_cpu_pll_fixup(reg + SUN9I_A80_PLL_C1CPUX_REG);
 
-       return sunxi_ccu_probe(pdev->dev.of_node, reg, &sun9i_a80_ccu_desc);
+       return devm_sunxi_ccu_probe(&pdev->dev, reg, &sun9i_a80_ccu_desc);
 }
 
 static const struct of_device_id sun9i_a80_ccu_ids[] = {
@@ -1243,6 +1241,7 @@ static struct platform_driver sun9i_a80_ccu_driver = {
        .probe  = sun9i_a80_ccu_probe,
        .driver = {
                .name   = "sun9i-a80-ccu",
+               .suppress_bind_attrs = true,
                .of_match_table = sun9i_a80_ccu_ids,
        },
 };
index 7ecc3a5..61ad7ee 100644 (file)
@@ -538,7 +538,7 @@ static void __init suniv_f1c100s_ccu_setup(struct device_node *node)
        val &= ~GENMASK(19, 16);
        writel(val | (3 << 16), reg + SUNIV_PLL_AUDIO_REG);
 
-       sunxi_ccu_probe(node, reg, &suniv_ccu_desc);
+       of_sunxi_ccu_probe(node, reg, &suniv_ccu_desc);
 
        /* Gate then ungate PLL CPU after any rate changes */
        ccu_pll_notifier_register(&suniv_pll_cpu_nb);
index 2e20e65..31af8b6 100644 (file)
@@ -7,6 +7,7 @@
 
 #include <linux/clk.h>
 #include <linux/clk-provider.h>
+#include <linux/device.h>
 #include <linux/iopoll.h>
 #include <linux/slab.h>
 
 #include "ccu_gate.h"
 #include "ccu_reset.h"
 
-static DEFINE_SPINLOCK(ccu_lock);
+struct sunxi_ccu {
+       const struct sunxi_ccu_desc     *desc;
+       spinlock_t                      lock;
+       struct ccu_reset                reset;
+};
 
 void ccu_helper_wait_for_lock(struct ccu_common *common, u32 lock)
 {
@@ -79,12 +84,17 @@ int ccu_pll_notifier_register(struct ccu_pll_nb *pll_nb)
                                     &pll_nb->clk_nb);
 }
 
-int sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
-                   const struct sunxi_ccu_desc *desc)
+static int sunxi_ccu_probe(struct sunxi_ccu *ccu, struct device *dev,
+                          struct device_node *node, void __iomem *reg,
+                          const struct sunxi_ccu_desc *desc)
 {
        struct ccu_reset *reset;
        int i, ret;
 
+       ccu->desc = desc;
+
+       spin_lock_init(&ccu->lock);
+
        for (i = 0; i < desc->num_ccu_clks; i++) {
                struct ccu_common *cclk = desc->ccu_clks[i];
 
@@ -92,7 +102,7 @@ int sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
                        continue;
 
                cclk->base = reg;
-               cclk->lock = &ccu_lock;
+               cclk->lock = &ccu->lock;
        }
 
        for (i = 0; i < desc->hw_clks->num ; i++) {
@@ -103,7 +113,10 @@ int sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
                        continue;
 
                name = hw->init->name;
-               ret = of_clk_hw_register(node, hw);
+               if (dev)
+                       ret = clk_hw_register(dev, hw);
+               else
+                       ret = of_clk_hw_register(node, hw);
                if (ret) {
                        pr_err("Couldn't register clock %d - %s\n", i, name);
                        goto err_clk_unreg;
@@ -115,29 +128,22 @@ int sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
        if (ret)
                goto err_clk_unreg;
 
-       reset = kzalloc(sizeof(*reset), GFP_KERNEL);
-       if (!reset) {
-               ret = -ENOMEM;
-               goto err_alloc_reset;
-       }
-
+       reset = &ccu->reset;
        reset->rcdev.of_node = node;
        reset->rcdev.ops = &ccu_reset_ops;
-       reset->rcdev.owner = THIS_MODULE;
+       reset->rcdev.owner = dev ? dev->driver->owner : THIS_MODULE;
        reset->rcdev.nr_resets = desc->num_resets;
        reset->base = reg;
-       reset->lock = &ccu_lock;
+       reset->lock = &ccu->lock;
        reset->reset_map = desc->resets;
 
        ret = reset_controller_register(&reset->rcdev);
        if (ret)
-               goto err_of_clk_unreg;
+               goto err_del_provider;
 
        return 0;
 
-err_of_clk_unreg:
-       kfree(reset);
-err_alloc_reset:
+err_del_provider:
        of_clk_del_provider(node);
 err_clk_unreg:
        while (--i >= 0) {
@@ -149,3 +155,59 @@ err_clk_unreg:
        }
        return ret;
 }
+
+static void devm_sunxi_ccu_release(struct device *dev, void *res)
+{
+       struct sunxi_ccu *ccu = res;
+       const struct sunxi_ccu_desc *desc = ccu->desc;
+       int i;
+
+       reset_controller_unregister(&ccu->reset.rcdev);
+       of_clk_del_provider(dev->of_node);
+
+       for (i = 0; i < desc->hw_clks->num; i++) {
+               struct clk_hw *hw = desc->hw_clks->hws[i];
+
+               if (!hw)
+                       continue;
+               clk_hw_unregister(hw);
+       }
+}
+
+int devm_sunxi_ccu_probe(struct device *dev, void __iomem *reg,
+                        const struct sunxi_ccu_desc *desc)
+{
+       struct sunxi_ccu *ccu;
+       int ret;
+
+       ccu = devres_alloc(devm_sunxi_ccu_release, sizeof(*ccu), GFP_KERNEL);
+       if (!ccu)
+               return -ENOMEM;
+
+       ret = sunxi_ccu_probe(ccu, dev, dev->of_node, reg, desc);
+       if (ret) {
+               devres_free(ccu);
+               return ret;
+       }
+
+       devres_add(dev, ccu);
+
+       return 0;
+}
+
+void of_sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
+                       const struct sunxi_ccu_desc *desc)
+{
+       struct sunxi_ccu *ccu;
+       int ret;
+
+       ccu = kzalloc(sizeof(*ccu), GFP_KERNEL);
+       if (!ccu)
+               return;
+
+       ret = sunxi_ccu_probe(ccu, NULL, node, reg, desc);
+       if (ret) {
+               pr_err("%pOF: probing clocks failed: %d\n", node, ret);
+               kfree(ccu);
+       }
+}
index 04e7a12..98a1834 100644 (file)
@@ -63,7 +63,9 @@ struct ccu_pll_nb {
 
 int ccu_pll_notifier_register(struct ccu_pll_nb *pll_nb);
 
-int sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
-                   const struct sunxi_ccu_desc *desc);
+int devm_sunxi_ccu_probe(struct device *dev, void __iomem *reg,
+                        const struct sunxi_ccu_desc *desc);
+void of_sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
+                       const struct sunxi_ccu_desc *desc);
 
 #endif /* _COMMON_H_ */
index f165395..e31efc5 100644 (file)
@@ -40,7 +40,6 @@ struct ccu_mux_internal {
        _SUNXI_CCU_MUX_TABLE(_shift, _width, NULL)
 
 struct ccu_mux {
-       u16                     reg;
        u32                     enable;
 
        struct ccu_mux_internal mux;
index f9d715e..5180028 100644 (file)
@@ -88,14 +88,12 @@ CLK_OF_DECLARE_DRIVER(sun4i_a10_mod0, "allwinner,sun4i-a10-mod0-clk",
 static int sun4i_a10_mod0_clk_probe(struct platform_device *pdev)
 {
        struct device_node *np = pdev->dev.of_node;
-       struct resource *r;
        void __iomem *reg;
 
        if (!np)
                return -ENODEV;
 
-       r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       reg = devm_ioremap_resource(&pdev->dev, r);
+       reg = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(reg))
                return PTR_ERR(reg);
 
index 4c75b07..e4cf118 100644 (file)
@@ -40,7 +40,6 @@ static int sun6i_a31_apb0_gates_clk_probe(struct platform_device *pdev)
        const struct gates_data *data;
        const char *clk_parent;
        const char *clk_name;
-       struct resource *r;
        void __iomem *reg;
        int ngates;
        int i;
@@ -53,8 +52,7 @@ static int sun6i_a31_apb0_gates_clk_probe(struct platform_device *pdev)
        if (!data)
                return -ENODEV;
 
-       r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       reg = devm_ioremap_resource(&pdev->dev, r);
+       reg = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(reg))
                return PTR_ERR(reg);
 
index 10f70c3..f80c67b 100644 (file)
@@ -32,12 +32,10 @@ static int sun6i_a31_apb0_clk_probe(struct platform_device *pdev)
        struct device_node *np = pdev->dev.of_node;
        const char *clk_name = np->name;
        const char *clk_parent;
-       struct resource *r;
        void __iomem *reg;
        struct clk *clk;
 
-       r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       reg = devm_ioremap_resource(&pdev->dev, r);
+       reg = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(reg))
                return PTR_ERR(reg);
 
index 54babc2..9f9a2cf 100644 (file)
@@ -71,12 +71,10 @@ static DEFINE_SPINLOCK(sun6i_ar100_lock);
 static int sun6i_a31_ar100_clk_probe(struct platform_device *pdev)
 {
        struct device_node *np = pdev->dev.of_node;
-       struct resource *r;
        void __iomem *reg;
        struct clk *clk;
 
-       r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       reg = devm_ioremap_resource(&pdev->dev, r);
+       reg = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(reg))
                return PTR_ERR(reg);
 
index fc5d6e3..f605ecc 100644 (file)
@@ -87,12 +87,10 @@ CLK_OF_DECLARE_DRIVER(sun8i_a23_apb0, "allwinner,sun8i-a23-apb0-clk",
 static int sun8i_a23_apb0_clk_probe(struct platform_device *pdev)
 {
        struct device_node *np = pdev->dev.of_node;
-       struct resource *r;
        void __iomem *reg;
        struct clk *clk;
 
-       r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       reg = devm_ioremap_resource(&pdev->dev, r);
+       reg = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(reg))
                return PTR_ERR(reg);
 
index 53fd290..c29b83d 100644 (file)
@@ -8,6 +8,9 @@ obj-y += clk-prcc.o
 obj-y += clk-prcmu.o
 obj-y += clk-sysctrl.o
 
+# Reset control
+obj-y += reset-prcc.o
+
 # Clock definitions
 obj-y += u8500_of_clk.o
 
diff --git a/drivers/clk/ux500/prcc.h b/drivers/clk/ux500/prcc.h
new file mode 100644 (file)
index 0000000..5b6774d
--- /dev/null
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef __PRCC_H
+#define __PRCC_H
+
+#define PRCC_NUM_PERIPH_CLUSTERS 6
+#define PRCC_PERIPHS_PER_CLUSTER 32
+
+/* CLKRST4 is missing making it hard to index things */
+enum clkrst_index {
+       CLKRST1_INDEX = 0,
+       CLKRST2_INDEX,
+       CLKRST3_INDEX,
+       CLKRST5_INDEX,
+       CLKRST6_INDEX,
+       CLKRST_MAX,
+};
+
+#endif
diff --git a/drivers/clk/ux500/reset-prcc.c b/drivers/clk/ux500/reset-prcc.c
new file mode 100644 (file)
index 0000000..fcd5d04
--- /dev/null
@@ -0,0 +1,181 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Reset controller portions for the U8500 PRCC
+ * Copyright (C) 2021 Linus Walleij <linus.walleij@linaro.org>
+ */
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/slab.h>
+#include <linux/io.h>
+#include <linux/err.h>
+#include <linux/types.h>
+#include <linux/reset-controller.h>
+#include <linux/bits.h>
+#include <linux/delay.h>
+
+#include "prcc.h"
+#include "reset-prcc.h"
+
+#define to_u8500_prcc_reset(p) container_of((p), struct u8500_prcc_reset, rcdev)
+
+/* This macro flattens the 2-dimensional PRCC numberspace */
+#define PRCC_RESET_LINE(prcc_num, bit) \
+       (((prcc_num) * PRCC_PERIPHS_PER_CLUSTER) + (bit))
+
+/*
+ * Reset registers in each PRCC - the reset lines are active low
+ * so what you need to do is write a bit for the peripheral you
+ * want to put into reset into the CLEAR register, this will assert
+ * the reset by pulling the line low. SET take the device out of
+ * reset. The status reflects the actual state of the line.
+ */
+#define PRCC_K_SOFTRST_SET             0x018
+#define PRCC_K_SOFTRST_CLEAR           0x01c
+#define PRCC_K_RST_STATUS              0x020
+
+static int prcc_num_to_index(unsigned int num)
+{
+       switch (num) {
+       case 1:
+               return CLKRST1_INDEX;
+       case 2:
+               return CLKRST2_INDEX;
+       case 3:
+               return CLKRST3_INDEX;
+       case 5:
+               return CLKRST5_INDEX;
+       case 6:
+               return CLKRST6_INDEX;
+       }
+       return -EINVAL;
+}
+
+static void __iomem *u8500_prcc_reset_base(struct u8500_prcc_reset *ur,
+                                          unsigned long id)
+{
+       unsigned int prcc_num, index;
+
+       prcc_num = id / PRCC_PERIPHS_PER_CLUSTER;
+       index = prcc_num_to_index(prcc_num);
+
+       if (index > ARRAY_SIZE(ur->base))
+               return NULL;
+
+       return ur->base[index];
+}
+
+static int u8500_prcc_reset(struct reset_controller_dev *rcdev,
+                           unsigned long id)
+{
+       struct u8500_prcc_reset *ur = to_u8500_prcc_reset(rcdev);
+       void __iomem *base = u8500_prcc_reset_base(ur, id);
+       unsigned int bit = id % PRCC_PERIPHS_PER_CLUSTER;
+
+       pr_debug("PRCC cycle reset id %lu, bit %u\n", id, bit);
+
+       /*
+        * Assert reset and then release it. The one microsecond
+        * delay is found in the vendor reference code.
+        */
+       writel(BIT(bit), base + PRCC_K_SOFTRST_CLEAR);
+       udelay(1);
+       writel(BIT(bit), base + PRCC_K_SOFTRST_SET);
+       udelay(1);
+
+       return 0;
+}
+
+static int u8500_prcc_reset_assert(struct reset_controller_dev *rcdev,
+                                  unsigned long id)
+{
+       struct u8500_prcc_reset *ur = to_u8500_prcc_reset(rcdev);
+       void __iomem *base = u8500_prcc_reset_base(ur, id);
+       unsigned int bit = id % PRCC_PERIPHS_PER_CLUSTER;
+
+       pr_debug("PRCC assert reset id %lu, bit %u\n", id, bit);
+       writel(BIT(bit), base + PRCC_K_SOFTRST_CLEAR);
+
+       return 0;
+}
+
+static int u8500_prcc_reset_deassert(struct reset_controller_dev *rcdev,
+                                    unsigned long id)
+{
+       struct u8500_prcc_reset *ur = to_u8500_prcc_reset(rcdev);
+       void __iomem *base = u8500_prcc_reset_base(ur, id);
+       unsigned int bit = id % PRCC_PERIPHS_PER_CLUSTER;
+
+       pr_debug("PRCC deassert reset id %lu, bit %u\n", id, bit);
+       writel(BIT(bit), base + PRCC_K_SOFTRST_SET);
+
+       return 0;
+}
+
+static int u8500_prcc_reset_status(struct reset_controller_dev *rcdev,
+                                  unsigned long id)
+{
+       struct u8500_prcc_reset *ur = to_u8500_prcc_reset(rcdev);
+       void __iomem *base = u8500_prcc_reset_base(ur, id);
+       unsigned int bit = id % PRCC_PERIPHS_PER_CLUSTER;
+       u32 val;
+
+       pr_debug("PRCC check status on reset line id %lu, bit %u\n", id, bit);
+       val = readl(base + PRCC_K_RST_STATUS);
+
+       /* Active low so return the inverse value of the bit */
+       return !(val & BIT(bit));
+}
+
+static const struct reset_control_ops u8500_prcc_reset_ops = {
+       .reset = u8500_prcc_reset,
+       .assert = u8500_prcc_reset_assert,
+       .deassert = u8500_prcc_reset_deassert,
+       .status = u8500_prcc_reset_status,
+};
+
+static int u8500_prcc_reset_xlate(struct reset_controller_dev *rcdev,
+                                 const struct of_phandle_args *reset_spec)
+{
+       unsigned int prcc_num, bit;
+
+       if (reset_spec->args_count != 2)
+               return -EINVAL;
+
+       prcc_num = reset_spec->args[0];
+       bit = reset_spec->args[1];
+
+       if (prcc_num != 1 && prcc_num != 2 && prcc_num != 3 &&
+           prcc_num != 5 && prcc_num != 6) {
+               pr_err("%s: invalid PRCC %d\n", __func__, prcc_num);
+               return -EINVAL;
+       }
+
+       pr_debug("located reset line %d at PRCC %d bit %d\n",
+                PRCC_RESET_LINE(prcc_num, bit), prcc_num, bit);
+
+       return PRCC_RESET_LINE(prcc_num, bit);
+}
+
+void u8500_prcc_reset_init(struct device_node *np, struct u8500_prcc_reset *ur)
+{
+       struct reset_controller_dev *rcdev = &ur->rcdev;
+       int ret;
+       int i;
+
+       for (i = 0; i < CLKRST_MAX; i++) {
+               ur->base[i] = ioremap(ur->phy_base[i], SZ_4K);
+               if (!ur->base[i])
+                       pr_err("PRCC failed to remap for reset base %d (%08x)\n",
+                              i, ur->phy_base[i]);
+       }
+
+       rcdev->owner = THIS_MODULE;
+       rcdev->ops = &u8500_prcc_reset_ops;
+       rcdev->of_node = np;
+       rcdev->of_reset_n_cells = 2;
+       rcdev->of_xlate = u8500_prcc_reset_xlate;
+
+       ret = reset_controller_register(rcdev);
+       if (ret)
+               pr_err("PRCC failed to register reset controller\n");
+}
diff --git a/drivers/clk/ux500/reset-prcc.h b/drivers/clk/ux500/reset-prcc.h
new file mode 100644 (file)
index 0000000..353c971
--- /dev/null
@@ -0,0 +1,23 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef __RESET_PRCC_H
+#define __RESET_PRCC_H
+
+#include <linux/reset-controller.h>
+#include <linux/io.h>
+
+/**
+ * struct u8500_prcc_reset - U8500 PRCC reset controller state
+ * @rcdev: reset controller device
+ * @phy_base: the physical base address for each PRCC block
+ * @base: the remapped PRCC bases
+ */
+struct u8500_prcc_reset {
+       struct reset_controller_dev rcdev;
+       u32 phy_base[CLKRST_MAX];
+       void __iomem *base[CLKRST_MAX];
+};
+
+void u8500_prcc_reset_init(struct device_node *np, struct u8500_prcc_reset *ur);
+
+#endif
index 528c5bb..e86ed2e 100644 (file)
 #include <linux/of_address.h>
 #include <linux/clk-provider.h>
 #include <linux/mfd/dbx500-prcmu.h>
-#include "clk.h"
 
-#define PRCC_NUM_PERIPH_CLUSTERS 6
-#define PRCC_PERIPHS_PER_CLUSTER 32
+#include "clk.h"
+#include "prcc.h"
+#include "reset-prcc.h"
 
 static struct clk *prcmu_clk[PRCMU_NUM_CLKS];
 static struct clk *prcc_pclk[(PRCC_NUM_PERIPH_CLUSTERS + 1) * PRCC_PERIPHS_PER_CLUSTER];
@@ -46,16 +46,6 @@ static struct clk *ux500_twocell_get(struct of_phandle_args *clkspec,
        return PRCC_SHOW(clk_data, base, bit);
 }
 
-/* CLKRST4 is missing making it hard to index things */
-enum clkrst_index {
-       CLKRST1_INDEX = 0,
-       CLKRST2_INDEX,
-       CLKRST3_INDEX,
-       CLKRST5_INDEX,
-       CLKRST6_INDEX,
-       CLKRST_MAX,
-};
-
 static void u8500_clk_init(struct device_node *np)
 {
        struct prcmu_fw_version *fw_version;
@@ -63,8 +53,18 @@ static void u8500_clk_init(struct device_node *np)
        const char *sgaclk_parent = NULL;
        struct clk *clk, *rtc_clk, *twd_clk;
        u32 bases[CLKRST_MAX];
+       struct u8500_prcc_reset *rstc;
        int i;
 
+       /*
+        * We allocate the reset controller here so that we can fill in the
+        * base addresses properly and pass to the reset controller init
+        * function later on.
+        */
+       rstc = kzalloc(sizeof(*rstc), GFP_KERNEL);
+       if (!rstc)
+               return;
+
        for (i = 0; i < ARRAY_SIZE(bases); i++) {
                struct resource r;
 
@@ -73,6 +73,7 @@ static void u8500_clk_init(struct device_node *np)
                        pr_err("failed to get CLKRST %d base address\n",
                               i + 1);
                bases[i] = r.start;
+               rstc->phy_base[i] = r.start;
        }
 
        /* Clock sources */
@@ -563,6 +564,9 @@ static void u8500_clk_init(struct device_node *np)
 
                if (of_node_name_eq(child, "smp-twd-clock"))
                        of_clk_add_provider(child, of_clk_src_simple_get, twd_clk);
+
+               if (of_node_name_eq(child, "prcc-reset-controller"))
+                       u8500_prcc_reset_init(child, rstc);
        }
 }
 CLK_OF_DECLARE(u8500_clks, "stericsson,u8500-clks", u8500_clk_init);
index 481de56..403f164 100644 (file)
@@ -2,8 +2,9 @@
 
 menu "Clock driver for ARM Reference designs"
        depends on HAS_IOMEM
+       depends on ARM || ARM64 || COMPILE_TEST
 
-config ICST
+config CLK_ICST
        bool "Clock driver for ARM Reference designs ICST"
        select REGMAP_MMIO
        help
index 4ff563e..e7d0530 100644 (file)
@@ -1,6 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0-only
 # Makefile for Versatile-specific clocks
-obj-$(CONFIG_ICST)             += icst.o clk-icst.o clk-versatile.o
+obj-$(CONFIG_CLK_ICST)         += icst.o clk-icst.o clk-versatile.o
 obj-$(CONFIG_INTEGRATOR_IMPD1) += clk-impd1.o
 obj-$(CONFIG_CLK_SP810)                += clk-sp810.o
 obj-$(CONFIG_CLK_VEXPRESS_OSC) += clk-vexpress-osc.o
index fdd6aa3..77fd0ec 100644 (file)
@@ -501,7 +501,8 @@ static void __init of_syscon_icst_setup(struct device_node *np)
                return;
        }
 
-       if (of_property_read_u32(np, "vco-offset", &icst_desc.vco_offset)) {
+       if (of_property_read_u32(np, "reg", &icst_desc.vco_offset) &&
+           of_property_read_u32(np, "vco-offset", &icst_desc.vco_offset)) {
                pr_err("no VCO register offset for ICST clock\n");
                return;
        }
diff --git a/include/dt-bindings/clock/exynos850.h b/include/dt-bindings/clock/exynos850.h
new file mode 100644 (file)
index 0000000..8999184
--- /dev/null
@@ -0,0 +1,141 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (C) 2021 Linaro Ltd.
+ * Author: Sam Protsenko <semen.protsenko@linaro.org>
+ *
+ * Device Tree binding constants for Exynos850 clock controller.
+ */
+
+#ifndef _DT_BINDINGS_CLOCK_EXYNOS_850_H
+#define _DT_BINDINGS_CLOCK_EXYNOS_850_H
+
+/* CMU_TOP */
+#define CLK_FOUT_SHARED0_PLL           1
+#define CLK_FOUT_SHARED1_PLL           2
+#define CLK_FOUT_MMC_PLL               3
+#define CLK_MOUT_SHARED0_PLL           4
+#define CLK_MOUT_SHARED1_PLL           5
+#define CLK_MOUT_MMC_PLL               6
+#define CLK_MOUT_CORE_BUS              7
+#define CLK_MOUT_CORE_CCI              8
+#define CLK_MOUT_CORE_MMC_EMBD         9
+#define CLK_MOUT_CORE_SSS              10
+#define CLK_MOUT_DPU                   11
+#define CLK_MOUT_HSI_BUS               12
+#define CLK_MOUT_HSI_MMC_CARD          13
+#define CLK_MOUT_HSI_USB20DRD          14
+#define CLK_MOUT_PERI_BUS              15
+#define CLK_MOUT_PERI_UART             16
+#define CLK_MOUT_PERI_IP               17
+#define CLK_DOUT_SHARED0_DIV3          18
+#define CLK_DOUT_SHARED0_DIV2          19
+#define CLK_DOUT_SHARED1_DIV3          20
+#define CLK_DOUT_SHARED1_DIV2          21
+#define CLK_DOUT_SHARED0_DIV4          22
+#define CLK_DOUT_SHARED1_DIV4          23
+#define CLK_DOUT_CORE_BUS              24
+#define CLK_DOUT_CORE_CCI              25
+#define CLK_DOUT_CORE_MMC_EMBD         26
+#define CLK_DOUT_CORE_SSS              27
+#define CLK_DOUT_DPU                   28
+#define CLK_DOUT_HSI_BUS               29
+#define CLK_DOUT_HSI_MMC_CARD          30
+#define CLK_DOUT_HSI_USB20DRD          31
+#define CLK_DOUT_PERI_BUS              32
+#define CLK_DOUT_PERI_UART             33
+#define CLK_DOUT_PERI_IP               34
+#define CLK_GOUT_CORE_BUS              35
+#define CLK_GOUT_CORE_CCI              36
+#define CLK_GOUT_CORE_MMC_EMBD         37
+#define CLK_GOUT_CORE_SSS              38
+#define CLK_GOUT_DPU                   39
+#define CLK_GOUT_HSI_BUS               40
+#define CLK_GOUT_HSI_MMC_CARD          41
+#define CLK_GOUT_HSI_USB20DRD          42
+#define CLK_GOUT_PERI_BUS              43
+#define CLK_GOUT_PERI_UART             44
+#define CLK_GOUT_PERI_IP               45
+#define TOP_NR_CLK                     46
+
+/* CMU_HSI */
+#define CLK_MOUT_HSI_BUS_USER          1
+#define CLK_MOUT_HSI_MMC_CARD_USER     2
+#define CLK_MOUT_HSI_USB20DRD_USER     3
+#define CLK_MOUT_HSI_RTC               4
+#define CLK_GOUT_USB_RTC_CLK           5
+#define CLK_GOUT_USB_REF_CLK           6
+#define CLK_GOUT_USB_PHY_REF_CLK       7
+#define CLK_GOUT_USB_PHY_ACLK          8
+#define CLK_GOUT_USB_BUS_EARLY_CLK     9
+#define CLK_GOUT_GPIO_HSI_PCLK         10
+#define CLK_GOUT_MMC_CARD_ACLK         11
+#define CLK_GOUT_MMC_CARD_SDCLKIN      12
+#define CLK_GOUT_SYSREG_HSI_PCLK       13
+#define HSI_NR_CLK                     14
+
+/* CMU_PERI */
+#define CLK_MOUT_PERI_BUS_USER         1
+#define CLK_MOUT_PERI_UART_USER                2
+#define CLK_MOUT_PERI_HSI2C_USER       3
+#define CLK_MOUT_PERI_SPI_USER         4
+#define CLK_DOUT_PERI_HSI2C0           5
+#define CLK_DOUT_PERI_HSI2C1           6
+#define CLK_DOUT_PERI_HSI2C2           7
+#define CLK_DOUT_PERI_SPI0             8
+#define CLK_GOUT_PERI_HSI2C0           9
+#define CLK_GOUT_PERI_HSI2C1           10
+#define CLK_GOUT_PERI_HSI2C2           11
+#define CLK_GOUT_GPIO_PERI_PCLK                12
+#define CLK_GOUT_HSI2C0_IPCLK          13
+#define CLK_GOUT_HSI2C0_PCLK           14
+#define CLK_GOUT_HSI2C1_IPCLK          15
+#define CLK_GOUT_HSI2C1_PCLK           16
+#define CLK_GOUT_HSI2C2_IPCLK          17
+#define CLK_GOUT_HSI2C2_PCLK           18
+#define CLK_GOUT_I2C0_PCLK             19
+#define CLK_GOUT_I2C1_PCLK             20
+#define CLK_GOUT_I2C2_PCLK             21
+#define CLK_GOUT_I2C3_PCLK             22
+#define CLK_GOUT_I2C4_PCLK             23
+#define CLK_GOUT_I2C5_PCLK             24
+#define CLK_GOUT_I2C6_PCLK             25
+#define CLK_GOUT_MCT_PCLK              26
+#define CLK_GOUT_PWM_MOTOR_PCLK                27
+#define CLK_GOUT_SPI0_IPCLK            28
+#define CLK_GOUT_SPI0_PCLK             29
+#define CLK_GOUT_SYSREG_PERI_PCLK      30
+#define CLK_GOUT_UART_IPCLK            31
+#define CLK_GOUT_UART_PCLK             32
+#define CLK_GOUT_WDT0_PCLK             33
+#define CLK_GOUT_WDT1_PCLK             34
+#define PERI_NR_CLK                    35
+
+/* CMU_CORE */
+#define CLK_MOUT_CORE_BUS_USER         1
+#define CLK_MOUT_CORE_CCI_USER         2
+#define CLK_MOUT_CORE_MMC_EMBD_USER    3
+#define CLK_MOUT_CORE_SSS_USER         4
+#define CLK_MOUT_CORE_GIC              5
+#define CLK_DOUT_CORE_BUSP             6
+#define CLK_GOUT_CCI_ACLK              7
+#define CLK_GOUT_GIC_CLK               8
+#define CLK_GOUT_MMC_EMBD_ACLK         9
+#define CLK_GOUT_MMC_EMBD_SDCLKIN      10
+#define CLK_GOUT_SSS_ACLK              11
+#define CLK_GOUT_SSS_PCLK              12
+#define CORE_NR_CLK                    13
+
+/* CMU_DPU */
+#define CLK_MOUT_DPU_USER              1
+#define CLK_DOUT_DPU_BUSP              2
+#define CLK_GOUT_DPU_CMU_DPU_PCLK      3
+#define CLK_GOUT_DPU_DECON0_ACLK       4
+#define CLK_GOUT_DPU_DMA_ACLK          5
+#define CLK_GOUT_DPU_DPP_ACLK          6
+#define CLK_GOUT_DPU_PPMU_ACLK         7
+#define CLK_GOUT_DPU_PPMU_PCLK         8
+#define CLK_GOUT_DPU_SMMU_CLK          9
+#define CLK_GOUT_DPU_SYSREG_PCLK       10
+#define DPU_NR_CLK                     11
+
+#endif /* _DT_BINDINGS_CLOCK_EXYNOS_850_H */
diff --git a/include/dt-bindings/clock/imx8ulp-clock.h b/include/dt-bindings/clock/imx8ulp-clock.h
new file mode 100644 (file)
index 0000000..953ecfe
--- /dev/null
@@ -0,0 +1,258 @@
+/* SPDX-License-Identifier: GPL-2.0+ OR MIT */
+/*
+ * Copyright 2021 NXP
+ */
+
+#ifndef __DT_BINDINGS_CLOCK_IMX8ULP_H
+#define __DT_BINDINGS_CLOCK_IMX8ULP_H
+
+#define IMX8ULP_CLK_DUMMY                      0
+
+/* CGC1 */
+#define IMX8ULP_CLK_SPLL2                      5
+#define IMX8ULP_CLK_SPLL3                      6
+#define IMX8ULP_CLK_A35_SEL                    7
+#define IMX8ULP_CLK_A35_DIV                    8
+#define IMX8ULP_CLK_SPLL2_PRE_SEL              9
+#define IMX8ULP_CLK_SPLL3_PRE_SEL              10
+#define IMX8ULP_CLK_SPLL3_PFD0                 11
+#define IMX8ULP_CLK_SPLL3_PFD1                 12
+#define IMX8ULP_CLK_SPLL3_PFD2                 13
+#define IMX8ULP_CLK_SPLL3_PFD3                 14
+#define IMX8ULP_CLK_SPLL3_PFD0_DIV1            15
+#define IMX8ULP_CLK_SPLL3_PFD0_DIV2            16
+#define IMX8ULP_CLK_SPLL3_PFD1_DIV1            17
+#define IMX8ULP_CLK_SPLL3_PFD1_DIV2            18
+#define IMX8ULP_CLK_SPLL3_PFD2_DIV1            19
+#define IMX8ULP_CLK_SPLL3_PFD2_DIV2            20
+#define IMX8ULP_CLK_SPLL3_PFD3_DIV1            21
+#define IMX8ULP_CLK_SPLL3_PFD3_DIV2            22
+#define IMX8ULP_CLK_NIC_SEL                    23
+#define IMX8ULP_CLK_NIC_AD_DIVPLAT             24
+#define IMX8ULP_CLK_NIC_PER_DIVPLAT            25
+#define IMX8ULP_CLK_XBAR_SEL                   26
+#define IMX8ULP_CLK_XBAR_AD_DIVPLAT            27
+#define IMX8ULP_CLK_XBAR_DIVBUS                        28
+#define IMX8ULP_CLK_XBAR_AD_SLOW               29
+#define IMX8ULP_CLK_SOSC_DIV1                  30
+#define IMX8ULP_CLK_SOSC_DIV2                  31
+#define IMX8ULP_CLK_SOSC_DIV3                  32
+#define IMX8ULP_CLK_FROSC_DIV1                 33
+#define IMX8ULP_CLK_FROSC_DIV2                 34
+#define IMX8ULP_CLK_FROSC_DIV3                 35
+#define IMX8ULP_CLK_SPLL3_VCODIV               36
+#define IMX8ULP_CLK_SPLL3_PFD0_DIV1_GATE       37
+#define IMX8ULP_CLK_SPLL3_PFD0_DIV2_GATE       38
+#define IMX8ULP_CLK_SPLL3_PFD1_DIV1_GATE       39
+#define IMX8ULP_CLK_SPLL3_PFD1_DIV2_GATE       40
+#define IMX8ULP_CLK_SPLL3_PFD2_DIV1_GATE       41
+#define IMX8ULP_CLK_SPLL3_PFD2_DIV2_GATE       42
+#define IMX8ULP_CLK_SPLL3_PFD3_DIV1_GATE       43
+#define IMX8ULP_CLK_SPLL3_PFD3_DIV2_GATE       44
+#define IMX8ULP_CLK_SOSC_DIV1_GATE             45
+#define IMX8ULP_CLK_SOSC_DIV2_GATE             46
+#define IMX8ULP_CLK_SOSC_DIV3_GATE             47
+#define IMX8ULP_CLK_FROSC_DIV1_GATE            48
+#define IMX8ULP_CLK_FROSC_DIV2_GATE            49
+#define IMX8ULP_CLK_FROSC_DIV3_GATE            50
+#define IMX8ULP_CLK_SAI4_SEL                   51
+#define IMX8ULP_CLK_SAI5_SEL                   52
+#define IMX8ULP_CLK_AUD_CLK1                   53
+#define IMX8ULP_CLK_ARM                                54
+#define IMX8ULP_CLK_ENET_TS_SEL                        55
+
+#define IMX8ULP_CLK_CGC1_END                   56
+
+/* CGC2 */
+#define IMX8ULP_CLK_PLL4_PRE_SEL       0
+#define IMX8ULP_CLK_PLL4               1
+#define IMX8ULP_CLK_PLL4_VCODIV                2
+#define IMX8ULP_CLK_DDR_SEL            3
+#define IMX8ULP_CLK_DDR_DIV            4
+#define IMX8ULP_CLK_LPAV_AXI_SEL       5
+#define IMX8ULP_CLK_LPAV_AXI_DIV       6
+#define IMX8ULP_CLK_LPAV_AHB_DIV       7
+#define IMX8ULP_CLK_LPAV_BUS_DIV       8
+#define IMX8ULP_CLK_PLL4_PFD0          9
+#define IMX8ULP_CLK_PLL4_PFD1          10
+#define IMX8ULP_CLK_PLL4_PFD2          11
+#define IMX8ULP_CLK_PLL4_PFD3          12
+#define IMX8ULP_CLK_PLL4_PFD0_DIV1_GATE        13
+#define IMX8ULP_CLK_PLL4_PFD0_DIV2_GATE        14
+#define IMX8ULP_CLK_PLL4_PFD1_DIV1_GATE        15
+#define IMX8ULP_CLK_PLL4_PFD1_DIV2_GATE        16
+#define IMX8ULP_CLK_PLL4_PFD2_DIV1_GATE        17
+#define IMX8ULP_CLK_PLL4_PFD2_DIV2_GATE        18
+#define IMX8ULP_CLK_PLL4_PFD3_DIV1_GATE        19
+#define IMX8ULP_CLK_PLL4_PFD3_DIV2_GATE        20
+#define IMX8ULP_CLK_PLL4_PFD0_DIV1     21
+#define IMX8ULP_CLK_PLL4_PFD0_DIV2     22
+#define IMX8ULP_CLK_PLL4_PFD1_DIV1     23
+#define IMX8ULP_CLK_PLL4_PFD1_DIV2     24
+#define IMX8ULP_CLK_PLL4_PFD2_DIV1     25
+#define IMX8ULP_CLK_PLL4_PFD2_DIV2     26
+#define IMX8ULP_CLK_PLL4_PFD3_DIV1     27
+#define IMX8ULP_CLK_PLL4_PFD3_DIV2     28
+#define IMX8ULP_CLK_CGC2_SOSC_DIV1_GATE        29
+#define IMX8ULP_CLK_CGC2_SOSC_DIV2_GATE        30
+#define IMX8ULP_CLK_CGC2_SOSC_DIV3_GATE        31
+#define IMX8ULP_CLK_CGC2_SOSC_DIV1     32
+#define IMX8ULP_CLK_CGC2_SOSC_DIV2     33
+#define IMX8ULP_CLK_CGC2_SOSC_DIV3     34
+#define IMX8ULP_CLK_CGC2_FROSC_DIV1_GATE       35
+#define IMX8ULP_CLK_CGC2_FROSC_DIV2_GATE       36
+#define IMX8ULP_CLK_CGC2_FROSC_DIV3_GATE       37
+#define IMX8ULP_CLK_CGC2_FROSC_DIV1    38
+#define IMX8ULP_CLK_CGC2_FROSC_DIV2    39
+#define IMX8ULP_CLK_CGC2_FROSC_DIV3    40
+#define IMX8ULP_CLK_AUD_CLK2           41
+#define IMX8ULP_CLK_SAI6_SEL           42
+#define IMX8ULP_CLK_SAI7_SEL           43
+#define IMX8ULP_CLK_SPDIF_SEL          44
+#define IMX8ULP_CLK_HIFI_SEL           45
+#define IMX8ULP_CLK_HIFI_DIVCORE       46
+#define IMX8ULP_CLK_HIFI_DIVPLAT       47
+#define IMX8ULP_CLK_DSI_PHY_REF                48
+
+#define IMX8ULP_CLK_CGC2_END           49
+
+/* PCC3 */
+#define IMX8ULP_CLK_WDOG3              0
+#define IMX8ULP_CLK_WDOG4              1
+#define IMX8ULP_CLK_LPIT1              2
+#define IMX8ULP_CLK_TPM4               3
+#define IMX8ULP_CLK_TPM5               4
+#define IMX8ULP_CLK_FLEXIO1            5
+#define IMX8ULP_CLK_I3C2               6
+#define IMX8ULP_CLK_LPI2C4             7
+#define IMX8ULP_CLK_LPI2C5             8
+#define IMX8ULP_CLK_LPUART4            9
+#define IMX8ULP_CLK_LPUART5            10
+#define IMX8ULP_CLK_LPSPI4             11
+#define IMX8ULP_CLK_LPSPI5             12
+#define IMX8ULP_CLK_DMA1_MP            13
+#define IMX8ULP_CLK_DMA1_CH0           14
+#define IMX8ULP_CLK_DMA1_CH1           15
+#define IMX8ULP_CLK_DMA1_CH2           16
+#define IMX8ULP_CLK_DMA1_CH3           17
+#define IMX8ULP_CLK_DMA1_CH4           18
+#define IMX8ULP_CLK_DMA1_CH5           19
+#define IMX8ULP_CLK_DMA1_CH6           20
+#define IMX8ULP_CLK_DMA1_CH7           21
+#define IMX8ULP_CLK_DMA1_CH8           22
+#define IMX8ULP_CLK_DMA1_CH9           23
+#define IMX8ULP_CLK_DMA1_CH10          24
+#define IMX8ULP_CLK_DMA1_CH11          25
+#define IMX8ULP_CLK_DMA1_CH12          26
+#define IMX8ULP_CLK_DMA1_CH13          27
+#define IMX8ULP_CLK_DMA1_CH14          28
+#define IMX8ULP_CLK_DMA1_CH15          29
+#define IMX8ULP_CLK_DMA1_CH16          30
+#define IMX8ULP_CLK_DMA1_CH17          31
+#define IMX8ULP_CLK_DMA1_CH18          32
+#define IMX8ULP_CLK_DMA1_CH19          33
+#define IMX8ULP_CLK_DMA1_CH20          34
+#define IMX8ULP_CLK_DMA1_CH21          35
+#define IMX8ULP_CLK_DMA1_CH22          36
+#define IMX8ULP_CLK_DMA1_CH23          37
+#define IMX8ULP_CLK_DMA1_CH24          38
+#define IMX8ULP_CLK_DMA1_CH25          39
+#define IMX8ULP_CLK_DMA1_CH26          40
+#define IMX8ULP_CLK_DMA1_CH27          41
+#define IMX8ULP_CLK_DMA1_CH28          42
+#define IMX8ULP_CLK_DMA1_CH29          43
+#define IMX8ULP_CLK_DMA1_CH30          44
+#define IMX8ULP_CLK_DMA1_CH31          45
+#define IMX8ULP_CLK_MU3_A              46
+#define IMX8ULP_CLK_MU0_B              47
+
+#define IMX8ULP_CLK_PCC3_END           48
+
+/* PCC4 */
+#define IMX8ULP_CLK_FLEXSPI2           0
+#define IMX8ULP_CLK_TPM6               1
+#define IMX8ULP_CLK_TPM7               2
+#define IMX8ULP_CLK_LPI2C6             3
+#define IMX8ULP_CLK_LPI2C7             4
+#define IMX8ULP_CLK_LPUART6            5
+#define IMX8ULP_CLK_LPUART7            6
+#define IMX8ULP_CLK_SAI4               7
+#define IMX8ULP_CLK_SAI5               8
+#define IMX8ULP_CLK_PCTLE              9
+#define IMX8ULP_CLK_PCTLF              10
+#define IMX8ULP_CLK_USDHC0             11
+#define IMX8ULP_CLK_USDHC1             12
+#define IMX8ULP_CLK_USDHC2             13
+#define IMX8ULP_CLK_USB0               14
+#define IMX8ULP_CLK_USB0_PHY           15
+#define IMX8ULP_CLK_USB1               16
+#define IMX8ULP_CLK_USB1_PHY           17
+#define IMX8ULP_CLK_USB_XBAR           18
+#define IMX8ULP_CLK_ENET               19
+#define IMX8ULP_CLK_SFA1               20
+#define IMX8ULP_CLK_RGPIOE             21
+#define IMX8ULP_CLK_RGPIOF             22
+
+#define IMX8ULP_CLK_PCC4_END           23
+
+/* PCC5 */
+#define IMX8ULP_CLK_TPM8               0
+#define IMX8ULP_CLK_SAI6               1
+#define IMX8ULP_CLK_SAI7               2
+#define IMX8ULP_CLK_SPDIF              3
+#define IMX8ULP_CLK_ISI                        4
+#define IMX8ULP_CLK_CSI_REGS           5
+#define IMX8ULP_CLK_PCTLD              6
+#define IMX8ULP_CLK_CSI                        7
+#define IMX8ULP_CLK_DSI                        8
+#define IMX8ULP_CLK_WDOG5              9
+#define IMX8ULP_CLK_EPDC               10
+#define IMX8ULP_CLK_PXP                        11
+#define IMX8ULP_CLK_SFA2               12
+#define IMX8ULP_CLK_GPU2D              13
+#define IMX8ULP_CLK_GPU3D              14
+#define IMX8ULP_CLK_DC_NANO            15
+#define IMX8ULP_CLK_CSI_CLK_UI                 16
+#define IMX8ULP_CLK_CSI_CLK_ESC                17
+#define IMX8ULP_CLK_RGPIOD             18
+#define IMX8ULP_CLK_DMA2_MP            19
+#define IMX8ULP_CLK_DMA2_CH0           20
+#define IMX8ULP_CLK_DMA2_CH1           21
+#define IMX8ULP_CLK_DMA2_CH2           22
+#define IMX8ULP_CLK_DMA2_CH3           23
+#define IMX8ULP_CLK_DMA2_CH4           24
+#define IMX8ULP_CLK_DMA2_CH5           25
+#define IMX8ULP_CLK_DMA2_CH6           26
+#define IMX8ULP_CLK_DMA2_CH7           27
+#define IMX8ULP_CLK_DMA2_CH8           28
+#define IMX8ULP_CLK_DMA2_CH9           29
+#define IMX8ULP_CLK_DMA2_CH10          30
+#define IMX8ULP_CLK_DMA2_CH11          31
+#define IMX8ULP_CLK_DMA2_CH12          32
+#define IMX8ULP_CLK_DMA2_CH13          33
+#define IMX8ULP_CLK_DMA2_CH14          34
+#define IMX8ULP_CLK_DMA2_CH15          35
+#define IMX8ULP_CLK_DMA2_CH16          36
+#define IMX8ULP_CLK_DMA2_CH17          37
+#define IMX8ULP_CLK_DMA2_CH18          38
+#define IMX8ULP_CLK_DMA2_CH19          39
+#define IMX8ULP_CLK_DMA2_CH20          40
+#define IMX8ULP_CLK_DMA2_CH21          41
+#define IMX8ULP_CLK_DMA2_CH22          42
+#define IMX8ULP_CLK_DMA2_CH23          43
+#define IMX8ULP_CLK_DMA2_CH24          44
+#define IMX8ULP_CLK_DMA2_CH25          45
+#define IMX8ULP_CLK_DMA2_CH26          46
+#define IMX8ULP_CLK_DMA2_CH27          47
+#define IMX8ULP_CLK_DMA2_CH28          48
+#define IMX8ULP_CLK_DMA2_CH29          49
+#define IMX8ULP_CLK_DMA2_CH30          50
+#define IMX8ULP_CLK_DMA2_CH31          51
+#define IMX8ULP_CLK_MU2_B              52
+#define IMX8ULP_CLK_MU3_B              53
+#define IMX8ULP_CLK_AVD_SIM            54
+#define IMX8ULP_CLK_DSI_TX_ESC         55
+
+#define IMX8ULP_CLK_PCC5_END           56
+
+#endif
index f337813..78aa07f 100644 (file)
 #define CLKID_PERIPH           126
 #define CLKID_AXI              128
 #define CLKID_L2_DRAM          130
+#define CLKID_HDMI_PLL_HDMI_OUT        132
+#define CLKID_VID_PLL_FINAL_DIV        137
+#define CLKID_VCLK_IN_SEL      138
+#define CLKID_VCLK2_IN_SEL     149
+#define CLKID_CTS_ENCT         161
+#define CLKID_CTS_ENCP         163
+#define CLKID_CTS_ENCI         165
+#define CLKID_HDMI_TX_PIXEL    167
+#define CLKID_CTS_ENCL         169
+#define CLKID_CTS_VDAC0                171
 #define CLKID_HDMI_SYS         174
 #define CLKID_VPU              190
 #define CLKID_VDEC_1           196
diff --git a/include/dt-bindings/clock/mt8195-clk.h b/include/dt-bindings/clock/mt8195-clk.h
new file mode 100644 (file)
index 0000000..95cf812
--- /dev/null
@@ -0,0 +1,864 @@
+/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
+/*
+ * Copyright (c) 2021 MediaTek Inc.
+ * Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+ */
+
+#ifndef _DT_BINDINGS_CLK_MT8195_H
+#define _DT_BINDINGS_CLK_MT8195_H
+
+/* TOPCKGEN */
+
+#define CLK_TOP_AXI                    0
+#define CLK_TOP_SPM                    1
+#define CLK_TOP_SCP                    2
+#define CLK_TOP_BUS_AXIMEM             3
+#define CLK_TOP_VPP                    4
+#define CLK_TOP_ETHDR                  5
+#define CLK_TOP_IPE                    6
+#define CLK_TOP_CAM                    7
+#define CLK_TOP_CCU                    8
+#define CLK_TOP_IMG                    9
+#define CLK_TOP_CAMTM                  10
+#define CLK_TOP_DSP                    11
+#define CLK_TOP_DSP1                   12
+#define CLK_TOP_DSP2                   13
+#define CLK_TOP_DSP3                   14
+#define CLK_TOP_DSP4                   15
+#define CLK_TOP_DSP5                   16
+#define CLK_TOP_DSP6                   17
+#define CLK_TOP_DSP7                   18
+#define CLK_TOP_IPU_IF                 19
+#define CLK_TOP_MFG_CORE_TMP           20
+#define CLK_TOP_CAMTG                  21
+#define CLK_TOP_CAMTG2                 22
+#define CLK_TOP_CAMTG3                 23
+#define CLK_TOP_CAMTG4                 24
+#define CLK_TOP_CAMTG5                 25
+#define CLK_TOP_UART                   26
+#define CLK_TOP_SPI                    27
+#define CLK_TOP_SPIS                   28
+#define CLK_TOP_MSDC50_0_HCLK          29
+#define CLK_TOP_MSDC50_0               30
+#define CLK_TOP_MSDC30_1               31
+#define CLK_TOP_MSDC30_2               32
+#define CLK_TOP_INTDIR                 33
+#define CLK_TOP_AUD_INTBUS             34
+#define CLK_TOP_AUDIO_H                        35
+#define CLK_TOP_PWRAP_ULPOSC           36
+#define CLK_TOP_ATB                    37
+#define CLK_TOP_PWRMCU                 38
+#define CLK_TOP_DP                     39
+#define CLK_TOP_EDP                    40
+#define CLK_TOP_DPI                    41
+#define CLK_TOP_DISP_PWM0              42
+#define CLK_TOP_DISP_PWM1              43
+#define CLK_TOP_USB_TOP                        44
+#define CLK_TOP_SSUSB_XHCI             45
+#define CLK_TOP_USB_TOP_1P             46
+#define CLK_TOP_SSUSB_XHCI_1P          47
+#define CLK_TOP_USB_TOP_2P             48
+#define CLK_TOP_SSUSB_XHCI_2P          49
+#define CLK_TOP_USB_TOP_3P             50
+#define CLK_TOP_SSUSB_XHCI_3P          51
+#define CLK_TOP_I2C                    52
+#define CLK_TOP_SENINF                 53
+#define CLK_TOP_SENINF1                        54
+#define CLK_TOP_SENINF2                        55
+#define CLK_TOP_SENINF3                        56
+#define CLK_TOP_GCPU                   57
+#define CLK_TOP_DXCC                   58
+#define CLK_TOP_DPMAIF_MAIN            59
+#define CLK_TOP_AES_UFSFDE             60
+#define CLK_TOP_UFS                    61
+#define CLK_TOP_UFS_TICK1US            62
+#define CLK_TOP_UFS_MP_SAP_CFG         63
+#define CLK_TOP_VENC                   64
+#define CLK_TOP_VDEC                   65
+#define CLK_TOP_PWM                    66
+#define CLK_TOP_MCUPM                  67
+#define CLK_TOP_SPMI_P_MST             68
+#define CLK_TOP_SPMI_M_MST             69
+#define CLK_TOP_DVFSRC                 70
+#define CLK_TOP_TL                     71
+#define CLK_TOP_TL_P1                  72
+#define CLK_TOP_AES_MSDCFDE            73
+#define CLK_TOP_DSI_OCC                        74
+#define CLK_TOP_WPE_VPP                        75
+#define CLK_TOP_HDCP                   76
+#define CLK_TOP_HDCP_24M               77
+#define CLK_TOP_HD20_DACR_REF_CLK      78
+#define CLK_TOP_HD20_HDCP_CCLK         79
+#define CLK_TOP_HDMI_XTAL              80
+#define CLK_TOP_HDMI_APB               81
+#define CLK_TOP_SNPS_ETH_250M          82
+#define CLK_TOP_SNPS_ETH_62P4M_PTP     83
+#define CLK_TOP_SNPS_ETH_50M_RMII      84
+#define CLK_TOP_DGI_OUT                        85
+#define CLK_TOP_NNA0                   86
+#define CLK_TOP_NNA1                   87
+#define CLK_TOP_ADSP                   88
+#define CLK_TOP_ASM_H                  89
+#define CLK_TOP_ASM_M                  90
+#define CLK_TOP_ASM_L                  91
+#define CLK_TOP_APLL1                  92
+#define CLK_TOP_APLL2                  93
+#define CLK_TOP_APLL3                  94
+#define CLK_TOP_APLL4                  95
+#define CLK_TOP_APLL5                  96
+#define CLK_TOP_I2SO1_MCK              97
+#define CLK_TOP_I2SO2_MCK              98
+#define CLK_TOP_I2SI1_MCK              99
+#define CLK_TOP_I2SI2_MCK              100
+#define CLK_TOP_DPTX_MCK               101
+#define CLK_TOP_AUD_IEC_CLK            102
+#define CLK_TOP_A1SYS_HP               103
+#define CLK_TOP_A2SYS_HF               104
+#define CLK_TOP_A3SYS_HF               105
+#define CLK_TOP_A4SYS_HF               106
+#define CLK_TOP_SPINFI_BCLK            107
+#define CLK_TOP_NFI1X                  108
+#define CLK_TOP_ECC                    109
+#define CLK_TOP_AUDIO_LOCAL_BUS                110
+#define CLK_TOP_SPINOR                 111
+#define CLK_TOP_DVIO_DGI_REF           112
+#define CLK_TOP_ULPOSC                 113
+#define CLK_TOP_ULPOSC_CORE            114
+#define CLK_TOP_SRCK                   115
+#define CLK_TOP_MFG_CK_FAST_REF                116
+#define CLK_TOP_CLK26M_D2              117
+#define CLK_TOP_CLK26M_D52             118
+#define CLK_TOP_IN_DGI                 119
+#define CLK_TOP_IN_DGI_D2              120
+#define CLK_TOP_IN_DGI_D4              121
+#define CLK_TOP_IN_DGI_D6              122
+#define CLK_TOP_IN_DGI_D8              123
+#define CLK_TOP_MAINPLL_D3             124
+#define CLK_TOP_MAINPLL_D4             125
+#define CLK_TOP_MAINPLL_D4_D2          126
+#define CLK_TOP_MAINPLL_D4_D4          127
+#define CLK_TOP_MAINPLL_D4_D8          128
+#define CLK_TOP_MAINPLL_D5             129
+#define CLK_TOP_MAINPLL_D5_D2          130
+#define CLK_TOP_MAINPLL_D5_D4          131
+#define CLK_TOP_MAINPLL_D5_D8          132
+#define CLK_TOP_MAINPLL_D6             133
+#define CLK_TOP_MAINPLL_D6_D2          134
+#define CLK_TOP_MAINPLL_D6_D4          135
+#define CLK_TOP_MAINPLL_D6_D8          136
+#define CLK_TOP_MAINPLL_D7             137
+#define CLK_TOP_MAINPLL_D7_D2          138
+#define CLK_TOP_MAINPLL_D7_D4          139
+#define CLK_TOP_MAINPLL_D7_D8          140
+#define CLK_TOP_MAINPLL_D9             141
+#define CLK_TOP_UNIVPLL_D2             142
+#define CLK_TOP_UNIVPLL_D3             143
+#define CLK_TOP_UNIVPLL_D4             144
+#define CLK_TOP_UNIVPLL_D4_D2          145
+#define CLK_TOP_UNIVPLL_D4_D4          146
+#define CLK_TOP_UNIVPLL_D4_D8          147
+#define CLK_TOP_UNIVPLL_D5             148
+#define CLK_TOP_UNIVPLL_D5_D2          149
+#define CLK_TOP_UNIVPLL_D5_D4          150
+#define CLK_TOP_UNIVPLL_D5_D8          151
+#define CLK_TOP_UNIVPLL_D6             152
+#define CLK_TOP_UNIVPLL_D6_D2          153
+#define CLK_TOP_UNIVPLL_D6_D4          154
+#define CLK_TOP_UNIVPLL_D6_D8          155
+#define CLK_TOP_UNIVPLL_D6_D16         156
+#define CLK_TOP_UNIVPLL_D7             157
+#define CLK_TOP_UNIVPLL_192M           158
+#define CLK_TOP_UNIVPLL_192M_D4                159
+#define CLK_TOP_UNIVPLL_192M_D8                160
+#define CLK_TOP_UNIVPLL_192M_D16       161
+#define CLK_TOP_UNIVPLL_192M_D32       162
+#define CLK_TOP_APLL1_D3               163
+#define CLK_TOP_APLL1_D4               164
+#define CLK_TOP_APLL2_D3               165
+#define CLK_TOP_APLL2_D4               166
+#define CLK_TOP_APLL3_D4               167
+#define CLK_TOP_APLL4_D4               168
+#define CLK_TOP_APLL5_D4               169
+#define CLK_TOP_HDMIRX_APLL_D3         170
+#define CLK_TOP_HDMIRX_APLL_D4         171
+#define CLK_TOP_HDMIRX_APLL_D6         172
+#define CLK_TOP_MMPLL_D4               173
+#define CLK_TOP_MMPLL_D4_D2            174
+#define CLK_TOP_MMPLL_D4_D4            175
+#define CLK_TOP_MMPLL_D5               176
+#define CLK_TOP_MMPLL_D5_D2            177
+#define CLK_TOP_MMPLL_D5_D4            178
+#define CLK_TOP_MMPLL_D6               179
+#define CLK_TOP_MMPLL_D6_D2            180
+#define CLK_TOP_MMPLL_D7               181
+#define CLK_TOP_MMPLL_D9               182
+#define CLK_TOP_TVDPLL1_D2             183
+#define CLK_TOP_TVDPLL1_D4             184
+#define CLK_TOP_TVDPLL1_D8             185
+#define CLK_TOP_TVDPLL1_D16            186
+#define CLK_TOP_TVDPLL2_D2             187
+#define CLK_TOP_TVDPLL2_D4             188
+#define CLK_TOP_TVDPLL2_D8             189
+#define CLK_TOP_TVDPLL2_D16            190
+#define CLK_TOP_MSDCPLL_D2             191
+#define CLK_TOP_MSDCPLL_D4             192
+#define CLK_TOP_MSDCPLL_D16            193
+#define CLK_TOP_ETHPLL_D2              194
+#define CLK_TOP_ETHPLL_D8              195
+#define CLK_TOP_ETHPLL_D10             196
+#define CLK_TOP_DGIPLL_D2              197
+#define CLK_TOP_ULPOSC1                        198
+#define CLK_TOP_ULPOSC1_D2             199
+#define CLK_TOP_ULPOSC1_D4             200
+#define CLK_TOP_ULPOSC1_D7             201
+#define CLK_TOP_ULPOSC1_D8             202
+#define CLK_TOP_ULPOSC1_D10            203
+#define CLK_TOP_ULPOSC1_D16            204
+#define CLK_TOP_ULPOSC2                        205
+#define CLK_TOP_ADSPPLL_D2             206
+#define CLK_TOP_ADSPPLL_D4             207
+#define CLK_TOP_ADSPPLL_D8             208
+#define CLK_TOP_MEM_466M               209
+#define CLK_TOP_MPHONE_SLAVE_B         210
+#define CLK_TOP_PEXTP_PIPE             211
+#define CLK_TOP_UFS_RX_SYMBOL          212
+#define CLK_TOP_UFS_TX_SYMBOL          213
+#define CLK_TOP_SSUSB_U3PHY_P1_P_P0    214
+#define CLK_TOP_UFS_RX_SYMBOL1         215
+#define CLK_TOP_FPC                    216
+#define CLK_TOP_HDMIRX_P               217
+#define CLK_TOP_APLL12_DIV0            218
+#define CLK_TOP_APLL12_DIV1            219
+#define CLK_TOP_APLL12_DIV2            220
+#define CLK_TOP_APLL12_DIV3            221
+#define CLK_TOP_APLL12_DIV4            222
+#define CLK_TOP_APLL12_DIV9            223
+#define CLK_TOP_CFG_VPP0               224
+#define CLK_TOP_CFG_VPP1               225
+#define CLK_TOP_CFG_VDO0               226
+#define CLK_TOP_CFG_VDO1               227
+#define CLK_TOP_CFG_UNIPLL_SES         228
+#define CLK_TOP_CFG_26M_VPP0           229
+#define CLK_TOP_CFG_26M_VPP1           230
+#define CLK_TOP_CFG_26M_AUD            231
+#define CLK_TOP_CFG_AXI_EAST           232
+#define CLK_TOP_CFG_AXI_EAST_NORTH     233
+#define CLK_TOP_CFG_AXI_NORTH          234
+#define CLK_TOP_CFG_AXI_SOUTH          235
+#define CLK_TOP_CFG_EXT_TEST           236
+#define CLK_TOP_SSUSB_REF              237
+#define CLK_TOP_SSUSB_PHY_REF          238
+#define CLK_TOP_SSUSB_P1_REF           239
+#define CLK_TOP_SSUSB_PHY_P1_REF       240
+#define CLK_TOP_SSUSB_P2_REF           241
+#define CLK_TOP_SSUSB_PHY_P2_REF       242
+#define CLK_TOP_SSUSB_P3_REF           243
+#define CLK_TOP_SSUSB_PHY_P3_REF       244
+#define CLK_TOP_NR_CLK                 245
+
+/* INFRACFG_AO */
+
+#define CLK_INFRA_AO_PMIC_TMR          0
+#define CLK_INFRA_AO_PMIC_AP           1
+#define CLK_INFRA_AO_PMIC_MD           2
+#define CLK_INFRA_AO_PMIC_CONN         3
+#define CLK_INFRA_AO_SEJ               4
+#define CLK_INFRA_AO_APXGPT            5
+#define CLK_INFRA_AO_GCE               6
+#define CLK_INFRA_AO_GCE2              7
+#define CLK_INFRA_AO_THERM             8
+#define CLK_INFRA_AO_PWM_H             9
+#define CLK_INFRA_AO_PWM1              10
+#define CLK_INFRA_AO_PWM2              11
+#define CLK_INFRA_AO_PWM3              12
+#define CLK_INFRA_AO_PWM4              13
+#define CLK_INFRA_AO_PWM               14
+#define CLK_INFRA_AO_UART0             15
+#define CLK_INFRA_AO_UART1             16
+#define CLK_INFRA_AO_UART2             17
+#define CLK_INFRA_AO_UART3             18
+#define CLK_INFRA_AO_UART4             19
+#define CLK_INFRA_AO_GCE_26M           20
+#define CLK_INFRA_AO_CQ_DMA_FPC                21
+#define CLK_INFRA_AO_UART5             22
+#define CLK_INFRA_AO_HDMI_26M          23
+#define CLK_INFRA_AO_SPI0              24
+#define CLK_INFRA_AO_MSDC0             25
+#define CLK_INFRA_AO_MSDC1             26
+#define CLK_INFRA_AO_CG1_MSDC2         27
+#define CLK_INFRA_AO_MSDC0_SRC         28
+#define CLK_INFRA_AO_TRNG              29
+#define CLK_INFRA_AO_AUXADC            30
+#define CLK_INFRA_AO_CPUM              31
+#define CLK_INFRA_AO_HDMI_32K          32
+#define CLK_INFRA_AO_CEC_66M_H         33
+#define CLK_INFRA_AO_IRRX              34
+#define CLK_INFRA_AO_PCIE_TL_26M       35
+#define CLK_INFRA_AO_MSDC1_SRC         36
+#define CLK_INFRA_AO_CEC_66M_B         37
+#define CLK_INFRA_AO_PCIE_TL_96M       38
+#define CLK_INFRA_AO_DEVICE_APC                39
+#define CLK_INFRA_AO_ECC_66M_H         40
+#define CLK_INFRA_AO_DEBUGSYS          41
+#define CLK_INFRA_AO_AUDIO             42
+#define CLK_INFRA_AO_PCIE_TL_32K       43
+#define CLK_INFRA_AO_DBG_TRACE         44
+#define CLK_INFRA_AO_DRAMC_F26M                45
+#define CLK_INFRA_AO_IRTX              46
+#define CLK_INFRA_AO_SSUSB             47
+#define CLK_INFRA_AO_DISP_PWM          48
+#define CLK_INFRA_AO_CLDMA_B           49
+#define CLK_INFRA_AO_AUDIO_26M_B       50
+#define CLK_INFRA_AO_SPI1              51
+#define CLK_INFRA_AO_SPI2              52
+#define CLK_INFRA_AO_SPI3              53
+#define CLK_INFRA_AO_UNIPRO_SYS                54
+#define CLK_INFRA_AO_UNIPRO_TICK       55
+#define CLK_INFRA_AO_UFS_MP_SAP_B      56
+#define CLK_INFRA_AO_PWRMCU            57
+#define CLK_INFRA_AO_PWRMCU_BUS_H      58
+#define CLK_INFRA_AO_APDMA_B           59
+#define CLK_INFRA_AO_SPI4              60
+#define CLK_INFRA_AO_SPI5              61
+#define CLK_INFRA_AO_CQ_DMA            62
+#define CLK_INFRA_AO_AES_UFSFDE                63
+#define CLK_INFRA_AO_AES               64
+#define CLK_INFRA_AO_UFS_TICK          65
+#define CLK_INFRA_AO_SSUSB_XHCI                66
+#define CLK_INFRA_AO_MSDC0_SELF                67
+#define CLK_INFRA_AO_MSDC1_SELF                68
+#define CLK_INFRA_AO_MSDC2_SELF                69
+#define CLK_INFRA_AO_I2S_DMA           70
+#define CLK_INFRA_AO_AP_MSDC0          71
+#define CLK_INFRA_AO_MD_MSDC0          72
+#define CLK_INFRA_AO_CG3_MSDC2         73
+#define CLK_INFRA_AO_GCPU              74
+#define CLK_INFRA_AO_PCIE_PERI_26M     75
+#define CLK_INFRA_AO_GCPU_66M_B                76
+#define CLK_INFRA_AO_GCPU_133M_B       77
+#define CLK_INFRA_AO_DISP_PWM1         78
+#define CLK_INFRA_AO_FBIST2FPC         79
+#define CLK_INFRA_AO_DEVICE_APC_SYNC   80
+#define CLK_INFRA_AO_PCIE_P1_PERI_26M  81
+#define CLK_INFRA_AO_SPIS0             82
+#define CLK_INFRA_AO_SPIS1             83
+#define CLK_INFRA_AO_133M_M_PERI       84
+#define CLK_INFRA_AO_66M_M_PERI                85
+#define CLK_INFRA_AO_PCIE_PL_P_250M_P0 86
+#define CLK_INFRA_AO_PCIE_PL_P_250M_P1 87
+#define CLK_INFRA_AO_PCIE_P1_TL_96M    88
+#define CLK_INFRA_AO_AES_MSDCFDE_0P    89
+#define CLK_INFRA_AO_UFS_TX_SYMBOL     90
+#define CLK_INFRA_AO_UFS_RX_SYMBOL     91
+#define CLK_INFRA_AO_UFS_RX_SYMBOL1    92
+#define CLK_INFRA_AO_PERI_UFS_MEM_SUB  93
+#define CLK_INFRA_AO_NR_CLK            94
+
+/* APMIXEDSYS */
+
+#define CLK_APMIXED_NNAPLL             0
+#define CLK_APMIXED_RESPLL             1
+#define CLK_APMIXED_ETHPLL             2
+#define CLK_APMIXED_MSDCPLL            3
+#define CLK_APMIXED_TVDPLL1            4
+#define CLK_APMIXED_TVDPLL2            5
+#define CLK_APMIXED_MMPLL              6
+#define CLK_APMIXED_MAINPLL            7
+#define CLK_APMIXED_VDECPLL            8
+#define CLK_APMIXED_IMGPLL             9
+#define CLK_APMIXED_UNIVPLL            10
+#define CLK_APMIXED_HDMIPLL1           11
+#define CLK_APMIXED_HDMIPLL2           12
+#define CLK_APMIXED_HDMIRX_APLL                13
+#define CLK_APMIXED_USB1PLL            14
+#define CLK_APMIXED_ADSPPLL            15
+#define CLK_APMIXED_APLL1              16
+#define CLK_APMIXED_APLL2              17
+#define CLK_APMIXED_APLL3              18
+#define CLK_APMIXED_APLL4              19
+#define CLK_APMIXED_APLL5              20
+#define CLK_APMIXED_MFGPLL             21
+#define CLK_APMIXED_DGIPLL             22
+#define CLK_APMIXED_PLL_SSUSB26M       23
+#define CLK_APMIXED_NR_CLK             24
+
+/* SCP_ADSP */
+
+#define CLK_SCP_ADSP_AUDIODSP          0
+#define CLK_SCP_ADSP_NR_CLK            1
+
+/* PERICFG_AO */
+
+#define CLK_PERI_AO_ETHERNET           0
+#define CLK_PERI_AO_ETHERNET_BUS       1
+#define CLK_PERI_AO_FLASHIF_BUS                2
+#define CLK_PERI_AO_FLASHIF_FLASH      3
+#define CLK_PERI_AO_SSUSB_1P_BUS       4
+#define CLK_PERI_AO_SSUSB_1P_XHCI      5
+#define CLK_PERI_AO_SSUSB_2P_BUS       6
+#define CLK_PERI_AO_SSUSB_2P_XHCI      7
+#define CLK_PERI_AO_SSUSB_3P_BUS       8
+#define CLK_PERI_AO_SSUSB_3P_XHCI      9
+#define CLK_PERI_AO_SPINFI             10
+#define CLK_PERI_AO_ETHERNET_MAC       11
+#define CLK_PERI_AO_NFI_H              12
+#define CLK_PERI_AO_FNFI1X             13
+#define CLK_PERI_AO_PCIE_P0_MEM                14
+#define CLK_PERI_AO_PCIE_P1_MEM                15
+#define CLK_PERI_AO_NR_CLK             16
+
+/* IMP_IIC_WRAP_S */
+
+#define CLK_IMP_IIC_WRAP_S_I2C5                0
+#define CLK_IMP_IIC_WRAP_S_I2C6                1
+#define CLK_IMP_IIC_WRAP_S_I2C7                2
+#define CLK_IMP_IIC_WRAP_S_NR_CLK      3
+
+/* IMP_IIC_WRAP_W */
+
+#define CLK_IMP_IIC_WRAP_W_I2C0                0
+#define CLK_IMP_IIC_WRAP_W_I2C1                1
+#define CLK_IMP_IIC_WRAP_W_I2C2                2
+#define CLK_IMP_IIC_WRAP_W_I2C3                3
+#define CLK_IMP_IIC_WRAP_W_I2C4                4
+#define CLK_IMP_IIC_WRAP_W_NR_CLK      5
+
+/* MFGCFG */
+
+#define CLK_MFG_BG3D                   0
+#define CLK_MFG_NR_CLK                 1
+
+/* VPPSYS0 */
+
+#define CLK_VPP0_MDP_FG                                0
+#define CLK_VPP0_STITCH                                1
+#define CLK_VPP0_PADDING                       2
+#define CLK_VPP0_MDP_TCC                       3
+#define CLK_VPP0_WARP0_ASYNC_TX                        4
+#define CLK_VPP0_WARP1_ASYNC_TX                        5
+#define CLK_VPP0_MUTEX                         6
+#define CLK_VPP0_VPP02VPP1_RELAY               7
+#define CLK_VPP0_VPP12VPP0_ASYNC               8
+#define CLK_VPP0_MMSYSRAM_TOP                  9
+#define CLK_VPP0_MDP_AAL                       10
+#define CLK_VPP0_MDP_RSZ                       11
+#define CLK_VPP0_SMI_COMMON                    12
+#define CLK_VPP0_GALS_VDO0_LARB0               13
+#define CLK_VPP0_GALS_VDO0_LARB1               14
+#define CLK_VPP0_GALS_VENCSYS                  15
+#define CLK_VPP0_GALS_VENCSYS_CORE1            16
+#define CLK_VPP0_GALS_INFRA                    17
+#define CLK_VPP0_GALS_CAMSYS                   18
+#define CLK_VPP0_GALS_VPP1_LARB5               19
+#define CLK_VPP0_GALS_VPP1_LARB6               20
+#define CLK_VPP0_SMI_REORDER                   21
+#define CLK_VPP0_SMI_IOMMU                     22
+#define CLK_VPP0_GALS_IMGSYS_CAMSYS            23
+#define CLK_VPP0_MDP_RDMA                      24
+#define CLK_VPP0_MDP_WROT                      25
+#define CLK_VPP0_GALS_EMI0_EMI1                        26
+#define CLK_VPP0_SMI_SUB_COMMON_REORDER                27
+#define CLK_VPP0_SMI_RSI                       28
+#define CLK_VPP0_SMI_COMMON_LARB4              29
+#define CLK_VPP0_GALS_VDEC_VDEC_CORE1          30
+#define CLK_VPP0_GALS_VPP1_WPE                 31
+#define CLK_VPP0_GALS_VDO0_VDO1_VENCSYS_CORE1  32
+#define CLK_VPP0_FAKE_ENG                      33
+#define CLK_VPP0_MDP_HDR                       34
+#define CLK_VPP0_MDP_TDSHP                     35
+#define CLK_VPP0_MDP_COLOR                     36
+#define CLK_VPP0_MDP_OVL                       37
+#define CLK_VPP0_WARP0_RELAY                   38
+#define CLK_VPP0_WARP0_MDP_DL_ASYNC            39
+#define CLK_VPP0_WARP1_RELAY                   40
+#define CLK_VPP0_WARP1_MDP_DL_ASYNC            41
+#define CLK_VPP0_NR_CLK                                42
+
+/* WPESYS */
+
+#define CLK_WPE_VPP0                   0
+#define CLK_WPE_VPP1                   1
+#define CLK_WPE_SMI_LARB7              2
+#define CLK_WPE_SMI_LARB8              3
+#define CLK_WPE_EVENT_TX               4
+#define CLK_WPE_SMI_LARB7_P            5
+#define CLK_WPE_SMI_LARB8_P            6
+#define CLK_WPE_NR_CLK                 7
+
+/* WPESYS_VPP0 */
+
+#define CLK_WPE_VPP0_VECI              0
+#define CLK_WPE_VPP0_VEC2I             1
+#define CLK_WPE_VPP0_VEC3I             2
+#define CLK_WPE_VPP0_WPEO              3
+#define CLK_WPE_VPP0_MSKO              4
+#define CLK_WPE_VPP0_VGEN              5
+#define CLK_WPE_VPP0_EXT               6
+#define CLK_WPE_VPP0_VFC               7
+#define CLK_WPE_VPP0_CACH0_TOP         8
+#define CLK_WPE_VPP0_CACH0_DMA         9
+#define CLK_WPE_VPP0_CACH1_TOP         10
+#define CLK_WPE_VPP0_CACH1_DMA         11
+#define CLK_WPE_VPP0_CACH2_TOP         12
+#define CLK_WPE_VPP0_CACH2_DMA         13
+#define CLK_WPE_VPP0_CACH3_TOP         14
+#define CLK_WPE_VPP0_CACH3_DMA         15
+#define CLK_WPE_VPP0_PSP               16
+#define CLK_WPE_VPP0_PSP2              17
+#define CLK_WPE_VPP0_SYNC              18
+#define CLK_WPE_VPP0_C24               19
+#define CLK_WPE_VPP0_MDP_CROP          20
+#define CLK_WPE_VPP0_ISP_CROP          21
+#define CLK_WPE_VPP0_TOP               22
+#define CLK_WPE_VPP0_NR_CLK            23
+
+/* WPESYS_VPP1 */
+
+#define CLK_WPE_VPP1_VECI              0
+#define CLK_WPE_VPP1_VEC2I             1
+#define CLK_WPE_VPP1_VEC3I             2
+#define CLK_WPE_VPP1_WPEO              3
+#define CLK_WPE_VPP1_MSKO              4
+#define CLK_WPE_VPP1_VGEN              5
+#define CLK_WPE_VPP1_EXT               6
+#define CLK_WPE_VPP1_VFC               7
+#define CLK_WPE_VPP1_CACH0_TOP         8
+#define CLK_WPE_VPP1_CACH0_DMA         9
+#define CLK_WPE_VPP1_CACH1_TOP         10
+#define CLK_WPE_VPP1_CACH1_DMA         11
+#define CLK_WPE_VPP1_CACH2_TOP         12
+#define CLK_WPE_VPP1_CACH2_DMA         13
+#define CLK_WPE_VPP1_CACH3_TOP         14
+#define CLK_WPE_VPP1_CACH3_DMA         15
+#define CLK_WPE_VPP1_PSP               16
+#define CLK_WPE_VPP1_PSP2              17
+#define CLK_WPE_VPP1_SYNC              18
+#define CLK_WPE_VPP1_C24               19
+#define CLK_WPE_VPP1_MDP_CROP          20
+#define CLK_WPE_VPP1_ISP_CROP          21
+#define CLK_WPE_VPP1_TOP               22
+#define CLK_WPE_VPP1_NR_CLK            23
+
+/* VPPSYS1 */
+
+#define CLK_VPP1_SVPP1_MDP_OVL         0
+#define CLK_VPP1_SVPP1_MDP_TCC         1
+#define CLK_VPP1_SVPP1_MDP_WROT                2
+#define CLK_VPP1_SVPP1_VPP_PAD         3
+#define CLK_VPP1_SVPP2_MDP_WROT                4
+#define CLK_VPP1_SVPP2_VPP_PAD         5
+#define CLK_VPP1_SVPP3_MDP_WROT                6
+#define CLK_VPP1_SVPP3_VPP_PAD         7
+#define CLK_VPP1_SVPP1_MDP_RDMA                8
+#define CLK_VPP1_SVPP1_MDP_FG          9
+#define CLK_VPP1_SVPP2_MDP_RDMA                10
+#define CLK_VPP1_SVPP2_MDP_FG          11
+#define CLK_VPP1_SVPP3_MDP_RDMA                12
+#define CLK_VPP1_SVPP3_MDP_FG          13
+#define CLK_VPP1_VPP_SPLIT             14
+#define CLK_VPP1_SVPP2_VDO0_DL_RELAY   15
+#define CLK_VPP1_SVPP1_MDP_TDSHP       16
+#define CLK_VPP1_SVPP1_MDP_COLOR       17
+#define CLK_VPP1_SVPP3_VDO1_DL_RELAY   18
+#define CLK_VPP1_SVPP2_VPP_MERGE       19
+#define CLK_VPP1_SVPP2_MDP_COLOR       20
+#define CLK_VPP1_VPPSYS1_GALS          21
+#define CLK_VPP1_SVPP3_VPP_MERGE       22
+#define CLK_VPP1_SVPP3_MDP_COLOR       23
+#define CLK_VPP1_VPPSYS1_LARB          24
+#define CLK_VPP1_SVPP1_MDP_RSZ         25
+#define CLK_VPP1_SVPP1_MDP_HDR         26
+#define CLK_VPP1_SVPP1_MDP_AAL         27
+#define CLK_VPP1_SVPP2_MDP_HDR         28
+#define CLK_VPP1_SVPP2_MDP_AAL         29
+#define CLK_VPP1_DL_ASYNC              30
+#define CLK_VPP1_LARB5_FAKE_ENG                31
+#define CLK_VPP1_SVPP3_MDP_HDR         32
+#define CLK_VPP1_SVPP3_MDP_AAL         33
+#define CLK_VPP1_SVPP2_VDO1_DL_RELAY   34
+#define CLK_VPP1_LARB6_FAKE_ENG                35
+#define CLK_VPP1_SVPP2_MDP_RSZ         36
+#define CLK_VPP1_SVPP3_MDP_RSZ         37
+#define CLK_VPP1_SVPP3_VDO0_DL_RELAY   38
+#define CLK_VPP1_DISP_MUTEX            39
+#define CLK_VPP1_SVPP2_MDP_TDSHP       40
+#define CLK_VPP1_SVPP3_MDP_TDSHP       41
+#define CLK_VPP1_VPP0_DL1_RELAY                42
+#define CLK_VPP1_HDMI_META             43
+#define CLK_VPP1_VPP_SPLIT_HDMI                44
+#define CLK_VPP1_DGI_IN                        45
+#define CLK_VPP1_DGI_OUT               46
+#define CLK_VPP1_VPP_SPLIT_DGI         47
+#define CLK_VPP1_VPP0_DL_ASYNC         48
+#define CLK_VPP1_VPP0_DL_RELAY         49
+#define CLK_VPP1_VPP_SPLIT_26M         50
+#define CLK_VPP1_NR_CLK                        51
+
+/* IMGSYS */
+
+#define CLK_IMG_LARB9                  0
+#define CLK_IMG_TRAW0                  1
+#define CLK_IMG_TRAW1                  2
+#define CLK_IMG_TRAW2                  3
+#define CLK_IMG_TRAW3                  4
+#define CLK_IMG_DIP0                   5
+#define CLK_IMG_WPE0                   6
+#define CLK_IMG_IPE                    7
+#define CLK_IMG_DIP1                   8
+#define CLK_IMG_WPE1                   9
+#define CLK_IMG_GALS                   10
+#define CLK_IMG_NR_CLK                 11
+
+/* IMGSYS1_DIP_TOP */
+
+#define CLK_IMG1_DIP_TOP_LARB10                0
+#define CLK_IMG1_DIP_TOP_DIP_TOP       1
+#define CLK_IMG1_DIP_TOP_NR_CLK                2
+
+/* IMGSYS1_DIP_NR */
+
+#define CLK_IMG1_DIP_NR_RESERVE                0
+#define CLK_IMG1_DIP_NR_DIP_NR         1
+#define CLK_IMG1_DIP_NR_NR_CLK         2
+
+/* IMGSYS1_WPE */
+
+#define CLK_IMG1_WPE_LARB11            0
+#define CLK_IMG1_WPE_WPE               1
+#define CLK_IMG1_WPE_NR_CLK            2
+
+/* IPESYS */
+
+#define CLK_IPE_DPE                    0
+#define CLK_IPE_FDVT                   1
+#define CLK_IPE_ME                     2
+#define CLK_IPE_TOP                    3
+#define CLK_IPE_SMI_LARB12             4
+#define CLK_IPE_NR_CLK                 5
+
+/* CAMSYS */
+
+#define CLK_CAM_LARB13                 0
+#define CLK_CAM_LARB14                 1
+#define CLK_CAM_MAIN_CAM               2
+#define CLK_CAM_MAIN_CAMTG             3
+#define CLK_CAM_SENINF                 4
+#define CLK_CAM_GCAMSVA                        5
+#define CLK_CAM_GCAMSVB                        6
+#define CLK_CAM_GCAMSVC                        7
+#define CLK_CAM_SCAMSA                 8
+#define CLK_CAM_SCAMSB                 9
+#define CLK_CAM_CAMSV_TOP              10
+#define CLK_CAM_CAMSV_CQ               11
+#define CLK_CAM_ADL                    12
+#define CLK_CAM_ASG                    13
+#define CLK_CAM_PDA                    14
+#define CLK_CAM_FAKE_ENG               15
+#define CLK_CAM_MAIN_MRAW0             16
+#define CLK_CAM_MAIN_MRAW1             17
+#define CLK_CAM_MAIN_MRAW2             18
+#define CLK_CAM_MAIN_MRAW3             19
+#define CLK_CAM_CAM2MM0_GALS           20
+#define CLK_CAM_CAM2MM1_GALS           21
+#define CLK_CAM_CAM2SYS_GALS           22
+#define CLK_CAM_NR_CLK                 23
+
+/* CAMSYS_RAWA */
+
+#define CLK_CAM_RAWA_LARBX             0
+#define CLK_CAM_RAWA_CAM               1
+#define CLK_CAM_RAWA_CAMTG             2
+#define CLK_CAM_RAWA_NR_CLK            3
+
+/* CAMSYS_YUVA */
+
+#define CLK_CAM_YUVA_LARBX             0
+#define CLK_CAM_YUVA_CAM               1
+#define CLK_CAM_YUVA_CAMTG             2
+#define CLK_CAM_YUVA_NR_CLK            3
+
+/* CAMSYS_RAWB */
+
+#define CLK_CAM_RAWB_LARBX             0
+#define CLK_CAM_RAWB_CAM               1
+#define CLK_CAM_RAWB_CAMTG             2
+#define CLK_CAM_RAWB_NR_CLK            3
+
+/* CAMSYS_YUVB */
+
+#define CLK_CAM_YUVB_LARBX             0
+#define CLK_CAM_YUVB_CAM               1
+#define CLK_CAM_YUVB_CAMTG             2
+#define CLK_CAM_YUVB_NR_CLK            3
+
+/* CAMSYS_MRAW */
+
+#define CLK_CAM_MRAW_LARBX             0
+#define CLK_CAM_MRAW_CAMTG             1
+#define CLK_CAM_MRAW_MRAW0             2
+#define CLK_CAM_MRAW_MRAW1             3
+#define CLK_CAM_MRAW_MRAW2             4
+#define CLK_CAM_MRAW_MRAW3             5
+#define CLK_CAM_MRAW_NR_CLK            6
+
+/* CCUSYS */
+
+#define CLK_CCU_LARB18                 0
+#define CLK_CCU_AHB                    1
+#define CLK_CCU_CCU0                   2
+#define CLK_CCU_CCU1                   3
+#define CLK_CCU_NR_CLK                 4
+
+/* VDECSYS_SOC */
+
+#define CLK_VDEC_SOC_LARB1             0
+#define CLK_VDEC_SOC_LAT               1
+#define CLK_VDEC_SOC_VDEC              2
+#define CLK_VDEC_SOC_NR_CLK            3
+
+/* VDECSYS */
+
+#define CLK_VDEC_LARB1                 0
+#define CLK_VDEC_LAT                   1
+#define CLK_VDEC_VDEC                  2
+#define CLK_VDEC_NR_CLK                        3
+
+/* VDECSYS_CORE1 */
+
+#define CLK_VDEC_CORE1_LARB1           0
+#define CLK_VDEC_CORE1_LAT             1
+#define CLK_VDEC_CORE1_VDEC            2
+#define CLK_VDEC_CORE1_NR_CLK          3
+
+/* APUSYS_PLL */
+
+#define CLK_APUSYS_PLL_APUPLL          0
+#define CLK_APUSYS_PLL_NPUPLL          1
+#define CLK_APUSYS_PLL_APUPLL1         2
+#define CLK_APUSYS_PLL_APUPLL2         3
+#define CLK_APUSYS_PLL_NR_CLK          4
+
+/* VENCSYS */
+
+#define CLK_VENC_LARB                  0
+#define CLK_VENC_VENC                  1
+#define CLK_VENC_JPGENC                        2
+#define CLK_VENC_JPGDEC                        3
+#define CLK_VENC_JPGDEC_C1             4
+#define CLK_VENC_GALS                  5
+#define CLK_VENC_NR_CLK                        6
+
+/* VENCSYS_CORE1 */
+
+#define CLK_VENC_CORE1_LARB            0
+#define CLK_VENC_CORE1_VENC            1
+#define CLK_VENC_CORE1_JPGENC          2
+#define CLK_VENC_CORE1_JPGDEC          3
+#define CLK_VENC_CORE1_JPGDEC_C1       4
+#define CLK_VENC_CORE1_GALS            5
+#define CLK_VENC_CORE1_NR_CLK          6
+
+/* VDOSYS0 */
+
+#define CLK_VDO0_DISP_OVL0             0
+#define CLK_VDO0_DISP_COLOR0           1
+#define CLK_VDO0_DISP_COLOR1           2
+#define CLK_VDO0_DISP_CCORR0           3
+#define CLK_VDO0_DISP_CCORR1           4
+#define CLK_VDO0_DISP_AAL0             5
+#define CLK_VDO0_DISP_AAL1             6
+#define CLK_VDO0_DISP_GAMMA0           7
+#define CLK_VDO0_DISP_GAMMA1           8
+#define CLK_VDO0_DISP_DITHER0          9
+#define CLK_VDO0_DISP_DITHER1          10
+#define CLK_VDO0_DISP_OVL1             11
+#define CLK_VDO0_DISP_WDMA0            12
+#define CLK_VDO0_DISP_WDMA1            13
+#define CLK_VDO0_DISP_RDMA0            14
+#define CLK_VDO0_DISP_RDMA1            15
+#define CLK_VDO0_DSI0                  16
+#define CLK_VDO0_DSI1                  17
+#define CLK_VDO0_DSC_WRAP0             18
+#define CLK_VDO0_VPP_MERGE0            19
+#define CLK_VDO0_DP_INTF0              20
+#define CLK_VDO0_DISP_MUTEX0           21
+#define CLK_VDO0_DISP_IL_ROT0          22
+#define CLK_VDO0_APB_BUS               23
+#define CLK_VDO0_FAKE_ENG0             24
+#define CLK_VDO0_FAKE_ENG1             25
+#define CLK_VDO0_DL_ASYNC0             26
+#define CLK_VDO0_DL_ASYNC1             27
+#define CLK_VDO0_DL_ASYNC2             28
+#define CLK_VDO0_DL_ASYNC3             29
+#define CLK_VDO0_DL_ASYNC4             30
+#define CLK_VDO0_DISP_MONITOR0         31
+#define CLK_VDO0_DISP_MONITOR1         32
+#define CLK_VDO0_DISP_MONITOR2         33
+#define CLK_VDO0_DISP_MONITOR3         34
+#define CLK_VDO0_DISP_MONITOR4         35
+#define CLK_VDO0_SMI_GALS              36
+#define CLK_VDO0_SMI_COMMON            37
+#define CLK_VDO0_SMI_EMI               38
+#define CLK_VDO0_SMI_IOMMU             39
+#define CLK_VDO0_SMI_LARB              40
+#define CLK_VDO0_SMI_RSI               41
+#define CLK_VDO0_DSI0_DSI              42
+#define CLK_VDO0_DSI1_DSI              43
+#define CLK_VDO0_DP_INTF0_DP_INTF      44
+#define CLK_VDO0_NR_CLK                        45
+
+/* VDOSYS1 */
+
+#define CLK_VDO1_SMI_LARB2                     0
+#define CLK_VDO1_SMI_LARB3                     1
+#define CLK_VDO1_GALS                          2
+#define CLK_VDO1_FAKE_ENG0                     3
+#define CLK_VDO1_FAKE_ENG                      4
+#define CLK_VDO1_MDP_RDMA0                     5
+#define CLK_VDO1_MDP_RDMA1                     6
+#define CLK_VDO1_MDP_RDMA2                     7
+#define CLK_VDO1_MDP_RDMA3                     8
+#define CLK_VDO1_VPP_MERGE0                    9
+#define CLK_VDO1_VPP_MERGE1                    10
+#define CLK_VDO1_VPP_MERGE2                    11
+#define CLK_VDO1_VPP_MERGE3                    12
+#define CLK_VDO1_VPP_MERGE4                    13
+#define CLK_VDO1_VPP2_TO_VDO1_DL_ASYNC         14
+#define CLK_VDO1_VPP3_TO_VDO1_DL_ASYNC         15
+#define CLK_VDO1_DISP_MUTEX                    16
+#define CLK_VDO1_MDP_RDMA4                     17
+#define CLK_VDO1_MDP_RDMA5                     18
+#define CLK_VDO1_MDP_RDMA6                     19
+#define CLK_VDO1_MDP_RDMA7                     20
+#define CLK_VDO1_DP_INTF0_MM                   21
+#define CLK_VDO1_DPI0_MM                       22
+#define CLK_VDO1_DPI1_MM                       23
+#define CLK_VDO1_DISP_MONITOR                  24
+#define CLK_VDO1_MERGE0_DL_ASYNC               25
+#define CLK_VDO1_MERGE1_DL_ASYNC               26
+#define CLK_VDO1_MERGE2_DL_ASYNC               27
+#define CLK_VDO1_MERGE3_DL_ASYNC               28
+#define CLK_VDO1_MERGE4_DL_ASYNC               29
+#define CLK_VDO1_VDO0_DSC_TO_VDO1_DL_ASYNC     30
+#define CLK_VDO1_VDO0_MERGE_TO_VDO1_DL_ASYNC   31
+#define CLK_VDO1_HDR_VDO_FE0                   32
+#define CLK_VDO1_HDR_GFX_FE0                   33
+#define CLK_VDO1_HDR_VDO_BE                    34
+#define CLK_VDO1_HDR_VDO_FE1                   35
+#define CLK_VDO1_HDR_GFX_FE1                   36
+#define CLK_VDO1_DISP_MIXER                    37
+#define CLK_VDO1_HDR_VDO_FE0_DL_ASYNC          38
+#define CLK_VDO1_HDR_VDO_FE1_DL_ASYNC          39
+#define CLK_VDO1_HDR_GFX_FE0_DL_ASYNC          40
+#define CLK_VDO1_HDR_GFX_FE1_DL_ASYNC          41
+#define CLK_VDO1_HDR_VDO_BE_DL_ASYNC           42
+#define CLK_VDO1_DPI0                          43
+#define CLK_VDO1_DISP_MONITOR_DPI0             44
+#define CLK_VDO1_DPI1                          45
+#define CLK_VDO1_DISP_MONITOR_DPI1             46
+#define CLK_VDO1_DPINTF                                47
+#define CLK_VDO1_DISP_MONITOR_DPINTF           48
+#define CLK_VDO1_26M_SLOW                      49
+#define CLK_VDO1_NR_CLK                                50
+
+#endif /* _DT_BINDINGS_CLK_MT8195_H */
diff --git a/include/dt-bindings/clock/qcom,camcc-sc7280.h b/include/dt-bindings/clock/qcom,camcc-sc7280.h
new file mode 100644 (file)
index 0000000..56640f4
--- /dev/null
@@ -0,0 +1,127 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ */
+
+#ifndef _DT_BINDINGS_CLK_QCOM_CAM_CC_SC7280_H
+#define _DT_BINDINGS_CLK_QCOM_CAM_CC_SC7280_H
+
+/* CAM_CC clocks */
+#define CAM_CC_PLL0                            0
+#define CAM_CC_PLL0_OUT_EVEN                   1
+#define CAM_CC_PLL0_OUT_ODD                    2
+#define CAM_CC_PLL1                            3
+#define CAM_CC_PLL1_OUT_EVEN                   4
+#define CAM_CC_PLL2                            5
+#define CAM_CC_PLL2_OUT_AUX                    6
+#define CAM_CC_PLL2_OUT_AUX2                   7
+#define CAM_CC_PLL3                            8
+#define CAM_CC_PLL3_OUT_EVEN                   9
+#define CAM_CC_PLL4                            10
+#define CAM_CC_PLL4_OUT_EVEN                   11
+#define CAM_CC_PLL5                            12
+#define CAM_CC_PLL5_OUT_EVEN                   13
+#define CAM_CC_PLL6                            14
+#define CAM_CC_PLL6_OUT_EVEN                   15
+#define CAM_CC_PLL6_OUT_ODD                    16
+#define CAM_CC_BPS_AHB_CLK                     17
+#define CAM_CC_BPS_AREG_CLK                    18
+#define CAM_CC_BPS_AXI_CLK                     19
+#define CAM_CC_BPS_CLK                         20
+#define CAM_CC_BPS_CLK_SRC                     21
+#define CAM_CC_CAMNOC_AXI_CLK                  22
+#define CAM_CC_CAMNOC_AXI_CLK_SRC              23
+#define CAM_CC_CAMNOC_DCD_XO_CLK               24
+#define CAM_CC_CCI_0_CLK                       25
+#define CAM_CC_CCI_0_CLK_SRC                   26
+#define CAM_CC_CCI_1_CLK                       27
+#define CAM_CC_CCI_1_CLK_SRC                   28
+#define CAM_CC_CORE_AHB_CLK                    29
+#define CAM_CC_CPAS_AHB_CLK                    30
+#define CAM_CC_CPHY_RX_CLK_SRC                 31
+#define CAM_CC_CSI0PHYTIMER_CLK                        32
+#define CAM_CC_CSI0PHYTIMER_CLK_SRC            33
+#define CAM_CC_CSI1PHYTIMER_CLK                        34
+#define CAM_CC_CSI1PHYTIMER_CLK_SRC            35
+#define CAM_CC_CSI2PHYTIMER_CLK                        36
+#define CAM_CC_CSI2PHYTIMER_CLK_SRC            37
+#define CAM_CC_CSI3PHYTIMER_CLK                        38
+#define CAM_CC_CSI3PHYTIMER_CLK_SRC            39
+#define CAM_CC_CSI4PHYTIMER_CLK                        40
+#define CAM_CC_CSI4PHYTIMER_CLK_SRC            41
+#define CAM_CC_CSIPHY0_CLK                     42
+#define CAM_CC_CSIPHY1_CLK                     43
+#define CAM_CC_CSIPHY2_CLK                     44
+#define CAM_CC_CSIPHY3_CLK                     45
+#define CAM_CC_CSIPHY4_CLK                     46
+#define CAM_CC_FAST_AHB_CLK_SRC                        47
+#define CAM_CC_GDSC_CLK                                48
+#define CAM_CC_ICP_AHB_CLK                     49
+#define CAM_CC_ICP_CLK                         50
+#define CAM_CC_ICP_CLK_SRC                     51
+#define CAM_CC_IFE_0_AXI_CLK                   52
+#define CAM_CC_IFE_0_CLK                       53
+#define CAM_CC_IFE_0_CLK_SRC                   54
+#define CAM_CC_IFE_0_CPHY_RX_CLK               55
+#define CAM_CC_IFE_0_CSID_CLK                  56
+#define CAM_CC_IFE_0_CSID_CLK_SRC              57
+#define CAM_CC_IFE_0_DSP_CLK                   58
+#define CAM_CC_IFE_1_AXI_CLK                   59
+#define CAM_CC_IFE_1_CLK                       60
+#define CAM_CC_IFE_1_CLK_SRC                   61
+#define CAM_CC_IFE_1_CPHY_RX_CLK               62
+#define CAM_CC_IFE_1_CSID_CLK                  63
+#define CAM_CC_IFE_1_CSID_CLK_SRC              64
+#define CAM_CC_IFE_1_DSP_CLK                   65
+#define CAM_CC_IFE_2_AXI_CLK                   66
+#define CAM_CC_IFE_2_CLK                       67
+#define CAM_CC_IFE_2_CLK_SRC                   68
+#define CAM_CC_IFE_2_CPHY_RX_CLK               69
+#define CAM_CC_IFE_2_CSID_CLK                  70
+#define CAM_CC_IFE_2_CSID_CLK_SRC              71
+#define CAM_CC_IFE_2_DSP_CLK                   72
+#define CAM_CC_IFE_LITE_0_CLK                  73
+#define CAM_CC_IFE_LITE_0_CLK_SRC              74
+#define CAM_CC_IFE_LITE_0_CPHY_RX_CLK          75
+#define CAM_CC_IFE_LITE_0_CSID_CLK             76
+#define CAM_CC_IFE_LITE_0_CSID_CLK_SRC         77
+#define CAM_CC_IFE_LITE_1_CLK                  78
+#define CAM_CC_IFE_LITE_1_CLK_SRC              79
+#define CAM_CC_IFE_LITE_1_CPHY_RX_CLK          80
+#define CAM_CC_IFE_LITE_1_CSID_CLK             81
+#define CAM_CC_IFE_LITE_1_CSID_CLK_SRC         82
+#define CAM_CC_IPE_0_AHB_CLK                   83
+#define CAM_CC_IPE_0_AREG_CLK                  84
+#define CAM_CC_IPE_0_AXI_CLK                   85
+#define CAM_CC_IPE_0_CLK                       86
+#define CAM_CC_IPE_0_CLK_SRC                   87
+#define CAM_CC_JPEG_CLK                                88
+#define CAM_CC_JPEG_CLK_SRC                    89
+#define CAM_CC_LRME_CLK                                90
+#define CAM_CC_LRME_CLK_SRC                    91
+#define CAM_CC_MCLK0_CLK                       92
+#define CAM_CC_MCLK0_CLK_SRC                   93
+#define CAM_CC_MCLK1_CLK                       94
+#define CAM_CC_MCLK1_CLK_SRC                   95
+#define CAM_CC_MCLK2_CLK                       96
+#define CAM_CC_MCLK2_CLK_SRC                   97
+#define CAM_CC_MCLK3_CLK                       98
+#define CAM_CC_MCLK3_CLK_SRC                   99
+#define CAM_CC_MCLK4_CLK                       100
+#define CAM_CC_MCLK4_CLK_SRC                   101
+#define CAM_CC_MCLK5_CLK                       102
+#define CAM_CC_MCLK5_CLK_SRC                   103
+#define CAM_CC_SLEEP_CLK                       104
+#define CAM_CC_SLEEP_CLK_SRC                   105
+#define CAM_CC_SLOW_AHB_CLK_SRC                        106
+#define CAM_CC_XO_CLK_SRC                      107
+
+/* CAM_CC power domains */
+#define CAM_CC_BPS_GDSC                                0
+#define CAM_CC_IFE_0_GDSC                      1
+#define CAM_CC_IFE_1_GDSC                      2
+#define CAM_CC_IFE_2_GDSC                      3
+#define CAM_CC_IPE_0_GDSC                      4
+#define CAM_CC_TITAN_TOP_GDSC                  5
+
+#endif
index 507b8d6..f6836f4 100644 (file)
 #define GCC_USB30_SLEEP_CLK                    138
 #define GCC_USB_HS_AHB_CLK                     139
 #define GCC_USB_PHY_CFG_AHB2PHY_CLK    140
+#define CONFIG_NOC_CLK_SRC                     141
+#define PERIPH_NOC_CLK_SRC                     142
+#define SYSTEM_NOC_CLK_SRC                     143
+#define GPLL0_OUT_MMSSCC                       144
+#define GPLL0_OUT_MSSCC                                145
+#define PCIE_0_PHY_LDO                         146
+#define PCIE_1_PHY_LDO                         147
+#define UFS_PHY_LDO                                    148
+#define USB_SS_PHY_LDO                         149
+#define GCC_BOOT_ROM_AHB_CLK           150
+#define GCC_PRNG_AHB_CLK                       151
+#define GCC_USB3_PHY_PIPE_CLK          152
 
 /* GDSCs */
 #define PCIE_GDSC                      0
 #define PCIE_PHY_0_RESET               2
 #define PCIE_PHY_1_RESET               3
 #define QUSB2_PHY_RESET                        4
+#define MSS_RESET                              5
 
 #endif
diff --git a/include/dt-bindings/clock/qcom,gcc-qcm2290.h b/include/dt-bindings/clock/qcom,gcc-qcm2290.h
new file mode 100644 (file)
index 0000000..8d90703
--- /dev/null
@@ -0,0 +1,188 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
+ */
+
+#ifndef _DT_BINDINGS_CLK_QCOM_GCC_QCM2290_H
+#define _DT_BINDINGS_CLK_QCOM_GCC_QCM2290_H
+
+/* GCC clocks */
+#define GPLL0                                          0
+#define GPLL0_OUT_AUX2                                 1
+#define GPLL1                                          2
+#define GPLL10                                         3
+#define GPLL11                                         4
+#define GPLL3                                          5
+#define GPLL3_OUT_MAIN                                 6
+#define GPLL4                                          7
+#define GPLL5                                          8
+#define GPLL6                                          9
+#define GPLL6_OUT_MAIN                                 10
+#define GPLL7                                          11
+#define GPLL8                                          12
+#define GPLL8_OUT_MAIN                                 13
+#define GPLL9                                          14
+#define GPLL9_OUT_MAIN                                 15
+#define GCC_AHB2PHY_CSI_CLK                            16
+#define GCC_AHB2PHY_USB_CLK                            17
+#define GCC_APC_VS_CLK                                 18
+#define GCC_BIMC_GPU_AXI_CLK                           19
+#define GCC_BOOT_ROM_AHB_CLK                           20
+#define GCC_CAM_THROTTLE_NRT_CLK                       21
+#define GCC_CAM_THROTTLE_RT_CLK                                22
+#define GCC_CAMERA_AHB_CLK                             23
+#define GCC_CAMERA_XO_CLK                              24
+#define GCC_CAMSS_AXI_CLK                              25
+#define GCC_CAMSS_AXI_CLK_SRC                          26
+#define GCC_CAMSS_CAMNOC_ATB_CLK                       27
+#define GCC_CAMSS_CAMNOC_NTS_XO_CLK                    28
+#define GCC_CAMSS_CCI_0_CLK                            29
+#define GCC_CAMSS_CCI_CLK_SRC                          30
+#define GCC_CAMSS_CPHY_0_CLK                           31
+#define GCC_CAMSS_CPHY_1_CLK                           32
+#define GCC_CAMSS_CSI0PHYTIMER_CLK                     33
+#define GCC_CAMSS_CSI0PHYTIMER_CLK_SRC                 34
+#define GCC_CAMSS_CSI1PHYTIMER_CLK                     35
+#define GCC_CAMSS_CSI1PHYTIMER_CLK_SRC                 36
+#define GCC_CAMSS_MCLK0_CLK                            37
+#define GCC_CAMSS_MCLK0_CLK_SRC                                38
+#define GCC_CAMSS_MCLK1_CLK                            39
+#define GCC_CAMSS_MCLK1_CLK_SRC                                40
+#define GCC_CAMSS_MCLK2_CLK                            41
+#define GCC_CAMSS_MCLK2_CLK_SRC                                42
+#define GCC_CAMSS_MCLK3_CLK                            43
+#define GCC_CAMSS_MCLK3_CLK_SRC                                44
+#define GCC_CAMSS_NRT_AXI_CLK                          45
+#define GCC_CAMSS_OPE_AHB_CLK                          46
+#define GCC_CAMSS_OPE_AHB_CLK_SRC                      47
+#define GCC_CAMSS_OPE_CLK                              48
+#define GCC_CAMSS_OPE_CLK_SRC                          49
+#define GCC_CAMSS_RT_AXI_CLK                           50
+#define GCC_CAMSS_TFE_0_CLK                            51
+#define GCC_CAMSS_TFE_0_CLK_SRC                                52
+#define GCC_CAMSS_TFE_0_CPHY_RX_CLK                    53
+#define GCC_CAMSS_TFE_0_CSID_CLK                       54
+#define GCC_CAMSS_TFE_0_CSID_CLK_SRC                   55
+#define GCC_CAMSS_TFE_1_CLK                            56
+#define GCC_CAMSS_TFE_1_CLK_SRC                                57
+#define GCC_CAMSS_TFE_1_CPHY_RX_CLK                    58
+#define GCC_CAMSS_TFE_1_CSID_CLK                       59
+#define GCC_CAMSS_TFE_1_CSID_CLK_SRC                   60
+#define GCC_CAMSS_TFE_CPHY_RX_CLK_SRC                  61
+#define GCC_CAMSS_TOP_AHB_CLK                          62
+#define GCC_CAMSS_TOP_AHB_CLK_SRC                      63
+#define GCC_CFG_NOC_USB3_PRIM_AXI_CLK                  64
+#define GCC_CPUSS_AHB_CLK                              65
+#define GCC_CPUSS_AHB_CLK_SRC                          66
+#define GCC_CPUSS_AHB_POSTDIV_CLK_SRC                  67
+#define GCC_CPUSS_GNOC_CLK                             68
+#define GCC_CPUSS_THROTTLE_CORE_CLK                    69
+#define GCC_CPUSS_THROTTLE_XO_CLK                      70
+#define GCC_DISP_AHB_CLK                               71
+#define GCC_DISP_GPLL0_CLK_SRC                         72
+#define GCC_DISP_GPLL0_DIV_CLK_SRC                     73
+#define GCC_DISP_HF_AXI_CLK                            74
+#define GCC_DISP_THROTTLE_CORE_CLK                     75
+#define GCC_DISP_XO_CLK                                        76
+#define GCC_GP1_CLK                                    77
+#define GCC_GP1_CLK_SRC                                        78
+#define GCC_GP2_CLK                                    79
+#define GCC_GP2_CLK_SRC                                        80
+#define GCC_GP3_CLK                                    81
+#define GCC_GP3_CLK_SRC                                        82
+#define GCC_GPU_CFG_AHB_CLK                            83
+#define GCC_GPU_GPLL0_CLK_SRC                          84
+#define GCC_GPU_GPLL0_DIV_CLK_SRC                      85
+#define GCC_GPU_IREF_CLK                               86
+#define GCC_GPU_MEMNOC_GFX_CLK                         87
+#define GCC_GPU_SNOC_DVM_GFX_CLK                       88
+#define GCC_GPU_THROTTLE_CORE_CLK                      89
+#define GCC_GPU_THROTTLE_XO_CLK                                90
+#define GCC_PDM2_CLK                                   91
+#define GCC_PDM2_CLK_SRC                               92
+#define GCC_PDM_AHB_CLK                                        93
+#define GCC_PDM_XO4_CLK                                        94
+#define GCC_PWM0_XO512_CLK                             95
+#define GCC_QMIP_CAMERA_NRT_AHB_CLK                    96
+#define GCC_QMIP_CAMERA_RT_AHB_CLK                     97
+#define GCC_QMIP_CPUSS_CFG_AHB_CLK                     98
+#define GCC_QMIP_DISP_AHB_CLK                          99
+#define GCC_QMIP_GPU_CFG_AHB_CLK                       100
+#define GCC_QMIP_VIDEO_VCODEC_AHB_CLK                  101
+#define GCC_QUPV3_WRAP0_CORE_2X_CLK                    102
+#define GCC_QUPV3_WRAP0_CORE_CLK                       103
+#define GCC_QUPV3_WRAP0_S0_CLK                         104
+#define GCC_QUPV3_WRAP0_S0_CLK_SRC                     105
+#define GCC_QUPV3_WRAP0_S1_CLK                         106
+#define GCC_QUPV3_WRAP0_S1_CLK_SRC                     107
+#define GCC_QUPV3_WRAP0_S2_CLK                         108
+#define GCC_QUPV3_WRAP0_S2_CLK_SRC                     109
+#define GCC_QUPV3_WRAP0_S3_CLK                         110
+#define GCC_QUPV3_WRAP0_S3_CLK_SRC                     111
+#define GCC_QUPV3_WRAP0_S4_CLK                         112
+#define GCC_QUPV3_WRAP0_S4_CLK_SRC                     113
+#define GCC_QUPV3_WRAP0_S5_CLK                         114
+#define GCC_QUPV3_WRAP0_S5_CLK_SRC                     115
+#define GCC_QUPV3_WRAP_0_M_AHB_CLK                     116
+#define GCC_QUPV3_WRAP_0_S_AHB_CLK                     117
+#define GCC_SDCC1_AHB_CLK                              118
+#define GCC_SDCC1_APPS_CLK                             119
+#define GCC_SDCC1_APPS_CLK_SRC                         120
+#define GCC_SDCC1_ICE_CORE_CLK                         121
+#define GCC_SDCC1_ICE_CORE_CLK_SRC                     122
+#define GCC_SDCC2_AHB_CLK                              123
+#define GCC_SDCC2_APPS_CLK                             124
+#define GCC_SDCC2_APPS_CLK_SRC                         125
+#define GCC_SYS_NOC_CPUSS_AHB_CLK                      126
+#define GCC_SYS_NOC_USB3_PRIM_AXI_CLK                  127
+#define GCC_USB30_PRIM_MASTER_CLK                      128
+#define GCC_USB30_PRIM_MASTER_CLK_SRC                  129
+#define GCC_USB30_PRIM_MOCK_UTMI_CLK                   130
+#define GCC_USB30_PRIM_MOCK_UTMI_CLK_SRC               131
+#define GCC_USB30_PRIM_MOCK_UTMI_POSTDIV               132
+#define GCC_USB30_PRIM_SLEEP_CLK                       133
+#define GCC_USB3_PRIM_CLKREF_CLK                       134
+#define GCC_USB3_PRIM_PHY_AUX_CLK_SRC                  135
+#define GCC_USB3_PRIM_PHY_COM_AUX_CLK                  136
+#define GCC_USB3_PRIM_PHY_PIPE_CLK                     137
+#define GCC_VCODEC0_AXI_CLK                            138
+#define GCC_VENUS_AHB_CLK                              139
+#define GCC_VENUS_CTL_AXI_CLK                          140
+#define GCC_VIDEO_AHB_CLK                              141
+#define GCC_VIDEO_AXI0_CLK                             142
+#define GCC_VIDEO_THROTTLE_CORE_CLK                    143
+#define GCC_VIDEO_VCODEC0_SYS_CLK                      144
+#define GCC_VIDEO_VENUS_CLK_SRC                                145
+#define GCC_VIDEO_VENUS_CTL_CLK                                146
+#define GCC_VIDEO_XO_CLK                               147
+
+/* GCC resets */
+#define GCC_CAMSS_OPE_BCR                              0
+#define GCC_CAMSS_TFE_BCR                              1
+#define GCC_CAMSS_TOP_BCR                              2
+#define GCC_GPU_BCR                                    3
+#define GCC_MMSS_BCR                                   4
+#define GCC_PDM_BCR                                    5
+#define GCC_QUPV3_WRAPPER_0_BCR                                6
+#define GCC_SDCC1_BCR                                  7
+#define GCC_SDCC2_BCR                                  8
+#define GCC_USB30_PRIM_BCR                             9
+#define GCC_USB_PHY_CFG_AHB2PHY_BCR                    10
+#define GCC_VCODEC0_BCR                                        11
+#define GCC_VENUS_BCR                                  12
+#define GCC_VIDEO_INTERFACE_BCR                                13
+#define GCC_QUSB2PHY_PRIM_BCR                          14
+#define GCC_USB3_PHY_PRIM_SP0_BCR                      15
+#define GCC_USB3PHY_PHY_PRIM_SP0_BCR                   16
+
+/* Indexes for GDSCs */
+#define GCC_CAMSS_TOP_GDSC                             0
+#define GCC_USB30_PRIM_GDSC                            1
+#define GCC_VCODEC0_GDSC                               2
+#define GCC_VENUS_GDSC                                 3
+#define HLOS1_VOTE_TURING_MMU_TBU1_GDSC                        4
+#define HLOS1_VOTE_TURING_MMU_TBU0_GDSC                        5
+#define HLOS1_VOTE_MM_SNOC_MMU_TBU_RT_GDSC             6
+#define HLOS1_VOTE_MM_SNOC_MMU_TBU_NRT_GDSC            7
+
+#endif
diff --git a/include/dt-bindings/clock/qcom,lpass-sc7280.h b/include/dt-bindings/clock/qcom,lpass-sc7280.h
new file mode 100644 (file)
index 0000000..e71ccac
--- /dev/null
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ */
+
+#ifndef _DT_BINDINGS_CLK_QCOM_LPASS_SC7280_H
+#define _DT_BINDINGS_CLK_QCOM_LPASS_SC7280_H
+
+#define LPASS_Q6SS_AHBM_CLK                            0
+#define LPASS_Q6SS_AHBS_CLK                            1
+#define LPASS_TOP_CC_LPI_Q6_AXIM_HS_CLK                        2
+#define LPASS_QDSP6SS_XO_CLK                           3
+#define LPASS_QDSP6SS_SLEEP_CLK                                4
+#define LPASS_QDSP6SS_CORE_CLK                         5
+
+#endif
index aa834d5..fb624ff 100644 (file)
 #define RPM_SMD_SNOC_PERIPH_A_CLK              113
 #define RPM_SMD_SNOC_LPASS_CLK                 114
 #define RPM_SMD_SNOC_LPASS_A_CLK               115
+#define RPM_SMD_HWKM_CLK                       116
+#define RPM_SMD_HWKM_A_CLK                     117
+#define RPM_SMD_PKA_CLK                                118
+#define RPM_SMD_PKA_A_CLK                      119
+#define RPM_SMD_CPUSS_GNOC_CLK                 120
+#define RPM_SMD_CPUSS_GNOC_A_CLK               121
 
 #endif
diff --git a/include/dt-bindings/reset/imx8ulp-pcc-reset.h b/include/dt-bindings/reset/imx8ulp-pcc-reset.h
new file mode 100644 (file)
index 0000000..e99a473
--- /dev/null
@@ -0,0 +1,59 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright 2021 NXP
+ */
+
+#ifndef DT_BINDING_PCC_RESET_IMX8ULP_H
+#define DT_BINDING_PCC_RESET_IMX8ULP_H
+
+/* PCC3 */
+#define PCC3_WDOG3_SWRST       0
+#define PCC3_WDOG4_SWRST       1
+#define PCC3_LPIT1_SWRST       2
+#define PCC3_TPM4_SWRST                3
+#define PCC3_TPM5_SWRST                4
+#define PCC3_FLEXIO1_SWRST     5
+#define PCC3_I3C2_SWRST                6
+#define PCC3_LPI2C4_SWRST      7
+#define PCC3_LPI2C5_SWRST      8
+#define PCC3_LPUART4_SWRST     9
+#define PCC3_LPUART5_SWRST     10
+#define PCC3_LPSPI4_SWRST      11
+#define PCC3_LPSPI5_SWRST      12
+
+/* PCC4 */
+#define PCC4_FLEXSPI2_SWRST    0
+#define PCC4_TPM6_SWRST                1
+#define PCC4_TPM7_SWRST                2
+#define PCC4_LPI2C6_SWRST      3
+#define PCC4_LPI2C7_SWRST      4
+#define PCC4_LPUART6_SWRST     5
+#define PCC4_LPUART7_SWRST     6
+#define PCC4_SAI4_SWRST                7
+#define PCC4_SAI5_SWRST                8
+#define PCC4_USDHC0_SWRST      9
+#define PCC4_USDHC1_SWRST      10
+#define PCC4_USDHC2_SWRST      11
+#define PCC4_USB0_SWRST                12
+#define PCC4_USB0_PHY_SWRST    13
+#define PCC4_USB1_SWRST                14
+#define PCC4_USB1_PHY_SWRST    15
+#define PCC4_ENET_SWRST                16
+
+/* PCC5 */
+#define PCC5_TPM8_SWRST                0
+#define PCC5_SAI6_SWRST                1
+#define PCC5_SAI7_SWRST                2
+#define PCC5_SPDIF_SWRST       3
+#define PCC5_ISI_SWRST         4
+#define PCC5_CSI_REGS_SWRST    5
+#define PCC5_CSI_SWRST         6
+#define PCC5_DSI_SWRST         7
+#define PCC5_WDOG5_SWRST       8
+#define PCC5_EPDC_SWRST                9
+#define PCC5_PXP_SWRST         10
+#define PCC5_GPU2D_SWRST       11
+#define PCC5_GPU3D_SWRST       12
+#define PCC5_DC_NANO_SWRST     13
+
+#endif /*DT_BINDING_RESET_IMX8ULP_H */
diff --git a/include/dt-bindings/reset/stericsson,db8500-prcc-reset.h b/include/dt-bindings/reset/stericsson,db8500-prcc-reset.h
new file mode 100644 (file)
index 0000000..ea90689
--- /dev/null
@@ -0,0 +1,51 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef _DT_BINDINGS_STE_PRCC_RESET
+#define _DT_BINDINGS_STE_PRCC_RESET
+
+#define DB8500_PRCC_1                          1
+#define DB8500_PRCC_2                          2
+#define DB8500_PRCC_3                          3
+#define DB8500_PRCC_6                          6
+
+/* Reset lines on PRCC 1 */
+#define DB8500_PRCC_1_RESET_UART0              0
+#define DB8500_PRCC_1_RESET_UART1              1
+#define DB8500_PRCC_1_RESET_I2C1               2
+#define DB8500_PRCC_1_RESET_MSP0               3
+#define DB8500_PRCC_1_RESET_MSP1               4
+#define DB8500_PRCC_1_RESET_SDI0               5
+#define DB8500_PRCC_1_RESET_I2C2               6
+#define DB8500_PRCC_1_RESET_SPI3               7
+#define DB8500_PRCC_1_RESET_SLIMBUS0           8
+#define DB8500_PRCC_1_RESET_I2C4               9
+#define DB8500_PRCC_1_RESET_MSP3               10
+#define DB8500_PRCC_1_RESET_PER_MSP3           11
+#define DB8500_PRCC_1_RESET_PER_MSP1           12
+#define DB8500_PRCC_1_RESET_PER_MSP0           13
+#define DB8500_PRCC_1_RESET_PER_SLIMBUS                14
+
+/* Reset lines on PRCC 2 */
+#define DB8500_PRCC_2_RESET_I2C3               0
+#define DB8500_PRCC_2_RESET_PWL                        1
+#define DB8500_PRCC_2_RESET_SDI4               2
+#define DB8500_PRCC_2_RESET_MSP2               3
+#define DB8500_PRCC_2_RESET_SDI1               4
+#define DB8500_PRCC_2_RESET_SDI3               5
+#define DB8500_PRCC_2_RESET_HSIRX              6
+#define DB8500_PRCC_2_RESET_HSITX              7
+#define DB8500_PRCC_1_RESET_PER_MSP2           8
+
+/* Reset lines on PRCC 3 */
+#define DB8500_PRCC_3_RESET_SSP0               1
+#define DB8500_PRCC_3_RESET_SSP1               2
+#define DB8500_PRCC_3_RESET_I2C0               3
+#define DB8500_PRCC_3_RESET_SDI2               4
+#define DB8500_PRCC_3_RESET_SKE                        5
+#define DB8500_PRCC_3_RESET_UART2              6
+#define DB8500_PRCC_3_RESET_SDI5               7
+
+/* Reset lines on PRCC 6 */
+#define DB8500_PRCC_3_RESET_RNG                        0
+
+#endif
index 60e66fc..860dd8c 100644 (file)
@@ -38,6 +38,8 @@ struct qcom_smd_rpm;
 #define QCOM_SMD_RPM_IPA_CLK   0x617069
 #define QCOM_SMD_RPM_CE_CLK    0x6563
 #define QCOM_SMD_RPM_AGGR_CLK  0x72676761
+#define QCOM_SMD_RPM_HWKM_CLK  0x6d6b7768
+#define QCOM_SMD_RPM_PKA_CLK   0x616b70
 
 int qcom_rpm_smd_write(struct qcom_smd_rpm *rpm,
                       int state,