Merge tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 2 Sep 2021 21:17:24 +0000 (14:17 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 2 Sep 2021 21:17:24 +0000 (14:17 -0700)
Pull clk updates from Stephen Boyd:
 "Nothing changed in the clk framework core this time around. We did get
  some updates to the basic clk types to use determine_rate for the
  divider type and add a power of two fractional divider flag though.

  Otherwise, this is a collection of clk driver updates. More than half
  the diffstat is in the Qualcomm clk driver where we add a bunch of
  data to describe clks on various SoCs and fix bugs. The other big new
  thing in here is the Mediatek MT8192 clk driver. That's been under
  review for a while and it's nice to see that it's finally upstream.

  Beyond that it's the usual set of minor fixes and tweaks to clk
  drivers. There are some non-clk driver bits in here which have all
  been acked by the respective maintainers.

  New Drivers:
   - Support video, gpu, display clks on qcom sc7280 SoCs
   - GCC clks on qcom MSM8953, SM4250/6115, and SM6350 SoCs
   - Multimedia clks (MMCC) on qcom MSM8994/MSM8992
   - RPMh clks on qcom SM6350 SoCs
   - Support for Mediatek MT8192 SoCs
   - Add display (DU and DSI) clocks on Renesas R-Car V3U
   - Add I2C, DMAC, USB, sound (SSIF-2), GPIO, CANFD, and ADC clocks and
     resets on Renesas RZ/G2L

  Updates:
   - Support the SD/OE pin on IDT VersaClock 5 and 6 clock generators
   - Add power of two flag to fractional divider clk type
   - Migrate some clk drivers to clk_divider_ops.determine_rate
   - Migrate to clk_parent_data in gcc-sdm660
   - Fix CLKOUT clocks on i.MX8MM and i.MX8MN by using imx_clk_hw_mux2
   - Switch from .round_rate to .determine_rate in clk-divider-gate
   - Fix clock tree update for TF-A controlled clocks for all i.MX8M
   - Add missing M7 core clock for i.MX8MN
   - YAML conversion of rk3399 clock controller binding
   - Removal of GRF dependency for the rk3328/rk3036 pll types
   - Drop CLK_IS_CRITICAL flag from Tegra fuse clk
   - Make CLK_R9A06G032 Kconfig symbol invisible
   - Convert various DT bindings to YAML"

* tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux: (128 commits)
  dt-bindings: clock: samsung: fix header path in example
  clk: tegra: fix old-style declaration
  clk: qcom: Add SM6350 GCC driver
  MAINTAINERS: clock: include S3C and S5P in Samsung SoC clock entry
  dt-bindings: clock: samsung: convert S5Pv210 AudSS to dtschema
  dt-bindings: clock: samsung: convert Exynos AudSS to dtschema
  dt-bindings: clock: samsung: convert Exynos4 to dtschema
  dt-bindings: clock: samsung: convert Exynos3250 to dtschema
  dt-bindings: clock: samsung: convert Exynos542x to dtschema
  dt-bindings: clock: samsung: add bindings for Exynos external clock
  dt-bindings: clock: samsung: convert Exynos5250 to dtschema
  clk: vc5: Add properties for configuring SD/OE behavior
  clk: vc5: Use dev_err_probe
  dt-bindings: clk: vc5: Add properties for configuring the SD/OE pin
  dt-bindings: clock: brcm,iproc-clocks: fix armpll properties
  clk: zynqmp: Fix kernel-doc format
  clk: at91: clk-generated: Limit the requested rate to our range
  clk: ralink: avoid to set 'CLK_IS_CRITICAL' flag for gates
  clk: zynqmp: Fix a memory leak
  clk: zynqmp: Check the return type
  ...

143 files changed:
Documentation/devicetree/bindings/arm/mediatek/mediatek,audsys.txt
Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml
Documentation/devicetree/bindings/arm/mediatek/mediatek,mt8192-clock.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/arm/mediatek/mediatek,mt8192-sys-clock.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/brcm,iproc-clocks.yaml
Documentation/devicetree/bindings/clock/clk-exynos-audss.txt [deleted file]
Documentation/devicetree/bindings/clock/clk-s5pv210-audss.txt [deleted file]
Documentation/devicetree/bindings/clock/exynos3250-clock.txt [deleted file]
Documentation/devicetree/bindings/clock/exynos4-clock.txt [deleted file]
Documentation/devicetree/bindings/clock/exynos5250-clock.txt [deleted file]
Documentation/devicetree/bindings/clock/exynos5420-clock.txt [deleted file]
Documentation/devicetree/bindings/clock/idt,versaclock5.yaml
Documentation/devicetree/bindings/clock/qcom,a53pll.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-sm6115.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/qcom,gcc-sm6350.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/qcom,gcc.yaml
Documentation/devicetree/bindings/clock/qcom,gpucc.yaml
Documentation/devicetree/bindings/clock/qcom,mmcc.yaml
Documentation/devicetree/bindings/clock/qcom,rpmcc.txt
Documentation/devicetree/bindings/clock/qcom,rpmhcc.yaml
Documentation/devicetree/bindings/clock/qcom,sc7280-dispcc.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/qcom,videocc.yaml
Documentation/devicetree/bindings/clock/rockchip,rk3399-cru.txt [deleted file]
Documentation/devicetree/bindings/clock/rockchip,rk3399-cru.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/samsung,exynos-audss-clock.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/samsung,exynos-clock.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/samsung,exynos-ext-clock.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/samsung,exynos4412-isp-clock.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/samsung,s5pv210-audss-clock.yaml [new file with mode: 0644]
MAINTAINERS
drivers/acpi/acpi_lpss.c
drivers/base/power/clock_ops.c
drivers/base/power/runtime.c
drivers/clk/at91/clk-generated.c
drivers/clk/at91/sama7g5.c
drivers/clk/bcm/clk-bcm2835.c
drivers/clk/clk-divider.c
drivers/clk/clk-fractional-divider.c
drivers/clk/clk-fractional-divider.h [new file with mode: 0644]
drivers/clk/clk-lmk04832.c
drivers/clk/clk-palmas.c
drivers/clk/clk-stm32f4.c
drivers/clk/clk-stm32h7.c
drivers/clk/clk-stm32mp1.c
drivers/clk/clk-versaclock5.c
drivers/clk/imx/clk-composite-7ulp.c
drivers/clk/imx/clk-composite-8m.c
drivers/clk/imx/clk-divider-gate.c
drivers/clk/imx/clk-imx8mm.c
drivers/clk/imx/clk-imx8mn.c
drivers/clk/imx/clk-imx8mq.c
drivers/clk/imx/clk.h
drivers/clk/mediatek/Kconfig
drivers/clk/mediatek/Makefile
drivers/clk/mediatek/clk-cpumux.c
drivers/clk/mediatek/clk-mt8192-aud.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8192-cam.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8192-img.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8192-imp_iic_wrap.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8192-ipe.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8192-mdp.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8192-mfg.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8192-mm.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8192-msdc.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8192-scp_adsp.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8192-vdec.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8192-venc.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8192.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-mux.h
drivers/clk/mediatek/clk-pll.c
drivers/clk/mediatek/reset.c
drivers/clk/mvebu/kirkwood.c
drivers/clk/qcom/Kconfig
drivers/clk/qcom/Makefile
drivers/clk/qcom/a53-pll.c
drivers/clk/qcom/apcs-msm8916.c
drivers/clk/qcom/camcc-sc7180.c
drivers/clk/qcom/clk-rpmh.c
drivers/clk/qcom/clk-smd-rpm.c
drivers/clk/qcom/dispcc-sc7280.c [new file with mode: 0644]
drivers/clk/qcom/dispcc-sm8250.c
drivers/clk/qcom/gcc-msm8953.c [new file with mode: 0644]
drivers/clk/qcom/gcc-sdm660.c
drivers/clk/qcom/gcc-sm6115.c [new file with mode: 0644]
drivers/clk/qcom/gcc-sm6350.c [new file with mode: 0644]
drivers/clk/qcom/gpucc-sc7280.c [new file with mode: 0644]
drivers/clk/qcom/gpucc-sm8150.c
drivers/clk/qcom/lpass-gfm-sm8250.c
drivers/clk/qcom/lpasscorecc-sc7180.c
drivers/clk/qcom/mmcc-msm8994.c [new file with mode: 0644]
drivers/clk/qcom/mss-sc7180.c
drivers/clk/qcom/q6sstop-qcs404.c
drivers/clk/qcom/turingcc-qcs404.c
drivers/clk/qcom/videocc-sc7280.c [new file with mode: 0644]
drivers/clk/ralink/clk-mt7621.c
drivers/clk/renesas/Kconfig
drivers/clk/renesas/Makefile
drivers/clk/renesas/r8a774a1-cpg-mssr.c
drivers/clk/renesas/r8a774b1-cpg-mssr.c
drivers/clk/renesas/r8a774c0-cpg-mssr.c
drivers/clk/renesas/r8a774e1-cpg-mssr.c
drivers/clk/renesas/r8a779a0-cpg-mssr.c
drivers/clk/renesas/r9a07g044-cpg.c
drivers/clk/renesas/renesas-rzg2l-cpg.c [deleted file]
drivers/clk/renesas/renesas-rzg2l-cpg.h [deleted file]
drivers/clk/renesas/rzg2l-cpg.c [new file with mode: 0644]
drivers/clk/renesas/rzg2l-cpg.h [new file with mode: 0644]
drivers/clk/rockchip/clk-pll.c
drivers/clk/rockchip/clk-rk3036.c
drivers/clk/rockchip/clk-rk3308.c
drivers/clk/rockchip/clk.c
drivers/clk/socfpga/clk-agilex.c
drivers/clk/tegra/clk-dfll.c
drivers/clk/tegra/clk-tegra-periph.c
drivers/clk/x86/Makefile
drivers/clk/x86/clk-lpss-atom.c [new file with mode: 0644]
drivers/clk/x86/clk-lpt.c [deleted file]
drivers/clk/zynqmp/clk-gate-zynqmp.c
drivers/clk/zynqmp/clk-mux-zynqmp.c
drivers/clk/zynqmp/clk-zynqmp.h
drivers/clk/zynqmp/clkc.c
drivers/mfd/intel-lpss.c
include/dt-bindings/clock/imx8mn-clock.h
include/dt-bindings/clock/mt8192-clk.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,dispcc-sc7280.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,gcc-msm8953.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,gcc-sc7280.h
include/dt-bindings/clock/qcom,gcc-sm6115.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,gcc-sm6350.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,gpucc-sc7280.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,mmcc-msm8994.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,rpmcc.h
include/dt-bindings/clock/qcom,rpmh.h
include/dt-bindings/clock/qcom,videocc-sc7280.h [new file with mode: 0644]
include/dt-bindings/clock/rk3036-cru.h
include/linux/clk-provider.h
include/linux/platform_data/x86/clk-lpss.h
include/linux/pm_clock.h
include/linux/pm_runtime.h
include/linux/soc/qcom/smd-rpm.h

index b32d374..699776b 100644 (file)
@@ -13,6 +13,7 @@ Required Properties:
        - "mediatek,mt7623-audsys", "mediatek,mt2701-audsys", "syscon"
        - "mediatek,mt8167-audiosys", "syscon"
        - "mediatek,mt8183-audiosys", "syscon"
+       - "mediatek,mt8192-audsys", "syscon"
        - "mediatek,mt8516-audsys", "syscon"
 - #clock-cells: Must be 1
 
index 2d4ff0c..f9ffa5b 100644 (file)
@@ -29,6 +29,7 @@ properties:
               - mediatek,mt8167-mmsys
               - mediatek,mt8173-mmsys
               - mediatek,mt8183-mmsys
+              - mediatek,mt8192-mmsys
               - mediatek,mt8365-mmsys
           - const: syscon
       - items:
diff --git a/Documentation/devicetree/bindings/arm/mediatek/mediatek,mt8192-clock.yaml b/Documentation/devicetree/bindings/arm/mediatek/mediatek,mt8192-clock.yaml
new file mode 100644 (file)
index 0000000..c8c67c0
--- /dev/null
@@ -0,0 +1,199 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: "http://devicetree.org/schemas/arm/mediatek/mediatek,mt8192-clock.yaml#"
+$schema: "http://devicetree.org/meta-schemas/core.yaml#"
+
+title: MediaTek Functional Clock Controller for MT8192
+
+maintainers:
+  - Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+description:
+  The Mediatek functional clock controller provides various clocks on MT8192.
+
+properties:
+  compatible:
+    items:
+      - enum:
+          - mediatek,mt8192-scp_adsp
+          - mediatek,mt8192-imp_iic_wrap_c
+          - mediatek,mt8192-imp_iic_wrap_e
+          - mediatek,mt8192-imp_iic_wrap_s
+          - mediatek,mt8192-imp_iic_wrap_ws
+          - mediatek,mt8192-imp_iic_wrap_w
+          - mediatek,mt8192-imp_iic_wrap_n
+          - mediatek,mt8192-msdc_top
+          - mediatek,mt8192-msdc
+          - mediatek,mt8192-mfgcfg
+          - mediatek,mt8192-imgsys
+          - mediatek,mt8192-imgsys2
+          - mediatek,mt8192-vdecsys_soc
+          - mediatek,mt8192-vdecsys
+          - mediatek,mt8192-vencsys
+          - mediatek,mt8192-camsys
+          - mediatek,mt8192-camsys_rawa
+          - mediatek,mt8192-camsys_rawb
+          - mediatek,mt8192-camsys_rawc
+          - mediatek,mt8192-ipesys
+          - mediatek,mt8192-mdpsys
+
+  reg:
+    maxItems: 1
+
+  '#clock-cells':
+    const: 1
+
+required:
+  - compatible
+  - reg
+
+additionalProperties: false
+
+examples:
+  - |
+    scp_adsp: clock-controller@10720000 {
+        compatible = "mediatek,mt8192-scp_adsp";
+        reg = <0x10720000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    imp_iic_wrap_c: clock-controller@11007000 {
+        compatible = "mediatek,mt8192-imp_iic_wrap_c";
+        reg = <0x11007000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    imp_iic_wrap_e: clock-controller@11cb1000 {
+        compatible = "mediatek,mt8192-imp_iic_wrap_e";
+        reg = <0x11cb1000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    imp_iic_wrap_s: clock-controller@11d03000 {
+        compatible = "mediatek,mt8192-imp_iic_wrap_s";
+        reg = <0x11d03000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    imp_iic_wrap_ws: clock-controller@11d23000 {
+        compatible = "mediatek,mt8192-imp_iic_wrap_ws";
+        reg = <0x11d23000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    imp_iic_wrap_w: clock-controller@11e01000 {
+        compatible = "mediatek,mt8192-imp_iic_wrap_w";
+        reg = <0x11e01000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    imp_iic_wrap_n: clock-controller@11f02000 {
+        compatible = "mediatek,mt8192-imp_iic_wrap_n";
+        reg = <0x11f02000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    msdc_top: clock-controller@11f10000 {
+        compatible = "mediatek,mt8192-msdc_top";
+        reg = <0x11f10000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    msdc: clock-controller@11f60000 {
+        compatible = "mediatek,mt8192-msdc";
+        reg = <0x11f60000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    mfgcfg: clock-controller@13fbf000 {
+        compatible = "mediatek,mt8192-mfgcfg";
+        reg = <0x13fbf000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    imgsys: clock-controller@15020000 {
+        compatible = "mediatek,mt8192-imgsys";
+        reg = <0x15020000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    imgsys2: clock-controller@15820000 {
+        compatible = "mediatek,mt8192-imgsys2";
+        reg = <0x15820000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    vdecsys_soc: clock-controller@1600f000 {
+        compatible = "mediatek,mt8192-vdecsys_soc";
+        reg = <0x1600f000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    vdecsys: clock-controller@1602f000 {
+        compatible = "mediatek,mt8192-vdecsys";
+        reg = <0x1602f000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    vencsys: clock-controller@17000000 {
+        compatible = "mediatek,mt8192-vencsys";
+        reg = <0x17000000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    camsys: clock-controller@1a000000 {
+        compatible = "mediatek,mt8192-camsys";
+        reg = <0x1a000000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    camsys_rawa: clock-controller@1a04f000 {
+        compatible = "mediatek,mt8192-camsys_rawa";
+        reg = <0x1a04f000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    camsys_rawb: clock-controller@1a06f000 {
+        compatible = "mediatek,mt8192-camsys_rawb";
+        reg = <0x1a06f000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    camsys_rawc: clock-controller@1a08f000 {
+        compatible = "mediatek,mt8192-camsys_rawc";
+        reg = <0x1a08f000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    ipesys: clock-controller@1b000000 {
+        compatible = "mediatek,mt8192-ipesys";
+        reg = <0x1b000000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    mdpsys: clock-controller@1f000000 {
+        compatible = "mediatek,mt8192-mdpsys";
+        reg = <0x1f000000 0x1000>;
+        #clock-cells = <1>;
+    };
diff --git a/Documentation/devicetree/bindings/arm/mediatek/mediatek,mt8192-sys-clock.yaml b/Documentation/devicetree/bindings/arm/mediatek/mediatek,mt8192-sys-clock.yaml
new file mode 100644 (file)
index 0000000..5705bcf
--- /dev/null
@@ -0,0 +1,65 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: "http://devicetree.org/schemas/arm/mediatek/mediatek,mt8192-sys-clock.yaml#"
+$schema: "http://devicetree.org/meta-schemas/core.yaml#"
+
+title: MediaTek System Clock Controller for MT8192
+
+maintainers:
+  - Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+description:
+  The Mediatek system clock controller provides various clocks and system configuration
+  like reset and bus protection on MT8192.
+
+properties:
+  compatible:
+    items:
+      - enum:
+          - mediatek,mt8192-topckgen
+          - mediatek,mt8192-infracfg
+          - mediatek,mt8192-pericfg
+          - mediatek,mt8192-apmixedsys
+      - const: syscon
+
+  reg:
+    maxItems: 1
+
+  '#clock-cells':
+    const: 1
+
+required:
+  - compatible
+  - reg
+
+additionalProperties: false
+
+examples:
+  - |
+    topckgen: syscon@10000000 {
+        compatible = "mediatek,mt8192-topckgen", "syscon";
+        reg = <0x10000000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    infracfg: syscon@10001000 {
+        compatible = "mediatek,mt8192-infracfg", "syscon";
+        reg = <0x10001000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    pericfg: syscon@10003000 {
+        compatible = "mediatek,mt8192-pericfg", "syscon";
+        reg = <0x10003000 0x1000>;
+        #clock-cells = <1>;
+    };
+
+  - |
+    apmixedsys: syscon@1000c000 {
+        compatible = "mediatek,mt8192-apmixedsys", "syscon";
+        reg = <0x1000c000 0x1000>;
+        #clock-cells = <1>;
+    };
index 1174c9a..5ad147d 100644 (file)
@@ -61,13 +61,30 @@ properties:
     maxItems: 1
 
   '#clock-cells':
-    const: 1
+    true
 
   clock-output-names:
     minItems: 1
     maxItems: 45
 
 allOf:
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - brcm,cygnus-armpll
+              - brcm,nsp-armpll
+    then:
+      properties:
+        '#clock-cells':
+          const: 0
+    else:
+      properties:
+        '#clock-cells':
+          const: 1
+      required:
+        - clock-output-names
   - if:
       properties:
         compatible:
@@ -358,7 +375,6 @@ required:
   - reg
   - clocks
   - '#clock-cells'
-  - clock-output-names
 
 additionalProperties: false
 
@@ -392,3 +408,10 @@ examples:
         clocks = <&osc2>;
         clock-output-names = "keypad", "adc/touch", "pwm";
     };
+  - |
+    arm_clk@0 {
+        #clock-cells = <0>;
+        compatible = "brcm,nsp-armpll";
+        clocks = <&osc>;
+        reg = <0x0 0x1000>;
+    };
diff --git a/Documentation/devicetree/bindings/clock/clk-exynos-audss.txt b/Documentation/devicetree/bindings/clock/clk-exynos-audss.txt
deleted file mode 100644 (file)
index 6030afb..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-* Samsung Audio Subsystem Clock Controller
-
-The Samsung Audio Subsystem clock controller generates and supplies clocks
-to Audio Subsystem block available in the S5PV210 and Exynos SoCs. The clock
-binding described here is applicable to all SoCs in Exynos family.
-
-Required Properties:
-
-- compatible: should be one of the following:
-  - "samsung,exynos4210-audss-clock" - controller compatible with all Exynos4 SoCs.
-  - "samsung,exynos5250-audss-clock" - controller compatible with Exynos5250
-    SoCs.
-  - "samsung,exynos5410-audss-clock" - controller compatible with Exynos5410
-    SoCs.
-  - "samsung,exynos5420-audss-clock" - controller compatible with Exynos5420
-    SoCs.
-- reg: physical base address and length of the controller's register set.
-
-- #clock-cells: should be 1.
-
-- clocks:
-  - pll_ref: Fixed rate PLL reference clock, parent of mout_audss. "fin_pll"
-    is used if not specified.
-  - pll_in: Input PLL to the AudioSS block, parent of mout_audss. "fout_epll"
-    is used if not specified.
-  - cdclk: External i2s clock, parent of mout_i2s. "cdclk0" is used if not
-    specified.
-  - sclk_audio: Audio bus clock, parent of mout_i2s. "sclk_audio0" is used if
-    not specified.
-  - sclk_pcm_in: PCM clock, parent of sclk_pcm.  "sclk_pcm0" is used if not
-    specified.
-
-- clock-names: Aliases for the above clocks. They should be "pll_ref",
-  "pll_in", "cdclk", "sclk_audio", and "sclk_pcm_in" respectively.
-
-Optional Properties:
-
-  - power-domains: a phandle to respective power domain node as described by
-    generic PM domain bindings (see power/power_domain.txt for more
-    information).
-
-The following is the list of clocks generated by the controller. Each clock is
-assigned an identifier and client nodes use this identifier to specify the
-clock which they consume. Some of the clocks are available only on a particular
-Exynos4 SoC and this is specified where applicable.
-
-Provided clocks:
-
-Clock           ID      SoC (if specific)
------------------------------------------------
-
-mout_audss      0
-mout_i2s        1
-dout_srp        2
-dout_aud_bus    3
-dout_i2s        4
-srp_clk         5
-i2s_bus         6
-sclk_i2s        7
-pcm_bus         8
-sclk_pcm        9
-adma            10      Exynos5420
-
-Example 1: An example of a clock controller node using the default input
-          clock names is listed below.
-
-clock_audss: audss-clock-controller@3810000 {
-       compatible = "samsung,exynos5250-audss-clock";
-       reg = <0x03810000 0x0C>;
-       #clock-cells = <1>;
-};
-
-Example 2: An example of a clock controller node with the input clocks
-           specified.
-
-clock_audss: audss-clock-controller@3810000 {
-       compatible = "samsung,exynos5250-audss-clock";
-       reg = <0x03810000 0x0C>;
-       #clock-cells = <1>;
-       clocks = <&clock 1>, <&clock 7>, <&clock 138>, <&clock 160>,
-               <&ext_i2s_clk>;
-       clock-names = "pll_ref", "pll_in", "sclk_audio", "sclk_pcm_in", "cdclk";
-};
-
-Example 3: I2S controller node that consumes the clock generated by the clock
-           controller. Refer to the standard clock bindings for information
-           about 'clocks' and 'clock-names' property.
-
-i2s0: i2s@3830000 {
-       compatible = "samsung,i2s-v5";
-       reg = <0x03830000 0x100>;
-       dmas = <&pdma0 10
-               &pdma0 9
-               &pdma0 8>;
-       dma-names = "tx", "rx", "tx-sec";
-       clocks = <&clock_audss EXYNOS_I2S_BUS>,
-               <&clock_audss EXYNOS_I2S_BUS>,
-               <&clock_audss EXYNOS_SCLK_I2S>,
-               <&clock_audss EXYNOS_MOUT_AUDSS>,
-               <&clock_audss EXYNOS_MOUT_I2S>;
-       clock-names = "iis", "i2s_opclk0", "i2s_opclk1",
-                     "mout_audss", "mout_i2s";
-};
diff --git a/Documentation/devicetree/bindings/clock/clk-s5pv210-audss.txt b/Documentation/devicetree/bindings/clock/clk-s5pv210-audss.txt
deleted file mode 100644 (file)
index f6272dc..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-* Samsung Audio Subsystem Clock Controller
-
-The Samsung Audio Subsystem clock controller generates and supplies clocks
-to Audio Subsystem block available in the S5PV210 and compatible SoCs.
-
-Required Properties:
-
-- compatible: should be "samsung,s5pv210-audss-clock".
-- reg: physical base address and length of the controller's register set.
-
-- #clock-cells: should be 1.
-
-- clocks:
-  - hclk: AHB bus clock of the Audio Subsystem.
-  - xxti: Optional fixed rate PLL reference clock, parent of mout_audss. If
-    not specified (i.e. xusbxti is used for PLL reference), it is fixed to
-    a clock named "xxti".
-  - fout_epll: Input PLL to the AudioSS block, parent of mout_audss.
-  - iiscdclk0: Optional external i2s clock, parent of mout_i2s. If not
-    specified, it is fixed to a clock named "iiscdclk0".
-  - sclk_audio0: Audio bus clock, parent of mout_i2s.
-
-- clock-names: Aliases for the above clocks. They should be "hclk",
-  "xxti", "fout_epll", "iiscdclk0", and "sclk_audio0" respectively.
-
-All available clocks are defined as preprocessor macros in
-dt-bindings/clock/s5pv210-audss-clk.h header and can be used in device
-tree sources.
-
-Example: Clock controller node.
-
-       clk_audss: clock-controller@c0900000 {
-               compatible = "samsung,s5pv210-audss-clock";
-               reg = <0xc0900000 0x1000>;
-               #clock-cells = <1>;
-               clock-names = "hclk", "xxti",
-                               "fout_epll", "sclk_audio0";
-               clocks = <&clocks DOUT_HCLKP>, <&xxti>,
-                               <&clocks FOUT_EPLL>, <&clocks SCLK_AUDIO0>;
-       };
-
-Example: I2S controller node that consumes the clock generated by the clock
-        controller. Refer to the standard clock bindings for information
-         about 'clocks' and 'clock-names' property.
-
-       i2s0: i2s@3830000 {
-               /* ... */
-               clock-names = "iis", "i2s_opclk0",
-                               "i2s_opclk1";
-               clocks = <&clk_audss CLK_I2S>, <&clk_audss CLK_I2S>,
-                               <&clk_audss CLK_DOUT_AUD_BUS>;
-               /* ... */
-       };
diff --git a/Documentation/devicetree/bindings/clock/exynos3250-clock.txt b/Documentation/devicetree/bindings/clock/exynos3250-clock.txt
deleted file mode 100644 (file)
index 7441ed5..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-* Samsung Exynos3250 Clock Controller
-
-The Exynos3250 clock controller generates and supplies clock to various
-controllers within the Exynos3250 SoC.
-
-Required Properties:
-
-- compatible: should be one of the following.
-  - "samsung,exynos3250-cmu" - controller compatible with Exynos3250 SoC.
-  - "samsung,exynos3250-cmu-dmc" - controller compatible with
-    Exynos3250 SoC for Dynamic Memory Controller domain.
-  - "samsung,exynos3250-cmu-isp" - ISP block clock controller compatible
-     with Exynos3250 SOC
-
-- reg: physical base address of the controller and length of memory mapped
-  region.
-
-- #clock-cells: should be 1.
-
-Each clock is assigned an identifier and client nodes can use this identifier
-to specify the clock which they consume.
-
-All available clocks are defined as preprocessor macros in
-dt-bindings/clock/exynos3250.h header and can be used in device
-tree sources.
-
-Example 1: Examples of clock controller nodes are listed below.
-
-       cmu: clock-controller@10030000 {
-               compatible = "samsung,exynos3250-cmu";
-               reg = <0x10030000 0x20000>;
-               #clock-cells = <1>;
-       };
-
-       cmu_dmc: clock-controller@105c0000 {
-               compatible = "samsung,exynos3250-cmu-dmc";
-               reg = <0x105C0000 0x2000>;
-               #clock-cells = <1>;
-       };
-
-       cmu_isp: clock-controller@10048000 {
-               compatible = "samsung,exynos3250-cmu-isp";
-               reg = <0x10048000 0x1000>;
-               #clock-cells = <1>;
-       };
-
-Example 2: UART controller node that consumes the clock generated by the clock
-          controller. Refer to the standard clock bindings for information
-          about 'clocks' and 'clock-names' property.
-
-       serial@13800000 {
-               compatible = "samsung,exynos4210-uart";
-               reg = <0x13800000 0x100>;
-               interrupts = <0 109 0>;
-               clocks = <&cmu CLK_UART0>, <&cmu CLK_SCLK_UART0>;
-               clock-names = "uart", "clk_uart_baud0";
-       };
diff --git a/Documentation/devicetree/bindings/clock/exynos4-clock.txt b/Documentation/devicetree/bindings/clock/exynos4-clock.txt
deleted file mode 100644 (file)
index 17bb113..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-* Samsung Exynos4 Clock Controller
-
-The Exynos4 clock controller generates and supplies clock to various controllers
-within the Exynos4 SoC. The clock binding described here is applicable to all
-SoC's in the Exynos4 family.
-
-Required Properties:
-
-- compatible: should be one of the following.
-  - "samsung,exynos4210-clock" - controller compatible with Exynos4210 SoC.
-  - "samsung,exynos4412-clock" - controller compatible with Exynos4412 SoC.
-
-- reg: physical base address of the controller and length of memory mapped
-  region.
-
-- #clock-cells: should be 1.
-
-Each clock is assigned an identifier and client nodes can use this identifier
-to specify the clock which they consume.
-
-All available clocks are defined as preprocessor macros in
-dt-bindings/clock/exynos4.h header and can be used in device
-tree sources.
-
-Example 1: An example of a clock controller node is listed below.
-
-       clock: clock-controller@10030000 {
-               compatible = "samsung,exynos4210-clock";
-               reg = <0x10030000 0x20000>;
-               #clock-cells = <1>;
-       };
-
-Example 2: UART controller node that consumes the clock generated by the clock
-          controller. Refer to the standard clock bindings for information
-          about 'clocks' and 'clock-names' property.
-
-       serial@13820000 {
-               compatible = "samsung,exynos4210-uart";
-               reg = <0x13820000 0x100>;
-               interrupts = <0 54 0>;
-               clocks = <&clock CLK_UART2>, <&clock CLK_SCLK_UART2>;
-               clock-names = "uart", "clk_uart_baud0";
-       };
-
-Exynos4412 SoC contains some additional clocks for FIMC-ISP (Camera ISP)
-subsystem. Registers for those clocks are located in the ISP power domain.
-Because those registers are also located in a different memory region than
-the main clock controller, a separate clock controller has to be defined for
-handling them.
-
-Required Properties:
-
-- compatible: should be "samsung,exynos4412-isp-clock".
-
-- reg: physical base address of the ISP clock controller and length of memory
-  mapped region.
-
-- #clock-cells: should be 1.
-
-- clocks: list of the clock controller input clock identifiers,
-  from common clock bindings, should point to CLK_ACLK200 and
-  CLK_ACLK400_MCUISP clocks from the main clock controller.
-
-- clock-names: list of the clock controller input clock names,
-  as described in clock-bindings.txt, should be "aclk200" and
-  "aclk400_mcuisp".
-
-- power-domains: a phandle to ISP power domain node as described by
-  generic PM domain bindings.
-
-Example 3: The clock controllers bindings for Exynos4412 SoCs.
-
-       clock: clock-controller@10030000 {
-               compatible = "samsung,exynos4412-clock";
-               reg = <0x10030000 0x18000>;
-               #clock-cells = <1>;
-       };
-
-       isp_clock: clock-controller@10048000 {
-               compatible = "samsung,exynos4412-isp-clock";
-               reg = <0x10048000 0x1000>;
-               #clock-cells = <1>;
-               power-domains = <&pd_isp>;
-               clocks = <&clock CLK_ACLK200>, <&clock CLK_ACLK400_MCUISP>;
-               clock-names = "aclk200", "aclk400_mcuisp";
-       };
diff --git a/Documentation/devicetree/bindings/clock/exynos5250-clock.txt b/Documentation/devicetree/bindings/clock/exynos5250-clock.txt
deleted file mode 100644 (file)
index aff266a..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-* Samsung Exynos5250 Clock Controller
-
-The Exynos5250 clock controller generates and supplies clock to various
-controllers within the Exynos5250 SoC.
-
-Required Properties:
-
-- compatible: should be one of the following.
-  - "samsung,exynos5250-clock" - controller compatible with Exynos5250 SoC.
-
-- reg: physical base address of the controller and length of memory mapped
-  region.
-
-- #clock-cells: should be 1.
-
-Each clock is assigned an identifier and client nodes can use this identifier
-to specify the clock which they consume.
-
-All available clocks are defined as preprocessor macros in
-dt-bindings/clock/exynos5250.h header and can be used in device
-tree sources.
-
-Example 1: An example of a clock controller node is listed below.
-
-       clock: clock-controller@10010000 {
-               compatible = "samsung,exynos5250-clock";
-               reg = <0x10010000 0x30000>;
-               #clock-cells = <1>;
-       };
-
-Example 2: UART controller node that consumes the clock generated by the clock
-          controller. Refer to the standard clock bindings for information
-          about 'clocks' and 'clock-names' property.
-
-       serial@13820000 {
-               compatible = "samsung,exynos4210-uart";
-               reg = <0x13820000 0x100>;
-               interrupts = <0 54 0>;
-               clocks = <&clock CLK_UART2>, <&clock CLK_SCLK_UART2>;
-               clock-names = "uart", "clk_uart_baud0";
-       };
diff --git a/Documentation/devicetree/bindings/clock/exynos5420-clock.txt b/Documentation/devicetree/bindings/clock/exynos5420-clock.txt
deleted file mode 100644 (file)
index 717a7b1..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-* Samsung Exynos5420 Clock Controller
-
-The Exynos5420 clock controller generates and supplies clock to various
-controllers within the Exynos5420 SoC and for the Exynos5800 SoC.
-
-Required Properties:
-
-- compatible: should be one of the following.
-  - "samsung,exynos5420-clock" - controller compatible with Exynos5420 SoC.
-  - "samsung,exynos5800-clock" - controller compatible with Exynos5800 SoC.
-
-- reg: physical base address of the controller and length of memory mapped
-  region.
-
-- #clock-cells: should be 1.
-
-Each clock is assigned an identifier and client nodes can use this identifier
-to specify the clock which they consume.
-
-All available clocks are defined as preprocessor macros in
-dt-bindings/clock/exynos5420.h header and can be used in device
-tree sources.
-
-Example 1: An example of a clock controller node is listed below.
-
-       clock: clock-controller@10010000 {
-               compatible = "samsung,exynos5420-clock";
-               reg = <0x10010000 0x30000>;
-               #clock-cells = <1>;
-       };
-
-Example 2: UART controller node that consumes the clock generated by the clock
-          controller. Refer to the standard clock bindings for information
-          about 'clocks' and 'clock-names' property.
-
-       serial@13820000 {
-               compatible = "samsung,exynos4210-uart";
-               reg = <0x13820000 0x100>;
-               interrupts = <0 54 0>;
-               clocks = <&clock CLK_UART2>, <&clock CLK_SCLK_UART2>;
-               clock-names = "uart", "clk_uart_baud0";
-       };
index 26ed040..ffd6ae0 100644 (file)
@@ -30,6 +30,20 @@ description: |
     3 -- OUT3
     4 -- OUT4
 
+  The idt,shutdown and idt,output-enable-active properties control the
+  SH (en_global_shutdown) and SP bits of the Primary Source and Shutdown
+  Register, respectively. Their behavior is summarized by the following
+  table:
+
+  SH SP Output when the SD/OE pin is Low/High
+  == == =====================================
+   0  0 Active/Inactive
+   0  1 Inactive/Active
+   1  0 Active/Shutdown
+   1  1 Inactive/Shutdown
+
+  The case where SH and SP are both 1 is likely not very interesting.
+
 maintainers:
   - Luca Ceresoli <luca@lucaceresoli.net>
 
@@ -64,6 +78,26 @@ properties:
     maximum: 22760
     description: Optional load capacitor for XTAL1 and XTAL2
 
+  idt,shutdown:
+    $ref: /schemas/types.yaml#/definitions/uint32
+    enum: [0, 1]
+    description: |
+      If 1, this enables the shutdown functionality: the chip will be
+      shut down if the SD/OE pin is driven high. If 0, this disables the
+      shutdown functionality: the chip will never be shut down based on
+      the value of the SD/OE pin. This property corresponds to the SH
+      bit of the Primary Source and Shutdown Register.
+
+  idt,output-enable-active:
+    $ref: /schemas/types.yaml#/definitions/uint32
+    enum: [0, 1]
+    description: |
+      If 1, this enables output when the SD/OE pin is high, and disables
+      output when the SD/OE pin is low. If 0, this disables output when
+      the SD/OE pin is high, and enables output when the SD/OE pin is
+      low. This corresponds to the SP bit of the Primary Source and
+      Shutdown Register.
+
 patternProperties:
   "^OUT[1-4]$":
     type: object
@@ -90,6 +124,8 @@ required:
   - compatible
   - reg
   - '#clock-cells'
+  - idt,shutdown
+  - idt,output-enable-active
 
 allOf:
   - if:
@@ -139,6 +175,10 @@ examples:
             clocks = <&ref25m>;
             clock-names = "xin";
 
+            /* Set the SD/OE pin's settings */
+            idt,shutdown = <0>;
+            idt,output-enable-active = <0>;
+
             OUT1 {
                 idt,mode = <VC5_CMOSD>;
                 idt,voltage-microvolt = <1800000>;
index db3d0ea..fbd7584 100644 (file)
@@ -18,6 +18,7 @@ properties:
     enum:
       - qcom,ipq6018-a53pll
       - qcom,msm8916-a53pll
+      - qcom,msm8939-a53pll
 
   reg:
     maxItems: 1
@@ -33,6 +34,8 @@ properties:
     items:
       - const: xo
 
+  operating-points-v2: true
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/clock/qcom,gcc-sm6115.yaml b/Documentation/devicetree/bindings/clock/qcom,gcc-sm6115.yaml
new file mode 100644 (file)
index 0000000..26050da
--- /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-sm6115.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm Global Clock & Reset Controller Binding for SM6115 and SM4250
+
+maintainers:
+  - Iskren Chernev <iskren.chernev@gmail.com>
+
+description: |
+  Qualcomm global clock control module which supports the clocks, resets and
+  power domains on SM4250/6115.
+
+  See also:
+  - dt-bindings/clock/qcom,gcc-sm6115.h
+
+properties:
+  compatible:
+    const: qcom,gcc-sm6115
+
+  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-sm6115";
+        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>;
+    };
+...
diff --git a/Documentation/devicetree/bindings/clock/qcom,gcc-sm6350.yaml b/Documentation/devicetree/bindings/clock/qcom,gcc-sm6350.yaml
new file mode 100644 (file)
index 0000000..20926cd
--- /dev/null
@@ -0,0 +1,76 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/qcom,gcc-sm6350.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm Global Clock & Reset Controller Binding for SM6350
+
+maintainers:
+  - Konrad Dybcio <konrad.dybcio@somainline.org>
+
+description: |
+  Qualcomm global clock control module which supports the clocks, resets and
+  power domains on SM6350.
+
+  See also:
+  - dt-bindings/clock/qcom,gcc-sm6350.h
+
+properties:
+  compatible:
+    const: qcom,gcc-sm6350
+
+  clocks:
+    items:
+      - description: Board XO source
+      - description: Board active XO 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
+
+  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,rpmh.h>
+    clock-controller@100000 {
+      compatible = "qcom,gcc-sm6350";
+      reg = <0x00100000 0x1f0000>;
+      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>;
+    };
+...
index 8453eed..2f20f8a 100644 (file)
@@ -23,6 +23,7 @@ description: |
   - dt-bindings/clock/qcom,gcc-ipq806x.h (qcom,gcc-ipq8064)
   - dt-bindings/reset/qcom,gcc-ipq806x.h (qcom,gcc-ipq8064)
   - dt-bindings/clock/qcom,gcc-msm8939.h
+  - dt-bindings/clock/qcom,gcc-msm8953.h
   - dt-bindings/reset/qcom,gcc-msm8939.h
   - dt-bindings/clock/qcom,gcc-msm8660.h
   - dt-bindings/reset/qcom,gcc-msm8660.h
@@ -46,6 +47,7 @@ properties:
       - qcom,gcc-msm8660
       - qcom,gcc-msm8916
       - qcom,gcc-msm8939
+      - qcom,gcc-msm8953
       - qcom,gcc-msm8960
       - qcom,gcc-msm8974
       - qcom,gcc-msm8974pro
index df943c4..46dff46 100644 (file)
@@ -1,4 +1,4 @@
-# SPDX-License-Identifier: GPL-2.0-only
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
 %YAML 1.2
 ---
 $id: http://devicetree.org/schemas/clock/qcom,gpucc.yaml#
@@ -11,11 +11,12 @@ maintainers:
 
 description: |
   Qualcomm graphics clock control module which supports the clocks, resets and
-  power domains on SDM845/SC7180/SM8150/SM8250.
+  power domains on Qualcomm SoCs.
 
   See also:
     dt-bindings/clock/qcom,gpucc-sdm845.h
     dt-bindings/clock/qcom,gpucc-sc7180.h
+    dt-bindings/clock/qcom,gpucc-sc7280.h
     dt-bindings/clock/qcom,gpucc-sm8150.h
     dt-bindings/clock/qcom,gpucc-sm8250.h
 
@@ -24,6 +25,8 @@ properties:
     enum:
       - qcom,sdm845-gpucc
       - qcom,sc7180-gpucc
+      - qcom,sc7280-gpucc
+      - qcom,sc8180x-gpucc
       - qcom,sm8150-gpucc
       - qcom,sm8250-gpucc
 
index 8b0b1c5..68fdc3d 100644 (file)
@@ -22,6 +22,8 @@ properties:
       - qcom,mmcc-msm8660
       - qcom,mmcc-msm8960
       - qcom,mmcc-msm8974
+      - qcom,mmcc-msm8992
+      - qcom,mmcc-msm8994
       - qcom,mmcc-msm8996
       - qcom,mmcc-msm8998
       - qcom,mmcc-sdm630
index 6cf5a7e..a487788 100644 (file)
@@ -10,11 +10,13 @@ Required properties :
 - compatible : shall contain only one of the following. The generic
                compatible "qcom,rpmcc" should be also included.
 
+                       "qcom,rpmcc-mdm9607", "qcom,rpmcc"
                        "qcom,rpmcc-msm8660", "qcom,rpmcc"
                        "qcom,rpmcc-apq8060", "qcom,rpmcc"
                        "qcom,rpmcc-msm8226", "qcom,rpmcc"
                        "qcom,rpmcc-msm8916", "qcom,rpmcc"
                        "qcom,rpmcc-msm8936", "qcom,rpmcc"
+                       "qcom,rpmcc-msm8953", "qcom,rpmcc"
                        "qcom,rpmcc-msm8974", "qcom,rpmcc"
                        "qcom,rpmcc-msm8976", "qcom,rpmcc"
                        "qcom,rpmcc-apq8064", "qcom,rpmcc"
@@ -25,6 +27,8 @@ Required properties :
                        "qcom,rpmcc-msm8998", "qcom,rpmcc"
                        "qcom,rpmcc-qcs404", "qcom,rpmcc"
                        "qcom,rpmcc-sdm660", "qcom,rpmcc"
+                       "qcom,rpmcc-sm6115", "qcom,rpmcc"
+                       "qcom,rpmcc-sm6125", "qcom,rpmcc"
 
 - #clock-cells : shall contain 1
 
index 9ea0b3f..7221297 100644 (file)
@@ -22,6 +22,7 @@ properties:
       - qcom,sc8180x-rpmh-clk
       - qcom,sdm845-rpmh-clk
       - qcom,sdx55-rpmh-clk
+      - qcom,sm6350-rpmh-clk
       - qcom,sm8150-rpmh-clk
       - qcom,sm8250-rpmh-clk
       - qcom,sm8350-rpmh-clk
diff --git a/Documentation/devicetree/bindings/clock/qcom,sc7280-dispcc.yaml b/Documentation/devicetree/bindings/clock/qcom,sc7280-dispcc.yaml
new file mode 100644 (file)
index 0000000..2178666
--- /dev/null
@@ -0,0 +1,94 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/qcom,sc7280-dispcc.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm Display Clock & Reset Controller Binding for SC7280
+
+maintainers:
+  - Taniya Das <tdas@codeaurora.org>
+
+description: |
+  Qualcomm display clock control module which supports the clocks, resets and
+  power domains on SC7280.
+
+  See also dt-bindings/clock/qcom,dispcc-sc7280.h.
+
+properties:
+  compatible:
+    const: qcom,sc7280-dispcc
+
+  clocks:
+    items:
+      - description: Board XO source
+      - description: GPLL0 source from GCC
+      - description: Byte clock from DSI PHY
+      - description: Pixel clock from DSI PHY
+      - description: Link clock from DP PHY
+      - description: VCO DIV clock from DP PHY
+      - description: Link clock from EDP PHY
+      - description: VCO DIV clock from EDP PHY
+
+  clock-names:
+    items:
+      - const: bi_tcxo
+      - const: gcc_disp_gpll0_clk
+      - const: dsi0_phy_pll_out_byteclk
+      - const: dsi0_phy_pll_out_dsiclk
+      - const: dp_phy_pll_link_clk
+      - const: dp_phy_pll_vco_div_clk
+      - const: edp_phy_pll_link_clk
+      - const: edp_phy_pll_vco_div_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,gcc-sc7280.h>
+    #include <dt-bindings/clock/qcom,rpmh.h>
+    clock-controller@af00000 {
+      compatible = "qcom,sc7280-dispcc";
+      reg = <0x0af00000 0x200000>;
+      clocks = <&rpmhcc RPMH_CXO_CLK>,
+               <&gcc GCC_DISP_GPLL0_CLK_SRC>,
+               <&dsi_phy 0>,
+               <&dsi_phy 1>,
+               <&dp_phy 0>,
+               <&dp_phy 1>,
+               <&edp_phy 0>,
+               <&edp_phy 1>;
+      clock-names = "bi_tcxo",
+                    "gcc_disp_gpll0_clk",
+                    "dsi0_phy_pll_out_byteclk",
+                    "dsi0_phy_pll_out_dsiclk",
+                    "dp_phy_pll_link_clk",
+                    "dp_phy_pll_vco_div_clk",
+                    "edp_phy_pll_link_clk",
+                    "edp_phy_pll_vco_div_clk";
+      #clock-cells = <1>;
+      #reset-cells = <1>;
+      #power-domain-cells = <1>;
+    };
+...
index 5672029..0d224f1 100644 (file)
@@ -1,4 +1,4 @@
-# SPDX-License-Identifier: GPL-2.0-only
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
 %YAML 1.2
 ---
 $id: http://devicetree.org/schemas/clock/qcom,videocc.yaml#
@@ -11,10 +11,11 @@ maintainers:
 
 description: |
   Qualcomm video clock control module which supports the clocks, resets and
-  power domains on SDM845/SC7180/SM8150/SM8250.
+  power domains on Qualcomm SoCs.
 
   See also:
     dt-bindings/clock/qcom,videocc-sc7180.h
+    dt-bindings/clock/qcom,videocc-sc7280.h
     dt-bindings/clock/qcom,videocc-sdm845.h
     dt-bindings/clock/qcom,videocc-sm8150.h
     dt-bindings/clock/qcom,videocc-sm8250.h
@@ -23,6 +24,7 @@ properties:
   compatible:
     enum:
       - qcom,sc7180-videocc
+      - qcom,sc7280-videocc
       - qcom,sdm845-videocc
       - qcom,sm8150-videocc
       - qcom,sm8250-videocc
diff --git a/Documentation/devicetree/bindings/clock/rockchip,rk3399-cru.txt b/Documentation/devicetree/bindings/clock/rockchip,rk3399-cru.txt
deleted file mode 100644 (file)
index 3bc56fa..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-* Rockchip RK3399 Clock and Reset Unit
-
-The RK3399 clock controller generates and supplies clock to various
-controllers within the SoC and also implements a reset controller for SoC
-peripherals.
-
-Required Properties:
-
-- compatible: PMU for CRU should be "rockchip,rk3399-pmucru"
-- compatible: CRU should be "rockchip,rk3399-cru"
-- reg: physical base address of the controller and length of memory mapped
-  region.
-- #clock-cells: should be 1.
-- #reset-cells: should be 1.
-
-Optional Properties:
-
-- rockchip,grf: phandle to the syscon managing the "general register files".
-  It is used for GRF muxes, if missing any muxes present in the GRF will not
-  be available.
-
-Each clock is assigned an identifier and client nodes can use this identifier
-to specify the clock which they consume. All available clocks are defined as
-preprocessor macros in the dt-bindings/clock/rk3399-cru.h headers and can be
-used in device tree sources. Similar macros exist for the reset sources in
-these files.
-
-External clocks:
-
-There are several clocks that are generated outside the SoC. It is expected
-that they are defined using standard clock bindings with following
-clock-output-names:
- - "xin24m" - crystal input - required,
- - "xin32k" - rtc clock - optional,
- - "clkin_gmac" - external GMAC clock - optional,
- - "clkin_i2s" - external I2S clock - optional,
- - "pclkin_cif" - external ISP clock - optional,
- - "clk_usbphy0_480m" - output clock of the pll in the usbphy0
- - "clk_usbphy1_480m" - output clock of the pll in the usbphy1
-
-Example: Clock controller node:
-
-       pmucru: pmu-clock-controller@ff750000 {
-               compatible = "rockchip,rk3399-pmucru";
-               reg = <0x0 0xff750000 0x0 0x1000>;
-               #clock-cells = <1>;
-               #reset-cells = <1>;
-       };
-
-       cru: clock-controller@ff760000 {
-               compatible = "rockchip,rk3399-cru";
-               reg = <0x0 0xff760000 0x0 0x1000>;
-               #clock-cells = <1>;
-               #reset-cells = <1>;
-       };
-
-Example: UART controller node that consumes the clock generated by the clock
-  controller:
-
-       uart0: serial@ff1a0000 {
-               compatible = "rockchip,rk3399-uart", "snps,dw-apb-uart";
-               reg = <0x0 0xff180000 0x0 0x100>;
-               clocks = <&cru SCLK_UART0>, <&cru PCLK_UART0>;
-               clock-names = "baudclk", "apb_pclk";
-               interrupts = <GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
-       };
diff --git a/Documentation/devicetree/bindings/clock/rockchip,rk3399-cru.yaml b/Documentation/devicetree/bindings/clock/rockchip,rk3399-cru.yaml
new file mode 100644 (file)
index 0000000..72b286a
--- /dev/null
@@ -0,0 +1,92 @@
+# SPDX-License-Identifier: GPL-2.0-only
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/rockchip,rk3399-cru.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Rockchip RK3399 Clock and Reset Unit
+
+maintainers:
+  - Xing Zheng <zhengxing@rock-chips.com>
+  - Heiko Stuebner <heiko@sntech.de>
+
+description: |
+  The RK3399 clock controller generates and supplies clock to various
+  controllers within the SoC and also implements a reset controller for SoC
+  peripherals.
+  Each clock is assigned an identifier and client nodes can use this identifier
+  to specify the clock which they consume. All available clocks are defined as
+  preprocessor macros in the dt-bindings/clock/rk3399-cru.h headers and can be
+  used in device tree sources. Similar macros exist for the reset sources in
+  these files.
+  There are several clocks that are generated outside the SoC. It is expected
+  that they are defined using standard clock bindings with following
+  clock-output-names:
+    - "xin24m" - crystal input - required,
+    - "xin32k" - rtc clock - optional,
+    - "clkin_gmac" - external GMAC clock - optional,
+    - "clkin_i2s" - external I2S clock - optional,
+    - "pclkin_cif" - external ISP clock - optional,
+    - "clk_usbphy0_480m" - output clock of the pll in the usbphy0
+    - "clk_usbphy1_480m" - output clock of the pll in the usbphy1
+
+properties:
+  compatible:
+    enum:
+      - rockchip,rk3399-pmucru
+      - rockchip,rk3399-cru
+
+  reg:
+    maxItems: 1
+
+  "#clock-cells":
+    const: 1
+
+  "#reset-cells":
+    const: 1
+
+  clocks:
+    minItems: 1
+
+  assigned-clocks:
+    minItems: 1
+    maxItems: 64
+
+  assigned-clock-parents:
+    minItems: 1
+    maxItems: 64
+
+  assigned-clock-rates:
+    minItems: 1
+    maxItems: 64
+
+  rockchip,grf:
+    $ref: /schemas/types.yaml#/definitions/phandle
+    description: >
+      phandle to the syscon managing the "general register files". It is used
+      for GRF muxes, if missing any muxes present in the GRF will not be
+      available.
+
+required:
+  - compatible
+  - reg
+  - "#clock-cells"
+  - "#reset-cells"
+
+additionalProperties: false
+
+examples:
+  - |
+    pmucru: pmu-clock-controller@ff750000 {
+      compatible = "rockchip,rk3399-pmucru";
+      reg = <0xff750000 0x1000>;
+      #clock-cells = <1>;
+      #reset-cells = <1>;
+    };
+  - |
+    cru: clock-controller@ff760000 {
+      compatible = "rockchip,rk3399-cru";
+      reg = <0xff760000 0x1000>;
+      #clock-cells = <1>;
+      #reset-cells = <1>;
+    };
diff --git a/Documentation/devicetree/bindings/clock/samsung,exynos-audss-clock.yaml b/Documentation/devicetree/bindings/clock/samsung,exynos-audss-clock.yaml
new file mode 100644 (file)
index 0000000..f14f1d3
--- /dev/null
@@ -0,0 +1,80 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/samsung,exynos-audss-clock.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Samsung Exynos SoC Audio SubSystem clock controller
+
+maintainers:
+  - 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: |
+  All available clocks are defined as preprocessor macros in
+  include/dt-bindings/clock/exynos-audss-clk.h header.
+
+properties:
+  compatible:
+    enum:
+      - samsung,exynos4210-audss-clock
+      - samsung,exynos5250-audss-clock
+      - samsung,exynos5410-audss-clock
+      - samsung,exynos5420-audss-clock
+
+  clocks:
+    minItems: 2
+    items:
+      - description:
+          Fixed rate PLL reference clock, parent of mout_audss. "fin_pll" is
+          used if not specified.
+      - description:
+          Input PLL to the AudioSS block, parent of mout_audss. "fout_epll" is
+          used if not specified.
+      - description:
+          Audio bus clock, parent of mout_i2s. "sclk_audio0" is used if not
+          specified.
+      - description:
+          PCM clock, parent of sclk_pcm.  "sclk_pcm0" is used if not specified.
+      - description:
+          External i2s clock, parent of mout_i2s. "cdclk0" is used if not
+          specified.
+
+  clock-names:
+    minItems: 2
+    items:
+      - const: pll_ref
+      - const: pll_in
+      - const: sclk_audio
+      - const: sclk_pcm_in
+      - const: cdclk
+
+  "#clock-cells":
+    const: 1
+
+  power-domains:
+    maxItems: 1
+
+  reg:
+    maxItems: 1
+
+required:
+  - compatible
+  - clocks
+  - clock-names
+  - "#clock-cells"
+  - reg
+
+additionalProperties: false
+
+examples:
+  - |
+    clock-controller@3810000 {
+        compatible = "samsung,exynos5250-audss-clock";
+        reg = <0x03810000 0x0c>;
+        #clock-cells = <1>;
+        clocks = <&clock 1>, <&clock 7>, <&clock 138>, <&clock 160>, <&ext_i2s_clk>;
+        clock-names = "pll_ref", "pll_in", "sclk_audio", "sclk_pcm_in", "cdclk";
+    };
diff --git a/Documentation/devicetree/bindings/clock/samsung,exynos-clock.yaml b/Documentation/devicetree/bindings/clock/samsung,exynos-clock.yaml
new file mode 100644 (file)
index 0000000..4e80628
--- /dev/null
@@ -0,0 +1,59 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/samsung,exynos-clock.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Samsung Exynos SoC clock controller
+
+maintainers:
+  - 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: |
+  All available clocks are defined as preprocessor macros in
+  dt-bindings/clock/ headers.
+
+properties:
+  compatible:
+    oneOf:
+      - enum:
+          - samsung,exynos3250-cmu
+          - samsung,exynos3250-cmu-dmc
+          - samsung,exynos3250-cmu-isp
+          - samsung,exynos4210-clock
+          - samsung,exynos4412-clock
+          - samsung,exynos5250-clock
+      - items:
+          - enum:
+              - samsung,exynos5420-clock
+              - samsung,exynos5800-clock
+          - const: syscon
+
+  clocks:
+    minItems: 1
+    maxItems: 4
+
+  "#clock-cells":
+    const: 1
+
+  reg:
+    maxItems: 1
+
+required:
+  - compatible
+  - "#clock-cells"
+  - reg
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/exynos5250.h>
+    clock: clock-controller@10010000 {
+        compatible = "samsung,exynos5250-clock";
+        reg = <0x10010000 0x30000>;
+        #clock-cells = <1>;
+    };
diff --git a/Documentation/devicetree/bindings/clock/samsung,exynos-ext-clock.yaml b/Documentation/devicetree/bindings/clock/samsung,exynos-ext-clock.yaml
new file mode 100644 (file)
index 0000000..64d027d
--- /dev/null
@@ -0,0 +1,46 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/samsung,exynos-ext-clock.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Samsung SoC external/osc/XXTI/XusbXTI clock
+
+maintainers:
+  - 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: |
+  Samsung SoCs require an external clock supplied through XXTI or XusbXTI pins.
+
+properties:
+  compatible:
+    enum:
+      - samsung,clock-xxti
+      - samsung,clock-xusbxti
+      - samsung,exynos5420-oscclk
+
+  "#clock-cells":
+    const: 0
+
+  clock-frequency: true
+
+  clock-output-names:
+    maxItems: 1
+
+required:
+  - compatible
+  - clock-frequency
+
+additionalProperties: false
+
+examples:
+  - |
+    fixed-rate-clocks {
+        clock {
+            compatible = "samsung,clock-xxti";
+            clock-frequency = <24000000>;
+        };
+    };
diff --git a/Documentation/devicetree/bindings/clock/samsung,exynos4412-isp-clock.yaml b/Documentation/devicetree/bindings/clock/samsung,exynos4412-isp-clock.yaml
new file mode 100644 (file)
index 0000000..1ed64ad
--- /dev/null
@@ -0,0 +1,64 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/samsung,exynos4412-isp-clock.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Samsung Exynos4412 SoC ISP clock controller
+
+maintainers:
+  - 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: |
+  Clock controller for Samsung Exynos4412 SoC FIMC-ISP (Camera ISP)
+  All available clocks are defined as preprocessor macros in
+  dt-bindings/clock/ headers.
+
+properties:
+  compatible:
+    const: samsung,exynos4412-isp-clock
+
+  clocks:
+    items:
+      - description: CLK_ACLK200 from the main clock controller
+      - description: CLK_ACLK400_MCUISP from the main clock controller
+
+  clock-names:
+    items:
+      - const: aclk200
+      - const: aclk400_mcuisp
+
+  "#clock-cells":
+    const: 1
+
+  power-domains:
+    maxItems: 1
+
+  reg:
+    maxItems: 1
+
+required:
+  - compatible
+  - "#clock-cells"
+  - clocks
+  - clock-names
+  - power-domains
+  - reg
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/exynos4.h>
+    clock-controller@10048000 {
+        compatible = "samsung,exynos4412-isp-clock";
+        reg = <0x10048000 0x1000>;
+        #clock-cells = <1>;
+        power-domains = <&pd_isp>;
+        clocks = <&clock CLK_ACLK200>, <&clock CLK_ACLK400_MCUISP>;
+        clock-names = "aclk200", "aclk400_mcuisp";
+    };
+
diff --git a/Documentation/devicetree/bindings/clock/samsung,s5pv210-audss-clock.yaml b/Documentation/devicetree/bindings/clock/samsung,s5pv210-audss-clock.yaml
new file mode 100644 (file)
index 0000000..ae8f8fc
--- /dev/null
@@ -0,0 +1,78 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/samsung,s5pv210-audss-clock.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Samsung S5Pv210 SoC Audio SubSystem clock controller
+
+maintainers:
+  - 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: |
+  All available clocks are defined as preprocessor macros in
+  include/dt-bindings/clock/s5pv210-audss.h header.
+
+properties:
+  compatible:
+    const: samsung,s5pv210-audss-clock
+
+  clocks:
+    minItems: 4
+    items:
+      - description:
+          AHB bus clock of the Audio Subsystem.
+      - description:
+          Optional fixed rate PLL reference clock, parent of mout_audss. If not
+          specified (i.e. xusbxti is used for PLL reference), it is fixed to a
+          clock named "xxti".
+      - description:
+          Input PLL to the AudioSS block, parent of mout_audss.
+      - description:
+          Audio bus clock, parent of mout_i2s.
+      - description:
+          Optional external i2s clock, parent of mout_i2s. If not specified, it
+          is fixed to a clock named "iiscdclk0".
+
+  clock-names:
+    minItems: 4
+    items:
+      - const: hclk
+      - const: xxti
+      - const: fout_epll
+      - const: sclk_audio0
+      - const: iiscdclk0
+
+  "#clock-cells":
+    const: 1
+
+  power-domains:
+    maxItems: 1
+
+  reg:
+    maxItems: 1
+
+required:
+  - compatible
+  - clocks
+  - clock-names
+  - "#clock-cells"
+  - reg
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/s5pv210.h>
+
+    clock-controller@c0900000 {
+        compatible = "samsung,s5pv210-audss-clock";
+        reg = <0xc0900000 0x1000>;
+        #clock-cells = <1>;
+        clock-names = "hclk", "xxti", "fout_epll", "sclk_audio0";
+        clocks = <&clocks DOUT_HCLKP>, <&xxti>, <&clocks FOUT_EPLL>,
+                 <&clocks SCLK_AUDIO0>;
+    };
index 9c8f143..8ef33ef 100644 (file)
@@ -16519,10 +16519,14 @@ L:    linux-samsung-soc@vger.kernel.org
 S:     Supported
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/snawrocki/clk.git
 F:     Documentation/devicetree/bindings/clock/exynos*.txt
+F:     Documentation/devicetree/bindings/clock/samsung,*.yaml
 F:     Documentation/devicetree/bindings/clock/samsung,s3c*
 F:     Documentation/devicetree/bindings/clock/samsung,s5p*
 F:     drivers/clk/samsung/
 F:     include/dt-bindings/clock/exynos*.h
+F:     include/dt-bindings/clock/s3c*.h
+F:     include/dt-bindings/clock/s5p*.h
+F:     include/dt-bindings/clock/samsung,*.h
 F:     include/linux/clk/samsung.h
 F:     include/linux/platform_data/clk-s3c2410.h
 
index 894b7e6..30b1f51 100644 (file)
@@ -385,7 +385,9 @@ static struct platform_device *lpss_clk_dev;
 
 static inline void lpt_register_clock_device(void)
 {
-       lpss_clk_dev = platform_device_register_simple("clk-lpt", -1, NULL, 0);
+       lpss_clk_dev = platform_device_register_simple("clk-lpss-atom",
+                                                      PLATFORM_DEVID_NONE,
+                                                      NULL, 0);
 }
 
 static int register_device_clock(struct acpi_device *adev,
@@ -434,8 +436,8 @@ static int register_device_clock(struct acpi_device *adev,
                if (!clk_name)
                        return -ENOMEM;
                clk = clk_register_fractional_divider(NULL, clk_name, parent,
-                                                     0, prv_base,
-                                                     1, 15, 16, 15, 0, NULL);
+                                                     CLK_FRAC_DIVIDER_POWER_OF_TWO_PS,
+                                                     prv_base, 1, 15, 16, 15, 0, NULL);
                parent = clk_name;
 
                clk_name = kasprintf(GFP_KERNEL, "%s-update", devname);
@@ -1337,7 +1339,7 @@ void __init acpi_lpss_init(void)
        const struct x86_cpu_id *id;
        int ret;
 
-       ret = lpt_clk_init();
+       ret = lpss_atom_clk_init();
        if (ret)
                return;
 
index 0251f3e..4110c19 100644 (file)
@@ -519,6 +519,23 @@ void pm_clk_destroy(struct device *dev)
 }
 EXPORT_SYMBOL_GPL(pm_clk_destroy);
 
+static void pm_clk_destroy_action(void *data)
+{
+       pm_clk_destroy(data);
+}
+
+int devm_pm_clk_create(struct device *dev)
+{
+       int ret;
+
+       ret = pm_clk_create(dev);
+       if (ret)
+               return ret;
+
+       return devm_add_action_or_reset(dev, pm_clk_destroy_action, dev);
+}
+EXPORT_SYMBOL_GPL(devm_pm_clk_create);
+
 /**
  * pm_clk_suspend - Disable clocks in a device's PM clock list.
  * @dev: Device to disable the clocks for.
index 8a66eaf..ec94049 100644 (file)
@@ -1447,6 +1447,23 @@ void pm_runtime_enable(struct device *dev)
 }
 EXPORT_SYMBOL_GPL(pm_runtime_enable);
 
+static void pm_runtime_disable_action(void *data)
+{
+       pm_runtime_disable(data);
+}
+
+/**
+ * devm_pm_runtime_enable - devres-enabled version of pm_runtime_enable.
+ * @dev: Device to handle.
+ */
+int devm_pm_runtime_enable(struct device *dev)
+{
+       pm_runtime_enable(dev);
+
+       return devm_add_action_or_reset(dev, pm_runtime_disable_action, dev);
+}
+EXPORT_SYMBOL_GPL(devm_pm_runtime_enable);
+
 /**
  * pm_runtime_forbid - Block runtime PM of a device.
  * @dev: Device to handle.
index b4fc8d7..b656d25 100644 (file)
@@ -128,6 +128,12 @@ static int clk_generated_determine_rate(struct clk_hw *hw,
        int i;
        u32 div;
 
+       /* do not look for a rate that is outside of our range */
+       if (gck->range.max && req->rate > gck->range.max)
+               req->rate = gck->range.max;
+       if (gck->range.min && req->rate < gck->range.min)
+               req->rate = gck->range.min;
+
        for (i = 0; i < clk_hw_get_num_parents(hw); i++) {
                if (gck->chg_pid == i)
                        continue;
index 9e1ec48..cf8c079 100644 (file)
@@ -35,7 +35,7 @@ static DEFINE_SPINLOCK(pmc_pll_lock);
 static DEFINE_SPINLOCK(pmc_mck0_lock);
 static DEFINE_SPINLOCK(pmc_mckX_lock);
 
-/**
+/*
  * PLL clocks identifiers
  * @PLL_ID_CPU:                CPU PLL identifier
  * @PLL_ID_SYS:                System PLL identifier
@@ -56,7 +56,7 @@ enum pll_ids {
        PLL_ID_MAX,
 };
 
-/**
+/*
  * PLL type identifiers
  * @PLL_TYPE_FRAC:     fractional PLL identifier
  * @PLL_TYPE_DIV:      divider PLL identifier
@@ -118,7 +118,7 @@ static const struct clk_pll_characteristics pll_characteristics = {
        .output = pll_outputs,
 };
 
-/**
+/*
  * PLL clocks description
  * @n:         clock name
  * @p:         clock parent
@@ -285,7 +285,7 @@ static const struct {
        },
 };
 
-/**
+/*
  * Master clock (MCK[1..4]) description
  * @n:                 clock name
  * @ep:                        extra parents names array
@@ -337,7 +337,7 @@ static const struct {
          .c = 1, },
 };
 
-/**
+/*
  * System clock description
  * @n: clock name
  * @p: clock parent name
@@ -361,7 +361,7 @@ static const struct {
 /* Mux table for programmable clocks. */
 static u32 sama7g5_prog_mux_table[] = { 0, 1, 2, 5, 6, 7, 8, 9, 10, };
 
-/**
+/*
  * Peripheral clock description
  * @n:         clock name
  * @p:         clock parent name
@@ -449,7 +449,7 @@ static const struct {
        { .n = "uhphs_clk",     .p = "mck1", .id = 106, },
 };
 
-/**
+/*
  * Generic clock description
  * @n:                 clock name
  * @pp:                        PLL parents
index 1ac803e..a254512 100644 (file)
@@ -805,11 +805,10 @@ static int bcm2835_pll_divider_is_on(struct clk_hw *hw)
        return !(cprman_read(cprman, data->a2w_reg) & A2W_PLL_CHANNEL_DISABLE);
 }
 
-static long bcm2835_pll_divider_round_rate(struct clk_hw *hw,
-                                          unsigned long rate,
-                                          unsigned long *parent_rate)
+static int bcm2835_pll_divider_determine_rate(struct clk_hw *hw,
+                                             struct clk_rate_request *req)
 {
-       return clk_divider_ops.round_rate(hw, rate, parent_rate);
+       return clk_divider_ops.determine_rate(hw, req);
 }
 
 static unsigned long bcm2835_pll_divider_get_rate(struct clk_hw *hw,
@@ -901,7 +900,7 @@ static const struct clk_ops bcm2835_pll_divider_clk_ops = {
        .unprepare = bcm2835_pll_divider_off,
        .recalc_rate = bcm2835_pll_divider_get_rate,
        .set_rate = bcm2835_pll_divider_set_rate,
-       .round_rate = bcm2835_pll_divider_round_rate,
+       .determine_rate = bcm2835_pll_divider_determine_rate,
        .debug_init = bcm2835_pll_divider_debug_init,
 };
 
index 87ba496..f6b2bf5 100644 (file)
@@ -446,6 +446,27 @@ static long clk_divider_round_rate(struct clk_hw *hw, unsigned long rate,
                                  divider->width, divider->flags);
 }
 
+static int clk_divider_determine_rate(struct clk_hw *hw,
+                                     struct clk_rate_request *req)
+{
+       struct clk_divider *divider = to_clk_divider(hw);
+
+       /* if read only, just return current value */
+       if (divider->flags & CLK_DIVIDER_READ_ONLY) {
+               u32 val;
+
+               val = clk_div_readl(divider) >> divider->shift;
+               val &= clk_div_mask(divider->width);
+
+               return divider_ro_determine_rate(hw, req, divider->table,
+                                                divider->width,
+                                                divider->flags, val);
+       }
+
+       return divider_determine_rate(hw, req, divider->table, divider->width,
+                                     divider->flags);
+}
+
 int divider_get_val(unsigned long rate, unsigned long parent_rate,
                    const struct clk_div_table *table, u8 width,
                    unsigned long flags)
@@ -501,6 +522,7 @@ static int clk_divider_set_rate(struct clk_hw *hw, unsigned long rate,
 const struct clk_ops clk_divider_ops = {
        .recalc_rate = clk_divider_recalc_rate,
        .round_rate = clk_divider_round_rate,
+       .determine_rate = clk_divider_determine_rate,
        .set_rate = clk_divider_set_rate,
 };
 EXPORT_SYMBOL_GPL(clk_divider_ops);
@@ -508,6 +530,7 @@ EXPORT_SYMBOL_GPL(clk_divider_ops);
 const struct clk_ops clk_divider_ro_ops = {
        .recalc_rate = clk_divider_recalc_rate,
        .round_rate = clk_divider_round_rate,
+       .determine_rate = clk_divider_determine_rate,
 };
 EXPORT_SYMBOL_GPL(clk_divider_ro_ops);
 
index b1e556f..4274540 100644 (file)
@@ -3,8 +3,39 @@
  * Copyright (C) 2014 Intel Corporation
  *
  * Adjustable fractional divider clock implementation.
- * Output rate = (m / n) * parent_rate.
  * Uses rational best approximation algorithm.
+ *
+ * Output is calculated as
+ *
+ *     rate = (m / n) * parent_rate                            (1)
+ *
+ * This is useful when we have a prescaler block which asks for
+ * m (numerator) and n (denominator) values to be provided to satisfy
+ * the (1) as much as possible.
+ *
+ * Since m and n have the limitation by a range, e.g.
+ *
+ *     n >= 1, n < N_width, where N_width = 2^nwidth           (2)
+ *
+ * for some cases the output may be saturated. Hence, from (1) and (2),
+ * assuming the worst case when m = 1, the inequality
+ *
+ *     floor(log2(parent_rate / rate)) <= nwidth               (3)
+ *
+ * may be derived. Thus, in cases when
+ *
+ *     (parent_rate / rate) >> N_width                         (4)
+ *
+ * we might scale up the rate by 2^scale (see the description of
+ * CLK_FRAC_DIVIDER_POWER_OF_TWO_PS for additional information), where
+ *
+ *     scale = floor(log2(parent_rate / rate)) - nwidth        (5)
+ *
+ * and assume that the IP, that needs m and n, has also its own
+ * prescaler, which is capable to divide by 2^scale. In this way
+ * we get the denominator to satisfy the desired range (2) and
+ * at the same time much much better result of m and n than simple
+ * saturated values.
  */
 
 #include <linux/clk-provider.h>
@@ -14,6 +45,8 @@
 #include <linux/slab.h>
 #include <linux/rational.h>
 
+#include "clk-fractional-divider.h"
+
 static inline u32 clk_fd_readl(struct clk_fractional_divider *fd)
 {
        if (fd->flags & CLK_FRAC_DIVIDER_BIG_ENDIAN)
@@ -68,21 +101,26 @@ static unsigned long clk_fd_recalc_rate(struct clk_hw *hw,
        return ret;
 }
 
-static void clk_fd_general_approximation(struct clk_hw *hw, unsigned long rate,
-                                        unsigned long *parent_rate,
-                                        unsigned long *m, unsigned long *n)
+void clk_fractional_divider_general_approximation(struct clk_hw *hw,
+                                                 unsigned long rate,
+                                                 unsigned long *parent_rate,
+                                                 unsigned long *m, unsigned long *n)
 {
        struct clk_fractional_divider *fd = to_clk_fd(hw);
-       unsigned long scale;
 
        /*
         * Get rate closer to *parent_rate to guarantee there is no overflow
         * for m and n. In the result it will be the nearest rate left shifted
         * by (scale - fd->nwidth) bits.
+        *
+        * For the detailed explanation see the top comment in this file.
         */
-       scale = fls_long(*parent_rate / rate - 1);
-       if (scale > fd->nwidth)
-               rate <<= scale - fd->nwidth;
+       if (fd->flags & CLK_FRAC_DIVIDER_POWER_OF_TWO_PS) {
+               unsigned long scale = fls_long(*parent_rate / rate - 1);
+
+               if (scale > fd->nwidth)
+                       rate <<= scale - fd->nwidth;
+       }
 
        rational_best_approximation(rate, *parent_rate,
                        GENMASK(fd->mwidth - 1, 0), GENMASK(fd->nwidth - 1, 0),
@@ -102,7 +140,7 @@ static long clk_fd_round_rate(struct clk_hw *hw, unsigned long rate,
        if (fd->approximation)
                fd->approximation(hw, rate, parent_rate, &m, &n);
        else
-               clk_fd_general_approximation(hw, rate, parent_rate, &m, &n);
+               clk_fractional_divider_general_approximation(hw, rate, parent_rate, &m, &n);
 
        ret = (u64)*parent_rate * m;
        do_div(ret, n);
diff --git a/drivers/clk/clk-fractional-divider.h b/drivers/clk/clk-fractional-divider.h
new file mode 100644 (file)
index 0000000..f0f71d2
--- /dev/null
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _CLK_FRACTIONAL_DIV_H
+#define _CLK_FRACTIONAL_DIV_H
+
+struct clk_hw;
+
+extern const struct clk_ops clk_fractional_divider_ops;
+
+void clk_fractional_divider_general_approximation(struct clk_hw *hw,
+                                                 unsigned long rate,
+                                                 unsigned long *parent_rate,
+                                                 unsigned long *m,
+                                                 unsigned long *n);
+
+#endif
index c7a3a02..8f02c0b 100644 (file)
@@ -269,23 +269,14 @@ static bool lmk04832_regmap_rd_regs(struct device *dev, unsigned int reg)
 {
        switch (reg) {
        case LMK04832_REG_RST3W ... LMK04832_REG_ID_MASKREV:
-               fallthrough;
        case LMK04832_REG_ID_VNDR_MSB:
-               fallthrough;
        case LMK04832_REG_ID_VNDR_LSB:
-               fallthrough;
        case LMK04832_REG_CLKOUT_CTRL0(0) ... LMK04832_REG_PLL2_DLD_CNT_LSB:
-               fallthrough;
        case LMK04832_REG_PLL2_LD:
-               fallthrough;
        case LMK04832_REG_PLL2_PD:
-               fallthrough;
        case LMK04832_REG_PLL1R_RST:
-               fallthrough;
        case LMK04832_REG_CLR_PLL_LOST ... LMK04832_REG_RB_DAC_VAL_LSB:
-               fallthrough;
        case LMK04832_REG_RB_HOLDOVER:
-               fallthrough;
        case LMK04832_REG_SPI_LOCK:
                return true;
        default:
@@ -297,27 +288,18 @@ static bool lmk04832_regmap_wr_regs(struct device *dev, unsigned int reg)
 {
        switch (reg) {
        case LMK04832_REG_RST3W:
-               fallthrough;
        case LMK04832_REG_POWERDOWN:
                return true;
        case LMK04832_REG_ID_DEV_TYPE ... LMK04832_REG_ID_MASKREV:
-               fallthrough;
        case LMK04832_REG_ID_VNDR_MSB:
-               fallthrough;
        case LMK04832_REG_ID_VNDR_LSB:
                return false;
        case LMK04832_REG_CLKOUT_CTRL0(0) ... LMK04832_REG_PLL2_DLD_CNT_LSB:
-               fallthrough;
        case LMK04832_REG_PLL2_LD:
-               fallthrough;
        case LMK04832_REG_PLL2_PD:
-               fallthrough;
        case LMK04832_REG_PLL1R_RST:
-               fallthrough;
        case LMK04832_REG_CLR_PLL_LOST ... LMK04832_REG_RB_DAC_VAL_LSB:
-               fallthrough;
        case LMK04832_REG_RB_HOLDOVER:
-               fallthrough;
        case LMK04832_REG_SPI_LOCK:
                return true;
        default:
index e41a3a9..b8c3d0d 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Clock driver for Palmas device.
  *
@@ -6,15 +7,6 @@
  *
  * Author:     Laxman Dewangan <ldewangan@nvidia.com>
  *             Peter Ujfalusi <peter.ujfalusi@ti.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation version 2.
- *
- * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind,
- * whether express or implied; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
  */
 
 #include <linux/clk.h>
index 5c75e3d..af46176 100644 (file)
@@ -709,10 +709,10 @@ static unsigned long stm32f4_pll_div_recalc_rate(struct clk_hw *hw,
        return clk_divider_ops.recalc_rate(hw, parent_rate);
 }
 
-static long stm32f4_pll_div_round_rate(struct clk_hw *hw, unsigned long rate,
-                               unsigned long *prate)
+static int stm32f4_pll_div_determine_rate(struct clk_hw *hw,
+                                         struct clk_rate_request *req)
 {
-       return clk_divider_ops.round_rate(hw, rate, prate);
+       return clk_divider_ops.determine_rate(hw, req);
 }
 
 static int stm32f4_pll_div_set_rate(struct clk_hw *hw, unsigned long rate,
@@ -738,7 +738,7 @@ static int stm32f4_pll_div_set_rate(struct clk_hw *hw, unsigned long rate,
 
 static const struct clk_ops stm32f4_pll_div_ops = {
        .recalc_rate = stm32f4_pll_div_recalc_rate,
-       .round_rate = stm32f4_pll_div_round_rate,
+       .determine_rate = stm32f4_pll_div_determine_rate,
        .set_rate = stm32f4_pll_div_set_rate,
 };
 
index 0ea7261..1a701ea 100644 (file)
@@ -845,10 +845,10 @@ static unsigned long odf_divider_recalc_rate(struct clk_hw *hw,
        return clk_divider_ops.recalc_rate(hw, parent_rate);
 }
 
-static long odf_divider_round_rate(struct clk_hw *hw, unsigned long rate,
-               unsigned long *prate)
+static int odf_divider_determine_rate(struct clk_hw *hw,
+                                     struct clk_rate_request *req)
 {
-       return clk_divider_ops.round_rate(hw, rate, prate);
+       return clk_divider_ops.determine_rate(hw, req);
 }
 
 static int odf_divider_set_rate(struct clk_hw *hw, unsigned long rate,
@@ -875,7 +875,7 @@ static int odf_divider_set_rate(struct clk_hw *hw, unsigned long rate,
 
 static const struct clk_ops odf_divider_ops = {
        .recalc_rate    = odf_divider_recalc_rate,
-       .round_rate     = odf_divider_round_rate,
+       .determine_rate = odf_divider_determine_rate,
        .set_rate       = odf_divider_set_rate,
 };
 
index 256575b..4bd1fe7 100644 (file)
@@ -1076,14 +1076,10 @@ static int clk_divider_rtc_set_rate(struct clk_hw *hw, unsigned long rate,
 
 static int clk_divider_rtc_determine_rate(struct clk_hw *hw, struct clk_rate_request *req)
 {
-       unsigned long best_parent_rate = req->best_parent_rate;
+       if (req->best_parent_hw == clk_hw_get_parent_by_index(hw, HSE_RTC))
+               return clk_divider_ops.determine_rate(hw, req);
 
-       if (req->best_parent_hw == clk_hw_get_parent_by_index(hw, HSE_RTC)) {
-               req->rate = clk_divider_ops.round_rate(hw, req->rate, &best_parent_rate);
-               req->best_parent_rate = best_parent_rate;
-       } else {
-               req->rate = best_parent_rate;
-       }
+       req->rate = req->best_parent_rate;
 
        return 0;
 }
index 3c73774..c6d3b1a 100644 (file)
@@ -907,6 +907,7 @@ static const struct of_device_id clk_vc5_of_match[];
 
 static int vc5_probe(struct i2c_client *client, const struct i2c_device_id *id)
 {
+       unsigned int oe, sd, src_mask = 0, src_val = 0;
        struct vc5_driver_data *vc5;
        struct clk_init_data init;
        const char *parent_names[2];
@@ -930,11 +931,33 @@ static int vc5_probe(struct i2c_client *client, const struct i2c_device_id *id)
                return -EPROBE_DEFER;
 
        vc5->regmap = devm_regmap_init_i2c(client, &vc5_regmap_config);
-       if (IS_ERR(vc5->regmap)) {
-               dev_err(&client->dev, "failed to allocate register map\n");
-               return PTR_ERR(vc5->regmap);
+       if (IS_ERR(vc5->regmap))
+               return dev_err_probe(&client->dev, PTR_ERR(vc5->regmap),
+                                    "failed to allocate register map\n");
+
+       ret = of_property_read_u32(client->dev.of_node, "idt,shutdown", &sd);
+       if (!ret) {
+               src_mask |= VC5_PRIM_SRC_SHDN_EN_GBL_SHDN;
+               if (sd)
+                       src_val |= VC5_PRIM_SRC_SHDN_EN_GBL_SHDN;
+       } else if (ret != -EINVAL) {
+               return dev_err_probe(&client->dev, ret,
+                                    "could not read idt,shutdown\n");
        }
 
+       ret = of_property_read_u32(client->dev.of_node,
+                                  "idt,output-enable-active", &oe);
+       if (!ret) {
+               src_mask |= VC5_PRIM_SRC_SHDN_SP;
+               if (oe)
+                       src_val |= VC5_PRIM_SRC_SHDN_SP;
+       } else if (ret != -EINVAL) {
+               return dev_err_probe(&client->dev, ret,
+                                    "could not read idt,output-enable-active\n");
+       }
+
+       regmap_update_bits(vc5->regmap, VC5_PRIM_SRC_SHDN, src_mask, src_val);
+
        /* Register clock input mux */
        memset(&init, 0, sizeof(init));
 
@@ -957,10 +980,9 @@ static int vc5_probe(struct i2c_client *client, const struct i2c_device_id *id)
                    __clk_get_name(vc5->pin_clkin);
        }
 
-       if (!init.num_parents) {
-               dev_err(&client->dev, "no input clock specified!\n");
-               return -EINVAL;
-       }
+       if (!init.num_parents)
+               return dev_err_probe(&client->dev, -EINVAL,
+                                    "no input clock specified!\n");
 
        /* Configure Optional Loading Capacitance for external XTAL */
        if (!(vc5->chip_info->flags & VC5_HAS_INTERNAL_XTAL)) {
@@ -1099,14 +1121,16 @@ static int vc5_probe(struct i2c_client *client, const struct i2c_device_id *id)
 
        ret = of_clk_add_hw_provider(client->dev.of_node, vc5_of_clk_get, vc5);
        if (ret) {
-               dev_err(&client->dev, "unable to add clk provider\n");
+               dev_err_probe(&client->dev, ret,
+                             "unable to add clk provider\n");
                goto err_clk;
        }
 
        return 0;
 
 err_clk_register:
-       dev_err(&client->dev, "unable to register %s\n", init.name);
+       dev_err_probe(&client->dev, ret,
+                     "unable to register %s\n", init.name);
        kfree(init.name); /* clock framework made a copy of the name */
 err_clk:
        if (vc5->chip_info->flags & VC5_HAS_INTERNAL_XTAL)
index 7c4f31b..d85ba78 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/err.h>
 #include <linux/slab.h>
 
+#include "../clk-fractional-divider.h"
 #include "clk.h"
 
 #define PCG_PCS_SHIFT  24
index 2c309e3..04e7285 100644 (file)
@@ -216,7 +216,8 @@ struct clk_hw *imx8m_clk_hw_composite_flags(const char *name,
                div->width = PCG_PREDIV_WIDTH;
                divider_ops = &imx8m_clk_composite_divider_ops;
                mux_ops = &clk_mux_ops;
-               flags |= CLK_SET_PARENT_GATE;
+               if (!(composite_flags & IMX_COMPOSITE_FW_MANAGED))
+                       flags |= CLK_SET_PARENT_GATE;
        }
 
        div->lock = &imx_ccm_lock;
index 0322a84..26b210c 100644 (file)
@@ -64,10 +64,10 @@ static unsigned long clk_divider_gate_recalc_rate(struct clk_hw *hw,
                                   div->flags, div->width);
 }
 
-static long clk_divider_round_rate(struct clk_hw *hw, unsigned long rate,
-                                  unsigned long *prate)
+static int clk_divider_determine_rate(struct clk_hw *hw,
+                                     struct clk_rate_request *req)
 {
-       return clk_divider_ops.round_rate(hw, rate, prate);
+       return clk_divider_ops.determine_rate(hw, req);
 }
 
 static int clk_divider_gate_set_rate(struct clk_hw *hw, unsigned long rate,
@@ -154,12 +154,12 @@ static int clk_divider_is_enabled(struct clk_hw *hw)
 
 static const struct clk_ops clk_divider_gate_ro_ops = {
        .recalc_rate = clk_divider_gate_recalc_rate_ro,
-       .round_rate = clk_divider_round_rate,
+       .determine_rate = clk_divider_determine_rate,
 };
 
 static const struct clk_ops clk_divider_gate_ops = {
        .recalc_rate = clk_divider_gate_recalc_rate,
-       .round_rate = clk_divider_round_rate,
+       .determine_rate = clk_divider_determine_rate,
        .set_rate = clk_divider_gate_set_rate,
        .enable = clk_divider_enable,
        .disable = clk_divider_disable,
index f1919fa..e92621f 100644 (file)
@@ -407,10 +407,10 @@ static int imx8mm_clocks_probe(struct platform_device *pdev)
        hws[IMX8MM_SYS_PLL2_500M] = imx_clk_hw_fixed_factor("sys_pll2_500m", "sys_pll2_500m_cg", 1, 2);
        hws[IMX8MM_SYS_PLL2_1000M] = imx_clk_hw_fixed_factor("sys_pll2_1000m", "sys_pll2_out", 1, 1);
 
-       hws[IMX8MM_CLK_CLKOUT1_SEL] = imx_clk_hw_mux("clkout1_sel", base + 0x128, 4, 4, clkout_sels, ARRAY_SIZE(clkout_sels));
+       hws[IMX8MM_CLK_CLKOUT1_SEL] = imx_clk_hw_mux2("clkout1_sel", base + 0x128, 4, 4, clkout_sels, ARRAY_SIZE(clkout_sels));
        hws[IMX8MM_CLK_CLKOUT1_DIV] = imx_clk_hw_divider("clkout1_div", "clkout1_sel", base + 0x128, 0, 4);
        hws[IMX8MM_CLK_CLKOUT1] = imx_clk_hw_gate("clkout1", "clkout1_div", base + 0x128, 8);
-       hws[IMX8MM_CLK_CLKOUT2_SEL] = imx_clk_hw_mux("clkout2_sel", base + 0x128, 20, 4, clkout_sels, ARRAY_SIZE(clkout_sels));
+       hws[IMX8MM_CLK_CLKOUT2_SEL] = imx_clk_hw_mux2("clkout2_sel", base + 0x128, 20, 4, clkout_sels, ARRAY_SIZE(clkout_sels));
        hws[IMX8MM_CLK_CLKOUT2_DIV] = imx_clk_hw_divider("clkout2_div", "clkout2_sel", base + 0x128, 16, 4);
        hws[IMX8MM_CLK_CLKOUT2] = imx_clk_hw_gate("clkout2", "clkout2_div", base + 0x128, 24);
 
@@ -470,10 +470,11 @@ static int imx8mm_clocks_probe(struct platform_device *pdev)
 
        /*
         * DRAM clocks are manipulated from TF-A outside clock framework.
-        * Mark with GET_RATE_NOCACHE to always read div value from hardware
+        * The fw_managed helper sets GET_RATE_NOCACHE and clears SET_PARENT_GATE
+        * as div value should always be read from hardware
         */
-       hws[IMX8MM_CLK_DRAM_ALT] = __imx8m_clk_hw_composite("dram_alt", imx8mm_dram_alt_sels, base + 0xa000, CLK_GET_RATE_NOCACHE);
-       hws[IMX8MM_CLK_DRAM_APB] = __imx8m_clk_hw_composite("dram_apb", imx8mm_dram_apb_sels, base + 0xa080, CLK_IS_CRITICAL | CLK_GET_RATE_NOCACHE);
+       hws[IMX8MM_CLK_DRAM_ALT] = imx8m_clk_hw_fw_managed_composite("dram_alt", imx8mm_dram_alt_sels, base + 0xa000);
+       hws[IMX8MM_CLK_DRAM_APB] = imx8m_clk_hw_fw_managed_composite_critical("dram_apb", imx8mm_dram_apb_sels, base + 0xa080);
 
        /* IP */
        hws[IMX8MM_CLK_VPU_G1] = imx8m_clk_hw_composite("vpu_g1", imx8mm_vpu_g1_sels, base + 0xa100);
index 88f6630..c555776 100644 (file)
@@ -40,6 +40,9 @@ static const char * const imx8mn_a53_sels[] = {"osc_24m", "arm_pll_out", "sys_pl
 
 static const char * const imx8mn_a53_core_sels[] = {"arm_a53_div", "arm_pll_out", };
 
+static const char * const imx8mn_m7_sels[] = {"osc_24m", "sys_pll2_200m", "sys_pll2_250m", "vpu_pll_out",
+                                      "sys_pll1_800m", "audio_pll1_out", "video_pll1_out", "sys_pll3_out", };
+
 static const char * const imx8mn_gpu_core_sels[] = {"osc_24m", "gpu_pll_out", "sys_pll1_800m",
                                                    "sys_pll3_out", "sys_pll2_1000m", "audio_pll1_out",
                                                    "video_pll1_out", "audio_pll2_out", };
@@ -402,10 +405,10 @@ static int imx8mn_clocks_probe(struct platform_device *pdev)
        hws[IMX8MN_SYS_PLL2_500M] = imx_clk_hw_fixed_factor("sys_pll2_500m", "sys_pll2_500m_cg", 1, 2);
        hws[IMX8MN_SYS_PLL2_1000M] = imx_clk_hw_fixed_factor("sys_pll2_1000m", "sys_pll2_out", 1, 1);
 
-       hws[IMX8MN_CLK_CLKOUT1_SEL] = imx_clk_hw_mux("clkout1_sel", base + 0x128, 4, 4, clkout_sels, ARRAY_SIZE(clkout_sels));
+       hws[IMX8MN_CLK_CLKOUT1_SEL] = imx_clk_hw_mux2("clkout1_sel", base + 0x128, 4, 4, clkout_sels, ARRAY_SIZE(clkout_sels));
        hws[IMX8MN_CLK_CLKOUT1_DIV] = imx_clk_hw_divider("clkout1_div", "clkout1_sel", base + 0x128, 0, 4);
        hws[IMX8MN_CLK_CLKOUT1] = imx_clk_hw_gate("clkout1", "clkout1_div", base + 0x128, 8);
-       hws[IMX8MN_CLK_CLKOUT2_SEL] = imx_clk_hw_mux("clkout2_sel", base + 0x128, 20, 4, clkout_sels, ARRAY_SIZE(clkout_sels));
+       hws[IMX8MN_CLK_CLKOUT2_SEL] = imx_clk_hw_mux2("clkout2_sel", base + 0x128, 20, 4, clkout_sels, ARRAY_SIZE(clkout_sels));
        hws[IMX8MN_CLK_CLKOUT2_DIV] = imx_clk_hw_divider("clkout2_div", "clkout2_sel", base + 0x128, 16, 4);
        hws[IMX8MN_CLK_CLKOUT2] = imx_clk_hw_gate("clkout2", "clkout2_div", base + 0x128, 24);
 
@@ -421,6 +424,8 @@ static int imx8mn_clocks_probe(struct platform_device *pdev)
        hws[IMX8MN_CLK_A53_SRC] = hws[IMX8MN_CLK_A53_DIV];
        hws[IMX8MN_CLK_A53_CG] = hws[IMX8MN_CLK_A53_DIV];
 
+       hws[IMX8MN_CLK_M7_CORE] = imx8m_clk_hw_composite_core("arm_m7_core", imx8mn_m7_sels, base + 0x8080);
+
        hws[IMX8MN_CLK_GPU_CORE] = imx8m_clk_hw_composite_core("gpu_core", imx8mn_gpu_core_sels, base + 0x8180);
        hws[IMX8MN_CLK_GPU_SHADER] = imx8m_clk_hw_composite_core("gpu_shader", imx8mn_gpu_shader_sels, base + 0x8200);
 
@@ -453,10 +458,11 @@ static int imx8mn_clocks_probe(struct platform_device *pdev)
 
        /*
         * DRAM clocks are manipulated from TF-A outside clock framework.
-        * Mark with GET_RATE_NOCACHE to always read div value from hardware
+        * The fw_managed helper sets GET_RATE_NOCACHE and clears SET_PARENT_GATE
+        * as div value should always be read from hardware
         */
-       hws[IMX8MN_CLK_DRAM_ALT] = __imx8m_clk_hw_composite("dram_alt", imx8mn_dram_alt_sels, base + 0xa000, CLK_GET_RATE_NOCACHE);
-       hws[IMX8MN_CLK_DRAM_APB] = __imx8m_clk_hw_composite("dram_apb", imx8mn_dram_apb_sels, base + 0xa080, CLK_IS_CRITICAL | CLK_GET_RATE_NOCACHE);
+       hws[IMX8MN_CLK_DRAM_ALT] = imx8m_clk_hw_fw_managed_composite("dram_alt", imx8mn_dram_alt_sels, base + 0xa000);
+       hws[IMX8MN_CLK_DRAM_APB] = imx8m_clk_hw_fw_managed_composite_critical("dram_apb", imx8mn_dram_apb_sels, base + 0xa080);
 
        hws[IMX8MN_CLK_DISP_PIXEL] = imx8m_clk_hw_composite("disp_pixel", imx8mn_disp_pixel_sels, base + 0xa500);
        hws[IMX8MN_CLK_SAI2] = imx8m_clk_hw_composite("sai2", imx8mn_sai2_sels, base + 0xa600);
index c491bc9..83cc2b1 100644 (file)
@@ -449,11 +449,12 @@ static int imx8mq_clocks_probe(struct platform_device *pdev)
 
        /*
         * DRAM clocks are manipulated from TF-A outside clock framework.
-        * Mark with GET_RATE_NOCACHE to always read div value from hardware
+        * The fw_managed helper sets GET_RATE_NOCACHE and clears SET_PARENT_GATE
+        * as div value should always be read from hardware
         */
        hws[IMX8MQ_CLK_DRAM_CORE] = imx_clk_hw_mux2_flags("dram_core_clk", base + 0x9800, 24, 1, imx8mq_dram_core_sels, ARRAY_SIZE(imx8mq_dram_core_sels), CLK_IS_CRITICAL);
-       hws[IMX8MQ_CLK_DRAM_ALT] = __imx8m_clk_hw_composite("dram_alt", imx8mq_dram_alt_sels, base + 0xa000, CLK_GET_RATE_NOCACHE);
-       hws[IMX8MQ_CLK_DRAM_APB] = __imx8m_clk_hw_composite("dram_apb", imx8mq_dram_apb_sels, base + 0xa080, CLK_IS_CRITICAL | CLK_GET_RATE_NOCACHE);
+       hws[IMX8MQ_CLK_DRAM_ALT] = imx8m_clk_hw_fw_managed_composite("dram_alt", imx8mq_dram_alt_sels, base + 0xa000);
+       hws[IMX8MQ_CLK_DRAM_APB] = imx8m_clk_hw_fw_managed_composite_critical("dram_apb", imx8mq_dram_apb_sels, base + 0xa080);
 
        /* IP */
        hws[IMX8MQ_CLK_VPU_G1] = imx8m_clk_hw_composite("vpu_g1", imx8mq_vpu_g1_sels, base + 0xa100);
index 7571603..e144f98 100644 (file)
@@ -530,8 +530,9 @@ struct clk_hw *imx_clk_hw_cpu(const char *name, const char *parent_name,
                struct clk *div, struct clk *mux, struct clk *pll,
                struct clk *step);
 
-#define IMX_COMPOSITE_CORE     BIT(0)
-#define IMX_COMPOSITE_BUS      BIT(1)
+#define IMX_COMPOSITE_CORE             BIT(0)
+#define IMX_COMPOSITE_BUS              BIT(1)
+#define IMX_COMPOSITE_FW_MANAGED       BIT(2)
 
 struct clk_hw *imx8m_clk_hw_composite_flags(const char *name,
                                            const char * const *parent_names,
@@ -567,6 +568,17 @@ struct clk_hw *imx8m_clk_hw_composite_flags(const char *name,
                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)
+
+#define imx8m_clk_hw_fw_managed_composite(name, parent_names, reg) \
+       __imx8m_clk_hw_fw_managed_composite(name, parent_names, reg, 0)
+
+#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))
 
index 886e2d9..439b7c8 100644 (file)
@@ -362,41 +362,36 @@ config COMMON_CLK_MT8167
 
 config COMMON_CLK_MT8167_AUDSYS
        bool "Clock driver for MediaTek MT8167 audsys"
-       depends on (ARCH_MEDIATEK && ARM64) || COMPILE_TEST
-       select COMMON_CLK_MEDIATEK
-       default ARCH_MEDIATEK
+       depends on COMMON_CLK_MT8167
+       default COMMON_CLK_MT8167
        help
          This driver supports MediaTek MT8167 audsys clocks.
 
 config COMMON_CLK_MT8167_IMGSYS
        bool "Clock driver for MediaTek MT8167 imgsys"
-       depends on (ARCH_MEDIATEK && ARM64) || COMPILE_TEST
-       select COMMON_CLK_MEDIATEK
-       default ARCH_MEDIATEK
+       depends on COMMON_CLK_MT8167
+       default COMMON_CLK_MT8167
        help
          This driver supports MediaTek MT8167 imgsys clocks.
 
 config COMMON_CLK_MT8167_MFGCFG
        bool "Clock driver for MediaTek MT8167 mfgcfg"
-       depends on (ARCH_MEDIATEK && ARM64) || COMPILE_TEST
-       select COMMON_CLK_MEDIATEK
-       default ARCH_MEDIATEK
+       depends on COMMON_CLK_MT8167
+       default COMMON_CLK_MT8167
        help
          This driver supports MediaTek MT8167 mfgcfg clocks.
 
 config COMMON_CLK_MT8167_MMSYS
        bool "Clock driver for MediaTek MT8167 mmsys"
-       depends on (ARCH_MEDIATEK && ARM64) || COMPILE_TEST
-       select COMMON_CLK_MEDIATEK
-       default ARCH_MEDIATEK
+       depends on COMMON_CLK_MT8167
+       default COMMON_CLK_MT8167
        help
          This driver supports MediaTek MT8167 mmsys clocks.
 
 config COMMON_CLK_MT8167_VDECSYS
        bool "Clock driver for MediaTek MT8167 vdecsys"
-       depends on (ARCH_MEDIATEK && ARM64) || COMPILE_TEST
-       select COMMON_CLK_MEDIATEK
-       default ARCH_MEDIATEK
+       depends on COMMON_CLK_MT8167
+       default COMMON_CLK_MT8167
        help
          This driver supports MediaTek MT8167 vdecsys clocks.
 
@@ -500,6 +495,86 @@ config COMMON_CLK_MT8183_VENCSYS
        help
          This driver supports MediaTek MT8183 vencsys clocks.
 
+config COMMON_CLK_MT8192
+       bool "Clock driver for MediaTek MT8192"
+       depends on ARM64 || COMPILE_TEST
+       select COMMON_CLK_MEDIATEK
+       default ARM64
+       help
+         This driver supports MediaTek MT8192 basic clocks.
+
+config COMMON_CLK_MT8192_AUDSYS
+       bool "Clock driver for MediaTek MT8192 audsys"
+       depends on COMMON_CLK_MT8192
+       help
+         This driver supports MediaTek MT8192 audsys clocks.
+
+config COMMON_CLK_MT8192_CAMSYS
+       bool "Clock driver for MediaTek MT8192 camsys"
+       depends on COMMON_CLK_MT8192
+       help
+         This driver supports MediaTek MT8192 camsys and camsys_raw clocks.
+
+config COMMON_CLK_MT8192_IMGSYS
+       bool "Clock driver for MediaTek MT8192 imgsys"
+       depends on COMMON_CLK_MT8192
+       help
+         This driver supports MediaTek MT8192 imgsys and imgsys2 clocks.
+
+config COMMON_CLK_MT8192_IMP_IIC_WRAP
+       bool "Clock driver for MediaTek MT8192 imp_iic_wrap"
+       depends on COMMON_CLK_MT8192
+       help
+         This driver supports MediaTek MT8192 imp_iic_wrap clocks.
+
+config COMMON_CLK_MT8192_IPESYS
+       bool "Clock driver for MediaTek MT8192 ipesys"
+       depends on COMMON_CLK_MT8192
+       help
+         This driver supports MediaTek MT8192 ipesys clocks.
+
+config COMMON_CLK_MT8192_MDPSYS
+       bool "Clock driver for MediaTek MT8192 mdpsys"
+       depends on COMMON_CLK_MT8192
+       help
+         This driver supports MediaTek MT8192 mdpsys clocks.
+
+config COMMON_CLK_MT8192_MFGCFG
+       bool "Clock driver for MediaTek MT8192 mfgcfg"
+       depends on COMMON_CLK_MT8192
+       help
+         This driver supports MediaTek MT8192 mfgcfg clocks.
+
+config COMMON_CLK_MT8192_MMSYS
+       bool "Clock driver for MediaTek MT8192 mmsys"
+       depends on COMMON_CLK_MT8192
+       help
+         This driver supports MediaTek MT8192 mmsys clocks.
+
+config COMMON_CLK_MT8192_MSDC
+       bool "Clock driver for MediaTek MT8192 msdc"
+       depends on COMMON_CLK_MT8192
+       help
+         This driver supports MediaTek MT8192 msdc and msdc_top clocks.
+
+config COMMON_CLK_MT8192_SCP_ADSP
+       bool "Clock driver for MediaTek MT8192 scp_adsp"
+       depends on COMMON_CLK_MT8192
+       help
+         This driver supports MediaTek MT8192 scp_adsp clocks.
+
+config COMMON_CLK_MT8192_VDECSYS
+       bool "Clock driver for MediaTek MT8192 vdecsys"
+       depends on COMMON_CLK_MT8192
+       help
+         This driver supports MediaTek MT8192 vdecsys and vdecsys_soc clocks.
+
+config COMMON_CLK_MT8192_VENCSYS
+       bool "Clock driver for MediaTek MT8192 vencsys"
+       depends on COMMON_CLK_MT8192
+       help
+         This driver supports MediaTek MT8192 vencsys clocks.
+
 config COMMON_CLK_MT8516
        bool "Clock driver for MediaTek MT8516"
        depends on ARCH_MEDIATEK || COMPILE_TEST
index 3b0c2be..15bc045 100644 (file)
@@ -67,5 +67,18 @@ obj-$(CONFIG_COMMON_CLK_MT8183_MFGCFG) += clk-mt8183-mfgcfg.o
 obj-$(CONFIG_COMMON_CLK_MT8183_MMSYS) += clk-mt8183-mm.o
 obj-$(CONFIG_COMMON_CLK_MT8183_VDECSYS) += clk-mt8183-vdec.o
 obj-$(CONFIG_COMMON_CLK_MT8183_VENCSYS) += clk-mt8183-venc.o
+obj-$(CONFIG_COMMON_CLK_MT8192) += clk-mt8192.o
+obj-$(CONFIG_COMMON_CLK_MT8192_AUDSYS) += clk-mt8192-aud.o
+obj-$(CONFIG_COMMON_CLK_MT8192_CAMSYS) += clk-mt8192-cam.o
+obj-$(CONFIG_COMMON_CLK_MT8192_IMGSYS) += clk-mt8192-img.o
+obj-$(CONFIG_COMMON_CLK_MT8192_IMP_IIC_WRAP) += clk-mt8192-imp_iic_wrap.o
+obj-$(CONFIG_COMMON_CLK_MT8192_IPESYS) += clk-mt8192-ipe.o
+obj-$(CONFIG_COMMON_CLK_MT8192_MDPSYS) += clk-mt8192-mdp.o
+obj-$(CONFIG_COMMON_CLK_MT8192_MFGCFG) += clk-mt8192-mfg.o
+obj-$(CONFIG_COMMON_CLK_MT8192_MMSYS) += clk-mt8192-mm.o
+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_MT8516) += clk-mt8516.o
 obj-$(CONFIG_COMMON_CLK_MT8516_AUDSYS) += clk-mt8516-aud.o
index 79fe090..61eeae4 100644 (file)
@@ -84,7 +84,7 @@ int mtk_clk_register_cpumuxes(struct device_node *node,
        struct clk *clk;
        struct regmap *regmap;
 
-       regmap = syscon_node_to_regmap(node);
+       regmap = device_node_to_regmap(node);
        if (IS_ERR(regmap)) {
                pr_err("Cannot find regmap for %pOF: %ld\n", node,
                       PTR_ERR(regmap));
diff --git a/drivers/clk/mediatek/clk-mt8192-aud.c b/drivers/clk/mediatek/clk-mt8192-aud.c
new file mode 100644 (file)
index 0000000..f28d566
--- /dev/null
@@ -0,0 +1,118 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include <linux/clk-provider.h>
+#include <linux/of_platform.h>
+#include <linux/platform_device.h>
+
+#include "clk-mtk.h"
+#include "clk-gate.h"
+
+#include <dt-bindings/clock/mt8192-clk.h>
+
+static const struct mtk_gate_regs aud0_cg_regs = {
+       .set_ofs = 0x0,
+       .clr_ofs = 0x0,
+       .sta_ofs = 0x0,
+};
+
+static const struct mtk_gate_regs aud1_cg_regs = {
+       .set_ofs = 0x4,
+       .clr_ofs = 0x4,
+       .sta_ofs = 0x4,
+};
+
+static const struct mtk_gate_regs aud2_cg_regs = {
+       .set_ofs = 0x8,
+       .clr_ofs = 0x8,
+       .sta_ofs = 0x8,
+};
+
+#define GATE_AUD0(_id, _name, _parent, _shift) \
+       GATE_MTK(_id, _name, _parent, &aud0_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr)
+
+#define GATE_AUD1(_id, _name, _parent, _shift) \
+       GATE_MTK(_id, _name, _parent, &aud1_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr)
+
+#define GATE_AUD2(_id, _name, _parent, _shift) \
+       GATE_MTK(_id, _name, _parent, &aud2_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr)
+
+static const struct mtk_gate aud_clks[] = {
+       /* AUD0 */
+       GATE_AUD0(CLK_AUD_AFE, "aud_afe", "audio_sel", 2),
+       GATE_AUD0(CLK_AUD_22M, "aud_22m", "aud_engen1_sel", 8),
+       GATE_AUD0(CLK_AUD_24M, "aud_24m", "aud_engen2_sel", 9),
+       GATE_AUD0(CLK_AUD_APLL2_TUNER, "aud_apll2_tuner", "aud_engen2_sel", 18),
+       GATE_AUD0(CLK_AUD_APLL_TUNER, "aud_apll_tuner", "aud_engen1_sel", 19),
+       GATE_AUD0(CLK_AUD_TDM, "aud_tdm", "aud_1_sel", 20),
+       GATE_AUD0(CLK_AUD_ADC, "aud_adc", "audio_sel", 24),
+       GATE_AUD0(CLK_AUD_DAC, "aud_dac", "audio_sel", 25),
+       GATE_AUD0(CLK_AUD_DAC_PREDIS, "aud_dac_predis", "audio_sel", 26),
+       GATE_AUD0(CLK_AUD_TML, "aud_tml", "audio_sel", 27),
+       GATE_AUD0(CLK_AUD_NLE, "aud_nle", "audio_sel", 28),
+       /* AUD1 */
+       GATE_AUD1(CLK_AUD_I2S1_B, "aud_i2s1_b", "audio_sel", 4),
+       GATE_AUD1(CLK_AUD_I2S2_B, "aud_i2s2_b", "audio_sel", 5),
+       GATE_AUD1(CLK_AUD_I2S3_B, "aud_i2s3_b", "audio_sel", 6),
+       GATE_AUD1(CLK_AUD_I2S4_B, "aud_i2s4_b", "audio_sel", 7),
+       GATE_AUD1(CLK_AUD_CONNSYS_I2S_ASRC, "aud_connsys_i2s_asrc", "audio_sel", 12),
+       GATE_AUD1(CLK_AUD_GENERAL1_ASRC, "aud_general1_asrc", "audio_sel", 13),
+       GATE_AUD1(CLK_AUD_GENERAL2_ASRC, "aud_general2_asrc", "audio_sel", 14),
+       GATE_AUD1(CLK_AUD_DAC_HIRES, "aud_dac_hires", "audio_h_sel", 15),
+       GATE_AUD1(CLK_AUD_ADC_HIRES, "aud_adc_hires", "audio_h_sel", 16),
+       GATE_AUD1(CLK_AUD_ADC_HIRES_TML, "aud_adc_hires_tml", "audio_h_sel", 17),
+       GATE_AUD1(CLK_AUD_ADDA6_ADC, "aud_adda6_adc", "audio_sel", 20),
+       GATE_AUD1(CLK_AUD_ADDA6_ADC_HIRES, "aud_adda6_adc_hires", "audio_h_sel", 21),
+       GATE_AUD1(CLK_AUD_3RD_DAC, "aud_3rd_dac", "audio_sel", 28),
+       GATE_AUD1(CLK_AUD_3RD_DAC_PREDIS, "aud_3rd_dac_predis", "audio_sel", 29),
+       GATE_AUD1(CLK_AUD_3RD_DAC_TML, "aud_3rd_dac_tml", "audio_sel", 30),
+       GATE_AUD1(CLK_AUD_3RD_DAC_HIRES, "aud_3rd_dac_hires", "audio_h_sel", 31),
+       /* AUD2 */
+       GATE_AUD2(CLK_AUD_I2S5_B, "aud_i2s5_b", "audio_sel", 0),
+       GATE_AUD2(CLK_AUD_I2S6_B, "aud_i2s6_b", "audio_sel", 1),
+       GATE_AUD2(CLK_AUD_I2S7_B, "aud_i2s7_b", "audio_sel", 2),
+       GATE_AUD2(CLK_AUD_I2S8_B, "aud_i2s8_b", "audio_sel", 3),
+       GATE_AUD2(CLK_AUD_I2S9_B, "aud_i2s9_b", "audio_sel", 4),
+};
+
+static int clk_mt8192_aud_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_AUD_NR_CLK);
+       if (!clk_data)
+               return -ENOMEM;
+
+       r = mtk_clk_register_gates(node, aud_clks, ARRAY_SIZE(aud_clks), clk_data);
+       if (r)
+               return r;
+
+       r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+       if (r)
+               return r;
+
+       r = devm_of_platform_populate(&pdev->dev);
+       if (r)
+               of_clk_del_provider(node);
+
+       return r;
+}
+
+static const struct of_device_id of_match_clk_mt8192_aud[] = {
+       { .compatible = "mediatek,mt8192-audsys", },
+       {}
+};
+
+static struct platform_driver clk_mt8192_aud_drv = {
+       .probe = clk_mt8192_aud_probe,
+       .driver = {
+               .name = "clk-mt8192-aud",
+               .of_match_table = of_match_clk_mt8192_aud,
+       },
+};
+
+builtin_platform_driver(clk_mt8192_aud_drv);
diff --git a/drivers/clk/mediatek/clk-mt8192-cam.c b/drivers/clk/mediatek/clk-mt8192-cam.c
new file mode 100644 (file)
index 0000000..fc74cd8
--- /dev/null
@@ -0,0 +1,107 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include <linux/clk-provider.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+
+#include "clk-mtk.h"
+#include "clk-gate.h"
+
+#include <dt-bindings/clock/mt8192-clk.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", "cam_sel", 0),
+       GATE_CAM(CLK_CAM_DFP_VAD, "cam_dfp_vad", "cam_sel", 1),
+       GATE_CAM(CLK_CAM_LARB14, "cam_larb14", "cam_sel", 2),
+       GATE_CAM(CLK_CAM_CAM, "cam_cam", "cam_sel", 6),
+       GATE_CAM(CLK_CAM_CAMTG, "cam_camtg", "cam_sel", 7),
+       GATE_CAM(CLK_CAM_SENINF, "cam_seninf", "cam_sel", 8),
+       GATE_CAM(CLK_CAM_CAMSV0, "cam_camsv0", "cam_sel", 9),
+       GATE_CAM(CLK_CAM_CAMSV1, "cam_camsv1", "cam_sel", 10),
+       GATE_CAM(CLK_CAM_CAMSV2, "cam_camsv2", "cam_sel", 11),
+       GATE_CAM(CLK_CAM_CAMSV3, "cam_camsv3", "cam_sel", 12),
+       GATE_CAM(CLK_CAM_CCU0, "cam_ccu0", "cam_sel", 13),
+       GATE_CAM(CLK_CAM_CCU1, "cam_ccu1", "cam_sel", 14),
+       GATE_CAM(CLK_CAM_MRAW0, "cam_mraw0", "cam_sel", 15),
+       GATE_CAM(CLK_CAM_FAKE_ENG, "cam_fake_eng", "cam_sel", 17),
+       GATE_CAM(CLK_CAM_CCU_GALS, "cam_ccu_gals", "cam_sel", 18),
+       GATE_CAM(CLK_CAM_CAM2MM_GALS, "cam2mm_gals", "cam_sel", 19),
+};
+
+static const struct mtk_gate cam_rawa_clks[] = {
+       GATE_CAM(CLK_CAM_RAWA_LARBX, "cam_rawa_larbx", "cam_sel", 0),
+       GATE_CAM(CLK_CAM_RAWA_CAM, "cam_rawa_cam", "cam_sel", 1),
+       GATE_CAM(CLK_CAM_RAWA_CAMTG, "cam_rawa_camtg", "cam_sel", 2),
+};
+
+static const struct mtk_gate cam_rawb_clks[] = {
+       GATE_CAM(CLK_CAM_RAWB_LARBX, "cam_rawb_larbx", "cam_sel", 0),
+       GATE_CAM(CLK_CAM_RAWB_CAM, "cam_rawb_cam", "cam_sel", 1),
+       GATE_CAM(CLK_CAM_RAWB_CAMTG, "cam_rawb_camtg", "cam_sel", 2),
+};
+
+static const struct mtk_gate cam_rawc_clks[] = {
+       GATE_CAM(CLK_CAM_RAWC_LARBX, "cam_rawc_larbx", "cam_sel", 0),
+       GATE_CAM(CLK_CAM_RAWC_CAM, "cam_rawc_cam", "cam_sel", 1),
+       GATE_CAM(CLK_CAM_RAWC_CAMTG, "cam_rawc_camtg", "cam_sel", 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_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_rawc_desc = {
+       .clks = cam_rawc_clks,
+       .num_clks = ARRAY_SIZE(cam_rawc_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8192_cam[] = {
+       {
+               .compatible = "mediatek,mt8192-camsys",
+               .data = &cam_desc,
+       }, {
+               .compatible = "mediatek,mt8192-camsys_rawa",
+               .data = &cam_rawa_desc,
+       }, {
+               .compatible = "mediatek,mt8192-camsys_rawb",
+               .data = &cam_rawb_desc,
+       }, {
+               .compatible = "mediatek,mt8192-camsys_rawc",
+               .data = &cam_rawc_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8192_cam_drv = {
+       .probe = mtk_clk_simple_probe,
+       .driver = {
+               .name = "clk-mt8192-cam",
+               .of_match_table = of_match_clk_mt8192_cam,
+       },
+};
+
+builtin_platform_driver(clk_mt8192_cam_drv);
diff --git a/drivers/clk/mediatek/clk-mt8192-img.c b/drivers/clk/mediatek/clk-mt8192-img.c
new file mode 100644 (file)
index 0000000..7ce3abe
--- /dev/null
@@ -0,0 +1,70 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include <linux/clk-provider.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+
+#include "clk-mtk.h"
+#include "clk-gate.h"
+
+#include <dt-bindings/clock/mt8192-clk.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", "img1_sel", 0),
+       GATE_IMG(CLK_IMG_LARB10, "img_larb10", "img1_sel", 1),
+       GATE_IMG(CLK_IMG_DIP, "img_dip", "img1_sel", 2),
+       GATE_IMG(CLK_IMG_GALS, "img_gals", "img1_sel", 12),
+};
+
+static const struct mtk_gate img2_clks[] = {
+       GATE_IMG(CLK_IMG2_LARB11, "img2_larb11", "img1_sel", 0),
+       GATE_IMG(CLK_IMG2_LARB12, "img2_larb12", "img1_sel", 1),
+       GATE_IMG(CLK_IMG2_MFB, "img2_mfb", "img1_sel", 6),
+       GATE_IMG(CLK_IMG2_WPE, "img2_wpe", "img1_sel", 7),
+       GATE_IMG(CLK_IMG2_MSS, "img2_mss", "img1_sel", 8),
+       GATE_IMG(CLK_IMG2_GALS, "img2_gals", "img1_sel", 12),
+};
+
+static const struct mtk_clk_desc img_desc = {
+       .clks = img_clks,
+       .num_clks = ARRAY_SIZE(img_clks),
+};
+
+static const struct mtk_clk_desc img2_desc = {
+       .clks = img2_clks,
+       .num_clks = ARRAY_SIZE(img2_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8192_img[] = {
+       {
+               .compatible = "mediatek,mt8192-imgsys",
+               .data = &img_desc,
+       }, {
+               .compatible = "mediatek,mt8192-imgsys2",
+               .data = &img2_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8192_img_drv = {
+       .probe = mtk_clk_simple_probe,
+       .driver = {
+               .name = "clk-mt8192-img",
+               .of_match_table = of_match_clk_mt8192_img,
+       },
+};
+
+builtin_platform_driver(clk_mt8192_img_drv);
diff --git a/drivers/clk/mediatek/clk-mt8192-imp_iic_wrap.c b/drivers/clk/mediatek/clk-mt8192-imp_iic_wrap.c
new file mode 100644 (file)
index 0000000..700356a
--- /dev/null
@@ -0,0 +1,119 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include <linux/clk-provider.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+
+#include "clk-mtk.h"
+#include "clk-gate.h"
+
+#include <dt-bindings/clock/mt8192-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_c_clks[] = {
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_C_I2C10, "imp_iic_wrap_c_i2c10", "infra_i2c0", 0),
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_C_I2C11, "imp_iic_wrap_c_i2c11", "infra_i2c0", 1),
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_C_I2C12, "imp_iic_wrap_c_i2c12", "infra_i2c0", 2),
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_C_I2C13, "imp_iic_wrap_c_i2c13", "infra_i2c0", 3),
+};
+
+static const struct mtk_gate imp_iic_wrap_e_clks[] = {
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_E_I2C3, "imp_iic_wrap_e_i2c3", "infra_i2c0", 0),
+};
+
+static const struct mtk_gate imp_iic_wrap_n_clks[] = {
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_N_I2C0, "imp_iic_wrap_n_i2c0", "infra_i2c0", 0),
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_N_I2C6, "imp_iic_wrap_n_i2c6", "infra_i2c0", 1),
+};
+
+static const struct mtk_gate imp_iic_wrap_s_clks[] = {
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_S_I2C7, "imp_iic_wrap_s_i2c7", "infra_i2c0", 0),
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_S_I2C8, "imp_iic_wrap_s_i2c8", "infra_i2c0", 1),
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_S_I2C9, "imp_iic_wrap_s_i2c9", "infra_i2c0", 2),
+};
+
+static const struct mtk_gate imp_iic_wrap_w_clks[] = {
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_W_I2C5, "imp_iic_wrap_w_i2c5", "infra_i2c0", 0),
+};
+
+static const struct mtk_gate imp_iic_wrap_ws_clks[] = {
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_WS_I2C1, "imp_iic_wrap_ws_i2c1", "infra_i2c0", 0),
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_WS_I2C2, "imp_iic_wrap_ws_i2c2", "infra_i2c0", 1),
+       GATE_IMP_IIC_WRAP(CLK_IMP_IIC_WRAP_WS_I2C4, "imp_iic_wrap_ws_i2c4", "infra_i2c0", 2),
+};
+
+static const struct mtk_clk_desc imp_iic_wrap_c_desc = {
+       .clks = imp_iic_wrap_c_clks,
+       .num_clks = ARRAY_SIZE(imp_iic_wrap_c_clks),
+};
+
+static const struct mtk_clk_desc imp_iic_wrap_e_desc = {
+       .clks = imp_iic_wrap_e_clks,
+       .num_clks = ARRAY_SIZE(imp_iic_wrap_e_clks),
+};
+
+static const struct mtk_clk_desc imp_iic_wrap_n_desc = {
+       .clks = imp_iic_wrap_n_clks,
+       .num_clks = ARRAY_SIZE(imp_iic_wrap_n_clks),
+};
+
+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 mtk_clk_desc imp_iic_wrap_ws_desc = {
+       .clks = imp_iic_wrap_ws_clks,
+       .num_clks = ARRAY_SIZE(imp_iic_wrap_ws_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8192_imp_iic_wrap[] = {
+       {
+               .compatible = "mediatek,mt8192-imp_iic_wrap_c",
+               .data = &imp_iic_wrap_c_desc,
+       }, {
+               .compatible = "mediatek,mt8192-imp_iic_wrap_e",
+               .data = &imp_iic_wrap_e_desc,
+       }, {
+               .compatible = "mediatek,mt8192-imp_iic_wrap_n",
+               .data = &imp_iic_wrap_n_desc,
+       }, {
+               .compatible = "mediatek,mt8192-imp_iic_wrap_s",
+               .data = &imp_iic_wrap_s_desc,
+       }, {
+               .compatible = "mediatek,mt8192-imp_iic_wrap_w",
+               .data = &imp_iic_wrap_w_desc,
+       }, {
+               .compatible = "mediatek,mt8192-imp_iic_wrap_ws",
+               .data = &imp_iic_wrap_ws_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8192_imp_iic_wrap_drv = {
+       .probe = mtk_clk_simple_probe,
+       .driver = {
+               .name = "clk-mt8192-imp_iic_wrap",
+               .of_match_table = of_match_clk_mt8192_imp_iic_wrap,
+       },
+};
+
+builtin_platform_driver(clk_mt8192_imp_iic_wrap_drv);
diff --git a/drivers/clk/mediatek/clk-mt8192-ipe.c b/drivers/clk/mediatek/clk-mt8192-ipe.c
new file mode 100644 (file)
index 0000000..730d91b
--- /dev/null
@@ -0,0 +1,57 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include <linux/clk-provider.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+
+#include "clk-mtk.h"
+#include "clk-gate.h"
+
+#include <dt-bindings/clock/mt8192-clk.h>
+
+static const struct mtk_gate_regs ipe_cg_regs = {
+       .set_ofs = 0x4,
+       .clr_ofs = 0x8,
+       .sta_ofs = 0x0,
+};
+
+#define GATE_IPE(_id, _name, _parent, _shift)  \
+       GATE_MTK(_id, _name, _parent, &ipe_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+static const struct mtk_gate ipe_clks[] = {
+       GATE_IPE(CLK_IPE_LARB19, "ipe_larb19", "ipe_sel", 0),
+       GATE_IPE(CLK_IPE_LARB20, "ipe_larb20", "ipe_sel", 1),
+       GATE_IPE(CLK_IPE_SMI_SUBCOM, "ipe_smi_subcom", "ipe_sel", 2),
+       GATE_IPE(CLK_IPE_FD, "ipe_fd", "ipe_sel", 3),
+       GATE_IPE(CLK_IPE_FE, "ipe_fe", "ipe_sel", 4),
+       GATE_IPE(CLK_IPE_RSC, "ipe_rsc", "ipe_sel", 5),
+       GATE_IPE(CLK_IPE_DPE, "ipe_dpe", "ipe_sel", 6),
+       GATE_IPE(CLK_IPE_GALS, "ipe_gals", "ipe_sel", 8),
+};
+
+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_mt8192_ipe[] = {
+       {
+               .compatible = "mediatek,mt8192-ipesys",
+               .data = &ipe_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8192_ipe_drv = {
+       .probe = mtk_clk_simple_probe,
+       .driver = {
+               .name = "clk-mt8192-ipe",
+               .of_match_table = of_match_clk_mt8192_ipe,
+       },
+};
+
+builtin_platform_driver(clk_mt8192_ipe_drv);
diff --git a/drivers/clk/mediatek/clk-mt8192-mdp.c b/drivers/clk/mediatek/clk-mt8192-mdp.c
new file mode 100644 (file)
index 0000000..93c87ae
--- /dev/null
@@ -0,0 +1,82 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include <linux/clk-provider.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+
+#include "clk-mtk.h"
+#include "clk-gate.h"
+
+#include <dt-bindings/clock/mt8192-clk.h>
+
+static const struct mtk_gate_regs mdp0_cg_regs = {
+       .set_ofs = 0x104,
+       .clr_ofs = 0x108,
+       .sta_ofs = 0x100,
+};
+
+static const struct mtk_gate_regs mdp1_cg_regs = {
+       .set_ofs = 0x124,
+       .clr_ofs = 0x128,
+       .sta_ofs = 0x120,
+};
+
+#define GATE_MDP0(_id, _name, _parent, _shift) \
+       GATE_MTK(_id, _name, _parent, &mdp0_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+#define GATE_MDP1(_id, _name, _parent, _shift) \
+       GATE_MTK(_id, _name, _parent, &mdp1_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+static const struct mtk_gate mdp_clks[] = {
+       /* MDP0 */
+       GATE_MDP0(CLK_MDP_RDMA0, "mdp_mdp_rdma0", "mdp_sel", 0),
+       GATE_MDP0(CLK_MDP_TDSHP0, "mdp_mdp_tdshp0", "mdp_sel", 1),
+       GATE_MDP0(CLK_MDP_IMG_DL_ASYNC0, "mdp_img_dl_async0", "mdp_sel", 2),
+       GATE_MDP0(CLK_MDP_IMG_DL_ASYNC1, "mdp_img_dl_async1", "mdp_sel", 3),
+       GATE_MDP0(CLK_MDP_RDMA1, "mdp_mdp_rdma1", "mdp_sel", 4),
+       GATE_MDP0(CLK_MDP_TDSHP1, "mdp_mdp_tdshp1", "mdp_sel", 5),
+       GATE_MDP0(CLK_MDP_SMI0, "mdp_smi0", "mdp_sel", 6),
+       GATE_MDP0(CLK_MDP_APB_BUS, "mdp_apb_bus", "mdp_sel", 7),
+       GATE_MDP0(CLK_MDP_WROT0, "mdp_mdp_wrot0", "mdp_sel", 8),
+       GATE_MDP0(CLK_MDP_RSZ0, "mdp_mdp_rsz0", "mdp_sel", 9),
+       GATE_MDP0(CLK_MDP_HDR0, "mdp_mdp_hdr0", "mdp_sel", 10),
+       GATE_MDP0(CLK_MDP_MUTEX0, "mdp_mdp_mutex0", "mdp_sel", 11),
+       GATE_MDP0(CLK_MDP_WROT1, "mdp_mdp_wrot1", "mdp_sel", 12),
+       GATE_MDP0(CLK_MDP_RSZ1, "mdp_mdp_rsz1", "mdp_sel", 13),
+       GATE_MDP0(CLK_MDP_HDR1, "mdp_mdp_hdr1", "mdp_sel", 14),
+       GATE_MDP0(CLK_MDP_FAKE_ENG0, "mdp_mdp_fake_eng0", "mdp_sel", 15),
+       GATE_MDP0(CLK_MDP_AAL0, "mdp_mdp_aal0", "mdp_sel", 16),
+       GATE_MDP0(CLK_MDP_AAL1, "mdp_mdp_aal1", "mdp_sel", 17),
+       GATE_MDP0(CLK_MDP_COLOR0, "mdp_mdp_color0", "mdp_sel", 18),
+       GATE_MDP0(CLK_MDP_COLOR1, "mdp_mdp_color1", "mdp_sel", 19),
+       /* MDP1 */
+       GATE_MDP1(CLK_MDP_IMG_DL_RELAY0_ASYNC0, "mdp_img_dl_relay0_async0", "mdp_sel", 0),
+       GATE_MDP1(CLK_MDP_IMG_DL_RELAY1_ASYNC1, "mdp_img_dl_relay1_async1", "mdp_sel", 8),
+};
+
+static const struct mtk_clk_desc mdp_desc = {
+       .clks = mdp_clks,
+       .num_clks = ARRAY_SIZE(mdp_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8192_mdp[] = {
+       {
+               .compatible = "mediatek,mt8192-mdpsys",
+               .data = &mdp_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8192_mdp_drv = {
+       .probe = mtk_clk_simple_probe,
+       .driver = {
+               .name = "clk-mt8192-mdp",
+               .of_match_table = of_match_clk_mt8192_mdp,
+       },
+};
+
+builtin_platform_driver(clk_mt8192_mdp_drv);
diff --git a/drivers/clk/mediatek/clk-mt8192-mfg.c b/drivers/clk/mediatek/clk-mt8192-mfg.c
new file mode 100644 (file)
index 0000000..3bbc746
--- /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 <linux/clk-provider.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+
+#include "clk-mtk.h"
+#include "clk-gate.h"
+
+#include <dt-bindings/clock/mt8192-clk.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", "mfg_pll_sel", 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_mt8192_mfg[] = {
+       {
+               .compatible = "mediatek,mt8192-mfgcfg",
+               .data = &mfg_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8192_mfg_drv = {
+       .probe = mtk_clk_simple_probe,
+       .driver = {
+               .name = "clk-mt8192-mfg",
+               .of_match_table = of_match_clk_mt8192_mfg,
+       },
+};
+
+builtin_platform_driver(clk_mt8192_mfg_drv);
diff --git a/drivers/clk/mediatek/clk-mt8192-mm.c b/drivers/clk/mediatek/clk-mt8192-mm.c
new file mode 100644 (file)
index 0000000..4a0b4c4
--- /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 <linux/clk-provider.h>
+#include <linux/platform_device.h>
+
+#include "clk-mtk.h"
+#include "clk-gate.h"
+
+#include <dt-bindings/clock/mt8192-clk.h>
+
+static const struct mtk_gate_regs mm0_cg_regs = {
+       .set_ofs = 0x104,
+       .clr_ofs = 0x108,
+       .sta_ofs = 0x100,
+};
+
+static const struct mtk_gate_regs mm1_cg_regs = {
+       .set_ofs = 0x114,
+       .clr_ofs = 0x118,
+       .sta_ofs = 0x110,
+};
+
+static const struct mtk_gate_regs mm2_cg_regs = {
+       .set_ofs = 0x1a4,
+       .clr_ofs = 0x1a8,
+       .sta_ofs = 0x1a0,
+};
+
+#define GATE_MM0(_id, _name, _parent, _shift)  \
+       GATE_MTK(_id, _name, _parent, &mm0_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+#define GATE_MM1(_id, _name, _parent, _shift)  \
+       GATE_MTK(_id, _name, _parent, &mm1_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+#define GATE_MM2(_id, _name, _parent, _shift)  \
+       GATE_MTK(_id, _name, _parent, &mm2_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+static const struct mtk_gate mm_clks[] = {
+       /* MM0 */
+       GATE_MM0(CLK_MM_DISP_MUTEX0, "mm_disp_mutex0", "disp_sel", 0),
+       GATE_MM0(CLK_MM_DISP_CONFIG, "mm_disp_config", "disp_sel", 1),
+       GATE_MM0(CLK_MM_DISP_OVL0, "mm_disp_ovl0", "disp_sel", 2),
+       GATE_MM0(CLK_MM_DISP_RDMA0, "mm_disp_rdma0", "disp_sel", 3),
+       GATE_MM0(CLK_MM_DISP_OVL0_2L, "mm_disp_ovl0_2l", "disp_sel", 4),
+       GATE_MM0(CLK_MM_DISP_WDMA0, "mm_disp_wdma0", "disp_sel", 5),
+       GATE_MM0(CLK_MM_DISP_UFBC_WDMA0, "mm_disp_ufbc_wdma0", "disp_sel", 6),
+       GATE_MM0(CLK_MM_DISP_RSZ0, "mm_disp_rsz0", "disp_sel", 7),
+       GATE_MM0(CLK_MM_DISP_AAL0, "mm_disp_aal0", "disp_sel", 8),
+       GATE_MM0(CLK_MM_DISP_CCORR0, "mm_disp_ccorr0", "disp_sel", 9),
+       GATE_MM0(CLK_MM_DISP_DITHER0, "mm_disp_dither0", "disp_sel", 10),
+       GATE_MM0(CLK_MM_SMI_INFRA, "mm_smi_infra", "disp_sel", 11),
+       GATE_MM0(CLK_MM_DISP_GAMMA0, "mm_disp_gamma0", "disp_sel", 12),
+       GATE_MM0(CLK_MM_DISP_POSTMASK0, "mm_disp_postmask0", "disp_sel", 13),
+       GATE_MM0(CLK_MM_DISP_DSC_WRAP0, "mm_disp_dsc_wrap0", "disp_sel", 14),
+       GATE_MM0(CLK_MM_DSI0, "mm_dsi0", "disp_sel", 15),
+       GATE_MM0(CLK_MM_DISP_COLOR0, "mm_disp_color0", "disp_sel", 16),
+       GATE_MM0(CLK_MM_SMI_COMMON, "mm_smi_common", "disp_sel", 17),
+       GATE_MM0(CLK_MM_DISP_FAKE_ENG0, "mm_disp_fake_eng0", "disp_sel", 18),
+       GATE_MM0(CLK_MM_DISP_FAKE_ENG1, "mm_disp_fake_eng1", "disp_sel", 19),
+       GATE_MM0(CLK_MM_MDP_TDSHP4, "mm_mdp_tdshp4", "disp_sel", 20),
+       GATE_MM0(CLK_MM_MDP_RSZ4, "mm_mdp_rsz4", "disp_sel", 21),
+       GATE_MM0(CLK_MM_MDP_AAL4, "mm_mdp_aal4", "disp_sel", 22),
+       GATE_MM0(CLK_MM_MDP_HDR4, "mm_mdp_hdr4", "disp_sel", 23),
+       GATE_MM0(CLK_MM_MDP_RDMA4, "mm_mdp_rdma4", "disp_sel", 24),
+       GATE_MM0(CLK_MM_MDP_COLOR4, "mm_mdp_color4", "disp_sel", 25),
+       GATE_MM0(CLK_MM_DISP_Y2R0, "mm_disp_y2r0", "disp_sel", 26),
+       GATE_MM0(CLK_MM_SMI_GALS, "mm_smi_gals", "disp_sel", 27),
+       GATE_MM0(CLK_MM_DISP_OVL2_2L, "mm_disp_ovl2_2l", "disp_sel", 28),
+       GATE_MM0(CLK_MM_DISP_RDMA4, "mm_disp_rdma4", "disp_sel", 29),
+       GATE_MM0(CLK_MM_DISP_DPI0, "mm_disp_dpi0", "disp_sel", 30),
+       /* MM1 */
+       GATE_MM1(CLK_MM_SMI_IOMMU, "mm_smi_iommu", "disp_sel", 0),
+       /* MM2 */
+       GATE_MM2(CLK_MM_DSI_DSI0, "mm_dsi_dsi0", "disp_sel", 0),
+       GATE_MM2(CLK_MM_DPI_DPI0, "mm_dpi_dpi0", "dpi_sel", 8),
+       GATE_MM2(CLK_MM_26MHZ, "mm_26mhz", "clk26m", 24),
+       GATE_MM2(CLK_MM_32KHZ, "mm_32khz", "clk32k", 25),
+};
+
+static int clk_mt8192_mm_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_MM_NR_CLK);
+       if (!clk_data)
+               return -ENOMEM;
+
+       r = mtk_clk_register_gates(node, mm_clks, ARRAY_SIZE(mm_clks), clk_data);
+       if (r)
+               return r;
+
+       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+}
+
+static struct platform_driver clk_mt8192_mm_drv = {
+       .probe = clk_mt8192_mm_probe,
+       .driver = {
+               .name = "clk-mt8192-mm",
+       },
+};
+
+builtin_platform_driver(clk_mt8192_mm_drv);
diff --git a/drivers/clk/mediatek/clk-mt8192-msdc.c b/drivers/clk/mediatek/clk-mt8192-msdc.c
new file mode 100644 (file)
index 0000000..87c3b79
--- /dev/null
@@ -0,0 +1,85 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include <linux/clk-provider.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+
+#include "clk-mtk.h"
+#include "clk-gate.h"
+
+#include <dt-bindings/clock/mt8192-clk.h>
+
+static const struct mtk_gate_regs msdc_cg_regs = {
+       .set_ofs = 0xb4,
+       .clr_ofs = 0xb4,
+       .sta_ofs = 0xb4,
+};
+
+static const struct mtk_gate_regs msdc_top_cg_regs = {
+       .set_ofs = 0x0,
+       .clr_ofs = 0x0,
+       .sta_ofs = 0x0,
+};
+
+#define GATE_MSDC(_id, _name, _parent, _shift) \
+       GATE_MTK(_id, _name, _parent, &msdc_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr_inv)
+
+#define GATE_MSDC_TOP(_id, _name, _parent, _shift)     \
+       GATE_MTK(_id, _name, _parent, &msdc_top_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr_inv)
+
+static const struct mtk_gate msdc_clks[] = {
+       GATE_MSDC(CLK_MSDC_AXI_WRAP, "msdc_axi_wrap", "axi_sel", 22),
+};
+
+static const struct mtk_gate msdc_top_clks[] = {
+       GATE_MSDC_TOP(CLK_MSDC_TOP_AES_0P, "msdc_top_aes_0p", "aes_msdcfde_sel", 0),
+       GATE_MSDC_TOP(CLK_MSDC_TOP_SRC_0P, "msdc_top_src_0p", "infra_msdc0_src", 1),
+       GATE_MSDC_TOP(CLK_MSDC_TOP_SRC_1P, "msdc_top_src_1p", "infra_msdc1_src", 2),
+       GATE_MSDC_TOP(CLK_MSDC_TOP_SRC_2P, "msdc_top_src_2p", "infra_msdc2_src", 3),
+       GATE_MSDC_TOP(CLK_MSDC_TOP_P_MSDC0, "msdc_top_p_msdc0", "axi_sel", 4),
+       GATE_MSDC_TOP(CLK_MSDC_TOP_P_MSDC1, "msdc_top_p_msdc1", "axi_sel", 5),
+       GATE_MSDC_TOP(CLK_MSDC_TOP_P_MSDC2, "msdc_top_p_msdc2", "axi_sel", 6),
+       GATE_MSDC_TOP(CLK_MSDC_TOP_P_CFG, "msdc_top_p_cfg", "axi_sel", 7),
+       GATE_MSDC_TOP(CLK_MSDC_TOP_AXI, "msdc_top_axi", "axi_sel", 8),
+       GATE_MSDC_TOP(CLK_MSDC_TOP_H_MST_0P, "msdc_top_h_mst_0p", "infra_msdc0", 9),
+       GATE_MSDC_TOP(CLK_MSDC_TOP_H_MST_1P, "msdc_top_h_mst_1p", "infra_msdc1", 10),
+       GATE_MSDC_TOP(CLK_MSDC_TOP_H_MST_2P, "msdc_top_h_mst_2p", "infra_msdc2", 11),
+       GATE_MSDC_TOP(CLK_MSDC_TOP_MEM_OFF_DLY_26M, "msdc_top_mem_off_dly_26m", "clk26m", 12),
+       GATE_MSDC_TOP(CLK_MSDC_TOP_32K, "msdc_top_32k", "clk32k", 13),
+       GATE_MSDC_TOP(CLK_MSDC_TOP_AHB2AXI_BRG_AXI, "msdc_top_ahb2axi_brg_axi", "axi_sel", 14),
+};
+
+static const struct mtk_clk_desc msdc_desc = {
+       .clks = msdc_clks,
+       .num_clks = ARRAY_SIZE(msdc_clks),
+};
+
+static const struct mtk_clk_desc msdc_top_desc = {
+       .clks = msdc_top_clks,
+       .num_clks = ARRAY_SIZE(msdc_top_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8192_msdc[] = {
+       {
+               .compatible = "mediatek,mt8192-msdc",
+               .data = &msdc_desc,
+       }, {
+               .compatible = "mediatek,mt8192-msdc_top",
+               .data = &msdc_top_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8192_msdc_drv = {
+       .probe = mtk_clk_simple_probe,
+       .driver = {
+               .name = "clk-mt8192-msdc",
+               .of_match_table = of_match_clk_mt8192_msdc,
+       },
+};
+
+builtin_platform_driver(clk_mt8192_msdc_drv);
diff --git a/drivers/clk/mediatek/clk-mt8192-scp_adsp.c b/drivers/clk/mediatek/clk-mt8192-scp_adsp.c
new file mode 100644 (file)
index 0000000..58725d7
--- /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 <linux/clk-provider.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+
+#include "clk-mtk.h"
+#include "clk-gate.h"
+
+#include <dt-bindings/clock/mt8192-clk.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", "adsp_sel", 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_mt8192_scp_adsp[] = {
+       {
+               .compatible = "mediatek,mt8192-scp_adsp",
+               .data = &scp_adsp_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8192_scp_adsp_drv = {
+       .probe = mtk_clk_simple_probe,
+       .driver = {
+               .name = "clk-mt8192-scp_adsp",
+               .of_match_table = of_match_clk_mt8192_scp_adsp,
+       },
+};
+
+builtin_platform_driver(clk_mt8192_scp_adsp_drv);
diff --git a/drivers/clk/mediatek/clk-mt8192-vdec.c b/drivers/clk/mediatek/clk-mt8192-vdec.c
new file mode 100644 (file)
index 0000000..b1d95cf
--- /dev/null
@@ -0,0 +1,94 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include <linux/clk-provider.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+
+#include "clk-mtk.h"
+#include "clk-gate.h"
+
+#include <dt-bindings/clock/mt8192-clk.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", "vdec_sel", 0),
+       GATE_VDEC0(CLK_VDEC_ACTIVE, "vdec_active", "vdec_sel", 4),
+       /* VDEC1 */
+       GATE_VDEC1(CLK_VDEC_LAT, "vdec_lat", "vdec_sel", 0),
+       GATE_VDEC1(CLK_VDEC_LAT_ACTIVE, "vdec_lat_active", "vdec_sel", 4),
+       /* VDEC2 */
+       GATE_VDEC2(CLK_VDEC_LARB1, "vdec_larb1", "vdec_sel", 0),
+};
+
+static const struct mtk_gate vdec_soc_clks[] = {
+       /* VDEC_SOC0 */
+       GATE_VDEC0(CLK_VDEC_SOC_VDEC, "vdec_soc_vdec", "vdec_sel", 0),
+       GATE_VDEC0(CLK_VDEC_SOC_VDEC_ACTIVE, "vdec_soc_vdec_active", "vdec_sel", 4),
+       /* VDEC_SOC1 */
+       GATE_VDEC1(CLK_VDEC_SOC_LAT, "vdec_soc_lat", "vdec_sel", 0),
+       GATE_VDEC1(CLK_VDEC_SOC_LAT_ACTIVE, "vdec_soc_lat_active", "vdec_sel", 4),
+       /* VDEC_SOC2 */
+       GATE_VDEC2(CLK_VDEC_SOC_LARB1, "vdec_soc_larb1", "vdec_sel", 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_soc_desc = {
+       .clks = vdec_soc_clks,
+       .num_clks = ARRAY_SIZE(vdec_soc_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8192_vdec[] = {
+       {
+               .compatible = "mediatek,mt8192-vdecsys",
+               .data = &vdec_desc,
+       }, {
+               .compatible = "mediatek,mt8192-vdecsys_soc",
+               .data = &vdec_soc_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8192_vdec_drv = {
+       .probe = mtk_clk_simple_probe,
+       .driver = {
+               .name = "clk-mt8192-vdec",
+               .of_match_table = of_match_clk_mt8192_vdec,
+       },
+};
+
+builtin_platform_driver(clk_mt8192_vdec_drv);
diff --git a/drivers/clk/mediatek/clk-mt8192-venc.c b/drivers/clk/mediatek/clk-mt8192-venc.c
new file mode 100644 (file)
index 0000000..c0d867b
--- /dev/null
@@ -0,0 +1,53 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include <linux/clk-provider.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+
+#include "clk-mtk.h"
+#include "clk-gate.h"
+
+#include <dt-bindings/clock/mt8192-clk.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_SET0_LARB, "venc_set0_larb", "venc_sel", 0),
+       GATE_VENC(CLK_VENC_SET1_VENC, "venc_set1_venc", "venc_sel", 4),
+       GATE_VENC(CLK_VENC_SET2_JPGENC, "venc_set2_jpgenc", "venc_sel", 8),
+       GATE_VENC(CLK_VENC_SET5_GALS, "venc_set5_gals", "venc_sel", 28),
+};
+
+static const struct mtk_clk_desc venc_desc = {
+       .clks = venc_clks,
+       .num_clks = ARRAY_SIZE(venc_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8192_venc[] = {
+       {
+               .compatible = "mediatek,mt8192-vencsys",
+               .data = &venc_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8192_venc_drv = {
+       .probe = mtk_clk_simple_probe,
+       .driver = {
+               .name = "clk-mt8192-venc",
+               .of_match_table = of_match_clk_mt8192_venc,
+       },
+};
+
+builtin_platform_driver(clk_mt8192_venc_drv);
diff --git a/drivers/clk/mediatek/clk-mt8192.c b/drivers/clk/mediatek/clk-mt8192.c
new file mode 100644 (file)
index 0000000..cbc7c6d
--- /dev/null
@@ -0,0 +1,1326 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright (c) 2021 MediaTek Inc.
+// Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/mfd/syscon.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+
+#include "clk-mtk.h"
+#include "clk-mux.h"
+#include "clk-gate.h"
+
+#include <dt-bindings/clock/mt8192-clk.h>
+
+static DEFINE_SPINLOCK(mt8192_clk_lock);
+
+static const struct mtk_fixed_clk top_fixed_clks[] = {
+       FIXED_CLK(CLK_TOP_ULPOSC, "ulposc", NULL, 260000000),
+};
+
+static const struct mtk_fixed_factor top_early_divs[] = {
+       FACTOR(CLK_TOP_CSW_F26M_D2, "csw_f26m_d2", "clk26m", 1, 2),
+};
+
+static const struct mtk_fixed_factor top_divs[] = {
+       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_D4_D16, "mainpll_d4_d16", "mainpll_d4", 1, 16),
+       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_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_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_APLL1, "apll1_ck", "apll1", 1, 1),
+       FACTOR(CLK_TOP_APLL1_D2, "apll1_d2", "apll1", 1, 2),
+       FACTOR(CLK_TOP_APLL1_D4, "apll1_d4", "apll1", 1, 4),
+       FACTOR(CLK_TOP_APLL1_D8, "apll1_d8", "apll1", 1, 8),
+       FACTOR(CLK_TOP_APLL2, "apll2_ck", "apll2", 1, 1),
+       FACTOR(CLK_TOP_APLL2_D2, "apll2_d2", "apll2", 1, 2),
+       FACTOR(CLK_TOP_APLL2_D4, "apll2_d4", "apll2", 1, 4),
+       FACTOR(CLK_TOP_APLL2_D8, "apll2_d8", "apll2", 1, 8),
+       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_D5, "mmpll_d5", "mmpll", 1, 5),
+       FACTOR(CLK_TOP_MMPLL_D5_D2, "mmpll_d5_d2", "mmpll_d5", 1, 2),
+       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_APUPLL, "apupll_ck", "apupll", 1, 2),
+       FACTOR(CLK_TOP_NPUPLL, "npupll_ck", "npupll", 1, 1),
+       FACTOR(CLK_TOP_TVDPLL, "tvdpll_ck", "tvdpll", 1, 1),
+       FACTOR(CLK_TOP_TVDPLL_D2, "tvdpll_d2", "tvdpll", 1, 2),
+       FACTOR(CLK_TOP_TVDPLL_D4, "tvdpll_d4", "tvdpll", 1, 4),
+       FACTOR(CLK_TOP_TVDPLL_D8, "tvdpll_d8", "tvdpll", 1, 8),
+       FACTOR(CLK_TOP_TVDPLL_D16, "tvdpll_d16", "tvdpll", 1, 16),
+       FACTOR(CLK_TOP_MSDCPLL, "msdcpll_ck", "msdcpll", 1, 1),
+       FACTOR(CLK_TOP_MSDCPLL_D2, "msdcpll_d2", "msdcpll", 1, 2),
+       FACTOR(CLK_TOP_MSDCPLL_D4, "msdcpll_d4", "msdcpll", 1, 4),
+       FACTOR(CLK_TOP_OSC_D2, "osc_d2", "ulposc", 1, 2),
+       FACTOR(CLK_TOP_OSC_D4, "osc_d4", "ulposc", 1, 4),
+       FACTOR(CLK_TOP_OSC_D8, "osc_d8", "ulposc", 1, 8),
+       FACTOR(CLK_TOP_OSC_D10, "osc_d10", "ulposc", 1, 10),
+       FACTOR(CLK_TOP_OSC_D16, "osc_d16", "ulposc", 1, 16),
+       FACTOR(CLK_TOP_OSC_D20, "osc_d20", "ulposc", 1, 20),
+       FACTOR(CLK_TOP_ADSPPLL, "adsppll_ck", "adsppll", 1, 1),
+       FACTOR(CLK_TOP_UNIVPLL_192M, "univpll_192m", "univpll", 1, 13),
+       FACTOR(CLK_TOP_UNIVPLL_192M_D2, "univpll_192m_d2", "univpll_192m", 1, 2),
+       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),
+};
+
+static const char * const axi_parents[] = {
+       "clk26m",
+       "mainpll_d4_d4",
+       "mainpll_d7_d2",
+       "mainpll_d4_d2",
+       "mainpll_d5_d2",
+       "mainpll_d6_d2",
+       "osc_d4"
+};
+
+static const char * const spm_parents[] = {
+       "clk26m",
+       "osc_d10",
+       "mainpll_d7_d4",
+       "clk32k"
+};
+
+static const char * const scp_parents[] = {
+       "clk26m",
+       "univpll_d5",
+       "mainpll_d6_d2",
+       "mainpll_d6",
+       "univpll_d6",
+       "mainpll_d4_d2",
+       "mainpll_d5_d2",
+       "univpll_d4_d2"
+};
+
+static const char * const bus_aximem_parents[] = {
+       "clk26m",
+       "mainpll_d7_d2",
+       "mainpll_d4_d2",
+       "mainpll_d5_d2",
+       "mainpll_d6"
+};
+
+static const char * const disp_parents[] = {
+       "clk26m",
+       "univpll_d6_d2",
+       "mainpll_d5_d2",
+       "mmpll_d6_d2",
+       "univpll_d5_d2",
+       "univpll_d4_d2",
+       "mmpll_d7",
+       "univpll_d6",
+       "mainpll_d4",
+       "mmpll_d5_d2"
+};
+
+static const char * const mdp_parents[] = {
+       "clk26m",
+       "mainpll_d5_d2",
+       "mmpll_d6_d2",
+       "mainpll_d4_d2",
+       "mmpll_d4_d2",
+       "mainpll_d6",
+       "univpll_d6",
+       "mainpll_d4",
+       "tvdpll_ck",
+       "univpll_d4",
+       "mmpll_d5_d2"
+};
+
+static const char * const img1_parents[] = {
+       "clk26m",
+       "univpll_d4",
+       "tvdpll_ck",
+       "mainpll_d4",
+       "univpll_d5",
+       "mmpll_d6",
+       "univpll_d6",
+       "mainpll_d6",
+       "mmpll_d4_d2",
+       "mainpll_d4_d2",
+       "mmpll_d6_d2",
+       "mmpll_d5_d2"
+};
+
+static const char * const img2_parents[] = {
+       "clk26m",
+       "univpll_d4",
+       "tvdpll_ck",
+       "mainpll_d4",
+       "univpll_d5",
+       "mmpll_d6",
+       "univpll_d6",
+       "mainpll_d6",
+       "mmpll_d4_d2",
+       "mainpll_d4_d2",
+       "mmpll_d6_d2",
+       "mmpll_d5_d2"
+};
+
+static const char * const ipe_parents[] = {
+       "clk26m",
+       "mainpll_d4",
+       "mmpll_d6",
+       "univpll_d6",
+       "mainpll_d6",
+       "univpll_d4_d2",
+       "mainpll_d4_d2",
+       "mmpll_d6_d2",
+       "mmpll_d5_d2"
+};
+
+static const char * const dpe_parents[] = {
+       "clk26m",
+       "mainpll_d4",
+       "mmpll_d6",
+       "univpll_d6",
+       "mainpll_d6",
+       "univpll_d4_d2",
+       "univpll_d5_d2",
+       "mmpll_d6_d2"
+};
+
+static const char * const cam_parents[] = {
+       "clk26m",
+       "mainpll_d4",
+       "mmpll_d6",
+       "univpll_d4",
+       "univpll_d5",
+       "univpll_d6",
+       "mmpll_d7",
+       "univpll_d4_d2",
+       "mainpll_d4_d2",
+       "univpll_d6_d2"
+};
+
+static const char * const ccu_parents[] = {
+       "clk26m",
+       "mainpll_d4",
+       "mmpll_d6",
+       "mainpll_d6",
+       "mmpll_d7",
+       "univpll_d4_d2",
+       "mmpll_d6_d2",
+       "mmpll_d5_d2",
+       "univpll_d5",
+       "univpll_d6_d2"
+};
+
+static const char * const dsp7_parents[] = {
+       "clk26m",
+       "mainpll_d4_d2",
+       "mainpll_d6",
+       "mmpll_d6",
+       "univpll_d5",
+       "mmpll_d5",
+       "univpll_d4",
+       "mmpll_d4"
+};
+
+static const char * const mfg_ref_parents[] = {
+       "clk26m",
+       "clk26m",
+       "univpll_d6",
+       "mainpll_d5_d2"
+};
+
+static const char * const mfg_pll_parents[] = {
+       "mfg_ref_sel",
+       "mfgpll"
+};
+
+static const char * const camtg_parents[] = {
+       "clk26m",
+       "univpll_192m_d8",
+       "univpll_d6_d8",
+       "univpll_192m_d4",
+       "univpll_d6_d16",
+       "csw_f26m_d2",
+       "univpll_192m_d16",
+       "univpll_192m_d32"
+};
+
+static const char * const camtg2_parents[] = {
+       "clk26m",
+       "univpll_192m_d8",
+       "univpll_d6_d8",
+       "univpll_192m_d4",
+       "univpll_d6_d16",
+       "csw_f26m_d2",
+       "univpll_192m_d16",
+       "univpll_192m_d32"
+};
+
+static const char * const camtg3_parents[] = {
+       "clk26m",
+       "univpll_192m_d8",
+       "univpll_d6_d8",
+       "univpll_192m_d4",
+       "univpll_d6_d16",
+       "csw_f26m_d2",
+       "univpll_192m_d16",
+       "univpll_192m_d32"
+};
+
+static const char * const camtg4_parents[] = {
+       "clk26m",
+       "univpll_192m_d8",
+       "univpll_d6_d8",
+       "univpll_192m_d4",
+       "univpll_d6_d16",
+       "csw_f26m_d2",
+       "univpll_192m_d16",
+       "univpll_192m_d32"
+};
+
+static const char * const camtg5_parents[] = {
+       "clk26m",
+       "univpll_192m_d8",
+       "univpll_d6_d8",
+       "univpll_192m_d4",
+       "univpll_d6_d16",
+       "csw_f26m_d2",
+       "univpll_192m_d16",
+       "univpll_192m_d32"
+};
+
+static const char * const camtg6_parents[] = {
+       "clk26m",
+       "univpll_192m_d8",
+       "univpll_d6_d8",
+       "univpll_192m_d4",
+       "univpll_d6_d16",
+       "csw_f26m_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"
+};
+
+static const char * const msdc50_0_h_parents[] = {
+       "clk26m",
+       "mainpll_d4_d2",
+       "mainpll_d6_d2"
+};
+
+static const char * const msdc50_0_parents[] = {
+       "clk26m",
+       "msdcpll_ck",
+       "msdcpll_d2",
+       "univpll_d4_d4",
+       "mainpll_d6_d2",
+       "univpll_d4_d2"
+};
+
+static const char * const msdc30_1_parents[] = {
+       "clk26m",
+       "univpll_d6_d2",
+       "mainpll_d6_d2",
+       "mainpll_d7_d2",
+       "msdcpll_d2"
+};
+
+static const char * const msdc30_2_parents[] = {
+       "clk26m",
+       "univpll_d6_d2",
+       "mainpll_d6_d2",
+       "mainpll_d7_d2",
+       "msdcpll_d2"
+};
+
+static const char * const audio_parents[] = {
+       "clk26m",
+       "mainpll_d5_d8",
+       "mainpll_d7_d8",
+       "mainpll_d4_d16"
+};
+
+static const char * const aud_intbus_parents[] = {
+       "clk26m",
+       "mainpll_d4_d4",
+       "mainpll_d7_d4"
+};
+
+static const char * const pwrap_ulposc_parents[] = {
+       "osc_d10",
+       "clk26m",
+       "osc_d4",
+       "osc_d8",
+       "osc_d16"
+};
+
+static const char * const atb_parents[] = {
+       "clk26m",
+       "mainpll_d4_d2",
+       "mainpll_d5_d2"
+};
+
+static const char * const dpi_parents[] = {
+       "clk26m",
+       "tvdpll_d2",
+       "tvdpll_d4",
+       "tvdpll_d8",
+       "tvdpll_d16"
+};
+
+static const char * const scam_parents[] = {
+       "clk26m",
+       "mainpll_d5_d4"
+};
+
+static const char * const disp_pwm_parents[] = {
+       "clk26m",
+       "univpll_d6_d4",
+       "osc_d2",
+       "osc_d4",
+       "osc_d16"
+};
+
+static const char * const usb_top_parents[] = {
+       "clk26m",
+       "univpll_d5_d4",
+       "univpll_d6_d4",
+       "univpll_d5_d2"
+};
+
+static const char * const ssusb_xhci_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 seninf1_parents[] = {
+       "clk26m",
+       "univpll_d4_d4",
+       "univpll_d6_d2",
+       "univpll_d4_d2",
+       "univpll_d7",
+       "univpll_d6",
+       "mmpll_d6",
+       "univpll_d5"
+};
+
+static const char * const seninf2_parents[] = {
+       "clk26m",
+       "univpll_d4_d4",
+       "univpll_d6_d2",
+       "univpll_d4_d2",
+       "univpll_d7",
+       "univpll_d6",
+       "mmpll_d6",
+       "univpll_d5"
+};
+
+static const char * const seninf3_parents[] = {
+       "clk26m",
+       "univpll_d4_d4",
+       "univpll_d6_d2",
+       "univpll_d4_d2",
+       "univpll_d7",
+       "univpll_d6",
+       "mmpll_d6",
+       "univpll_d5"
+};
+
+static const char * const tl_parents[] = {
+       "clk26m",
+       "univpll_192m_d2",
+       "mainpll_d6_d4"
+};
+
+static const char * const dxcc_parents[] = {
+       "clk26m",
+       "mainpll_d4_d2",
+       "mainpll_d4_d4",
+       "mainpll_d4_d8"
+};
+
+static const char * const aud_engen1_parents[] = {
+       "clk26m",
+       "apll1_d2",
+       "apll1_d4",
+       "apll1_d8"
+};
+
+static const char * const aud_engen2_parents[] = {
+       "clk26m",
+       "apll2_d2",
+       "apll2_d4",
+       "apll2_d8"
+};
+
+static const char * const aes_ufsfde_parents[] = {
+       "clk26m",
+       "mainpll_d4",
+       "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",
+       "mainpll_d5_d2",
+       "msdcpll_d2"
+};
+
+static const char * const aud_1_parents[] = {
+       "clk26m",
+       "apll1_ck"
+};
+
+static const char * const aud_2_parents[] = {
+       "clk26m",
+       "apll2_ck"
+};
+
+static const char * const adsp_parents[] = {
+       "clk26m",
+       "mainpll_d6",
+       "mainpll_d5_d2",
+       "univpll_d4_d4",
+       "univpll_d4",
+       "univpll_d6",
+       "ulposc",
+       "adsppll_ck"
+};
+
+static const char * const dpmaif_main_parents[] = {
+       "clk26m",
+       "univpll_d4_d4",
+       "mainpll_d6",
+       "mainpll_d4_d2",
+       "univpll_d4_d2"
+};
+
+static const char * const venc_parents[] = {
+       "clk26m",
+       "mmpll_d7",
+       "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",
+       "univpll_192m_d2",
+       "univpll_d5_d4",
+       "mainpll_d5",
+       "mainpll_d5_d2",
+       "mmpll_d6_d2",
+       "univpll_d5_d2",
+       "mainpll_d4_d2",
+       "univpll_d4_d2",
+       "univpll_d7",
+       "mmpll_d7",
+       "mmpll_d6",
+       "univpll_d5",
+       "mainpll_d4",
+       "univpll_d4",
+       "univpll_d6"
+};
+
+static const char * const camtm_parents[] = {
+       "clk26m",
+       "univpll_d7",
+       "univpll_d6_d2",
+       "univpll_d4_d2"
+};
+
+static const char * const pwm_parents[] = {
+       "clk26m",
+       "univpll_d4_d8"
+};
+
+static const char * const audio_h_parents[] = {
+       "clk26m",
+       "univpll_d7",
+       "apll1_ck",
+       "apll2_ck"
+};
+
+static const char * const spmi_mst_parents[] = {
+       "clk26m",
+       "csw_f26m_d2",
+       "osc_d8",
+       "osc_d10",
+       "osc_d16",
+       "osc_d20",
+       "clk32k"
+};
+
+static const char * const aes_msdcfde_parents[] = {
+       "clk26m",
+       "mainpll_d4_d2",
+       "mainpll_d6",
+       "mainpll_d4_d4",
+       "univpll_d4_d2",
+       "univpll_d6"
+};
+
+static const char * const sflash_parents[] = {
+       "clk26m",
+       "mainpll_d7_d8",
+       "univpll_d6_d8",
+       "univpll_d5_d8"
+};
+
+static const char * const apll_i2s0_m_parents[] = {
+       "aud_1_sel",
+       "aud_2_sel"
+};
+
+static const char * const apll_i2s1_m_parents[] = {
+       "aud_1_sel",
+       "aud_2_sel"
+};
+
+static const char * const apll_i2s2_m_parents[] = {
+       "aud_1_sel",
+       "aud_2_sel"
+};
+
+static const char * const apll_i2s3_m_parents[] = {
+       "aud_1_sel",
+       "aud_2_sel"
+};
+
+static const char * const apll_i2s4_m_parents[] = {
+       "aud_1_sel",
+       "aud_2_sel"
+};
+
+static const char * const apll_i2s5_m_parents[] = {
+       "aud_1_sel",
+       "aud_2_sel"
+};
+
+static const char * const apll_i2s6_m_parents[] = {
+       "aud_1_sel",
+       "aud_2_sel"
+};
+
+static const char * const apll_i2s7_m_parents[] = {
+       "aud_1_sel",
+       "aud_2_sel"
+};
+
+static const char * const apll_i2s8_m_parents[] = {
+       "aud_1_sel",
+       "aud_2_sel"
+};
+
+static const char * const apll_i2s9_m_parents[] = {
+       "aud_1_sel",
+       "aud_2_sel"
+};
+
+/*
+ * CRITICAL CLOCK:
+ * axi_sel is the main bus clock of whole SOC.
+ * spm_sel is the clock of the always-on co-processor.
+ * bus_aximem_sel is clock of the bus that access emi.
+ */
+static const struct mtk_mux top_mtk_muxes[] = {
+       /* CLK_CFG_0 */
+       MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_AXI_SEL, "axi_sel",
+                                  axi_parents, 0x010, 0x014, 0x018, 0, 3, 7, 0x004, 0,
+                                  CLK_IS_CRITICAL),
+       MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SPM_SEL, "spm_sel",
+                                  spm_parents, 0x010, 0x014, 0x018, 8, 2, 15, 0x004, 1,
+                                  CLK_IS_CRITICAL),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SCP_SEL, "scp_sel",
+                            scp_parents, 0x010, 0x014, 0x018, 16, 3, 23, 0x004, 2),
+       MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_BUS_AXIMEM_SEL, "bus_aximem_sel",
+                                  bus_aximem_parents, 0x010, 0x014, 0x018, 24, 3, 31, 0x004, 3,
+                                  CLK_IS_CRITICAL),
+       /* CLK_CFG_1 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DISP_SEL, "disp_sel",
+                            disp_parents, 0x020, 0x024, 0x028, 0, 4, 7, 0x004, 4),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_MDP_SEL, "mdp_sel",
+                            mdp_parents, 0x020, 0x024, 0x028, 8, 4, 15, 0x004, 5),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_IMG1_SEL, "img1_sel",
+                            img1_parents, 0x020, 0x024, 0x028, 16, 4, 23, 0x004, 6),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_IMG2_SEL, "img2_sel",
+                            img2_parents, 0x020, 0x024, 0x028, 24, 4, 31, 0x004, 7),
+       /* CLK_CFG_2 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_IPE_SEL, "ipe_sel",
+                            ipe_parents, 0x030, 0x034, 0x038, 0, 4, 7, 0x004, 8),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DPE_SEL, "dpe_sel",
+                            dpe_parents, 0x030, 0x034, 0x038, 8, 3, 15, 0x004, 9),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAM_SEL, "cam_sel",
+                            cam_parents, 0x030, 0x034, 0x038, 16, 4, 23, 0x004, 10),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CCU_SEL, "ccu_sel",
+                            ccu_parents, 0x030, 0x034, 0x038, 24, 4, 31, 0x004, 11),
+       /* CLK_CFG_4 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DSP7_SEL, "dsp7_sel",
+                            dsp7_parents, 0x050, 0x054, 0x058, 0, 3, 7, 0x004, 16),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_MFG_REF_SEL, "mfg_ref_sel",
+                            mfg_ref_parents, 0x050, 0x054, 0x058, 16, 2, 23, 0x004, 18),
+       MUX_CLR_SET_UPD(CLK_TOP_MFG_PLL_SEL, "mfg_pll_sel",
+                       mfg_pll_parents, 0x050, 0x054, 0x058, 18, 1, -1, -1),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG_SEL, "camtg_sel",
+                            camtg_parents, 0x050, 0x054, 0x058, 24, 3, 31, 0x004, 19),
+       /* CLK_CFG_5 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG2_SEL, "camtg2_sel",
+                            camtg2_parents, 0x060, 0x064, 0x068, 0, 3, 7, 0x004, 20),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG3_SEL, "camtg3_sel",
+                            camtg3_parents, 0x060, 0x064, 0x068, 8, 3, 15, 0x004, 21),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG4_SEL, "camtg4_sel",
+                            camtg4_parents, 0x060, 0x064, 0x068, 16, 3, 23, 0x004, 22),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG5_SEL, "camtg5_sel",
+                            camtg5_parents, 0x060, 0x064, 0x068, 24, 3, 31, 0x004, 23),
+       /* CLK_CFG_6 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG6_SEL, "camtg6_sel",
+                            camtg6_parents, 0x070, 0x074, 0x078, 0, 3, 7, 0x004, 24),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_UART_SEL, "uart_sel",
+                            uart_parents, 0x070, 0x074, 0x078, 8, 1, 15, 0x004, 25),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SPI_SEL, "spi_sel",
+                            spi_parents, 0x070, 0x074, 0x078, 16, 2, 23, 0x004, 26),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC50_0_H_SEL, "msdc50_0_h_sel",
+                            msdc50_0_h_parents, 0x070, 0x074, 0x078, 24, 2, 31, 0x004, 27),
+       /* CLK_CFG_7 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC50_0_SEL, "msdc50_0_sel",
+                            msdc50_0_parents, 0x080, 0x084, 0x088, 0, 3, 7, 0x004, 28),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC30_1_SEL, "msdc30_1_sel",
+                            msdc30_1_parents, 0x080, 0x084, 0x088, 8, 3, 15, 0x004, 29),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC30_2_SEL, "msdc30_2_sel",
+                            msdc30_2_parents, 0x080, 0x084, 0x088, 16, 3, 23, 0x004, 30),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUDIO_SEL, "audio_sel",
+                            audio_parents, 0x080, 0x084, 0x088, 24, 2, 31, 0x008, 0),
+       /* CLK_CFG_8 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_INTBUS_SEL, "aud_intbus_sel",
+                            aud_intbus_parents, 0x090, 0x094, 0x098, 0, 2, 7, 0x008, 1),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_PWRAP_ULPOSC_SEL, "pwrap_ulposc_sel",
+                            pwrap_ulposc_parents, 0x090, 0x094, 0x098, 8, 3, 15, 0x008, 2),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_ATB_SEL, "atb_sel",
+                            atb_parents, 0x090, 0x094, 0x098, 16, 2, 23, 0x008, 3),
+       /* CLK_CFG_9 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DPI_SEL, "dpi_sel",
+                            dpi_parents, 0x0a0, 0x0a4, 0x0a8, 0, 3, 7, 0x008, 5),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SCAM_SEL, "scam_sel",
+                            scam_parents, 0x0a0, 0x0a4, 0x0a8, 8, 1, 15, 0x008, 6),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DISP_PWM_SEL, "disp_pwm_sel",
+                            disp_pwm_parents, 0x0a0, 0x0a4, 0x0a8, 16, 3, 23, 0x008, 7),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_TOP_SEL, "usb_top_sel",
+                            usb_top_parents, 0x0a0, 0x0a4, 0x0a8, 24, 2, 31, 0x008, 8),
+       /* CLK_CFG_10 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SSUSB_XHCI_SEL, "ssusb_xhci_sel",
+                            ssusb_xhci_parents, 0x0b0, 0x0b4, 0x0b8, 0, 2, 7, 0x008, 9),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_I2C_SEL, "i2c_sel",
+                            i2c_parents, 0x0b0, 0x0b4, 0x0b8, 8, 2, 15, 0x008, 10),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SENINF_SEL, "seninf_sel",
+                            seninf_parents, 0x0b0, 0x0b4, 0x0b8, 16, 3, 23, 0x008, 11),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SENINF1_SEL, "seninf1_sel",
+                            seninf1_parents, 0x0b0, 0x0b4, 0x0b8, 24, 3, 31, 0x008, 12),
+       /* CLK_CFG_11 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SENINF2_SEL, "seninf2_sel",
+                            seninf2_parents, 0x0c0, 0x0c4, 0x0c8, 0, 3, 7, 0x008, 13),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SENINF3_SEL, "seninf3_sel",
+                            seninf3_parents, 0x0c0, 0x0c4, 0x0c8, 8, 3, 15, 0x008, 14),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_TL_SEL, "tl_sel",
+                            tl_parents, 0x0c0, 0x0c4, 0x0c8, 16, 2, 23, 0x008, 15),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DXCC_SEL, "dxcc_sel",
+                            dxcc_parents, 0x0c0, 0x0c4, 0x0c8, 24, 2, 31, 0x008, 16),
+       /* CLK_CFG_12 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_ENGEN1_SEL, "aud_engen1_sel",
+                            aud_engen1_parents, 0x0d0, 0x0d4, 0x0d8, 0, 2, 7, 0x008, 17),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_ENGEN2_SEL, "aud_engen2_sel",
+                            aud_engen2_parents, 0x0d0, 0x0d4, 0x0d8, 8, 2, 15, 0x008, 18),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AES_UFSFDE_SEL, "aes_ufsfde_sel",
+                            aes_ufsfde_parents, 0x0d0, 0x0d4, 0x0d8, 16, 3, 23, 0x008, 19),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_UFS_SEL, "ufs_sel",
+                            ufs_parents, 0x0d0, 0x0d4, 0x0d8, 24, 3, 31, 0x008, 20),
+       /* CLK_CFG_13 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_1_SEL, "aud_1_sel",
+                            aud_1_parents, 0x0e0, 0x0e4, 0x0e8, 0, 1, 7, 0x008, 21),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_2_SEL, "aud_2_sel",
+                            aud_2_parents, 0x0e0, 0x0e4, 0x0e8, 8, 1, 15, 0x008, 22),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_ADSP_SEL, "adsp_sel",
+                            adsp_parents, 0x0e0, 0x0e4, 0x0e8, 16, 3, 23, 0x008, 23),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DPMAIF_MAIN_SEL, "dpmaif_main_sel",
+                            dpmaif_main_parents, 0x0e0, 0x0e4, 0x0e8, 24, 3, 31, 0x008, 24),
+       /* CLK_CFG_14 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_VENC_SEL, "venc_sel",
+                            venc_parents, 0x0f0, 0x0f4, 0x0f8, 0, 4, 7, 0x008, 25),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_VDEC_SEL, "vdec_sel",
+                            vdec_parents, 0x0f0, 0x0f4, 0x0f8, 8, 4, 15, 0x008, 26),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTM_SEL, "camtm_sel",
+                            camtm_parents, 0x0f0, 0x0f4, 0x0f8, 16, 2, 23, 0x008, 27),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_PWM_SEL, "pwm_sel",
+                            pwm_parents, 0x0f0, 0x0f4, 0x0f8, 24, 1, 31, 0x008, 28),
+       /* CLK_CFG_15 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUDIO_H_SEL, "audio_h_sel",
+                            audio_h_parents, 0x100, 0x104, 0x108, 0, 2, 7, 0x008, 29),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SPMI_MST_SEL, "spmi_mst_sel",
+                            spmi_mst_parents, 0x100, 0x104, 0x108, 8, 3, 15, 0x008, 30),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AES_MSDCFDE_SEL, "aes_msdcfde_sel",
+                            aes_msdcfde_parents, 0x100, 0x104, 0x108, 24, 3, 31, 0x00c, 1),
+       /* CLK_CFG_16 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SFLASH_SEL, "sflash_sel",
+                            sflash_parents, 0x110, 0x114, 0x118, 8, 2, 15, 0x00c, 3),
+};
+
+static struct mtk_composite top_muxes[] = {
+       /* CLK_AUDDIV_0 */
+       MUX(CLK_TOP_APLL_I2S0_M_SEL, "apll_i2s0_m_sel", apll_i2s0_m_parents, 0x320, 16, 1),
+       MUX(CLK_TOP_APLL_I2S1_M_SEL, "apll_i2s1_m_sel", apll_i2s1_m_parents, 0x320, 17, 1),
+       MUX(CLK_TOP_APLL_I2S2_M_SEL, "apll_i2s2_m_sel", apll_i2s2_m_parents, 0x320, 18, 1),
+       MUX(CLK_TOP_APLL_I2S3_M_SEL, "apll_i2s3_m_sel", apll_i2s3_m_parents, 0x320, 19, 1),
+       MUX(CLK_TOP_APLL_I2S4_M_SEL, "apll_i2s4_m_sel", apll_i2s4_m_parents, 0x320, 20, 1),
+       MUX(CLK_TOP_APLL_I2S5_M_SEL, "apll_i2s5_m_sel", apll_i2s5_m_parents, 0x320, 21, 1),
+       MUX(CLK_TOP_APLL_I2S6_M_SEL, "apll_i2s6_m_sel", apll_i2s6_m_parents, 0x320, 22, 1),
+       MUX(CLK_TOP_APLL_I2S7_M_SEL, "apll_i2s7_m_sel", apll_i2s7_m_parents, 0x320, 23, 1),
+       MUX(CLK_TOP_APLL_I2S8_M_SEL, "apll_i2s8_m_sel", apll_i2s8_m_parents, 0x320, 24, 1),
+       MUX(CLK_TOP_APLL_I2S9_M_SEL, "apll_i2s9_m_sel", apll_i2s9_m_parents, 0x320, 25, 1),
+};
+
+static const struct mtk_composite top_adj_divs[] = {
+       DIV_GATE(CLK_TOP_APLL12_DIV0, "apll12_div0", "apll_i2s0_m_sel", 0x320, 0, 0x328, 8, 0),
+       DIV_GATE(CLK_TOP_APLL12_DIV1, "apll12_div1", "apll_i2s1_m_sel", 0x320, 1, 0x328, 8, 8),
+       DIV_GATE(CLK_TOP_APLL12_DIV2, "apll12_div2", "apll_i2s2_m_sel", 0x320, 2, 0x328, 8, 16),
+       DIV_GATE(CLK_TOP_APLL12_DIV3, "apll12_div3", "apll_i2s3_m_sel", 0x320, 3, 0x328, 8, 24),
+       DIV_GATE(CLK_TOP_APLL12_DIV4, "apll12_div4", "apll_i2s4_m_sel", 0x320, 4, 0x334, 8, 0),
+       DIV_GATE(CLK_TOP_APLL12_DIVB, "apll12_divb", "apll12_div4", 0x320, 5, 0x334, 8, 8),
+       DIV_GATE(CLK_TOP_APLL12_DIV5, "apll12_div5", "apll_i2s5_m_sel", 0x320, 6, 0x334, 8, 16),
+       DIV_GATE(CLK_TOP_APLL12_DIV6, "apll12_div6", "apll_i2s6_m_sel", 0x320, 7, 0x334, 8, 24),
+       DIV_GATE(CLK_TOP_APLL12_DIV7, "apll12_div7", "apll_i2s7_m_sel", 0x320, 8, 0x338, 8, 0),
+       DIV_GATE(CLK_TOP_APLL12_DIV8, "apll12_div8", "apll_i2s8_m_sel", 0x320, 9, 0x338, 8, 8),
+       DIV_GATE(CLK_TOP_APLL12_DIV9, "apll12_div9", "apll_i2s9_m_sel", 0x320, 10, 0x338, 8, 16),
+};
+
+static const struct mtk_gate_regs apmixed_cg_regs = {
+       .set_ofs = 0x14,
+       .clr_ofs = 0x14,
+       .sta_ofs = 0x14,
+};
+
+#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_MIPID26M, "mipid26m", "clk26m", 16),
+};
+
+static const struct mtk_gate_regs infra0_cg_regs = {
+       .set_ofs = 0x80,
+       .clr_ofs = 0x84,
+       .sta_ofs = 0x90,
+};
+
+static const struct mtk_gate_regs infra1_cg_regs = {
+       .set_ofs = 0x88,
+       .clr_ofs = 0x8c,
+       .sta_ofs = 0x94,
+};
+
+static const struct mtk_gate_regs infra2_cg_regs = {
+       .set_ofs = 0xa4,
+       .clr_ofs = 0xa8,
+       .sta_ofs = 0xac,
+};
+
+static const struct mtk_gate_regs infra3_cg_regs = {
+       .set_ofs = 0xc0,
+       .clr_ofs = 0xc4,
+       .sta_ofs = 0xc8,
+};
+
+static const struct mtk_gate_regs infra4_cg_regs = {
+       .set_ofs = 0xd0,
+       .clr_ofs = 0xd4,
+       .sta_ofs = 0xd8,
+};
+
+static const struct mtk_gate_regs infra5_cg_regs = {
+       .set_ofs = 0xe0,
+       .clr_ofs = 0xe4,
+       .sta_ofs = 0xe8,
+};
+
+#define GATE_INFRA0(_id, _name, _parent, _shift)       \
+       GATE_MTK(_id, _name, _parent, &infra0_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+#define GATE_INFRA1_FLAGS(_id, _name, _parent, _shift, _flag)          \
+       GATE_MTK_FLAGS(_id, _name, _parent, &infra1_cg_regs, _shift,    \
+               &mtk_clk_gate_ops_setclr, _flag)
+
+#define GATE_INFRA1(_id, _name, _parent, _shift)       \
+       GATE_INFRA1_FLAGS(_id, _name, _parent, _shift, 0)
+
+#define GATE_INFRA2(_id, _name, _parent, _shift)       \
+       GATE_MTK(_id, _name, _parent, &infra2_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+#define GATE_INFRA3_FLAGS(_id, _name, _parent, _shift, _flag)          \
+       GATE_MTK_FLAGS(_id, _name, _parent, &infra3_cg_regs, _shift,    \
+               &mtk_clk_gate_ops_setclr, _flag)
+
+#define GATE_INFRA3(_id, _name, _parent, _shift)       \
+       GATE_INFRA3_FLAGS(_id, _name, _parent, _shift, 0)
+
+#define GATE_INFRA4(_id, _name, _parent, _shift)       \
+       GATE_MTK(_id, _name, _parent, &infra4_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+
+#define GATE_INFRA5_FLAGS(_id, _name, _parent, _shift, _flag)          \
+       GATE_MTK_FLAGS(_id, _name, _parent, &infra5_cg_regs, _shift,    \
+               &mtk_clk_gate_ops_setclr, _flag)
+
+#define GATE_INFRA5(_id, _name, _parent, _shift)       \
+       GATE_INFRA5_FLAGS(_id, _name, _parent, _shift, 0)
+
+/*
+ * CRITICAL CLOCK:
+ * infra_133m and infra_66m are main peripheral bus clocks of SOC.
+ * infra_device_apc and infra_device_apc_sync are for device access permission control module.
+ */
+static const struct mtk_gate infra_clks[] = {
+       /* INFRA0 */
+       GATE_INFRA0(CLK_INFRA_PMIC_TMR, "infra_pmic_tmr", "pwrap_ulposc_sel", 0),
+       GATE_INFRA0(CLK_INFRA_PMIC_AP, "infra_pmic_ap", "pwrap_ulposc_sel", 1),
+       GATE_INFRA0(CLK_INFRA_PMIC_MD, "infra_pmic_md", "pwrap_ulposc_sel", 2),
+       GATE_INFRA0(CLK_INFRA_PMIC_CONN, "infra_pmic_conn", "pwrap_ulposc_sel", 3),
+       GATE_INFRA0(CLK_INFRA_SCPSYS, "infra_scpsys", "scp_sel", 4),
+       GATE_INFRA0(CLK_INFRA_SEJ, "infra_sej", "axi_sel", 5),
+       GATE_INFRA0(CLK_INFRA_APXGPT, "infra_apxgpt", "axi_sel", 6),
+       GATE_INFRA0(CLK_INFRA_GCE, "infra_gce", "axi_sel", 8),
+       GATE_INFRA0(CLK_INFRA_GCE2, "infra_gce2", "axi_sel", 9),
+       GATE_INFRA0(CLK_INFRA_THERM, "infra_therm", "axi_sel", 10),
+       GATE_INFRA0(CLK_INFRA_I2C0, "infra_i2c0", "i2c_sel", 11),
+       GATE_INFRA0(CLK_INFRA_AP_DMA_PSEUDO, "infra_ap_dma_pseudo", "axi_sel", 12),
+       GATE_INFRA0(CLK_INFRA_I2C2, "infra_i2c2", "i2c_sel", 13),
+       GATE_INFRA0(CLK_INFRA_I2C3, "infra_i2c3", "i2c_sel", 14),
+       GATE_INFRA0(CLK_INFRA_PWM_H, "infra_pwm_h", "axi_sel", 15),
+       GATE_INFRA0(CLK_INFRA_PWM1, "infra_pwm1", "pwm_sel", 16),
+       GATE_INFRA0(CLK_INFRA_PWM2, "infra_pwm2", "pwm_sel", 17),
+       GATE_INFRA0(CLK_INFRA_PWM3, "infra_pwm3", "pwm_sel", 18),
+       GATE_INFRA0(CLK_INFRA_PWM4, "infra_pwm4", "pwm_sel", 19),
+       GATE_INFRA0(CLK_INFRA_PWM, "infra_pwm", "pwm_sel", 21),
+       GATE_INFRA0(CLK_INFRA_UART0, "infra_uart0", "uart_sel", 22),
+       GATE_INFRA0(CLK_INFRA_UART1, "infra_uart1", "uart_sel", 23),
+       GATE_INFRA0(CLK_INFRA_UART2, "infra_uart2", "uart_sel", 24),
+       GATE_INFRA0(CLK_INFRA_UART3, "infra_uart3", "uart_sel", 25),
+       GATE_INFRA0(CLK_INFRA_GCE_26M, "infra_gce_26m", "axi_sel", 27),
+       GATE_INFRA0(CLK_INFRA_CQ_DMA_FPC, "infra_cq_dma_fpc", "axi_sel", 28),
+       GATE_INFRA0(CLK_INFRA_BTIF, "infra_btif", "axi_sel", 31),
+       /* INFRA1 */
+       GATE_INFRA1(CLK_INFRA_SPI0, "infra_spi0", "spi_sel", 1),
+       GATE_INFRA1(CLK_INFRA_MSDC0, "infra_msdc0", "msdc50_0_h_sel", 2),
+       GATE_INFRA1(CLK_INFRA_MSDC1, "infra_msdc1", "msdc50_0_h_sel", 4),
+       GATE_INFRA1(CLK_INFRA_MSDC2, "infra_msdc2", "msdc50_0_h_sel", 5),
+       GATE_INFRA1(CLK_INFRA_MSDC0_SRC, "infra_msdc0_src", "msdc50_0_sel", 6),
+       GATE_INFRA1(CLK_INFRA_GCPU, "infra_gcpu", "axi_sel", 8),
+       GATE_INFRA1(CLK_INFRA_TRNG, "infra_trng", "axi_sel", 9),
+       GATE_INFRA1(CLK_INFRA_AUXADC, "infra_auxadc", "clk26m", 10),
+       GATE_INFRA1(CLK_INFRA_CPUM, "infra_cpum", "axi_sel", 11),
+       GATE_INFRA1(CLK_INFRA_CCIF1_AP, "infra_ccif1_ap", "axi_sel", 12),
+       GATE_INFRA1(CLK_INFRA_CCIF1_MD, "infra_ccif1_md", "axi_sel", 13),
+       GATE_INFRA1(CLK_INFRA_AUXADC_MD, "infra_auxadc_md", "clk26m", 14),
+       GATE_INFRA1(CLK_INFRA_PCIE_TL_26M, "infra_pcie_tl_26m", "axi_sel", 15),
+       GATE_INFRA1(CLK_INFRA_MSDC1_SRC, "infra_msdc1_src", "msdc30_1_sel", 16),
+       GATE_INFRA1(CLK_INFRA_MSDC2_SRC, "infra_msdc2_src", "msdc30_2_sel", 17),
+       GATE_INFRA1(CLK_INFRA_PCIE_TL_96M, "infra_pcie_tl_96m", "tl_sel", 18),
+       GATE_INFRA1(CLK_INFRA_PCIE_PL_P_250M, "infra_pcie_pl_p_250m", "axi_sel", 19),
+       GATE_INFRA1_FLAGS(CLK_INFRA_DEVICE_APC, "infra_device_apc", "axi_sel", 20, CLK_IS_CRITICAL),
+       GATE_INFRA1(CLK_INFRA_CCIF_AP, "infra_ccif_ap", "axi_sel", 23),
+       GATE_INFRA1(CLK_INFRA_DEBUGSYS, "infra_debugsys", "axi_sel", 24),
+       GATE_INFRA1(CLK_INFRA_AUDIO, "infra_audio", "axi_sel", 25),
+       GATE_INFRA1(CLK_INFRA_CCIF_MD, "infra_ccif_md", "axi_sel", 26),
+       GATE_INFRA1(CLK_INFRA_DXCC_SEC_CORE, "infra_dxcc_sec_core", "dxcc_sel", 27),
+       GATE_INFRA1(CLK_INFRA_DXCC_AO, "infra_dxcc_ao", "dxcc_sel", 28),
+       GATE_INFRA1(CLK_INFRA_DBG_TRACE, "infra_dbg_trace", "axi_sel", 29),
+       GATE_INFRA1(CLK_INFRA_DEVMPU_B, "infra_devmpu_b", "axi_sel", 30),
+       GATE_INFRA1(CLK_INFRA_DRAMC_F26M, "infra_dramc_f26m", "clk26m", 31),
+       /* INFRA2 */
+       GATE_INFRA2(CLK_INFRA_IRTX, "infra_irtx", "clk26m", 0),
+       GATE_INFRA2(CLK_INFRA_SSUSB, "infra_ssusb", "usb_top_sel", 1),
+       GATE_INFRA2(CLK_INFRA_DISP_PWM, "infra_disp_pwm", "axi_sel", 2),
+       GATE_INFRA2(CLK_INFRA_CLDMA_B, "infra_cldma_b", "axi_sel", 3),
+       GATE_INFRA2(CLK_INFRA_AUDIO_26M_B, "infra_audio_26m_b", "clk26m", 4),
+       GATE_INFRA2(CLK_INFRA_MODEM_TEMP_SHARE, "infra_modem_temp_share", "clk26m", 5),
+       GATE_INFRA2(CLK_INFRA_SPI1, "infra_spi1", "spi_sel", 6),
+       GATE_INFRA2(CLK_INFRA_I2C4, "infra_i2c4", "i2c_sel", 7),
+       GATE_INFRA2(CLK_INFRA_SPI2, "infra_spi2", "spi_sel", 9),
+       GATE_INFRA2(CLK_INFRA_SPI3, "infra_spi3", "spi_sel", 10),
+       GATE_INFRA2(CLK_INFRA_UNIPRO_SYS, "infra_unipro_sys", "ufs_sel", 11),
+       GATE_INFRA2(CLK_INFRA_UNIPRO_TICK, "infra_unipro_tick", "clk26m", 12),
+       GATE_INFRA2(CLK_INFRA_UFS_MP_SAP_B, "infra_ufs_mp_sap_b", "clk26m", 13),
+       GATE_INFRA2(CLK_INFRA_MD32_B, "infra_md32_b", "axi_sel", 14),
+       GATE_INFRA2(CLK_INFRA_UNIPRO_MBIST, "infra_unipro_mbist", "axi_sel", 16),
+       GATE_INFRA2(CLK_INFRA_I2C5, "infra_i2c5", "i2c_sel", 18),
+       GATE_INFRA2(CLK_INFRA_I2C5_ARBITER, "infra_i2c5_arbiter", "i2c_sel", 19),
+       GATE_INFRA2(CLK_INFRA_I2C5_IMM, "infra_i2c5_imm", "i2c_sel", 20),
+       GATE_INFRA2(CLK_INFRA_I2C1_ARBITER, "infra_i2c1_arbiter", "i2c_sel", 21),
+       GATE_INFRA2(CLK_INFRA_I2C1_IMM, "infra_i2c1_imm", "i2c_sel", 22),
+       GATE_INFRA2(CLK_INFRA_I2C2_ARBITER, "infra_i2c2_arbiter", "i2c_sel", 23),
+       GATE_INFRA2(CLK_INFRA_I2C2_IMM, "infra_i2c2_imm", "i2c_sel", 24),
+       GATE_INFRA2(CLK_INFRA_SPI4, "infra_spi4", "spi_sel", 25),
+       GATE_INFRA2(CLK_INFRA_SPI5, "infra_spi5", "spi_sel", 26),
+       GATE_INFRA2(CLK_INFRA_CQ_DMA, "infra_cq_dma", "axi_sel", 27),
+       GATE_INFRA2(CLK_INFRA_UFS, "infra_ufs", "ufs_sel", 28),
+       GATE_INFRA2(CLK_INFRA_AES_UFSFDE, "infra_aes_ufsfde", "aes_ufsfde_sel", 29),
+       GATE_INFRA2(CLK_INFRA_UFS_TICK, "infra_ufs_tick", "ufs_sel", 30),
+       GATE_INFRA2(CLK_INFRA_SSUSB_XHCI, "infra_ssusb_xhci", "ssusb_xhci_sel", 31),
+       /* INFRA3 */
+       GATE_INFRA3(CLK_INFRA_MSDC0_SELF, "infra_msdc0_self", "msdc50_0_sel", 0),
+       GATE_INFRA3(CLK_INFRA_MSDC1_SELF, "infra_msdc1_self", "msdc50_0_sel", 1),
+       GATE_INFRA3(CLK_INFRA_MSDC2_SELF, "infra_msdc2_self", "msdc50_0_sel", 2),
+       GATE_INFRA3(CLK_INFRA_UFS_AXI, "infra_ufs_axi", "axi_sel", 5),
+       GATE_INFRA3(CLK_INFRA_I2C6, "infra_i2c6", "i2c_sel", 6),
+       GATE_INFRA3(CLK_INFRA_AP_MSDC0, "infra_ap_msdc0", "msdc50_0_sel", 7),
+       GATE_INFRA3(CLK_INFRA_MD_MSDC0, "infra_md_msdc0", "msdc50_0_sel", 8),
+       GATE_INFRA3(CLK_INFRA_CCIF5_AP, "infra_ccif5_ap", "axi_sel", 9),
+       GATE_INFRA3(CLK_INFRA_CCIF5_MD, "infra_ccif5_md", "axi_sel", 10),
+       GATE_INFRA3(CLK_INFRA_PCIE_TOP_H_133M, "infra_pcie_top_h_133m", "axi_sel", 11),
+       GATE_INFRA3(CLK_INFRA_FLASHIF_TOP_H_133M, "infra_flashif_top_h_133m", "axi_sel", 14),
+       GATE_INFRA3(CLK_INFRA_PCIE_PERI_26M, "infra_pcie_peri_26m", "axi_sel", 15),
+       GATE_INFRA3(CLK_INFRA_CCIF2_AP, "infra_ccif2_ap", "axi_sel", 16),
+       GATE_INFRA3(CLK_INFRA_CCIF2_MD, "infra_ccif2_md", "axi_sel", 17),
+       GATE_INFRA3(CLK_INFRA_CCIF3_AP, "infra_ccif3_ap", "axi_sel", 18),
+       GATE_INFRA3(CLK_INFRA_CCIF3_MD, "infra_ccif3_md", "axi_sel", 19),
+       GATE_INFRA3(CLK_INFRA_SEJ_F13M, "infra_sej_f13m", "clk26m", 20),
+       GATE_INFRA3(CLK_INFRA_AES, "infra_aes", "axi_sel", 21),
+       GATE_INFRA3(CLK_INFRA_I2C7, "infra_i2c7", "i2c_sel", 22),
+       GATE_INFRA3(CLK_INFRA_I2C8, "infra_i2c8", "i2c_sel", 23),
+       GATE_INFRA3(CLK_INFRA_FBIST2FPC, "infra_fbist2fpc", "msdc50_0_sel", 24),
+       GATE_INFRA3_FLAGS(CLK_INFRA_DEVICE_APC_SYNC, "infra_device_apc_sync", "axi_sel", 25,
+                         CLK_IS_CRITICAL),
+       GATE_INFRA3(CLK_INFRA_DPMAIF_MAIN, "infra_dpmaif_main", "dpmaif_main_sel", 26),
+       GATE_INFRA3(CLK_INFRA_PCIE_TL_32K, "infra_pcie_tl_32k", "axi_sel", 27),
+       GATE_INFRA3(CLK_INFRA_CCIF4_AP, "infra_ccif4_ap", "axi_sel", 28),
+       GATE_INFRA3(CLK_INFRA_CCIF4_MD, "infra_ccif4_md", "axi_sel", 29),
+       GATE_INFRA3(CLK_INFRA_SPI6, "infra_spi6", "spi_sel", 30),
+       GATE_INFRA3(CLK_INFRA_SPI7, "infra_spi7", "spi_sel", 31),
+       /* INFRA4 */
+       GATE_INFRA4(CLK_INFRA_AP_DMA, "infra_ap_dma", "infra_ap_dma_pseudo", 31),
+       /* INFRA5 */
+       GATE_INFRA5_FLAGS(CLK_INFRA_133M, "infra_133m", "axi_sel", 0, CLK_IS_CRITICAL),
+       GATE_INFRA5_FLAGS(CLK_INFRA_66M, "infra_66m", "axi_sel", 1, CLK_IS_CRITICAL),
+       GATE_INFRA5(CLK_INFRA_66M_PERI_BUS, "infra_66m_peri_bus", "axi_sel", 2),
+       GATE_INFRA5(CLK_INFRA_FREE_DCM_133M, "infra_free_dcm_133m", "axi_sel", 3),
+       GATE_INFRA5(CLK_INFRA_FREE_DCM_66M, "infra_free_dcm_66m", "axi_sel", 4),
+       GATE_INFRA5(CLK_INFRA_PERI_BUS_DCM_133M, "infra_peri_bus_dcm_133m", "axi_sel", 5),
+       GATE_INFRA5(CLK_INFRA_PERI_BUS_DCM_66M, "infra_peri_bus_dcm_66m", "axi_sel", 6),
+       GATE_INFRA5(CLK_INFRA_FLASHIF_PERI_26M, "infra_flashif_peri_26m", "axi_sel", 30),
+       GATE_INFRA5(CLK_INFRA_FLASHIF_SFLASH, "infra_flashif_fsflash", "axi_sel", 31),
+};
+
+static const struct mtk_gate_regs peri_cg_regs = {
+       .set_ofs = 0x20c,
+       .clr_ofs = 0x20c,
+       .sta_ofs = 0x20c,
+};
+
+#define GATE_PERI(_id, _name, _parent, _shift) \
+       GATE_MTK(_id, _name, _parent, &peri_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr_inv)
+
+static const struct mtk_gate peri_clks[] = {
+       GATE_PERI(CLK_PERI_PERIAXI, "peri_periaxi", "axi_sel", 31),
+};
+
+static const struct mtk_gate_regs top_cg_regs = {
+       .set_ofs = 0x150,
+       .clr_ofs = 0x150,
+       .sta_ofs = 0x150,
+};
+
+#define GATE_TOP(_id, _name, _parent, _shift)  \
+       GATE_MTK(_id, _name, _parent, &top_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr_inv)
+
+static const struct mtk_gate top_clks[] = {
+       GATE_TOP(CLK_TOP_SSUSB_TOP_REF, "ssusb_top_ref", "clk26m", 24),
+       GATE_TOP(CLK_TOP_SSUSB_PHY_REF, "ssusb_phy_ref", "clk26m", 25),
+};
+
+#define MT8192_PLL_FMAX                (3800UL * MHZ)
+#define MT8192_PLL_FMIN                (1500UL * MHZ)
+#define MT8192_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 = MT8192_PLL_FMAX,                                \
+               .fmin = MT8192_PLL_FMIN,                                \
+               .pcwbits = _pcwbits,                                    \
+               .pcwibits = MT8192_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,                              \
+       }
+
+#define PLL_B(_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)                           \
+               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, 0, 0, 0)
+
+static const struct mtk_pll_data plls[] = {
+       PLL_B(CLK_APMIXED_MAINPLL, "mainpll", 0x0340, 0x034c, 0xff000000,
+             HAVE_RST_BAR, BIT(23), 22, 0x0344, 24, 0, 0, 0, 0x0344, 0),
+       PLL_B(CLK_APMIXED_UNIVPLL, "univpll", 0x0308, 0x0314, 0xff000000,
+             HAVE_RST_BAR, BIT(23), 22, 0x030c, 24, 0, 0, 0, 0x030c, 0),
+       PLL(CLK_APMIXED_USBPLL, "usbpll", 0x03c4, 0x03cc, 0x00000000,
+           0, 0, 22, 0x03c4, 24, 0, 0, 0, 0x03c4, 0, 0x03c4, 0x03cc, 2),
+       PLL_B(CLK_APMIXED_MSDCPLL, "msdcpll", 0x0350, 0x035c, 0x00000000,
+             0, 0, 22, 0x0354, 24, 0, 0, 0, 0x0354, 0),
+       PLL_B(CLK_APMIXED_MMPLL, "mmpll", 0x0360, 0x036c, 0xff000000,
+             HAVE_RST_BAR, BIT(23), 22, 0x0364, 24, 0, 0, 0, 0x0364, 0),
+       PLL_B(CLK_APMIXED_ADSPPLL, "adsppll", 0x0370, 0x037c, 0xff000000,
+             HAVE_RST_BAR, BIT(23), 22, 0x0374, 24, 0, 0, 0, 0x0374, 0),
+       PLL_B(CLK_APMIXED_MFGPLL, "mfgpll", 0x0268, 0x0274, 0x00000000,
+             0, 0, 22, 0x026c, 24, 0, 0, 0, 0x026c, 0),
+       PLL_B(CLK_APMIXED_TVDPLL, "tvdpll", 0x0380, 0x038c, 0x00000000,
+             0, 0, 22, 0x0384, 24, 0, 0, 0, 0x0384, 0),
+       PLL_B(CLK_APMIXED_APLL1, "apll1", 0x0318, 0x0328, 0x00000000,
+             0, 0, 32, 0x031c, 24, 0x0040, 0x000c, 0, 0x0320, 0),
+       PLL_B(CLK_APMIXED_APLL2, "apll2", 0x032c, 0x033c, 0x00000000,
+             0, 0, 32, 0x0330, 24, 0, 0, 0, 0x0334, 0),
+};
+
+static struct clk_onecell_data *top_clk_data;
+
+static void clk_mt8192_top_init_early(struct device_node *node)
+{
+       int i;
+
+       top_clk_data = mtk_alloc_clk_data(CLK_TOP_NR_CLK);
+       if (!top_clk_data)
+               return;
+
+       for (i = 0; i < CLK_TOP_NR_CLK; i++)
+               top_clk_data->clks[i] = ERR_PTR(-EPROBE_DEFER);
+
+       mtk_clk_register_factors(top_early_divs, ARRAY_SIZE(top_early_divs), top_clk_data);
+
+       of_clk_add_provider(node, of_clk_src_onecell_get, top_clk_data);
+}
+
+CLK_OF_DECLARE_DRIVER(mt8192_topckgen, "mediatek,mt8192-topckgen",
+                     clk_mt8192_top_init_early);
+
+static int clk_mt8192_top_probe(struct platform_device *pdev)
+{
+       struct device_node *node = pdev->dev.of_node;
+       int r;
+       void __iomem *base;
+
+       base = devm_platform_ioremap_resource(pdev, 0);
+       if (IS_ERR(base))
+               return PTR_ERR(base);
+
+       mtk_clk_register_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks), top_clk_data);
+       mtk_clk_register_factors(top_early_divs, ARRAY_SIZE(top_early_divs), 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, &mt8192_clk_lock,
+                              top_clk_data);
+       mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base, &mt8192_clk_lock,
+                                   top_clk_data);
+       mtk_clk_register_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), base, &mt8192_clk_lock,
+                                   top_clk_data);
+       r = mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks), top_clk_data);
+       if (r)
+               return r;
+
+       return of_clk_add_provider(node, of_clk_src_onecell_get, top_clk_data);
+}
+
+static int clk_mt8192_infra_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_INFRA_NR_CLK);
+       if (!clk_data)
+               return -ENOMEM;
+
+       r = mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks), clk_data);
+       if (r)
+               return r;
+
+       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+}
+
+static int clk_mt8192_peri_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_PERI_NR_CLK);
+       if (!clk_data)
+               return -ENOMEM;
+
+       r = mtk_clk_register_gates(node, peri_clks, ARRAY_SIZE(peri_clks), clk_data);
+       if (r)
+               return r;
+
+       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+}
+
+static int clk_mt8192_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)
+               return r;
+
+       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+}
+
+static const struct of_device_id of_match_clk_mt8192[] = {
+       {
+               .compatible = "mediatek,mt8192-apmixedsys",
+               .data = clk_mt8192_apmixed_probe,
+       }, {
+               .compatible = "mediatek,mt8192-topckgen",
+               .data = clk_mt8192_top_probe,
+       }, {
+               .compatible = "mediatek,mt8192-infracfg",
+               .data = clk_mt8192_infra_probe,
+       }, {
+               .compatible = "mediatek,mt8192-pericfg",
+               .data = clk_mt8192_peri_probe,
+       }, {
+               /* sentinel */
+       }
+};
+
+static int clk_mt8192_probe(struct platform_device *pdev)
+{
+       int (*clk_probe)(struct platform_device *pdev);
+       int r;
+
+       clk_probe = of_device_get_match_data(&pdev->dev);
+       if (!clk_probe)
+               return -EINVAL;
+
+       r = clk_probe(pdev);
+       if (r)
+               dev_err(&pdev->dev, "could not register clock provider: %s: %d\n", pdev->name, r);
+
+       return r;
+}
+
+static struct platform_driver clk_mt8192_drv = {
+       .probe = clk_mt8192_probe,
+       .driver = {
+               .name = "clk-mt8192",
+               .of_match_table = of_match_clk_mt8192,
+       },
+};
+
+static int __init clk_mt8192_init(void)
+{
+       return platform_driver_register(&clk_mt8192_drv);
+}
+
+arch_initcall(clk_mt8192_init);
index cec1c8a..4b6096c 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/clkdev.h>
 #include <linux/mfd/syscon.h>
 #include <linux/device.h>
+#include <linux/of_device.h>
 
 #include "clk-mtk.h"
 #include "clk-gate.h"
@@ -106,7 +107,7 @@ int mtk_clk_register_gates_with_dev(struct device_node *node,
        if (!clk_data)
                return -ENOMEM;
 
-       regmap = syscon_node_to_regmap(node);
+       regmap = device_node_to_regmap(node);
        if (IS_ERR(regmap)) {
                pr_err("Cannot find regmap for %pOF: %ld\n", node,
                                PTR_ERR(regmap));
@@ -286,3 +287,25 @@ void mtk_clk_register_dividers(const struct mtk_clk_divider *mcds,
                        clk_data->clks[mcd->id] = clk;
        }
 }
+
+int mtk_clk_simple_probe(struct platform_device *pdev)
+{
+       const struct mtk_clk_desc *mcd;
+       struct clk_onecell_data *clk_data;
+       struct device_node *node = pdev->dev.of_node;
+       int r;
+
+       mcd = of_device_get_match_data(&pdev->dev);
+       if (!mcd)
+               return -EINVAL;
+
+       clk_data = mtk_alloc_clk_data(mcd->num_clks);
+       if (!clk_data)
+               return -ENOMEM;
+
+       r = mtk_clk_register_gates(node, mcd->clks, mcd->num_clks, clk_data);
+       if (r)
+               return r;
+
+       return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
+}
index c3d6756..7de41c3 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/regmap.h>
 #include <linux/bitops.h>
 #include <linux/clk-provider.h>
+#include <linux/platform_device.h>
 
 struct clk;
 struct clk_onecell_data;
@@ -213,13 +214,13 @@ struct mtk_pll_div_table {
 struct mtk_pll_data {
        int id;
        const char *name;
-       uint32_t reg;
-       uint32_t pwr_reg;
-       uint32_t en_mask;
-       uint32_t pd_reg;
-       uint32_t tuner_reg;
-       uint32_t tuner_en_reg;
-       uint8_t tuner_en_bit;
+       u32 reg;
+       u32 pwr_reg;
+       u32 en_mask;
+       u32 pd_reg;
+       u32 tuner_reg;
+       u32 tuner_en_reg;
+       u8 tuner_en_bit;
        int pd_shift;
        unsigned int flags;
        const struct clk_ops *ops;
@@ -228,11 +229,13 @@ struct mtk_pll_data {
        unsigned long fmax;
        int pcwbits;
        int pcwibits;
-       uint32_t pcw_reg;
+       u32 pcw_reg;
        int pcw_shift;
-       uint32_t pcw_chg_reg;
+       u32 pcw_chg_reg;
        const struct mtk_pll_div_table *div_table;
        const char *parent_name;
+       u32 en_reg;
+       u8 pll_en_bit; /* Assume 0, indicates BIT(0) by default */
 };
 
 void mtk_clk_register_plls(struct device_node *node,
@@ -248,4 +251,11 @@ void mtk_register_reset_controller(struct device_node *np,
 void mtk_register_reset_controller_set_clr(struct device_node *np,
        unsigned int num_regs, int regofs);
 
+struct mtk_clk_desc {
+       const struct mtk_gate *clks;
+       size_t num_clks;
+};
+
+int mtk_clk_simple_probe(struct platform_device *pdev);
+
 #endif /* __DRV_CLK_MTK_H */
index b0c6170..855b0a1 100644 (file)
@@ -116,7 +116,12 @@ static int mtk_clk_mux_set_parent_setclr_lock(struct clk_hw *hw, u8 index)
        return 0;
 }
 
-static const struct clk_ops mtk_mux_ops = {
+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,
+};
+
+const struct clk_ops mtk_mux_gate_clr_set_upd_ops  = {
        .enable = mtk_clk_mux_enable_setclr,
        .disable = mtk_clk_mux_disable_setclr,
        .is_enabled = mtk_clk_mux_is_enabled,
@@ -140,7 +145,7 @@ static struct clk *mtk_clk_register_mux(const struct mtk_mux *mux,
        init.flags = mux->flags | CLK_SET_RATE_PARENT;
        init.parent_names = mux->parent_names;
        init.num_parents = mux->num_parents;
-       init.ops = &mtk_mux_ops;
+       init.ops = mux->ops;
 
        clk_mux->regmap = regmap;
        clk_mux->data = mux;
@@ -165,7 +170,7 @@ int mtk_clk_register_muxes(const struct mtk_mux *muxes,
        struct clk *clk;
        int i;
 
-       regmap = syscon_node_to_regmap(node);
+       regmap = device_node_to_regmap(node);
        if (IS_ERR(regmap)) {
                pr_err("Cannot find regmap for %pOF: %ld\n", node,
                       PTR_ERR(regmap));
index f194616..27841d6 100644 (file)
@@ -33,12 +33,13 @@ struct mtk_mux {
        u8 gate_shift;
        s8 upd_shift;
 
+       const struct clk_ops *ops;
        signed char num_parents;
 };
 
 #define GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, _mux_ofs,         \
                        _mux_set_ofs, _mux_clr_ofs, _shift, _width,     \
-                       _gate, _upd_ofs, _upd, _flags) {                \
+                       _gate, _upd_ofs, _upd, _flags, _ops) {          \
                .id = _id,                                              \
                .name = _name,                                          \
                .mux_ofs = _mux_ofs,                                    \
@@ -52,14 +53,19 @@ struct mtk_mux {
                .parent_names = _parents,                               \
                .num_parents = ARRAY_SIZE(_parents),                    \
                .flags = _flags,                                        \
+               .ops = &_ops,                                           \
        }
 
+extern const struct clk_ops mtk_mux_clr_set_upd_ops;
+extern const struct clk_ops mtk_mux_gate_clr_set_upd_ops;
+
 #define MUX_GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, _mux_ofs,     \
                        _mux_set_ofs, _mux_clr_ofs, _shift, _width,     \
                        _gate, _upd_ofs, _upd, _flags)                  \
                GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, _mux_ofs,  \
                        _mux_set_ofs, _mux_clr_ofs, _shift, _width,     \
-                       _gate, _upd_ofs, _upd, _flags)                  \
+                       _gate, _upd_ofs, _upd, _flags,                  \
+                       mtk_mux_gate_clr_set_upd_ops)
 
 #define MUX_GATE_CLR_SET_UPD(_id, _name, _parents, _mux_ofs,           \
                        _mux_set_ofs, _mux_clr_ofs, _shift, _width,     \
@@ -69,6 +75,14 @@ struct mtk_mux {
                        _width, _gate, _upd_ofs, _upd,                  \
                        CLK_SET_RATE_PARENT)
 
+#define MUX_CLR_SET_UPD(_id, _name, _parents, _mux_ofs,                        \
+                       _mux_set_ofs, _mux_clr_ofs, _shift, _width,     \
+                       _upd_ofs, _upd)                                 \
+               GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, _mux_ofs,  \
+                       _mux_set_ofs, _mux_clr_ofs, _shift, _width,     \
+                       0, _upd_ofs, _upd, CLK_SET_RATE_PARENT,         \
+                       mtk_mux_clr_set_upd_ops)
+
 int mtk_clk_register_muxes(const struct mtk_mux *muxes,
                           int num, struct device_node *node,
                           spinlock_t *lock,
index f440f2c..7fb001a 100644 (file)
@@ -44,6 +44,7 @@ struct mtk_clk_pll {
        void __iomem    *tuner_en_addr;
        void __iomem    *pcw_addr;
        void __iomem    *pcw_chg_addr;
+       void __iomem    *en_addr;
        const struct mtk_pll_data *data;
 };
 
@@ -56,7 +57,7 @@ static int mtk_pll_is_prepared(struct clk_hw *hw)
 {
        struct mtk_clk_pll *pll = to_mtk_clk_pll(hw);
 
-       return (readl(pll->base_addr + REG_CON0) & CON0_BASE_EN) != 0;
+       return (readl(pll->en_addr) & BIT(pll->data->pll_en_bit)) != 0;
 }
 
 static unsigned long __mtk_pll_recalc_rate(struct mtk_clk_pll *pll, u32 fin,
@@ -238,6 +239,7 @@ static int mtk_pll_prepare(struct clk_hw *hw)
 {
        struct mtk_clk_pll *pll = to_mtk_clk_pll(hw);
        u32 r;
+       u32 div_en_mask;
 
        r = readl(pll->pwr_addr) | CON0_PWR_ON;
        writel(r, pll->pwr_addr);
@@ -247,9 +249,14 @@ static int mtk_pll_prepare(struct clk_hw *hw)
        writel(r, pll->pwr_addr);
        udelay(1);
 
-       r = readl(pll->base_addr + REG_CON0);
-       r |= pll->data->en_mask;
-       writel(r, pll->base_addr + REG_CON0);
+       r = readl(pll->en_addr) | BIT(pll->data->pll_en_bit);
+       writel(r, pll->en_addr);
+
+       div_en_mask = pll->data->en_mask & ~CON0_BASE_EN;
+       if (div_en_mask) {
+               r = readl(pll->base_addr + REG_CON0) | div_en_mask;
+               writel(r, pll->base_addr + REG_CON0);
+       }
 
        __mtk_pll_tuner_enable(pll);
 
@@ -268,6 +275,7 @@ static void mtk_pll_unprepare(struct clk_hw *hw)
 {
        struct mtk_clk_pll *pll = to_mtk_clk_pll(hw);
        u32 r;
+       u32 div_en_mask;
 
        if (pll->data->flags & HAVE_RST_BAR) {
                r = readl(pll->base_addr + REG_CON0);
@@ -277,9 +285,14 @@ static void mtk_pll_unprepare(struct clk_hw *hw)
 
        __mtk_pll_tuner_disable(pll);
 
-       r = readl(pll->base_addr + REG_CON0);
-       r &= ~CON0_BASE_EN;
-       writel(r, pll->base_addr + REG_CON0);
+       div_en_mask = pll->data->en_mask & ~CON0_BASE_EN;
+       if (div_en_mask) {
+               r = readl(pll->base_addr + REG_CON0) & ~div_en_mask;
+               writel(r, pll->base_addr + REG_CON0);
+       }
+
+       r = readl(pll->en_addr) & ~BIT(pll->data->pll_en_bit);
+       writel(r, pll->en_addr);
 
        r = readl(pll->pwr_addr) | CON0_ISO_EN;
        writel(r, pll->pwr_addr);
@@ -321,6 +334,10 @@ static struct clk *mtk_clk_register_pll(const struct mtk_pll_data *data,
                pll->tuner_addr = base + data->tuner_reg;
        if (data->tuner_en_reg)
                pll->tuner_en_addr = base + data->tuner_en_reg;
+       if (data->en_reg)
+               pll->en_addr = base + data->en_reg;
+       else
+               pll->en_addr = pll->base_addr + REG_CON0;
        pll->hw.init = &init;
        pll->data = data;
 
index cb939c0..e562dc3 100644 (file)
@@ -98,7 +98,7 @@ static void mtk_register_reset_controller_common(struct device_node *np,
        int ret;
        struct regmap *regmap;
 
-       regmap = syscon_node_to_regmap(np);
+       regmap = device_node_to_regmap(np);
        if (IS_ERR(regmap)) {
                pr_err("Cannot find regmap for %pOF: %ld\n", np,
                                PTR_ERR(regmap));
index 4768023..8bc893d 100644 (file)
@@ -265,6 +265,7 @@ static const char *powersave_parents[] = {
 static const struct clk_muxing_soc_desc kirkwood_mux_desc[] __initconst = {
        { "powersave", powersave_parents, ARRAY_SIZE(powersave_parents),
                11, 1, 0 },
+       { }
 };
 
 static struct clk *clk_muxing_get_src(
index 62e00e1..0a55967 100644 (file)
@@ -240,6 +240,14 @@ config MSM_MMCC_8960
          Say Y if you want to support multimedia devices such as display,
          graphics, video encode/decode, camera, etc.
 
+config MSM_GCC_8953
+       tristate "MSM8953 Global Clock Controller"
+       select QCOM_GDSC
+       help
+         Support for the global clock controller on msm8953 devices.
+         Say Y if you want to use devices such as UART, SPI i2c, USB,
+         SD/eMMC, display, graphics, camera etc.
+
 config MSM_GCC_8974
        tristate "MSM8974 Global Clock Controller"
        select QCOM_GDSC
@@ -257,6 +265,15 @@ config MSM_MMCC_8974
          Say Y if you want to support multimedia devices such as display,
          graphics, video encode/decode, camera, etc.
 
+config MSM_MMCC_8994
+       tristate "MSM8994 Multimedia Clock Controller"
+       select MSM_GCC_8994
+       select QCOM_GDSC
+       help
+         Support for the multimedia clock controller on msm8994 devices.
+         Say Y if you want to support multimedia devices such as display,
+         graphics, video encode/decode, camera, etc.
+
 config MSM_GCC_8994
        tristate "MSM8994 Global Clock Controller"
        help
@@ -332,6 +349,15 @@ config SC_DISPCC_7180
          Say Y if you want to support display devices and functionality such as
          splash screen.
 
+config SC_DISPCC_7280
+       tristate "SC7280 Display Clock Controller"
+       select SC_GCC_7280
+       help
+         Support for the display clock controller on Qualcomm Technologies, Inc.
+         SC7280 devices.
+         Say Y if you want to support display devices and functionality such as
+         splash screen.
+
 config SC_GCC_7180
        tristate "SC7180 Global Clock Controller"
        select QCOM_GDSC
@@ -376,6 +402,14 @@ config SC_GPUCC_7180
          Say Y if you want to support graphics controller devices and
          functionality such as 3D graphics.
 
+config SC_GPUCC_7280
+       tristate "SC7280 Graphics Clock Controller"
+       select SC_GCC_7280
+       help
+         Support for the graphics clock controller on SC7280 devices.
+         Say Y if you want to support graphics controller devices and
+         functionality such as 3D graphics.
+
 config SC_MSS_7180
        tristate "SC7180 Modem Clock Controller"
        select SC_GCC_7180
@@ -393,6 +427,14 @@ config SC_VIDEOCC_7180
          Say Y if you want to support video devices and functionality such as
          video encode and decode.
 
+config SC_VIDEOCC_7280
+       tristate "SC7280 Video Clock Controller"
+       select SC_GCC_7280
+       help
+         Support for the video clock controller on SC7280 devices.
+         Say Y if you want to support video devices and functionality such as
+         video encode and decode.
+
 config SDM_CAMCC_845
        tristate "SDM845 Camera Clock Controller"
        select SDM_GCC_845
@@ -506,6 +548,13 @@ config SM_DISPCC_8250
          Say Y if you want to support display devices and functionality such as
          splash screen.
 
+config SM_GCC_6115
+       tristate "SM6115 and SM4250 Global Clock Controller"
+       help
+         Support for the global clock controller on SM6115 and SM4250 devices.
+         Say Y if you want to use peripheral devices such as UART, SPI,
+         i2C, USB, UFS, SDDC, PCIe, etc.
+
 config SM_GCC_6125
        tristate "SM6125 Global Clock Controller"
        help
@@ -513,6 +562,13 @@ config SM_GCC_6125
          Say Y if you want to use peripheral devices such as UART,
          SPI, I2C, USB, SD/UFS, PCIe etc.
 
+config SM_GCC_6350
+       tristate "SM6350 Global Clock Controller"
+       help
+         Support for the global clock controller on SM6350 devices.
+         Say Y if you want to use peripheral devices such as UART,
+         SPI, I2C, USB, SD/UFS, PCIe etc.
+
 config SM_GCC_8150
        tristate "SM8150 Global Clock Controller"
        help
@@ -554,7 +610,7 @@ config SM_GPUCC_8250
 
 config SM_VIDEOCC_8150
        tristate "SM8150 Video Clock Controller"
-       select SDM_GCC_8150
+       select SM_GCC_8150
        select QCOM_GDSC
        help
          Support for the video clock controller on SM8150 devices.
@@ -563,7 +619,7 @@ config SM_VIDEOCC_8150
 
 config SM_VIDEOCC_8250
        tristate "SM8250 Video Clock Controller"
-       select SDM_GCC_8250
+       select SM_GCC_8250
        select QCOM_GDSC
        help
          Support for the video clock controller on SM8250 devices.
index c2a1caf..9825ef8 100644 (file)
@@ -33,6 +33,7 @@ obj-$(CONFIG_MDM_LCC_9615) += lcc-mdm9615.o
 obj-$(CONFIG_MSM_GCC_8660) += gcc-msm8660.o
 obj-$(CONFIG_MSM_GCC_8916) += gcc-msm8916.o
 obj-$(CONFIG_MSM_GCC_8939) += gcc-msm8939.o
+obj-$(CONFIG_MSM_GCC_8953) += gcc-msm8953.o
 obj-$(CONFIG_MSM_GCC_8960) += gcc-msm8960.o
 obj-$(CONFIG_MSM_GCC_8974) += gcc-msm8974.o
 obj-$(CONFIG_MSM_GCC_8994) += gcc-msm8994.o
@@ -42,6 +43,7 @@ obj-$(CONFIG_MSM_GCC_8998) += gcc-msm8998.o
 obj-$(CONFIG_MSM_GPUCC_8998) += gpucc-msm8998.o
 obj-$(CONFIG_MSM_MMCC_8960) += mmcc-msm8960.o
 obj-$(CONFIG_MSM_MMCC_8974) += mmcc-msm8974.o
+obj-$(CONFIG_MSM_MMCC_8994) += mmcc-msm8994.o
 obj-$(CONFIG_MSM_MMCC_8996) += mmcc-msm8996.o
 obj-$(CONFIG_MSM_MMCC_8998) += mmcc-msm8998.o
 obj-$(CONFIG_QCOM_A53PLL) += a53-pll.o
@@ -57,13 +59,16 @@ 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_DISPCC_7180) += dispcc-sc7180.o
+obj-$(CONFIG_SC_DISPCC_7280) += dispcc-sc7280.o
 obj-$(CONFIG_SC_GCC_7180) += gcc-sc7180.o
 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_LPASS_CORECC_7180) += lpasscorecc-sc7180.o
 obj-$(CONFIG_SC_MSS_7180) += mss-sc7180.o
 obj-$(CONFIG_SC_VIDEOCC_7180) += videocc-sc7180.o
+obj-$(CONFIG_SC_VIDEOCC_7280) += videocc-sc7280.o
 obj-$(CONFIG_SDM_CAMCC_845) += camcc-sdm845.o
 obj-$(CONFIG_SDM_DISPCC_845) += dispcc-sdm845.o
 obj-$(CONFIG_SDM_GCC_660) += gcc-sdm660.o
@@ -76,7 +81,9 @@ obj-$(CONFIG_SDM_VIDEOCC_845) += videocc-sdm845.o
 obj-$(CONFIG_SDX_GCC_55) += gcc-sdx55.o
 obj-$(CONFIG_SM_CAMCC_8250) += camcc-sm8250.o
 obj-$(CONFIG_SM_DISPCC_8250) += dispcc-sm8250.o
+obj-$(CONFIG_SM_GCC_6115) += gcc-sm6115.o
 obj-$(CONFIG_SM_GCC_6125) += gcc-sm6125.o
+obj-$(CONFIG_SM_GCC_6350) += gcc-sm6350.o
 obj-$(CONFIG_SM_GCC_8150) += gcc-sm8150.o
 obj-$(CONFIG_SM_GCC_8250) += gcc-sm8250.o
 obj-$(CONFIG_SM_GCC_8350) += gcc-sm8350.o
index af6ac17..9e6decb 100644 (file)
@@ -6,9 +6,11 @@
  * Author: Georgi Djakov <georgi.djakov@linaro.org>
  */
 
+#include <linux/clk.h>
 #include <linux/clk-provider.h>
 #include <linux/kernel.h>
 #include <linux/platform_device.h>
+#include <linux/pm_opp.h>
 #include <linux/regmap.h>
 #include <linux/module.h>
 
@@ -34,9 +36,59 @@ static const struct regmap_config a53pll_regmap_config = {
        .fast_io                = true,
 };
 
+static struct pll_freq_tbl *qcom_a53pll_get_freq_tbl(struct device *dev)
+{
+       struct pll_freq_tbl *freq_tbl;
+       unsigned long xo_freq;
+       unsigned long freq;
+       struct clk *xo_clk;
+       int count;
+       int ret;
+       int i;
+
+       xo_clk = devm_clk_get(dev, "xo");
+       if (IS_ERR(xo_clk))
+               return NULL;
+
+       xo_freq = clk_get_rate(xo_clk);
+
+       ret = devm_pm_opp_of_add_table(dev);
+       if (ret)
+               return NULL;
+
+       count = dev_pm_opp_get_opp_count(dev);
+       if (count <= 0)
+               return NULL;
+
+       freq_tbl = devm_kcalloc(dev, count + 1, sizeof(*freq_tbl), GFP_KERNEL);
+       if (!freq_tbl)
+               return NULL;
+
+       for (i = 0, freq = 0; i < count; i++, freq++) {
+               struct dev_pm_opp *opp;
+
+               opp = dev_pm_opp_find_freq_ceil(dev, &freq);
+               if (IS_ERR(opp))
+                       return NULL;
+
+               /* Skip the freq that is not divisible */
+               if (freq % xo_freq)
+                       continue;
+
+               freq_tbl[i].freq = freq;
+               freq_tbl[i].l = freq / xo_freq;
+               freq_tbl[i].n = 1;
+
+               dev_pm_opp_put(opp);
+       }
+
+       return freq_tbl;
+}
+
 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;
@@ -64,13 +116,22 @@ static int qcom_a53pll_probe(struct platform_device *pdev)
        pll->mode_reg = 0x00;
        pll->status_reg = 0x1c;
        pll->status_bit = 16;
-       pll->freq_tbl = a53pll_freq;
 
-       init.name = "a53pll";
+       pll->freq_tbl = qcom_a53pll_get_freq_tbl(dev);
+       if (!pll->freq_tbl) {
+               /* Fall on a53pll_freq if no freq_tbl is found from OPP */
+               pll->freq_tbl = a53pll_freq;
+       }
+
+       /* Use an unique name by appending @unit-address */
+       init.name = devm_kasprintf(dev, GFP_KERNEL, "a53pll%s",
+                                  strchrnul(np->full_name, '@'));
+       if (!init.name)
+               return -ENOMEM;
+
        init.parent_names = (const char *[]){ "xo" };
        init.num_parents = 1;
        init.ops = &clk_pll_sr2_ops;
-       init.flags = CLK_IS_CRITICAL;
        pll->clkr.hw.init = &init;
 
        ret = devm_clk_register_regmap(dev, &pll->clkr);
@@ -91,6 +152,7 @@ static int qcom_a53pll_probe(struct platform_device *pdev)
 
 static const struct of_device_id qcom_a53pll_match_table[] = {
        { .compatible = "qcom,msm8916-a53pll" },
+       { .compatible = "qcom,msm8939-a53pll" },
        { }
 };
 MODULE_DEVICE_TABLE(of, qcom_a53pll_match_table);
index cf69a97..89e0730 100644 (file)
@@ -46,6 +46,7 @@ static int qcom_apcs_msm8916_clk_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct device *parent = dev->parent;
+       struct device_node *np = parent->of_node;
        struct clk_regmap_mux_div *a53cc;
        struct regmap *regmap;
        struct clk_init_data init = { };
@@ -61,11 +62,16 @@ static int qcom_apcs_msm8916_clk_probe(struct platform_device *pdev)
        if (!a53cc)
                return -ENOMEM;
 
-       init.name = "a53mux";
+       /* Use an unique name by appending parent's @unit-address */
+       init.name = devm_kasprintf(dev, GFP_KERNEL, "a53mux%s",
+                                  strchrnul(np->full_name, '@'));
+       if (!init.name)
+               return -ENOMEM;
+
        init.parent_data = pdata;
        init.num_parents = ARRAY_SIZE(pdata);
        init.ops = &clk_regmap_mux_div_ops;
-       init.flags = CLK_SET_RATE_PARENT;
+       init.flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT;
 
        a53cc->clkr.hw.init = &init;
        a53cc->clkr.regmap = regmap;
index 9bcf2f8..ce73ee9 100644 (file)
@@ -1652,32 +1652,35 @@ static int cam_cc_sc7180_probe(struct platform_device *pdev)
        struct regmap *regmap;
        int ret;
 
-       pm_runtime_enable(&pdev->dev);
-       ret = pm_clk_create(&pdev->dev);
+       ret = devm_pm_runtime_enable(&pdev->dev);
+       if (ret < 0)
+               return ret;
+
+       ret = devm_pm_clk_create(&pdev->dev);
        if (ret < 0)
                return ret;
 
        ret = pm_clk_add(&pdev->dev, "xo");
        if (ret < 0) {
                dev_err(&pdev->dev, "Failed to acquire XO clock\n");
-               goto disable_pm_runtime;
+               return ret;
        }
 
        ret = pm_clk_add(&pdev->dev, "iface");
        if (ret < 0) {
                dev_err(&pdev->dev, "Failed to acquire iface clock\n");
-               goto disable_pm_runtime;
+               return ret;
        }
 
        ret = pm_runtime_get(&pdev->dev);
        if (ret)
-               goto destroy_pm_clk;
+               return ret;
 
        regmap = qcom_cc_map(pdev, &cam_cc_sc7180_desc);
        if (IS_ERR(regmap)) {
                ret = PTR_ERR(regmap);
                pm_runtime_put(&pdev->dev);
-               goto destroy_pm_clk;
+               return ret;
        }
 
        clk_fabia_pll_configure(&cam_cc_pll0, regmap, &cam_cc_pll0_config);
@@ -1689,18 +1692,10 @@ static int cam_cc_sc7180_probe(struct platform_device *pdev)
        pm_runtime_put(&pdev->dev);
        if (ret < 0) {
                dev_err(&pdev->dev, "Failed to register CAM CC clocks\n");
-               goto destroy_pm_clk;
+               return ret;
        }
 
        return 0;
-
-destroy_pm_clk:
-       pm_clk_destroy(&pdev->dev);
-
-disable_pm_runtime:
-       pm_runtime_disable(&pdev->dev);
-
-       return ret;
 }
 
 static const struct dev_pm_ops cam_cc_pm_ops = {
index 552d1cb..441d7a2 100644 (file)
@@ -536,6 +536,26 @@ static const struct clk_rpmh_desc clk_rpmh_sc7280 = {
        .num_clks = ARRAY_SIZE(sc7280_rpmh_clocks),
 };
 
+DEFINE_CLK_RPMH_VRM(sm6350, ln_bb_clk2, ln_bb_clk2_ao, "lnbclkg2", 4);
+DEFINE_CLK_RPMH_VRM(sm6350, ln_bb_clk3, ln_bb_clk3_ao, "lnbclkg3", 4);
+DEFINE_CLK_RPMH_ARC(sm6350, qlink, qlink_ao, "qphy.lvl", 0x1, 4);
+
+static struct clk_hw *sm6350_rpmh_clocks[] = {
+       [RPMH_CXO_CLK]          = &sc7280_bi_tcxo.hw,
+       [RPMH_CXO_CLK_A]        = &sc7280_bi_tcxo_ao.hw,
+       [RPMH_LN_BB_CLK2]       = &sm6350_ln_bb_clk2.hw,
+       [RPMH_LN_BB_CLK2_A]     = &sm6350_ln_bb_clk2_ao.hw,
+       [RPMH_LN_BB_CLK3]       = &sm6350_ln_bb_clk3.hw,
+       [RPMH_LN_BB_CLK3_A]     = &sm6350_ln_bb_clk3_ao.hw,
+       [RPMH_QLINK_CLK]        = &sm6350_qlink.hw,
+       [RPMH_QLINK_CLK_A]      = &sm6350_qlink_ao.hw,
+};
+
+static const struct clk_rpmh_desc clk_rpmh_sm6350 = {
+       .clks = sm6350_rpmh_clocks,
+       .num_clks = ARRAY_SIZE(sm6350_rpmh_clocks),
+};
+
 static struct clk_hw *of_clk_rpmh_hw_get(struct of_phandle_args *clkspec,
                                         void *data)
 {
@@ -623,6 +643,7 @@ static const struct of_device_id clk_rpmh_match_table[] = {
        { .compatible = "qcom,sc8180x-rpmh-clk", .data = &clk_rpmh_sc8180x},
        { .compatible = "qcom,sdm845-rpmh-clk", .data = &clk_rpmh_sdm845},
        { .compatible = "qcom,sdx55-rpmh-clk",  .data = &clk_rpmh_sdx55},
+       { .compatible = "qcom,sm6350-rpmh-clk", .data = &clk_rpmh_sm6350},
        { .compatible = "qcom,sm8150-rpmh-clk", .data = &clk_rpmh_sm8150},
        { .compatible = "qcom,sm8250-rpmh-clk", .data = &clk_rpmh_sm8250},
        { .compatible = "qcom,sm8350-rpmh-clk", .data = &clk_rpmh_sm8350},
index b2c142f..66d7807 100644 (file)
@@ -913,10 +913,166 @@ static const struct rpm_smd_clk_desc rpm_clk_sdm660 = {
        .num_clks = ARRAY_SIZE(sdm660_clks),
 };
 
+static struct clk_smd_rpm *mdm9607_clks[] = {
+       [RPM_SMD_XO_CLK_SRC]            = &sdm660_bi_tcxo,
+       [RPM_SMD_XO_A_CLK_SRC]          = &sdm660_bi_tcxo_a,
+       [RPM_SMD_PCNOC_CLK]             = &msm8916_pcnoc_clk,
+       [RPM_SMD_PCNOC_A_CLK]           = &msm8916_pcnoc_a_clk,
+       [RPM_SMD_BIMC_CLK]              = &msm8916_bimc_clk,
+       [RPM_SMD_BIMC_A_CLK]            = &msm8916_bimc_a_clk,
+       [RPM_SMD_QPIC_CLK]              = &qcs404_qpic_clk,
+       [RPM_SMD_QPIC_CLK_A]            = &qcs404_qpic_a_clk,
+       [RPM_SMD_QDSS_CLK]              = &msm8916_qdss_clk,
+       [RPM_SMD_QDSS_A_CLK]            = &msm8916_qdss_a_clk,
+       [RPM_SMD_BB_CLK1]               = &msm8916_bb_clk1,
+       [RPM_SMD_BB_CLK1_A]             = &msm8916_bb_clk1_a,
+       [RPM_SMD_BB_CLK1_PIN]           = &msm8916_bb_clk1_pin,
+       [RPM_SMD_BB_CLK1_A_PIN]         = &msm8916_bb_clk1_a_pin,
+};
+
+static const struct rpm_smd_clk_desc rpm_clk_mdm9607 = {
+       .clks = mdm9607_clks,
+       .num_clks = ARRAY_SIZE(mdm9607_clks),
+};
+
+static struct clk_smd_rpm *msm8953_clks[] = {
+       [RPM_SMD_XO_CLK_SRC]            = &sdm660_bi_tcxo,
+       [RPM_SMD_XO_A_CLK_SRC]          = &sdm660_bi_tcxo_a,
+       [RPM_SMD_PCNOC_CLK]             = &msm8916_pcnoc_clk,
+       [RPM_SMD_PCNOC_A_CLK]           = &msm8916_pcnoc_a_clk,
+       [RPM_SMD_SNOC_CLK]              = &msm8916_snoc_clk,
+       [RPM_SMD_SNOC_A_CLK]            = &msm8916_snoc_a_clk,
+       [RPM_SMD_BIMC_CLK]              = &msm8916_bimc_clk,
+       [RPM_SMD_BIMC_A_CLK]            = &msm8916_bimc_a_clk,
+       [RPM_SMD_IPA_CLK]               = &msm8976_ipa_clk,
+       [RPM_SMD_IPA_A_CLK]             = &msm8976_ipa_a_clk,
+       [RPM_SMD_SYSMMNOC_CLK]          = &msm8936_sysmmnoc_clk,
+       [RPM_SMD_SYSMMNOC_A_CLK]        = &msm8936_sysmmnoc_a_clk,
+       [RPM_SMD_QDSS_CLK]              = &msm8916_qdss_clk,
+       [RPM_SMD_QDSS_A_CLK]            = &msm8916_qdss_a_clk,
+       [RPM_SMD_BB_CLK1]               = &msm8916_bb_clk1,
+       [RPM_SMD_BB_CLK1_A]             = &msm8916_bb_clk1_a,
+       [RPM_SMD_BB_CLK2]               = &msm8916_bb_clk2,
+       [RPM_SMD_BB_CLK2_A]             = &msm8916_bb_clk2_a,
+       [RPM_SMD_RF_CLK2]               = &msm8916_rf_clk2,
+       [RPM_SMD_RF_CLK2_A]             = &msm8916_rf_clk2_a,
+       [RPM_SMD_RF_CLK3]               = &msm8992_ln_bb_clk,
+       [RPM_SMD_RF_CLK3_A]             = &msm8992_ln_bb_a_clk,
+       [RPM_SMD_DIV_CLK2]              = &msm8974_div_clk2,
+       [RPM_SMD_DIV_A_CLK2]            = &msm8974_div_a_clk2,
+       [RPM_SMD_BB_CLK1_PIN]           = &msm8916_bb_clk1_pin,
+       [RPM_SMD_BB_CLK1_A_PIN]         = &msm8916_bb_clk1_a_pin,
+       [RPM_SMD_BB_CLK2_PIN]           = &msm8916_bb_clk2_pin,
+       [RPM_SMD_BB_CLK2_A_PIN]         = &msm8916_bb_clk2_a_pin,
+};
+
+static const struct rpm_smd_clk_desc rpm_clk_msm8953 = {
+       .clks = msm8953_clks,
+       .num_clks = ARRAY_SIZE(msm8953_clks),
+};
+
+/* SM6125 */
+DEFINE_CLK_SMD_RPM(sm6125, cnoc_clk, cnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 1);
+DEFINE_CLK_SMD_RPM(sm6125, snoc_clk, snoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 2);
+DEFINE_CLK_SMD_RPM_BRANCH(sm6125, qdss_clk, qdss_a_clk,
+                                       QCOM_SMD_RPM_MISC_CLK, 1, 19200000);
+DEFINE_CLK_SMD_RPM(sm6125, qup_clk, qup_a_clk, QCOM_SMD_RPM_QUP_CLK, 0);
+DEFINE_CLK_SMD_RPM(sm6125, mmnrt_clk, mmnrt_a_clk, QCOM_SMD_RPM_MMAXI_CLK, 0);
+DEFINE_CLK_SMD_RPM(sm6125, mmrt_clk, mmrt_a_clk, QCOM_SMD_RPM_MMAXI_CLK, 1);
+DEFINE_CLK_SMD_RPM(sm6125, snoc_periph_clk, snoc_periph_a_clk,
+                                               QCOM_SMD_RPM_BUS_CLK, 0);
+DEFINE_CLK_SMD_RPM(sm6125, snoc_lpass_clk, snoc_lpass_a_clk,
+                                               QCOM_SMD_RPM_BUS_CLK, 5);
+
+static struct clk_smd_rpm *sm6125_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_RF_CLK1] = &msm8916_rf_clk1,
+       [RPM_SMD_RF_CLK1_A] = &msm8916_rf_clk1_a,
+       [RPM_SMD_RF_CLK2] = &msm8916_rf_clk2,
+       [RPM_SMD_RF_CLK2_A] = &msm8916_rf_clk2_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_CE1_CLK] = &msm8992_ce1_clk,
+       [RPM_SMD_CE1_A_CLK] = &msm8992_ce1_a_clk,
+       [RPM_SMD_LN_BB_CLK1] = &msm8916_bb_clk1,
+       [RPM_SMD_LN_BB_CLK1_A] = &msm8916_bb_clk1_a,
+       [RPM_SMD_LN_BB_CLK2] = &msm8916_bb_clk2,
+       [RPM_SMD_LN_BB_CLK2_A] = &msm8916_bb_clk2_a,
+       [RPM_SMD_LN_BB_CLK3] = &sdm660_ln_bb_clk3,
+       [RPM_SMD_LN_BB_CLK3_A] = &sdm660_ln_bb_clk3_a,
+       [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,
+};
+
+static const struct rpm_smd_clk_desc rpm_clk_sm6125 = {
+       .clks = sm6125_clks,
+       .num_clks = ARRAY_SIZE(sm6125_clks),
+};
+
+/* SM6115 */
+static struct clk_smd_rpm *sm6115_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_RF_CLK1] = &msm8916_rf_clk1,
+       [RPM_SMD_RF_CLK1_A] = &msm8916_rf_clk1_a,
+       [RPM_SMD_RF_CLK2] = &msm8916_rf_clk2,
+       [RPM_SMD_RF_CLK2_A] = &msm8916_rf_clk2_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_CE1_CLK] = &msm8992_ce1_clk,
+       [RPM_SMD_CE1_A_CLK] = &msm8992_ce1_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_RF_CLK1_PIN] = &msm8916_rf_clk1_pin,
+       [RPM_SMD_RF_CLK1_A_PIN] = &msm8916_rf_clk1_a_pin,
+       [RPM_SMD_RF_CLK2_PIN] = &msm8916_rf_clk2_pin,
+       [RPM_SMD_RF_CLK2_A_PIN] = &msm8916_rf_clk2_a_pin,
+};
+
+static const struct rpm_smd_clk_desc rpm_clk_sm6115 = {
+       .clks = sm6115_clks,
+       .num_clks = ARRAY_SIZE(sm6115_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 },
        { .compatible = "qcom,rpmcc-msm8916", .data = &rpm_clk_msm8916 },
        { .compatible = "qcom,rpmcc-msm8936", .data = &rpm_clk_msm8936 },
+       { .compatible = "qcom,rpmcc-msm8953", .data = &rpm_clk_msm8953 },
        { .compatible = "qcom,rpmcc-msm8974", .data = &rpm_clk_msm8974 },
        { .compatible = "qcom,rpmcc-msm8976", .data = &rpm_clk_msm8976 },
        { .compatible = "qcom,rpmcc-msm8992", .data = &rpm_clk_msm8992 },
@@ -925,6 +1081,8 @@ static const struct of_device_id rpm_smd_clk_match_table[] = {
        { .compatible = "qcom,rpmcc-msm8998", .data = &rpm_clk_msm8998 },
        { .compatible = "qcom,rpmcc-qcs404",  .data = &rpm_clk_qcs404  },
        { .compatible = "qcom,rpmcc-sdm660",  .data = &rpm_clk_sdm660  },
+       { .compatible = "qcom,rpmcc-sm6115",  .data = &rpm_clk_sm6115  },
+       { .compatible = "qcom,rpmcc-sm6125",  .data = &rpm_clk_sm6125  },
        { }
 };
 MODULE_DEVICE_TABLE(of, rpm_smd_clk_match_table);
diff --git a/drivers/clk/qcom/dispcc-sc7280.c b/drivers/clk/qcom/dispcc-sc7280.c
new file mode 100644 (file)
index 0000000..4ef4ae2
--- /dev/null
@@ -0,0 +1,908 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+
+#include <dt-bindings/clock/qcom,dispcc-sc7280.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"
+
+enum {
+       P_BI_TCXO,
+       P_DISP_CC_PLL0_OUT_EVEN,
+       P_DISP_CC_PLL0_OUT_MAIN,
+       P_DP_PHY_PLL_LINK_CLK,
+       P_DP_PHY_PLL_VCO_DIV_CLK,
+       P_DSI0_PHY_PLL_OUT_BYTECLK,
+       P_DSI0_PHY_PLL_OUT_DSICLK,
+       P_EDP_PHY_PLL_LINK_CLK,
+       P_EDP_PHY_PLL_VCO_DIV_CLK,
+       P_GCC_DISP_GPLL0_CLK,
+};
+
+static const struct pll_vco lucid_vco[] = {
+       { 249600000, 2000000000, 0 },
+};
+
+/* 1520MHz Configuration*/
+static const struct alpha_pll_config disp_cc_pll0_config = {
+       .l = 0x4F,
+       .alpha = 0x2AAA,
+       .config_ctl_val = 0x20485699,
+       .config_ctl_hi_val = 0x00002261,
+       .config_ctl_hi1_val = 0x329A299C,
+       .user_ctl_val = 0x00000001,
+       .user_ctl_hi_val = 0x00000805,
+       .user_ctl_hi1_val = 0x00000000,
+};
+
+static struct clk_alpha_pll disp_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 = "disp_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 parent_map disp_cc_parent_map_0[] = {
+       { P_BI_TCXO, 0 },
+};
+
+static const struct clk_parent_data disp_cc_parent_data_0[] = {
+       { .fw_name = "bi_tcxo" },
+};
+
+static const struct parent_map disp_cc_parent_map_1[] = {
+       { P_BI_TCXO, 0 },
+       { P_DP_PHY_PLL_LINK_CLK, 1 },
+       { P_DP_PHY_PLL_VCO_DIV_CLK, 2 },
+};
+
+static const struct clk_parent_data disp_cc_parent_data_1[] = {
+       { .fw_name = "bi_tcxo" },
+       { .fw_name = "dp_phy_pll_link_clk" },
+       { .fw_name = "dp_phy_pll_vco_div_clk" },
+};
+
+static const struct parent_map disp_cc_parent_map_2[] = {
+       { P_BI_TCXO, 0 },
+       { P_DSI0_PHY_PLL_OUT_BYTECLK, 1 },
+};
+
+static const struct clk_parent_data disp_cc_parent_data_2[] = {
+       { .fw_name = "bi_tcxo" },
+       { .fw_name = "dsi0_phy_pll_out_byteclk" },
+};
+
+static const struct parent_map disp_cc_parent_map_3[] = {
+       { P_BI_TCXO, 0 },
+       { P_EDP_PHY_PLL_LINK_CLK, 1 },
+       { P_EDP_PHY_PLL_VCO_DIV_CLK, 2 },
+};
+
+static const struct clk_parent_data disp_cc_parent_data_3[] = {
+       { .fw_name = "bi_tcxo" },
+       { .fw_name = "edp_phy_pll_link_clk" },
+       { .fw_name = "edp_phy_pll_vco_div_clk" },
+};
+
+static const struct parent_map disp_cc_parent_map_4[] = {
+       { P_BI_TCXO, 0 },
+       { P_DISP_CC_PLL0_OUT_MAIN, 1 },
+       { P_GCC_DISP_GPLL0_CLK, 4 },
+       { P_DISP_CC_PLL0_OUT_EVEN, 5 },
+};
+
+static const struct clk_parent_data disp_cc_parent_data_4[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &disp_cc_pll0.clkr.hw },
+       { .fw_name = "gcc_disp_gpll0_clk" },
+       { .hw = &disp_cc_pll0.clkr.hw },
+};
+
+static const struct parent_map disp_cc_parent_map_5[] = {
+       { P_BI_TCXO, 0 },
+       { P_GCC_DISP_GPLL0_CLK, 4 },
+};
+
+static const struct clk_parent_data disp_cc_parent_data_5[] = {
+       { .fw_name = "bi_tcxo" },
+       { .fw_name = "gcc_disp_gpll0_clk" },
+};
+
+static const struct parent_map disp_cc_parent_map_6[] = {
+       { P_BI_TCXO, 0 },
+       { P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
+};
+
+static const struct clk_parent_data disp_cc_parent_data_6[] = {
+       { .fw_name = "bi_tcxo" },
+       { .fw_name = "dsi0_phy_pll_out_dsiclk" },
+};
+
+static const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(37500000, P_GCC_DISP_GPLL0_CLK, 16, 0, 0),
+       F(75000000, P_GCC_DISP_GPLL0_CLK, 8, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = {
+       .cmd_rcgr = 0x1170,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_5,
+       .freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "disp_cc_mdss_ahb_clk_src",
+               .parent_data = disp_cc_parent_data_5,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_5),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = {
+       .cmd_rcgr = 0x10d8,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_2,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "disp_cc_mdss_byte0_clk_src",
+               .parent_data = disp_cc_parent_data_2,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_byte2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_disp_cc_mdss_dp_aux_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 disp_cc_mdss_dp_aux_clk_src = {
+       .cmd_rcgr = 0x1158,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_0,
+       .freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "disp_cc_mdss_dp_aux_clk_src",
+               .parent_data = disp_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_dp_crypto_clk_src = {
+       .cmd_rcgr = 0x1128,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_1,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "disp_cc_mdss_dp_crypto_clk_src",
+               .parent_data = disp_cc_parent_data_1,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
+               .ops = &clk_byte2_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_dp_link_clk_src = {
+       .cmd_rcgr = 0x110c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_1,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "disp_cc_mdss_dp_link_clk_src",
+               .parent_data = disp_cc_parent_data_1,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
+               .ops = &clk_byte2_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_dp_pixel_clk_src = {
+       .cmd_rcgr = 0x1140,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_1,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "disp_cc_mdss_dp_pixel_clk_src",
+               .parent_data = disp_cc_parent_data_1,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
+               .ops = &clk_dp_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_edp_aux_clk_src = {
+       .cmd_rcgr = 0x11d0,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_0,
+       .freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "disp_cc_mdss_edp_aux_clk_src",
+               .parent_data = disp_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_edp_link_clk_src = {
+       .cmd_rcgr = 0x11a0,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_3,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "disp_cc_mdss_edp_link_clk_src",
+               .parent_data = disp_cc_parent_data_3,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_byte2_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_edp_pixel_clk_src = {
+       .cmd_rcgr = 0x1188,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_3,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "disp_cc_mdss_edp_pixel_clk_src",
+               .parent_data = disp_cc_parent_data_3,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
+               .ops = &clk_dp_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = {
+       .cmd_rcgr = 0x10f4,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_2,
+       .freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "disp_cc_mdss_esc0_clk_src",
+               .parent_data = disp_cc_parent_data_2,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = {
+       F(200000000, P_GCC_DISP_GPLL0_CLK, 3, 0, 0),
+       F(300000000, P_GCC_DISP_GPLL0_CLK, 2, 0, 0),
+       F(380000000, P_DISP_CC_PLL0_OUT_MAIN, 4, 0, 0),
+       F(506666667, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
+       F(608000000, P_DISP_CC_PLL0_OUT_MAIN, 2.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = {
+       .cmd_rcgr = 0x1090,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_4,
+       .freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "disp_cc_mdss_mdp_clk_src",
+               .parent_data = disp_cc_parent_data_4,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = {
+       .cmd_rcgr = 0x1078,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_6,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "disp_cc_mdss_pclk0_clk_src",
+               .parent_data = disp_cc_parent_data_6,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_6),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_pixel_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_rot_clk_src = {
+       .cmd_rcgr = 0x10a8,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_4,
+       .freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "disp_cc_mdss_rot_clk_src",
+               .parent_data = disp_cc_parent_data_4,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = {
+       .cmd_rcgr = 0x10c0,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_0,
+       .freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "disp_cc_mdss_vsync_clk_src",
+               .parent_data = disp_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = {
+       .reg = 0x10f0,
+       .shift = 0,
+       .width = 4,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_byte0_div_clk_src",
+               .parent_hws = (const struct clk_hw*[]){
+                       &disp_cc_mdss_byte0_clk_src.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_regmap_div_ops,
+       },
+};
+
+static struct clk_regmap_div disp_cc_mdss_dp_link_div_clk_src = {
+       .reg = 0x1124,
+       .shift = 0,
+       .width = 4,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_dp_link_div_clk_src",
+               .parent_hws = (const struct clk_hw*[]){
+                       &disp_cc_mdss_dp_link_clk_src.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_regmap_div_ro_ops,
+       },
+};
+
+static struct clk_regmap_div disp_cc_mdss_edp_link_div_clk_src = {
+       .reg = 0x11b8,
+       .shift = 0,
+       .width = 4,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_edp_link_div_clk_src",
+               .parent_hws = (const struct clk_hw*[]){
+                       &disp_cc_mdss_edp_link_clk_src.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_regmap_div_ro_ops,
+       },
+};
+
+static struct clk_branch disp_cc_mdss_ahb_clk = {
+       .halt_reg = 0x1050,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1050,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_mdss_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &disp_cc_mdss_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_byte0_clk = {
+       .halt_reg = 0x1030,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1030,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_mdss_byte0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &disp_cc_mdss_byte0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_byte0_intf_clk = {
+       .halt_reg = 0x1034,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1034,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_mdss_byte0_intf_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &disp_cc_mdss_byte0_div_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_dp_aux_clk = {
+       .halt_reg = 0x104c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x104c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_mdss_dp_aux_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &disp_cc_mdss_dp_aux_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_dp_crypto_clk = {
+       .halt_reg = 0x1044,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1044,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_mdss_dp_crypto_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &disp_cc_mdss_dp_crypto_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_dp_link_clk = {
+       .halt_reg = 0x103c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x103c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_mdss_dp_link_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &disp_cc_mdss_dp_link_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_dp_link_intf_clk = {
+       .halt_reg = 0x1040,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_mdss_dp_link_intf_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &disp_cc_mdss_dp_link_div_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_dp_pixel_clk = {
+       .halt_reg = 0x1048,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1048,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_mdss_dp_pixel_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &disp_cc_mdss_dp_pixel_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_edp_aux_clk = {
+       .halt_reg = 0x1060,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1060,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_mdss_edp_aux_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &disp_cc_mdss_edp_aux_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_edp_link_clk = {
+       .halt_reg = 0x1058,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1058,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_mdss_edp_link_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &disp_cc_mdss_edp_link_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_edp_link_intf_clk = {
+       .halt_reg = 0x105c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x105c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_mdss_edp_link_intf_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &disp_cc_mdss_edp_link_div_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_edp_pixel_clk = {
+       .halt_reg = 0x1054,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1054,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_mdss_edp_pixel_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &disp_cc_mdss_edp_pixel_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_esc0_clk = {
+       .halt_reg = 0x1038,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1038,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_mdss_esc0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &disp_cc_mdss_esc0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_mdp_clk = {
+       .halt_reg = 0x1014,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_mdss_mdp_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &disp_cc_mdss_mdp_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_mdp_lut_clk = {
+       .halt_reg = 0x1024,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x1024,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_mdss_mdp_lut_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &disp_cc_mdss_mdp_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_non_gdsc_ahb_clk = {
+       .halt_reg = 0x2004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x2004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_mdss_non_gdsc_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &disp_cc_mdss_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_pclk0_clk = {
+       .halt_reg = 0x1010,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1010,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_mdss_pclk0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &disp_cc_mdss_pclk0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_rot_clk = {
+       .halt_reg = 0x101c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x101c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_mdss_rot_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &disp_cc_mdss_rot_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_rscc_ahb_clk = {
+       .halt_reg = 0x200c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x200c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_mdss_rscc_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &disp_cc_mdss_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_rscc_vsync_clk = {
+       .halt_reg = 0x2008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_mdss_rscc_vsync_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &disp_cc_mdss_vsync_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_vsync_clk = {
+       .halt_reg = 0x102c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x102c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_mdss_vsync_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &disp_cc_mdss_vsync_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_sleep_clk = {
+       .halt_reg = 0x5004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_sleep_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct gdsc disp_cc_mdss_core_gdsc = {
+       .gdscr = 0x1004,
+       .pd = {
+               .name = "disp_cc_mdss_core_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = HW_CTRL | RETAIN_FF_ENABLE,
+};
+
+static struct clk_regmap *disp_cc_sc7280_clocks[] = {
+       [DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr,
+       [DISP_CC_MDSS_AHB_CLK_SRC] = &disp_cc_mdss_ahb_clk_src.clkr,
+       [DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr,
+       [DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr,
+       [DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] = &disp_cc_mdss_byte0_div_clk_src.clkr,
+       [DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr,
+       [DISP_CC_MDSS_DP_AUX_CLK] = &disp_cc_mdss_dp_aux_clk.clkr,
+       [DISP_CC_MDSS_DP_AUX_CLK_SRC] = &disp_cc_mdss_dp_aux_clk_src.clkr,
+       [DISP_CC_MDSS_DP_CRYPTO_CLK] = &disp_cc_mdss_dp_crypto_clk.clkr,
+       [DISP_CC_MDSS_DP_CRYPTO_CLK_SRC] = &disp_cc_mdss_dp_crypto_clk_src.clkr,
+       [DISP_CC_MDSS_DP_LINK_CLK] = &disp_cc_mdss_dp_link_clk.clkr,
+       [DISP_CC_MDSS_DP_LINK_CLK_SRC] = &disp_cc_mdss_dp_link_clk_src.clkr,
+       [DISP_CC_MDSS_DP_LINK_DIV_CLK_SRC] =
+               &disp_cc_mdss_dp_link_div_clk_src.clkr,
+       [DISP_CC_MDSS_DP_LINK_INTF_CLK] = &disp_cc_mdss_dp_link_intf_clk.clkr,
+       [DISP_CC_MDSS_DP_PIXEL_CLK] = &disp_cc_mdss_dp_pixel_clk.clkr,
+       [DISP_CC_MDSS_DP_PIXEL_CLK_SRC] = &disp_cc_mdss_dp_pixel_clk_src.clkr,
+       [DISP_CC_MDSS_EDP_AUX_CLK] = &disp_cc_mdss_edp_aux_clk.clkr,
+       [DISP_CC_MDSS_EDP_AUX_CLK_SRC] = &disp_cc_mdss_edp_aux_clk_src.clkr,
+       [DISP_CC_MDSS_EDP_LINK_CLK] = &disp_cc_mdss_edp_link_clk.clkr,
+       [DISP_CC_MDSS_EDP_LINK_CLK_SRC] = &disp_cc_mdss_edp_link_clk_src.clkr,
+       [DISP_CC_MDSS_EDP_LINK_DIV_CLK_SRC] =
+               &disp_cc_mdss_edp_link_div_clk_src.clkr,
+       [DISP_CC_MDSS_EDP_LINK_INTF_CLK] = &disp_cc_mdss_edp_link_intf_clk.clkr,
+       [DISP_CC_MDSS_EDP_PIXEL_CLK] = &disp_cc_mdss_edp_pixel_clk.clkr,
+       [DISP_CC_MDSS_EDP_PIXEL_CLK_SRC] = &disp_cc_mdss_edp_pixel_clk_src.clkr,
+       [DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr,
+       [DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr,
+       [DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr,
+       [DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr,
+       [DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr,
+       [DISP_CC_MDSS_NON_GDSC_AHB_CLK] = &disp_cc_mdss_non_gdsc_ahb_clk.clkr,
+       [DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr,
+       [DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr,
+       [DISP_CC_MDSS_ROT_CLK] = &disp_cc_mdss_rot_clk.clkr,
+       [DISP_CC_MDSS_ROT_CLK_SRC] = &disp_cc_mdss_rot_clk_src.clkr,
+       [DISP_CC_MDSS_RSCC_AHB_CLK] = &disp_cc_mdss_rscc_ahb_clk.clkr,
+       [DISP_CC_MDSS_RSCC_VSYNC_CLK] = &disp_cc_mdss_rscc_vsync_clk.clkr,
+       [DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr,
+       [DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr,
+       [DISP_CC_PLL0] = &disp_cc_pll0.clkr,
+       [DISP_CC_SLEEP_CLK] = &disp_cc_sleep_clk.clkr,
+};
+
+static struct gdsc *disp_cc_sc7280_gdscs[] = {
+       [DISP_CC_MDSS_CORE_GDSC] = &disp_cc_mdss_core_gdsc,
+};
+
+static const struct regmap_config disp_cc_sc7280_regmap_config = {
+       .reg_bits = 32,
+       .reg_stride = 4,
+       .val_bits = 32,
+       .max_register = 0x10000,
+       .fast_io = true,
+};
+
+static const struct qcom_cc_desc disp_cc_sc7280_desc = {
+       .config = &disp_cc_sc7280_regmap_config,
+       .clks = disp_cc_sc7280_clocks,
+       .num_clks = ARRAY_SIZE(disp_cc_sc7280_clocks),
+       .gdscs = disp_cc_sc7280_gdscs,
+       .num_gdscs = ARRAY_SIZE(disp_cc_sc7280_gdscs),
+};
+
+static const struct of_device_id disp_cc_sc7280_match_table[] = {
+       { .compatible = "qcom,sc7280-dispcc" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, disp_cc_sc7280_match_table);
+
+static int disp_cc_sc7280_probe(struct platform_device *pdev)
+{
+       struct regmap *regmap;
+
+       regmap = qcom_cc_map(pdev, &disp_cc_sc7280_desc);
+       if (IS_ERR(regmap))
+               return PTR_ERR(regmap);
+
+       clk_lucid_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config);
+
+       /*
+        * Keep the clocks always-ON
+        * DISP_CC_XO_CLK
+        */
+       regmap_update_bits(regmap, 0x5008, BIT(0), BIT(0));
+
+       return qcom_cc_really_probe(pdev, &disp_cc_sc7280_desc, regmap);
+}
+
+static struct platform_driver disp_cc_sc7280_driver = {
+       .probe = disp_cc_sc7280_probe,
+       .driver = {
+               .name = "disp_cc-sc7280",
+               .of_match_table = disp_cc_sc7280_match_table,
+       },
+};
+
+static int __init disp_cc_sc7280_init(void)
+{
+       return platform_driver_register(&disp_cc_sc7280_driver);
+}
+subsys_initcall(disp_cc_sc7280_init);
+
+static void __exit disp_cc_sc7280_exit(void)
+{
+       platform_driver_unregister(&disp_cc_sc7280_driver);
+}
+module_exit(disp_cc_sc7280_exit);
+
+MODULE_DESCRIPTION("QTI DISP_CC sc7280 Driver");
+MODULE_LICENSE("GPL v2");
index 601c7c0..bf9ffe1 100644 (file)
@@ -26,6 +26,10 @@ enum {
        P_DISP_CC_PLL1_OUT_MAIN,
        P_DP_PHY_PLL_LINK_CLK,
        P_DP_PHY_PLL_VCO_DIV_CLK,
+       P_DPTX1_PHY_PLL_LINK_CLK,
+       P_DPTX1_PHY_PLL_VCO_DIV_CLK,
+       P_DPTX2_PHY_PLL_LINK_CLK,
+       P_DPTX2_PHY_PLL_VCO_DIV_CLK,
        P_EDP_PHY_PLL_LINK_CLK,
        P_EDP_PHY_PLL_VCO_DIV_CLK,
        P_DSI0_PHY_PLL_OUT_BYTECLK,
@@ -98,12 +102,20 @@ static const struct parent_map disp_cc_parent_map_0[] = {
        { P_BI_TCXO, 0 },
        { P_DP_PHY_PLL_LINK_CLK, 1 },
        { P_DP_PHY_PLL_VCO_DIV_CLK, 2 },
+       { P_DPTX1_PHY_PLL_LINK_CLK, 3 },
+       { P_DPTX1_PHY_PLL_VCO_DIV_CLK, 4 },
+       { P_DPTX2_PHY_PLL_LINK_CLK, 5 },
+       { P_DPTX2_PHY_PLL_VCO_DIV_CLK, 6 },
 };
 
 static const struct clk_parent_data disp_cc_parent_data_0[] = {
        { .fw_name = "bi_tcxo" },
        { .fw_name = "dp_phy_pll_link_clk" },
        { .fw_name = "dp_phy_pll_vco_div_clk" },
+       { .fw_name = "dptx1_phy_pll_link_clk" },
+       { .fw_name = "dptx1_phy_pll_vco_div_clk" },
+       { .fw_name = "dptx2_phy_pll_link_clk" },
+       { .fw_name = "dptx2_phy_pll_vco_div_clk" },
 };
 
 static const struct parent_map disp_cc_parent_map_1[] = {
@@ -269,20 +281,11 @@ static struct clk_rcg2 disp_cc_mdss_dp_aux_clk_src = {
        },
 };
 
-static const struct freq_tbl ftbl_disp_cc_mdss_dp_link1_clk_src[] = {
-       F(162000000, P_DP_PHY_PLL_LINK_CLK, 1, 0, 0),
-       F(270000000, P_DP_PHY_PLL_LINK_CLK, 1, 0, 0),
-       F(540000000, P_DP_PHY_PLL_LINK_CLK, 1, 0, 0),
-       F(810000000, P_DP_PHY_PLL_LINK_CLK, 1, 0, 0),
-       { }
-};
-
 static struct clk_rcg2 disp_cc_mdss_dp_link1_clk_src = {
        .cmd_rcgr = 0x220c,
        .mnd_width = 0,
        .hid_width = 5,
        .parent_map = disp_cc_parent_map_0,
-       .freq_tbl = ftbl_disp_cc_mdss_dp_link1_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "disp_cc_mdss_dp_link1_clk_src",
                .parent_data = disp_cc_parent_data_0,
@@ -296,7 +299,6 @@ static struct clk_rcg2 disp_cc_mdss_dp_link_clk_src = {
        .mnd_width = 0,
        .hid_width = 5,
        .parent_map = disp_cc_parent_map_0,
-       .freq_tbl = ftbl_disp_cc_mdss_dp_link1_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "disp_cc_mdss_dp_link_clk_src",
                .parent_data = disp_cc_parent_data_0,
diff --git a/drivers/clk/qcom/gcc-msm8953.c b/drivers/clk/qcom/gcc-msm8953.c
new file mode 100644 (file)
index 0000000..49513f1
--- /dev/null
@@ -0,0 +1,4250 @@
+// SPDX-License-Identifier: GPL-2.0-only
+// Copyright (c) 2021, The Linux Foundation. All rights reserved.
+
+#include <linux/kernel.h>
+#include <linux/bitops.h>
+#include <linux/err.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/clk-provider.h>
+#include <linux/regmap.h>
+#include <linux/reset-controller.h>
+
+#include <dt-bindings/clock/qcom,gcc-msm8953.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_XO,
+       P_SLEEP_CLK,
+       P_GPLL0,
+       P_GPLL0_DIV2,
+       P_GPLL2,
+       P_GPLL3,
+       P_GPLL4,
+       P_GPLL6,
+       P_GPLL6_DIV2,
+       P_DSI0PLL,
+       P_DSI0PLL_BYTE,
+       P_DSI1PLL,
+       P_DSI1PLL_BYTE,
+};
+
+static struct clk_alpha_pll gpll0_early = {
+       .offset = 0x21000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .enable_reg = 0x45000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gpll0_early",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .fw_name = "xo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_fixed_ops,
+               },
+       },
+};
+
+static struct clk_fixed_factor gpll0_early_div = {
+       .mult = 1,
+       .div = 2,
+       .hw.init = &(struct clk_init_data){
+               .name = "gpll0_early_div",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll0_early.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_fixed_factor_ops,
+       },
+};
+
+static struct clk_alpha_pll_postdiv gpll0 = {
+       .offset = 0x21000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll0",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll0_early.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_ro_ops,
+       },
+};
+
+static struct clk_alpha_pll gpll2_early = {
+       .offset = 0x4a000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .enable_reg = 0x45000,
+               .enable_mask = BIT(2),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll2_early",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .fw_name = "xo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_fixed_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll_postdiv gpll2 = {
+       .offset = 0x4a000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll2",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll2_early.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_ro_ops,
+       },
+};
+
+static const struct pll_vco gpll3_p_vco[] = {
+       { 1000000000, 2000000000, 0 },
+};
+
+static const struct alpha_pll_config gpll3_early_config = {
+       .l = 63,
+       .config_ctl_val = 0x4001055b,
+       .early_output_mask = 0,
+       .post_div_mask = GENMASK(11, 8),
+       .post_div_val = BIT(8),
+};
+
+static struct clk_alpha_pll gpll3_early = {
+       .offset = 0x22000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .vco_table = gpll3_p_vco,
+       .num_vco = ARRAY_SIZE(gpll3_p_vco),
+       .flags = SUPPORTS_DYNAMIC_UPDATE,
+       .clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll3_early",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .fw_name = "xo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll_postdiv gpll3 = {
+       .offset = 0x22000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll3",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll3_early.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
+static struct clk_alpha_pll gpll4_early = {
+       .offset = 0x24000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .enable_reg = 0x45000,
+               .enable_mask = BIT(5),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll4_early",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .fw_name = "xo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_fixed_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll_postdiv gpll4 = {
+       .offset = 0x24000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll4",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll4_early.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_ro_ops,
+       },
+};
+
+static struct clk_alpha_pll gpll6_early = {
+       .offset = 0x37000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .enable_reg = 0x45000,
+               .enable_mask = BIT(7),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll6_early",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .fw_name = "xo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_fixed_ops,
+               },
+       },
+};
+
+static struct clk_fixed_factor gpll6_early_div = {
+       .mult = 1,
+       .div = 2,
+       .hw.init = &(struct clk_init_data){
+               .name = "gpll6_early_div",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll6_early.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_fixed_factor_ops,
+       },
+};
+
+static struct clk_alpha_pll_postdiv gpll6 = {
+       .offset = 0x37000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll6",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll6_early.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_ro_ops,
+       },
+};
+
+static const struct parent_map gcc_xo_gpll0_gpll0div2_2_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL0_DIV2, 2 },
+};
+
+static const struct parent_map gcc_xo_gpll0_gpll0div2_4_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL0_DIV2, 4 },
+};
+
+static const struct clk_parent_data gcc_xo_gpll0_gpll0div2_data[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_early_div.hw },
+};
+
+static const struct parent_map gcc_apc_droop_detector_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL4, 2 },
+};
+
+static const struct clk_parent_data gcc_apc_droop_detector_data[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll4.clkr.hw },
+};
+
+static const struct freq_tbl ftbl_apc_droop_detector_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(400000000, P_GPLL0, 2, 0, 0),
+       F(576000000, P_GPLL4, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 apc0_droop_detector_clk_src = {
+       .cmd_rcgr = 0x78008,
+       .hid_width = 5,
+       .freq_tbl = ftbl_apc_droop_detector_clk_src,
+       .parent_map = gcc_apc_droop_detector_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "apc0_droop_detector_clk_src",
+               .parent_data = gcc_apc_droop_detector_data,
+               .num_parents = ARRAY_SIZE(gcc_apc_droop_detector_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+static struct clk_rcg2 apc1_droop_detector_clk_src = {
+       .cmd_rcgr = 0x79008,
+       .hid_width = 5,
+       .freq_tbl = ftbl_apc_droop_detector_clk_src,
+       .parent_map = gcc_apc_droop_detector_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "apc1_droop_detector_clk_src",
+               .parent_data = gcc_apc_droop_detector_data,
+               .num_parents = ARRAY_SIZE(gcc_apc_droop_detector_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct freq_tbl ftbl_apss_ahb_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(25000000, P_GPLL0_DIV2, 16, 0, 0),
+       F(50000000, P_GPLL0, 16, 0, 0),
+       F(100000000, P_GPLL0, 8, 0, 0),
+       F(133330000, P_GPLL0, 6, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 apss_ahb_clk_src = {
+       .cmd_rcgr = 0x46000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_apss_ahb_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_4_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "apss_ahb_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct freq_tbl ftbl_blsp_i2c_apps_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(25000000, P_GPLL0_DIV2, 16, 0, 0),
+       F(50000000, P_GPLL0, 16, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 blsp1_qup1_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x0200c,
+       .hid_width = 5,
+       .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup1_i2c_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 blsp1_qup2_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x03000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup2_i2c_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 blsp1_qup3_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x04000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup3_i2c_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 blsp1_qup4_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x05000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup4_i2c_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 blsp2_qup1_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x0c00c,
+       .hid_width = 5,
+       .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp2_qup1_i2c_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 blsp2_qup2_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x0d000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp2_qup2_i2c_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 blsp2_qup3_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x0f000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp2_qup3_i2c_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 blsp2_qup4_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x18000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp2_qup4_i2c_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct freq_tbl ftbl_blsp_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(12500000, P_GPLL0_DIV2, 16, 1, 2),
+       F(16000000, P_GPLL0, 10, 1, 5),
+       F(19200000, P_XO, 1, 0, 0),
+       F(25000000, P_GPLL0, 16, 1, 2),
+       F(50000000, P_GPLL0, 16, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 blsp1_qup1_spi_apps_clk_src = {
+       .cmd_rcgr = 0x02024,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_blsp_spi_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup1_spi_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 blsp1_qup2_spi_apps_clk_src = {
+       .cmd_rcgr = 0x03014,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_blsp_spi_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup2_spi_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 blsp1_qup3_spi_apps_clk_src = {
+       .cmd_rcgr = 0x04024,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_blsp_spi_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup3_spi_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 blsp1_qup4_spi_apps_clk_src = {
+       .cmd_rcgr = 0x05024,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_blsp_spi_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup4_spi_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 blsp2_qup1_spi_apps_clk_src = {
+       .cmd_rcgr = 0x0c024,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_blsp_spi_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp2_qup1_spi_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 blsp2_qup2_spi_apps_clk_src = {
+       .cmd_rcgr = 0x0d014,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_blsp_spi_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp2_qup2_spi_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 blsp2_qup3_spi_apps_clk_src = {
+       .cmd_rcgr = 0x0f024,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_blsp_spi_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp2_qup3_spi_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 blsp2_qup4_spi_apps_clk_src = {
+       .cmd_rcgr = 0x18024,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_blsp_spi_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp2_qup4_spi_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct freq_tbl ftbl_blsp_uart_apps_clk_src[] = {
+       F(3686400, P_GPLL0_DIV2, 1, 144, 15625),
+       F(7372800, P_GPLL0_DIV2, 1, 288, 15625),
+       F(14745600, P_GPLL0_DIV2, 1, 576, 15625),
+       F(16000000, P_GPLL0_DIV2, 5, 1, 5),
+       F(19200000, P_XO, 1, 0, 0),
+       F(24000000, P_GPLL0, 1, 3, 100),
+       F(25000000, P_GPLL0, 16, 1, 2),
+       F(32000000, P_GPLL0, 1, 1, 25),
+       F(40000000, P_GPLL0, 1, 1, 20),
+       F(46400000, P_GPLL0, 1, 29, 500),
+       F(48000000, P_GPLL0, 1, 3, 50),
+       F(51200000, P_GPLL0, 1, 8, 125),
+       F(56000000, P_GPLL0, 1, 7, 100),
+       F(58982400, P_GPLL0, 1, 1152, 15625),
+       F(60000000, P_GPLL0, 1, 3, 40),
+       F(64000000, P_GPLL0, 1, 2, 25),
+       { }
+};
+
+static struct clk_rcg2 blsp1_uart1_apps_clk_src = {
+       .cmd_rcgr = 0x02044,
+       .hid_width = 5,
+       .mnd_width = 16,
+       .freq_tbl = ftbl_blsp_uart_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_4_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_uart1_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 blsp1_uart2_apps_clk_src = {
+       .cmd_rcgr = 0x03034,
+       .hid_width = 5,
+       .mnd_width = 16,
+       .freq_tbl = ftbl_blsp_uart_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_4_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_uart2_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 blsp2_uart1_apps_clk_src = {
+       .cmd_rcgr = 0x0c044,
+       .hid_width = 5,
+       .mnd_width = 16,
+       .freq_tbl = ftbl_blsp_uart_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_4_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp2_uart1_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 blsp2_uart2_apps_clk_src = {
+       .cmd_rcgr = 0x0d034,
+       .hid_width = 5,
+       .mnd_width = 16,
+       .freq_tbl = ftbl_blsp_uart_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_4_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp2_uart2_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct parent_map gcc_byte0_map[] = {
+       { P_XO, 0 },
+       { P_DSI0PLL_BYTE, 1 },
+       { P_DSI1PLL_BYTE, 3 },
+};
+
+static const struct parent_map gcc_byte1_map[] = {
+       { P_XO, 0 },
+       { P_DSI0PLL_BYTE, 3 },
+       { P_DSI1PLL_BYTE, 1 },
+};
+
+static const struct clk_parent_data gcc_byte_data[] = {
+       { .fw_name = "xo" },
+       { .fw_name = "dsi0pllbyte", .name = "dsi0pllbyte" },
+       { .fw_name = "dsi1pllbyte", .name = "dsi1pllbyte" },
+};
+
+static struct clk_rcg2 byte0_clk_src = {
+       .cmd_rcgr = 0x4d044,
+       .hid_width = 5,
+       .parent_map = gcc_byte0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "byte0_clk_src",
+               .parent_data = gcc_byte_data,
+               .num_parents = ARRAY_SIZE(gcc_byte_data),
+               .ops = &clk_byte2_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       }
+};
+
+static struct clk_rcg2 byte1_clk_src = {
+       .cmd_rcgr = 0x4d0b0,
+       .hid_width = 5,
+       .parent_map = gcc_byte1_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "byte1_clk_src",
+               .parent_data = gcc_byte_data,
+               .num_parents = ARRAY_SIZE(gcc_byte_data),
+               .ops = &clk_byte2_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       }
+};
+
+static const struct parent_map gcc_gp_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL6, 2 },
+       { P_GPLL0_DIV2, 4 },
+       { P_SLEEP_CLK, 6 },
+};
+
+static const struct clk_parent_data gcc_gp_data[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll6.clkr.hw },
+       { .hw = &gpll0_early_div.hw },
+       { .fw_name = "sleep", .name = "sleep" },
+};
+
+static const struct freq_tbl ftbl_camss_gp_clk_src[] = {
+       F(50000000, P_GPLL0_DIV2, 8, 0, 0),
+       F(100000000, P_GPLL0, 8, 0, 0),
+       F(200000000, P_GPLL0, 4, 0, 0),
+       F(266670000, P_GPLL0, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 camss_gp0_clk_src = {
+       .cmd_rcgr = 0x54000,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_camss_gp_clk_src,
+       .parent_map = gcc_gp_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "camss_gp0_clk_src",
+               .parent_data = gcc_gp_data,
+               .num_parents = ARRAY_SIZE(gcc_gp_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 camss_gp1_clk_src = {
+       .cmd_rcgr = 0x55000,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_camss_gp_clk_src,
+       .parent_map = gcc_gp_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "camss_gp1_clk_src",
+               .parent_data = gcc_gp_data,
+               .num_parents = ARRAY_SIZE(gcc_gp_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct freq_tbl ftbl_camss_top_ahb_clk_src[] = {
+       F(40000000, P_GPLL0_DIV2, 10, 0, 0),
+       F(80000000, P_GPLL0, 10, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 camss_top_ahb_clk_src = {
+       .cmd_rcgr = 0x5a000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_camss_top_ahb_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "camss_top_ahb_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct parent_map gcc_cci_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 2 },
+       { P_GPLL0_DIV2, 3 },
+       { P_SLEEP_CLK, 6 },
+};
+
+static const struct clk_parent_data gcc_cci_data[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_early_div.hw },
+       { .fw_name = "sleep", .name = "sleep" },
+};
+
+static const struct freq_tbl ftbl_cci_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(37500000, P_GPLL0_DIV2, 1, 3, 32),
+       { }
+};
+
+static struct clk_rcg2 cci_clk_src = {
+       .cmd_rcgr = 0x51000,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_cci_clk_src,
+       .parent_map = gcc_cci_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "cci_clk_src",
+               .parent_data = gcc_cci_data,
+               .num_parents = ARRAY_SIZE(gcc_cci_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct parent_map gcc_cpp_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL6, 3 },
+       { P_GPLL2, 4 },
+       { P_GPLL0_DIV2, 5 },
+};
+
+static const struct clk_parent_data gcc_cpp_data[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll6.clkr.hw },
+       { .hw = &gpll2.clkr.hw },
+       { .hw = &gpll0_early_div.hw },
+};
+
+static const struct freq_tbl ftbl_cpp_clk_src[] = {
+       F(100000000, P_GPLL0_DIV2, 4, 0, 0),
+       F(200000000, P_GPLL0, 4, 0, 0),
+       F(266670000, P_GPLL0, 3, 0, 0),
+       F(320000000, P_GPLL0, 2.5, 0, 0),
+       F(400000000, P_GPLL0, 2, 0, 0),
+       F(465000000, P_GPLL2, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cpp_clk_src = {
+       .cmd_rcgr = 0x58018,
+       .hid_width = 5,
+       .freq_tbl = ftbl_cpp_clk_src,
+       .parent_map = gcc_cpp_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "cpp_clk_src",
+               .parent_data = gcc_cpp_data,
+               .num_parents = ARRAY_SIZE(gcc_cpp_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct freq_tbl ftbl_crypto_clk_src[] = {
+       F(40000000, P_GPLL0_DIV2, 10, 0, 0),
+       F(80000000, P_GPLL0, 10, 0, 0),
+       F(100000000, P_GPLL0, 8, 0, 0),
+       F(160000000, P_GPLL0, 5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 crypto_clk_src = {
+       .cmd_rcgr = 0x16004,
+       .hid_width = 5,
+       .freq_tbl = ftbl_crypto_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_4_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "crypto_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct parent_map gcc_csi0_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL2, 4 },
+       { P_GPLL0_DIV2, 5 },
+};
+
+static const struct parent_map gcc_csi12_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL2, 5 },
+       { P_GPLL0_DIV2, 4 },
+};
+
+static const struct clk_parent_data gcc_csi_data[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll2.clkr.hw },
+       { .hw = &gpll0_early_div.hw },
+};
+
+static const struct freq_tbl ftbl_csi_clk_src[] = {
+       F(100000000, P_GPLL0_DIV2, 4, 0, 0),
+       F(200000000, P_GPLL0, 4, 0, 0),
+       F(310000000, P_GPLL2, 3, 0, 0),
+       F(400000000, P_GPLL0, 2, 0, 0),
+       F(465000000, P_GPLL2, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 csi0_clk_src = {
+       .cmd_rcgr = 0x4e020,
+       .hid_width = 5,
+       .freq_tbl = ftbl_csi_clk_src,
+       .parent_map = gcc_csi0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "csi0_clk_src",
+               .parent_data = gcc_csi_data,
+               .num_parents = ARRAY_SIZE(gcc_csi_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 csi1_clk_src = {
+       .cmd_rcgr = 0x4f020,
+       .hid_width = 5,
+       .freq_tbl = ftbl_csi_clk_src,
+       .parent_map = gcc_csi12_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "csi1_clk_src",
+               .parent_data = gcc_csi_data,
+               .num_parents = ARRAY_SIZE(gcc_csi_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 csi2_clk_src = {
+       .cmd_rcgr = 0x3c020,
+       .hid_width = 5,
+       .freq_tbl = ftbl_csi_clk_src,
+       .parent_map = gcc_csi12_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "csi2_clk_src",
+               .parent_data = gcc_csi_data,
+               .num_parents = ARRAY_SIZE(gcc_csi_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct parent_map gcc_csip_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL4, 3 },
+       { P_GPLL2, 4 },
+       { P_GPLL0_DIV2, 5 },
+};
+
+static const struct clk_parent_data gcc_csip_data[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll4.clkr.hw },
+       { .hw = &gpll2.clkr.hw },
+       { .hw = &gpll0_early_div.hw },
+};
+
+static const struct freq_tbl ftbl_csi_p_clk_src[] = {
+       F(66670000, P_GPLL0_DIV2, 6, 0, 0),
+       F(133330000, P_GPLL0, 6, 0, 0),
+       F(200000000, P_GPLL0, 4, 0, 0),
+       F(266670000, P_GPLL0, 3, 0, 0),
+       F(310000000, P_GPLL2, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 csi0p_clk_src = {
+       .cmd_rcgr = 0x58084,
+       .hid_width = 5,
+       .freq_tbl = ftbl_csi_p_clk_src,
+       .parent_map = gcc_csip_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "csi0p_clk_src",
+               .parent_data = gcc_csip_data,
+               .num_parents = ARRAY_SIZE(gcc_csip_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 csi1p_clk_src = {
+       .cmd_rcgr = 0x58094,
+       .hid_width = 5,
+       .freq_tbl = ftbl_csi_p_clk_src,
+       .parent_map = gcc_csip_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "csi1p_clk_src",
+               .parent_data = gcc_csip_data,
+               .num_parents = ARRAY_SIZE(gcc_csip_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 csi2p_clk_src = {
+       .cmd_rcgr = 0x580a4,
+       .hid_width = 5,
+       .freq_tbl = ftbl_csi_p_clk_src,
+       .parent_map = gcc_csip_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "csi2p_clk_src",
+               .parent_data = gcc_csip_data,
+               .num_parents = ARRAY_SIZE(gcc_csip_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct freq_tbl ftbl_csi_phytimer_clk_src[] = {
+       F(100000000, P_GPLL0_DIV2, 4, 0, 0),
+       F(200000000, P_GPLL0, 4, 0, 0),
+       F(266670000, P_GPLL0, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 csi0phytimer_clk_src = {
+       .cmd_rcgr = 0x4e000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_csi_phytimer_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "csi0phytimer_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 csi1phytimer_clk_src = {
+       .cmd_rcgr = 0x4f000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_csi_phytimer_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "csi1phytimer_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 csi2phytimer_clk_src = {
+       .cmd_rcgr = 0x4f05c,
+       .hid_width = 5,
+       .freq_tbl = ftbl_csi_phytimer_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "csi2phytimer_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct parent_map gcc_esc_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 3 },
+};
+
+static const struct clk_parent_data gcc_esc_vsync_data[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0.clkr.hw },
+};
+
+static const struct freq_tbl ftbl_esc0_1_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 esc0_clk_src = {
+       .cmd_rcgr = 0x4d05c,
+       .hid_width = 5,
+       .freq_tbl = ftbl_esc0_1_clk_src,
+       .parent_map = gcc_esc_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "esc0_clk_src",
+               .parent_data = gcc_esc_vsync_data,
+               .num_parents = ARRAY_SIZE(gcc_esc_vsync_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 esc1_clk_src = {
+       .cmd_rcgr = 0x4d0a8,
+       .hid_width = 5,
+       .freq_tbl = ftbl_esc0_1_clk_src,
+       .parent_map = gcc_esc_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "esc1_clk_src",
+               .parent_data = gcc_esc_vsync_data,
+               .num_parents = ARRAY_SIZE(gcc_esc_vsync_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct parent_map gcc_gfx3d_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL3, 2 },
+       { P_GPLL6, 3 },
+       { P_GPLL4, 4 },
+       { P_GPLL0_DIV2, 5 },
+       { P_GPLL6_DIV2, 6 },
+};
+
+static const struct clk_parent_data gcc_gfx3d_data[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll3.clkr.hw },
+       { .hw = &gpll6.clkr.hw },
+       { .hw = &gpll4.clkr.hw },
+       { .hw = &gpll0_early_div.hw },
+       { .hw = &gpll6_early_div.hw },
+};
+
+static const struct freq_tbl ftbl_gfx3d_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(50000000, P_GPLL0_DIV2, 8, 0, 0),
+       F(80000000, P_GPLL0_DIV2, 5, 0, 0),
+       F(100000000, P_GPLL0_DIV2, 4, 0, 0),
+       F(133330000, P_GPLL0_DIV2, 3, 0, 0),
+       F(160000000, P_GPLL0_DIV2, 2.5, 0, 0),
+       F(200000000, P_GPLL0_DIV2, 2, 0, 0),
+       F(266670000, P_GPLL0, 3.0, 0, 0),
+       F(320000000, P_GPLL0, 2.5, 0, 0),
+       F(400000000, P_GPLL0, 2, 0, 0),
+       F(460800000, P_GPLL4, 2.5, 0, 0),
+       F(510000000, P_GPLL3, 2, 0, 0),
+       F(560000000, P_GPLL3, 2, 0, 0),
+       F(600000000, P_GPLL3, 2, 0, 0),
+       F(650000000, P_GPLL3, 2, 0, 0),
+       F(685000000, P_GPLL3, 2, 0, 0),
+       F(725000000, P_GPLL3, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gfx3d_clk_src = {
+       .cmd_rcgr = 0x59000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_gfx3d_clk_src,
+       .parent_map = gcc_gfx3d_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gfx3d_clk_src",
+               .parent_data = gcc_gfx3d_data,
+               .num_parents = ARRAY_SIZE(gcc_gfx3d_data),
+               .ops = &clk_rcg2_floor_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       }
+};
+
+static const struct freq_tbl ftbl_gp_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gp1_clk_src = {
+       .cmd_rcgr = 0x08004,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_gp_clk_src,
+       .parent_map = gcc_gp_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gp1_clk_src",
+               .parent_data = gcc_gp_data,
+               .num_parents = ARRAY_SIZE(gcc_gp_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 gp2_clk_src = {
+       .cmd_rcgr = 0x09004,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_gp_clk_src,
+       .parent_map = gcc_gp_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gp2_clk_src",
+               .parent_data = gcc_gp_data,
+               .num_parents = ARRAY_SIZE(gcc_gp_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 gp3_clk_src = {
+       .cmd_rcgr = 0x0a004,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_gp_clk_src,
+       .parent_map = gcc_gp_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gp3_clk_src",
+               .parent_data = gcc_gp_data,
+               .num_parents = ARRAY_SIZE(gcc_gp_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct parent_map gcc_jpeg0_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL6, 2 },
+       { P_GPLL0_DIV2, 4 },
+       { P_GPLL2, 5 },
+};
+
+static const struct clk_parent_data gcc_jpeg0_data[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll6.clkr.hw },
+       { .hw = &gpll0_early_div.hw },
+       { .hw = &gpll2.clkr.hw },
+};
+
+static const struct freq_tbl ftbl_jpeg0_clk_src[] = {
+       F(66670000, P_GPLL0_DIV2, 6, 0, 0),
+       F(133330000, P_GPLL0, 6, 0, 0),
+       F(200000000, P_GPLL0, 4, 0, 0),
+       F(266670000, P_GPLL0, 3, 0, 0),
+       F(310000000, P_GPLL2, 3, 0, 0),
+       F(320000000, P_GPLL0, 2.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 jpeg0_clk_src = {
+       .cmd_rcgr = 0x57000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_jpeg0_clk_src,
+       .parent_map = gcc_jpeg0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "jpeg0_clk_src",
+               .parent_data = gcc_jpeg0_data,
+               .num_parents = ARRAY_SIZE(gcc_jpeg0_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct parent_map gcc_mclk_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL6, 2 },
+       { P_GPLL0_DIV2, 4 },
+       { P_GPLL6_DIV2, 5 },
+       { P_SLEEP_CLK, 6 },
+};
+
+static const struct clk_parent_data gcc_mclk_data[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll6.clkr.hw },
+       { .hw = &gpll0_early_div.hw },
+       { .hw = &gpll6_early_div.hw },
+       { .fw_name = "sleep", .name = "sleep" },
+};
+
+static const struct freq_tbl ftbl_mclk_clk_src[] = {
+       F(19200000, P_GPLL6, 5, 4, 45),
+       F(24000000, P_GPLL6_DIV2, 1, 2, 45),
+       F(26000000, P_GPLL0, 1, 4, 123),
+       F(33330000, P_GPLL0_DIV2, 12, 0, 0),
+       F(36610000, P_GPLL6, 1, 2, 59),
+       F(66667000, P_GPLL0, 12, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 mclk0_clk_src = {
+       .cmd_rcgr = 0x52000,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_mclk_clk_src,
+       .parent_map = gcc_mclk_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "mclk0_clk_src",
+               .parent_data = gcc_mclk_data,
+               .num_parents = ARRAY_SIZE(gcc_mclk_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 mclk1_clk_src = {
+       .cmd_rcgr = 0x53000,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_mclk_clk_src,
+       .parent_map = gcc_mclk_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "mclk1_clk_src",
+               .parent_data = gcc_mclk_data,
+               .num_parents = ARRAY_SIZE(gcc_mclk_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 mclk2_clk_src = {
+       .cmd_rcgr = 0x5c000,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_mclk_clk_src,
+       .parent_map = gcc_mclk_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "mclk2_clk_src",
+               .parent_data = gcc_mclk_data,
+               .num_parents = ARRAY_SIZE(gcc_mclk_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 mclk3_clk_src = {
+       .cmd_rcgr = 0x5e000,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_mclk_clk_src,
+       .parent_map = gcc_mclk_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "mclk3_clk_src",
+               .parent_data = gcc_mclk_data,
+               .num_parents = ARRAY_SIZE(gcc_mclk_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct parent_map gcc_mdp_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL6, 3 },
+       { P_GPLL0_DIV2, 4 },
+};
+
+static const struct clk_parent_data gcc_mdp_data[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll6.clkr.hw },
+       { .hw = &gpll0_early_div.hw },
+};
+
+static const struct freq_tbl ftbl_mdp_clk_src[] = {
+       F(50000000, P_GPLL0_DIV2, 8, 0, 0),
+       F(80000000, P_GPLL0_DIV2, 5, 0, 0),
+       F(160000000, P_GPLL0_DIV2, 2.5, 0, 0),
+       F(200000000, P_GPLL0, 4, 0, 0),
+       F(266670000, P_GPLL0, 3, 0, 0),
+       F(320000000, P_GPLL0, 2.5, 0, 0),
+       F(400000000, P_GPLL0, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 mdp_clk_src = {
+       .cmd_rcgr = 0x4d014,
+       .hid_width = 5,
+       .freq_tbl = ftbl_mdp_clk_src,
+       .parent_map = gcc_mdp_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "mdp_clk_src",
+               .parent_data = gcc_mdp_data,
+               .num_parents = ARRAY_SIZE(gcc_mdp_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct parent_map gcc_pclk0_map[] = {
+       { P_XO, 0 },
+       { P_DSI0PLL, 1 },
+       { P_DSI1PLL, 3 },
+};
+
+static const struct parent_map gcc_pclk1_map[] = {
+       { P_XO, 0 },
+       { P_DSI0PLL, 3 },
+       { P_DSI1PLL, 1 },
+};
+
+static const struct clk_parent_data gcc_pclk_data[] = {
+       { .fw_name = "xo" },
+       { .fw_name = "dsi0pll", .name = "dsi0pll" },
+       { .fw_name = "dsi1pll", .name = "dsi1pll" },
+};
+
+static struct clk_rcg2 pclk0_clk_src = {
+       .cmd_rcgr = 0x4d000,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .parent_map = gcc_pclk0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "pclk0_clk_src",
+               .parent_data = gcc_pclk_data,
+               .num_parents = ARRAY_SIZE(gcc_pclk_data),
+               .ops = &clk_pixel_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       }
+};
+
+static struct clk_rcg2 pclk1_clk_src = {
+       .cmd_rcgr = 0x4d0b8,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .parent_map = gcc_pclk1_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "pclk1_clk_src",
+               .parent_data = gcc_pclk_data,
+               .num_parents = ARRAY_SIZE(gcc_pclk_data),
+               .ops = &clk_pixel_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       }
+};
+
+static const struct freq_tbl ftbl_pdm2_clk_src[] = {
+       F(32000000, P_GPLL0_DIV2, 12.5, 0, 0),
+       F(64000000, P_GPLL0, 12.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 pdm2_clk_src = {
+       .cmd_rcgr = 0x44010,
+       .hid_width = 5,
+       .freq_tbl = ftbl_pdm2_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "pdm2_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct freq_tbl ftbl_rbcpr_gfx_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(50000000, P_GPLL0, 16, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 rbcpr_gfx_clk_src = {
+       .cmd_rcgr = 0x3a00c,
+       .hid_width = 5,
+       .freq_tbl = ftbl_rbcpr_gfx_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_4_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "rbcpr_gfx_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct parent_map gcc_sdcc1_ice_core_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL6, 2 },
+       { P_GPLL0_DIV2, 4 },
+};
+
+static const struct clk_parent_data gcc_sdcc1_ice_core_data[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll6.clkr.hw },
+       { .hw = &gpll0_early_div.hw },
+};
+
+static const struct freq_tbl ftbl_sdcc1_ice_core_clk_src[] = {
+       F(80000000, P_GPLL0_DIV2, 5, 0, 0),
+       F(160000000, P_GPLL0, 5, 0, 0),
+       F(270000000, P_GPLL6, 4, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 sdcc1_ice_core_clk_src = {
+       .cmd_rcgr = 0x5d000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_sdcc1_ice_core_clk_src,
+       .parent_map = gcc_sdcc1_ice_core_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "sdcc1_ice_core_clk_src",
+               .parent_data = gcc_sdcc1_ice_core_data,
+               .num_parents = ARRAY_SIZE(gcc_sdcc1_ice_core_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct parent_map gcc_sdcc_apps_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL4, 2 },
+       { P_GPLL0_DIV2, 4 },
+};
+
+static const struct clk_parent_data gcc_sdcc_apss_data[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll4.clkr.hw },
+       { .hw = &gpll0_early_div.hw },
+};
+
+static const struct freq_tbl ftbl_sdcc1_apps_clk_src[] = {
+       F(144000, P_XO, 16, 3, 25),
+       F(400000, P_XO, 12, 1, 4),
+       F(20000000, P_GPLL0_DIV2, 5, 1, 4),
+       F(25000000, P_GPLL0_DIV2, 16, 0, 0),
+       F(50000000, P_GPLL0, 16, 0, 0),
+       F(100000000, P_GPLL0, 8, 0, 0),
+       F(177770000, P_GPLL0, 4.5, 0, 0),
+       F(192000000, P_GPLL4, 6, 0, 0),
+       F(384000000, P_GPLL4, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 sdcc1_apps_clk_src = {
+       .cmd_rcgr = 0x42004,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_sdcc1_apps_clk_src,
+       .parent_map = gcc_sdcc_apps_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "sdcc1_apps_clk_src",
+               .parent_data = gcc_sdcc_apss_data,
+               .num_parents = ARRAY_SIZE(gcc_sdcc_apss_data),
+               .ops = &clk_rcg2_floor_ops,
+       }
+};
+
+static const struct freq_tbl ftbl_sdcc2_apps_clk_src[] = {
+       F(144000, P_XO, 16, 3, 25),
+       F(400000, P_XO, 12, 1, 4),
+       F(20000000, P_GPLL0_DIV2, 5, 1, 4),
+       F(25000000, P_GPLL0_DIV2, 16, 0, 0),
+       F(50000000, P_GPLL0, 16, 0, 0),
+       F(100000000, P_GPLL0, 8, 0, 0),
+       F(177770000, P_GPLL0, 4.5, 0, 0),
+       F(192000000, P_GPLL4, 6, 0, 0),
+       F(200000000, P_GPLL0, 4, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 sdcc2_apps_clk_src = {
+       .cmd_rcgr = 0x43004,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_sdcc2_apps_clk_src,
+       .parent_map = gcc_sdcc_apps_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "sdcc2_apps_clk_src",
+               .parent_data = gcc_sdcc_apss_data,
+               .num_parents = ARRAY_SIZE(gcc_sdcc_apss_data),
+               .ops = &clk_rcg2_floor_ops,
+       }
+};
+
+static const struct freq_tbl ftbl_usb30_master_clk_src[] = {
+       F(80000000, P_GPLL0_DIV2, 5, 0, 0),
+       F(100000000, P_GPLL0, 8, 0, 0),
+       F(133330000, P_GPLL0, 6, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 usb30_master_clk_src = {
+       .cmd_rcgr = 0x3f00c,
+       .hid_width = 5,
+       .freq_tbl = ftbl_usb30_master_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll0div2_2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "usb30_master_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0div2_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0div2_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct parent_map gcc_usb30_mock_utmi_map[] = {
+       { P_XO, 0 },
+       { P_GPLL6, 1 },
+       { P_GPLL6_DIV2, 2 },
+       { P_GPLL0, 3 },
+       { P_GPLL0_DIV2, 4 },
+};
+
+static const struct clk_parent_data gcc_usb30_mock_utmi_data[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll6.clkr.hw },
+       { .hw = &gpll6_early_div.hw },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_early_div.hw },
+};
+
+static const struct freq_tbl ftbl_usb30_mock_utmi_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(60000000, P_GPLL6_DIV2, 9, 1, 1),
+       { }
+};
+
+static struct clk_rcg2 usb30_mock_utmi_clk_src = {
+       .cmd_rcgr = 0x3f020,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_usb30_mock_utmi_clk_src,
+       .parent_map = gcc_usb30_mock_utmi_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "usb30_mock_utmi_clk_src",
+               .parent_data = gcc_usb30_mock_utmi_data,
+               .num_parents = ARRAY_SIZE(gcc_usb30_mock_utmi_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct parent_map gcc_usb3_aux_map[] = {
+       { P_XO, 0 },
+       { P_SLEEP_CLK, 6 },
+};
+
+static const struct clk_parent_data gcc_usb3_aux_data[] = {
+       { .fw_name = "xo" },
+       { .fw_name = "sleep", .name = "sleep" },
+};
+
+static const struct freq_tbl ftbl_usb3_aux_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 usb3_aux_clk_src = {
+       .cmd_rcgr = 0x3f05c,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_usb3_aux_clk_src,
+       .parent_map = gcc_usb3_aux_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "usb3_aux_clk_src",
+               .parent_data = gcc_usb3_aux_data,
+               .num_parents = ARRAY_SIZE(gcc_usb3_aux_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct parent_map gcc_vcodec0_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL6, 2 },
+       { P_GPLL2, 3 },
+       { P_GPLL0_DIV2, 4 },
+};
+
+static const struct clk_parent_data gcc_vcodec0_data[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll6.clkr.hw },
+       { .hw = &gpll2.clkr.hw },
+       { .hw = &gpll0_early_div.hw },
+};
+
+static const struct freq_tbl ftbl_vcodec0_clk_src[] = {
+       F(114290000, P_GPLL0_DIV2, 3.5, 0, 0),
+       F(228570000, P_GPLL0, 3.5, 0, 0),
+       F(310000000, P_GPLL2, 3, 0, 0),
+       F(360000000, P_GPLL6, 3, 0, 0),
+       F(400000000, P_GPLL0, 2, 0, 0),
+       F(465000000, P_GPLL2, 2, 0, 0),
+       F(540000000, P_GPLL6, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 vcodec0_clk_src = {
+       .cmd_rcgr = 0x4c000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_vcodec0_clk_src,
+       .parent_map = gcc_vcodec0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "vcodec0_clk_src",
+               .parent_data = gcc_vcodec0_data,
+               .num_parents = ARRAY_SIZE(gcc_vcodec0_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct parent_map gcc_vfe_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL6, 2 },
+       { P_GPLL4, 3 },
+       { P_GPLL2, 4 },
+       { P_GPLL0_DIV2, 5 },
+};
+
+static const struct clk_parent_data gcc_vfe_data[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll6.clkr.hw },
+       { .hw = &gpll4.clkr.hw },
+       { .hw = &gpll2.clkr.hw },
+       { .hw = &gpll0_early_div.hw },
+};
+
+static const struct freq_tbl ftbl_vfe_clk_src[] = {
+       F(50000000, P_GPLL0_DIV2, 8, 0, 0),
+       F(100000000, P_GPLL0_DIV2, 4, 0, 0),
+       F(133330000, P_GPLL0, 6, 0, 0),
+       F(160000000, P_GPLL0, 5, 0, 0),
+       F(200000000, P_GPLL0, 4, 0, 0),
+       F(266670000, P_GPLL0, 3, 0, 0),
+       F(310000000, P_GPLL2, 3, 0, 0),
+       F(400000000, P_GPLL0, 2, 0, 0),
+       F(465000000, P_GPLL2, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 vfe0_clk_src = {
+       .cmd_rcgr = 0x58000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_vfe_clk_src,
+       .parent_map = gcc_vfe_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "vfe0_clk_src",
+               .parent_data = gcc_vfe_data,
+               .num_parents = ARRAY_SIZE(gcc_vfe_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 vfe1_clk_src = {
+       .cmd_rcgr = 0x58054,
+       .hid_width = 5,
+       .freq_tbl = ftbl_vfe_clk_src,
+       .parent_map = gcc_vfe_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "vfe1_clk_src",
+               .parent_data = gcc_vfe_data,
+               .num_parents = ARRAY_SIZE(gcc_vfe_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct parent_map gcc_vsync_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 2 },
+};
+
+static const struct freq_tbl ftbl_vsync_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 vsync_clk_src = {
+       .cmd_rcgr = 0x4d02c,
+       .hid_width = 5,
+       .freq_tbl = ftbl_vsync_clk_src,
+       .parent_map = gcc_vsync_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "vsync_clk_src",
+               .parent_data = gcc_esc_vsync_data,
+               .num_parents = ARRAY_SIZE(gcc_esc_vsync_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_branch gcc_apc0_droop_detector_gpll0_clk = {
+       .halt_reg = 0x78004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x78004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_apc0_droop_detector_gpll0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &apc0_droop_detector_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_apc1_droop_detector_gpll0_clk = {
+       .halt_reg = 0x79004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x79004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_apc1_droop_detector_gpll0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &apc1_droop_detector_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_apss_ahb_clk = {
+       .halt_reg = 0x4601c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(14),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_apss_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &apss_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_apss_axi_clk = {
+       .halt_reg = 0x46020,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(13),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_apss_axi_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_apss_tcu_async_clk = {
+       .halt_reg = 0x12018,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x4500c,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_apss_tcu_async_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_bimc_gfx_clk = {
+       .halt_reg = 0x59034,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x59034,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_bimc_gfx_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_bimc_gpu_clk = {
+       .halt_reg = 0x59030,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x59030,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_bimc_gpu_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp1_ahb_clk = {
+       .halt_reg = 0x01008,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(10),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp2_ahb_clk = {
+       .halt_reg = 0x0b008,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(20),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp2_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp1_qup1_i2c_apps_clk = {
+       .halt_reg = 0x02008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x02008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_qup1_i2c_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup1_i2c_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp1_qup2_i2c_apps_clk = {
+       .halt_reg = 0x03010,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x03010,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_qup2_i2c_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup2_i2c_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp1_qup3_i2c_apps_clk = {
+       .halt_reg = 0x04020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x04020,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_qup3_i2c_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup3_i2c_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp1_qup4_i2c_apps_clk = {
+       .halt_reg = 0x05020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x05020,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_qup4_i2c_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup4_i2c_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp2_qup1_i2c_apps_clk = {
+       .halt_reg = 0x0c008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0c008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp2_qup1_i2c_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup1_i2c_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp2_qup2_i2c_apps_clk = {
+       .halt_reg = 0x0d010,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0d010,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp2_qup2_i2c_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup2_i2c_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp2_qup3_i2c_apps_clk = {
+       .halt_reg = 0x0f020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0f020,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp2_qup3_i2c_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup3_i2c_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp2_qup4_i2c_apps_clk = {
+       .halt_reg = 0x18020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x18020,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp2_qup4_i2c_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup4_i2c_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp1_qup1_spi_apps_clk = {
+       .halt_reg = 0x02004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x02004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_qup1_spi_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup1_spi_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp1_qup2_spi_apps_clk = {
+       .halt_reg = 0x0300c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0300c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_qup2_spi_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup2_spi_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp1_qup3_spi_apps_clk = {
+       .halt_reg = 0x0401c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0401c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_qup3_spi_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup3_spi_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp1_qup4_spi_apps_clk = {
+       .halt_reg = 0x0501c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0501c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_qup4_spi_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup4_spi_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp2_qup1_spi_apps_clk = {
+       .halt_reg = 0x0c004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0c004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp2_qup1_spi_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup1_spi_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp2_qup2_spi_apps_clk = {
+       .halt_reg = 0x0d00c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0d00c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp2_qup2_spi_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup2_spi_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp2_qup3_spi_apps_clk = {
+       .halt_reg = 0x0f01c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0f01c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp2_qup3_spi_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup3_spi_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp2_qup4_spi_apps_clk = {
+       .halt_reg = 0x1801c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1801c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp2_qup4_spi_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup4_spi_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp1_uart1_apps_clk = {
+       .halt_reg = 0x0203c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0203c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_uart1_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_uart1_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp1_uart2_apps_clk = {
+       .halt_reg = 0x0302c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0302c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_uart2_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_uart2_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp2_uart1_apps_clk = {
+       .halt_reg = 0x0c03c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0c03c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp2_uart1_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_uart1_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp2_uart2_apps_clk = {
+       .halt_reg = 0x0d02c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0d02c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp2_uart2_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_uart2_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_boot_rom_ahb_clk = {
+       .halt_reg = 0x1300c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(7),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_boot_rom_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_ahb_clk = {
+       .halt_reg = 0x56004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x56004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_cci_ahb_clk = {
+       .halt_reg = 0x5101c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5101c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_cci_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_top_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_cci_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_cci_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &cci_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_cpp_ahb_clk = {
+       .halt_reg = 0x58040,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x58040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_cpp_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_top_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_cpp_axi_clk = {
+       .halt_reg = 0x58064,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x58064,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_cpp_axi_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_cpp_clk = {
+       .halt_reg = 0x5803c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5803c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_cpp_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &cpp_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi0_ahb_clk = {
+       .halt_reg = 0x4e040,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4e040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi0_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_top_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi1_ahb_clk = {
+       .halt_reg = 0x4f040,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4f040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi1_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_top_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi2_ahb_clk = {
+       .halt_reg = 0x3c040,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3c040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi2_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_top_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi0_clk = {
+       .halt_reg = 0x4e03c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4e03c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi1_clk = {
+       .halt_reg = 0x4f03c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4f03c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi1_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi2_clk = {
+       .halt_reg = 0x3c03c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3c03c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi2_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi2_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi0_csiphy_3p_clk = {
+       .halt_reg = 0x58090,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x58090,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi0_csiphy_3p_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi0p_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi1_csiphy_3p_clk = {
+       .halt_reg = 0x580a0,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x580a0,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi1_csiphy_3p_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi1p_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi2_csiphy_3p_clk = {
+       .halt_reg = 0x580b0,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x580b0,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi2_csiphy_3p_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi2p_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi0phy_clk = {
+       .halt_reg = 0x4e048,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4e048,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi0phy_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi1phy_clk = {
+       .halt_reg = 0x4f048,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4f048,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi1phy_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi2phy_clk = {
+       .halt_reg = 0x3c048,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3c048,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi2phy_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi2_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi0phytimer_clk = {
+       .halt_reg = 0x4e01c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4e01c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi0phytimer_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi0phytimer_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi1phytimer_clk = {
+       .halt_reg = 0x4f01c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4f01c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi1phytimer_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi1phytimer_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi2phytimer_clk = {
+       .halt_reg = 0x4f068,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4f068,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi2phytimer_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi2phytimer_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi0pix_clk = {
+       .halt_reg = 0x4e058,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4e058,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi0pix_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi1pix_clk = {
+       .halt_reg = 0x4f058,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4f058,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi1pix_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi2pix_clk = {
+       .halt_reg = 0x3c058,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3c058,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi2pix_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi2_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi0rdi_clk = {
+       .halt_reg = 0x4e050,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4e050,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi0rdi_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi1rdi_clk = {
+       .halt_reg = 0x4f050,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4f050,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi1rdi_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi2rdi_clk = {
+       .halt_reg = 0x3c050,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3c050,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi2rdi_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi2_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi_vfe0_clk = {
+       .halt_reg = 0x58050,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x58050,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi_vfe0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vfe0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi_vfe1_clk = {
+       .halt_reg = 0x58074,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x58074,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi_vfe1_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vfe1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_gp0_clk = {
+       .halt_reg = 0x54018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x54018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_gp0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_gp0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_gp1_clk = {
+       .halt_reg = 0x55018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x55018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_gp1_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_gp1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_ispif_ahb_clk = {
+       .halt_reg = 0x50004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x50004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_ispif_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_top_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_jpeg0_clk = {
+       .halt_reg = 0x57020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x57020,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_jpeg0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &jpeg0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_jpeg_ahb_clk = {
+       .halt_reg = 0x57024,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x57024,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_jpeg_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_top_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_jpeg_axi_clk = {
+       .halt_reg = 0x57028,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x57028,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_jpeg_axi_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_mclk0_clk = {
+       .halt_reg = 0x52018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x52018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_mclk0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &mclk0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_mclk1_clk = {
+       .halt_reg = 0x53018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x53018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_mclk1_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &mclk1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_mclk2_clk = {
+       .halt_reg = 0x5c018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5c018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_mclk2_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &mclk2_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_mclk3_clk = {
+       .halt_reg = 0x5e018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5e018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_mclk3_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &mclk3_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_micro_ahb_clk = {
+       .halt_reg = 0x5600c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5600c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_micro_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_top_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_top_ahb_clk = {
+       .halt_reg = 0x5a014,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5a014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_top_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_top_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_vfe0_ahb_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_vfe0_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_top_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_vfe0_axi_clk = {
+       .halt_reg = 0x58048,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x58048,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_vfe0_axi_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_vfe0_clk = {
+       .halt_reg = 0x58038,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x58038,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_vfe0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vfe0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_vfe1_ahb_clk = {
+       .halt_reg = 0x58060,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x58060,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_vfe1_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_top_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_vfe1_axi_clk = {
+       .halt_reg = 0x58068,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x58068,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_vfe1_axi_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_vfe1_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_vfe1_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vfe1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_cpp_tbu_clk = {
+       .halt_reg = 0x12040,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x4500c,
+               .enable_mask = BIT(14),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_cpp_tbu_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_crypto_ahb_clk = {
+       .halt_reg = 0x16024,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_crypto_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_crypto_axi_clk = {
+       .halt_reg = 0x16020,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_crypto_axi_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_crypto_clk = {
+       .halt_reg = 0x1601c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(2),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_crypto_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &crypto_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_dcc_clk = {
+       .halt_reg = 0x77004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x77004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_dcc_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_gp1_clk = {
+       .halt_reg = 0x08000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x08000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_gp1_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gp1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_gp2_clk = {
+       .halt_reg = 0x09000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x09000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_gp2_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gp2_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_gp3_clk = {
+       .halt_reg = 0x0a000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0a000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_gp3_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gp3_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_jpeg_tbu_clk = {
+       .halt_reg = 0x12034,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x4500c,
+               .enable_mask = BIT(10),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_jpeg_tbu_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_mdp_tbu_clk = {
+       .halt_reg = 0x1201c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x4500c,
+               .enable_mask = BIT(4),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_mdp_tbu_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_mdss_ahb_clk = {
+       .halt_reg = 0x4d07c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d07c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_mdss_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_mdss_axi_clk = {
+       .halt_reg = 0x4d080,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d080,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_mdss_axi_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_mdss_byte0_clk = {
+       .halt_reg = 0x4d094,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d094,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_mdss_byte0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &byte0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_mdss_byte1_clk = {
+       .halt_reg = 0x4d0a0,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d0a0,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_mdss_byte1_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &byte1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_mdss_esc0_clk = {
+       .halt_reg = 0x4d098,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d098,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_mdss_esc0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &esc0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_mdss_esc1_clk = {
+       .halt_reg = 0x4d09c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d09c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_mdss_esc1_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &esc1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_mdss_mdp_clk = {
+       .halt_reg = 0x4d088,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d088,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_mdss_mdp_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &mdp_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_mdss_pclk0_clk = {
+       .halt_reg = 0x4d084,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d084,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_mdss_pclk0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pclk0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_mdss_pclk1_clk = {
+       .halt_reg = 0x4d0a4,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d0a4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_mdss_pclk1_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pclk1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_mdss_vsync_clk = {
+       .halt_reg = 0x4d090,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d090,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_mdss_vsync_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vsync_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_mss_cfg_ahb_clk = {
+       .halt_reg = 0x49000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x49000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_mss_cfg_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_mss_q6_bimc_axi_clk = {
+       .halt_reg = 0x49004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x49004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_mss_q6_bimc_axi_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_oxili_ahb_clk = {
+       .halt_reg = 0x59028,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x59028,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_oxili_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_oxili_aon_clk = {
+       .halt_reg = 0x59044,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x59044,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_oxili_aon_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gfx3d_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_oxili_gfx3d_clk = {
+       .halt_reg = 0x59020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x59020,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_oxili_gfx3d_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gfx3d_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_oxili_timer_clk = {
+       .halt_reg = 0x59040,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x59040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_oxili_timer_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_pcnoc_usb3_axi_clk = {
+       .halt_reg = 0x3f038,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3f038,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcnoc_usb3_axi_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb30_master_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_pdm2_clk = {
+       .halt_reg = 0x4400c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4400c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pdm2_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pdm2_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_pdm_ahb_clk = {
+       .halt_reg = 0x44004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x44004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pdm_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_prng_ahb_clk = {
+       .halt_reg = 0x13004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(8),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_prng_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_qdss_dap_clk = {
+       .halt_reg = 0x29084,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(11),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_qdss_dap_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_qusb_ref_clk = {
+       .halt_reg = 0,
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x41030,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_qusb_ref_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_rbcpr_gfx_clk = {
+       .halt_reg = 0x3a004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3a004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_rbcpr_gfx_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &rbcpr_gfx_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_sdcc1_ice_core_clk = {
+       .halt_reg = 0x5d014,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5d014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_sdcc1_ice_core_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &sdcc1_ice_core_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_sdcc1_ahb_clk = {
+       .halt_reg = 0x4201c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4201c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_sdcc1_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_sdcc2_ahb_clk = {
+       .halt_reg = 0x4301c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4301c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_sdcc2_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_sdcc1_apps_clk = {
+       .halt_reg = 0x42018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x42018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_sdcc1_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &sdcc1_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_sdcc2_apps_clk = {
+       .halt_reg = 0x43018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x43018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_sdcc2_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &sdcc2_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_smmu_cfg_clk = {
+       .halt_reg = 0x12038,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x4500c,
+               .enable_mask = BIT(12),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_smmu_cfg_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_usb30_master_clk = {
+       .halt_reg = 0x3f000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3f000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_usb30_master_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb30_master_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_usb30_mock_utmi_clk = {
+       .halt_reg = 0x3f008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3f008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_usb30_mock_utmi_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb30_mock_utmi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_usb30_sleep_clk = {
+       .halt_reg = 0x3f004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3f004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_usb30_sleep_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_usb3_aux_clk = {
+       .halt_reg = 0x3f044,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3f044,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_usb3_aux_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb3_aux_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_usb3_pipe_clk = {
+       .halt_reg = 0,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x3f040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_usb3_pipe_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_usb_phy_cfg_ahb_clk = {
+       .halt_reg = 0x3f080,
+       .halt_check = BRANCH_VOTED,
+       .clkr = {
+               .enable_reg = 0x3f080,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_usb_phy_cfg_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_usb_ss_ref_clk = {
+       .halt_reg = 0,
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x3f07c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_usb_ss_ref_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_venus0_ahb_clk = {
+       .halt_reg = 0x4c020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4c020,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_venus0_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_venus0_axi_clk = {
+       .halt_reg = 0x4c024,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4c024,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_venus0_axi_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_venus0_core0_vcodec0_clk = {
+       .halt_reg = 0x4c02c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4c02c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_venus0_core0_vcodec0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vcodec0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_venus0_vcodec0_clk = {
+       .halt_reg = 0x4c01c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4c01c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_venus0_vcodec0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vcodec0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_venus_tbu_clk = {
+       .halt_reg = 0x12014,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x4500c,
+               .enable_mask = BIT(5),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_venus_tbu_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_vfe1_tbu_clk = {
+       .halt_reg = 0x12090,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x4500c,
+               .enable_mask = BIT(17),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_vfe1_tbu_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_vfe_tbu_clk = {
+       .halt_reg = 0x1203c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x4500c,
+               .enable_mask = BIT(9),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_vfe_tbu_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct gdsc usb30_gdsc = {
+       .gdscr = 0x3f078,
+       .pd = {
+               .name = "usb30_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       /*
+        * FIXME: dwc3 usb gadget cannot resume after GDSC power off
+        * dwc3 7000000.dwc3: failed to enable ep0out
+        */
+       .flags = ALWAYS_ON,
+};
+
+static struct gdsc venus_gdsc = {
+       .gdscr = 0x4c018,
+       .cxcs = (unsigned int []){ 0x4c024, 0x4c01c },
+       .cxc_count = 2,
+       .pd = {
+               .name = "venus_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc venus_core0_gdsc = {
+       .gdscr = 0x4c028,
+       .cxcs = (unsigned int []){ 0x4c02c },
+       .cxc_count = 1,
+       .pd = {
+               .name = "venus_core0",
+       },
+       .flags = HW_CTRL,
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc mdss_gdsc = {
+       .gdscr = 0x4d078,
+       .cxcs = (unsigned int []){ 0x4d080, 0x4d088 },
+       .cxc_count = 2,
+       .pd = {
+               .name = "mdss_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc jpeg_gdsc = {
+       .gdscr = 0x5701c,
+       .cxcs = (unsigned int []){ 0x57020, 0x57028 },
+       .cxc_count = 2,
+       .pd = {
+               .name = "jpeg_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc vfe0_gdsc = {
+       .gdscr = 0x58034,
+       .cxcs = (unsigned int []){ 0x58038, 0x58048, 0x5600c, 0x58050 },
+       .cxc_count = 4,
+       .pd = {
+               .name = "vfe0_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc vfe1_gdsc = {
+       .gdscr = 0x5806c,
+       .cxcs = (unsigned int []){ 0x5805c, 0x58068, 0x5600c, 0x58074 },
+       .cxc_count = 4,
+       .pd = {
+               .name = "vfe1_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc oxili_gx_gdsc = {
+       .gdscr = 0x5901c,
+       .clamp_io_ctrl = 0x5b00c,
+       .cxcs = (unsigned int []){ 0x59000, 0x59024 },
+       .cxc_count = 2,
+       .pd = {
+               .name = "oxili_gx_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = CLAMP_IO,
+};
+
+static struct gdsc oxili_cx_gdsc = {
+       .gdscr = 0x5904c,
+       .cxcs = (unsigned int []){ 0x59020 },
+       .cxc_count = 1,
+       .pd = {
+               .name = "oxili_cx_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc cpp_gdsc = {
+       .gdscr = 0x58078,
+       .cxcs = (unsigned int []){ 0x5803c, 0x58064 },
+       .cxc_count = 2,
+       .pd = {
+               .name = "cpp_gdsc",
+       },
+       .flags = ALWAYS_ON,
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct clk_hw *gcc_msm8953_hws[] = {
+       &gpll0_early_div.hw,
+       &gpll6_early_div.hw,
+};
+
+static struct clk_regmap *gcc_msm8953_clocks[] = {
+       [GPLL0] = &gpll0.clkr,
+       [GPLL0_EARLY] = &gpll0_early.clkr,
+       [GPLL2] = &gpll2.clkr,
+       [GPLL2_EARLY] = &gpll2_early.clkr,
+       [GPLL3] = &gpll3.clkr,
+       [GPLL3_EARLY] = &gpll3_early.clkr,
+       [GPLL4] = &gpll4.clkr,
+       [GPLL4_EARLY] = &gpll4_early.clkr,
+       [GPLL6] = &gpll6.clkr,
+       [GPLL6_EARLY] = &gpll6_early.clkr,
+       [GCC_APSS_AHB_CLK] = &gcc_apss_ahb_clk.clkr,
+       [GCC_APSS_AXI_CLK] = &gcc_apss_axi_clk.clkr,
+       [GCC_BLSP1_AHB_CLK] = &gcc_blsp1_ahb_clk.clkr,
+       [GCC_BLSP2_AHB_CLK] = &gcc_blsp2_ahb_clk.clkr,
+       [GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr,
+       [GCC_CRYPTO_AHB_CLK] = &gcc_crypto_ahb_clk.clkr,
+       [GCC_CRYPTO_AXI_CLK] = &gcc_crypto_axi_clk.clkr,
+       [GCC_CRYPTO_CLK] = &gcc_crypto_clk.clkr,
+       [GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr,
+       [GCC_QDSS_DAP_CLK] = &gcc_qdss_dap_clk.clkr,
+       [GCC_APSS_TCU_ASYNC_CLK] = &gcc_apss_tcu_async_clk.clkr,
+       [GCC_CPP_TBU_CLK] = &gcc_cpp_tbu_clk.clkr,
+       [GCC_JPEG_TBU_CLK] = &gcc_jpeg_tbu_clk.clkr,
+       [GCC_MDP_TBU_CLK] = &gcc_mdp_tbu_clk.clkr,
+       [GCC_SMMU_CFG_CLK] = &gcc_smmu_cfg_clk.clkr,
+       [GCC_VENUS_TBU_CLK] = &gcc_venus_tbu_clk.clkr,
+       [GCC_VFE1_TBU_CLK] = &gcc_vfe1_tbu_clk.clkr,
+       [GCC_VFE_TBU_CLK] = &gcc_vfe_tbu_clk.clkr,
+       [CAMSS_TOP_AHB_CLK_SRC] = &camss_top_ahb_clk_src.clkr,
+       [CSI0_CLK_SRC] = &csi0_clk_src.clkr,
+       [APSS_AHB_CLK_SRC] = &apss_ahb_clk_src.clkr,
+       [CSI1_CLK_SRC] = &csi1_clk_src.clkr,
+       [CSI2_CLK_SRC] = &csi2_clk_src.clkr,
+       [VFE0_CLK_SRC] = &vfe0_clk_src.clkr,
+       [VCODEC0_CLK_SRC] = &vcodec0_clk_src.clkr,
+       [CPP_CLK_SRC] = &cpp_clk_src.clkr,
+       [JPEG0_CLK_SRC] = &jpeg0_clk_src.clkr,
+       [USB30_MASTER_CLK_SRC] = &usb30_master_clk_src.clkr,
+       [VFE1_CLK_SRC] = &vfe1_clk_src.clkr,
+       [APC0_DROOP_DETECTOR_CLK_SRC] = &apc0_droop_detector_clk_src.clkr,
+       [APC1_DROOP_DETECTOR_CLK_SRC] = &apc1_droop_detector_clk_src.clkr,
+       [BLSP1_QUP1_I2C_APPS_CLK_SRC] = &blsp1_qup1_i2c_apps_clk_src.clkr,
+       [BLSP1_QUP1_SPI_APPS_CLK_SRC] = &blsp1_qup1_spi_apps_clk_src.clkr,
+       [BLSP1_QUP2_I2C_APPS_CLK_SRC] = &blsp1_qup2_i2c_apps_clk_src.clkr,
+       [BLSP1_QUP2_SPI_APPS_CLK_SRC] = &blsp1_qup2_spi_apps_clk_src.clkr,
+       [BLSP1_QUP3_I2C_APPS_CLK_SRC] = &blsp1_qup3_i2c_apps_clk_src.clkr,
+       [BLSP1_QUP3_SPI_APPS_CLK_SRC] = &blsp1_qup3_spi_apps_clk_src.clkr,
+       [BLSP1_QUP4_I2C_APPS_CLK_SRC] = &blsp1_qup4_i2c_apps_clk_src.clkr,
+       [BLSP1_QUP4_SPI_APPS_CLK_SRC] = &blsp1_qup4_spi_apps_clk_src.clkr,
+       [BLSP1_UART1_APPS_CLK_SRC] = &blsp1_uart1_apps_clk_src.clkr,
+       [BLSP1_UART2_APPS_CLK_SRC] = &blsp1_uart2_apps_clk_src.clkr,
+       [BLSP2_QUP1_I2C_APPS_CLK_SRC] = &blsp2_qup1_i2c_apps_clk_src.clkr,
+       [BLSP2_QUP1_SPI_APPS_CLK_SRC] = &blsp2_qup1_spi_apps_clk_src.clkr,
+       [BLSP2_QUP2_I2C_APPS_CLK_SRC] = &blsp2_qup2_i2c_apps_clk_src.clkr,
+       [BLSP2_QUP2_SPI_APPS_CLK_SRC] = &blsp2_qup2_spi_apps_clk_src.clkr,
+       [BLSP2_QUP3_I2C_APPS_CLK_SRC] = &blsp2_qup3_i2c_apps_clk_src.clkr,
+       [BLSP2_QUP3_SPI_APPS_CLK_SRC] = &blsp2_qup3_spi_apps_clk_src.clkr,
+       [BLSP2_QUP4_I2C_APPS_CLK_SRC] = &blsp2_qup4_i2c_apps_clk_src.clkr,
+       [BLSP2_QUP4_SPI_APPS_CLK_SRC] = &blsp2_qup4_spi_apps_clk_src.clkr,
+       [BLSP2_UART1_APPS_CLK_SRC] = &blsp2_uart1_apps_clk_src.clkr,
+       [BLSP2_UART2_APPS_CLK_SRC] = &blsp2_uart2_apps_clk_src.clkr,
+       [CCI_CLK_SRC] = &cci_clk_src.clkr,
+       [CSI0P_CLK_SRC] = &csi0p_clk_src.clkr,
+       [CSI1P_CLK_SRC] = &csi1p_clk_src.clkr,
+       [CSI2P_CLK_SRC] = &csi2p_clk_src.clkr,
+       [CAMSS_GP0_CLK_SRC] = &camss_gp0_clk_src.clkr,
+       [CAMSS_GP1_CLK_SRC] = &camss_gp1_clk_src.clkr,
+       [MCLK0_CLK_SRC] = &mclk0_clk_src.clkr,
+       [MCLK1_CLK_SRC] = &mclk1_clk_src.clkr,
+       [MCLK2_CLK_SRC] = &mclk2_clk_src.clkr,
+       [MCLK3_CLK_SRC] = &mclk3_clk_src.clkr,
+       [CSI0PHYTIMER_CLK_SRC] = &csi0phytimer_clk_src.clkr,
+       [CSI1PHYTIMER_CLK_SRC] = &csi1phytimer_clk_src.clkr,
+       [CSI2PHYTIMER_CLK_SRC] = &csi2phytimer_clk_src.clkr,
+       [CRYPTO_CLK_SRC] = &crypto_clk_src.clkr,
+       [GP1_CLK_SRC] = &gp1_clk_src.clkr,
+       [GP2_CLK_SRC] = &gp2_clk_src.clkr,
+       [GP3_CLK_SRC] = &gp3_clk_src.clkr,
+       [PDM2_CLK_SRC] = &pdm2_clk_src.clkr,
+       [RBCPR_GFX_CLK_SRC] = &rbcpr_gfx_clk_src.clkr,
+       [SDCC1_APPS_CLK_SRC] = &sdcc1_apps_clk_src.clkr,
+       [SDCC1_ICE_CORE_CLK_SRC] = &sdcc1_ice_core_clk_src.clkr,
+       [SDCC2_APPS_CLK_SRC] = &sdcc2_apps_clk_src.clkr,
+       [USB30_MOCK_UTMI_CLK_SRC] = &usb30_mock_utmi_clk_src.clkr,
+       [USB3_AUX_CLK_SRC] = &usb3_aux_clk_src.clkr,
+       [GCC_APC0_DROOP_DETECTOR_GPLL0_CLK] = &gcc_apc0_droop_detector_gpll0_clk.clkr,
+       [GCC_APC1_DROOP_DETECTOR_GPLL0_CLK] = &gcc_apc1_droop_detector_gpll0_clk.clkr,
+       [GCC_BLSP1_QUP1_I2C_APPS_CLK] = &gcc_blsp1_qup1_i2c_apps_clk.clkr,
+       [GCC_BLSP1_QUP1_SPI_APPS_CLK] = &gcc_blsp1_qup1_spi_apps_clk.clkr,
+       [GCC_BLSP1_QUP2_I2C_APPS_CLK] = &gcc_blsp1_qup2_i2c_apps_clk.clkr,
+       [GCC_BLSP1_QUP2_SPI_APPS_CLK] = &gcc_blsp1_qup2_spi_apps_clk.clkr,
+       [GCC_BLSP1_QUP3_I2C_APPS_CLK] = &gcc_blsp1_qup3_i2c_apps_clk.clkr,
+       [GCC_BLSP1_QUP3_SPI_APPS_CLK] = &gcc_blsp1_qup3_spi_apps_clk.clkr,
+       [GCC_BLSP1_QUP4_I2C_APPS_CLK] = &gcc_blsp1_qup4_i2c_apps_clk.clkr,
+       [GCC_BLSP1_QUP4_SPI_APPS_CLK] = &gcc_blsp1_qup4_spi_apps_clk.clkr,
+       [GCC_BLSP1_UART1_APPS_CLK] = &gcc_blsp1_uart1_apps_clk.clkr,
+       [GCC_BLSP1_UART2_APPS_CLK] = &gcc_blsp1_uart2_apps_clk.clkr,
+       [GCC_BLSP2_QUP1_I2C_APPS_CLK] = &gcc_blsp2_qup1_i2c_apps_clk.clkr,
+       [GCC_BLSP2_QUP1_SPI_APPS_CLK] = &gcc_blsp2_qup1_spi_apps_clk.clkr,
+       [GCC_BLSP2_QUP2_I2C_APPS_CLK] = &gcc_blsp2_qup2_i2c_apps_clk.clkr,
+       [GCC_BLSP2_QUP2_SPI_APPS_CLK] = &gcc_blsp2_qup2_spi_apps_clk.clkr,
+       [GCC_BLSP2_QUP3_I2C_APPS_CLK] = &gcc_blsp2_qup3_i2c_apps_clk.clkr,
+       [GCC_BLSP2_QUP3_SPI_APPS_CLK] = &gcc_blsp2_qup3_spi_apps_clk.clkr,
+       [GCC_BLSP2_QUP4_I2C_APPS_CLK] = &gcc_blsp2_qup4_i2c_apps_clk.clkr,
+       [GCC_BLSP2_QUP4_SPI_APPS_CLK] = &gcc_blsp2_qup4_spi_apps_clk.clkr,
+       [GCC_BLSP2_UART1_APPS_CLK] = &gcc_blsp2_uart1_apps_clk.clkr,
+       [GCC_BLSP2_UART2_APPS_CLK] = &gcc_blsp2_uart2_apps_clk.clkr,
+       [GCC_CAMSS_CCI_AHB_CLK] = &gcc_camss_cci_ahb_clk.clkr,
+       [GCC_CAMSS_CCI_CLK] = &gcc_camss_cci_clk.clkr,
+       [GCC_CAMSS_CPP_AHB_CLK] = &gcc_camss_cpp_ahb_clk.clkr,
+       [GCC_CAMSS_CPP_AXI_CLK] = &gcc_camss_cpp_axi_clk.clkr,
+       [GCC_CAMSS_CPP_CLK] = &gcc_camss_cpp_clk.clkr,
+       [GCC_CAMSS_CSI0_AHB_CLK] = &gcc_camss_csi0_ahb_clk.clkr,
+       [GCC_CAMSS_CSI0_CLK] = &gcc_camss_csi0_clk.clkr,
+       [GCC_CAMSS_CSI0_CSIPHY_3P_CLK] = &gcc_camss_csi0_csiphy_3p_clk.clkr,
+       [GCC_CAMSS_CSI0PHY_CLK] = &gcc_camss_csi0phy_clk.clkr,
+       [GCC_CAMSS_CSI0PIX_CLK] = &gcc_camss_csi0pix_clk.clkr,
+       [GCC_CAMSS_CSI0RDI_CLK] = &gcc_camss_csi0rdi_clk.clkr,
+       [GCC_CAMSS_CSI1_AHB_CLK] = &gcc_camss_csi1_ahb_clk.clkr,
+       [GCC_CAMSS_CSI1_CLK] = &gcc_camss_csi1_clk.clkr,
+       [GCC_CAMSS_CSI1_CSIPHY_3P_CLK] = &gcc_camss_csi1_csiphy_3p_clk.clkr,
+       [GCC_CAMSS_CSI1PHY_CLK] = &gcc_camss_csi1phy_clk.clkr,
+       [GCC_CAMSS_CSI1PIX_CLK] = &gcc_camss_csi1pix_clk.clkr,
+       [GCC_CAMSS_CSI1RDI_CLK] = &gcc_camss_csi1rdi_clk.clkr,
+       [GCC_CAMSS_CSI2_AHB_CLK] = &gcc_camss_csi2_ahb_clk.clkr,
+       [GCC_CAMSS_CSI2_CLK] = &gcc_camss_csi2_clk.clkr,
+       [GCC_CAMSS_CSI2_CSIPHY_3P_CLK] = &gcc_camss_csi2_csiphy_3p_clk.clkr,
+       [GCC_CAMSS_CSI2PHY_CLK] = &gcc_camss_csi2phy_clk.clkr,
+       [GCC_CAMSS_CSI2PIX_CLK] = &gcc_camss_csi2pix_clk.clkr,
+       [GCC_CAMSS_CSI2RDI_CLK] = &gcc_camss_csi2rdi_clk.clkr,
+       [GCC_CAMSS_CSI_VFE0_CLK] = &gcc_camss_csi_vfe0_clk.clkr,
+       [GCC_CAMSS_CSI_VFE1_CLK] = &gcc_camss_csi_vfe1_clk.clkr,
+       [GCC_CAMSS_GP0_CLK] = &gcc_camss_gp0_clk.clkr,
+       [GCC_CAMSS_GP1_CLK] = &gcc_camss_gp1_clk.clkr,
+       [GCC_CAMSS_ISPIF_AHB_CLK] = &gcc_camss_ispif_ahb_clk.clkr,
+       [GCC_CAMSS_JPEG0_CLK] = &gcc_camss_jpeg0_clk.clkr,
+       [GCC_CAMSS_JPEG_AHB_CLK] = &gcc_camss_jpeg_ahb_clk.clkr,
+       [GCC_CAMSS_JPEG_AXI_CLK] = &gcc_camss_jpeg_axi_clk.clkr,
+       [GCC_CAMSS_MCLK0_CLK] = &gcc_camss_mclk0_clk.clkr,
+       [GCC_CAMSS_MCLK1_CLK] = &gcc_camss_mclk1_clk.clkr,
+       [GCC_CAMSS_MCLK2_CLK] = &gcc_camss_mclk2_clk.clkr,
+       [GCC_CAMSS_MCLK3_CLK] = &gcc_camss_mclk3_clk.clkr,
+       [GCC_CAMSS_MICRO_AHB_CLK] = &gcc_camss_micro_ahb_clk.clkr,
+       [GCC_CAMSS_CSI0PHYTIMER_CLK] = &gcc_camss_csi0phytimer_clk.clkr,
+       [GCC_CAMSS_CSI1PHYTIMER_CLK] = &gcc_camss_csi1phytimer_clk.clkr,
+       [GCC_CAMSS_CSI2PHYTIMER_CLK] = &gcc_camss_csi2phytimer_clk.clkr,
+       [GCC_CAMSS_AHB_CLK] = &gcc_camss_ahb_clk.clkr,
+       [GCC_CAMSS_TOP_AHB_CLK] = &gcc_camss_top_ahb_clk.clkr,
+       [GCC_CAMSS_VFE0_CLK] = &gcc_camss_vfe0_clk.clkr,
+       [GCC_CAMSS_VFE0_AHB_CLK] = &gcc_camss_vfe0_ahb_clk.clkr,
+       [GCC_CAMSS_VFE0_AXI_CLK] = &gcc_camss_vfe0_axi_clk.clkr,
+       [GCC_CAMSS_VFE1_AHB_CLK] = &gcc_camss_vfe1_ahb_clk.clkr,
+       [GCC_CAMSS_VFE1_AXI_CLK] = &gcc_camss_vfe1_axi_clk.clkr,
+       [GCC_CAMSS_VFE1_CLK] = &gcc_camss_vfe1_clk.clkr,
+       [GCC_DCC_CLK] = &gcc_dcc_clk.clkr,
+       [GCC_GP1_CLK] = &gcc_gp1_clk.clkr,
+       [GCC_GP2_CLK] = &gcc_gp2_clk.clkr,
+       [GCC_GP3_CLK] = &gcc_gp3_clk.clkr,
+       [GCC_MSS_CFG_AHB_CLK] = &gcc_mss_cfg_ahb_clk.clkr,
+       [GCC_MSS_Q6_BIMC_AXI_CLK] = &gcc_mss_q6_bimc_axi_clk.clkr,
+       [GCC_PCNOC_USB3_AXI_CLK] = &gcc_pcnoc_usb3_axi_clk.clkr,
+       [GCC_PDM2_CLK] = &gcc_pdm2_clk.clkr,
+       [GCC_PDM_AHB_CLK] = &gcc_pdm_ahb_clk.clkr,
+       [GCC_RBCPR_GFX_CLK] = &gcc_rbcpr_gfx_clk.clkr,
+       [GCC_SDCC1_AHB_CLK] = &gcc_sdcc1_ahb_clk.clkr,
+       [GCC_SDCC1_APPS_CLK] = &gcc_sdcc1_apps_clk.clkr,
+       [GCC_SDCC1_ICE_CORE_CLK] = &gcc_sdcc1_ice_core_clk.clkr,
+       [GCC_SDCC2_AHB_CLK] = &gcc_sdcc2_ahb_clk.clkr,
+       [GCC_SDCC2_APPS_CLK] = &gcc_sdcc2_apps_clk.clkr,
+       [GCC_USB30_MASTER_CLK] = &gcc_usb30_master_clk.clkr,
+       [GCC_USB30_MOCK_UTMI_CLK] = &gcc_usb30_mock_utmi_clk.clkr,
+       [GCC_USB30_SLEEP_CLK] = &gcc_usb30_sleep_clk.clkr,
+       [GCC_USB3_AUX_CLK] = &gcc_usb3_aux_clk.clkr,
+       [GCC_USB_PHY_CFG_AHB_CLK] = &gcc_usb_phy_cfg_ahb_clk.clkr,
+       [GCC_VENUS0_AHB_CLK] = &gcc_venus0_ahb_clk.clkr,
+       [GCC_VENUS0_AXI_CLK] = &gcc_venus0_axi_clk.clkr,
+       [GCC_VENUS0_CORE0_VCODEC0_CLK] = &gcc_venus0_core0_vcodec0_clk.clkr,
+       [GCC_VENUS0_VCODEC0_CLK] = &gcc_venus0_vcodec0_clk.clkr,
+       [GCC_QUSB_REF_CLK] = &gcc_qusb_ref_clk.clkr,
+       [GCC_USB_SS_REF_CLK] = &gcc_usb_ss_ref_clk.clkr,
+       [GCC_USB3_PIPE_CLK] = &gcc_usb3_pipe_clk.clkr,
+       [MDP_CLK_SRC] = &mdp_clk_src.clkr,
+       [PCLK0_CLK_SRC] = &pclk0_clk_src.clkr,
+       [BYTE0_CLK_SRC] = &byte0_clk_src.clkr,
+       [ESC0_CLK_SRC] = &esc0_clk_src.clkr,
+       [PCLK1_CLK_SRC] = &pclk1_clk_src.clkr,
+       [BYTE1_CLK_SRC] = &byte1_clk_src.clkr,
+       [ESC1_CLK_SRC] = &esc1_clk_src.clkr,
+       [VSYNC_CLK_SRC] = &vsync_clk_src.clkr,
+       [GCC_MDSS_AHB_CLK] = &gcc_mdss_ahb_clk.clkr,
+       [GCC_MDSS_AXI_CLK] = &gcc_mdss_axi_clk.clkr,
+       [GCC_MDSS_PCLK0_CLK] = &gcc_mdss_pclk0_clk.clkr,
+       [GCC_MDSS_BYTE0_CLK] = &gcc_mdss_byte0_clk.clkr,
+       [GCC_MDSS_ESC0_CLK] = &gcc_mdss_esc0_clk.clkr,
+       [GCC_MDSS_PCLK1_CLK] = &gcc_mdss_pclk1_clk.clkr,
+       [GCC_MDSS_BYTE1_CLK] = &gcc_mdss_byte1_clk.clkr,
+       [GCC_MDSS_ESC1_CLK] = &gcc_mdss_esc1_clk.clkr,
+       [GCC_MDSS_MDP_CLK] = &gcc_mdss_mdp_clk.clkr,
+       [GCC_MDSS_VSYNC_CLK] = &gcc_mdss_vsync_clk.clkr,
+       [GCC_OXILI_TIMER_CLK] = &gcc_oxili_timer_clk.clkr,
+       [GCC_OXILI_GFX3D_CLK] = &gcc_oxili_gfx3d_clk.clkr,
+       [GCC_OXILI_AON_CLK] = &gcc_oxili_aon_clk.clkr,
+       [GCC_OXILI_AHB_CLK] = &gcc_oxili_ahb_clk.clkr,
+       [GCC_BIMC_GFX_CLK] = &gcc_bimc_gfx_clk.clkr,
+       [GCC_BIMC_GPU_CLK] = &gcc_bimc_gpu_clk.clkr,
+       [GFX3D_CLK_SRC] = &gfx3d_clk_src.clkr,
+};
+
+static const struct qcom_reset_map gcc_msm8953_resets[] = {
+       [GCC_CAMSS_MICRO_BCR]   = { 0x56008 },
+       [GCC_MSS_BCR]           = { 0x71000 },
+       [GCC_QUSB2_PHY_BCR]     = { 0x4103c },
+       [GCC_USB3PHY_PHY_BCR]   = { 0x3f03c },
+       [GCC_USB3_PHY_BCR]      = { 0x3f034 },
+       [GCC_USB_30_BCR]        = { 0x3f070 },
+};
+
+static const struct regmap_config gcc_msm8953_regmap_config = {
+       .reg_bits       = 32,
+       .reg_stride     = 4,
+       .val_bits       = 32,
+       .max_register   = 0x80000,
+       .fast_io        = true,
+};
+
+static struct gdsc *gcc_msm8953_gdscs[] = {
+       [CPP_GDSC] = &cpp_gdsc,
+       [JPEG_GDSC] = &jpeg_gdsc,
+       [MDSS_GDSC] = &mdss_gdsc,
+       [OXILI_CX_GDSC] = &oxili_cx_gdsc,
+       [OXILI_GX_GDSC] = &oxili_gx_gdsc,
+       [USB30_GDSC] = &usb30_gdsc,
+       [VENUS_CORE0_GDSC] = &venus_core0_gdsc,
+       [VENUS_GDSC] = &venus_gdsc,
+       [VFE0_GDSC] = &vfe0_gdsc,
+       [VFE1_GDSC] = &vfe1_gdsc,
+};
+
+static const struct qcom_cc_desc gcc_msm8953_desc = {
+       .config = &gcc_msm8953_regmap_config,
+       .clks = gcc_msm8953_clocks,
+       .num_clks = ARRAY_SIZE(gcc_msm8953_clocks),
+       .resets = gcc_msm8953_resets,
+       .num_resets = ARRAY_SIZE(gcc_msm8953_resets),
+       .gdscs = gcc_msm8953_gdscs,
+       .num_gdscs = ARRAY_SIZE(gcc_msm8953_gdscs),
+       .clk_hws = gcc_msm8953_hws,
+       .num_clk_hws = ARRAY_SIZE(gcc_msm8953_hws),
+};
+
+static int gcc_msm8953_probe(struct platform_device *pdev)
+{
+       struct regmap *regmap;
+
+       regmap  = qcom_cc_map(pdev, &gcc_msm8953_desc);
+       if (IS_ERR(regmap))
+               return PTR_ERR(regmap);
+
+       clk_alpha_pll_configure(&gpll3_early, regmap, &gpll3_early_config);
+
+       return qcom_cc_really_probe(pdev, &gcc_msm8953_desc, regmap);
+}
+
+static const struct of_device_id gcc_msm8953_match_table[] = {
+       { .compatible = "qcom,gcc-msm8953" },
+       {},
+};
+
+static struct platform_driver gcc_msm8953_driver = {
+       .probe = gcc_msm8953_probe,
+       .driver = {
+               .name = "gcc-msm8953",
+               .of_match_table = gcc_msm8953_match_table,
+               .owner = THIS_MODULE,
+       },
+};
+
+static int __init gcc_msm8953_init(void)
+{
+       return platform_driver_register(&gcc_msm8953_driver);
+}
+core_initcall(gcc_msm8953_init);
+
+static void __exit gcc_msm8953_exit(void)
+{
+       platform_driver_unregister(&gcc_msm8953_driver);
+}
+module_exit(gcc_msm8953_exit);
+
+MODULE_DESCRIPTION("Qualcomm GCC MSM8953 Driver");
+MODULE_LICENSE("GPL v2");
index 6394257..4d36f96 100644 (file)
@@ -37,114 +37,14 @@ enum {
        P_GPLL1_EARLY_DIV,
 };
 
-static const struct parent_map gcc_parent_map_xo_gpll0_gpll0_early_div[] = {
-       { P_XO, 0 },
-       { P_GPLL0, 1 },
-       { P_GPLL0_EARLY_DIV, 6 },
-};
-
-static const char * const gcc_parent_names_xo_gpll0_gpll0_early_div[] = {
-       "xo",
-       "gpll0",
-       "gpll0_early_div",
-};
-
-static const struct parent_map gcc_parent_map_xo_gpll0[] = {
-       { P_XO, 0 },
-       { P_GPLL0, 1 },
-};
-
-static const char * const gcc_parent_names_xo_gpll0[] = {
-       "xo",
-       "gpll0",
-};
-
-static const struct parent_map gcc_parent_map_xo_gpll0_sleep_clk_gpll0_early_div[] = {
-       { P_XO, 0 },
-       { P_GPLL0, 1 },
-       { P_SLEEP_CLK, 5 },
-       { P_GPLL0_EARLY_DIV, 6 },
-};
-
-static const char * const gcc_parent_names_xo_gpll0_sleep_clk_gpll0_early_div[] = {
-       "xo",
-       "gpll0",
-       "sleep_clk",
-       "gpll0_early_div",
-};
-
-static const struct parent_map gcc_parent_map_xo_sleep_clk[] = {
-       { P_XO, 0 },
-       { P_SLEEP_CLK, 5 },
-};
-
-static const char * const gcc_parent_names_xo_sleep_clk[] = {
-       "xo",
-       "sleep_clk",
-};
-
-static const struct parent_map gcc_parent_map_xo_gpll4[] = {
-       { P_XO, 0 },
-       { P_GPLL4, 5 },
-};
-
-static const char * const gcc_parent_names_xo_gpll4[] = {
-       "xo",
-       "gpll4",
-};
-
-static const struct parent_map gcc_parent_map_xo_gpll0_gpll0_early_div_gpll1_gpll4_gpll1_early_div[] = {
-       { P_XO, 0 },
-       { P_GPLL0, 1 },
-       { P_GPLL0_EARLY_DIV, 3 },
-       { P_GPLL1, 4 },
-       { P_GPLL4, 5 },
-       { P_GPLL1_EARLY_DIV, 6 },
-};
-
-static const char * const gcc_parent_names_xo_gpll0_gpll0_early_div_gpll1_gpll4_gpll1_early_div[] = {
-       "xo",
-       "gpll0",
-       "gpll0_early_div",
-       "gpll1",
-       "gpll4",
-       "gpll1_early_div",
-};
-
-static const struct parent_map gcc_parent_map_xo_gpll0_gpll4_gpll0_early_div[] = {
-       { P_XO, 0 },
-       { P_GPLL0, 1 },
-       { P_GPLL4, 5 },
-       { P_GPLL0_EARLY_DIV, 6 },
-};
-
-static const char * const gcc_parent_names_xo_gpll0_gpll4_gpll0_early_div[] = {
-       "xo",
-       "gpll0",
-       "gpll4",
-       "gpll0_early_div",
-};
-
-static const struct parent_map gcc_parent_map_xo_gpll0_gpll0_early_div_gpll4[] = {
-       { P_XO, 0 },
-       { P_GPLL0, 1 },
-       { P_GPLL0_EARLY_DIV, 2 },
-       { P_GPLL4, 5 },
-};
-
-static const char * const gcc_parent_names_xo_gpll0_gpll0_early_div_gpll4[] = {
-       "xo",
-       "gpll0",
-       "gpll0_early_div",
-       "gpll4",
-};
-
 static struct clk_fixed_factor xo = {
        .mult = 1,
        .div = 1,
        .hw.init = &(struct clk_init_data){
                .name = "xo",
-               .parent_names = (const char *[]){ "xo_board" },
+               .parent_data = &(const struct clk_parent_data) {
+                       .fw_name = "xo"
+               },
                .num_parents = 1,
                .ops = &clk_fixed_factor_ops,
        },
@@ -158,7 +58,9 @@ static struct clk_alpha_pll gpll0_early = {
                .enable_mask = BIT(0),
                .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,
                },
@@ -170,7 +72,9 @@ static struct clk_fixed_factor gpll0_early_div = {
        .div = 2,
        .hw.init = &(struct clk_init_data){
                .name = "gpll0_early_div",
-               .parent_names = (const char *[]){ "gpll0_early" },
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll0_early.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_fixed_factor_ops,
        },
@@ -181,7 +85,9 @@ static struct clk_alpha_pll_postdiv gpll0 = {
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll0",
-               .parent_names = (const char *[]){ "gpll0_early" },
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll0_early.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_alpha_pll_postdiv_ops,
        },
@@ -195,7 +101,9 @@ static struct clk_alpha_pll gpll1_early = {
                .enable_mask = BIT(1),
                .hw.init = &(struct clk_init_data){
                        .name = "gpll1_early",
-                       .parent_names = (const char *[]){ "xo" },
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+                       },
                        .num_parents = 1,
                        .ops = &clk_alpha_pll_ops,
                },
@@ -207,7 +115,9 @@ static struct clk_fixed_factor gpll1_early_div = {
        .div = 2,
        .hw.init = &(struct clk_init_data){
                .name = "gpll1_early_div",
-               .parent_names = (const char *[]){ "gpll1_early" },
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll1_early.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_fixed_factor_ops,
        },
@@ -218,7 +128,9 @@ static struct clk_alpha_pll_postdiv gpll1 = {
        .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll1",
-               .parent_names = (const char *[]){ "gpll1_early" },
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll1_early.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_alpha_pll_postdiv_ops,
        },
@@ -232,7 +144,9 @@ static struct clk_alpha_pll gpll4_early = {
                .enable_mask = BIT(4),
                .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,
                },
@@ -245,12 +159,116 @@ static struct clk_alpha_pll_postdiv gpll4 = {
        .clkr.hw.init = &(struct clk_init_data)
        {
                .name = "gpll4",
-               .parent_names = (const char *[]) { "gpll4_early" },
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll4_early.clkr.hw,
+               },
                .num_parents = 1,
                .ops = &clk_alpha_pll_postdiv_ops,
        },
 };
 
+static const struct parent_map gcc_parent_map_xo_gpll0_gpll0_early_div[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL0_EARLY_DIV, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_xo_gpll0_gpll0_early_div[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_early_div.hw },
+};
+
+static const struct parent_map gcc_parent_map_xo_gpll0[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+};
+
+static const struct clk_parent_data gcc_parent_data_xo_gpll0[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_xo_gpll0_sleep_clk_gpll0_early_div[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_SLEEP_CLK, 5 },
+       { P_GPLL0_EARLY_DIV, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_xo_gpll0_sleep_clk_gpll0_early_div[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0.clkr.hw },
+       { .fw_name = "sleep_clk" },
+       { .hw = &gpll0_early_div.hw },
+};
+
+static const struct parent_map gcc_parent_map_xo_sleep_clk[] = {
+       { P_XO, 0 },
+       { P_SLEEP_CLK, 5 },
+};
+
+static const struct clk_parent_data gcc_parent_data_xo_sleep_clk[] = {
+       { .fw_name = "xo" },
+       { .fw_name = "sleep_clk" },
+};
+
+static const struct parent_map gcc_parent_map_xo_gpll4[] = {
+       { P_XO, 0 },
+       { P_GPLL4, 5 },
+};
+
+static const struct clk_parent_data gcc_parent_data_xo_gpll4[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll4.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_xo_gpll0_gpll0_early_div_gpll1_gpll4_gpll1_early_div[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL0_EARLY_DIV, 3 },
+       { P_GPLL1, 4 },
+       { P_GPLL4, 5 },
+       { P_GPLL1_EARLY_DIV, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_xo_gpll0_gpll0_early_div_gpll1_gpll4_gpll1_early_div[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_early_div.hw },
+       { .hw = &gpll1.clkr.hw },
+       { .hw = &gpll4.clkr.hw },
+       { .hw = &gpll1_early_div.hw },
+};
+
+static const struct parent_map gcc_parent_map_xo_gpll0_gpll4_gpll0_early_div[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL4, 5 },
+       { P_GPLL0_EARLY_DIV, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_xo_gpll0_gpll4_gpll0_early_div[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll4.clkr.hw },
+       { .hw = &gpll0_early_div.hw },
+};
+
+static const struct parent_map gcc_parent_map_xo_gpll0_gpll0_early_div_gpll4[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL0_EARLY_DIV, 2 },
+       { P_GPLL4, 5 },
+};
+
+static const struct clk_parent_data gcc_parent_data_xo_gpll0_gpll0_early_div_gpll4[] = {
+       { .fw_name = "xo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_early_div.hw },
+       { .hw = &gpll4.clkr.hw },
+};
+
 static const struct freq_tbl ftbl_blsp1_qup1_i2c_apps_clk_src[] = {
        F(19200000, P_XO, 1, 0, 0),
        F(50000000, P_GPLL0, 12, 0, 0),
@@ -265,7 +283,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -290,7 +308,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -304,7 +322,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -318,7 +336,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -332,7 +350,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -346,7 +364,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -360,7 +378,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -374,7 +392,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -407,7 +425,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -421,7 +439,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -435,7 +453,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -449,7 +467,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -463,7 +481,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -477,7 +495,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -491,7 +509,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -505,7 +523,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -519,7 +537,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -533,7 +551,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -547,7 +565,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -561,7 +579,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -582,7 +600,7 @@ 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_xo_gpll0_sleep_clk_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_sleep_clk_gpll0_early_div,
                .num_parents = 4,
                .ops = &clk_rcg2_ops,
        },
@@ -596,7 +614,7 @@ 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_xo_gpll0_sleep_clk_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_sleep_clk_gpll0_early_div,
                .num_parents = 4,
                .ops = &clk_rcg2_ops,
        },
@@ -610,7 +628,7 @@ 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_xo_gpll0_sleep_clk_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_sleep_clk_gpll0_early_div,
                .num_parents = 4,
                .ops = &clk_rcg2_ops,
        },
@@ -630,7 +648,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -651,7 +669,7 @@ static struct clk_rcg2 hmss_gpll4_clk_src = {
        .freq_tbl = ftbl_hmss_gpll4_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "hmss_gpll4_clk_src",
-               .parent_names = gcc_parent_names_xo_gpll4,
+               .parent_data = gcc_parent_data_xo_gpll4,
                .num_parents = 2,
                .ops = &clk_rcg2_ops,
        },
@@ -670,7 +688,7 @@ 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_xo_gpll0,
+               .parent_data = gcc_parent_data_xo_gpll0,
                .num_parents = 2,
                .ops = &clk_rcg2_ops,
        },
@@ -689,7 +707,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -711,7 +729,7 @@ static struct clk_rcg2 qspi_ser_clk_src = {
        .freq_tbl = ftbl_qspi_ser_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "qspi_ser_clk_src",
-               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div_gpll1_gpll4_gpll1_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div_gpll1_gpll4_gpll1_early_div,
                .num_parents = 6,
                .ops = &clk_rcg2_ops,
        },
@@ -737,7 +755,7 @@ static struct clk_rcg2 sdcc1_apps_clk_src = {
        .freq_tbl = ftbl_sdcc1_apps_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "sdcc1_apps_clk_src",
-               .parent_names = gcc_parent_names_xo_gpll0_gpll4_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll4_gpll0_early_div,
                .num_parents = 4,
                .ops = &clk_rcg2_ops,
        },
@@ -759,7 +777,7 @@ static struct clk_rcg2 sdcc1_ice_core_clk_src = {
        .freq_tbl = ftbl_sdcc1_ice_core_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "sdcc1_ice_core_clk_src",
-               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -785,7 +803,7 @@ 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_xo_gpll0_gpll0_early_div_gpll4,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div_gpll4,
                .num_parents = 4,
                .ops = &clk_rcg2_floor_ops,
        },
@@ -808,7 +826,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -829,7 +847,7 @@ static struct clk_rcg2 ufs_ice_core_clk_src = {
        .freq_tbl = ftbl_ufs_ice_core_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "ufs_ice_core_clk_src",
-               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -843,7 +861,7 @@ static struct clk_rcg2 ufs_phy_aux_clk_src = {
        .freq_tbl = ftbl_hmss_rbcpr_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "ufs_phy_aux_clk_src",
-               .parent_names = gcc_parent_names_xo_sleep_clk,
+               .parent_data = gcc_parent_data_xo_sleep_clk,
                .num_parents = 2,
                .ops = &clk_rcg2_ops,
        },
@@ -864,7 +882,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -885,7 +903,7 @@ static struct clk_rcg2 usb20_master_clk_src = {
        .freq_tbl = ftbl_usb20_master_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "usb20_master_clk_src",
-               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -905,7 +923,7 @@ static struct clk_rcg2 usb20_mock_utmi_clk_src = {
        .freq_tbl = ftbl_usb20_mock_utmi_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "usb20_mock_utmi_clk_src",
-               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -930,7 +948,7 @@ 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_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -951,7 +969,7 @@ static struct clk_rcg2 usb30_mock_utmi_clk_src = {
        .freq_tbl = ftbl_usb30_mock_utmi_clk_src,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "usb30_mock_utmi_clk_src",
-               .parent_names = gcc_parent_names_xo_gpll0_gpll0_early_div,
+               .parent_data = gcc_parent_data_xo_gpll0_gpll0_early_div,
                .num_parents = 3,
                .ops = &clk_rcg2_ops,
        },
@@ -971,7 +989,7 @@ 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_xo_sleep_clk,
+               .parent_data = gcc_parent_data_xo_sleep_clk,
                .num_parents = 2,
                .ops = &clk_rcg2_ops,
        },
@@ -985,8 +1003,8 @@ static struct clk_branch gcc_aggre2_ufs_axi_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_aggre2_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,
                        .ops = &clk_branch2_ops,
@@ -1002,8 +1020,8 @@ static struct clk_branch gcc_aggre2_usb3_axi_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_aggre2_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,
                        .ops = &clk_branch2_ops,
@@ -1071,8 +1089,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,
@@ -1089,8 +1107,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,
@@ -1107,8 +1125,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,
@@ -1125,8 +1143,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,
@@ -1143,8 +1161,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,
@@ -1161,8 +1179,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,
@@ -1179,8 +1197,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,
@@ -1197,8 +1215,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,
@@ -1215,8 +1233,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,
@@ -1233,8 +1251,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,
@@ -1264,8 +1282,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,
@@ -1282,8 +1300,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,
@@ -1300,8 +1318,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,
@@ -1318,8 +1336,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,
@@ -1336,8 +1354,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,
@@ -1354,8 +1372,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,
@@ -1372,8 +1390,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,
@@ -1390,8 +1408,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,
@@ -1408,8 +1426,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,
@@ -1426,8 +1444,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,
@@ -1457,8 +1475,8 @@ static struct clk_branch gcc_cfg_noc_usb2_axi_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_cfg_noc_usb2_axi_clk",
-                       .parent_names = (const char *[]){
-                               "usb20_master_clk_src",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &usb20_master_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -1474,8 +1492,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,
                        .ops = &clk_branch2_ops,
@@ -1503,8 +1521,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,
@@ -1521,8 +1539,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,
@@ -1539,8 +1557,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,
@@ -1584,8 +1602,8 @@ static struct clk_branch gcc_gpu_gpll0_clk = {
                .enable_mask = BIT(4),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_gpu_gpll0_clk",
-                       .parent_names = (const char *[]){
-                               "gpll0",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gpll0.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -1601,8 +1619,8 @@ static struct clk_branch gcc_gpu_gpll0_div_clk = {
                .enable_mask = BIT(3),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_gpu_gpll0_div_clk",
-                       .parent_names = (const char *[]){
-                               "gpll0_early_div",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gpll0_early_div.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -1632,8 +1650,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,
@@ -1650,8 +1668,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",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gpll0.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -1667,8 +1685,8 @@ static struct clk_branch gcc_mmss_gpll0_div_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mmss_gpll0_div_clk",
-                       .parent_names = (const char *[]){
-                               "gpll0_early_div",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gpll0_early_div.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -1767,8 +1785,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,
@@ -1824,8 +1842,8 @@ static struct clk_branch gcc_qspi_ser_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_qspi_ser_clk",
-                       .parent_names = (const char *[]){
-                               "qspi_ser_clk_src",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &qspi_ser_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1881,8 +1899,8 @@ static struct clk_branch gcc_sdcc1_apps_clk = {
                .enable_mask = BIT(0),
                .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,
@@ -1899,8 +1917,8 @@ static struct clk_branch gcc_sdcc1_ice_core_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc1_ice_core_clk",
-                       .parent_names = (const char *[]){
-                               "sdcc1_ice_core_clk_src",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &sdcc1_ice_core_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1930,8 +1948,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,
@@ -1961,8 +1979,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,
@@ -1992,8 +2010,8 @@ static struct clk_branch gcc_ufs_ice_core_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ufs_ice_core_clk",
-                       .parent_names = (const char *[]){
-                               "ufs_ice_core_clk_src",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &ufs_ice_core_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2010,8 +2028,8 @@ static struct clk_branch gcc_ufs_phy_aux_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ufs_phy_aux_clk",
-                       .parent_names = (const char *[]){
-                               "ufs_phy_aux_clk_src",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &ufs_phy_aux_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2067,8 +2085,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,
                        },
                        .flags = CLK_SET_RATE_PARENT,
                        .num_parents = 1,
@@ -2085,8 +2103,8 @@ static struct clk_branch gcc_usb20_master_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb20_master_clk",
-                       .parent_names = (const char *[]){
-                               "usb20_master_clk_src"
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &usb20_master_clk_src.clkr.hw,
                        },
                        .flags = CLK_SET_RATE_PARENT,
                        .num_parents = 1,
@@ -2103,8 +2121,8 @@ static struct clk_branch gcc_usb20_mock_utmi_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb20_mock_utmi_clk",
-                       .parent_names = (const char *[]){
-                               "usb20_mock_utmi_clk_src",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &usb20_mock_utmi_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2134,8 +2152,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,
@@ -2152,8 +2170,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,
@@ -2196,8 +2214,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,
diff --git a/drivers/clk/qcom/gcc-sm6115.c b/drivers/clk/qcom/gcc-sm6115.c
new file mode 100644 (file)
index 0000000..bc09736
--- /dev/null
@@ -0,0 +1,3544 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2019-2021, The Linux Foundation. All rights reserved.
+ */
+
+#include <linux/err.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/clk-provider.h>
+#include <linux/regmap.h>
+#include <linux/reset-controller.h>
+
+#include <dt-bindings/clock/qcom,gcc-sm6115.h>
+
+#include "clk-alpha-pll.h"
+#include "clk-branch.h"
+#include "clk-pll.h"
+#include "clk-rcg.h"
+#include "clk-regmap.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_MAIN,
+       P_GPLL3_OUT_EARLY,
+       P_GPLL4_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 struct pll_vco default_vco[] = {
+       { 500000000, 1000000000, 2 },
+};
+
+static struct pll_vco gpll9_vco[] = {
+       { 500000000, 1250000000, 0 },
+};
+
+static struct pll_vco gpll10_vco[] = {
+       { 750000000, 1500000000, 1 },
+};
+
+static struct clk_alpha_pll gpll0 = {
+       .offset = 0x0,
+       .vco_table = default_vco,
+       .num_vco = ARRAY_SIZE(default_vco),
+       .regs = clk_alpha_pll_regs[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[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,
+       },
+};
+
+/* listed as BRAMMO, but it doesn't really match */
+static const u8 clk_gpll9_regs[PLL_OFF_MAX_REGS] = {
+       [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 const struct clk_div_table post_div_table_gpll0_out_main[] = {
+       { 0x0, 1 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv gpll0_out_main = {
+       .offset = 0x0,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_gpll0_out_main,
+       .num_post_div = ARRAY_SIZE(post_div_table_gpll0_out_main),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll0_out_main",
+               .parent_hws = (const struct clk_hw *[]){ &gpll0.clkr.hw },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_ro_ops,
+       },
+};
+
+/* 1152MHz configuration */
+static const struct alpha_pll_config gpll10_config = {
+       .l = 0x3c,
+       .vco_val = 0x1 << 20,
+       .vco_mask = GENMASK(21, 20),
+       .main_output_mask = BIT(0),
+       .config_ctl_val = 0x4001055b,
+};
+
+static struct clk_alpha_pll gpll10 = {
+       .offset = 0xa000,
+       .vco_table = gpll10_vco,
+       .num_vco = ARRAY_SIZE(gpll10_vco),
+       .regs = clk_alpha_pll_regs[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,
+               },
+       },
+};
+
+static const struct clk_div_table post_div_table_gpll10_out_main[] = {
+       { 0x0, 1 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv gpll10_out_main = {
+       .offset = 0xa000,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_gpll10_out_main,
+       .num_post_div = ARRAY_SIZE(post_div_table_gpll10_out_main),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll10_out_main",
+               .parent_hws = (const struct clk_hw *[]){ &gpll10.clkr.hw },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_alpha_pll_postdiv_ops,
+       },
+};
+
+/* 600MHz configuration */
+static const struct alpha_pll_config gpll11_config = {
+       .l = 0x1F,
+       .alpha = 0x0,
+       .alpha_hi = 0x40,
+       .alpha_en_mask = BIT(24),
+       .vco_val = 0x2 << 20,
+       .vco_mask = GENMASK(21, 20),
+       .config_ctl_val = 0x4001055b,
+};
+
+static struct clk_alpha_pll gpll11 = {
+       .offset = 0xb000,
+       .vco_table = default_vco,
+       .num_vco = ARRAY_SIZE(default_vco),
+       .flags = SUPPORTS_DYNAMIC_UPDATE,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .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 const struct clk_div_table post_div_table_gpll11_out_main[] = {
+       { 0x0, 1 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv gpll11_out_main = {
+       .offset = 0xb000,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_gpll11_out_main,
+       .num_post_div = ARRAY_SIZE(post_div_table_gpll11_out_main),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll11_out_main",
+               .parent_hws = (const struct clk_hw *[]){ &gpll11.clkr.hw },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_alpha_pll_postdiv_ops,
+       },
+};
+
+static struct clk_alpha_pll gpll3 = {
+       .offset = 0x3000,
+       .vco_table = default_vco,
+       .num_vco = ARRAY_SIZE(default_vco),
+       .regs = clk_alpha_pll_regs[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 struct clk_alpha_pll gpll4 = {
+       .offset = 0x4000,
+       .vco_table = default_vco,
+       .num_vco = ARRAY_SIZE(default_vco),
+       .regs = clk_alpha_pll_regs[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 const struct clk_div_table post_div_table_gpll4_out_main[] = {
+       { 0x0, 1 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv gpll4_out_main = {
+       .offset = 0x4000,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_gpll4_out_main,
+       .num_post_div = ARRAY_SIZE(post_div_table_gpll4_out_main),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll4_out_main",
+               .parent_hws = (const struct clk_hw *[]){ &gpll4.clkr.hw },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_ro_ops,
+       },
+};
+
+static struct clk_alpha_pll gpll6 = {
+       .offset = 0x6000,
+       .vco_table = default_vco,
+       .num_vco = ARRAY_SIZE(default_vco),
+       .regs = clk_alpha_pll_regs[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[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,
+       .vco_table = default_vco,
+       .num_vco = ARRAY_SIZE(default_vco),
+       .regs = clk_alpha_pll_regs[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,
+               },
+       },
+};
+
+static const struct clk_div_table post_div_table_gpll7_out_main[] = {
+       { 0x0, 1 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv gpll7_out_main = {
+       .offset = 0x7000,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_gpll7_out_main,
+       .num_post_div = ARRAY_SIZE(post_div_table_gpll7_out_main),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll7_out_main",
+               .parent_hws = (const struct clk_hw *[]){ &gpll7.clkr.hw },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_ro_ops,
+       },
+};
+
+/* 800MHz configuration */
+static const struct alpha_pll_config gpll8_config = {
+       .l = 0x29,
+       .alpha = 0xAAAAAAAA,
+       .alpha_hi = 0xAA,
+       .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,
+};
+
+static struct clk_alpha_pll gpll8 = {
+       .offset = 0x8000,
+       .vco_table = default_vco,
+       .num_vco = ARRAY_SIZE(default_vco),
+       .regs = clk_alpha_pll_regs[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[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),
+       .config_ctl_val = 0x00004289,
+};
+
+static struct clk_alpha_pll gpll9 = {
+       .offset = 0x9000,
+       .vco_table = gpll9_vco,
+       .num_vco = ARRAY_SIZE(gpll9_vco),
+       .regs = clk_gpll9_regs,
+       .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_gpll9_regs,
+       .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_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 },
+};
+
+static const struct clk_parent_data gcc_parents_3[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll9.clkr.hw },
+       { .hw = &gpll10_out_main.clkr.hw },
+       { .hw = &gpll9_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_GPLL4_OUT_MAIN, 5 },
+};
+
+static const struct clk_parent_data gcc_parents_4[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_aux2.clkr.hw },
+       { .hw = &gpll4_out_main.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_5[] = {
+       { 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 },
+};
+
+static const struct clk_parent_data gcc_parents_5[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll8.clkr.hw },
+       { .hw = &gpll10_out_main.clkr.hw },
+       { .hw = &gpll8_out_main.clkr.hw },
+       { .hw = &gpll9_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_GPLL6_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_out_main.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_7[] = {
+       { 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_7[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_aux2.clkr.hw },
+       { .hw = &gpll10_out_main.clkr.hw },
+       { .hw = &gpll4_out_main.clkr.hw },
+       { .hw = &gpll3.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_GPLL8_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_out_main.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_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_out_main.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, 4 },
+       { P_GPLL9_OUT_MAIN, 5 },
+};
+
+static const struct clk_parent_data gcc_parents_10[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll8.clkr.hw },
+       { .hw = &gpll10_out_main.clkr.hw },
+       { .hw = &gpll6.clkr.hw },
+       { .hw = &gpll9_out_main.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_11[] = {
+       { 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_11[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_aux2.clkr.hw },
+       { .hw = &gpll7_out_main.clkr.hw },
+       { .hw = &gpll4_out_main.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_12[] = {
+       { P_BI_TCXO, 0 },
+       { P_SLEEP_CLK, 5 },
+};
+
+static const struct clk_parent_data gcc_parents_12[] = {
+       { .fw_name = "bi_tcxo" },
+       { .fw_name = "sleep_clk" },
+};
+
+static const struct parent_map gcc_parent_map_13[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL11_OUT_MAIN, 1 },
+};
+
+static const struct clk_parent_data gcc_parents_13[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll11_out_main.clkr.hw },
+};
+
+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_7,
+       .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_7,
+               .num_parents = ARRAY_SIZE(gcc_parents_7),
+               .flags = CLK_SET_RATE_PARENT,
+               .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),
+               .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
+               .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 = 0x59000,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_4,
+       .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_4,
+               .num_parents = ARRAY_SIZE(gcc_parents_4),
+               .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_camss_csi1phytimer_clk_src = {
+       .cmd_rcgr = 0x5901c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_4,
+       .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_4,
+               .num_parents = ARRAY_SIZE(gcc_parents_4),
+               .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_camss_csi2phytimer_clk_src = {
+       .cmd_rcgr = 0x59038,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_4,
+       .freq_tbl = ftbl_gcc_camss_csi0phytimer_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_camss_csi2phytimer_clk_src",
+               .parent_data = gcc_parents_4,
+               .num_parents = ARRAY_SIZE(gcc_parents_4),
+               .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
+               .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_MAIN, 1, 1, 9),
+       { }
+};
+
+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_SET_RATE_PARENT | 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_SET_RATE_PARENT | 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_SET_RATE_PARENT | 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_SET_RATE_PARENT | 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_8,
+       .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_8,
+               .num_parents = ARRAY_SIZE(gcc_parents_8),
+               .flags = CLK_SET_RATE_PARENT,
+               .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(576000000, P_GPLL9_OUT_MAIN, 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_8,
+       .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_8,
+               .num_parents = ARRAY_SIZE(gcc_parents_8),
+               .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_5,
+       .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_5,
+               .num_parents = ARRAY_SIZE(gcc_parents_5),
+               .flags = CLK_SET_RATE_PARENT,
+               .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_6,
+       .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_6,
+               .num_parents = ARRAY_SIZE(gcc_parents_6),
+               .flags = CLK_SET_RATE_PARENT,
+               .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_5,
+       .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_5,
+               .num_parents = ARRAY_SIZE(gcc_parents_5),
+               .flags = CLK_SET_RATE_PARENT,
+               .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_6,
+       .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_6,
+               .num_parents = ARRAY_SIZE(gcc_parents_6),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_camss_tfe_2_clk_src = {
+       .cmd_rcgr = 0x52044,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_5,
+       .freq_tbl = ftbl_gcc_camss_tfe_0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_camss_tfe_2_clk_src",
+               .parent_data = gcc_parents_5,
+               .num_parents = ARRAY_SIZE(gcc_parents_5),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_camss_tfe_2_csid_clk_src = {
+       .cmd_rcgr = 0x520d4,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_6,
+       .freq_tbl = ftbl_gcc_camss_tfe_0_csid_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_camss_tfe_2_csid_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_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_SET_RATE_PARENT | 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_7,
+       .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_7,
+               .num_parents = ARRAY_SIZE(gcc_parents_7),
+               .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
+               .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_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(200000000, P_GPLL0_OUT_EARLY, 3, 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_11,
+       .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_11,
+               .num_parents = ARRAY_SIZE(gcc_parents_11),
+               .ops = &clk_rcg2_ops,
+               .flags = CLK_OPS_PARENT_ENABLE,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_ufs_phy_axi_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_EARLY, 3, 0, 0),
+       F(240000000, P_GPLL0_OUT_EARLY, 2.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_ufs_phy_axi_clk_src = {
+       .cmd_rcgr = 0x45020,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_ufs_phy_axi_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_ufs_phy_axi_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_ufs_phy_ice_core_clk_src[] = {
+       F(37500000, P_GPLL0_OUT_AUX2, 8, 0, 0),
+       F(75000000, P_GPLL0_OUT_AUX2, 4, 0, 0),
+       F(150000000, P_GPLL0_OUT_AUX2, 2, 0, 0),
+       F(300000000, P_GPLL0_OUT_AUX2, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_ufs_phy_ice_core_clk_src = {
+       .cmd_rcgr = 0x45048,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_ufs_phy_ice_core_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_ufs_phy_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_ufs_phy_phy_aux_clk_src[] = {
+       F(9600000, P_BI_TCXO, 2, 0, 0),
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_ufs_phy_phy_aux_clk_src = {
+       .cmd_rcgr = 0x4507c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_ufs_phy_phy_aux_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_ufs_phy_phy_aux_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_ufs_phy_unipro_core_clk_src[] = {
+       F(37500000, P_GPLL0_OUT_AUX2, 8, 0, 0),
+       F(75000000, P_GPLL0_OUT_AUX2, 4, 0, 0),
+       F(150000000, P_GPLL0_OUT_AUX2, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_ufs_phy_unipro_core_clk_src = {
+       .cmd_rcgr = 0x45060,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_ufs_phy_unipro_core_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_ufs_phy_unipro_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_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 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_clk_src = {
+       .reg = 0x1a04c,
+       .shift = 0,
+       .width = 2,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gcc_usb30_prim_mock_utmi_postdiv_clk_src",
+               .parent_hws = (const struct clk_hw *[]) {
+                       &gcc_usb30_prim_mock_utmi_clk_src.clkr.hw },
+               .num_parents = 1,
+               .ops = &clk_regmap_div_ro_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_12,
+       .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_12,
+               .num_parents = ARRAY_SIZE(gcc_parents_12),
+               .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_13,
+       .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_13,
+               .num_parents = ARRAY_SIZE(gcc_parents_13),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_ahb2phy_csi_clk = {
+       .halt_reg = 0x1d004,
+       .halt_check = BRANCH_HALT,
+       .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_cphy_2_clk = {
+       .halt_reg = 0x52090,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x52090,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_cphy_2_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 = 0x59018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x59018,
+               .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 = 0x59034,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x59034,
+               .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_csi2phytimer_clk = {
+       .halt_reg = 0x59050,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x59050,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_csi2phytimer_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &gcc_camss_csi2phytimer_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_tfe_2_clk = {
+       .halt_reg = 0x5205c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5205c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_tfe_2_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &gcc_camss_tfe_2_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_tfe_2_cphy_rx_clk = {
+       .halt_reg = 0x52084,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x52084,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_tfe_2_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_2_csid_clk = {
+       .halt_reg = 0x520ec,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x520ec,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_tfe_2_csid_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &gcc_camss_tfe_2_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_cpuss_gnoc_clk = {
+       .halt_reg = 0x2b004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x2b004,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x79004,
+               .enable_mask = BIT(22),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_cpuss_gnoc_clk",
+                       .flags = CLK_IS_CRITICAL,
+                       .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",
+                       .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_prng_ahb_clk = {
+       .halt_reg = 0x21004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x21004,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x79004,
+               .enable_mask = BIT(13),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_prng_ahb_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 /* | CLK_ENABLE_HAND_OFF */,
+                       .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_ufs_phy_axi_clk = {
+       .halt_reg = 0x45098,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x45098,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_sys_noc_ufs_phy_axi_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &gcc_ufs_phy_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .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_ufs_clkref_clk = {
+       .halt_reg = 0x8c000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8c000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_clkref_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_ahb_clk = {
+       .halt_reg = 0x45014,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x45014,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x45014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_axi_clk = {
+       .halt_reg = 0x45010,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x45010,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x45010,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_axi_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &gcc_ufs_phy_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_ice_core_clk = {
+       .halt_reg = 0x45044,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x45044,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x45044,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_ice_core_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &gcc_ufs_phy_ice_core_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_phy_aux_clk = {
+       .halt_reg = 0x45078,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x45078,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x45078,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_phy_aux_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &gcc_ufs_phy_phy_aux_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_rx_symbol_0_clk = {
+       .halt_reg = 0x4501c,
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x4501c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_rx_symbol_0_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_tx_symbol_0_clk = {
+       .halt_reg = 0x45018,
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x45018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_tx_symbol_0_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_unipro_core_clk = {
+       .halt_reg = 0x45040,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x45040,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x45040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_unipro_core_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &gcc_ufs_phy_unipro_core_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_clk_src.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_ufs_phy_gdsc = {
+       .gdscr = 0x45004,
+       .pd = {
+               .name = "gcc_ufs_phy",
+       },
+       .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 = 0x7d060,
+       .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_sm6115_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_CPHY_2_CLK] = &gcc_camss_cphy_2_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_CSI2PHYTIMER_CLK] = &gcc_camss_csi2phytimer_clk.clkr,
+       [GCC_CAMSS_CSI2PHYTIMER_CLK_SRC] = &gcc_camss_csi2phytimer_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_2_CLK] = &gcc_camss_tfe_2_clk.clkr,
+       [GCC_CAMSS_TFE_2_CLK_SRC] = &gcc_camss_tfe_2_clk_src.clkr,
+       [GCC_CAMSS_TFE_2_CPHY_RX_CLK] = &gcc_camss_tfe_2_cphy_rx_clk.clkr,
+       [GCC_CAMSS_TFE_2_CSID_CLK] = &gcc_camss_tfe_2_csid_clk.clkr,
+       [GCC_CAMSS_TFE_2_CSID_CLK_SRC] = &gcc_camss_tfe_2_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_CPUSS_GNOC_CLK] = &gcc_cpuss_gnoc_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_PRNG_AHB_CLK] = &gcc_prng_ahb_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_UFS_PHY_AXI_CLK] = &gcc_sys_noc_ufs_phy_axi_clk.clkr,
+       [GCC_SYS_NOC_USB3_PRIM_AXI_CLK] = &gcc_sys_noc_usb3_prim_axi_clk.clkr,
+       [GCC_UFS_CLKREF_CLK] = &gcc_ufs_clkref_clk.clkr,
+       [GCC_UFS_PHY_AHB_CLK] = &gcc_ufs_phy_ahb_clk.clkr,
+       [GCC_UFS_PHY_AXI_CLK] = &gcc_ufs_phy_axi_clk.clkr,
+       [GCC_UFS_PHY_AXI_CLK_SRC] = &gcc_ufs_phy_axi_clk_src.clkr,
+       [GCC_UFS_PHY_ICE_CORE_CLK] = &gcc_ufs_phy_ice_core_clk.clkr,
+       [GCC_UFS_PHY_ICE_CORE_CLK_SRC] = &gcc_ufs_phy_ice_core_clk_src.clkr,
+       [GCC_UFS_PHY_PHY_AUX_CLK] = &gcc_ufs_phy_phy_aux_clk.clkr,
+       [GCC_UFS_PHY_PHY_AUX_CLK_SRC] = &gcc_ufs_phy_phy_aux_clk_src.clkr,
+       [GCC_UFS_PHY_RX_SYMBOL_0_CLK] = &gcc_ufs_phy_rx_symbol_0_clk.clkr,
+       [GCC_UFS_PHY_TX_SYMBOL_0_CLK] = &gcc_ufs_phy_tx_symbol_0_clk.clkr,
+       [GCC_UFS_PHY_UNIPRO_CORE_CLK] = &gcc_ufs_phy_unipro_core_clk.clkr,
+       [GCC_UFS_PHY_UNIPRO_CORE_CLK_SRC] =
+               &gcc_ufs_phy_unipro_core_clk_src.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_CLK_SRC] =
+               &gcc_usb30_prim_mock_utmi_postdiv_clk_src.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,
+       [GPLL0_OUT_MAIN] = &gpll0_out_main.clkr,
+       [GPLL10] = &gpll10.clkr,
+       [GPLL10_OUT_MAIN] = &gpll10_out_main.clkr,
+       [GPLL11] = &gpll11.clkr,
+       [GPLL11_OUT_MAIN] = &gpll11_out_main.clkr,
+       [GPLL3] = &gpll3.clkr,
+       [GPLL4] = &gpll4.clkr,
+       [GPLL4_OUT_MAIN] = &gpll4_out_main.clkr,
+       [GPLL6] = &gpll6.clkr,
+       [GPLL6_OUT_MAIN] = &gpll6_out_main.clkr,
+       [GPLL7] = &gpll7.clkr,
+       [GPLL7_OUT_MAIN] = &gpll7_out_main.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_sm6115_resets[] = {
+       [GCC_QUSB2PHY_PRIM_BCR] = { 0x1c000 },
+       [GCC_QUSB2PHY_SEC_BCR] = { 0x1c004 },
+       [GCC_SDCC1_BCR] = { 0x38000 },
+       [GCC_SDCC2_BCR] = { 0x1e000 },
+       [GCC_UFS_PHY_BCR] = { 0x45000 },
+       [GCC_USB30_PRIM_BCR] = { 0x1a000 },
+       [GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x1d000 },
+       [GCC_USB3PHY_PHY_PRIM_SP0_BCR] = { 0x1b008 },
+       [GCC_USB3_PHY_PRIM_SP0_BCR] = { 0x1b000 },
+       [GCC_VCODEC0_BCR] = { 0x58094 },
+       [GCC_VENUS_BCR] = { 0x58078 },
+       [GCC_VIDEO_INTERFACE_BCR] = { 0x6e000 },
+};
+
+static struct gdsc *gcc_sm6115_gdscs[] = {
+       [GCC_CAMSS_TOP_GDSC] = &gcc_camss_top_gdsc,
+       [GCC_UFS_PHY_GDSC] = &gcc_ufs_phy_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_sm6115_regmap_config = {
+       .reg_bits = 32,
+       .reg_stride = 4,
+       .val_bits = 32,
+       .max_register = 0xc7000,
+       .fast_io = true,
+};
+
+static const struct qcom_cc_desc gcc_sm6115_desc = {
+       .config = &gcc_sm6115_regmap_config,
+       .clks = gcc_sm6115_clocks,
+       .num_clks = ARRAY_SIZE(gcc_sm6115_clocks),
+       .resets = gcc_sm6115_resets,
+       .num_resets = ARRAY_SIZE(gcc_sm6115_resets),
+       .gdscs = gcc_sm6115_gdscs,
+       .num_gdscs = ARRAY_SIZE(gcc_sm6115_gdscs),
+};
+
+static const struct of_device_id gcc_sm6115_match_table[] = {
+       { .compatible = "qcom,gcc-sm6115" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, gcc_sm6115_match_table);
+
+static int gcc_sm6115_probe(struct platform_device *pdev)
+{
+       struct regmap *regmap;
+       int ret;
+
+       regmap = qcom_cc_map(pdev, &gcc_sm6115_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(&gpll8, regmap, &gpll8_config);
+       clk_alpha_pll_configure(&gpll9, regmap, &gpll9_config);
+       clk_alpha_pll_configure(&gpll10, regmap, &gpll10_config);
+       clk_alpha_pll_configure(&gpll11, regmap, &gpll11_config);
+
+       return qcom_cc_really_probe(pdev, &gcc_sm6115_desc, regmap);
+}
+
+static struct platform_driver gcc_sm6115_driver = {
+       .probe = gcc_sm6115_probe,
+       .driver = {
+               .name = "gcc-sm6115",
+               .of_match_table = gcc_sm6115_match_table,
+       },
+};
+
+static int __init gcc_sm6115_init(void)
+{
+       return platform_driver_register(&gcc_sm6115_driver);
+}
+subsys_initcall(gcc_sm6115_init);
+
+static void __exit gcc_sm6115_exit(void)
+{
+       platform_driver_unregister(&gcc_sm6115_driver);
+}
+module_exit(gcc_sm6115_exit);
+
+MODULE_DESCRIPTION("QTI GCC SM6115 and SM4250 Driver");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:gcc-sm6115");
diff --git a/drivers/clk/qcom/gcc-sm6350.c b/drivers/clk/qcom/gcc-sm6350.c
new file mode 100644 (file)
index 0000000..053089f
--- /dev/null
@@ -0,0 +1,2588 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021, Konrad Dybcio <konrad.dybcio@somainline.org>
+ */
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+
+#include <dt-bindings/clock/qcom,gcc-sm6350.h>
+
+#include "clk-alpha-pll.h"
+#include "clk-branch.h"
+#include "clk-rcg.h"
+#include "clk-regmap.h"
+#include "clk-regmap-divider.h"
+#include "clk-regmap-mux.h"
+#include "common.h"
+#include "gdsc.h"
+#include "reset.h"
+
+enum {
+       P_BI_TCXO,
+       P_GPLL0_OUT_EVEN,
+       P_GPLL0_OUT_MAIN,
+       P_GPLL0_OUT_ODD,
+       P_GPLL6_OUT_EVEN,
+       P_GPLL7_OUT_MAIN,
+       P_SLEEP_CLK,
+};
+
+static struct clk_alpha_pll gpll0 = {
+       .offset = 0x0,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
+       .clkr = {
+               .enable_reg = 0x52010,
+               .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_fixed_fabia_ops,
+               },
+       },
+};
+
+static const struct clk_div_table post_div_table_gpll0_out_even[] = {
+       { 0x1, 2 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv gpll0_out_even = {
+       .offset = 0x0,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_gpll0_out_even,
+       .num_post_div = ARRAY_SIZE(post_div_table_gpll0_out_even),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll0_out_even",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll0.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_fabia_ops,
+       },
+};
+
+static const struct clk_div_table post_div_table_gpll0_out_odd[] = {
+       { 0x3, 3 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv gpll0_out_odd = {
+       .offset = 0x0,
+       .post_div_shift = 12,
+       .post_div_table = post_div_table_gpll0_out_odd,
+       .num_post_div = ARRAY_SIZE(post_div_table_gpll0_out_odd),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll0_out_odd",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll0.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_fabia_ops,
+       },
+};
+
+static struct clk_alpha_pll gpll6 = {
+       .offset = 0x6000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
+       .clkr = {
+               .enable_reg = 0x52010,
+               .enable_mask = BIT(6),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll6",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gpll0.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_fixed_fabia_ops,
+               },
+       },
+};
+
+static const struct clk_div_table post_div_table_gpll6_out_even[] = {
+       { 0x1, 2 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv gpll6_out_even = {
+       .offset = 0x6000,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_gpll6_out_even,
+       .num_post_div = ARRAY_SIZE(post_div_table_gpll6_out_even),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll6_out_even",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll0.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_fabia_ops,
+       },
+};
+
+static struct clk_alpha_pll gpll7 = {
+       .offset = 0x7000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
+       .clkr = {
+               .enable_reg = 0x52010,
+               .enable_mask = BIT(7),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll7",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gpll0.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_fixed_fabia_ops,
+               },
+       },
+};
+
+static const struct parent_map gcc_parent_map_0[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL6_OUT_EVEN, 2 },
+       { P_GPLL0_OUT_EVEN, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_0[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll6_out_even.clkr.hw },
+       { .hw = &gpll0_out_even.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_1[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_EVEN, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_1[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll0_out_even.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_2[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_ODD, 2 },
+};
+
+static const struct clk_parent_data gcc_parent_data_2[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll0_out_odd.clkr.hw },
+};
+static const struct clk_parent_data gcc_parent_data_2_ao[] = {
+       { .fw_name = "bi_tcxo_ao" },
+       { .hw = &gpll0_out_odd.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_4[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL0_OUT_ODD, 2 },
+};
+
+static const struct clk_parent_data gcc_parent_data_4[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_odd.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_5[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_ODD, 2 },
+       { P_SLEEP_CLK, 5 },
+       { P_GPLL0_OUT_EVEN, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_5[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll0_out_odd.clkr.hw },
+       { .fw_name = "sleep_clk" },
+       { .hw = &gpll0_out_even.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_6[] = {
+       { P_BI_TCXO, 0 },
+       { P_SLEEP_CLK, 5 },
+};
+
+static const struct clk_parent_data gcc_parent_data_6[] = {
+       { .fw_name = "bi_tcxo" },
+       { .fw_name = "sleep_clk" }
+};
+
+static const struct parent_map gcc_parent_map_7[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL6_OUT_EVEN, 2 },
+       { P_GPLL0_OUT_EVEN, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_7[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll6_out_even.clkr.hw },
+       { .hw = &gpll0_out_even.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_8[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_ODD, 2 },
+       { P_GPLL7_OUT_MAIN, 3 },
+};
+
+static const struct clk_parent_data gcc_parent_data_8[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpll0_out_odd.clkr.hw },
+       { .hw = &gpll7.clkr.hw },
+};
+
+static struct clk_regmap_div gcc_gpu_gpll0_main_div_clk_src = {
+       .reg = 0x4514C,
+       .shift = 0,
+       .width = 2,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gcc_gpu_gpll0_main_div_clk_src",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll0.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_regmap_div_ro_ops,
+       },
+};
+
+static struct clk_regmap_div gcc_npu_pll0_main_div_clk_src = {
+       .reg = 0x4ce00,
+       .shift = 0,
+       .width = 2,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gcc_npu_pll0_main_div_clk_src",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll0.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_regmap_div_ro_ops,
+       },
+};
+
+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 = 0x30014,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_2,
+       .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_2_ao,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_2_ao),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_gp1_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0),
+       F(50000000, P_GPLL0_OUT_ODD, 4, 0, 0),
+       F(100000000, P_GPLL0_OUT_ODD, 2, 0, 0),
+       F(200000000, P_GPLL0_OUT_ODD, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_gp1_clk_src = {
+       .cmd_rcgr = 0x37004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_5,
+       .freq_tbl = ftbl_gcc_gp1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_gp1_clk_src",
+               .parent_data = gcc_parent_data_5,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_5),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_gp2_clk_src = {
+       .cmd_rcgr = 0x38004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_5,
+       .freq_tbl = ftbl_gcc_gp1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_gp2_clk_src",
+               .parent_data = gcc_parent_data_5,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_5),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_gp3_clk_src = {
+       .cmd_rcgr = 0x39004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_5,
+       .freq_tbl = ftbl_gcc_gp1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_gp3_clk_src",
+               .parent_data = gcc_parent_data_5,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_5),
+               .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_EVEN, 5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_pdm2_clk_src = {
+       .cmd_rcgr = 0x23010,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_1,
+       .freq_tbl = ftbl_gcc_pdm2_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_pdm2_clk_src",
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_qupv3_wrap0_s0_clk_src[] = {
+       F(7372800, P_GPLL0_OUT_EVEN, 1, 384, 15625),
+       F(14745600, P_GPLL0_OUT_EVEN, 1, 768, 15625),
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(29491200, P_GPLL0_OUT_EVEN, 1, 1536, 15625),
+       F(32000000, P_GPLL0_OUT_EVEN, 1, 8, 75),
+       F(48000000, P_GPLL0_OUT_EVEN, 1, 4, 25),
+       F(64000000, P_GPLL0_OUT_EVEN, 1, 16, 75),
+       F(75000000, P_GPLL0_OUT_EVEN, 4, 0, 0),
+       F(80000000, P_GPLL0_OUT_EVEN, 1, 4, 15),
+       F(96000000, P_GPLL0_OUT_EVEN, 1, 8, 25),
+       F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0),
+       F(102400000, P_GPLL0_OUT_EVEN, 1, 128, 375),
+       F(112000000, P_GPLL0_OUT_EVEN, 1, 28, 75),
+       F(117964800, P_GPLL0_OUT_EVEN, 1, 6144, 15625),
+       F(120000000, P_GPLL0_OUT_EVEN, 2.5, 0, 0),
+       F(128000000, P_GPLL6_OUT_EVEN, 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_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap0_s0_clk_src = {
+       .cmd_rcgr = 0x21148,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .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_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap0_s1_clk_src = {
+       .cmd_rcgr = 0x21278,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .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_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap0_s2_clk_src = {
+       .cmd_rcgr = 0x213a8,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .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_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap0_s3_clk_src = {
+       .cmd_rcgr = 0x214d8,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .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_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap0_s4_clk_src = {
+       .cmd_rcgr = 0x21608,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .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_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap0_s5_clk_src = {
+       .cmd_rcgr = 0x21738,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap0_s5_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap1_s0_clk_src_init = {
+       .name = "gcc_qupv3_wrap1_s0_clk_src",
+       .parent_data = gcc_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap1_s0_clk_src = {
+       .cmd_rcgr = 0x22018,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap1_s0_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap1_s1_clk_src_init = {
+       .name = "gcc_qupv3_wrap1_s1_clk_src",
+       .parent_data = gcc_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap1_s1_clk_src = {
+       .cmd_rcgr = 0x22148,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap1_s1_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap1_s2_clk_src_init = {
+       .name = "gcc_qupv3_wrap1_s2_clk_src",
+       .parent_data = gcc_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap1_s2_clk_src = {
+       .cmd_rcgr = 0x22278,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap1_s2_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap1_s3_clk_src_init = {
+       .name = "gcc_qupv3_wrap1_s3_clk_src",
+       .parent_data = gcc_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap1_s3_clk_src = {
+       .cmd_rcgr = 0x223a8,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap1_s3_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap1_s4_clk_src_init = {
+       .name = "gcc_qupv3_wrap1_s4_clk_src",
+       .parent_data = gcc_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap1_s4_clk_src = {
+       .cmd_rcgr = 0x224d8,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap1_s4_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap1_s5_clk_src_init = {
+       .name = "gcc_qupv3_wrap1_s5_clk_src",
+       .parent_data = gcc_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap1_s5_clk_src = {
+       .cmd_rcgr = 0x22608,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap1_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(19200000, P_BI_TCXO, 1, 0, 0),
+       F(20000000, P_GPLL0_OUT_EVEN, 5, 1, 3),
+       F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0),
+       F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0),
+       F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0),
+       F(192000000, P_GPLL6_OUT_EVEN, 2, 0, 0),
+       F(384000000, P_GPLL6_OUT_EVEN, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_sdcc1_apps_clk_src = {
+       .cmd_rcgr = 0x4b024,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_7,
+       .freq_tbl = ftbl_gcc_sdcc1_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_sdcc1_apps_clk_src",
+               .parent_data = gcc_parent_data_7,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_7),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_sdcc1_ice_core_clk_src[] = {
+       F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0),
+       F(150000000, P_GPLL0_OUT_EVEN, 2, 0, 0),
+       F(300000000, P_GPLL0_OUT_EVEN, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_sdcc1_ice_core_clk_src = {
+       .cmd_rcgr = 0x4b00c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_1,
+       .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_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_sdcc2_apps_clk_src[] = {
+       F(400000, P_BI_TCXO, 12, 1, 4),
+       F(9600000, P_BI_TCXO, 2, 0, 0),
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(25000000, P_GPLL0_OUT_ODD, 8, 0, 0),
+       F(50000000, P_GPLL0_OUT_ODD, 4, 0, 0),
+       F(100000000, P_GPLL0_OUT_ODD, 2, 0, 0),
+       F(202000000, P_GPLL7_OUT_MAIN, 4, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_sdcc2_apps_clk_src = {
+       .cmd_rcgr = 0x2000c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_8,
+       .freq_tbl = ftbl_gcc_sdcc2_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_sdcc2_apps_clk_src",
+               .parent_data = gcc_parent_data_8,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_8),
+               .ops = &clk_rcg2_floor_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_ufs_phy_axi_clk_src[] = {
+       F(25000000, P_GPLL0_OUT_ODD, 8, 0, 0),
+       F(50000000, P_GPLL0_OUT_ODD, 4, 0, 0),
+       F(100000000, P_GPLL0_OUT_ODD, 2, 0, 0),
+       F(200000000, P_GPLL0_OUT_ODD, 1, 0, 0),
+       F(240000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_ufs_phy_axi_clk_src = {
+       .cmd_rcgr = 0x3a01c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_4,
+       .freq_tbl = ftbl_gcc_ufs_phy_axi_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_ufs_phy_axi_clk_src",
+               .parent_data = gcc_parent_data_4,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_4),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_ufs_phy_ice_core_clk_src[] = {
+       F(37500000, P_GPLL0_OUT_EVEN, 8, 0, 0),
+       F(75000000, P_GPLL0_OUT_EVEN, 4, 0, 0),
+       F(150000000, P_GPLL0_OUT_EVEN, 2, 0, 0),
+       F(300000000, P_GPLL0_OUT_EVEN, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_ufs_phy_ice_core_clk_src = {
+       .cmd_rcgr = 0x3a048,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_1,
+       .freq_tbl = ftbl_gcc_ufs_phy_ice_core_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_ufs_phy_ice_core_clk_src",
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_ufs_phy_phy_aux_clk_src[] = {
+       F(9600000, P_BI_TCXO, 2, 0, 0),
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_ufs_phy_phy_aux_clk_src = {
+       .cmd_rcgr = 0x3a0b0,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .freq_tbl = ftbl_gcc_ufs_phy_phy_aux_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_ufs_phy_phy_aux_clk_src",
+               .parent_data = &(const struct clk_parent_data){
+                       .fw_name = "bi_tcxo",
+               },
+               .num_parents = 1,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_ufs_phy_unipro_core_clk_src[] = {
+       F(37500000, P_GPLL0_OUT_EVEN, 8, 0, 0),
+       F(75000000, P_GPLL0_OUT_EVEN, 4, 0, 0),
+       F(150000000, P_GPLL0_OUT_EVEN, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_ufs_phy_unipro_core_clk_src = {
+       .cmd_rcgr = 0x3a060,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_1,
+       .freq_tbl = ftbl_gcc_ufs_phy_unipro_core_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_ufs_phy_unipro_core_clk_src",
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_usb30_prim_master_clk_src[] = {
+       F(66666667, P_GPLL0_OUT_ODD, 3, 0, 0),
+       F(133333333, P_GPLL0_OUT_MAIN, 4.5, 0, 0),
+       F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
+       F(240000000, P_GPLL0_OUT_MAIN, 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_4,
+       .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_parent_data_4,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_4),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+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,
+       .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 = &(const struct clk_parent_data){
+                       .fw_name = "bi_tcxo",
+               },
+               .num_parents = 1,
+               .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_6,
+       .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_parent_data_6,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_6),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_aggre_ufs_phy_axi_clk = {
+       .halt_reg = 0x3e014,
+       .halt_check = BRANCH_HALT_DELAY,
+       .hwcg_reg = 0x3e014,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x3e014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_aggre_ufs_phy_axi_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_ufs_phy_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_aggre_ufs_phy_axi_hw_ctl_clk = {
+       .halt_reg = 0x3e014,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x3e014,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x3e014,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_aggre_ufs_phy_axi_hw_ctl_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_ufs_phy_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_axi_hw_ctl_clk = {
+       .halt_reg = 0x3e014,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x3e014,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x3e014,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_axi_hw_ctl_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_ufs_phy_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_aggre_usb3_prim_axi_clk = {
+       .halt_reg = 0x3e010,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x3e010,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x3e010,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_aggre_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_boot_rom_ahb_clk = {
+       .halt_reg = 0x26004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x26004,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x52000,
+               .enable_mask = BIT(28),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_boot_rom_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camera_ahb_clk = {
+       .halt_reg = 0x17008,
+       .halt_check = BRANCH_HALT,
+       .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_axi_clk = {
+       .halt_reg = 0x17018,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x17018,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x17018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camera_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camera_throttle_nrt_axi_clk = {
+       .halt_reg = 0x17078,
+       .halt_check = BRANCH_VOTED,
+       .hwcg_reg = 0x17078,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x17078,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camera_throttle_nrt_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camera_throttle_rt_axi_clk = {
+       .halt_reg = 0x17024,
+       .halt_check = BRANCH_VOTED,
+       .hwcg_reg = 0x17024,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x17024,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camera_throttle_rt_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camera_xo_clk = {
+       .halt_reg = 0x17030,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x17030,
+               .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_ce1_ahb_clk = {
+       .halt_reg = 0x2b00c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x2b00c,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x52008,
+               .enable_mask = BIT(3),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ce1_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ce1_axi_clk = {
+       .halt_reg = 0x2b008,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52008,
+               .enable_mask = BIT(2),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ce1_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ce1_clk = {
+       .halt_reg = 0x2b004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52008,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ce1_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_cfg_noc_usb3_prim_axi_clk = {
+       .halt_reg = 0x1101c,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x1101c,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x1101c,
+               .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_cpuss_ahb_clk = {
+       .halt_reg = 0x30000,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x30000,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x52008,
+               .enable_mask = BIT(4),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_cpuss_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_cpuss_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_cpuss_gnoc_clk = {
+       .halt_reg = 0x30004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x30004,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x52008,
+               .enable_mask = BIT(5),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_cpuss_gnoc_clk",
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_cpuss_rbcpr_clk = {
+       .halt_reg = 0x30008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x30008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_cpuss_rbcpr_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ddrss_gpu_axi_clk = {
+       .halt_reg = 0x2d038,
+       .halt_check = BRANCH_VOTED,
+       .hwcg_reg = 0x2d038,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x2d038,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ddrss_gpu_axi_clk",
+                       .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_branch gcc_disp_axi_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_disp_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_disp_cc_sleep_clk = {
+       .halt_reg = 0x17074,
+       .halt_check = BRANCH_HALT_DELAY,
+       .hwcg_reg = 0x17074,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x17074,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_disp_cc_sleep_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_disp_cc_xo_clk = {
+       .halt_reg = 0x17070,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x17070,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x17070,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_disp_cc_xo_clk",
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_disp_gpll0_clk = {
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x52000,
+               .enable_mask = BIT(2),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_disp_gpll0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gpll0.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_disp_throttle_axi_clk = {
+       .halt_reg = 0x17028,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x17028,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x17028,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_disp_throttle_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_disp_xo_clk = {
+       .halt_reg = 0x17034,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x17034,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_disp_xo_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gp1_clk = {
+       .halt_reg = 0x37000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x37000,
+               .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 = 0x38000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x38000,
+               .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 = 0x39000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x39000,
+               .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 = 0x45004,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x45004,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .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 = {
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x52008,
+               .enable_mask = BIT(7),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gpu_gpll0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gpll0.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gpu_gpll0_div_clk = {
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x52008,
+               .enable_mask = BIT(8),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gpu_gpll0_div_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_gpu_gpll0_main_div_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gpu_memnoc_gfx_clk = {
+       .halt_reg = 0x4500c,
+       .halt_check = BRANCH_VOTED,
+       .hwcg_reg = 0x4500c,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x4500c,
+               .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 = 0x45014,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x45014,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x45014,
+               .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_npu_axi_clk = {
+       .halt_reg = 0x4c008,
+       .halt_check = BRANCH_VOTED,
+       .hwcg_reg = 0x4c008,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x4c008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_npu_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_npu_bwmon_axi_clk = {
+       .halt_reg = 0x4d004,
+       .halt_check = BRANCH_HALT_DELAY,
+       .hwcg_reg = 0x4d004,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x4d004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_npu_bwmon_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_npu_bwmon_dma_cfg_ahb_clk = {
+       .halt_reg = 0x4d008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_npu_bwmon_dma_cfg_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_npu_bwmon_dsp_cfg_ahb_clk = {
+       .halt_reg = 0x4d00c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d00c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_npu_bwmon_dsp_cfg_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_npu_cfg_ahb_clk = {
+       .halt_reg = 0x4c004,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x4c004,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x4c004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_npu_cfg_ahb_clk",
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_npu_dma_clk = {
+       .halt_reg = 0x4c140,
+       .halt_check = BRANCH_VOTED,
+       .hwcg_reg = 0x4c140,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x4c140,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_npu_dma_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_npu_gpll0_clk = {
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x52008,
+               .enable_mask = BIT(9),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_npu_gpll0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gpll0.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_npu_gpll0_div_clk = {
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x52008,
+               .enable_mask = BIT(10),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_npu_gpll0_div_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_npu_pll0_main_div_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pdm2_clk = {
+       .halt_reg = 0x2300c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2300c,
+               .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 = 0x23004,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x23004,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x23004,
+               .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 = 0x23008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x23008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pdm_xo4_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_prng_ahb_clk = {
+       .halt_reg = 0x24004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x24004,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x52000,
+               .enable_mask = BIT(26),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_prng_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap0_core_2x_clk = {
+       .halt_reg = 0x21014,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52000,
+               .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 = 0x2100c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52000,
+               .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 = 0x21144,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52000,
+               .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 = 0x21274,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52000,
+               .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 = 0x213a4,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52000,
+               .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 = 0x214d4,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52000,
+               .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 = 0x21604,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52000,
+               .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 = 0x21734,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52000,
+               .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_wrap1_core_2x_clk = {
+       .halt_reg = 0x22004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52000,
+               .enable_mask = BIT(16),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap1_core_2x_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap1_core_clk = {
+       .halt_reg = 0x22008,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52000,
+               .enable_mask = BIT(17),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap1_core_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap1_s0_clk = {
+       .halt_reg = 0x22014,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52000,
+               .enable_mask = BIT(20),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap1_s0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_qupv3_wrap1_s0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap1_s1_clk = {
+       .halt_reg = 0x22144,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52000,
+               .enable_mask = BIT(21),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap1_s1_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_qupv3_wrap1_s1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap1_s2_clk = {
+       .halt_reg = 0x22274,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52000,
+               .enable_mask = BIT(22),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap1_s2_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_qupv3_wrap1_s2_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap1_s3_clk = {
+       .halt_reg = 0x223a4,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52000,
+               .enable_mask = BIT(23),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap1_s3_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_qupv3_wrap1_s3_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap1_s4_clk = {
+       .halt_reg = 0x224d4,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52000,
+               .enable_mask = BIT(24),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap1_s4_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_qupv3_wrap1_s4_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap1_s5_clk = {
+       .halt_reg = 0x22604,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52000,
+               .enable_mask = BIT(25),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap1_s5_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_qupv3_wrap1_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 = 0x21004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x21004,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x52000,
+               .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 = 0x21008,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x21008,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x52000,
+               .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_qupv3_wrap_1_m_ahb_clk = {
+       .halt_reg = 0x2200c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x2200c,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x52000,
+               .enable_mask = BIT(18),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap_1_m_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap_1_s_ahb_clk = {
+       .halt_reg = 0x22010,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x22010,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x52000,
+               .enable_mask = BIT(19),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap_1_s_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sdcc1_ahb_clk = {
+       .halt_reg = 0x4b004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4b004,
+               .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 = 0x4b008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4b008,
+               .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 = 0x4b03c,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x4b03c,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x4b03c,
+               .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 = 0x20008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x20008,
+               .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 = 0x20004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x20004,
+               .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 = 0x10140,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x10140,
+       .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_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_mem_clkref_clk = {
+       .halt_reg = 0x8c000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8c000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_mem_clkref_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_ahb_clk = {
+       .halt_reg = 0x3a00c,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x3a00c,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x3a00c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_axi_clk = {
+       .halt_reg = 0x3a034,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x3a034,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x3a034,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_axi_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_ufs_phy_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_ice_core_clk = {
+       .halt_reg = 0x3a0a4,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x3a0a4,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x3a0a4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_ice_core_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_ufs_phy_ice_core_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_ice_core_hw_ctl_clk = {
+       .halt_reg = 0x3a0a4,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x3a0a4,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x3a0a4,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_ice_core_hw_ctl_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_ufs_phy_ice_core_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_phy_aux_clk = {
+       .halt_reg = 0x3a0ac,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x3a0ac,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x3a0ac,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_phy_aux_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_ufs_phy_phy_aux_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_phy_aux_hw_ctl_clk = {
+       .halt_reg = 0x3a0ac,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x3a0ac,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x3a0ac,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_phy_aux_hw_ctl_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_ufs_phy_phy_aux_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_rx_symbol_0_clk = {
+       .halt_reg = 0x3a014,
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x3a014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_rx_symbol_0_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_rx_symbol_1_clk = {
+       .halt_reg = 0x3a018,
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x3a018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_rx_symbol_1_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_tx_symbol_0_clk = {
+       .halt_reg = 0x3a010,
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x3a010,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_tx_symbol_0_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_unipro_core_clk = {
+       .halt_reg = 0x3a09c,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x3a09c,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x3a09c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_unipro_core_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_ufs_phy_unipro_core_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_unipro_core_hw_ctl_clk = {
+       .halt_reg = 0x3a09c,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x3a09c,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x3a09c,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_unipro_core_hw_ctl_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_ufs_phy_unipro_core_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 = 0x1a00c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1a00c,
+               .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_clk_src.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 = 0x8c010,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8c010,
+               .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_aux_clk = {
+       .halt_reg = 0x1a050,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1a050,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb3_prim_phy_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_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_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",
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_video_axi_clk = {
+       .halt_reg = 0x17014,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x17014,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x17014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_video_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_video_throttle_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_video_throttle_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_video_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_video_xo_clk",
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct gdsc usb30_prim_gdsc = {
+       .gdscr = 0x1a004,
+       .pd = {
+               .name = "usb30_prim_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc ufs_phy_gdsc = {
+       .gdscr = 0x3a004,
+       .pd = {
+               .name = "ufs_phy_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc = {
+       .gdscr = 0xb7040,
+       .pd = {
+               .name = "hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE,
+};
+
+static struct gdsc hlos1_vote_mmnoc_mmu_tbu_hf1_gdsc = {
+       .gdscr = 0xb7044,
+       .pd = {
+               .name = "hlos1_vote_mmnoc_mmu_tbu_hf1_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE,
+};
+
+static struct clk_regmap *gcc_sm6350_clocks[] = {
+       [GCC_AGGRE_UFS_PHY_AXI_CLK] = &gcc_aggre_ufs_phy_axi_clk.clkr,
+       [GCC_AGGRE_USB3_PRIM_AXI_CLK] = &gcc_aggre_usb3_prim_axi_clk.clkr,
+       [GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr,
+       [GCC_CAMERA_AHB_CLK] = &gcc_camera_ahb_clk.clkr,
+       [GCC_CAMERA_AXI_CLK] = &gcc_camera_axi_clk.clkr,
+       [GCC_CAMERA_THROTTLE_NRT_AXI_CLK] =
+               &gcc_camera_throttle_nrt_axi_clk.clkr,
+       [GCC_CAMERA_THROTTLE_RT_AXI_CLK] = &gcc_camera_throttle_rt_axi_clk.clkr,
+       [GCC_CAMERA_XO_CLK] = &gcc_camera_xo_clk.clkr,
+       [GCC_CE1_AHB_CLK] = &gcc_ce1_ahb_clk.clkr,
+       [GCC_CE1_AXI_CLK] = &gcc_ce1_axi_clk.clkr,
+       [GCC_CE1_CLK] = &gcc_ce1_clk.clkr,
+       [GCC_CFG_NOC_USB3_PRIM_AXI_CLK] = &gcc_cfg_noc_usb3_prim_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_GNOC_CLK] = &gcc_cpuss_gnoc_clk.clkr,
+       [GCC_CPUSS_RBCPR_CLK] = &gcc_cpuss_rbcpr_clk.clkr,
+       [GCC_DDRSS_GPU_AXI_CLK] = &gcc_ddrss_gpu_axi_clk.clkr,
+       [GCC_DISP_AHB_CLK] = &gcc_disp_ahb_clk.clkr,
+       [GCC_DISP_AXI_CLK] = &gcc_disp_axi_clk.clkr,
+       [GCC_DISP_CC_SLEEP_CLK] = &gcc_disp_cc_sleep_clk.clkr,
+       [GCC_DISP_CC_XO_CLK] = &gcc_disp_cc_xo_clk.clkr,
+       [GCC_DISP_GPLL0_CLK] = &gcc_disp_gpll0_clk.clkr,
+       [GCC_DISP_THROTTLE_AXI_CLK] = &gcc_disp_throttle_axi_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] = &gcc_gpu_gpll0_clk.clkr,
+       [GCC_GPU_GPLL0_DIV_CLK] = &gcc_gpu_gpll0_div_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_NPU_AXI_CLK] = &gcc_npu_axi_clk.clkr,
+       [GCC_NPU_BWMON_AXI_CLK] = &gcc_npu_bwmon_axi_clk.clkr,
+       [GCC_NPU_BWMON_DMA_CFG_AHB_CLK] = &gcc_npu_bwmon_dma_cfg_ahb_clk.clkr,
+       [GCC_NPU_BWMON_DSP_CFG_AHB_CLK] = &gcc_npu_bwmon_dsp_cfg_ahb_clk.clkr,
+       [GCC_NPU_CFG_AHB_CLK] = &gcc_npu_cfg_ahb_clk.clkr,
+       [GCC_NPU_DMA_CLK] = &gcc_npu_dma_clk.clkr,
+       [GCC_NPU_GPLL0_CLK] = &gcc_npu_gpll0_clk.clkr,
+       [GCC_NPU_GPLL0_DIV_CLK] = &gcc_npu_gpll0_div_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_PRNG_AHB_CLK] = &gcc_prng_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_WRAP1_CORE_2X_CLK] = &gcc_qupv3_wrap1_core_2x_clk.clkr,
+       [GCC_QUPV3_WRAP1_CORE_CLK] = &gcc_qupv3_wrap1_core_clk.clkr,
+       [GCC_QUPV3_WRAP1_S0_CLK] = &gcc_qupv3_wrap1_s0_clk.clkr,
+       [GCC_QUPV3_WRAP1_S0_CLK_SRC] = &gcc_qupv3_wrap1_s0_clk_src.clkr,
+       [GCC_QUPV3_WRAP1_S1_CLK] = &gcc_qupv3_wrap1_s1_clk.clkr,
+       [GCC_QUPV3_WRAP1_S1_CLK_SRC] = &gcc_qupv3_wrap1_s1_clk_src.clkr,
+       [GCC_QUPV3_WRAP1_S2_CLK] = &gcc_qupv3_wrap1_s2_clk.clkr,
+       [GCC_QUPV3_WRAP1_S2_CLK_SRC] = &gcc_qupv3_wrap1_s2_clk_src.clkr,
+       [GCC_QUPV3_WRAP1_S3_CLK] = &gcc_qupv3_wrap1_s3_clk.clkr,
+       [GCC_QUPV3_WRAP1_S3_CLK_SRC] = &gcc_qupv3_wrap1_s3_clk_src.clkr,
+       [GCC_QUPV3_WRAP1_S4_CLK] = &gcc_qupv3_wrap1_s4_clk.clkr,
+       [GCC_QUPV3_WRAP1_S4_CLK_SRC] = &gcc_qupv3_wrap1_s4_clk_src.clkr,
+       [GCC_QUPV3_WRAP1_S5_CLK] = &gcc_qupv3_wrap1_s5_clk.clkr,
+       [GCC_QUPV3_WRAP1_S5_CLK_SRC] = &gcc_qupv3_wrap1_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_QUPV3_WRAP_1_M_AHB_CLK] = &gcc_qupv3_wrap_1_m_ahb_clk.clkr,
+       [GCC_QUPV3_WRAP_1_S_AHB_CLK] = &gcc_qupv3_wrap_1_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_UFS_MEM_CLKREF_CLK] = &gcc_ufs_mem_clkref_clk.clkr,
+       [GCC_UFS_PHY_AHB_CLK] = &gcc_ufs_phy_ahb_clk.clkr,
+       [GCC_UFS_PHY_AXI_CLK] = &gcc_ufs_phy_axi_clk.clkr,
+       [GCC_UFS_PHY_AXI_CLK_SRC] = &gcc_ufs_phy_axi_clk_src.clkr,
+       [GCC_UFS_PHY_ICE_CORE_CLK] = &gcc_ufs_phy_ice_core_clk.clkr,
+       [GCC_UFS_PHY_ICE_CORE_CLK_SRC] = &gcc_ufs_phy_ice_core_clk_src.clkr,
+       [GCC_UFS_PHY_PHY_AUX_CLK] = &gcc_ufs_phy_phy_aux_clk.clkr,
+       [GCC_UFS_PHY_PHY_AUX_CLK_SRC] = &gcc_ufs_phy_phy_aux_clk_src.clkr,
+       [GCC_UFS_PHY_RX_SYMBOL_0_CLK] = &gcc_ufs_phy_rx_symbol_0_clk.clkr,
+       [GCC_UFS_PHY_RX_SYMBOL_1_CLK] = &gcc_ufs_phy_rx_symbol_1_clk.clkr,
+       [GCC_UFS_PHY_TX_SYMBOL_0_CLK] = &gcc_ufs_phy_tx_symbol_0_clk.clkr,
+       [GCC_UFS_PHY_UNIPRO_CORE_CLK] = &gcc_ufs_phy_unipro_core_clk.clkr,
+       [GCC_UFS_PHY_UNIPRO_CORE_CLK_SRC] =
+               &gcc_ufs_phy_unipro_core_clk_src.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_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] = &gcc_usb3_prim_phy_aux_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_VIDEO_AHB_CLK] = &gcc_video_ahb_clk.clkr,
+       [GCC_VIDEO_AXI_CLK] = &gcc_video_axi_clk.clkr,
+       [GCC_VIDEO_THROTTLE_AXI_CLK] = &gcc_video_throttle_axi_clk.clkr,
+       [GCC_VIDEO_XO_CLK] = &gcc_video_xo_clk.clkr,
+       [GPLL0] = &gpll0.clkr,
+       [GPLL0_OUT_EVEN] = &gpll0_out_even.clkr,
+       [GPLL0_OUT_ODD] = &gpll0_out_odd.clkr,
+       [GPLL6] = &gpll6.clkr,
+       [GPLL6_OUT_EVEN] = &gpll6_out_even.clkr,
+       [GPLL7] = &gpll7.clkr,
+       [GCC_UFS_PHY_PHY_AUX_HW_CTL_CLK] = &gcc_ufs_phy_phy_aux_hw_ctl_clk.clkr,
+       [GCC_UFS_PHY_AXI_HW_CTL_CLK] = &gcc_ufs_phy_axi_hw_ctl_clk.clkr,
+       [GCC_AGGRE_UFS_PHY_AXI_HW_CTL_CLK] =
+                               &gcc_aggre_ufs_phy_axi_hw_ctl_clk.clkr,
+       [GCC_UFS_PHY_UNIPRO_CORE_HW_CTL_CLK] =
+                               &gcc_ufs_phy_unipro_core_hw_ctl_clk.clkr,
+       [GCC_UFS_PHY_ICE_CORE_HW_CTL_CLK] =
+                               &gcc_ufs_phy_ice_core_hw_ctl_clk.clkr,
+       [GCC_GPU_GPLL0_MAIN_DIV_CLK_SRC] = &gcc_gpu_gpll0_main_div_clk_src.clkr,
+       [GCC_NPU_PLL0_MAIN_DIV_CLK_SRC] = &gcc_npu_pll0_main_div_clk_src.clkr,
+};
+
+static struct gdsc *gcc_sm6350_gdscs[] = {
+       [USB30_PRIM_GDSC] = &usb30_prim_gdsc,
+       [UFS_PHY_GDSC] = &ufs_phy_gdsc,
+       [HLOS1_VOTE_MMNOC_MMU_TBU_HF0_GDSC] = &hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc,
+       [HLOS1_VOTE_MMNOC_MMU_TBU_HF1_GDSC] = &hlos1_vote_mmnoc_mmu_tbu_hf1_gdsc,
+};
+
+static const struct qcom_reset_map gcc_sm6350_resets[] = {
+       [GCC_QUSB2PHY_PRIM_BCR] = { 0x1d000 },
+       [GCC_QUSB2PHY_SEC_BCR] = { 0x1e000 },
+       [GCC_SDCC1_BCR] = { 0x4b000 },
+       [GCC_SDCC2_BCR] = { 0x20000 },
+       [GCC_UFS_PHY_BCR] = { 0x3a000 },
+       [GCC_USB30_PRIM_BCR] = { 0x1a000 },
+       [GCC_USB3_PHY_PRIM_BCR] = { 0x1c000 },
+       [GCC_USB3_DP_PHY_PRIM_BCR] = { 0x1c008 },
+};
+
+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),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap1_s0_clk_src),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap1_s1_clk_src),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap1_s2_clk_src),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap1_s3_clk_src),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap1_s4_clk_src),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap1_s5_clk_src),
+};
+
+static const struct regmap_config gcc_sm6350_regmap_config = {
+       .reg_bits = 32,
+       .reg_stride = 4,
+       .val_bits = 32,
+       .max_register = 0xbf030,
+       .fast_io = true,
+};
+
+static const struct qcom_cc_desc gcc_sm6350_desc = {
+       .config = &gcc_sm6350_regmap_config,
+       .clks = gcc_sm6350_clocks,
+       .num_clks = ARRAY_SIZE(gcc_sm6350_clocks),
+       .resets = gcc_sm6350_resets,
+       .num_resets = ARRAY_SIZE(gcc_sm6350_resets),
+       .gdscs = gcc_sm6350_gdscs,
+       .num_gdscs = ARRAY_SIZE(gcc_sm6350_gdscs),
+};
+
+static const struct of_device_id gcc_sm6350_match_table[] = {
+       { .compatible = "qcom,gcc-sm6350" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, gcc_sm6350_match_table);
+
+static int gcc_sm6350_probe(struct platform_device *pdev)
+{
+       struct regmap *regmap;
+       int ret;
+
+       regmap = qcom_cc_map(pdev, &gcc_sm6350_desc);
+       if (IS_ERR(regmap))
+               return PTR_ERR(regmap);
+
+       /* Disable the GPLL0 active input to NPU and GPU via MISC registers */
+       regmap_update_bits(regmap, 0x4cf00, 0x3, 0x3);
+       regmap_update_bits(regmap, 0x45f00, 0x3, 0x3);
+
+       ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks,
+                       ARRAY_SIZE(gcc_dfs_clocks));
+       if (ret)
+               return ret;
+
+       return qcom_cc_really_probe(pdev, &gcc_sm6350_desc, regmap);;
+}
+
+static struct platform_driver gcc_sm6350_driver = {
+       .probe = gcc_sm6350_probe,
+       .driver = {
+               .name = "gcc-sm6350",
+               .of_match_table = gcc_sm6350_match_table,
+       },
+};
+
+static int __init gcc_sm6350_init(void)
+{
+       return platform_driver_register(&gcc_sm6350_driver);
+}
+core_initcall(gcc_sm6350_init);
+
+static void __exit gcc_sm6350_exit(void)
+{
+       platform_driver_unregister(&gcc_sm6350_driver);
+}
+module_exit(gcc_sm6350_exit);
+
+MODULE_DESCRIPTION("QTI GCC SM6350 Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/clk/qcom/gpucc-sc7280.c b/drivers/clk/qcom/gpucc-sc7280.c
new file mode 100644 (file)
index 0000000..9a832f2
--- /dev/null
@@ -0,0 +1,491 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+
+#include <dt-bindings/clock/qcom,gpucc-sc7280.h>
+
+#include "clk-alpha-pll.h"
+#include "clk-branch.h"
+#include "clk-rcg.h"
+#include "clk-regmap-divider.h"
+#include "common.h"
+#include "reset.h"
+#include "gdsc.h"
+
+enum {
+       P_BI_TCXO,
+       P_GCC_GPU_GPLL0_CLK_SRC,
+       P_GCC_GPU_GPLL0_DIV_CLK_SRC,
+       P_GPU_CC_PLL0_OUT_MAIN,
+       P_GPU_CC_PLL1_OUT_MAIN,
+};
+
+static const struct pll_vco lucid_vco[] = {
+       { 249600000, 2000000000, 0 },
+};
+
+static struct clk_alpha_pll gpu_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 = "gpu_cc_pll0",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "bi_tcxo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_lucid_ops,
+               },
+       },
+};
+
+/* 500MHz Configuration */
+static const struct alpha_pll_config gpu_cc_pll1_config = {
+       .l = 0x1A,
+       .alpha = 0xAAA,
+       .config_ctl_val = 0x20485699,
+       .config_ctl_hi_val = 0x00002261,
+       .config_ctl_hi1_val = 0x329A299C,
+       .user_ctl_val = 0x00000001,
+       .user_ctl_hi_val = 0x00000805,
+       .user_ctl_hi1_val = 0x00000000,
+};
+
+static struct clk_alpha_pll gpu_cc_pll1 = {
+       .offset = 0x100,
+       .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 = "gpu_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 parent_map gpu_cc_parent_map_0[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPU_CC_PLL0_OUT_MAIN, 1 },
+       { P_GPU_CC_PLL1_OUT_MAIN, 3 },
+       { P_GCC_GPU_GPLL0_CLK_SRC, 5 },
+       { P_GCC_GPU_GPLL0_DIV_CLK_SRC, 6 },
+};
+
+static const struct clk_parent_data gpu_cc_parent_data_0[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &gpu_cc_pll0.clkr.hw },
+       { .hw = &gpu_cc_pll1.clkr.hw },
+       { .fw_name = "gcc_gpu_gpll0_clk_src" },
+       { .fw_name = "gcc_gpu_gpll0_div_clk_src" },
+};
+
+static const struct parent_map gpu_cc_parent_map_1[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPU_CC_PLL1_OUT_MAIN, 3 },
+       { P_GCC_GPU_GPLL0_CLK_SRC, 5 },
+       { P_GCC_GPU_GPLL0_DIV_CLK_SRC, 6 },
+};
+
+static const struct clk_parent_data gpu_cc_parent_data_1[] = {
+       { .fw_name = "bi_tcxo", },
+       { .hw = &gpu_cc_pll1.clkr.hw },
+       { .fw_name = "gcc_gpu_gpll0_clk_src", },
+       { .fw_name = "gcc_gpu_gpll0_div_clk_src", },
+};
+
+static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(200000000, P_GCC_GPU_GPLL0_DIV_CLK_SRC, 1.5, 0, 0),
+       F(500000000, P_GPU_CC_PLL1_OUT_MAIN, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gpu_cc_gmu_clk_src = {
+       .cmd_rcgr = 0x1120,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gpu_cc_parent_map_0,
+       .freq_tbl = ftbl_gpu_cc_gmu_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpu_cc_gmu_clk_src",
+               .parent_data = gpu_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gpu_cc_parent_data_0),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gpu_cc_hub_clk_src[] = {
+       F(150000000, P_GCC_GPU_GPLL0_DIV_CLK_SRC, 2, 0, 0),
+       F(240000000, P_GCC_GPU_GPLL0_CLK_SRC, 2.5, 0, 0),
+       F(300000000, P_GCC_GPU_GPLL0_CLK_SRC, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gpu_cc_hub_clk_src = {
+       .cmd_rcgr = 0x117c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gpu_cc_parent_map_1,
+       .freq_tbl = ftbl_gpu_cc_hub_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpu_cc_hub_clk_src",
+               .parent_data = gpu_cc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gpu_cc_parent_data_1),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_regmap_div gpu_cc_hub_ahb_div_clk_src = {
+       .reg = 0x11c0,
+       .shift = 0,
+       .width = 4,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gpu_cc_hub_ahb_div_clk_src",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpu_cc_hub_clk_src.clkr.hw,
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_regmap_div_ro_ops,
+       },
+};
+
+static struct clk_regmap_div gpu_cc_hub_cx_int_div_clk_src = {
+       .reg = 0x11bc,
+       .shift = 0,
+       .width = 4,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gpu_cc_hub_cx_int_div_clk_src",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpu_cc_hub_clk_src.clkr.hw,
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_regmap_div_ro_ops,
+       },
+};
+
+static struct clk_branch gpu_cc_ahb_clk = {
+       .halt_reg = 0x1078,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x1078,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gpu_cc_hub_ahb_div_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_crc_ahb_clk = {
+       .halt_reg = 0x107c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x107c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_crc_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gpu_cc_hub_ahb_div_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_cx_gmu_clk = {
+       .halt_reg = 0x1098,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1098,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_cx_gmu_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gpu_cc_gmu_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_aon_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_cx_snoc_dvm_clk = {
+       .halt_reg = 0x108c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x108c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_cx_snoc_dvm_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_cxo_aon_clk = {
+       .halt_reg = 0x1004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x1004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_cxo_aon_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_cxo_clk = {
+       .halt_reg = 0x109c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x109c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_cxo_clk",
+                       .ops = &clk_branch2_aon_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_gx_gmu_clk = {
+       .halt_reg = 0x1064,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1064,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_gx_gmu_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gpu_cc_gmu_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_hlos1_vote_gpu_smmu_clk = {
+       .halt_reg = 0x5000,
+       .halt_check = BRANCH_VOTED,
+       .clkr = {
+               .enable_reg = 0x5000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_hlos1_vote_gpu_smmu_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_hub_aon_clk = {
+       .halt_reg = 0x1178,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1178,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_hub_aon_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gpu_cc_hub_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_aon_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_hub_cx_int_clk = {
+       .halt_reg = 0x1204,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1204,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_hub_cx_int_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gpu_cc_hub_cx_int_div_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_aon_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_mnd1x_0_gfx3d_clk = {
+       .halt_reg = 0x802c,
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x802c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_mnd1x_0_gfx3d_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_mnd1x_1_gfx3d_clk = {
+       .halt_reg = 0x8030,
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x8030,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_mnd1x_1_gfx3d_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_sleep_clk = {
+       .halt_reg = 0x1090,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x1090,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_sleep_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct gdsc cx_gdsc = {
+       .gdscr = 0x106c,
+       .gds_hw_ctrl = 0x1540,
+       .pd = {
+               .name = "cx_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE | RETAIN_FF_ENABLE,
+};
+
+static struct gdsc gx_gdsc = {
+       .gdscr = 0x100c,
+       .clamp_io_ctrl = 0x1508,
+       .pd = {
+               .name = "gx_gdsc",
+               .power_on = gdsc_gx_do_nothing_enable,
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = CLAMP_IO | RETAIN_FF_ENABLE,
+};
+
+static struct gdsc *gpu_cc_sc7180_gdscs[] = {
+       [GPU_CC_CX_GDSC] = &cx_gdsc,
+       [GPU_CC_GX_GDSC] = &gx_gdsc,
+};
+
+static struct clk_regmap *gpu_cc_sc7280_clocks[] = {
+       [GPU_CC_AHB_CLK] = &gpu_cc_ahb_clk.clkr,
+       [GPU_CC_CRC_AHB_CLK] = &gpu_cc_crc_ahb_clk.clkr,
+       [GPU_CC_CX_GMU_CLK] = &gpu_cc_cx_gmu_clk.clkr,
+       [GPU_CC_CX_SNOC_DVM_CLK] = &gpu_cc_cx_snoc_dvm_clk.clkr,
+       [GPU_CC_CXO_AON_CLK] = &gpu_cc_cxo_aon_clk.clkr,
+       [GPU_CC_CXO_CLK] = &gpu_cc_cxo_clk.clkr,
+       [GPU_CC_GMU_CLK_SRC] = &gpu_cc_gmu_clk_src.clkr,
+       [GPU_CC_GX_GMU_CLK] = &gpu_cc_gx_gmu_clk.clkr,
+       [GPU_CC_HLOS1_VOTE_GPU_SMMU_CLK] = &gpu_cc_hlos1_vote_gpu_smmu_clk.clkr,
+       [GPU_CC_HUB_AHB_DIV_CLK_SRC] = &gpu_cc_hub_ahb_div_clk_src.clkr,
+       [GPU_CC_HUB_AON_CLK] = &gpu_cc_hub_aon_clk.clkr,
+       [GPU_CC_HUB_CLK_SRC] = &gpu_cc_hub_clk_src.clkr,
+       [GPU_CC_HUB_CX_INT_CLK] = &gpu_cc_hub_cx_int_clk.clkr,
+       [GPU_CC_HUB_CX_INT_DIV_CLK_SRC] = &gpu_cc_hub_cx_int_div_clk_src.clkr,
+       [GPU_CC_MND1X_0_GFX3D_CLK] = &gpu_cc_mnd1x_0_gfx3d_clk.clkr,
+       [GPU_CC_MND1X_1_GFX3D_CLK] = &gpu_cc_mnd1x_1_gfx3d_clk.clkr,
+       [GPU_CC_PLL0] = &gpu_cc_pll0.clkr,
+       [GPU_CC_PLL1] = &gpu_cc_pll1.clkr,
+       [GPU_CC_SLEEP_CLK] = &gpu_cc_sleep_clk.clkr,
+};
+
+static const struct regmap_config gpu_cc_sc7280_regmap_config = {
+       .reg_bits = 32,
+       .reg_stride = 4,
+       .val_bits = 32,
+       .max_register = 0x8030,
+       .fast_io = true,
+};
+
+static const struct qcom_cc_desc gpu_cc_sc7280_desc = {
+       .config = &gpu_cc_sc7280_regmap_config,
+       .clks = gpu_cc_sc7280_clocks,
+       .num_clks = ARRAY_SIZE(gpu_cc_sc7280_clocks),
+       .gdscs = gpu_cc_sc7180_gdscs,
+       .num_gdscs = ARRAY_SIZE(gpu_cc_sc7180_gdscs),
+};
+
+static const struct of_device_id gpu_cc_sc7280_match_table[] = {
+       { .compatible = "qcom,sc7280-gpucc" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, gpu_cc_sc7280_match_table);
+
+static int gpu_cc_sc7280_probe(struct platform_device *pdev)
+{
+       struct regmap *regmap;
+
+       regmap = qcom_cc_map(pdev, &gpu_cc_sc7280_desc);
+       if (IS_ERR(regmap))
+               return PTR_ERR(regmap);
+
+       clk_lucid_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config);
+
+       /*
+        * Keep the clocks always-ON
+        * GPU_CC_CB_CLK, GPUCC_CX_GMU_CLK
+        */
+       regmap_update_bits(regmap, 0x1170, BIT(0), BIT(0));
+       regmap_update_bits(regmap, 0x1098, BIT(0), BIT(0));
+
+       return qcom_cc_really_probe(pdev, &gpu_cc_sc7280_desc, regmap);
+}
+
+static struct platform_driver gpu_cc_sc7280_driver = {
+       .probe = gpu_cc_sc7280_probe,
+       .driver = {
+               .name = "gpu_cc-sc7280",
+               .of_match_table = gpu_cc_sc7280_match_table,
+       },
+};
+
+static int __init gpu_cc_sc7280_init(void)
+{
+       return platform_driver_register(&gpu_cc_sc7280_driver);
+}
+subsys_initcall(gpu_cc_sc7280_init);
+
+static void __exit gpu_cc_sc7280_exit(void)
+{
+       platform_driver_unregister(&gpu_cc_sc7280_driver);
+}
+module_exit(gpu_cc_sc7280_exit);
+
+MODULE_DESCRIPTION("QTI GPU_CC SC7280 Driver");
+MODULE_LICENSE("GPL v2");
index 80fb6f7..8422fd0 100644 (file)
@@ -82,6 +82,14 @@ static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = {
        { }
 };
 
+static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src_sc8180x[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(200000000, P_GPLL0_OUT_MAIN_DIV, 1.5, 0, 0),
+       F(400000000, P_GPLL0_OUT_MAIN, 1.5, 0, 0),
+       F(500000000, P_GPU_CC_PLL1_OUT_MAIN, 1, 0, 0),
+       { }
+};
+
 static struct clk_rcg2 gpu_cc_gmu_clk_src = {
        .cmd_rcgr = 0x1120,
        .mnd_width = 0,
@@ -277,6 +285,7 @@ static const struct qcom_cc_desc gpu_cc_sm8150_desc = {
 };
 
 static const struct of_device_id gpu_cc_sm8150_match_table[] = {
+       { .compatible = "qcom,sc8180x-gpucc" },
        { .compatible = "qcom,sm8150-gpucc" },
        { }
 };
@@ -290,6 +299,9 @@ static int gpu_cc_sm8150_probe(struct platform_device *pdev)
        if (IS_ERR(regmap))
                return PTR_ERR(regmap);
 
+       if (of_device_is_compatible(pdev->dev.of_node, "qcom,sc8180x-gpucc"))
+               gpu_cc_gmu_clk_src.freq_tbl = ftbl_gpu_cc_gmu_clk_src_sc8180x;
+
        clk_trion_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config);
 
        return qcom_cc_really_probe(pdev, &gpu_cc_sm8150_desc, regmap);
index f5e31e6..96f476f 100644 (file)
@@ -251,15 +251,18 @@ static int lpass_gfm_clk_driver_probe(struct platform_device *pdev)
        if (IS_ERR(cc->base))
                return PTR_ERR(cc->base);
 
-       pm_runtime_enable(dev);
-       err = pm_clk_create(dev);
+       err = devm_pm_runtime_enable(dev);
        if (err)
-               goto pm_clk_err;
+               return err;
+
+       err = devm_pm_clk_create(dev);
+       if (err)
+               return err;
 
        err = of_pm_clk_add_clks(dev);
        if (err < 0) {
                dev_dbg(dev, "Failed to get lpass core voting clocks\n");
-               goto clk_reg_err;
+               return err;
        }
 
        for (i = 0; i < data->onecell_data->num; i++) {
@@ -273,22 +276,16 @@ static int lpass_gfm_clk_driver_probe(struct platform_device *pdev)
 
                err = devm_clk_hw_register(dev, &data->gfm_clks[i]->hw);
                if (err)
-                       goto clk_reg_err;
+                       return err;
 
        }
 
        err = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get,
                                          data->onecell_data);
        if (err)
-               goto clk_reg_err;
+               return err;
 
        return 0;
-
-clk_reg_err:
-       pm_clk_destroy(dev);
-pm_clk_err:
-       pm_runtime_disable(dev);
-       return err;
 }
 
 static const struct of_device_id lpass_gfm_clk_match_table[] = {
index 2e0ecc3..ac09b7b 100644 (file)
@@ -356,32 +356,18 @@ static const struct qcom_cc_desc lpass_audio_hm_sc7180_desc = {
        .num_gdscs = ARRAY_SIZE(lpass_audio_hm_sc7180_gdscs),
 };
 
-static void lpass_pm_runtime_disable(void *data)
-{
-       pm_runtime_disable(data);
-}
-
-static void lpass_pm_clk_destroy(void *data)
-{
-       pm_clk_destroy(data);
-}
-
 static int lpass_create_pm_clks(struct platform_device *pdev)
 {
        int ret;
 
        pm_runtime_use_autosuspend(&pdev->dev);
        pm_runtime_set_autosuspend_delay(&pdev->dev, 500);
-       pm_runtime_enable(&pdev->dev);
 
-       ret = devm_add_action_or_reset(&pdev->dev, lpass_pm_runtime_disable, &pdev->dev);
+       ret = devm_pm_runtime_enable(&pdev->dev);
        if (ret)
                return ret;
 
-       ret = pm_clk_create(&pdev->dev);
-       if (ret)
-               return ret;
-       ret = devm_add_action_or_reset(&pdev->dev, lpass_pm_clk_destroy, &pdev->dev);
+       ret = devm_pm_clk_create(&pdev->dev);
        if (ret)
                return ret;
 
diff --git a/drivers/clk/qcom/mmcc-msm8994.c b/drivers/clk/qcom/mmcc-msm8994.c
new file mode 100644 (file)
index 0000000..89c5f5f
--- /dev/null
@@ -0,0 +1,2620 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2021, Konrad Dybcio <konrad.dybcio@somainline.org>
+ */
+
+#include <linux/kernel.h>
+#include <linux/bitops.h>
+#include <linux/err.h>
+#include <linux/platform_device.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/clk-provider.h>
+#include <linux/regmap.h>
+#include <linux/reset-controller.h>
+#include <linux/clk.h>
+
+#include <dt-bindings/clock/qcom,mmcc-msm8994.h>
+
+#include "common.h"
+#include "clk-regmap.h"
+#include "clk-regmap-divider.h"
+#include "clk-alpha-pll.h"
+#include "clk-rcg.h"
+#include "clk-branch.h"
+#include "reset.h"
+#include "gdsc.h"
+
+
+enum {
+       P_XO,
+       P_GPLL0,
+       P_MMPLL0,
+       P_MMPLL1,
+       P_MMPLL3,
+       P_MMPLL4,
+       P_MMPLL5, /* Is this one even used by anything? Downstream doesn't tell. */
+       P_DSI0PLL,
+       P_DSI1PLL,
+       P_DSI0PLL_BYTE,
+       P_DSI1PLL_BYTE,
+       P_HDMIPLL,
+};
+static const struct parent_map mmcc_xo_gpll0_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 5 }
+};
+
+static const struct clk_parent_data mmcc_xo_gpll0[] = {
+       { .fw_name = "xo" },
+       { .fw_name = "gpll0" },
+};
+
+static const struct parent_map mmss_xo_hdmi_map[] = {
+       { P_XO, 0 },
+       { P_HDMIPLL, 3 }
+};
+
+static const struct clk_parent_data mmss_xo_hdmi[] = {
+       { .fw_name = "xo" },
+       { .fw_name = "hdmipll" },
+};
+
+static const struct parent_map mmcc_xo_dsi0pll_dsi1pll_map[] = {
+       { P_XO, 0 },
+       { P_DSI0PLL, 1 },
+       { P_DSI1PLL, 2 }
+};
+
+static const struct clk_parent_data mmcc_xo_dsi0pll_dsi1pll[] = {
+       { .fw_name = "xo" },
+       { .fw_name = "dsi0pll" },
+       { .fw_name = "dsi1pll" },
+};
+
+static const struct parent_map mmcc_xo_dsibyte_map[] = {
+       { P_XO, 0 },
+       { P_DSI0PLL_BYTE, 1 },
+       { P_DSI1PLL_BYTE, 2 }
+};
+
+static const struct clk_parent_data mmcc_xo_dsibyte[] = {
+       { .fw_name = "xo" },
+       { .fw_name = "dsi0pllbyte" },
+       { .fw_name = "dsi1pllbyte" },
+};
+
+static struct pll_vco mmpll_p_vco[] = {
+       { 250000000, 500000000, 3 },
+       { 500000000, 1000000000, 2 },
+       { 1000000000, 1500000000, 1 },
+       { 1500000000, 2000000000, 0 },
+};
+
+static struct pll_vco mmpll_t_vco[] = {
+       { 500000000, 1500000000, 0 },
+};
+
+static const struct alpha_pll_config mmpll_p_config = {
+       .post_div_mask = 0xf00,
+};
+
+static struct clk_alpha_pll mmpll0_early = {
+       .offset = 0x0,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .vco_table = mmpll_p_vco,
+       .num_vco = ARRAY_SIZE(mmpll_p_vco),
+       .clkr = {
+               .enable_reg = 0x100,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "mmpll0_early",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll_postdiv mmpll0 = {
+       .offset = 0x0,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .width = 4,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "mmpll0",
+               .parent_hws = (const struct clk_hw *[]){ &mmpll0_early.clkr.hw },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
+static struct clk_alpha_pll mmpll1_early = {
+       .offset = 0x30,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .vco_table = mmpll_p_vco,
+       .num_vco = ARRAY_SIZE(mmpll_p_vco),
+       .clkr = {
+               .enable_reg = 0x100,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data){
+                       .name = "mmpll1_early",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               }
+       },
+};
+
+static struct clk_alpha_pll_postdiv mmpll1 = {
+       .offset = 0x30,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .width = 4,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "mmpll1",
+               .parent_hws = (const struct clk_hw *[]){ &mmpll1_early.clkr.hw },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
+static struct clk_alpha_pll mmpll3_early = {
+       .offset = 0x60,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .vco_table = mmpll_p_vco,
+       .num_vco = ARRAY_SIZE(mmpll_p_vco),
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "mmpll3_early",
+               .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+               },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_ops,
+       },
+};
+
+static struct clk_alpha_pll_postdiv mmpll3 = {
+       .offset = 0x60,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .width = 4,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "mmpll3",
+               .parent_hws = (const struct clk_hw *[]){ &mmpll3_early.clkr.hw },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
+static struct clk_alpha_pll mmpll4_early = {
+       .offset = 0x90,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .vco_table = mmpll_t_vco,
+       .num_vco = ARRAY_SIZE(mmpll_t_vco),
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "mmpll4_early",
+               .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+               },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_ops,
+       },
+};
+
+static struct clk_alpha_pll_postdiv mmpll4 = {
+       .offset = 0x90,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .width = 2,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "mmpll4",
+               .parent_hws = (const struct clk_hw *[]){ &mmpll4_early.clkr.hw },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
+static const struct parent_map mmcc_xo_gpll0_mmpll1_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 5 },
+       { P_MMPLL1, 2 }
+};
+
+static const struct clk_parent_data mmcc_xo_gpll0_mmpll1[] = {
+       { .fw_name = "xo" },
+       { .fw_name = "gpll0" },
+       { .hw = &mmpll1.clkr.hw },
+};
+
+static const struct parent_map mmcc_xo_gpll0_mmpll0_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 5 },
+       { P_MMPLL0, 1 }
+};
+
+static const struct clk_parent_data mmcc_xo_gpll0_mmpll0[] = {
+       { .fw_name = "xo" },
+       { .fw_name = "gpll0" },
+       { .hw = &mmpll0.clkr.hw },
+};
+
+static const struct parent_map mmcc_xo_gpll0_mmpll0_mmpll3_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 5 },
+       { P_MMPLL0, 1 },
+       { P_MMPLL3, 3 }
+};
+
+static const struct clk_parent_data mmcc_xo_gpll0_mmpll0_mmpll3[] = {
+       { .fw_name = "xo" },
+       { .fw_name = "gpll0" },
+       { .hw = &mmpll0.clkr.hw },
+       { .hw = &mmpll3.clkr.hw },
+};
+
+static const struct parent_map mmcc_xo_gpll0_mmpll0_mmpll4_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 5 },
+       { P_MMPLL0, 1 },
+       { P_MMPLL4, 3 }
+};
+
+static const struct clk_parent_data mmcc_xo_gpll0_mmpll0_mmpll4[] = {
+       { .fw_name = "xo" },
+       { .fw_name = "gpll0" },
+       { .hw = &mmpll0.clkr.hw },
+       { .hw = &mmpll4.clkr.hw },
+};
+
+static struct clk_alpha_pll mmpll5_early = {
+       .offset = 0xc0,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .vco_table = mmpll_p_vco,
+       .num_vco = ARRAY_SIZE(mmpll_p_vco),
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "mmpll5_early",
+               .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+               },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_ops,
+       },
+};
+
+static struct clk_alpha_pll_postdiv mmpll5 = {
+       .offset = 0xc0,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .width = 4,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "mmpll5",
+               .parent_hws = (const struct clk_hw *[]){ &mmpll5_early.clkr.hw },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
+static const struct freq_tbl ftbl_ahb_clk_src[] = {
+       /* Note: There might be more frequencies desired here. */
+       F(19200000, P_XO, 1, 0, 0),
+       F(40000000, P_GPLL0, 15, 0, 0),
+       F(80000000, P_MMPLL0, 10, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 ahb_clk_src = {
+       .cmd_rcgr = 0x5000,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_mmpll0_map,
+       .freq_tbl = ftbl_ahb_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "ahb_clk_src",
+               .parent_data = mmcc_xo_gpll0_mmpll0,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_axi_clk_src[] = {
+       F(75000000, P_GPLL0, 8, 0, 0),
+       F(150000000, P_GPLL0, 4, 0, 0),
+       F(333430000, P_MMPLL1, 3.5, 0, 0),
+       F(466800000, P_MMPLL1, 2.5, 0, 0),
+       { }
+};
+
+static const struct freq_tbl ftbl_axi_clk_src_8992[] = {
+       F(75000000, P_GPLL0, 8, 0, 0),
+       F(150000000, P_GPLL0, 4, 0, 0),
+       F(300000000, P_GPLL0, 2, 0, 0),
+       F(404000000, P_MMPLL1, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 axi_clk_src = {
+       .cmd_rcgr = 0x5040,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_mmpll1_map,
+       .freq_tbl = ftbl_axi_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "axi_clk_src",
+               .parent_data = mmcc_xo_gpll0_mmpll1,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll1),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_csi0_1_2_3_clk_src[] = {
+       F(100000000, P_GPLL0, 6, 0, 0),
+       F(240000000, P_GPLL0, 2.5, 0, 0),
+       F(266670000, P_MMPLL0, 3, 0, 0),
+       { }
+};
+
+static const struct freq_tbl ftbl_csi0_1_2_3_clk_src_8992[] = {
+       F(100000000, P_GPLL0, 6, 0, 0),
+       F(266670000, P_MMPLL0, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 csi0_clk_src = {
+       .cmd_rcgr = 0x3090,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_mmpll0_map,
+       .freq_tbl = ftbl_csi0_1_2_3_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "csi0_clk_src",
+               .parent_data = mmcc_xo_gpll0_mmpll0,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_vcodec0_clk_src[] = {
+       F(66670000, P_GPLL0, 9, 0, 0),
+       F(100000000, P_GPLL0, 6, 0, 0),
+       F(133330000, P_GPLL0, 4.5, 0, 0),
+       F(150000000, P_GPLL0, 4, 0, 0),
+       F(200000000, P_MMPLL0, 4, 0, 0),
+       F(240000000, P_GPLL0, 2.5, 0, 0),
+       F(266670000, P_MMPLL0, 3, 0, 0),
+       F(320000000, P_MMPLL0, 2.5, 0, 0),
+       F(510000000, P_MMPLL3, 2, 0, 0),
+       { }
+};
+
+static const struct freq_tbl ftbl_vcodec0_clk_src_8992[] = {
+       F(66670000, P_GPLL0, 9, 0, 0),
+       F(100000000, P_GPLL0, 6, 0, 0),
+       F(133330000, P_GPLL0, 4.5, 0, 0),
+       F(200000000, P_MMPLL0, 4, 0, 0),
+       F(320000000, P_MMPLL0, 2.5, 0, 0),
+       F(510000000, P_MMPLL3, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 vcodec0_clk_src = {
+       .cmd_rcgr = 0x1000,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_mmpll0_mmpll3_map,
+       .freq_tbl = ftbl_vcodec0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "vcodec0_clk_src",
+               .parent_data = mmcc_xo_gpll0_mmpll0_mmpll3,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0_mmpll3),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 csi1_clk_src = {
+       .cmd_rcgr = 0x3100,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_mmpll0_map,
+       .freq_tbl = ftbl_csi0_1_2_3_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "csi1_clk_src",
+               .parent_data = mmcc_xo_gpll0_mmpll0,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 csi2_clk_src = {
+       .cmd_rcgr = 0x3160,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_mmpll0_map,
+       .freq_tbl = ftbl_csi0_1_2_3_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "csi2_clk_src",
+               .parent_data = mmcc_xo_gpll0_mmpll0,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 csi3_clk_src = {
+       .cmd_rcgr = 0x31c0,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_mmpll0_map,
+       .freq_tbl = ftbl_csi0_1_2_3_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "csi3_clk_src",
+               .parent_data = mmcc_xo_gpll0_mmpll0,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_vfe0_clk_src[] = {
+       F(80000000, P_GPLL0, 7.5, 0, 0),
+       F(100000000, P_GPLL0, 6, 0, 0),
+       F(200000000, P_GPLL0, 3, 0, 0),
+       F(320000000, P_MMPLL0, 2.5, 0, 0),
+       F(400000000, P_MMPLL0, 2, 0, 0),
+       F(480000000, P_MMPLL4, 2, 0, 0),
+       F(533330000, P_MMPLL0, 1.5, 0, 0),
+       F(600000000, P_GPLL0, 1, 0, 0),
+       { }
+};
+
+static const struct freq_tbl ftbl_vfe0_1_clk_src_8992[] = {
+       F(80000000, P_GPLL0, 7.5, 0, 0),
+       F(100000000, P_GPLL0, 6, 0, 0),
+       F(200000000, P_GPLL0, 3, 0, 0),
+       F(320000000, P_MMPLL0, 2.5, 0, 0),
+       F(480000000, P_MMPLL4, 2, 0, 0),
+       F(600000000, P_GPLL0, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 vfe0_clk_src = {
+       .cmd_rcgr = 0x3600,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_mmpll0_mmpll4_map,
+       .freq_tbl = ftbl_vfe0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "vfe0_clk_src",
+               .parent_data = mmcc_xo_gpll0_mmpll0_mmpll4,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0_mmpll4),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_vfe1_clk_src[] = {
+       F(80000000, P_GPLL0, 7.5, 0, 0),
+       F(100000000, P_GPLL0, 6, 0, 0),
+       F(200000000, P_GPLL0, 3, 0, 0),
+       F(320000000, P_MMPLL0, 2.5, 0, 0),
+       F(400000000, P_MMPLL0, 2, 0, 0),
+       F(533330000, P_MMPLL0, 1.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 vfe1_clk_src = {
+       .cmd_rcgr = 0x3620,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_mmpll0_mmpll4_map,
+       .freq_tbl = ftbl_vfe1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "vfe1_clk_src",
+               .parent_data = mmcc_xo_gpll0_mmpll0_mmpll4,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0_mmpll4),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_cpp_clk_src[] = {
+       F(100000000, P_GPLL0, 6, 0, 0),
+       F(200000000, P_GPLL0, 3, 0, 0),
+       F(320000000, P_MMPLL0, 2.5, 0, 0),
+       F(480000000, P_MMPLL4, 2, 0, 0),
+       F(600000000, P_GPLL0, 1, 0, 0),
+       F(640000000, P_MMPLL4, 1.5, 0, 0),
+       { }
+};
+
+static const struct freq_tbl ftbl_cpp_clk_src_8992[] = {
+       F(100000000, P_GPLL0, 6, 0, 0),
+       F(200000000, P_GPLL0, 3, 0, 0),
+       F(320000000, P_MMPLL0, 2.5, 0, 0),
+       F(480000000, P_MMPLL4, 2, 0, 0),
+       F(640000000, P_MMPLL4, 1.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cpp_clk_src = {
+       .cmd_rcgr = 0x3640,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_mmpll0_mmpll4_map,
+       .freq_tbl = ftbl_cpp_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cpp_clk_src",
+               .parent_data = mmcc_xo_gpll0_mmpll0_mmpll4,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0_mmpll4),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_jpeg0_1_clk_src[] = {
+       F(75000000, P_GPLL0, 8, 0, 0),
+       F(150000000, P_GPLL0, 4, 0, 0),
+       F(228570000, P_MMPLL0, 3.5, 0, 0),
+       F(266670000, P_MMPLL0, 3, 0, 0),
+       F(320000000, P_MMPLL0, 2.5, 0, 0),
+       F(480000000, P_MMPLL4, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 jpeg1_clk_src = {
+       .cmd_rcgr = 0x3520,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_mmpll0_mmpll4_map,
+       .freq_tbl = ftbl_jpeg0_1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "jpeg1_clk_src",
+               .parent_data = mmcc_xo_gpll0_mmpll0_mmpll4,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0_mmpll4),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_jpeg2_clk_src[] = {
+       F(75000000, P_GPLL0, 8, 0, 0),
+       F(133330000, P_GPLL0, 4.5, 0, 0),
+       F(150000000, P_GPLL0, 4, 0, 0),
+       F(228570000, P_MMPLL0, 3.5, 0, 0),
+       F(266670000, P_MMPLL0, 3, 0, 0),
+       F(320000000, P_MMPLL0, 2.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 jpeg2_clk_src = {
+       .cmd_rcgr = 0x3540,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_mmpll0_map,
+       .freq_tbl = ftbl_jpeg2_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "jpeg2_clk_src",
+               .parent_data = mmcc_xo_gpll0_mmpll0,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_csi2phytimer_clk_src[] = {
+       F(50000000, P_GPLL0, 12, 0, 0),
+       F(100000000, P_GPLL0, 6, 0, 0),
+       F(200000000, P_MMPLL0, 4, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 csi2phytimer_clk_src = {
+       .cmd_rcgr = 0x3060,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_mmpll0_map,
+       .freq_tbl = ftbl_csi2phytimer_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "csi2phytimer_clk_src",
+               .parent_data = mmcc_xo_gpll0_mmpll0,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_fd_core_clk_src[] = {
+       F(60000000, P_GPLL0, 10, 0, 0),
+       F(200000000, P_GPLL0, 3, 0, 0),
+       F(320000000, P_MMPLL0, 2.5, 0, 0),
+       F(400000000, P_MMPLL0, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 fd_core_clk_src = {
+       .cmd_rcgr = 0x3b00,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_mmpll0_map,
+       .freq_tbl = ftbl_fd_core_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "fd_core_clk_src",
+               .parent_data = mmcc_xo_gpll0_mmpll0,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_mdp_clk_src[] = {
+       F(85710000, P_GPLL0, 7, 0, 0),
+       F(100000000, P_GPLL0, 6, 0, 0),
+       F(120000000, P_GPLL0, 5, 0, 0),
+       F(150000000, P_GPLL0, 4, 0, 0),
+       F(171430000, P_GPLL0, 3.5, 0, 0),
+       F(200000000, P_GPLL0, 3, 0, 0),
+       F(240000000, P_GPLL0, 2.5, 0, 0),
+       F(266670000, P_MMPLL0, 3, 0, 0),
+       F(300000000, P_GPLL0, 2, 0, 0),
+       F(320000000, P_MMPLL0, 2.5, 0, 0),
+       F(400000000, P_MMPLL0, 2, 0, 0),
+       { }
+};
+
+static const struct freq_tbl ftbl_mdp_clk_src_8992[] = {
+       F(85710000, P_GPLL0, 7, 0, 0),
+       F(171430000, P_GPLL0, 3.5, 0, 0),
+       F(200000000, P_GPLL0, 3, 0, 0),
+       F(240000000, P_GPLL0, 2.5, 0, 0),
+       F(266670000, P_MMPLL0, 3, 0, 0),
+       F(320000000, P_MMPLL0, 2.5, 0, 0),
+       F(400000000, P_MMPLL0, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 mdp_clk_src = {
+       .cmd_rcgr = 0x2040,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_mmpll0_map,
+       .freq_tbl = ftbl_mdp_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "mdp_clk_src",
+               .parent_data = mmcc_xo_gpll0_mmpll0,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 pclk0_clk_src = {
+       .cmd_rcgr = 0x2000,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_dsi0pll_dsi1pll_map,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "pclk0_clk_src",
+               .parent_data = mmcc_xo_dsi0pll_dsi1pll,
+               .num_parents = ARRAY_SIZE(mmcc_xo_dsi0pll_dsi1pll),
+               .ops = &clk_pixel_ops,
+               .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
+       },
+};
+
+static struct clk_rcg2 pclk1_clk_src = {
+       .cmd_rcgr = 0x2020,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_dsi0pll_dsi1pll_map,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "pclk1_clk_src",
+               .parent_data = mmcc_xo_dsi0pll_dsi1pll,
+               .num_parents = ARRAY_SIZE(mmcc_xo_dsi0pll_dsi1pll),
+               .ops = &clk_pixel_ops,
+               .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
+       },
+};
+
+static const struct freq_tbl ftbl_ocmemnoc_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(75000000, P_GPLL0, 8, 0, 0),
+       F(100000000, P_GPLL0, 6, 0, 0),
+       F(150000000, P_GPLL0, 4, 0, 0),
+       F(228570000, P_MMPLL0, 3.5, 0, 0),
+       F(266670000, P_MMPLL0, 3, 0, 0),
+       F(320000000, P_MMPLL0, 2.5, 0, 0),
+       F(400000000, P_MMPLL0, 2, 0, 0),
+       { }
+};
+
+static const struct freq_tbl ftbl_ocmemnoc_clk_src_8992[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(75000000, P_GPLL0, 8, 0, 0),
+       F(100000000, P_GPLL0, 6, 0, 0),
+       F(150000000, P_GPLL0, 4, 0, 0),
+       F(320000000, P_MMPLL0, 2.5, 0, 0),
+       F(400000000, P_MMPLL0, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 ocmemnoc_clk_src = {
+       .cmd_rcgr = 0x5090,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_mmpll0_map,
+       .freq_tbl = ftbl_ocmemnoc_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "ocmemnoc_clk_src",
+               .parent_data = mmcc_xo_gpll0_mmpll0,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_cci_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(37500000, P_GPLL0, 16, 0, 0),
+       F(50000000, P_GPLL0, 12, 0, 0),
+       F(100000000, P_GPLL0, 6, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cci_clk_src = {
+       .cmd_rcgr = 0x3300,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_map,
+       .freq_tbl = ftbl_cci_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "cci_clk_src",
+               .parent_data = mmcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_mmss_gp0_1_clk_src[] = {
+       F(10000, P_XO, 16, 10, 120),
+       F(24000, P_GPLL0, 16, 1, 50),
+       F(6000000, P_GPLL0, 10, 1, 10),
+       F(12000000, P_GPLL0, 10, 1, 5),
+       F(13000000, P_GPLL0, 4, 13, 150),
+       F(24000000, P_GPLL0, 5, 1, 5),
+       { }
+};
+
+static struct clk_rcg2 mmss_gp0_clk_src = {
+       .cmd_rcgr = 0x3420,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_map,
+       .freq_tbl = ftbl_mmss_gp0_1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "mmss_gp0_clk_src",
+               .parent_data = mmcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 mmss_gp1_clk_src = {
+       .cmd_rcgr = 0x3450,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_map,
+       .freq_tbl = ftbl_mmss_gp0_1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "mmss_gp1_clk_src",
+               .parent_data = mmcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 jpeg0_clk_src = {
+       .cmd_rcgr = 0x3500,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_mmpll0_mmpll4_map,
+       .freq_tbl = ftbl_jpeg0_1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "jpeg0_clk_src",
+               .parent_data = mmcc_xo_gpll0_mmpll0_mmpll4,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0_mmpll4),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 jpeg_dma_clk_src = {
+       .cmd_rcgr = 0x3560,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_mmpll0_mmpll4_map,
+       .freq_tbl = ftbl_jpeg0_1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "jpeg_dma_clk_src",
+               .parent_data = mmcc_xo_gpll0_mmpll0_mmpll4,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0_mmpll4),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_mclk0_1_2_3_clk_src[] = {
+       F(4800000, P_XO, 4, 0, 0),
+       F(6000000, P_GPLL0, 10, 1, 10),
+       F(8000000, P_GPLL0, 15, 1, 5),
+       F(9600000, P_XO, 2, 0, 0),
+       F(16000000, P_MMPLL0, 10, 1, 5),
+       F(19200000, P_XO, 1, 0, 0),
+       F(24000000, P_GPLL0, 5, 1, 5),
+       F(32000000, P_MMPLL0, 5, 1, 5),
+       F(48000000, P_GPLL0, 12.5, 0, 0),
+       F(64000000, P_MMPLL0, 12.5, 0, 0),
+       { }
+};
+
+static const struct freq_tbl ftbl_mclk0_clk_src_8992[] = {
+       F(4800000, P_XO, 4, 0, 0),
+       F(6000000, P_MMPLL4, 10, 1, 16),
+       F(8000000, P_MMPLL4, 10, 1, 12),
+       F(9600000, P_XO, 2, 0, 0),
+       F(12000000, P_MMPLL4, 10, 1, 8),
+       F(16000000, P_MMPLL4, 10, 1, 6),
+       F(19200000, P_XO, 1, 0, 0),
+       F(24000000, P_MMPLL4, 10, 1, 4),
+       F(32000000, P_MMPLL4, 10, 1, 3),
+       F(48000000, P_MMPLL4, 10, 1, 2),
+       F(64000000, P_MMPLL4, 15, 0, 0),
+       { }
+};
+
+static const struct freq_tbl ftbl_mclk1_2_3_clk_src_8992[] = {
+       F(4800000, P_XO, 4, 0, 0),
+       F(6000000, P_MMPLL4, 10, 1, 16),
+       F(8000000, P_MMPLL4, 10, 1, 12),
+       F(9600000, P_XO, 2, 0, 0),
+       F(16000000, P_MMPLL4, 10, 1, 6),
+       F(19200000, P_XO, 1, 0, 0),
+       F(24000000, P_MMPLL4, 10, 1, 4),
+       F(32000000, P_MMPLL4, 10, 1, 3),
+       F(48000000, P_MMPLL4, 10, 1, 2),
+       F(64000000, P_MMPLL4, 15, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 mclk0_clk_src = {
+       .cmd_rcgr = 0x3360,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_mmpll0_map,
+       .freq_tbl = ftbl_mclk0_1_2_3_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "mclk0_clk_src",
+               .parent_data = mmcc_xo_gpll0_mmpll0,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 mclk1_clk_src = {
+       .cmd_rcgr = 0x3390,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_mmpll0_map,
+       .freq_tbl = ftbl_mclk0_1_2_3_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "mclk1_clk_src",
+               .parent_data = mmcc_xo_gpll0_mmpll0,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 mclk2_clk_src = {
+       .cmd_rcgr = 0x33c0,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_mmpll0_map,
+       .freq_tbl = ftbl_mclk0_1_2_3_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "mclk2_clk_src",
+               .parent_data = mmcc_xo_gpll0_mmpll0,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 mclk3_clk_src = {
+       .cmd_rcgr = 0x33f0,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_mmpll0_map,
+       .freq_tbl = ftbl_mclk0_1_2_3_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "mclk3_clk_src",
+               .parent_data = mmcc_xo_gpll0_mmpll0,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_csi0_1phytimer_clk_src[] = {
+       F(50000000, P_GPLL0, 12, 0, 0),
+       F(100000000, P_GPLL0, 6, 0, 0),
+       F(200000000, P_MMPLL0, 4, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 csi0phytimer_clk_src = {
+       .cmd_rcgr = 0x3000,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_mmpll0_map,
+       .freq_tbl = ftbl_csi0_1phytimer_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "csi0phytimer_clk_src",
+               .parent_data = mmcc_xo_gpll0_mmpll0,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 csi1phytimer_clk_src = {
+       .cmd_rcgr = 0x3030,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_mmpll0_map,
+       .freq_tbl = ftbl_csi0_1phytimer_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "csi1phytimer_clk_src",
+               .parent_data = mmcc_xo_gpll0_mmpll0,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0_mmpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 byte0_clk_src = {
+       .cmd_rcgr = 0x2120,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_dsibyte_map,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "byte0_clk_src",
+               .parent_data = mmcc_xo_dsibyte,
+               .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
+               .ops = &clk_byte2_ops,
+               .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
+       },
+};
+
+static struct clk_rcg2 byte1_clk_src = {
+       .cmd_rcgr = 0x2140,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_dsibyte_map,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "byte1_clk_src",
+               .parent_data = mmcc_xo_dsibyte,
+               .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
+               .ops = &clk_byte2_ops,
+               .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
+       },
+};
+
+static struct freq_tbl ftbl_mdss_esc0_1_clk[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 esc0_clk_src = {
+       .cmd_rcgr = 0x2160,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_dsibyte_map,
+       .freq_tbl = ftbl_mdss_esc0_1_clk,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "esc0_clk_src",
+               .parent_data = mmcc_xo_dsibyte,
+               .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 esc1_clk_src = {
+       .cmd_rcgr = 0x2180,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_dsibyte_map,
+       .freq_tbl = ftbl_mdss_esc0_1_clk,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "esc1_clk_src",
+               .parent_data = mmcc_xo_dsibyte,
+               .num_parents = ARRAY_SIZE(mmcc_xo_dsibyte),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct freq_tbl extpclk_freq_tbl[] = {
+       { .src = P_HDMIPLL },
+       { }
+};
+
+static struct clk_rcg2 extpclk_clk_src = {
+       .cmd_rcgr = 0x2060,
+       .hid_width = 5,
+       .parent_map = mmss_xo_hdmi_map,
+       .freq_tbl = extpclk_freq_tbl,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "extpclk_clk_src",
+               .parent_data = mmss_xo_hdmi,
+               .num_parents = ARRAY_SIZE(mmss_xo_hdmi),
+               .ops = &clk_rcg2_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
+static struct freq_tbl ftbl_hdmi_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 hdmi_clk_src = {
+       .cmd_rcgr = 0x2100,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_map,
+       .freq_tbl = ftbl_hdmi_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "hdmi_clk_src",
+               .parent_data = mmcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct freq_tbl ftbl_mdss_vsync_clk[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 vsync_clk_src = {
+       .cmd_rcgr = 0x2080,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_map,
+       .freq_tbl = ftbl_mdss_vsync_clk,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "vsync_clk_src",
+               .parent_data = mmcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_rbbmtimer_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 rbbmtimer_clk_src = {
+       .cmd_rcgr = 0x4090,
+       .hid_width = 5,
+       .parent_map = mmcc_xo_gpll0_map,
+       .freq_tbl = ftbl_rbbmtimer_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "rbbmtimer_clk_src",
+               .parent_data = mmcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(mmcc_xo_gpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch camss_ahb_clk = {
+       .halt_reg = 0x348c,
+       .clkr = {
+               .enable_reg = 0x348c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_cci_cci_ahb_clk = {
+       .halt_reg = 0x3348,
+       .clkr = {
+               .enable_reg = 0x3348,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_cci_cci_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_cci_cci_clk = {
+       .halt_reg = 0x3344,
+       .clkr = {
+               .enable_reg = 0x3344,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_cci_cci_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &cci_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_vfe_cpp_ahb_clk = {
+       .halt_reg = 0x36b4,
+       .clkr = {
+               .enable_reg = 0x36b4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_vfe_cpp_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_vfe_cpp_axi_clk = {
+       .halt_reg = 0x36c4,
+       .clkr = {
+               .enable_reg = 0x36c4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_vfe_cpp_axi_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_vfe_cpp_clk = {
+       .halt_reg = 0x36b0,
+       .clkr = {
+               .enable_reg = 0x36b0,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_vfe_cpp_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &cpp_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_csi0_ahb_clk = {
+       .halt_reg = 0x30bc,
+       .clkr = {
+               .enable_reg = 0x30bc,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_csi0_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_csi0_clk = {
+       .halt_reg = 0x30b4,
+       .clkr = {
+               .enable_reg = 0x30b4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_csi0_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_csi0phy_clk = {
+       .halt_reg = 0x30c4,
+       .clkr = {
+               .enable_reg = 0x30c4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_csi0phy_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_csi0pix_clk = {
+       .halt_reg = 0x30e4,
+       .clkr = {
+               .enable_reg = 0x30e4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_csi0pix_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_csi0rdi_clk = {
+       .halt_reg = 0x30d4,
+       .clkr = {
+               .enable_reg = 0x30d4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_csi0rdi_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &csi0_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_csi1_ahb_clk = {
+       .halt_reg = 0x3128,
+       .clkr = {
+               .enable_reg = 0x3128,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_csi1_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_csi1_clk = {
+       .halt_reg = 0x3124,
+       .clkr = {
+               .enable_reg = 0x3124,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_csi1_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_csi1phy_clk = {
+       .halt_reg = 0x3134,
+       .clkr = {
+               .enable_reg = 0x3134,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_csi1phy_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_csi1pix_clk = {
+       .halt_reg = 0x3154,
+       .clkr = {
+               .enable_reg = 0x3154,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_csi1pix_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_csi1rdi_clk = {
+       .halt_reg = 0x3144,
+       .clkr = {
+               .enable_reg = 0x3144,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_csi1rdi_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_csi2_ahb_clk = {
+       .halt_reg = 0x3188,
+       .clkr = {
+               .enable_reg = 0x3188,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_csi2_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_csi2_clk = {
+       .halt_reg = 0x3184,
+       .clkr = {
+               .enable_reg = 0x3184,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_csi2_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_csi2phy_clk = {
+       .halt_reg = 0x3194,
+       .clkr = {
+               .enable_reg = 0x3194,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_csi2phy_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_csi2pix_clk = {
+       .halt_reg = 0x31b4,
+       .clkr = {
+               .enable_reg = 0x31b4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_csi2pix_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_csi2rdi_clk = {
+       .halt_reg = 0x31a4,
+       .clkr = {
+               .enable_reg = 0x31a4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_csi2rdi_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_csi3_ahb_clk = {
+       .halt_reg = 0x31e8,
+       .clkr = {
+               .enable_reg = 0x31e8,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_csi3_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_csi3_clk = {
+       .halt_reg = 0x31e4,
+       .clkr = {
+               .enable_reg = 0x31e4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_csi3_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_csi3phy_clk = {
+       .halt_reg = 0x31f4,
+       .clkr = {
+               .enable_reg = 0x31f4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_csi3phy_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_csi3pix_clk = {
+       .halt_reg = 0x3214,
+       .clkr = {
+               .enable_reg = 0x3214,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_csi3pix_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_csi3rdi_clk = {
+       .halt_reg = 0x3204,
+       .clkr = {
+               .enable_reg = 0x3204,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_csi3rdi_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &csi1_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_csi_vfe0_clk = {
+       .halt_reg = 0x3704,
+       .clkr = {
+               .enable_reg = 0x3704,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_csi_vfe0_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &vfe0_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_csi_vfe1_clk = {
+       .halt_reg = 0x3714,
+       .clkr = {
+               .enable_reg = 0x3714,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_csi_vfe1_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &vfe1_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_gp0_clk = {
+       .halt_reg = 0x3444,
+       .clkr = {
+               .enable_reg = 0x3444,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_gp0_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &mmss_gp0_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_gp1_clk = {
+       .halt_reg = 0x3474,
+       .clkr = {
+               .enable_reg = 0x3474,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_gp1_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &mmss_gp1_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_ispif_ahb_clk = {
+       .halt_reg = 0x3224,
+       .clkr = {
+               .enable_reg = 0x3224,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_ispif_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_jpeg_dma_clk = {
+       .halt_reg = 0x35c0,
+       .clkr = {
+               .enable_reg = 0x35c0,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_jpeg_dma_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &jpeg_dma_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_jpeg_jpeg0_clk = {
+       .halt_reg = 0x35a8,
+       .clkr = {
+               .enable_reg = 0x35a8,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_jpeg_jpeg0_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &jpeg0_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_jpeg_jpeg1_clk = {
+       .halt_reg = 0x35ac,
+       .clkr = {
+               .enable_reg = 0x35ac,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_jpeg_jpeg1_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &jpeg1_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_jpeg_jpeg2_clk = {
+       .halt_reg = 0x35b0,
+       .clkr = {
+               .enable_reg = 0x35b0,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_jpeg_jpeg2_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &jpeg2_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_jpeg_jpeg_ahb_clk = {
+       .halt_reg = 0x35b4,
+       .clkr = {
+               .enable_reg = 0x35b4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_jpeg_jpeg_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_jpeg_jpeg_axi_clk = {
+       .halt_reg = 0x35b8,
+       .clkr = {
+               .enable_reg = 0x35b8,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_jpeg_jpeg_axi_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_mclk0_clk = {
+       .halt_reg = 0x3384,
+       .clkr = {
+               .enable_reg = 0x3384,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_mclk0_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &mclk0_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_mclk1_clk = {
+       .halt_reg = 0x33b4,
+       .clkr = {
+               .enable_reg = 0x33b4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_mclk1_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &mclk1_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_mclk2_clk = {
+       .halt_reg = 0x33e4,
+       .clkr = {
+               .enable_reg = 0x33e4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_mclk2_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &mclk2_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_mclk3_clk = {
+       .halt_reg = 0x3414,
+       .clkr = {
+               .enable_reg = 0x3414,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_mclk3_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &mclk3_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_micro_ahb_clk = {
+       .halt_reg = 0x3494,
+       .clkr = {
+               .enable_reg = 0x3494,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_micro_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_phy0_csi0phytimer_clk = {
+       .halt_reg = 0x3024,
+       .clkr = {
+               .enable_reg = 0x3024,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_phy0_csi0phytimer_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &csi0phytimer_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_phy1_csi1phytimer_clk = {
+       .halt_reg = 0x3054,
+       .clkr = {
+               .enable_reg = 0x3054,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_phy1_csi1phytimer_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &csi1phytimer_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_phy2_csi2phytimer_clk = {
+       .halt_reg = 0x3084,
+       .clkr = {
+               .enable_reg = 0x3084,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_phy2_csi2phytimer_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &csi2phytimer_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_top_ahb_clk = {
+       .halt_reg = 0x3484,
+       .clkr = {
+               .enable_reg = 0x3484,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_top_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_vfe_vfe0_clk = {
+       .halt_reg = 0x36a8,
+       .clkr = {
+               .enable_reg = 0x36a8,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_vfe_vfe0_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &vfe0_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_vfe_vfe1_clk = {
+       .halt_reg = 0x36ac,
+       .clkr = {
+               .enable_reg = 0x36ac,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_vfe_vfe1_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &vfe1_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_vfe_vfe_ahb_clk = {
+       .halt_reg = 0x36b8,
+       .clkr = {
+               .enable_reg = 0x36b8,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_vfe_vfe_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch camss_vfe_vfe_axi_clk = {
+       .halt_reg = 0x36bc,
+       .clkr = {
+               .enable_reg = 0x36bc,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "camss_vfe_vfe_axi_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch fd_ahb_clk = {
+       .halt_reg = 0x3b74,
+       .clkr = {
+               .enable_reg = 0x3b74,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "fd_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch fd_axi_clk = {
+       .halt_reg = 0x3b70,
+       .clkr = {
+               .enable_reg = 0x3b70,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "fd_axi_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch fd_core_clk = {
+       .halt_reg = 0x3b68,
+       .clkr = {
+               .enable_reg = 0x3b68,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "fd_core_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &fd_core_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch fd_core_uar_clk = {
+       .halt_reg = 0x3b6c,
+       .clkr = {
+               .enable_reg = 0x3b6c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "fd_core_uar_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &fd_core_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch mdss_ahb_clk = {
+       .halt_reg = 0x2308,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2308,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "mdss_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch mdss_axi_clk = {
+       .halt_reg = 0x2310,
+       .clkr = {
+               .enable_reg = 0x2310,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "mdss_axi_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch mdss_byte0_clk = {
+       .halt_reg = 0x233c,
+       .clkr = {
+               .enable_reg = 0x233c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "mdss_byte0_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &byte0_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch mdss_byte1_clk = {
+       .halt_reg = 0x2340,
+       .clkr = {
+               .enable_reg = 0x2340,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "mdss_byte1_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &byte1_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch mdss_esc0_clk = {
+       .halt_reg = 0x2344,
+       .clkr = {
+               .enable_reg = 0x2344,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "mdss_esc0_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &esc0_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch mdss_esc1_clk = {
+       .halt_reg = 0x2348,
+       .clkr = {
+               .enable_reg = 0x2348,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "mdss_esc1_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &esc1_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch mdss_extpclk_clk = {
+       .halt_reg = 0x2324,
+       .clkr = {
+               .enable_reg = 0x2324,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "mdss_extpclk_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &extpclk_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch mdss_hdmi_ahb_clk = {
+       .halt_reg = 0x230c,
+       .clkr = {
+               .enable_reg = 0x230c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "mdss_hdmi_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch mdss_hdmi_clk = {
+       .halt_reg = 0x2338,
+       .clkr = {
+               .enable_reg = 0x2338,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "mdss_hdmi_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &hdmi_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch mdss_mdp_clk = {
+       .halt_reg = 0x231c,
+       .clkr = {
+               .enable_reg = 0x231c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "mdss_mdp_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &mdp_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch mdss_pclk0_clk = {
+       .halt_reg = 0x2314,
+       .clkr = {
+               .enable_reg = 0x2314,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "mdss_pclk0_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &pclk0_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch mdss_pclk1_clk = {
+       .halt_reg = 0x2318,
+       .clkr = {
+               .enable_reg = 0x2318,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "mdss_pclk1_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &pclk1_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch mdss_vsync_clk = {
+       .halt_reg = 0x2328,
+       .clkr = {
+               .enable_reg = 0x2328,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "mdss_vsync_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &vsync_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch mmss_misc_ahb_clk = {
+       .halt_reg = 0x502c,
+       .clkr = {
+               .enable_reg = 0x502c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "mmss_misc_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch mmss_mmssnoc_axi_clk = {
+       .halt_reg = 0x506c,
+       .clkr = {
+               .enable_reg = 0x506c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "mmss_mmssnoc_axi_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       /* Gating this clock will wreck havoc among MMSS! */
+                       .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch mmss_s0_axi_clk = {
+       .halt_reg = 0x5064,
+       .clkr = {
+               .enable_reg = 0x5064,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "mmss_s0_axi_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw, },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch ocmemcx_ocmemnoc_clk = {
+       .halt_reg = 0x4058,
+       .clkr = {
+               .enable_reg = 0x4058,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "ocmemcx_ocmemnoc_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &ocmemnoc_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch oxili_gfx3d_clk = {
+       .halt_reg = 0x4028,
+       .clkr = {
+               .enable_reg = 0x4028,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "oxili_gfx3d_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "oxili_gfx3d_clk_src",
+                               .name = "oxili_gfx3d_clk_src"
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch oxili_rbbmtimer_clk = {
+       .halt_reg = 0x40b0,
+       .clkr = {
+               .enable_reg = 0x40b0,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "oxili_rbbmtimer_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &rbbmtimer_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch oxilicx_ahb_clk = {
+       .halt_reg = 0x403c,
+       .clkr = {
+               .enable_reg = 0x403c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "oxilicx_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch venus0_ahb_clk = {
+       .halt_reg = 0x1030,
+       .clkr = {
+               .enable_reg = 0x1030,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "venus0_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &ahb_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch venus0_axi_clk = {
+       .halt_reg = 0x1034,
+       .clkr = {
+               .enable_reg = 0x1034,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "venus0_axi_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &axi_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch venus0_ocmemnoc_clk = {
+       .halt_reg = 0x1038,
+       .clkr = {
+               .enable_reg = 0x1038,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "venus0_ocmemnoc_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &ocmemnoc_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch venus0_vcodec0_clk = {
+       .halt_reg = 0x1028,
+       .clkr = {
+               .enable_reg = 0x1028,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "venus0_vcodec0_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &vcodec0_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch venus0_core0_vcodec_clk = {
+       .halt_reg = 0x1048,
+       .clkr = {
+               .enable_reg = 0x1048,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "venus0_core0_vcodec_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &vcodec0_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch venus0_core1_vcodec_clk = {
+       .halt_reg = 0x104c,
+       .clkr = {
+               .enable_reg = 0x104c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "venus0_core1_vcodec_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &vcodec0_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch venus0_core2_vcodec_clk = {
+       .halt_reg = 0x1054,
+       .clkr = {
+               .enable_reg = 0x1054,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "venus0_core2_vcodec_clk",
+                       .parent_hws = (const struct clk_hw *[]){ &vcodec0_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct gdsc venus_gdsc = {
+       .gdscr = 0x1024,
+       .cxcs = (unsigned int []){ 0x1038, 0x1034, 0x1048 },
+       .cxc_count = 3,
+       .pd = {
+               .name = "venus_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc venus_core0_gdsc = {
+       .gdscr = 0x1040,
+       .cxcs = (unsigned int []){ 0x1048 },
+       .cxc_count = 1,
+       .pd = {
+               .name = "venus_core0_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = HW_CTRL,
+};
+
+static struct gdsc venus_core1_gdsc = {
+       .gdscr = 0x1044,
+       .cxcs = (unsigned int []){ 0x104c },
+       .cxc_count = 1,
+       .pd = {
+       .name = "venus_core1_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = HW_CTRL,
+};
+
+static struct gdsc venus_core2_gdsc = {
+       .gdscr = 0x1050,
+       .cxcs = (unsigned int []){ 0x1054 },
+       .cxc_count = 1,
+       .pd = {
+               .name = "venus_core2_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = HW_CTRL,
+};
+
+static struct gdsc mdss_gdsc = {
+       .gdscr = 0x2304,
+       .cxcs = (unsigned int []){ 0x2310, 0x231c },
+       .cxc_count = 2,
+       .pd = {
+               .name = "mdss_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc camss_top_gdsc = {
+       .gdscr = 0x34a0,
+       .cxcs = (unsigned int []){ 0x3704, 0x3714, 0x3494 },
+       .cxc_count = 3,
+       .pd = {
+               .name = "camss_top_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc jpeg_gdsc = {
+       .gdscr = 0x35a4,
+       .cxcs = (unsigned int []){ 0x35a8 },
+       .cxc_count = 1,
+       .pd = {
+               .name = "jpeg_gdsc",
+       },
+       .parent = &camss_top_gdsc.pd,
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc vfe_gdsc = {
+       .gdscr = 0x36a4,
+       .cxcs = (unsigned int []){ 0x36bc },
+       .cxc_count = 1,
+       .pd = {
+               .name = "vfe_gdsc",
+       },
+       .parent = &camss_top_gdsc.pd,
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc cpp_gdsc = {
+       .gdscr = 0x36d4,
+       .cxcs = (unsigned int []){ 0x36c4, 0x36b0 },
+       .cxc_count = 2,
+       .pd = {
+               .name = "cpp_gdsc",
+       },
+       .parent = &camss_top_gdsc.pd,
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc fd_gdsc = {
+       .gdscr = 0x3b64,
+       .cxcs = (unsigned int []){ 0x3b70, 0x3b68 },
+       .pd = {
+               .name = "fd_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc oxili_cx_gdsc = {
+       .gdscr = 0x4034,
+       .pd = {
+               .name = "oxili_cx_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE,
+};
+
+static struct gdsc oxili_gx_gdsc = {
+       .gdscr = 0x4024,
+       .cxcs = (unsigned int []){ 0x4028 },
+       .cxc_count = 1,
+       .pd = {
+               .name = "oxili_gx_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .parent = &oxili_cx_gdsc.pd,
+       .flags = CLAMP_IO,
+       .supply = "VDD_GFX",
+};
+
+static struct clk_regmap *mmcc_msm8994_clocks[] = {
+       [MMPLL0_EARLY] = &mmpll0_early.clkr,
+       [MMPLL0_PLL] = &mmpll0.clkr,
+       [MMPLL1_EARLY] = &mmpll1_early.clkr,
+       [MMPLL1_PLL] = &mmpll1.clkr,
+       [MMPLL3_EARLY] = &mmpll3_early.clkr,
+       [MMPLL3_PLL] = &mmpll3.clkr,
+       [MMPLL4_EARLY] = &mmpll4_early.clkr,
+       [MMPLL4_PLL] = &mmpll4.clkr,
+       [MMPLL5_EARLY] = &mmpll5_early.clkr,
+       [MMPLL5_PLL] = &mmpll5.clkr,
+       [AHB_CLK_SRC] = &ahb_clk_src.clkr,
+       [AXI_CLK_SRC] = &axi_clk_src.clkr,
+       [CSI0_CLK_SRC] = &csi0_clk_src.clkr,
+       [CSI1_CLK_SRC] = &csi1_clk_src.clkr,
+       [CSI2_CLK_SRC] = &csi2_clk_src.clkr,
+       [CSI3_CLK_SRC] = &csi3_clk_src.clkr,
+       [VFE0_CLK_SRC] = &vfe0_clk_src.clkr,
+       [VFE1_CLK_SRC] = &vfe1_clk_src.clkr,
+       [CPP_CLK_SRC] = &cpp_clk_src.clkr,
+       [JPEG0_CLK_SRC] = &jpeg0_clk_src.clkr,
+       [JPEG1_CLK_SRC] = &jpeg1_clk_src.clkr,
+       [JPEG2_CLK_SRC] = &jpeg2_clk_src.clkr,
+       [CSI2PHYTIMER_CLK_SRC] = &csi2phytimer_clk_src.clkr,
+       [FD_CORE_CLK_SRC] = &fd_core_clk_src.clkr,
+       [MDP_CLK_SRC] = &mdp_clk_src.clkr,
+       [PCLK0_CLK_SRC] = &pclk0_clk_src.clkr,
+       [PCLK1_CLK_SRC] = &pclk1_clk_src.clkr,
+       [OCMEMNOC_CLK_SRC] = &ocmemnoc_clk_src.clkr,
+       [CCI_CLK_SRC] = &cci_clk_src.clkr,
+       [MMSS_GP0_CLK_SRC] = &mmss_gp0_clk_src.clkr,
+       [MMSS_GP1_CLK_SRC] = &mmss_gp1_clk_src.clkr,
+       [JPEG_DMA_CLK_SRC] = &jpeg_dma_clk_src.clkr,
+       [MCLK0_CLK_SRC] = &mclk0_clk_src.clkr,
+       [MCLK1_CLK_SRC] = &mclk1_clk_src.clkr,
+       [MCLK2_CLK_SRC] = &mclk2_clk_src.clkr,
+       [MCLK3_CLK_SRC] = &mclk3_clk_src.clkr,
+       [CSI0PHYTIMER_CLK_SRC] = &csi0phytimer_clk_src.clkr,
+       [CSI1PHYTIMER_CLK_SRC] = &csi1phytimer_clk_src.clkr,
+       [BYTE0_CLK_SRC] = &byte0_clk_src.clkr,
+       [BYTE1_CLK_SRC] = &byte1_clk_src.clkr,
+       [ESC0_CLK_SRC] = &esc0_clk_src.clkr,
+       [ESC1_CLK_SRC] = &esc1_clk_src.clkr,
+       [MDSS_ESC0_CLK] = &mdss_esc0_clk.clkr,
+       [MDSS_ESC1_CLK] = &mdss_esc1_clk.clkr,
+       [EXTPCLK_CLK_SRC] = &extpclk_clk_src.clkr,
+       [HDMI_CLK_SRC] = &hdmi_clk_src.clkr,
+       [VSYNC_CLK_SRC] = &vsync_clk_src.clkr,
+       [RBBMTIMER_CLK_SRC] = &rbbmtimer_clk_src.clkr,
+       [CAMSS_AHB_CLK] = &camss_ahb_clk.clkr,
+       [CAMSS_CCI_CCI_AHB_CLK] = &camss_cci_cci_ahb_clk.clkr,
+       [CAMSS_CCI_CCI_CLK] = &camss_cci_cci_clk.clkr,
+       [CAMSS_VFE_CPP_AHB_CLK] = &camss_vfe_cpp_ahb_clk.clkr,
+       [CAMSS_VFE_CPP_AXI_CLK] = &camss_vfe_cpp_axi_clk.clkr,
+       [CAMSS_VFE_CPP_CLK] = &camss_vfe_cpp_clk.clkr,
+       [CAMSS_CSI0_AHB_CLK] = &camss_csi0_ahb_clk.clkr,
+       [CAMSS_CSI0_CLK] = &camss_csi0_clk.clkr,
+       [CAMSS_CSI0PHY_CLK] = &camss_csi0phy_clk.clkr,
+       [CAMSS_CSI0PIX_CLK] = &camss_csi0pix_clk.clkr,
+       [CAMSS_CSI0RDI_CLK] = &camss_csi0rdi_clk.clkr,
+       [CAMSS_CSI1_AHB_CLK] = &camss_csi1_ahb_clk.clkr,
+       [CAMSS_CSI1_CLK] = &camss_csi1_clk.clkr,
+       [CAMSS_CSI1PHY_CLK] = &camss_csi1phy_clk.clkr,
+       [CAMSS_CSI1PIX_CLK] = &camss_csi1pix_clk.clkr,
+       [CAMSS_CSI1RDI_CLK] = &camss_csi1rdi_clk.clkr,
+       [CAMSS_CSI2_AHB_CLK] = &camss_csi2_ahb_clk.clkr,
+       [CAMSS_CSI2_CLK] = &camss_csi2_clk.clkr,
+       [CAMSS_CSI2PHY_CLK] = &camss_csi2phy_clk.clkr,
+       [CAMSS_CSI2PIX_CLK] = &camss_csi2pix_clk.clkr,
+       [CAMSS_CSI2RDI_CLK] = &camss_csi2rdi_clk.clkr,
+       [CAMSS_CSI3_AHB_CLK] = &camss_csi3_ahb_clk.clkr,
+       [CAMSS_CSI3_CLK] = &camss_csi3_clk.clkr,
+       [CAMSS_CSI3PHY_CLK] = &camss_csi3phy_clk.clkr,
+       [CAMSS_CSI3PIX_CLK] = &camss_csi3pix_clk.clkr,
+       [CAMSS_CSI3RDI_CLK] = &camss_csi3rdi_clk.clkr,
+       [CAMSS_CSI_VFE0_CLK] = &camss_csi_vfe0_clk.clkr,
+       [CAMSS_CSI_VFE1_CLK] = &camss_csi_vfe1_clk.clkr,
+       [CAMSS_GP0_CLK] = &camss_gp0_clk.clkr,
+       [CAMSS_GP1_CLK] = &camss_gp1_clk.clkr,
+       [CAMSS_ISPIF_AHB_CLK] = &camss_ispif_ahb_clk.clkr,
+       [CAMSS_JPEG_DMA_CLK] = &camss_jpeg_dma_clk.clkr,
+       [CAMSS_JPEG_JPEG0_CLK] = &camss_jpeg_jpeg0_clk.clkr,
+       [CAMSS_JPEG_JPEG1_CLK] = &camss_jpeg_jpeg1_clk.clkr,
+       [CAMSS_JPEG_JPEG2_CLK] = &camss_jpeg_jpeg2_clk.clkr,
+       [CAMSS_JPEG_JPEG_AHB_CLK] = &camss_jpeg_jpeg_ahb_clk.clkr,
+       [CAMSS_JPEG_JPEG_AXI_CLK] = &camss_jpeg_jpeg_axi_clk.clkr,
+       [CAMSS_MCLK0_CLK] = &camss_mclk0_clk.clkr,
+       [CAMSS_MCLK1_CLK] = &camss_mclk1_clk.clkr,
+       [CAMSS_MCLK2_CLK] = &camss_mclk2_clk.clkr,
+       [CAMSS_MCLK3_CLK] = &camss_mclk3_clk.clkr,
+       [CAMSS_MICRO_AHB_CLK] = &camss_micro_ahb_clk.clkr,
+       [CAMSS_PHY0_CSI0PHYTIMER_CLK] = &camss_phy0_csi0phytimer_clk.clkr,
+       [CAMSS_PHY1_CSI1PHYTIMER_CLK] = &camss_phy1_csi1phytimer_clk.clkr,
+       [CAMSS_PHY2_CSI2PHYTIMER_CLK] = &camss_phy2_csi2phytimer_clk.clkr,
+       [CAMSS_TOP_AHB_CLK] = &camss_top_ahb_clk.clkr,
+       [CAMSS_VFE_VFE0_CLK] = &camss_vfe_vfe0_clk.clkr,
+       [CAMSS_VFE_VFE1_CLK] = &camss_vfe_vfe1_clk.clkr,
+       [CAMSS_VFE_VFE_AHB_CLK] = &camss_vfe_vfe_ahb_clk.clkr,
+       [CAMSS_VFE_VFE_AXI_CLK] = &camss_vfe_vfe_axi_clk.clkr,
+       [FD_AHB_CLK] = &fd_ahb_clk.clkr,
+       [FD_AXI_CLK] = &fd_axi_clk.clkr,
+       [FD_CORE_CLK] = &fd_core_clk.clkr,
+       [FD_CORE_UAR_CLK] = &fd_core_uar_clk.clkr,
+       [MDSS_AHB_CLK] = &mdss_ahb_clk.clkr,
+       [MDSS_AXI_CLK] = &mdss_axi_clk.clkr,
+       [MDSS_BYTE0_CLK] = &mdss_byte0_clk.clkr,
+       [MDSS_BYTE1_CLK] = &mdss_byte1_clk.clkr,
+       [MDSS_EXTPCLK_CLK] = &mdss_extpclk_clk.clkr,
+       [MDSS_HDMI_AHB_CLK] = &mdss_hdmi_ahb_clk.clkr,
+       [MDSS_HDMI_CLK] = &mdss_hdmi_clk.clkr,
+       [MDSS_MDP_CLK] = &mdss_mdp_clk.clkr,
+       [MDSS_PCLK0_CLK] = &mdss_pclk0_clk.clkr,
+       [MDSS_PCLK1_CLK] = &mdss_pclk1_clk.clkr,
+       [MDSS_VSYNC_CLK] = &mdss_vsync_clk.clkr,
+       [MMSS_MISC_AHB_CLK] = &mmss_misc_ahb_clk.clkr,
+       [MMSS_MMSSNOC_AXI_CLK] = &mmss_mmssnoc_axi_clk.clkr,
+       [MMSS_S0_AXI_CLK] = &mmss_s0_axi_clk.clkr,
+       [OCMEMCX_OCMEMNOC_CLK] = &ocmemcx_ocmemnoc_clk.clkr,
+       [OXILI_GFX3D_CLK] = &oxili_gfx3d_clk.clkr,
+       [OXILI_RBBMTIMER_CLK] = &oxili_rbbmtimer_clk.clkr,
+       [OXILICX_AHB_CLK] = &oxilicx_ahb_clk.clkr,
+       [VENUS0_AHB_CLK] = &venus0_ahb_clk.clkr,
+       [VENUS0_AXI_CLK] = &venus0_axi_clk.clkr,
+       [VENUS0_OCMEMNOC_CLK] = &venus0_ocmemnoc_clk.clkr,
+       [VENUS0_VCODEC0_CLK] = &venus0_vcodec0_clk.clkr,
+       [VENUS0_CORE0_VCODEC_CLK] = &venus0_core0_vcodec_clk.clkr,
+       [VENUS0_CORE1_VCODEC_CLK] = &venus0_core1_vcodec_clk.clkr,
+       [VENUS0_CORE2_VCODEC_CLK] = &venus0_core2_vcodec_clk.clkr,
+};
+
+static struct gdsc *mmcc_msm8994_gdscs[] = {
+       [VENUS_GDSC] = &venus_gdsc,
+       [VENUS_CORE0_GDSC] = &venus_core0_gdsc,
+       [VENUS_CORE1_GDSC] = &venus_core1_gdsc,
+       [VENUS_CORE2_GDSC] = &venus_core2_gdsc,
+       [CAMSS_TOP_GDSC] = &camss_top_gdsc,
+       [MDSS_GDSC] = &mdss_gdsc,
+       [JPEG_GDSC] = &jpeg_gdsc,
+       [VFE_GDSC] = &vfe_gdsc,
+       [CPP_GDSC] = &cpp_gdsc,
+       [OXILI_GX_GDSC] = &oxili_gx_gdsc,
+       [OXILI_CX_GDSC] = &oxili_cx_gdsc,
+       [FD_GDSC] = &fd_gdsc,
+};
+
+static const struct qcom_reset_map mmcc_msm8994_resets[] = {
+       [CAMSS_MICRO_BCR] = { 0x3490 },
+};
+
+static const struct regmap_config mmcc_msm8994_regmap_config = {
+       .reg_bits       = 32,
+       .reg_stride     = 4,
+       .val_bits       = 32,
+       .max_register   = 0x5200,
+       .fast_io        = true,
+};
+
+static const struct qcom_cc_desc mmcc_msm8994_desc = {
+       .config = &mmcc_msm8994_regmap_config,
+       .clks = mmcc_msm8994_clocks,
+       .num_clks = ARRAY_SIZE(mmcc_msm8994_clocks),
+       .resets = mmcc_msm8994_resets,
+       .num_resets = ARRAY_SIZE(mmcc_msm8994_resets),
+       .gdscs = mmcc_msm8994_gdscs,
+       .num_gdscs = ARRAY_SIZE(mmcc_msm8994_gdscs),
+};
+
+static const struct of_device_id mmcc_msm8994_match_table[] = {
+       { .compatible = "qcom,mmcc-msm8992" },
+       { .compatible = "qcom,mmcc-msm8994" }, /* V2 and V2.1 */
+       { }
+};
+MODULE_DEVICE_TABLE(of, mmcc_msm8994_match_table);
+
+static int mmcc_msm8994_probe(struct platform_device *pdev)
+{
+       struct regmap *regmap;
+
+       if (of_device_is_compatible(pdev->dev.of_node, "qcom,mmcc-msm8992")) {
+               /* MSM8992 features less clocks and some have different freq tables */
+               mmcc_msm8994_desc.clks[CAMSS_JPEG_JPEG1_CLK] = NULL;
+               mmcc_msm8994_desc.clks[CAMSS_JPEG_JPEG2_CLK] = NULL;
+               mmcc_msm8994_desc.clks[FD_CORE_CLK_SRC] = NULL;
+               mmcc_msm8994_desc.clks[FD_CORE_CLK] = NULL;
+               mmcc_msm8994_desc.clks[FD_CORE_UAR_CLK] = NULL;
+               mmcc_msm8994_desc.clks[FD_AXI_CLK] = NULL;
+               mmcc_msm8994_desc.clks[FD_AHB_CLK] = NULL;
+               mmcc_msm8994_desc.clks[JPEG1_CLK_SRC] = NULL;
+               mmcc_msm8994_desc.clks[JPEG2_CLK_SRC] = NULL;
+               mmcc_msm8994_desc.clks[VENUS0_CORE2_VCODEC_CLK] = NULL;
+
+               mmcc_msm8994_desc.gdscs[FD_GDSC] = NULL;
+               mmcc_msm8994_desc.gdscs[VENUS_CORE2_GDSC] = NULL;
+
+               axi_clk_src.freq_tbl = ftbl_axi_clk_src_8992;
+               cpp_clk_src.freq_tbl = ftbl_cpp_clk_src_8992;
+               csi0_clk_src.freq_tbl = ftbl_csi0_1_2_3_clk_src_8992;
+               csi1_clk_src.freq_tbl = ftbl_csi0_1_2_3_clk_src_8992;
+               csi2_clk_src.freq_tbl = ftbl_csi0_1_2_3_clk_src_8992;
+               csi3_clk_src.freq_tbl = ftbl_csi0_1_2_3_clk_src_8992;
+               mclk0_clk_src.freq_tbl = ftbl_mclk0_clk_src_8992;
+               mclk1_clk_src.freq_tbl = ftbl_mclk1_2_3_clk_src_8992;
+               mclk2_clk_src.freq_tbl = ftbl_mclk1_2_3_clk_src_8992;
+               mclk3_clk_src.freq_tbl = ftbl_mclk1_2_3_clk_src_8992;
+               mdp_clk_src.freq_tbl = ftbl_mdp_clk_src_8992;
+               ocmemnoc_clk_src.freq_tbl = ftbl_ocmemnoc_clk_src_8992;
+               vcodec0_clk_src.freq_tbl = ftbl_vcodec0_clk_src_8992;
+               vfe0_clk_src.freq_tbl = ftbl_vfe0_1_clk_src_8992;
+               vfe1_clk_src.freq_tbl = ftbl_vfe0_1_clk_src_8992;
+       }
+
+       regmap = qcom_cc_map(pdev, &mmcc_msm8994_desc);
+       if (IS_ERR(regmap))
+               return PTR_ERR(regmap);
+
+       clk_alpha_pll_configure(&mmpll0_early, regmap, &mmpll_p_config);
+       clk_alpha_pll_configure(&mmpll1_early, regmap, &mmpll_p_config);
+       clk_alpha_pll_configure(&mmpll3_early, regmap, &mmpll_p_config);
+       clk_alpha_pll_configure(&mmpll5_early, regmap, &mmpll_p_config);
+
+       return qcom_cc_really_probe(pdev, &mmcc_msm8994_desc, regmap);
+}
+
+static struct platform_driver mmcc_msm8994_driver = {
+       .probe          = mmcc_msm8994_probe,
+       .driver         = {
+               .name   = "mmcc-msm8994",
+               .of_match_table = mmcc_msm8994_match_table,
+       },
+};
+module_platform_driver(mmcc_msm8994_driver);
+
+MODULE_DESCRIPTION("QCOM MMCC MSM8994 Driver");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:mmcc-msm8994");
index 673fa1a..5a14074 100644 (file)
@@ -73,36 +73,23 @@ static int mss_sc7180_probe(struct platform_device *pdev)
 {
        int ret;
 
-       pm_runtime_enable(&pdev->dev);
-       ret = pm_clk_create(&pdev->dev);
+       ret = devm_pm_runtime_enable(&pdev->dev);
        if (ret)
-               goto disable_pm_runtime;
+               return ret;
+
+       ret = devm_pm_clk_create(&pdev->dev);
+       if (ret)
+               return ret;
 
        ret = pm_clk_add(&pdev->dev, "cfg_ahb");
        if (ret < 0) {
                dev_err(&pdev->dev, "failed to acquire iface clock\n");
-               goto destroy_pm_clk;
+               return ret;
        }
 
        ret = qcom_cc_probe(pdev, &mss_sc7180_desc);
        if (ret < 0)
-               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 int mss_sc7180_remove(struct platform_device *pdev)
-{
-       pm_clk_destroy(&pdev->dev);
-       pm_runtime_disable(&pdev->dev);
+               return ret;
 
        return 0;
 }
@@ -119,7 +106,6 @@ MODULE_DEVICE_TABLE(of, mss_sc7180_match_table);
 
 static struct platform_driver mss_sc7180_driver = {
        .probe          = mss_sc7180_probe,
-       .remove         = mss_sc7180_remove,
        .driver         = {
                .name           = "sc7180-mss",
                .of_match_table = mss_sc7180_match_table,
index 723f932..507386b 100644 (file)
@@ -159,15 +159,18 @@ static int q6sstopcc_qcs404_probe(struct platform_device *pdev)
        const struct qcom_cc_desc *desc;
        int ret;
 
-       pm_runtime_enable(&pdev->dev);
-       ret = pm_clk_create(&pdev->dev);
+       ret = devm_pm_runtime_enable(&pdev->dev);
        if (ret)
-               goto disable_pm_runtime;
+               return ret;
+
+       ret = devm_pm_clk_create(&pdev->dev);
+       if (ret)
+               return ret;
 
        ret = pm_clk_add(&pdev->dev, NULL);
        if (ret < 0) {
                dev_err(&pdev->dev, "failed to acquire iface clock\n");
-               goto destroy_pm_clk;
+               return ret;
        }
 
        q6sstop_regmap_config.name = "q6sstop_tcsr";
@@ -175,30 +178,14 @@ static int q6sstopcc_qcs404_probe(struct platform_device *pdev)
 
        ret = qcom_cc_probe_by_index(pdev, 1, desc);
        if (ret)
-               goto destroy_pm_clk;
+               return ret;
 
        q6sstop_regmap_config.name = "q6sstop_cc";
        desc = &q6sstop_qcs404_desc;
 
        ret = qcom_cc_probe_by_index(pdev, 0, 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 int q6sstopcc_qcs404_remove(struct platform_device *pdev)
-{
-       pm_clk_destroy(&pdev->dev);
-       pm_runtime_disable(&pdev->dev);
+               return ret;
 
        return 0;
 }
@@ -209,7 +196,6 @@ static const struct dev_pm_ops q6sstopcc_pm_ops = {
 
 static struct platform_driver q6sstopcc_qcs404_driver = {
        .probe          = q6sstopcc_qcs404_probe,
-       .remove         = q6sstopcc_qcs404_remove,
        .driver         = {
                .name   = "qcs404-q6sstopcc",
                .of_match_table = q6sstopcc_qcs404_match_table,
index 4cfbbf5..4543bda 100644 (file)
@@ -110,36 +110,23 @@ static int turingcc_probe(struct platform_device *pdev)
 {
        int ret;
 
-       pm_runtime_enable(&pdev->dev);
-       ret = pm_clk_create(&pdev->dev);
+       ret = devm_pm_runtime_enable(&pdev->dev);
        if (ret)
-               goto disable_pm_runtime;
+               return ret;
+
+       ret = devm_pm_clk_create(&pdev->dev);
+       if (ret)
+               return ret;
 
        ret = pm_clk_add(&pdev->dev, NULL);
        if (ret < 0) {
                dev_err(&pdev->dev, "failed to acquire iface clock\n");
-               goto destroy_pm_clk;
+               return ret;
        }
 
        ret = qcom_cc_probe(pdev, &turingcc_desc);
        if (ret < 0)
-               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 int turingcc_remove(struct platform_device *pdev)
-{
-       pm_clk_destroy(&pdev->dev);
-       pm_runtime_disable(&pdev->dev);
+               return ret;
 
        return 0;
 }
@@ -156,7 +143,6 @@ MODULE_DEVICE_TABLE(of, turingcc_match_table);
 
 static struct platform_driver turingcc_driver = {
        .probe          = turingcc_probe,
-       .remove         = turingcc_remove,
        .driver         = {
                .name   = "qcs404-turingcc",
                .of_match_table = turingcc_match_table,
diff --git a/drivers/clk/qcom/videocc-sc7280.c b/drivers/clk/qcom/videocc-sc7280.c
new file mode 100644 (file)
index 0000000..615695d
--- /dev/null
@@ -0,0 +1,325 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+
+#include <dt-bindings/clock/qcom,videocc-sc7280.h>
+
+#include "clk-alpha-pll.h"
+#include "clk-branch.h"
+#include "clk-rcg.h"
+#include "common.h"
+#include "reset.h"
+#include "gdsc.h"
+
+enum {
+       P_BI_TCXO,
+       P_SLEEP_CLK,
+       P_VIDEO_PLL0_OUT_EVEN,
+};
+
+static const struct pll_vco lucid_vco[] = {
+       { 249600000, 2000000000, 0 },
+};
+
+/* 400MHz Configuration */
+static const struct alpha_pll_config video_pll0_config = {
+       .l = 0x14,
+       .alpha = 0xD555,
+       .config_ctl_val = 0x20485699,
+       .config_ctl_hi_val = 0x00002261,
+       .config_ctl_hi1_val = 0x329A299C,
+       .user_ctl_val = 0x00000001,
+       .user_ctl_hi_val = 0x00000805,
+       .user_ctl_hi1_val = 0x00000000,
+};
+
+static struct clk_alpha_pll video_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 = "video_pll0",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "bi_tcxo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_lucid_ops,
+               },
+       },
+};
+
+static const struct parent_map video_cc_parent_map_0[] = {
+       { P_BI_TCXO, 0 },
+       { P_VIDEO_PLL0_OUT_EVEN, 3 },
+};
+
+static const struct clk_parent_data video_cc_parent_data_0[] = {
+       { .fw_name = "bi_tcxo" },
+       { .hw = &video_pll0.clkr.hw },
+};
+
+static const struct parent_map video_cc_parent_map_1[] = {
+       { P_SLEEP_CLK, 0 },
+};
+
+static const struct clk_parent_data video_cc_parent_data_1[] = {
+       { .fw_name = "sleep_clk" },
+};
+
+static const struct freq_tbl ftbl_video_cc_iris_clk_src[] = {
+       F(133333333, P_VIDEO_PLL0_OUT_EVEN, 3, 0, 0),
+       F(240000000, P_VIDEO_PLL0_OUT_EVEN, 2, 0, 0),
+       F(335000000, P_VIDEO_PLL0_OUT_EVEN, 2, 0, 0),
+       F(424000000, P_VIDEO_PLL0_OUT_EVEN, 2, 0, 0),
+       F(460000000, P_VIDEO_PLL0_OUT_EVEN, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 video_cc_iris_clk_src = {
+       .cmd_rcgr = 0x1000,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = video_cc_parent_map_0,
+       .freq_tbl = ftbl_video_cc_iris_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "video_cc_iris_clk_src",
+               .parent_data = video_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(video_cc_parent_data_0),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_video_cc_sleep_clk_src[] = {
+       F(32000, P_SLEEP_CLK, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 video_cc_sleep_clk_src = {
+       .cmd_rcgr = 0x701c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = video_cc_parent_map_1,
+       .freq_tbl = ftbl_video_cc_sleep_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "video_cc_sleep_clk_src",
+               .parent_data = video_cc_parent_data_1,
+               .num_parents = ARRAY_SIZE(video_cc_parent_data_1),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch video_cc_iris_ahb_clk = {
+       .halt_reg = 0x5004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "video_cc_iris_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &video_cc_iris_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch video_cc_mvs0_axi_clk = {
+       .halt_reg = 0x800c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x800c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "video_cc_mvs0_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch video_cc_mvs0_core_clk = {
+       .halt_reg = 0x3010,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x3010,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x3010,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "video_cc_mvs0_core_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &video_cc_iris_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch video_cc_mvsc_core_clk = {
+       .halt_reg = 0x2014,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "video_cc_mvsc_core_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &video_cc_iris_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch video_cc_mvsc_ctl_axi_clk = {
+       .halt_reg = 0x8004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "video_cc_mvsc_ctl_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch video_cc_sleep_clk = {
+       .halt_reg = 0x7034,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x7034,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "video_cc_sleep_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &video_cc_sleep_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch video_cc_venus_ahb_clk = {
+       .halt_reg = 0x801c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x801c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "video_cc_venus_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct gdsc mvs0_gdsc = {
+       .gdscr = 0x3004,
+       .pd = {
+               .name = "mvs0_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = HW_CTRL | RETAIN_FF_ENABLE,
+};
+
+static struct gdsc mvsc_gdsc = {
+       .gdscr = 0x2004,
+       .pd = {
+               .name = "mvsc_gdsc",
+       },
+       .flags = RETAIN_FF_ENABLE,
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct clk_regmap *video_cc_sc7280_clocks[] = {
+       [VIDEO_CC_IRIS_AHB_CLK] = &video_cc_iris_ahb_clk.clkr,
+       [VIDEO_CC_IRIS_CLK_SRC] = &video_cc_iris_clk_src.clkr,
+       [VIDEO_CC_MVS0_AXI_CLK] = &video_cc_mvs0_axi_clk.clkr,
+       [VIDEO_CC_MVS0_CORE_CLK] = &video_cc_mvs0_core_clk.clkr,
+       [VIDEO_CC_MVSC_CORE_CLK] = &video_cc_mvsc_core_clk.clkr,
+       [VIDEO_CC_MVSC_CTL_AXI_CLK] = &video_cc_mvsc_ctl_axi_clk.clkr,
+       [VIDEO_CC_SLEEP_CLK] = &video_cc_sleep_clk.clkr,
+       [VIDEO_CC_SLEEP_CLK_SRC] = &video_cc_sleep_clk_src.clkr,
+       [VIDEO_CC_VENUS_AHB_CLK] = &video_cc_venus_ahb_clk.clkr,
+       [VIDEO_PLL0] = &video_pll0.clkr,
+};
+
+static struct gdsc *video_cc_sc7280_gdscs[] = {
+       [MVS0_GDSC] = &mvs0_gdsc,
+       [MVSC_GDSC] = &mvsc_gdsc,
+};
+
+static const struct regmap_config video_cc_sc7280_regmap_config = {
+       .reg_bits = 32,
+       .reg_stride = 4,
+       .val_bits = 32,
+       .max_register = 0xb000,
+       .fast_io = true,
+};
+
+static const struct qcom_cc_desc video_cc_sc7280_desc = {
+       .config = &video_cc_sc7280_regmap_config,
+       .clks = video_cc_sc7280_clocks,
+       .num_clks = ARRAY_SIZE(video_cc_sc7280_clocks),
+       .gdscs = video_cc_sc7280_gdscs,
+       .num_gdscs = ARRAY_SIZE(video_cc_sc7280_gdscs),
+};
+
+static const struct of_device_id video_cc_sc7280_match_table[] = {
+       { .compatible = "qcom,sc7280-videocc" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, video_cc_sc7280_match_table);
+
+static int video_cc_sc7280_probe(struct platform_device *pdev)
+{
+       struct regmap *regmap;
+
+       regmap = qcom_cc_map(pdev, &video_cc_sc7280_desc);
+       if (IS_ERR(regmap))
+               return PTR_ERR(regmap);
+
+       clk_lucid_pll_configure(&video_pll0, regmap, &video_pll0_config);
+
+       return qcom_cc_really_probe(pdev, &video_cc_sc7280_desc, regmap);
+}
+
+static struct platform_driver video_cc_sc7280_driver = {
+       .probe = video_cc_sc7280_probe,
+       .driver = {
+               .name = "video_cc-sc7280",
+               .of_match_table = video_cc_sc7280_match_table,
+       },
+};
+
+static int __init video_cc_sc7280_init(void)
+{
+       return platform_driver_register(&video_cc_sc7280_driver);
+}
+subsys_initcall(video_cc_sc7280_init);
+
+static void __exit video_cc_sc7280_exit(void)
+{
+       platform_driver_unregister(&video_cc_sc7280_driver);
+}
+module_exit(video_cc_sc7280_exit);
+
+MODULE_DESCRIPTION("QTI VIDEO_CC sc7280 Driver");
+MODULE_LICENSE("GPL v2");
index 857da1e..a2c0453 100644 (file)
@@ -131,14 +131,7 @@ static int mt7621_gate_ops_init(struct device *dev,
                                struct mt7621_gate *sclk)
 {
        struct clk_init_data init = {
-               /*
-                * Until now no clock driver existed so
-                * these SoC drivers are not prepared
-                * yet for the clock. We don't want kernel to
-                * disable anything so we add CLK_IS_CRITICAL
-                * flag here.
-                */
-               .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
+               .flags = CLK_SET_RATE_PARENT,
                .num_parents = 1,
                .parent_names = &sclk->parent_name,
                .ops = &mt7621_gate_ops,
index 7b45065..6d02807 100644 (file)
@@ -153,9 +153,7 @@ config CLK_R8A779A0
        select CLK_RENESAS_CPG_MSSR
 
 config CLK_R9A06G032
-       bool "Renesas R9A06G032 clock driver"
-       help
-         This is a driver for R9A06G032 clocks
+       bool "RZ/N1D clock support" if COMPILE_TEST
 
 config CLK_R9A07G044
        bool "RZ/G2L clock support" if COMPILE_TEST
index 5c6c5c7..7d01870 100644 (file)
@@ -37,7 +37,7 @@ obj-$(CONFIG_CLK_RCAR_CPG_LIB)                += rcar-cpg-lib.o
 obj-$(CONFIG_CLK_RCAR_GEN2_CPG)                += rcar-gen2-cpg.o
 obj-$(CONFIG_CLK_RCAR_GEN3_CPG)                += rcar-gen3-cpg.o
 obj-$(CONFIG_CLK_RCAR_USB2_CLOCK_SEL)  += rcar-usb2-clock-sel.o
-obj-$(CONFIG_CLK_RZG2L)                        += renesas-rzg2l-cpg.o
+obj-$(CONFIG_CLK_RZG2L)                        += rzg2l-cpg.o
 
 # Generic
 obj-$(CONFIG_CLK_RENESAS_CPG_MSSR)     += renesas-cpg-mssr.o
index 4a43ebe..39b185d 100644 (file)
@@ -210,7 +210,7 @@ static const struct mssr_mod_clk r8a774a1_mod_clks[] __initconst = {
        DEF_MOD("rpc-if",                917,   R8A774A1_CLK_RPCD2),
        DEF_MOD("i2c6",                  918,   R8A774A1_CLK_S0D6),
        DEF_MOD("i2c5",                  919,   R8A774A1_CLK_S0D6),
-       DEF_MOD("i2c-dvfs",              926,   R8A774A1_CLK_CP),
+       DEF_MOD("iic-pmic",              926,   R8A774A1_CLK_CP),
        DEF_MOD("i2c4",                  927,   R8A774A1_CLK_S0D6),
        DEF_MOD("i2c3",                  928,   R8A774A1_CLK_S0D6),
        DEF_MOD("i2c2",                  929,   R8A774A1_CLK_S3D2),
index 6f04c40..af602d8 100644 (file)
@@ -206,7 +206,7 @@ static const struct mssr_mod_clk r8a774b1_mod_clks[] __initconst = {
        DEF_MOD("rpc-if",                917,   R8A774B1_CLK_RPCD2),
        DEF_MOD("i2c6",                  918,   R8A774B1_CLK_S0D6),
        DEF_MOD("i2c5",                  919,   R8A774B1_CLK_S0D6),
-       DEF_MOD("i2c-dvfs",              926,   R8A774B1_CLK_CP),
+       DEF_MOD("iic-pmic",              926,   R8A774B1_CLK_CP),
        DEF_MOD("i2c4",                  927,   R8A774B1_CLK_S0D6),
        DEF_MOD("i2c3",                  928,   R8A774B1_CLK_S0D6),
        DEF_MOD("i2c2",                  929,   R8A774B1_CLK_S3D2),
index ed3a2cf..5b938eb 100644 (file)
@@ -210,7 +210,7 @@ static const struct mssr_mod_clk r8a774c0_mod_clks[] __initconst = {
        DEF_MOD("rpc-if",                917,   R8A774C0_CLK_RPCD2),
        DEF_MOD("i2c6",                  918,   R8A774C0_CLK_S3D2),
        DEF_MOD("i2c5",                  919,   R8A774C0_CLK_S3D2),
-       DEF_MOD("i2c-dvfs",              926,   R8A774C0_CLK_CP),
+       DEF_MOD("iic-pmic",              926,   R8A774C0_CLK_CP),
        DEF_MOD("i2c4",                  927,   R8A774C0_CLK_S3D2),
        DEF_MOD("i2c3",                  928,   R8A774C0_CLK_S3D2),
        DEF_MOD("i2c2",                  929,   R8A774C0_CLK_S3D2),
index b96c486..40c7146 100644 (file)
@@ -219,7 +219,7 @@ static const struct mssr_mod_clk r8a774e1_mod_clks[] __initconst = {
        DEF_MOD("i2c6",                  918,   R8A774E1_CLK_S0D6),
        DEF_MOD("i2c5",                  919,   R8A774E1_CLK_S0D6),
        DEF_MOD("adg",                   922,   R8A774E1_CLK_S0D1),
-       DEF_MOD("i2c-dvfs",              926,   R8A774E1_CLK_CP),
+       DEF_MOD("iic-pmic",              926,   R8A774E1_CLK_CP),
        DEF_MOD("i2c4",                  927,   R8A774E1_CLK_S0D6),
        DEF_MOD("i2c3",                  928,   R8A774E1_CLK_S0D6),
        DEF_MOD("i2c2",                  929,   R8A774E1_CLK_S3D2),
index acaf5a9..f16d125 100644 (file)
@@ -135,7 +135,6 @@ static const struct cpg_core_clk r8a779a0_core_clks[] __initconst = {
        DEF_FIXED("zt",         R8A779A0_CLK_ZT,        CLK_PLL1_DIV2,  2, 1),
        DEF_FIXED("ztr",        R8A779A0_CLK_ZTR,       CLK_PLL1_DIV2,  2, 1),
        DEF_FIXED("zr",         R8A779A0_CLK_ZR,        CLK_PLL1_DIV2,  1, 1),
-       DEF_FIXED("dsi",        R8A779A0_CLK_DSI,       CLK_PLL5_DIV4,  1, 1),
        DEF_FIXED("cnndsp",     R8A779A0_CLK_CNNDSP,    CLK_PLL5_DIV4,  1, 1),
        DEF_FIXED("vip",        R8A779A0_CLK_VIP,       CLK_PLL5,       5, 1),
        DEF_FIXED("adgh",       R8A779A0_CLK_ADGH,      CLK_PLL5_DIV4,  1, 1),
@@ -151,6 +150,7 @@ static const struct cpg_core_clk r8a779a0_core_clks[] __initconst = {
        DEF_DIV6P1("mso",       R8A779A0_CLK_MSO,       CLK_PLL5_DIV4,  0x87c),
        DEF_DIV6P1("canfd",     R8A779A0_CLK_CANFD,     CLK_PLL5_DIV4,  0x878),
        DEF_DIV6P1("csi0",      R8A779A0_CLK_CSI0,      CLK_PLL5_DIV4,  0x880),
+       DEF_DIV6P1("dsi",       R8A779A0_CLK_DSI,       CLK_PLL5_DIV4,  0x884),
 
        DEF_OSC("osc",          R8A779A0_CLK_OSC,       CLK_EXTAL,      8),
        DEF_MDSEL("r",          R8A779A0_CLK_R, 29, CLK_EXTALR, 1, CLK_OCO, 1),
@@ -167,6 +167,9 @@ static const struct mssr_mod_clk r8a779a0_mod_clks[] __initconst = {
        DEF_MOD("csi41",        400,    R8A779A0_CLK_CSI0),
        DEF_MOD("csi42",        401,    R8A779A0_CLK_CSI0),
        DEF_MOD("csi43",        402,    R8A779A0_CLK_CSI0),
+       DEF_MOD("du",           411,    R8A779A0_CLK_S3D1),
+       DEF_MOD("dsi0",         415,    R8A779A0_CLK_DSI),
+       DEF_MOD("dsi1",         416,    R8A779A0_CLK_DSI),
        DEF_MOD("fcpvd0",       508,    R8A779A0_CLK_S3D1),
        DEF_MOD("fcpvd1",       509,    R8A779A0_CLK_S3D1),
        DEF_MOD("hscif0",       514,    R8A779A0_CLK_S1D2),
index ae24e03..4c94b94 100644 (file)
 
 #include <dt-bindings/clock/r9a07g044-cpg.h>
 
-#include "renesas-rzg2l-cpg.h"
+#include "rzg2l-cpg.h"
 
 enum clk_ids {
        /* Core Clock Outputs exported to DT */
-       LAST_DT_CORE_CLK = R9A07G044_OSCCLK,
+       LAST_DT_CORE_CLK = R9A07G044_CLK_P0_DIV2,
 
        /* External Input Clocks */
        CLK_EXTAL,
@@ -37,6 +37,7 @@ enum clk_ids {
        CLK_PLL5,
        CLK_PLL5_DIV2,
        CLK_PLL6,
+       CLK_P1_DIV2,
 
        /* Module Clocks */
        MOD_CLK_BASE,
@@ -76,9 +77,11 @@ static const struct cpg_core_clk r9a07g044_core_clks[] __initconst = {
        DEF_FIXED("I", R9A07G044_CLK_I, CLK_PLL1, 1, 1),
        DEF_DIV("P0", R9A07G044_CLK_P0, CLK_PLL2_DIV16, DIVPL2A,
                dtable_1_32, CLK_DIVIDER_HIWORD_MASK),
+       DEF_FIXED("P0_DIV2", R9A07G044_CLK_P0_DIV2, R9A07G044_CLK_P0, 1, 2),
        DEF_FIXED("TSU", R9A07G044_CLK_TSU, CLK_PLL2_DIV20, 1, 1),
        DEF_DIV("P1", R9A07G044_CLK_P1, CLK_PLL3_DIV2_4,
                DIVPL3B, dtable_1_32, CLK_DIVIDER_HIWORD_MASK),
+       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),
 };
@@ -90,6 +93,42 @@ static struct rzg2l_mod_clk r9a07g044_mod_clks[] = {
                                0x518, 0),
        DEF_MOD("ia55_clk",     R9A07G044_IA55_CLK, R9A07G044_CLK_P1,
                                0x518, 1),
+       DEF_MOD("dmac_aclk",    R9A07G044_DMAC_ACLK, R9A07G044_CLK_P1,
+                               0x52c, 0),
+       DEF_MOD("dmac_pclk",    R9A07G044_DMAC_PCLK, CLK_P1_DIV2,
+                               0x52c, 1),
+       DEF_MOD("ssi0_pclk",    R9A07G044_SSI0_PCLK2, R9A07G044_CLK_P0,
+                               0x570, 0),
+       DEF_MOD("ssi0_sfr",     R9A07G044_SSI0_PCLK_SFR, R9A07G044_CLK_P0,
+                               0x570, 1),
+       DEF_MOD("ssi1_pclk",    R9A07G044_SSI1_PCLK2, R9A07G044_CLK_P0,
+                               0x570, 2),
+       DEF_MOD("ssi1_sfr",     R9A07G044_SSI1_PCLK_SFR, R9A07G044_CLK_P0,
+                               0x570, 3),
+       DEF_MOD("ssi2_pclk",    R9A07G044_SSI2_PCLK2, R9A07G044_CLK_P0,
+                               0x570, 4),
+       DEF_MOD("ssi2_sfr",     R9A07G044_SSI2_PCLK_SFR, R9A07G044_CLK_P0,
+                               0x570, 5),
+       DEF_MOD("ssi3_pclk",    R9A07G044_SSI3_PCLK2, R9A07G044_CLK_P0,
+                               0x570, 6),
+       DEF_MOD("ssi3_sfr",     R9A07G044_SSI3_PCLK_SFR, R9A07G044_CLK_P0,
+                               0x570, 7),
+       DEF_MOD("usb0_host",    R9A07G044_USB_U2H0_HCLK, R9A07G044_CLK_P1,
+                               0x578, 0),
+       DEF_MOD("usb1_host",    R9A07G044_USB_U2H1_HCLK, R9A07G044_CLK_P1,
+                               0x578, 1),
+       DEF_MOD("usb0_func",    R9A07G044_USB_U2P_EXR_CPUCLK, R9A07G044_CLK_P1,
+                               0x578, 2),
+       DEF_MOD("usb_pclk",     R9A07G044_USB_PCLK, R9A07G044_CLK_P1,
+                               0x578, 3),
+       DEF_MOD("i2c0",         R9A07G044_I2C0_PCLK, R9A07G044_CLK_P0,
+                               0x580, 0),
+       DEF_MOD("i2c1",         R9A07G044_I2C1_PCLK, R9A07G044_CLK_P0,
+                               0x580, 1),
+       DEF_MOD("i2c2",         R9A07G044_I2C2_PCLK, R9A07G044_CLK_P0,
+                               0x580, 2),
+       DEF_MOD("i2c3",         R9A07G044_I2C3_PCLK, R9A07G044_CLK_P0,
+                               0x580, 3),
        DEF_MOD("scif0",        R9A07G044_SCIF0_CLK_PCK, R9A07G044_CLK_P0,
                                0x584, 0),
        DEF_MOD("scif1",        R9A07G044_SCIF1_CLK_PCK, R9A07G044_CLK_P0,
@@ -102,18 +141,47 @@ static struct rzg2l_mod_clk r9a07g044_mod_clks[] = {
                                0x584, 4),
        DEF_MOD("sci0",         R9A07G044_SCI0_CLKP, R9A07G044_CLK_P0,
                                0x588, 0),
+       DEF_MOD("canfd",        R9A07G044_CANFD_PCLK, R9A07G044_CLK_P0,
+                               0x594, 0),
+       DEF_MOD("gpio",         R9A07G044_GPIO_HCLK, R9A07G044_OSCCLK,
+                               0x598, 0),
+       DEF_MOD("adc_adclk",    R9A07G044_ADC_ADCLK, R9A07G044_CLK_TSU,
+                               0x5a8, 0),
+       DEF_MOD("adc_pclk",     R9A07G044_ADC_PCLK, R9A07G044_CLK_P0,
+                               0x5a8, 1),
 };
 
 static struct rzg2l_reset r9a07g044_resets[] = {
        DEF_RST(R9A07G044_GIC600_GICRESET_N, 0x814, 0),
        DEF_RST(R9A07G044_GIC600_DBG_GICRESET_N, 0x814, 1),
        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_SSI0_RST_M2_REG, 0x870, 0),
+       DEF_RST(R9A07G044_SSI1_RST_M2_REG, 0x870, 1),
+       DEF_RST(R9A07G044_SSI2_RST_M2_REG, 0x870, 2),
+       DEF_RST(R9A07G044_SSI3_RST_M2_REG, 0x870, 3),
+       DEF_RST(R9A07G044_USB_U2H0_HRESETN, 0x878, 0),
+       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_I2C0_MRST, 0x880, 0),
+       DEF_RST(R9A07G044_I2C1_MRST, 0x880, 1),
+       DEF_RST(R9A07G044_I2C2_MRST, 0x880, 2),
+       DEF_RST(R9A07G044_I2C3_MRST, 0x880, 3),
        DEF_RST(R9A07G044_SCIF0_RST_SYSTEM_N, 0x884, 0),
        DEF_RST(R9A07G044_SCIF1_RST_SYSTEM_N, 0x884, 1),
        DEF_RST(R9A07G044_SCIF2_RST_SYSTEM_N, 0x884, 2),
        DEF_RST(R9A07G044_SCIF3_RST_SYSTEM_N, 0x884, 3),
        DEF_RST(R9A07G044_SCIF4_RST_SYSTEM_N, 0x884, 4),
        DEF_RST(R9A07G044_SCI0_RST, 0x888, 0),
+       DEF_RST(R9A07G044_CANFD_RSTP_N, 0x894, 0),
+       DEF_RST(R9A07G044_CANFD_RSTC_N, 0x894, 1),
+       DEF_RST(R9A07G044_GPIO_RSTN, 0x898, 0),
+       DEF_RST(R9A07G044_GPIO_PORT_RESETN, 0x898, 1),
+       DEF_RST(R9A07G044_GPIO_SPARE_RESETN, 0x898, 2),
+       DEF_RST(R9A07G044_ADC_PRESETN, 0x8a8, 0),
+       DEF_RST(R9A07G044_ADC_ADRST_N, 0x8a8, 1),
 };
 
 static const unsigned int r9a07g044_crit_mod_clks[] __initconst = {
diff --git a/drivers/clk/renesas/renesas-rzg2l-cpg.c b/drivers/clk/renesas/renesas-rzg2l-cpg.c
deleted file mode 100644 (file)
index e7c59af..0000000
+++ /dev/null
@@ -1,758 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * RZ/G2L Clock Pulse Generator
- *
- * Copyright (C) 2021 Renesas Electronics Corp.
- *
- * Based on renesas-cpg-mssr.c
- *
- * Copyright (C) 2015 Glider bvba
- * Copyright (C) 2013 Ideas On Board SPRL
- * Copyright (C) 2015 Renesas Electronics Corp.
- */
-
-#include <linux/clk.h>
-#include <linux/clk-provider.h>
-#include <linux/clk/renesas.h>
-#include <linux/delay.h>
-#include <linux/device.h>
-#include <linux/init.h>
-#include <linux/mod_devicetable.h>
-#include <linux/module.h>
-#include <linux/of_address.h>
-#include <linux/of_device.h>
-#include <linux/platform_device.h>
-#include <linux/pm_clock.h>
-#include <linux/pm_domain.h>
-#include <linux/reset-controller.h>
-#include <linux/slab.h>
-
-#include <dt-bindings/clock/renesas-cpg-mssr.h>
-
-#include "renesas-rzg2l-cpg.h"
-
-#ifdef DEBUG
-#define WARN_DEBUG(x)  WARN_ON(x)
-#else
-#define WARN_DEBUG(x)  do { } while (0)
-#endif
-
-#define DIV_RSMASK(v, s, m)    ((v >> s) & m)
-#define GET_SHIFT(val)         ((val >> 12) & 0xff)
-#define GET_WIDTH(val)         ((val >> 8) & 0xf)
-
-#define KDIV(val)              DIV_RSMASK(val, 16, 0xffff)
-#define MDIV(val)              DIV_RSMASK(val, 6, 0x3ff)
-#define PDIV(val)              DIV_RSMASK(val, 0, 0x3f)
-#define SDIV(val)              DIV_RSMASK(val, 0, 0x7)
-
-#define CLK_ON_R(reg)          (reg)
-#define CLK_MON_R(reg)         (0x180 + (reg))
-#define CLK_RST_R(reg)         (reg)
-#define CLK_MRST_R(reg)                (0x180 + (reg))
-
-#define GET_REG_OFFSET(val)            ((val >> 20) & 0xfff)
-#define GET_REG_SAMPLL_CLK1(val)       ((val >> 22) & 0xfff)
-#define GET_REG_SAMPLL_CLK2(val)       ((val >> 12) & 0xfff)
-
-/**
- * struct rzg2l_cpg_priv - Clock Pulse Generator Private Data
- *
- * @rcdev: Reset controller entity
- * @dev: CPG device
- * @base: CPG register block base address
- * @rmw_lock: protects register accesses
- * @clks: Array containing all Core and Module Clocks
- * @num_core_clks: Number of Core Clocks in clks[]
- * @num_mod_clks: Number of Module Clocks in clks[]
- * @last_dt_core_clk: ID of the last Core Clock exported to DT
- * @notifiers: Notifier chain to save/restore clock state for system resume
- * @info: Pointer to platform data
- */
-struct rzg2l_cpg_priv {
-       struct reset_controller_dev rcdev;
-       struct device *dev;
-       void __iomem *base;
-       spinlock_t rmw_lock;
-
-       struct clk **clks;
-       unsigned int num_core_clks;
-       unsigned int num_mod_clks;
-       unsigned int num_resets;
-       unsigned int last_dt_core_clk;
-
-       struct raw_notifier_head notifiers;
-       const struct rzg2l_cpg_info *info;
-};
-
-static void rzg2l_cpg_del_clk_provider(void *data)
-{
-       of_clk_del_provider(data);
-}
-
-static struct clk * __init
-rzg2l_cpg_div_clk_register(const struct cpg_core_clk *core,
-                          struct clk **clks,
-                          void __iomem *base,
-                          struct rzg2l_cpg_priv *priv)
-{
-       struct device *dev = priv->dev;
-       const struct clk *parent;
-       const char *parent_name;
-       struct clk_hw *clk_hw;
-
-       parent = clks[core->parent & 0xffff];
-       if (IS_ERR(parent))
-               return ERR_CAST(parent);
-
-       parent_name = __clk_get_name(parent);
-
-       if (core->dtable)
-               clk_hw = clk_hw_register_divider_table(dev, core->name,
-                                                      parent_name, 0,
-                                                      base + GET_REG_OFFSET(core->conf),
-                                                      GET_SHIFT(core->conf),
-                                                      GET_WIDTH(core->conf),
-                                                      core->flag,
-                                                      core->dtable,
-                                                      &priv->rmw_lock);
-       else
-               clk_hw = clk_hw_register_divider(dev, core->name,
-                                                parent_name, 0,
-                                                base + GET_REG_OFFSET(core->conf),
-                                                GET_SHIFT(core->conf),
-                                                GET_WIDTH(core->conf),
-                                                core->flag, &priv->rmw_lock);
-
-       if (IS_ERR(clk_hw))
-               return NULL;
-
-       return clk_hw->clk;
-}
-
-struct pll_clk {
-       struct clk_hw hw;
-       unsigned int conf;
-       unsigned int type;
-       void __iomem *base;
-       struct rzg2l_cpg_priv *priv;
-};
-
-#define to_pll(_hw)    container_of(_hw, struct pll_clk, hw)
-
-static unsigned long rzg2l_cpg_pll_clk_recalc_rate(struct clk_hw *hw,
-                                                  unsigned long parent_rate)
-{
-       struct pll_clk *pll_clk = to_pll(hw);
-       struct rzg2l_cpg_priv *priv = pll_clk->priv;
-       unsigned int val1, val2;
-       unsigned int mult = 1;
-       unsigned int div = 1;
-
-       if (pll_clk->type != CLK_TYPE_SAM_PLL)
-               return parent_rate;
-
-       val1 = readl(priv->base + GET_REG_SAMPLL_CLK1(pll_clk->conf));
-       val2 = readl(priv->base + GET_REG_SAMPLL_CLK2(pll_clk->conf));
-       mult = MDIV(val1) + KDIV(val1) / 65536;
-       div = PDIV(val1) * (1 << SDIV(val2));
-
-       return DIV_ROUND_CLOSEST_ULL((u64)parent_rate * mult, div);
-}
-
-static const struct clk_ops rzg2l_cpg_pll_ops = {
-       .recalc_rate = rzg2l_cpg_pll_clk_recalc_rate,
-};
-
-static struct clk * __init
-rzg2l_cpg_pll_clk_register(const struct cpg_core_clk *core,
-                          struct clk **clks,
-                          void __iomem *base,
-                          struct rzg2l_cpg_priv *priv)
-{
-       struct device *dev = priv->dev;
-       const struct clk *parent;
-       struct clk_init_data init;
-       const char *parent_name;
-       struct pll_clk *pll_clk;
-       struct clk *clk;
-
-       parent = clks[core->parent & 0xffff];
-       if (IS_ERR(parent))
-               return ERR_CAST(parent);
-
-       pll_clk = devm_kzalloc(dev, sizeof(*pll_clk), GFP_KERNEL);
-       if (!pll_clk) {
-               clk = ERR_PTR(-ENOMEM);
-               return NULL;
-       }
-
-       parent_name = __clk_get_name(parent);
-       init.name = core->name;
-       init.ops = &rzg2l_cpg_pll_ops;
-       init.flags = 0;
-       init.parent_names = &parent_name;
-       init.num_parents = 1;
-
-       pll_clk->hw.init = &init;
-       pll_clk->conf = core->conf;
-       pll_clk->base = base;
-       pll_clk->priv = priv;
-       pll_clk->type = core->type;
-
-       clk = clk_register(NULL, &pll_clk->hw);
-       if (IS_ERR(clk))
-               kfree(pll_clk);
-
-       return clk;
-}
-
-static struct clk
-*rzg2l_cpg_clk_src_twocell_get(struct of_phandle_args *clkspec,
-                              void *data)
-{
-       unsigned int clkidx = clkspec->args[1];
-       struct rzg2l_cpg_priv *priv = data;
-       struct device *dev = priv->dev;
-       const char *type;
-       struct clk *clk;
-
-       switch (clkspec->args[0]) {
-       case CPG_CORE:
-               type = "core";
-               if (clkidx > priv->last_dt_core_clk) {
-                       dev_err(dev, "Invalid %s clock index %u\n", type, clkidx);
-                       return ERR_PTR(-EINVAL);
-               }
-               clk = priv->clks[clkidx];
-               break;
-
-       case CPG_MOD:
-               type = "module";
-               if (clkidx > priv->num_mod_clks) {
-                       dev_err(dev, "Invalid %s clock index %u\n", type,
-                               clkidx);
-                       return ERR_PTR(-EINVAL);
-               }
-               clk = priv->clks[priv->num_core_clks + clkidx];
-               break;
-
-       default:
-               dev_err(dev, "Invalid CPG clock type %u\n", clkspec->args[0]);
-               return ERR_PTR(-EINVAL);
-       }
-
-       if (IS_ERR(clk))
-               dev_err(dev, "Cannot get %s clock %u: %ld", type, clkidx,
-                       PTR_ERR(clk));
-       else
-               dev_dbg(dev, "clock (%u, %u) is %pC at %lu Hz\n",
-                       clkspec->args[0], clkspec->args[1], clk,
-                       clk_get_rate(clk));
-       return clk;
-}
-
-static void __init
-rzg2l_cpg_register_core_clk(const struct cpg_core_clk *core,
-                           const struct rzg2l_cpg_info *info,
-                           struct rzg2l_cpg_priv *priv)
-{
-       struct clk *clk = ERR_PTR(-EOPNOTSUPP), *parent;
-       struct device *dev = priv->dev;
-       unsigned int id = core->id, div = core->div;
-       const char *parent_name;
-
-       WARN_DEBUG(id >= priv->num_core_clks);
-       WARN_DEBUG(PTR_ERR(priv->clks[id]) != -ENOENT);
-
-       if (!core->name) {
-               /* Skip NULLified clock */
-               return;
-       }
-
-       switch (core->type) {
-       case CLK_TYPE_IN:
-               clk = of_clk_get_by_name(priv->dev->of_node, core->name);
-               break;
-       case CLK_TYPE_FF:
-               WARN_DEBUG(core->parent >= priv->num_core_clks);
-               parent = priv->clks[core->parent];
-               if (IS_ERR(parent)) {
-                       clk = parent;
-                       goto fail;
-               }
-
-               parent_name = __clk_get_name(parent);
-               clk = clk_register_fixed_factor(NULL, core->name,
-                                               parent_name, CLK_SET_RATE_PARENT,
-                                               core->mult, div);
-               break;
-       case CLK_TYPE_SAM_PLL:
-               clk = rzg2l_cpg_pll_clk_register(core, priv->clks,
-                                                priv->base, priv);
-               break;
-       case CLK_TYPE_DIV:
-               clk = rzg2l_cpg_div_clk_register(core, priv->clks,
-                                                priv->base, priv);
-               break;
-       default:
-               goto fail;
-       };
-
-       if (IS_ERR_OR_NULL(clk))
-               goto fail;
-
-       dev_dbg(dev, "Core clock %pC at %lu Hz\n", clk, clk_get_rate(clk));
-       priv->clks[id] = clk;
-       return;
-
-fail:
-       dev_err(dev, "Failed to register %s clock %s: %ld\n", "core",
-               core->name, PTR_ERR(clk));
-}
-
-/**
- * struct mstp_clock - MSTP gating clock
- *
- * @hw: handle between common and hardware-specific interfaces
- * @off: register offset
- * @bit: ON/MON bit
- * @priv: CPG/MSTP private data
- */
-struct mstp_clock {
-       struct clk_hw hw;
-       u16 off;
-       u8 bit;
-       struct rzg2l_cpg_priv *priv;
-};
-
-#define to_mod_clock(_hw) container_of(_hw, struct mstp_clock, hw)
-
-static int rzg2l_mod_clock_endisable(struct clk_hw *hw, bool enable)
-{
-       struct mstp_clock *clock = to_mod_clock(hw);
-       struct rzg2l_cpg_priv *priv = clock->priv;
-       unsigned int reg = clock->off;
-       struct device *dev = priv->dev;
-       unsigned long flags;
-       unsigned int i;
-       u32 bitmask = BIT(clock->bit);
-       u32 value;
-
-       if (!clock->off) {
-               dev_dbg(dev, "%pC does not support ON/OFF\n",  hw->clk);
-               return 0;
-       }
-
-       dev_dbg(dev, "CLK_ON %u/%pC %s\n", CLK_ON_R(reg), hw->clk,
-               enable ? "ON" : "OFF");
-       spin_lock_irqsave(&priv->rmw_lock, flags);
-
-       if (enable)
-               value = (bitmask << 16) | bitmask;
-       else
-               value = bitmask << 16;
-       writel(value, priv->base + CLK_ON_R(reg));
-
-       spin_unlock_irqrestore(&priv->rmw_lock, flags);
-
-       if (!enable)
-               return 0;
-
-       for (i = 1000; i > 0; --i) {
-               if (((readl(priv->base + CLK_MON_R(reg))) & bitmask))
-                       break;
-               cpu_relax();
-       }
-
-       if (!i) {
-               dev_err(dev, "Failed to enable CLK_ON %p\n",
-                       priv->base + CLK_ON_R(reg));
-               return -ETIMEDOUT;
-       }
-
-       return 0;
-}
-
-static int rzg2l_mod_clock_enable(struct clk_hw *hw)
-{
-       return rzg2l_mod_clock_endisable(hw, true);
-}
-
-static void rzg2l_mod_clock_disable(struct clk_hw *hw)
-{
-       rzg2l_mod_clock_endisable(hw, false);
-}
-
-static int rzg2l_mod_clock_is_enabled(struct clk_hw *hw)
-{
-       struct mstp_clock *clock = to_mod_clock(hw);
-       struct rzg2l_cpg_priv *priv = clock->priv;
-       u32 bitmask = BIT(clock->bit);
-       u32 value;
-
-       if (!clock->off) {
-               dev_dbg(priv->dev, "%pC does not support ON/OFF\n",  hw->clk);
-               return 1;
-       }
-
-       value = readl(priv->base + CLK_MON_R(clock->off));
-
-       return !(value & bitmask);
-}
-
-static const struct clk_ops rzg2l_mod_clock_ops = {
-       .enable = rzg2l_mod_clock_enable,
-       .disable = rzg2l_mod_clock_disable,
-       .is_enabled = rzg2l_mod_clock_is_enabled,
-};
-
-static void __init
-rzg2l_cpg_register_mod_clk(const struct rzg2l_mod_clk *mod,
-                          const struct rzg2l_cpg_info *info,
-                          struct rzg2l_cpg_priv *priv)
-{
-       struct mstp_clock *clock = NULL;
-       struct device *dev = priv->dev;
-       unsigned int id = mod->id;
-       struct clk_init_data init;
-       struct clk *parent, *clk;
-       const char *parent_name;
-       unsigned int i;
-
-       WARN_DEBUG(id < priv->num_core_clks);
-       WARN_DEBUG(id >= priv->num_core_clks + priv->num_mod_clks);
-       WARN_DEBUG(mod->parent >= priv->num_core_clks + priv->num_mod_clks);
-       WARN_DEBUG(PTR_ERR(priv->clks[id]) != -ENOENT);
-
-       if (!mod->name) {
-               /* Skip NULLified clock */
-               return;
-       }
-
-       parent = priv->clks[mod->parent];
-       if (IS_ERR(parent)) {
-               clk = parent;
-               goto fail;
-       }
-
-       clock = devm_kzalloc(dev, sizeof(*clock), GFP_KERNEL);
-       if (!clock) {
-               clk = ERR_PTR(-ENOMEM);
-               goto fail;
-       }
-
-       init.name = mod->name;
-       init.ops = &rzg2l_mod_clock_ops;
-       init.flags = CLK_SET_RATE_PARENT;
-       for (i = 0; i < info->num_crit_mod_clks; i++)
-               if (id == info->crit_mod_clks[i]) {
-                       dev_dbg(dev, "CPG %s setting CLK_IS_CRITICAL\n",
-                               mod->name);
-                       init.flags |= CLK_IS_CRITICAL;
-                       break;
-               }
-
-       parent_name = __clk_get_name(parent);
-       init.parent_names = &parent_name;
-       init.num_parents = 1;
-
-       clock->off = mod->off;
-       clock->bit = mod->bit;
-       clock->priv = priv;
-       clock->hw.init = &init;
-
-       clk = clk_register(NULL, &clock->hw);
-       if (IS_ERR(clk))
-               goto fail;
-
-       dev_dbg(dev, "Module clock %pC at %lu Hz\n", clk, clk_get_rate(clk));
-       priv->clks[id] = clk;
-       return;
-
-fail:
-       dev_err(dev, "Failed to register %s clock %s: %ld\n", "module",
-               mod->name, PTR_ERR(clk));
-       kfree(clock);
-}
-
-#define rcdev_to_priv(x)       container_of(x, struct rzg2l_cpg_priv, rcdev)
-
-static int rzg2l_cpg_reset(struct reset_controller_dev *rcdev,
-                          unsigned long id)
-{
-       struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
-       const struct rzg2l_cpg_info *info = priv->info;
-       unsigned int reg = info->resets[id].off;
-       u32 dis = BIT(info->resets[id].bit);
-       u32 we = dis << 16;
-
-       dev_dbg(rcdev->dev, "reset id:%ld offset:0x%x\n", id, CLK_RST_R(reg));
-
-       /* Reset module */
-       writel(we, priv->base + CLK_RST_R(reg));
-
-       /* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */
-       udelay(35);
-
-       /* Release module from reset state */
-       writel(we | dis, priv->base + CLK_RST_R(reg));
-
-       return 0;
-}
-
-static int rzg2l_cpg_assert(struct reset_controller_dev *rcdev,
-                           unsigned long id)
-{
-       struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
-       const struct rzg2l_cpg_info *info = priv->info;
-       unsigned int reg = info->resets[id].off;
-       u32 value = BIT(info->resets[id].bit) << 16;
-
-       dev_dbg(rcdev->dev, "assert id:%ld offset:0x%x\n", id, CLK_RST_R(reg));
-
-       writel(value, priv->base + CLK_RST_R(reg));
-       return 0;
-}
-
-static int rzg2l_cpg_deassert(struct reset_controller_dev *rcdev,
-                             unsigned long id)
-{
-       struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
-       const struct rzg2l_cpg_info *info = priv->info;
-       unsigned int reg = info->resets[id].off;
-       u32 dis = BIT(info->resets[id].bit);
-       u32 value = (dis << 16) | dis;
-
-       dev_dbg(rcdev->dev, "deassert id:%ld offset:0x%x\n", id,
-               CLK_RST_R(reg));
-
-       writel(value, priv->base + CLK_RST_R(reg));
-       return 0;
-}
-
-static int rzg2l_cpg_status(struct reset_controller_dev *rcdev,
-                           unsigned long id)
-{
-       struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
-       const struct rzg2l_cpg_info *info = priv->info;
-       unsigned int reg = info->resets[id].off;
-       u32 bitmask = BIT(info->resets[id].bit);
-
-       return !(readl(priv->base + CLK_MRST_R(reg)) & bitmask);
-}
-
-static const struct reset_control_ops rzg2l_cpg_reset_ops = {
-       .reset = rzg2l_cpg_reset,
-       .assert = rzg2l_cpg_assert,
-       .deassert = rzg2l_cpg_deassert,
-       .status = rzg2l_cpg_status,
-};
-
-static int rzg2l_cpg_reset_xlate(struct reset_controller_dev *rcdev,
-                                const struct of_phandle_args *reset_spec)
-{
-       struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
-       const struct rzg2l_cpg_info *info = priv->info;
-       unsigned int id = reset_spec->args[0];
-
-       if (id >= rcdev->nr_resets || !info->resets[id].off) {
-               dev_err(rcdev->dev, "Invalid reset index %u\n", id);
-               return -EINVAL;
-       }
-
-       return id;
-}
-
-static int rzg2l_cpg_reset_controller_register(struct rzg2l_cpg_priv *priv)
-{
-       priv->rcdev.ops = &rzg2l_cpg_reset_ops;
-       priv->rcdev.of_node = priv->dev->of_node;
-       priv->rcdev.dev = priv->dev;
-       priv->rcdev.of_reset_n_cells = 1;
-       priv->rcdev.of_xlate = rzg2l_cpg_reset_xlate;
-       priv->rcdev.nr_resets = priv->num_resets;
-
-       return devm_reset_controller_register(priv->dev, &priv->rcdev);
-}
-
-static bool rzg2l_cpg_is_pm_clk(const struct of_phandle_args *clkspec)
-{
-       if (clkspec->args_count != 2)
-               return false;
-
-       switch (clkspec->args[0]) {
-       case CPG_MOD:
-               return true;
-
-       default:
-               return false;
-       }
-}
-
-static int rzg2l_cpg_attach_dev(struct generic_pm_domain *unused, struct device *dev)
-{
-       struct device_node *np = dev->of_node;
-       struct of_phandle_args clkspec;
-       bool once = true;
-       struct clk *clk;
-       int error;
-       int i = 0;
-
-       while (!of_parse_phandle_with_args(np, "clocks", "#clock-cells", i,
-                                          &clkspec)) {
-               if (rzg2l_cpg_is_pm_clk(&clkspec)) {
-                       if (once) {
-                               once = false;
-                               error = pm_clk_create(dev);
-                               if (error) {
-                                       of_node_put(clkspec.np);
-                                       goto err;
-                               }
-                       }
-                       clk = of_clk_get_from_provider(&clkspec);
-                       of_node_put(clkspec.np);
-                       if (IS_ERR(clk)) {
-                               error = PTR_ERR(clk);
-                               goto fail_destroy;
-                       }
-
-                       error = pm_clk_add_clk(dev, clk);
-                       if (error) {
-                               dev_err(dev, "pm_clk_add_clk failed %d\n",
-                                       error);
-                               goto fail_put;
-                       }
-               } else {
-                       of_node_put(clkspec.np);
-               }
-               i++;
-       }
-
-       return 0;
-
-fail_put:
-       clk_put(clk);
-
-fail_destroy:
-       pm_clk_destroy(dev);
-err:
-       return error;
-}
-
-static void rzg2l_cpg_detach_dev(struct generic_pm_domain *unused, struct device *dev)
-{
-       if (!pm_clk_no_clocks(dev))
-               pm_clk_destroy(dev);
-}
-
-static int __init rzg2l_cpg_add_clk_domain(struct device *dev)
-{
-       struct device_node *np = dev->of_node;
-       struct generic_pm_domain *genpd;
-
-       genpd = devm_kzalloc(dev, sizeof(*genpd), GFP_KERNEL);
-       if (!genpd)
-               return -ENOMEM;
-
-       genpd->name = np->name;
-       genpd->flags = GENPD_FLAG_PM_CLK | GENPD_FLAG_ALWAYS_ON |
-                      GENPD_FLAG_ACTIVE_WAKEUP;
-       genpd->attach_dev = rzg2l_cpg_attach_dev;
-       genpd->detach_dev = rzg2l_cpg_detach_dev;
-       pm_genpd_init(genpd, &pm_domain_always_on_gov, false);
-
-       of_genpd_add_provider_simple(np, genpd);
-       return 0;
-}
-
-static int __init rzg2l_cpg_probe(struct platform_device *pdev)
-{
-       struct device *dev = &pdev->dev;
-       struct device_node *np = dev->of_node;
-       const struct rzg2l_cpg_info *info;
-       struct rzg2l_cpg_priv *priv;
-       unsigned int nclks, i;
-       struct clk **clks;
-       int error;
-
-       info = of_device_get_match_data(dev);
-
-       priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
-       if (!priv)
-               return -ENOMEM;
-
-       priv->dev = dev;
-       priv->info = info;
-       spin_lock_init(&priv->rmw_lock);
-
-       priv->base = devm_platform_ioremap_resource(pdev, 0);
-       if (IS_ERR(priv->base))
-               return PTR_ERR(priv->base);
-
-       nclks = info->num_total_core_clks + info->num_hw_mod_clks;
-       clks = devm_kmalloc_array(dev, nclks, sizeof(*clks), GFP_KERNEL);
-       if (!clks)
-               return -ENOMEM;
-
-       dev_set_drvdata(dev, priv);
-       priv->clks = clks;
-       priv->num_core_clks = info->num_total_core_clks;
-       priv->num_mod_clks = info->num_hw_mod_clks;
-       priv->num_resets = info->num_resets;
-       priv->last_dt_core_clk = info->last_dt_core_clk;
-
-       for (i = 0; i < nclks; i++)
-               clks[i] = ERR_PTR(-ENOENT);
-
-       for (i = 0; i < info->num_core_clks; i++)
-               rzg2l_cpg_register_core_clk(&info->core_clks[i], info, priv);
-
-       for (i = 0; i < info->num_mod_clks; i++)
-               rzg2l_cpg_register_mod_clk(&info->mod_clks[i], info, priv);
-
-       error = of_clk_add_provider(np, rzg2l_cpg_clk_src_twocell_get, priv);
-       if (error)
-               return error;
-
-       error = devm_add_action_or_reset(dev, rzg2l_cpg_del_clk_provider, np);
-       if (error)
-               return error;
-
-       error = rzg2l_cpg_add_clk_domain(dev);
-       if (error)
-               return error;
-
-       error = rzg2l_cpg_reset_controller_register(priv);
-       if (error)
-               return error;
-
-       return 0;
-}
-
-static const struct of_device_id rzg2l_cpg_match[] = {
-#ifdef CONFIG_CLK_R9A07G044
-       {
-               .compatible = "renesas,r9a07g044-cpg",
-               .data = &r9a07g044_cpg_info,
-       },
-#endif
-       { /* sentinel */ }
-};
-
-static struct platform_driver rzg2l_cpg_driver = {
-       .driver         = {
-               .name   = "rzg2l-cpg",
-               .of_match_table = rzg2l_cpg_match,
-       },
-};
-
-static int __init rzg2l_cpg_init(void)
-{
-       return platform_driver_probe(&rzg2l_cpg_driver, rzg2l_cpg_probe);
-}
-
-subsys_initcall(rzg2l_cpg_init);
-
-MODULE_DESCRIPTION("Renesas RZ/G2L CPG Driver");
-MODULE_LICENSE("GPL v2");
diff --git a/drivers/clk/renesas/renesas-rzg2l-cpg.h b/drivers/clk/renesas/renesas-rzg2l-cpg.h
deleted file mode 100644 (file)
index 6369528..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * RZ/G2L Clock Pulse Generator
- *
- * Copyright (C) 2021 Renesas Electronics Corp.
- *
- */
-
-#ifndef __RENESAS_RZG2L_CPG_H__
-#define __RENESAS_RZG2L_CPG_H__
-
-#define CPG_PL2_DDIV           (0x204)
-#define CPG_PL3A_DDIV          (0x208)
-
-/* n = 0/1/2 for PLL1/4/6 */
-#define CPG_SAMPLL_CLK1(n)     (0x04 + (16 * n))
-#define CPG_SAMPLL_CLK2(n)     (0x08 + (16 * n))
-
-#define PLL146_CONF(n) (CPG_SAMPLL_CLK1(n) << 22 | CPG_SAMPLL_CLK2(n) << 12)
-
-#define DDIV_PACK(offset, bitpos, size) \
-               (((offset) << 20) | ((bitpos) << 12) | ((size) << 8))
-#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)
-
-/**
- * Definitions of CPG Core Clocks
- *
- * These include:
- *   - Clock outputs exported to DT
- *   - External input clocks
- *   - Internal CPG clocks
- */
-struct cpg_core_clk {
-       const char *name;
-       unsigned int id;
-       unsigned int parent;
-       unsigned int div;
-       unsigned int mult;
-       unsigned int type;
-       unsigned int conf;
-       const struct clk_div_table *dtable;
-       const char * const *parent_names;
-       int flag;
-       int num_parents;
-};
-
-enum clk_types {
-       /* Generic */
-       CLK_TYPE_IN,            /* External Clock Input */
-       CLK_TYPE_FF,            /* Fixed Factor Clock */
-       CLK_TYPE_SAM_PLL,
-
-       /* Clock with divider */
-       CLK_TYPE_DIV,
-};
-
-#define DEF_TYPE(_name, _id, _type...) \
-       { .name = _name, .id = _id, .type = _type }
-#define DEF_BASE(_name, _id, _type, _parent...) \
-       DEF_TYPE(_name, _id, _type, .parent = _parent)
-#define DEF_SAMPLL(_name, _id, _parent, _conf) \
-       DEF_TYPE(_name, _id, CLK_TYPE_SAM_PLL, .parent = _parent, .conf = _conf)
-#define DEF_INPUT(_name, _id) \
-       DEF_TYPE(_name, _id, CLK_TYPE_IN)
-#define DEF_FIXED(_name, _id, _parent, _mult, _div) \
-       DEF_BASE(_name, _id, CLK_TYPE_FF, _parent, .div = _div, .mult = _mult)
-#define DEF_DIV(_name, _id, _parent, _conf, _dtable, _flag) \
-       DEF_TYPE(_name, _id, CLK_TYPE_DIV, .conf = _conf, \
-                .parent = _parent, .dtable = _dtable, .flag = _flag)
-
-/**
- * struct rzg2l_mod_clk - Module Clocks definitions
- *
- * @name: handle between common and hardware-specific interfaces
- * @id: clock index in array containing all Core and Module Clocks
- * @parent: id of parent clock
- * @off: register offset
- * @bit: ON/MON bit
- */
-struct rzg2l_mod_clk {
-       const char *name;
-       unsigned int id;
-       unsigned int parent;
-       u16 off;
-       u8 bit;
-};
-
-#define DEF_MOD(_name, _id, _parent, _off, _bit)       \
-       { \
-               .name = _name, \
-               .id = MOD_CLK_BASE + (_id), \
-               .parent = (_parent), \
-               .off = (_off), \
-               .bit = (_bit), \
-       }
-
-/**
- * struct rzg2l_reset - Reset definitions
- *
- * @off: register offset
- * @bit: reset bit
- */
-struct rzg2l_reset {
-       u16 off;
-       u8 bit;
-};
-
-#define DEF_RST(_id, _off, _bit)       \
-       [_id] = { \
-               .off = (_off), \
-               .bit = (_bit) \
-       }
-
-/**
- * struct rzg2l_cpg_info - SoC-specific CPG Description
- *
- * @core_clks: Array of Core Clock definitions
- * @num_core_clks: Number of entries in core_clks[]
- * @last_dt_core_clk: ID of the last Core Clock exported to DT
- * @num_total_core_clks: Total number of Core Clocks (exported + internal)
- *
- * @mod_clks: Array of Module Clock definitions
- * @num_mod_clks: Number of entries in mod_clks[]
- * @num_hw_mod_clks: Number of Module Clocks supported by the hardware
- *
- * @crit_mod_clks: Array with Module Clock IDs of critical clocks that
- *                 should not be disabled without a knowledgeable driver
- * @num_crit_mod_clks: Number of entries in crit_mod_clks[]
- */
-struct rzg2l_cpg_info {
-       /* Core Clocks */
-       const struct cpg_core_clk *core_clks;
-       unsigned int num_core_clks;
-       unsigned int last_dt_core_clk;
-       unsigned int num_total_core_clks;
-
-       /* Module Clocks */
-       const struct rzg2l_mod_clk *mod_clks;
-       unsigned int num_mod_clks;
-       unsigned int num_hw_mod_clks;
-
-       /* Resets */
-       const struct rzg2l_reset *resets;
-       unsigned int num_resets;
-
-       /* Critical Module Clocks that should not be disabled */
-       const unsigned int *crit_mod_clks;
-       unsigned int num_crit_mod_clks;
-};
-
-extern const struct rzg2l_cpg_info r9a07g044_cpg_info;
-
-#endif
diff --git a/drivers/clk/renesas/rzg2l-cpg.c b/drivers/clk/renesas/rzg2l-cpg.c
new file mode 100644 (file)
index 0000000..3b3b2c3
--- /dev/null
@@ -0,0 +1,750 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * RZ/G2L Clock Pulse Generator
+ *
+ * Copyright (C) 2021 Renesas Electronics Corp.
+ *
+ * Based on renesas-cpg-mssr.c
+ *
+ * Copyright (C) 2015 Glider bvba
+ * Copyright (C) 2013 Ideas On Board SPRL
+ * Copyright (C) 2015 Renesas Electronics Corp.
+ */
+
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/clk/renesas.h>
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/init.h>
+#include <linux/mod_devicetable.h>
+#include <linux/module.h>
+#include <linux/of_address.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/pm_clock.h>
+#include <linux/pm_domain.h>
+#include <linux/reset-controller.h>
+#include <linux/slab.h>
+
+#include <dt-bindings/clock/renesas-cpg-mssr.h>
+
+#include "rzg2l-cpg.h"
+
+#ifdef DEBUG
+#define WARN_DEBUG(x)  WARN_ON(x)
+#else
+#define WARN_DEBUG(x)  do { } while (0)
+#endif
+
+#define DIV_RSMASK(v, s, m)    ((v >> s) & m)
+#define GET_SHIFT(val)         ((val >> 12) & 0xff)
+#define GET_WIDTH(val)         ((val >> 8) & 0xf)
+
+#define KDIV(val)              DIV_RSMASK(val, 16, 0xffff)
+#define MDIV(val)              DIV_RSMASK(val, 6, 0x3ff)
+#define PDIV(val)              DIV_RSMASK(val, 0, 0x3f)
+#define SDIV(val)              DIV_RSMASK(val, 0, 0x7)
+
+#define CLK_ON_R(reg)          (reg)
+#define CLK_MON_R(reg)         (0x180 + (reg))
+#define CLK_RST_R(reg)         (reg)
+#define CLK_MRST_R(reg)                (0x180 + (reg))
+
+#define GET_REG_OFFSET(val)            ((val >> 20) & 0xfff)
+#define GET_REG_SAMPLL_CLK1(val)       ((val >> 22) & 0xfff)
+#define GET_REG_SAMPLL_CLK2(val)       ((val >> 12) & 0xfff)
+
+/**
+ * struct rzg2l_cpg_priv - Clock Pulse Generator Private Data
+ *
+ * @rcdev: Reset controller entity
+ * @dev: CPG device
+ * @base: CPG register block base address
+ * @rmw_lock: protects register accesses
+ * @clks: Array containing all Core and Module Clocks
+ * @num_core_clks: Number of Core Clocks in clks[]
+ * @num_mod_clks: Number of Module Clocks in clks[]
+ * @last_dt_core_clk: ID of the last Core Clock exported to DT
+ * @notifiers: Notifier chain to save/restore clock state for system resume
+ * @info: Pointer to platform data
+ */
+struct rzg2l_cpg_priv {
+       struct reset_controller_dev rcdev;
+       struct device *dev;
+       void __iomem *base;
+       spinlock_t rmw_lock;
+
+       struct clk **clks;
+       unsigned int num_core_clks;
+       unsigned int num_mod_clks;
+       unsigned int num_resets;
+       unsigned int last_dt_core_clk;
+
+       struct raw_notifier_head notifiers;
+       const struct rzg2l_cpg_info *info;
+};
+
+static void rzg2l_cpg_del_clk_provider(void *data)
+{
+       of_clk_del_provider(data);
+}
+
+static struct clk * __init
+rzg2l_cpg_div_clk_register(const struct cpg_core_clk *core,
+                          struct clk **clks,
+                          void __iomem *base,
+                          struct rzg2l_cpg_priv *priv)
+{
+       struct device *dev = priv->dev;
+       const struct clk *parent;
+       const char *parent_name;
+       struct clk_hw *clk_hw;
+
+       parent = clks[core->parent & 0xffff];
+       if (IS_ERR(parent))
+               return ERR_CAST(parent);
+
+       parent_name = __clk_get_name(parent);
+
+       if (core->dtable)
+               clk_hw = clk_hw_register_divider_table(dev, core->name,
+                                                      parent_name, 0,
+                                                      base + GET_REG_OFFSET(core->conf),
+                                                      GET_SHIFT(core->conf),
+                                                      GET_WIDTH(core->conf),
+                                                      core->flag,
+                                                      core->dtable,
+                                                      &priv->rmw_lock);
+       else
+               clk_hw = clk_hw_register_divider(dev, core->name,
+                                                parent_name, 0,
+                                                base + GET_REG_OFFSET(core->conf),
+                                                GET_SHIFT(core->conf),
+                                                GET_WIDTH(core->conf),
+                                                core->flag, &priv->rmw_lock);
+
+       if (IS_ERR(clk_hw))
+               return ERR_CAST(clk_hw);
+
+       return clk_hw->clk;
+}
+
+struct pll_clk {
+       struct clk_hw hw;
+       unsigned int conf;
+       unsigned int type;
+       void __iomem *base;
+       struct rzg2l_cpg_priv *priv;
+};
+
+#define to_pll(_hw)    container_of(_hw, struct pll_clk, hw)
+
+static unsigned long rzg2l_cpg_pll_clk_recalc_rate(struct clk_hw *hw,
+                                                  unsigned long parent_rate)
+{
+       struct pll_clk *pll_clk = to_pll(hw);
+       struct rzg2l_cpg_priv *priv = pll_clk->priv;
+       unsigned int val1, val2;
+       unsigned int mult = 1;
+       unsigned int div = 1;
+
+       if (pll_clk->type != CLK_TYPE_SAM_PLL)
+               return parent_rate;
+
+       val1 = readl(priv->base + GET_REG_SAMPLL_CLK1(pll_clk->conf));
+       val2 = readl(priv->base + GET_REG_SAMPLL_CLK2(pll_clk->conf));
+       mult = MDIV(val1) + KDIV(val1) / 65536;
+       div = PDIV(val1) * (1 << SDIV(val2));
+
+       return DIV_ROUND_CLOSEST_ULL((u64)parent_rate * mult, div);
+}
+
+static const struct clk_ops rzg2l_cpg_pll_ops = {
+       .recalc_rate = rzg2l_cpg_pll_clk_recalc_rate,
+};
+
+static struct clk * __init
+rzg2l_cpg_pll_clk_register(const struct cpg_core_clk *core,
+                          struct clk **clks,
+                          void __iomem *base,
+                          struct rzg2l_cpg_priv *priv)
+{
+       struct device *dev = priv->dev;
+       const struct clk *parent;
+       struct clk_init_data init;
+       const char *parent_name;
+       struct pll_clk *pll_clk;
+
+       parent = clks[core->parent & 0xffff];
+       if (IS_ERR(parent))
+               return ERR_CAST(parent);
+
+       pll_clk = devm_kzalloc(dev, sizeof(*pll_clk), GFP_KERNEL);
+       if (!pll_clk)
+               return ERR_PTR(-ENOMEM);
+
+       parent_name = __clk_get_name(parent);
+       init.name = core->name;
+       init.ops = &rzg2l_cpg_pll_ops;
+       init.flags = 0;
+       init.parent_names = &parent_name;
+       init.num_parents = 1;
+
+       pll_clk->hw.init = &init;
+       pll_clk->conf = core->conf;
+       pll_clk->base = base;
+       pll_clk->priv = priv;
+       pll_clk->type = core->type;
+
+       return clk_register(NULL, &pll_clk->hw);
+}
+
+static struct clk
+*rzg2l_cpg_clk_src_twocell_get(struct of_phandle_args *clkspec,
+                              void *data)
+{
+       unsigned int clkidx = clkspec->args[1];
+       struct rzg2l_cpg_priv *priv = data;
+       struct device *dev = priv->dev;
+       const char *type;
+       struct clk *clk;
+
+       switch (clkspec->args[0]) {
+       case CPG_CORE:
+               type = "core";
+               if (clkidx > priv->last_dt_core_clk) {
+                       dev_err(dev, "Invalid %s clock index %u\n", type, clkidx);
+                       return ERR_PTR(-EINVAL);
+               }
+               clk = priv->clks[clkidx];
+               break;
+
+       case CPG_MOD:
+               type = "module";
+               if (clkidx >= priv->num_mod_clks) {
+                       dev_err(dev, "Invalid %s clock index %u\n", type,
+                               clkidx);
+                       return ERR_PTR(-EINVAL);
+               }
+               clk = priv->clks[priv->num_core_clks + clkidx];
+               break;
+
+       default:
+               dev_err(dev, "Invalid CPG clock type %u\n", clkspec->args[0]);
+               return ERR_PTR(-EINVAL);
+       }
+
+       if (IS_ERR(clk))
+               dev_err(dev, "Cannot get %s clock %u: %ld", type, clkidx,
+                       PTR_ERR(clk));
+       else
+               dev_dbg(dev, "clock (%u, %u) is %pC at %lu Hz\n",
+                       clkspec->args[0], clkspec->args[1], clk,
+                       clk_get_rate(clk));
+       return clk;
+}
+
+static void __init
+rzg2l_cpg_register_core_clk(const struct cpg_core_clk *core,
+                           const struct rzg2l_cpg_info *info,
+                           struct rzg2l_cpg_priv *priv)
+{
+       struct clk *clk = ERR_PTR(-EOPNOTSUPP), *parent;
+       struct device *dev = priv->dev;
+       unsigned int id = core->id, div = core->div;
+       const char *parent_name;
+
+       WARN_DEBUG(id >= priv->num_core_clks);
+       WARN_DEBUG(PTR_ERR(priv->clks[id]) != -ENOENT);
+
+       if (!core->name) {
+               /* Skip NULLified clock */
+               return;
+       }
+
+       switch (core->type) {
+       case CLK_TYPE_IN:
+               clk = of_clk_get_by_name(priv->dev->of_node, core->name);
+               break;
+       case CLK_TYPE_FF:
+               WARN_DEBUG(core->parent >= priv->num_core_clks);
+               parent = priv->clks[core->parent];
+               if (IS_ERR(parent)) {
+                       clk = parent;
+                       goto fail;
+               }
+
+               parent_name = __clk_get_name(parent);
+               clk = clk_register_fixed_factor(NULL, core->name,
+                                               parent_name, CLK_SET_RATE_PARENT,
+                                               core->mult, div);
+               break;
+       case CLK_TYPE_SAM_PLL:
+               clk = rzg2l_cpg_pll_clk_register(core, priv->clks,
+                                                priv->base, priv);
+               break;
+       case CLK_TYPE_DIV:
+               clk = rzg2l_cpg_div_clk_register(core, priv->clks,
+                                                priv->base, priv);
+               break;
+       default:
+               goto fail;
+       }
+
+       if (IS_ERR_OR_NULL(clk))
+               goto fail;
+
+       dev_dbg(dev, "Core clock %pC at %lu Hz\n", clk, clk_get_rate(clk));
+       priv->clks[id] = clk;
+       return;
+
+fail:
+       dev_err(dev, "Failed to register %s clock %s: %ld\n", "core",
+               core->name, PTR_ERR(clk));
+}
+
+/**
+ * struct mstp_clock - MSTP gating clock
+ *
+ * @hw: handle between common and hardware-specific interfaces
+ * @off: register offset
+ * @bit: ON/MON bit
+ * @priv: CPG/MSTP private data
+ */
+struct mstp_clock {
+       struct clk_hw hw;
+       u16 off;
+       u8 bit;
+       struct rzg2l_cpg_priv *priv;
+};
+
+#define to_mod_clock(_hw) container_of(_hw, struct mstp_clock, hw)
+
+static int rzg2l_mod_clock_endisable(struct clk_hw *hw, bool enable)
+{
+       struct mstp_clock *clock = to_mod_clock(hw);
+       struct rzg2l_cpg_priv *priv = clock->priv;
+       unsigned int reg = clock->off;
+       struct device *dev = priv->dev;
+       unsigned long flags;
+       unsigned int i;
+       u32 bitmask = BIT(clock->bit);
+       u32 value;
+
+       if (!clock->off) {
+               dev_dbg(dev, "%pC does not support ON/OFF\n",  hw->clk);
+               return 0;
+       }
+
+       dev_dbg(dev, "CLK_ON %u/%pC %s\n", CLK_ON_R(reg), hw->clk,
+               enable ? "ON" : "OFF");
+       spin_lock_irqsave(&priv->rmw_lock, flags);
+
+       if (enable)
+               value = (bitmask << 16) | bitmask;
+       else
+               value = bitmask << 16;
+       writel(value, priv->base + CLK_ON_R(reg));
+
+       spin_unlock_irqrestore(&priv->rmw_lock, flags);
+
+       if (!enable)
+               return 0;
+
+       for (i = 1000; i > 0; --i) {
+               if (((readl(priv->base + CLK_MON_R(reg))) & bitmask))
+                       break;
+               cpu_relax();
+       }
+
+       if (!i) {
+               dev_err(dev, "Failed to enable CLK_ON %p\n",
+                       priv->base + CLK_ON_R(reg));
+               return -ETIMEDOUT;
+       }
+
+       return 0;
+}
+
+static int rzg2l_mod_clock_enable(struct clk_hw *hw)
+{
+       return rzg2l_mod_clock_endisable(hw, true);
+}
+
+static void rzg2l_mod_clock_disable(struct clk_hw *hw)
+{
+       rzg2l_mod_clock_endisable(hw, false);
+}
+
+static int rzg2l_mod_clock_is_enabled(struct clk_hw *hw)
+{
+       struct mstp_clock *clock = to_mod_clock(hw);
+       struct rzg2l_cpg_priv *priv = clock->priv;
+       u32 bitmask = BIT(clock->bit);
+       u32 value;
+
+       if (!clock->off) {
+               dev_dbg(priv->dev, "%pC does not support ON/OFF\n",  hw->clk);
+               return 1;
+       }
+
+       value = readl(priv->base + CLK_MON_R(clock->off));
+
+       return !(value & bitmask);
+}
+
+static const struct clk_ops rzg2l_mod_clock_ops = {
+       .enable = rzg2l_mod_clock_enable,
+       .disable = rzg2l_mod_clock_disable,
+       .is_enabled = rzg2l_mod_clock_is_enabled,
+};
+
+static void __init
+rzg2l_cpg_register_mod_clk(const struct rzg2l_mod_clk *mod,
+                          const struct rzg2l_cpg_info *info,
+                          struct rzg2l_cpg_priv *priv)
+{
+       struct mstp_clock *clock = NULL;
+       struct device *dev = priv->dev;
+       unsigned int id = mod->id;
+       struct clk_init_data init;
+       struct clk *parent, *clk;
+       const char *parent_name;
+       unsigned int i;
+
+       WARN_DEBUG(id < priv->num_core_clks);
+       WARN_DEBUG(id >= priv->num_core_clks + priv->num_mod_clks);
+       WARN_DEBUG(mod->parent >= priv->num_core_clks + priv->num_mod_clks);
+       WARN_DEBUG(PTR_ERR(priv->clks[id]) != -ENOENT);
+
+       if (!mod->name) {
+               /* Skip NULLified clock */
+               return;
+       }
+
+       parent = priv->clks[mod->parent];
+       if (IS_ERR(parent)) {
+               clk = parent;
+               goto fail;
+       }
+
+       clock = devm_kzalloc(dev, sizeof(*clock), GFP_KERNEL);
+       if (!clock) {
+               clk = ERR_PTR(-ENOMEM);
+               goto fail;
+       }
+
+       init.name = mod->name;
+       init.ops = &rzg2l_mod_clock_ops;
+       init.flags = CLK_SET_RATE_PARENT;
+       for (i = 0; i < info->num_crit_mod_clks; i++)
+               if (id == info->crit_mod_clks[i]) {
+                       dev_dbg(dev, "CPG %s setting CLK_IS_CRITICAL\n",
+                               mod->name);
+                       init.flags |= CLK_IS_CRITICAL;
+                       break;
+               }
+
+       parent_name = __clk_get_name(parent);
+       init.parent_names = &parent_name;
+       init.num_parents = 1;
+
+       clock->off = mod->off;
+       clock->bit = mod->bit;
+       clock->priv = priv;
+       clock->hw.init = &init;
+
+       clk = clk_register(NULL, &clock->hw);
+       if (IS_ERR(clk))
+               goto fail;
+
+       dev_dbg(dev, "Module clock %pC at %lu Hz\n", clk, clk_get_rate(clk));
+       priv->clks[id] = clk;
+       return;
+
+fail:
+       dev_err(dev, "Failed to register %s clock %s: %ld\n", "module",
+               mod->name, PTR_ERR(clk));
+}
+
+#define rcdev_to_priv(x)       container_of(x, struct rzg2l_cpg_priv, rcdev)
+
+static int rzg2l_cpg_reset(struct reset_controller_dev *rcdev,
+                          unsigned long id)
+{
+       struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
+       const struct rzg2l_cpg_info *info = priv->info;
+       unsigned int reg = info->resets[id].off;
+       u32 dis = BIT(info->resets[id].bit);
+       u32 we = dis << 16;
+
+       dev_dbg(rcdev->dev, "reset id:%ld offset:0x%x\n", id, CLK_RST_R(reg));
+
+       /* Reset module */
+       writel(we, priv->base + CLK_RST_R(reg));
+
+       /* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */
+       udelay(35);
+
+       /* Release module from reset state */
+       writel(we | dis, priv->base + CLK_RST_R(reg));
+
+       return 0;
+}
+
+static int rzg2l_cpg_assert(struct reset_controller_dev *rcdev,
+                           unsigned long id)
+{
+       struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
+       const struct rzg2l_cpg_info *info = priv->info;
+       unsigned int reg = info->resets[id].off;
+       u32 value = BIT(info->resets[id].bit) << 16;
+
+       dev_dbg(rcdev->dev, "assert id:%ld offset:0x%x\n", id, CLK_RST_R(reg));
+
+       writel(value, priv->base + CLK_RST_R(reg));
+       return 0;
+}
+
+static int rzg2l_cpg_deassert(struct reset_controller_dev *rcdev,
+                             unsigned long id)
+{
+       struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
+       const struct rzg2l_cpg_info *info = priv->info;
+       unsigned int reg = info->resets[id].off;
+       u32 dis = BIT(info->resets[id].bit);
+       u32 value = (dis << 16) | dis;
+
+       dev_dbg(rcdev->dev, "deassert id:%ld offset:0x%x\n", id,
+               CLK_RST_R(reg));
+
+       writel(value, priv->base + CLK_RST_R(reg));
+       return 0;
+}
+
+static int rzg2l_cpg_status(struct reset_controller_dev *rcdev,
+                           unsigned long id)
+{
+       struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
+       const struct rzg2l_cpg_info *info = priv->info;
+       unsigned int reg = info->resets[id].off;
+       u32 bitmask = BIT(info->resets[id].bit);
+
+       return !(readl(priv->base + CLK_MRST_R(reg)) & bitmask);
+}
+
+static const struct reset_control_ops rzg2l_cpg_reset_ops = {
+       .reset = rzg2l_cpg_reset,
+       .assert = rzg2l_cpg_assert,
+       .deassert = rzg2l_cpg_deassert,
+       .status = rzg2l_cpg_status,
+};
+
+static int rzg2l_cpg_reset_xlate(struct reset_controller_dev *rcdev,
+                                const struct of_phandle_args *reset_spec)
+{
+       struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
+       const struct rzg2l_cpg_info *info = priv->info;
+       unsigned int id = reset_spec->args[0];
+
+       if (id >= rcdev->nr_resets || !info->resets[id].off) {
+               dev_err(rcdev->dev, "Invalid reset index %u\n", id);
+               return -EINVAL;
+       }
+
+       return id;
+}
+
+static int rzg2l_cpg_reset_controller_register(struct rzg2l_cpg_priv *priv)
+{
+       priv->rcdev.ops = &rzg2l_cpg_reset_ops;
+       priv->rcdev.of_node = priv->dev->of_node;
+       priv->rcdev.dev = priv->dev;
+       priv->rcdev.of_reset_n_cells = 1;
+       priv->rcdev.of_xlate = rzg2l_cpg_reset_xlate;
+       priv->rcdev.nr_resets = priv->num_resets;
+
+       return devm_reset_controller_register(priv->dev, &priv->rcdev);
+}
+
+static bool rzg2l_cpg_is_pm_clk(const struct of_phandle_args *clkspec)
+{
+       if (clkspec->args_count != 2)
+               return false;
+
+       switch (clkspec->args[0]) {
+       case CPG_MOD:
+               return true;
+
+       default:
+               return false;
+       }
+}
+
+static int rzg2l_cpg_attach_dev(struct generic_pm_domain *unused, struct device *dev)
+{
+       struct device_node *np = dev->of_node;
+       struct of_phandle_args clkspec;
+       bool once = true;
+       struct clk *clk;
+       int error;
+       int i = 0;
+
+       while (!of_parse_phandle_with_args(np, "clocks", "#clock-cells", i,
+                                          &clkspec)) {
+               if (rzg2l_cpg_is_pm_clk(&clkspec)) {
+                       if (once) {
+                               once = false;
+                               error = pm_clk_create(dev);
+                               if (error) {
+                                       of_node_put(clkspec.np);
+                                       goto err;
+                               }
+                       }
+                       clk = of_clk_get_from_provider(&clkspec);
+                       of_node_put(clkspec.np);
+                       if (IS_ERR(clk)) {
+                               error = PTR_ERR(clk);
+                               goto fail_destroy;
+                       }
+
+                       error = pm_clk_add_clk(dev, clk);
+                       if (error) {
+                               dev_err(dev, "pm_clk_add_clk failed %d\n",
+                                       error);
+                               goto fail_put;
+                       }
+               } else {
+                       of_node_put(clkspec.np);
+               }
+               i++;
+       }
+
+       return 0;
+
+fail_put:
+       clk_put(clk);
+
+fail_destroy:
+       pm_clk_destroy(dev);
+err:
+       return error;
+}
+
+static void rzg2l_cpg_detach_dev(struct generic_pm_domain *unused, struct device *dev)
+{
+       if (!pm_clk_no_clocks(dev))
+               pm_clk_destroy(dev);
+}
+
+static int __init rzg2l_cpg_add_clk_domain(struct device *dev)
+{
+       struct device_node *np = dev->of_node;
+       struct generic_pm_domain *genpd;
+
+       genpd = devm_kzalloc(dev, sizeof(*genpd), GFP_KERNEL);
+       if (!genpd)
+               return -ENOMEM;
+
+       genpd->name = np->name;
+       genpd->flags = GENPD_FLAG_PM_CLK | GENPD_FLAG_ALWAYS_ON |
+                      GENPD_FLAG_ACTIVE_WAKEUP;
+       genpd->attach_dev = rzg2l_cpg_attach_dev;
+       genpd->detach_dev = rzg2l_cpg_detach_dev;
+       pm_genpd_init(genpd, &pm_domain_always_on_gov, false);
+
+       of_genpd_add_provider_simple(np, genpd);
+       return 0;
+}
+
+static int __init rzg2l_cpg_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *np = dev->of_node;
+       const struct rzg2l_cpg_info *info;
+       struct rzg2l_cpg_priv *priv;
+       unsigned int nclks, i;
+       struct clk **clks;
+       int error;
+
+       info = of_device_get_match_data(dev);
+
+       priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+       if (!priv)
+               return -ENOMEM;
+
+       priv->dev = dev;
+       priv->info = info;
+       spin_lock_init(&priv->rmw_lock);
+
+       priv->base = devm_platform_ioremap_resource(pdev, 0);
+       if (IS_ERR(priv->base))
+               return PTR_ERR(priv->base);
+
+       nclks = info->num_total_core_clks + info->num_hw_mod_clks;
+       clks = devm_kmalloc_array(dev, nclks, sizeof(*clks), GFP_KERNEL);
+       if (!clks)
+               return -ENOMEM;
+
+       dev_set_drvdata(dev, priv);
+       priv->clks = clks;
+       priv->num_core_clks = info->num_total_core_clks;
+       priv->num_mod_clks = info->num_hw_mod_clks;
+       priv->num_resets = info->num_resets;
+       priv->last_dt_core_clk = info->last_dt_core_clk;
+
+       for (i = 0; i < nclks; i++)
+               clks[i] = ERR_PTR(-ENOENT);
+
+       for (i = 0; i < info->num_core_clks; i++)
+               rzg2l_cpg_register_core_clk(&info->core_clks[i], info, priv);
+
+       for (i = 0; i < info->num_mod_clks; i++)
+               rzg2l_cpg_register_mod_clk(&info->mod_clks[i], info, priv);
+
+       error = of_clk_add_provider(np, rzg2l_cpg_clk_src_twocell_get, priv);
+       if (error)
+               return error;
+
+       error = devm_add_action_or_reset(dev, rzg2l_cpg_del_clk_provider, np);
+       if (error)
+               return error;
+
+       error = rzg2l_cpg_add_clk_domain(dev);
+       if (error)
+               return error;
+
+       error = rzg2l_cpg_reset_controller_register(priv);
+       if (error)
+               return error;
+
+       return 0;
+}
+
+static const struct of_device_id rzg2l_cpg_match[] = {
+#ifdef CONFIG_CLK_R9A07G044
+       {
+               .compatible = "renesas,r9a07g044-cpg",
+               .data = &r9a07g044_cpg_info,
+       },
+#endif
+       { /* sentinel */ }
+};
+
+static struct platform_driver rzg2l_cpg_driver = {
+       .driver         = {
+               .name   = "rzg2l-cpg",
+               .of_match_table = rzg2l_cpg_match,
+       },
+};
+
+static int __init rzg2l_cpg_init(void)
+{
+       return platform_driver_probe(&rzg2l_cpg_driver, rzg2l_cpg_probe);
+}
+
+subsys_initcall(rzg2l_cpg_init);
+
+MODULE_DESCRIPTION("Renesas RZ/G2L CPG Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/clk/renesas/rzg2l-cpg.h b/drivers/clk/renesas/rzg2l-cpg.h
new file mode 100644 (file)
index 0000000..6369528
--- /dev/null
@@ -0,0 +1,155 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * RZ/G2L Clock Pulse Generator
+ *
+ * Copyright (C) 2021 Renesas Electronics Corp.
+ *
+ */
+
+#ifndef __RENESAS_RZG2L_CPG_H__
+#define __RENESAS_RZG2L_CPG_H__
+
+#define CPG_PL2_DDIV           (0x204)
+#define CPG_PL3A_DDIV          (0x208)
+
+/* n = 0/1/2 for PLL1/4/6 */
+#define CPG_SAMPLL_CLK1(n)     (0x04 + (16 * n))
+#define CPG_SAMPLL_CLK2(n)     (0x08 + (16 * n))
+
+#define PLL146_CONF(n) (CPG_SAMPLL_CLK1(n) << 22 | CPG_SAMPLL_CLK2(n) << 12)
+
+#define DDIV_PACK(offset, bitpos, size) \
+               (((offset) << 20) | ((bitpos) << 12) | ((size) << 8))
+#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)
+
+/**
+ * Definitions of CPG Core Clocks
+ *
+ * These include:
+ *   - Clock outputs exported to DT
+ *   - External input clocks
+ *   - Internal CPG clocks
+ */
+struct cpg_core_clk {
+       const char *name;
+       unsigned int id;
+       unsigned int parent;
+       unsigned int div;
+       unsigned int mult;
+       unsigned int type;
+       unsigned int conf;
+       const struct clk_div_table *dtable;
+       const char * const *parent_names;
+       int flag;
+       int num_parents;
+};
+
+enum clk_types {
+       /* Generic */
+       CLK_TYPE_IN,            /* External Clock Input */
+       CLK_TYPE_FF,            /* Fixed Factor Clock */
+       CLK_TYPE_SAM_PLL,
+
+       /* Clock with divider */
+       CLK_TYPE_DIV,
+};
+
+#define DEF_TYPE(_name, _id, _type...) \
+       { .name = _name, .id = _id, .type = _type }
+#define DEF_BASE(_name, _id, _type, _parent...) \
+       DEF_TYPE(_name, _id, _type, .parent = _parent)
+#define DEF_SAMPLL(_name, _id, _parent, _conf) \
+       DEF_TYPE(_name, _id, CLK_TYPE_SAM_PLL, .parent = _parent, .conf = _conf)
+#define DEF_INPUT(_name, _id) \
+       DEF_TYPE(_name, _id, CLK_TYPE_IN)
+#define DEF_FIXED(_name, _id, _parent, _mult, _div) \
+       DEF_BASE(_name, _id, CLK_TYPE_FF, _parent, .div = _div, .mult = _mult)
+#define DEF_DIV(_name, _id, _parent, _conf, _dtable, _flag) \
+       DEF_TYPE(_name, _id, CLK_TYPE_DIV, .conf = _conf, \
+                .parent = _parent, .dtable = _dtable, .flag = _flag)
+
+/**
+ * struct rzg2l_mod_clk - Module Clocks definitions
+ *
+ * @name: handle between common and hardware-specific interfaces
+ * @id: clock index in array containing all Core and Module Clocks
+ * @parent: id of parent clock
+ * @off: register offset
+ * @bit: ON/MON bit
+ */
+struct rzg2l_mod_clk {
+       const char *name;
+       unsigned int id;
+       unsigned int parent;
+       u16 off;
+       u8 bit;
+};
+
+#define DEF_MOD(_name, _id, _parent, _off, _bit)       \
+       { \
+               .name = _name, \
+               .id = MOD_CLK_BASE + (_id), \
+               .parent = (_parent), \
+               .off = (_off), \
+               .bit = (_bit), \
+       }
+
+/**
+ * struct rzg2l_reset - Reset definitions
+ *
+ * @off: register offset
+ * @bit: reset bit
+ */
+struct rzg2l_reset {
+       u16 off;
+       u8 bit;
+};
+
+#define DEF_RST(_id, _off, _bit)       \
+       [_id] = { \
+               .off = (_off), \
+               .bit = (_bit) \
+       }
+
+/**
+ * struct rzg2l_cpg_info - SoC-specific CPG Description
+ *
+ * @core_clks: Array of Core Clock definitions
+ * @num_core_clks: Number of entries in core_clks[]
+ * @last_dt_core_clk: ID of the last Core Clock exported to DT
+ * @num_total_core_clks: Total number of Core Clocks (exported + internal)
+ *
+ * @mod_clks: Array of Module Clock definitions
+ * @num_mod_clks: Number of entries in mod_clks[]
+ * @num_hw_mod_clks: Number of Module Clocks supported by the hardware
+ *
+ * @crit_mod_clks: Array with Module Clock IDs of critical clocks that
+ *                 should not be disabled without a knowledgeable driver
+ * @num_crit_mod_clks: Number of entries in crit_mod_clks[]
+ */
+struct rzg2l_cpg_info {
+       /* Core Clocks */
+       const struct cpg_core_clk *core_clks;
+       unsigned int num_core_clks;
+       unsigned int last_dt_core_clk;
+       unsigned int num_total_core_clks;
+
+       /* Module Clocks */
+       const struct rzg2l_mod_clk *mod_clks;
+       unsigned int num_mod_clks;
+       unsigned int num_hw_mod_clks;
+
+       /* Resets */
+       const struct rzg2l_reset *resets;
+       unsigned int num_resets;
+
+       /* Critical Module Clocks that should not be disabled */
+       const unsigned int *crit_mod_clks;
+       unsigned int num_crit_mod_clks;
+};
+
+extern const struct rzg2l_cpg_info r9a07g044_cpg_info;
+
+#endif
index fe937bc..f7827b3 100644 (file)
@@ -940,7 +940,7 @@ struct clk *rockchip_clk_register_pll(struct rockchip_clk_provider *ctx,
        switch (pll_type) {
        case pll_rk3036:
        case pll_rk3328:
-               if (!pll->rate_table || IS_ERR(ctx->grf))
+               if (!pll->rate_table)
                        init.ops = &rockchip_rk3036_pll_clk_norate_ops;
                else
                        init.ops = &rockchip_rk3036_pll_clk_ops;
index 614845c..d644bc1 100644 (file)
@@ -121,6 +121,7 @@ PNAME(mux_pll_src_3plls_p)  = { "apll", "dpll", "gpll" };
 PNAME(mux_timer_p)             = { "xin24m", "pclk_peri_src" };
 
 PNAME(mux_pll_src_apll_dpll_gpll_usb480m_p)    = { "apll", "dpll", "gpll", "usb480m" };
+PNAME(mux_pll_src_dmyapll_dpll_gpll_xin24_p)   = { "dummy_apll", "dpll", "gpll", "xin24m" };
 
 PNAME(mux_mmc_src_p)   = { "apll", "dpll", "gpll", "xin24m" };
 PNAME(mux_i2s_pre_p)   = { "i2s_src", "i2s_frac", "ext_i2s", "xin12m" };
@@ -340,7 +341,7 @@ static struct rockchip_clk_branch rk3036_clk_branches[] __initdata = {
                        RK2928_CLKSEL_CON(16), 8, 2, MFLAGS, 10, 5, DFLAGS,
                        RK2928_CLKGATE_CON(10), 4, GFLAGS),
 
-       COMPOSITE(SCLK_SFC, "sclk_sfc", mux_pll_src_apll_dpll_gpll_usb480m_p, 0,
+       COMPOSITE(SCLK_SFC, "sclk_sfc", mux_pll_src_dmyapll_dpll_gpll_xin24_p, 0,
                        RK2928_CLKSEL_CON(16), 0, 2, MFLAGS, 2, 5, DFLAGS,
                        RK2928_CLKGATE_CON(10), 5, GFLAGS),
 
@@ -403,7 +404,7 @@ static struct rockchip_clk_branch rk3036_clk_branches[] __initdata = {
        GATE(HCLK_OTG0, "hclk_otg0", "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(5), 13, GFLAGS),
        GATE(HCLK_OTG1, "hclk_otg1", "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(7), 3, GFLAGS),
        GATE(HCLK_I2S, "hclk_i2s", "hclk_peri", 0, RK2928_CLKGATE_CON(7), 2, GFLAGS),
-       GATE(0, "hclk_sfc", "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(3), 14, GFLAGS),
+       GATE(HCLK_SFC, "hclk_sfc", "hclk_peri", 0, RK2928_CLKGATE_CON(3), 14, GFLAGS),
        GATE(HCLK_MAC, "hclk_mac", "hclk_peri", 0, RK2928_CLKGATE_CON(3), 5, GFLAGS),
 
        /* pclk_peri gates */
index 2c3bd0c..db3396c 100644 (file)
@@ -911,6 +911,7 @@ static const char *const rk3308_critical_clocks[] __initconst = {
        "hclk_audio",
        "pclk_audio",
        "sclk_ddrc",
+       "clk_ddrphy4x",
 };
 
 static void __init rk3308_clk_init(struct device_node *np)
index 049e5e0..b7be7e1 100644 (file)
@@ -22,6 +22,8 @@
 #include <linux/regmap.h>
 #include <linux/reboot.h>
 #include <linux/rational.h>
+
+#include "../clk-fractional-divider.h"
 #include "clk.h"
 
 /*
@@ -178,10 +180,8 @@ static void rockchip_fractional_approximation(struct clk_hw *hw,
                unsigned long rate, unsigned long *parent_rate,
                unsigned long *m, unsigned long *n)
 {
-       struct clk_fractional_divider *fd = to_clk_fd(hw);
        unsigned long p_rate, p_parent_rate;
        struct clk_hw *p_parent;
-       unsigned long scale;
 
        p_rate = clk_hw_get_rate(clk_hw_get_parent(hw));
        if ((rate * 20 > p_rate) && (p_rate % rate != 0)) {
@@ -190,18 +190,7 @@ static void rockchip_fractional_approximation(struct clk_hw *hw,
                *parent_rate = p_parent_rate;
        }
 
-       /*
-        * Get rate closer to *parent_rate to guarantee there is no overflow
-        * for m and n. In the result it will be the nearest rate left shifted
-        * by (scale - fd->nwidth) bits.
-        */
-       scale = fls_long(*parent_rate / rate - 1);
-       if (scale > fd->nwidth)
-               rate <<= scale - fd->nwidth;
-
-       rational_best_approximation(rate, *parent_rate,
-                       GENMASK(fd->mwidth - 1, 0), GENMASK(fd->nwidth - 1, 0),
-                       m, n);
+       clk_fractional_divider_general_approximation(hw, rate, parent_rate, m, n);
 }
 
 static struct clk *rockchip_clk_register_frac_branch(
index 1cb21ea..242e94c 100644 (file)
@@ -107,10 +107,10 @@ static const struct clk_parent_data gpio_db_free_mux[] = {
 };
 
 static const struct clk_parent_data psi_ref_free_mux[] = {
-       { .fw_name = "main_pll_c3",
-         .name = "main_pll_c3", },
-       { .fw_name = "peri_pll_c3",
-         .name = "peri_pll_c3", },
+       { .fw_name = "main_pll_c2",
+         .name = "main_pll_c2", },
+       { .fw_name = "peri_pll_c2",
+         .name = "peri_pll_c2", },
        { .fw_name = "osc1",
          .name = "osc1", },
        { .fw_name = "cb-intosc-hs-div2-clk",
@@ -195,6 +195,13 @@ static const struct clk_parent_data sdmmc_mux[] = {
          .name = "boot_clk", },
 };
 
+static const struct clk_parent_data s2f_user0_mux[] = {
+       { .fw_name = "s2f_user0_free_clk",
+         .name = "s2f_user0_free_clk", },
+       { .fw_name = "boot_clk",
+         .name = "boot_clk", },
+};
+
 static const struct clk_parent_data s2f_user1_mux[] = {
        { .fw_name = "s2f_user1_free_clk",
          .name = "s2f_user1_free_clk", },
@@ -273,7 +280,7 @@ static const struct stratix10_perip_cnt_clock agilex_main_perip_cnt_clks[] = {
        { AGILEX_SDMMC_FREE_CLK, "sdmmc_free_clk", NULL, sdmmc_free_mux,
          ARRAY_SIZE(sdmmc_free_mux), 0, 0xE4, 0, 0, 0},
        { AGILEX_S2F_USER0_FREE_CLK, "s2f_user0_free_clk", NULL, s2f_usr0_free_mux,
-         ARRAY_SIZE(s2f_usr0_free_mux), 0, 0xE8, 0, 0, 0},
+         ARRAY_SIZE(s2f_usr0_free_mux), 0, 0xE8, 0, 0x30, 2},
        { AGILEX_S2F_USER1_FREE_CLK, "s2f_user1_free_clk", NULL, s2f_usr1_free_mux,
          ARRAY_SIZE(s2f_usr1_free_mux), 0, 0xEC, 0, 0x88, 5},
        { AGILEX_PSI_REF_FREE_CLK, "psi_ref_free_clk", NULL, psi_ref_free_mux,
@@ -319,6 +326,8 @@ static const struct stratix10_gate_clock agilex_gate_clks[] = {
          4, 0x98, 0, 16, 0x88, 3, 0},
        { AGILEX_SDMMC_CLK, "sdmmc_clk", NULL, sdmmc_mux, ARRAY_SIZE(sdmmc_mux), 0, 0x7C,
          5, 0, 0, 0, 0x88, 4, 4},
+       { AGILEX_S2F_USER0_CLK, "s2f_user0_clk", NULL, s2f_user0_mux, ARRAY_SIZE(s2f_user0_mux), 0, 0x24,
+         6, 0, 0, 0, 0x30, 2, 0},
        { AGILEX_S2F_USER1_CLK, "s2f_user1_clk", NULL, s2f_user1_mux, ARRAY_SIZE(s2f_user1_mux), 0, 0x7C,
          6, 0, 0, 0, 0x88, 5, 0},
        { AGILEX_PSI_REF_CLK, "psi_ref_clk", NULL, psi_mux, ARRAY_SIZE(psi_mux), 0, 0x7C,
index a5f526b..6144447 100644 (file)
@@ -1377,7 +1377,7 @@ static void dfll_debug_init(struct tegra_dfll *td)
 }
 
 #else
-static void inline dfll_debug_init(struct tegra_dfll *td) { }
+static inline void dfll_debug_init(struct tegra_dfll *td) { }
 #endif /* CONFIG_DEBUG_FS */
 
 /*
index 292d626..4dcf7f7 100644 (file)
@@ -777,11 +777,7 @@ static struct tegra_periph_init_data gate_clks[] = {
        GATE("ahbdma", "hclk", 33, 0, tegra_clk_ahbdma, 0),
        GATE("apbdma", "pclk", 34, 0, tegra_clk_apbdma, 0),
        GATE("kbc", "clk_32k", 36, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_kbc, 0),
-       /*
-        * Critical for RAM re-repair operation, which must occur on resume
-        * from LP1 system suspend and as part of CCPLEX cluster switching.
-        */
-       GATE("fuse", "clk_m", 39, TEGRA_PERIPH_ON_APB, tegra_clk_fuse, CLK_IS_CRITICAL),
+       GATE("fuse", "clk_m", 39, TEGRA_PERIPH_ON_APB, tegra_clk_fuse, 0),
        GATE("fuse_burn", "clk_m", 39, TEGRA_PERIPH_ON_APB, tegra_clk_fuse_burn, 0),
        GATE("kfuse", "clk_m", 40, TEGRA_PERIPH_ON_APB, tegra_clk_kfuse, 0),
        GATE("apbif", "clk_m", 107, TEGRA_PERIPH_ON_APB, tegra_clk_apbif, 0),
index 18564ef..1244c4e 100644 (file)
@@ -1,6 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0-only
 obj-$(CONFIG_PMC_ATOM)         += clk-pmc-atom.o
 obj-$(CONFIG_X86_AMD_PLATFORM_DEVICE)  += clk-fch.o
-clk-x86-lpss-objs              := clk-lpt.o
+clk-x86-lpss-y                 := clk-lpss-atom.o
 obj-$(CONFIG_X86_INTEL_LPSS)   += clk-x86-lpss.o
 obj-$(CONFIG_CLK_LGM_CGU)      += clk-cgu.o clk-cgu-pll.o clk-lgm.o
diff --git a/drivers/clk/x86/clk-lpss-atom.c b/drivers/clk/x86/clk-lpss-atom.c
new file mode 100644 (file)
index 0000000..aa9d0bb
--- /dev/null
@@ -0,0 +1,47 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Intel Low Power Subsystem clocks.
+ *
+ * Copyright (C) 2013, Intel Corporation
+ * Authors: Mika Westerberg <mika.westerberg@linux.intel.com>
+ *         Heikki Krogerus <heikki.krogerus@linux.intel.com>
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/err.h>
+#include <linux/module.h>
+#include <linux/platform_data/x86/clk-lpss.h>
+#include <linux/platform_device.h>
+
+static int lpss_atom_clk_probe(struct platform_device *pdev)
+{
+       struct lpss_clk_data *drvdata;
+       struct clk *clk;
+
+       drvdata = devm_kzalloc(&pdev->dev, sizeof(*drvdata), GFP_KERNEL);
+       if (!drvdata)
+               return -ENOMEM;
+
+       /* LPSS free running clock */
+       drvdata->name = "lpss_clk";
+       clk = clk_register_fixed_rate(&pdev->dev, drvdata->name, NULL,
+                                     0, 100000000);
+       if (IS_ERR(clk))
+               return PTR_ERR(clk);
+
+       drvdata->clk = clk;
+       platform_set_drvdata(pdev, drvdata);
+       return 0;
+}
+
+static struct platform_driver lpss_atom_clk_driver = {
+       .driver = {
+               .name = "clk-lpss-atom",
+       },
+       .probe = lpss_atom_clk_probe,
+};
+
+int __init lpss_atom_clk_init(void)
+{
+       return platform_driver_register(&lpss_atom_clk_driver);
+}
diff --git a/drivers/clk/x86/clk-lpt.c b/drivers/clk/x86/clk-lpt.c
deleted file mode 100644 (file)
index fbe9fd3..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Intel Low Power Subsystem clocks.
- *
- * Copyright (C) 2013, Intel Corporation
- * Authors: Mika Westerberg <mika.westerberg@linux.intel.com>
- *         Heikki Krogerus <heikki.krogerus@linux.intel.com>
- */
-
-#include <linux/clk-provider.h>
-#include <linux/err.h>
-#include <linux/module.h>
-#include <linux/platform_data/x86/clk-lpss.h>
-#include <linux/platform_device.h>
-
-static int lpt_clk_probe(struct platform_device *pdev)
-{
-       struct lpss_clk_data *drvdata;
-       struct clk *clk;
-
-       drvdata = devm_kzalloc(&pdev->dev, sizeof(*drvdata), GFP_KERNEL);
-       if (!drvdata)
-               return -ENOMEM;
-
-       /* LPSS free running clock */
-       drvdata->name = "lpss_clk";
-       clk = clk_register_fixed_rate(&pdev->dev, drvdata->name, NULL,
-                                     0, 100000000);
-       if (IS_ERR(clk))
-               return PTR_ERR(clk);
-
-       drvdata->clk = clk;
-       platform_set_drvdata(pdev, drvdata);
-       return 0;
-}
-
-static struct platform_driver lpt_clk_driver = {
-       .driver = {
-               .name = "clk-lpt",
-       },
-       .probe = lpt_clk_probe,
-};
-
-int __init lpt_clk_init(void)
-{
-       return platform_driver_register(&lpt_clk_driver);
-}
index 695feaa..565ed67 100644 (file)
@@ -12,7 +12,7 @@
 #include "clk-zynqmp.h"
 
 /**
- * struct clk_gate - gating clock
+ * struct zynqmp_clk_gate - gating clock
  * @hw:                handle between common and hardware-specific interfaces
  * @flags:     hardware-specific flags
  * @clk_id:    Id of clock
@@ -66,7 +66,7 @@ static void zynqmp_clk_gate_disable(struct clk_hw *hw)
 }
 
 /**
- * zynqmp_clk_gate_is_enable() - Check clock state
+ * zynqmp_clk_gate_is_enabled() - Check clock state
  * @hw:                handle between common and hardware-specific interfaces
  *
  * Return: 1 if enabled, 0 if disabled else error code
index 157d4a9..17afce5 100644 (file)
@@ -159,7 +159,7 @@ struct clk_hw *zynqmp_clk_register_mux(const char *name, u32 clk_id,
        hw = &mux->hw;
        ret = clk_hw_register(NULL, hw);
        if (ret) {
-               kfree(hw);
+               kfree(mux);
                hw = ERR_PTR(ret);
        }
 
index 84fa80a..60cbc06 100644 (file)
@@ -56,6 +56,7 @@ enum topology_type {
  * @type:      Type of topology
  * @flag:      Topology flags
  * @type_flag: Topology type specific flag
+ * @custom_type_flag: Topology type specific custom flag
  */
 struct clock_topology {
        u32 type;
index 871184e..eb25303 100644 (file)
@@ -762,9 +762,7 @@ static int zynqmp_clk_setup(struct device_node *np)
        zynqmp_register_clocks(np);
 
        zynqmp_data->num = clock_max_idx;
-       of_clk_add_hw_provider(np, of_clk_hw_onecell_get, zynqmp_data);
-
-       return 0;
+       return of_clk_add_hw_provider(np, of_clk_hw_onecell_get, zynqmp_data);
 }
 
 static int zynqmp_clock_probe(struct platform_device *pdev)
index a9bf10b..0e15afc 100644 (file)
@@ -301,7 +301,8 @@ static int intel_lpss_register_clock_divider(struct intel_lpss *lpss,
 
        snprintf(name, sizeof(name), "%s-div", devname);
        tmp = clk_register_fractional_divider(NULL, name, __clk_get_name(tmp),
-                                             0, lpss->priv, 1, 15, 16, 15, 0,
+                                             CLK_FRAC_DIVIDER_POWER_OF_TWO_PS,
+                                             lpss->priv, 1, 15, 16, 15, 0,
                                              NULL);
        if (IS_ERR(tmp))
                return PTR_ERR(tmp);
index d24b627..01e8bab 100644 (file)
 #define IMX8MN_CLK_CLKOUT2_DIV                 219
 #define IMX8MN_CLK_CLKOUT2                     220
 
-#define IMX8MN_CLK_END                         221
+#define IMX8MN_CLK_M7_CORE                     221
+
+#define IMX8MN_CLK_END                         222
 
 #endif
diff --git a/include/dt-bindings/clock/mt8192-clk.h b/include/dt-bindings/clock/mt8192-clk.h
new file mode 100644 (file)
index 0000000..5ab68f1
--- /dev/null
@@ -0,0 +1,585 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2021 MediaTek Inc.
+ * Author: Chun-Jie Chen <chun-jie.chen@mediatek.com>
+ */
+
+#ifndef _DT_BINDINGS_CLK_MT8192_H
+#define _DT_BINDINGS_CLK_MT8192_H
+
+/* TOPCKGEN */
+
+#define CLK_TOP_AXI_SEL                        0
+#define CLK_TOP_SPM_SEL                        1
+#define CLK_TOP_SCP_SEL                        2
+#define CLK_TOP_BUS_AXIMEM_SEL         3
+#define CLK_TOP_DISP_SEL               4
+#define CLK_TOP_MDP_SEL                        5
+#define CLK_TOP_IMG1_SEL               6
+#define CLK_TOP_IMG2_SEL               7
+#define CLK_TOP_IPE_SEL                        8
+#define CLK_TOP_DPE_SEL                        9
+#define CLK_TOP_CAM_SEL                        10
+#define CLK_TOP_CCU_SEL                        11
+#define CLK_TOP_DSP7_SEL               12
+#define CLK_TOP_MFG_REF_SEL            13
+#define CLK_TOP_MFG_PLL_SEL            14
+#define CLK_TOP_CAMTG_SEL              15
+#define CLK_TOP_CAMTG2_SEL             16
+#define CLK_TOP_CAMTG3_SEL             17
+#define CLK_TOP_CAMTG4_SEL             18
+#define CLK_TOP_CAMTG5_SEL             19
+#define CLK_TOP_CAMTG6_SEL             20
+#define CLK_TOP_UART_SEL               21
+#define CLK_TOP_SPI_SEL                        22
+#define CLK_TOP_MSDC50_0_H_SEL         23
+#define CLK_TOP_MSDC50_0_SEL           24
+#define CLK_TOP_MSDC30_1_SEL           25
+#define CLK_TOP_MSDC30_2_SEL           26
+#define CLK_TOP_AUDIO_SEL              27
+#define CLK_TOP_AUD_INTBUS_SEL         28
+#define CLK_TOP_PWRAP_ULPOSC_SEL       29
+#define CLK_TOP_ATB_SEL                        30
+#define CLK_TOP_DPI_SEL                        31
+#define CLK_TOP_SCAM_SEL               32
+#define CLK_TOP_DISP_PWM_SEL           33
+#define CLK_TOP_USB_TOP_SEL            34
+#define CLK_TOP_SSUSB_XHCI_SEL         35
+#define CLK_TOP_I2C_SEL                        36
+#define CLK_TOP_SENINF_SEL             37
+#define CLK_TOP_SENINF1_SEL            38
+#define CLK_TOP_SENINF2_SEL            39
+#define CLK_TOP_SENINF3_SEL            40
+#define CLK_TOP_TL_SEL                 41
+#define CLK_TOP_DXCC_SEL               42
+#define CLK_TOP_AUD_ENGEN1_SEL         43
+#define CLK_TOP_AUD_ENGEN2_SEL         44
+#define CLK_TOP_AES_UFSFDE_SEL         45
+#define CLK_TOP_UFS_SEL                        46
+#define CLK_TOP_AUD_1_SEL              47
+#define CLK_TOP_AUD_2_SEL              48
+#define CLK_TOP_ADSP_SEL               49
+#define CLK_TOP_DPMAIF_MAIN_SEL                50
+#define CLK_TOP_VENC_SEL               51
+#define CLK_TOP_VDEC_SEL               52
+#define CLK_TOP_CAMTM_SEL              53
+#define CLK_TOP_PWM_SEL                        54
+#define CLK_TOP_AUDIO_H_SEL            55
+#define CLK_TOP_SPMI_MST_SEL           56
+#define CLK_TOP_AES_MSDCFDE_SEL                57
+#define CLK_TOP_SFLASH_SEL             58
+#define CLK_TOP_APLL_I2S0_M_SEL                59
+#define CLK_TOP_APLL_I2S1_M_SEL                60
+#define CLK_TOP_APLL_I2S2_M_SEL                61
+#define CLK_TOP_APLL_I2S3_M_SEL                62
+#define CLK_TOP_APLL_I2S4_M_SEL                63
+#define CLK_TOP_APLL_I2S5_M_SEL                64
+#define CLK_TOP_APLL_I2S6_M_SEL                65
+#define CLK_TOP_APLL_I2S7_M_SEL                66
+#define CLK_TOP_APLL_I2S8_M_SEL                67
+#define CLK_TOP_APLL_I2S9_M_SEL                68
+#define CLK_TOP_MAINPLL_D3             69
+#define CLK_TOP_MAINPLL_D4             70
+#define CLK_TOP_MAINPLL_D4_D2          71
+#define CLK_TOP_MAINPLL_D4_D4          72
+#define CLK_TOP_MAINPLL_D4_D8          73
+#define CLK_TOP_MAINPLL_D4_D16         74
+#define CLK_TOP_MAINPLL_D5             75
+#define CLK_TOP_MAINPLL_D5_D2          76
+#define CLK_TOP_MAINPLL_D5_D4          77
+#define CLK_TOP_MAINPLL_D5_D8          78
+#define CLK_TOP_MAINPLL_D6             79
+#define CLK_TOP_MAINPLL_D6_D2          80
+#define CLK_TOP_MAINPLL_D6_D4          81
+#define CLK_TOP_MAINPLL_D7             82
+#define CLK_TOP_MAINPLL_D7_D2          83
+#define CLK_TOP_MAINPLL_D7_D4          84
+#define CLK_TOP_MAINPLL_D7_D8          85
+#define CLK_TOP_UNIVPLL_D3             86
+#define CLK_TOP_UNIVPLL_D4             87
+#define CLK_TOP_UNIVPLL_D4_D2          88
+#define CLK_TOP_UNIVPLL_D4_D4          89
+#define CLK_TOP_UNIVPLL_D4_D8          90
+#define CLK_TOP_UNIVPLL_D5             91
+#define CLK_TOP_UNIVPLL_D5_D2          92
+#define CLK_TOP_UNIVPLL_D5_D4          93
+#define CLK_TOP_UNIVPLL_D5_D8          94
+#define CLK_TOP_UNIVPLL_D6             95
+#define CLK_TOP_UNIVPLL_D6_D2          96
+#define CLK_TOP_UNIVPLL_D6_D4          97
+#define CLK_TOP_UNIVPLL_D6_D8          98
+#define CLK_TOP_UNIVPLL_D6_D16         99
+#define CLK_TOP_UNIVPLL_D7             100
+#define CLK_TOP_APLL1                  101
+#define CLK_TOP_APLL1_D2               102
+#define CLK_TOP_APLL1_D4               103
+#define CLK_TOP_APLL1_D8               104
+#define CLK_TOP_APLL2                  105
+#define CLK_TOP_APLL2_D2               106
+#define CLK_TOP_APLL2_D4               107
+#define CLK_TOP_APLL2_D8               108
+#define CLK_TOP_MMPLL_D4               109
+#define CLK_TOP_MMPLL_D4_D2            110
+#define CLK_TOP_MMPLL_D5               111
+#define CLK_TOP_MMPLL_D5_D2            112
+#define CLK_TOP_MMPLL_D6               113
+#define CLK_TOP_MMPLL_D6_D2            114
+#define CLK_TOP_MMPLL_D7               115
+#define CLK_TOP_MMPLL_D9               116
+#define CLK_TOP_APUPLL                 117
+#define CLK_TOP_NPUPLL                 118
+#define CLK_TOP_TVDPLL                 119
+#define CLK_TOP_TVDPLL_D2              120
+#define CLK_TOP_TVDPLL_D4              121
+#define CLK_TOP_TVDPLL_D8              122
+#define CLK_TOP_TVDPLL_D16             123
+#define CLK_TOP_MSDCPLL                        124
+#define CLK_TOP_MSDCPLL_D2             125
+#define CLK_TOP_MSDCPLL_D4             126
+#define CLK_TOP_ULPOSC                 127
+#define CLK_TOP_OSC_D2                 128
+#define CLK_TOP_OSC_D4                 129
+#define CLK_TOP_OSC_D8                 130
+#define CLK_TOP_OSC_D10                        131
+#define CLK_TOP_OSC_D16                        132
+#define CLK_TOP_OSC_D20                        133
+#define CLK_TOP_CSW_F26M_D2            134
+#define CLK_TOP_ADSPPLL                        135
+#define CLK_TOP_UNIVPLL_192M           136
+#define CLK_TOP_UNIVPLL_192M_D2                137
+#define CLK_TOP_UNIVPLL_192M_D4                138
+#define CLK_TOP_UNIVPLL_192M_D8                139
+#define CLK_TOP_UNIVPLL_192M_D16       140
+#define CLK_TOP_UNIVPLL_192M_D32       141
+#define CLK_TOP_APLL12_DIV0            142
+#define CLK_TOP_APLL12_DIV1            143
+#define CLK_TOP_APLL12_DIV2            144
+#define CLK_TOP_APLL12_DIV3            145
+#define CLK_TOP_APLL12_DIV4            146
+#define CLK_TOP_APLL12_DIVB            147
+#define CLK_TOP_APLL12_DIV5            148
+#define CLK_TOP_APLL12_DIV6            149
+#define CLK_TOP_APLL12_DIV7            150
+#define CLK_TOP_APLL12_DIV8            151
+#define CLK_TOP_APLL12_DIV9            152
+#define CLK_TOP_SSUSB_TOP_REF          153
+#define CLK_TOP_SSUSB_PHY_REF          154
+#define CLK_TOP_NR_CLK                 155
+
+/* INFRACFG */
+
+#define CLK_INFRA_PMIC_TMR             0
+#define CLK_INFRA_PMIC_AP              1
+#define CLK_INFRA_PMIC_MD              2
+#define CLK_INFRA_PMIC_CONN            3
+#define CLK_INFRA_SCPSYS               4
+#define CLK_INFRA_SEJ                  5
+#define CLK_INFRA_APXGPT               6
+#define CLK_INFRA_GCE                  7
+#define CLK_INFRA_GCE2                 8
+#define CLK_INFRA_THERM                        9
+#define CLK_INFRA_I2C0                 10
+#define CLK_INFRA_AP_DMA_PSEUDO                11
+#define CLK_INFRA_I2C2                 12
+#define CLK_INFRA_I2C3                 13
+#define CLK_INFRA_PWM_H                        14
+#define CLK_INFRA_PWM1                 15
+#define CLK_INFRA_PWM2                 16
+#define CLK_INFRA_PWM3                 17
+#define CLK_INFRA_PWM4                 18
+#define CLK_INFRA_PWM                  19
+#define CLK_INFRA_UART0                        20
+#define CLK_INFRA_UART1                        21
+#define CLK_INFRA_UART2                        22
+#define CLK_INFRA_UART3                        23
+#define CLK_INFRA_GCE_26M              24
+#define CLK_INFRA_CQ_DMA_FPC           25
+#define CLK_INFRA_BTIF                 26
+#define CLK_INFRA_SPI0                 27
+#define CLK_INFRA_MSDC0                        28
+#define CLK_INFRA_MSDC1                        29
+#define CLK_INFRA_MSDC2                        30
+#define CLK_INFRA_MSDC0_SRC            31
+#define CLK_INFRA_GCPU                 32
+#define CLK_INFRA_TRNG                 33
+#define CLK_INFRA_AUXADC               34
+#define CLK_INFRA_CPUM                 35
+#define CLK_INFRA_CCIF1_AP             36
+#define CLK_INFRA_CCIF1_MD             37
+#define CLK_INFRA_AUXADC_MD            38
+#define CLK_INFRA_PCIE_TL_26M          39
+#define CLK_INFRA_MSDC1_SRC            40
+#define CLK_INFRA_MSDC2_SRC            41
+#define CLK_INFRA_PCIE_TL_96M          42
+#define CLK_INFRA_PCIE_PL_P_250M       43
+#define CLK_INFRA_DEVICE_APC           44
+#define CLK_INFRA_CCIF_AP              45
+#define CLK_INFRA_DEBUGSYS             46
+#define CLK_INFRA_AUDIO                        47
+#define CLK_INFRA_CCIF_MD              48
+#define CLK_INFRA_DXCC_SEC_CORE                49
+#define CLK_INFRA_DXCC_AO              50
+#define CLK_INFRA_DBG_TRACE            51
+#define CLK_INFRA_DEVMPU_B             52
+#define CLK_INFRA_DRAMC_F26M           53
+#define CLK_INFRA_IRTX                 54
+#define CLK_INFRA_SSUSB                        55
+#define CLK_INFRA_DISP_PWM             56
+#define CLK_INFRA_CLDMA_B              57
+#define CLK_INFRA_AUDIO_26M_B          58
+#define CLK_INFRA_MODEM_TEMP_SHARE     59
+#define CLK_INFRA_SPI1                 60
+#define CLK_INFRA_I2C4                 61
+#define CLK_INFRA_SPI2                 62
+#define CLK_INFRA_SPI3                 63
+#define CLK_INFRA_UNIPRO_SYS           64
+#define CLK_INFRA_UNIPRO_TICK          65
+#define CLK_INFRA_UFS_MP_SAP_B         66
+#define CLK_INFRA_MD32_B               67
+#define CLK_INFRA_UNIPRO_MBIST         68
+#define CLK_INFRA_I2C5                 69
+#define CLK_INFRA_I2C5_ARBITER         70
+#define CLK_INFRA_I2C5_IMM             71
+#define CLK_INFRA_I2C1_ARBITER         72
+#define CLK_INFRA_I2C1_IMM             73
+#define CLK_INFRA_I2C2_ARBITER         74
+#define CLK_INFRA_I2C2_IMM             75
+#define CLK_INFRA_SPI4                 76
+#define CLK_INFRA_SPI5                 77
+#define CLK_INFRA_CQ_DMA               78
+#define CLK_INFRA_UFS                  79
+#define CLK_INFRA_AES_UFSFDE           80
+#define CLK_INFRA_UFS_TICK             81
+#define CLK_INFRA_SSUSB_XHCI           82
+#define CLK_INFRA_MSDC0_SELF           83
+#define CLK_INFRA_MSDC1_SELF           84
+#define CLK_INFRA_MSDC2_SELF           85
+#define CLK_INFRA_UFS_AXI              86
+#define CLK_INFRA_I2C6                 87
+#define CLK_INFRA_AP_MSDC0             88
+#define CLK_INFRA_MD_MSDC0             89
+#define CLK_INFRA_CCIF5_AP             90
+#define CLK_INFRA_CCIF5_MD             91
+#define CLK_INFRA_PCIE_TOP_H_133M      92
+#define CLK_INFRA_FLASHIF_TOP_H_133M   93
+#define CLK_INFRA_PCIE_PERI_26M                94
+#define CLK_INFRA_CCIF2_AP             95
+#define CLK_INFRA_CCIF2_MD             96
+#define CLK_INFRA_CCIF3_AP             97
+#define CLK_INFRA_CCIF3_MD             98
+#define CLK_INFRA_SEJ_F13M             99
+#define CLK_INFRA_AES                  100
+#define CLK_INFRA_I2C7                 101
+#define CLK_INFRA_I2C8                 102
+#define CLK_INFRA_FBIST2FPC            103
+#define CLK_INFRA_DEVICE_APC_SYNC      104
+#define CLK_INFRA_DPMAIF_MAIN          105
+#define CLK_INFRA_PCIE_TL_32K          106
+#define CLK_INFRA_CCIF4_AP             107
+#define CLK_INFRA_CCIF4_MD             108
+#define CLK_INFRA_SPI6                 109
+#define CLK_INFRA_SPI7                 110
+#define CLK_INFRA_133M                 111
+#define CLK_INFRA_66M                  112
+#define CLK_INFRA_66M_PERI_BUS         113
+#define CLK_INFRA_FREE_DCM_133M                114
+#define CLK_INFRA_FREE_DCM_66M         115
+#define CLK_INFRA_PERI_BUS_DCM_133M    116
+#define CLK_INFRA_PERI_BUS_DCM_66M     117
+#define CLK_INFRA_FLASHIF_PERI_26M     118
+#define CLK_INFRA_FLASHIF_SFLASH       119
+#define CLK_INFRA_AP_DMA               120
+#define CLK_INFRA_NR_CLK               121
+
+/* PERICFG */
+
+#define CLK_PERI_PERIAXI               0
+#define CLK_PERI_NR_CLK                        1
+
+/* APMIXEDSYS */
+
+#define CLK_APMIXED_MAINPLL            0
+#define CLK_APMIXED_UNIVPLL            1
+#define CLK_APMIXED_USBPLL             2
+#define CLK_APMIXED_MSDCPLL            3
+#define CLK_APMIXED_MMPLL              4
+#define CLK_APMIXED_ADSPPLL            5
+#define CLK_APMIXED_MFGPLL             6
+#define CLK_APMIXED_TVDPLL             7
+#define CLK_APMIXED_APLL1              8
+#define CLK_APMIXED_APLL2              9
+#define CLK_APMIXED_MIPID26M           10
+#define CLK_APMIXED_NR_CLK             11
+
+/* SCP_ADSP */
+
+#define CLK_SCP_ADSP_AUDIODSP          0
+#define CLK_SCP_ADSP_NR_CLK            1
+
+/* IMP_IIC_WRAP_C */
+
+#define CLK_IMP_IIC_WRAP_C_I2C10       0
+#define CLK_IMP_IIC_WRAP_C_I2C11       1
+#define CLK_IMP_IIC_WRAP_C_I2C12       2
+#define CLK_IMP_IIC_WRAP_C_I2C13       3
+#define CLK_IMP_IIC_WRAP_C_NR_CLK      4
+
+/* AUDSYS */
+
+#define CLK_AUD_AFE                    0
+#define CLK_AUD_22M                    1
+#define CLK_AUD_24M                    2
+#define CLK_AUD_APLL2_TUNER            3
+#define CLK_AUD_APLL_TUNER             4
+#define CLK_AUD_TDM                    5
+#define CLK_AUD_ADC                    6
+#define CLK_AUD_DAC                    7
+#define CLK_AUD_DAC_PREDIS             8
+#define CLK_AUD_TML                    9
+#define CLK_AUD_NLE                    10
+#define CLK_AUD_I2S1_B                 11
+#define CLK_AUD_I2S2_B                 12
+#define CLK_AUD_I2S3_B                 13
+#define CLK_AUD_I2S4_B                 14
+#define CLK_AUD_CONNSYS_I2S_ASRC       15
+#define CLK_AUD_GENERAL1_ASRC          16
+#define CLK_AUD_GENERAL2_ASRC          17
+#define CLK_AUD_DAC_HIRES              18
+#define CLK_AUD_ADC_HIRES              19
+#define CLK_AUD_ADC_HIRES_TML          20
+#define CLK_AUD_ADDA6_ADC              21
+#define CLK_AUD_ADDA6_ADC_HIRES                22
+#define CLK_AUD_3RD_DAC                        23
+#define CLK_AUD_3RD_DAC_PREDIS         24
+#define CLK_AUD_3RD_DAC_TML            25
+#define CLK_AUD_3RD_DAC_HIRES          26
+#define CLK_AUD_I2S5_B                 27
+#define CLK_AUD_I2S6_B                 28
+#define CLK_AUD_I2S7_B                 29
+#define CLK_AUD_I2S8_B                 30
+#define CLK_AUD_I2S9_B                 31
+#define CLK_AUD_NR_CLK                 32
+
+/* IMP_IIC_WRAP_E */
+
+#define CLK_IMP_IIC_WRAP_E_I2C3                0
+#define CLK_IMP_IIC_WRAP_E_NR_CLK      1
+
+/* IMP_IIC_WRAP_S */
+
+#define CLK_IMP_IIC_WRAP_S_I2C7                0
+#define CLK_IMP_IIC_WRAP_S_I2C8                1
+#define CLK_IMP_IIC_WRAP_S_I2C9                2
+#define CLK_IMP_IIC_WRAP_S_NR_CLK      3
+
+/* IMP_IIC_WRAP_WS */
+
+#define CLK_IMP_IIC_WRAP_WS_I2C1       0
+#define CLK_IMP_IIC_WRAP_WS_I2C2       1
+#define CLK_IMP_IIC_WRAP_WS_I2C4       2
+#define CLK_IMP_IIC_WRAP_WS_NR_CLK     3
+
+/* IMP_IIC_WRAP_W */
+
+#define CLK_IMP_IIC_WRAP_W_I2C5                0
+#define CLK_IMP_IIC_WRAP_W_NR_CLK      1
+
+/* IMP_IIC_WRAP_N */
+
+#define CLK_IMP_IIC_WRAP_N_I2C0                0
+#define CLK_IMP_IIC_WRAP_N_I2C6                1
+#define CLK_IMP_IIC_WRAP_N_NR_CLK      2
+
+/* MSDC_TOP */
+
+#define CLK_MSDC_TOP_AES_0P            0
+#define CLK_MSDC_TOP_SRC_0P            1
+#define CLK_MSDC_TOP_SRC_1P            2
+#define CLK_MSDC_TOP_SRC_2P            3
+#define CLK_MSDC_TOP_P_MSDC0           4
+#define CLK_MSDC_TOP_P_MSDC1           5
+#define CLK_MSDC_TOP_P_MSDC2           6
+#define CLK_MSDC_TOP_P_CFG             7
+#define CLK_MSDC_TOP_AXI               8
+#define CLK_MSDC_TOP_H_MST_0P          9
+#define CLK_MSDC_TOP_H_MST_1P          10
+#define CLK_MSDC_TOP_H_MST_2P          11
+#define CLK_MSDC_TOP_MEM_OFF_DLY_26M   12
+#define CLK_MSDC_TOP_32K               13
+#define CLK_MSDC_TOP_AHB2AXI_BRG_AXI   14
+#define CLK_MSDC_TOP_NR_CLK            15
+
+/* MSDC */
+
+#define CLK_MSDC_AXI_WRAP              0
+#define CLK_MSDC_NR_CLK                        1
+
+/* MFGCFG */
+
+#define CLK_MFG_BG3D                   0
+#define CLK_MFG_NR_CLK                 1
+
+/* MMSYS */
+
+#define CLK_MM_DISP_MUTEX0             0
+#define CLK_MM_DISP_CONFIG             1
+#define CLK_MM_DISP_OVL0               2
+#define CLK_MM_DISP_RDMA0              3
+#define CLK_MM_DISP_OVL0_2L            4
+#define CLK_MM_DISP_WDMA0              5
+#define CLK_MM_DISP_UFBC_WDMA0         6
+#define CLK_MM_DISP_RSZ0               7
+#define CLK_MM_DISP_AAL0               8
+#define CLK_MM_DISP_CCORR0             9
+#define CLK_MM_DISP_DITHER0            10
+#define CLK_MM_SMI_INFRA               11
+#define CLK_MM_DISP_GAMMA0             12
+#define CLK_MM_DISP_POSTMASK0          13
+#define CLK_MM_DISP_DSC_WRAP0          14
+#define CLK_MM_DSI0                    15
+#define CLK_MM_DISP_COLOR0             16
+#define CLK_MM_SMI_COMMON              17
+#define CLK_MM_DISP_FAKE_ENG0          18
+#define CLK_MM_DISP_FAKE_ENG1          19
+#define CLK_MM_MDP_TDSHP4              20
+#define CLK_MM_MDP_RSZ4                        21
+#define CLK_MM_MDP_AAL4                        22
+#define CLK_MM_MDP_HDR4                        23
+#define CLK_MM_MDP_RDMA4               24
+#define CLK_MM_MDP_COLOR4              25
+#define CLK_MM_DISP_Y2R0               26
+#define CLK_MM_SMI_GALS                        27
+#define CLK_MM_DISP_OVL2_2L            28
+#define CLK_MM_DISP_RDMA4              29
+#define CLK_MM_DISP_DPI0               30
+#define CLK_MM_SMI_IOMMU               31
+#define CLK_MM_DSI_DSI0                        32
+#define CLK_MM_DPI_DPI0                        33
+#define CLK_MM_26MHZ                   34
+#define CLK_MM_32KHZ                   35
+#define CLK_MM_NR_CLK                  36
+
+/* IMGSYS */
+
+#define CLK_IMG_LARB9                  0
+#define CLK_IMG_LARB10                 1
+#define CLK_IMG_DIP                    2
+#define CLK_IMG_GALS                   3
+#define CLK_IMG_NR_CLK                 4
+
+/* IMGSYS2 */
+
+#define CLK_IMG2_LARB11                        0
+#define CLK_IMG2_LARB12                        1
+#define CLK_IMG2_MFB                   2
+#define CLK_IMG2_WPE                   3
+#define CLK_IMG2_MSS                   4
+#define CLK_IMG2_GALS                  5
+#define CLK_IMG2_NR_CLK                        6
+
+/* VDECSYS_SOC */
+
+#define CLK_VDEC_SOC_LARB1             0
+#define CLK_VDEC_SOC_LAT               1
+#define CLK_VDEC_SOC_LAT_ACTIVE                2
+#define CLK_VDEC_SOC_VDEC              3
+#define CLK_VDEC_SOC_VDEC_ACTIVE       4
+#define CLK_VDEC_SOC_NR_CLK            5
+
+/* VDECSYS */
+
+#define CLK_VDEC_LARB1                 0
+#define CLK_VDEC_LAT                   1
+#define CLK_VDEC_LAT_ACTIVE            2
+#define CLK_VDEC_VDEC                  3
+#define CLK_VDEC_ACTIVE                        4
+#define CLK_VDEC_NR_CLK                        5
+
+/* VENCSYS */
+
+#define CLK_VENC_SET0_LARB             0
+#define CLK_VENC_SET1_VENC             1
+#define CLK_VENC_SET2_JPGENC           2
+#define CLK_VENC_SET5_GALS             3
+#define CLK_VENC_NR_CLK                        4
+
+/* CAMSYS */
+
+#define CLK_CAM_LARB13                 0
+#define CLK_CAM_DFP_VAD                        1
+#define CLK_CAM_LARB14                 2
+#define CLK_CAM_CAM                    3
+#define CLK_CAM_CAMTG                  4
+#define CLK_CAM_SENINF                 5
+#define CLK_CAM_CAMSV0                 6
+#define CLK_CAM_CAMSV1                 7
+#define CLK_CAM_CAMSV2                 8
+#define CLK_CAM_CAMSV3                 9
+#define CLK_CAM_CCU0                   10
+#define CLK_CAM_CCU1                   11
+#define CLK_CAM_MRAW0                  12
+#define CLK_CAM_FAKE_ENG               13
+#define CLK_CAM_CCU_GALS               14
+#define CLK_CAM_CAM2MM_GALS            15
+#define CLK_CAM_NR_CLK                 16
+
+/* 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_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_RAWC */
+
+#define CLK_CAM_RAWC_LARBX             0
+#define CLK_CAM_RAWC_CAM               1
+#define CLK_CAM_RAWC_CAMTG             2
+#define CLK_CAM_RAWC_NR_CLK            3
+
+/* IPESYS */
+
+#define CLK_IPE_LARB19                 0
+#define CLK_IPE_LARB20                 1
+#define CLK_IPE_SMI_SUBCOM             2
+#define CLK_IPE_FD                     3
+#define CLK_IPE_FE                     4
+#define CLK_IPE_RSC                    5
+#define CLK_IPE_DPE                    6
+#define CLK_IPE_GALS                   7
+#define CLK_IPE_NR_CLK                 8
+
+/* MDPSYS */
+
+#define CLK_MDP_RDMA0                  0
+#define CLK_MDP_TDSHP0                 1
+#define CLK_MDP_IMG_DL_ASYNC0          2
+#define CLK_MDP_IMG_DL_ASYNC1          3
+#define CLK_MDP_RDMA1                  4
+#define CLK_MDP_TDSHP1                 5
+#define CLK_MDP_SMI0                   6
+#define CLK_MDP_APB_BUS                        7
+#define CLK_MDP_WROT0                  8
+#define CLK_MDP_RSZ0                   9
+#define CLK_MDP_HDR0                   10
+#define CLK_MDP_MUTEX0                 11
+#define CLK_MDP_WROT1                  12
+#define CLK_MDP_RSZ1                   13
+#define CLK_MDP_HDR1                   14
+#define CLK_MDP_FAKE_ENG0              15
+#define CLK_MDP_AAL0                   16
+#define CLK_MDP_AAL1                   17
+#define CLK_MDP_COLOR0                 18
+#define CLK_MDP_COLOR1                 19
+#define CLK_MDP_IMG_DL_RELAY0_ASYNC0   20
+#define CLK_MDP_IMG_DL_RELAY1_ASYNC1   21
+#define CLK_MDP_NR_CLK                 22
+
+#endif /* _DT_BINDINGS_CLK_MT8192_H */
diff --git a/include/dt-bindings/clock/qcom,dispcc-sc7280.h b/include/dt-bindings/clock/qcom,dispcc-sc7280.h
new file mode 100644 (file)
index 0000000..a4a692c
--- /dev/null
@@ -0,0 +1,55 @@
+/* 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_DISP_CC_SC7280_H
+#define _DT_BINDINGS_CLK_QCOM_DISP_CC_SC7280_H
+
+/* DISP_CC clocks */
+#define DISP_CC_PLL0                                   0
+#define DISP_CC_MDSS_AHB_CLK                           1
+#define DISP_CC_MDSS_AHB_CLK_SRC                       2
+#define DISP_CC_MDSS_BYTE0_CLK                         3
+#define DISP_CC_MDSS_BYTE0_CLK_SRC                     4
+#define DISP_CC_MDSS_BYTE0_DIV_CLK_SRC                 5
+#define DISP_CC_MDSS_BYTE0_INTF_CLK                    6
+#define DISP_CC_MDSS_DP_AUX_CLK                                7
+#define DISP_CC_MDSS_DP_AUX_CLK_SRC                    8
+#define DISP_CC_MDSS_DP_CRYPTO_CLK                     9
+#define DISP_CC_MDSS_DP_CRYPTO_CLK_SRC                 10
+#define DISP_CC_MDSS_DP_LINK_CLK                       11
+#define DISP_CC_MDSS_DP_LINK_CLK_SRC                   12
+#define DISP_CC_MDSS_DP_LINK_DIV_CLK_SRC               13
+#define DISP_CC_MDSS_DP_LINK_INTF_CLK                  14
+#define DISP_CC_MDSS_DP_PIXEL_CLK                      15
+#define DISP_CC_MDSS_DP_PIXEL_CLK_SRC                  16
+#define DISP_CC_MDSS_EDP_AUX_CLK                       17
+#define DISP_CC_MDSS_EDP_AUX_CLK_SRC                   18
+#define DISP_CC_MDSS_EDP_LINK_CLK                      19
+#define DISP_CC_MDSS_EDP_LINK_CLK_SRC                  20
+#define DISP_CC_MDSS_EDP_LINK_DIV_CLK_SRC              21
+#define DISP_CC_MDSS_EDP_LINK_INTF_CLK                 22
+#define DISP_CC_MDSS_EDP_PIXEL_CLK                     23
+#define DISP_CC_MDSS_EDP_PIXEL_CLK_SRC                 24
+#define DISP_CC_MDSS_ESC0_CLK                          25
+#define DISP_CC_MDSS_ESC0_CLK_SRC                      26
+#define DISP_CC_MDSS_MDP_CLK                           27
+#define DISP_CC_MDSS_MDP_CLK_SRC                       28
+#define DISP_CC_MDSS_MDP_LUT_CLK                       29
+#define DISP_CC_MDSS_NON_GDSC_AHB_CLK                  30
+#define DISP_CC_MDSS_PCLK0_CLK                         31
+#define DISP_CC_MDSS_PCLK0_CLK_SRC                     32
+#define DISP_CC_MDSS_ROT_CLK                           33
+#define DISP_CC_MDSS_ROT_CLK_SRC                       34
+#define DISP_CC_MDSS_RSCC_AHB_CLK                      35
+#define DISP_CC_MDSS_RSCC_VSYNC_CLK                    36
+#define DISP_CC_MDSS_VSYNC_CLK                         37
+#define DISP_CC_MDSS_VSYNC_CLK_SRC                     38
+#define DISP_CC_SLEEP_CLK                              39
+#define DISP_CC_XO_CLK                                 40
+
+/* DISP_CC power domains */
+#define DISP_CC_MDSS_CORE_GDSC                         0
+
+#endif
diff --git a/include/dt-bindings/clock/qcom,gcc-msm8953.h b/include/dt-bindings/clock/qcom,gcc-msm8953.h
new file mode 100644 (file)
index 0000000..783162d
--- /dev/null
@@ -0,0 +1,234 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+
+#ifndef _DT_BINDINGS_CLK_MSM_GCC_8953_H
+#define _DT_BINDINGS_CLK_MSM_GCC_8953_H
+
+/* Clocks */
+#define APC0_DROOP_DETECTOR_CLK_SRC            0
+#define APC1_DROOP_DETECTOR_CLK_SRC            1
+#define APSS_AHB_CLK_SRC                       2
+#define BLSP1_QUP1_I2C_APPS_CLK_SRC            3
+#define BLSP1_QUP1_SPI_APPS_CLK_SRC            4
+#define BLSP1_QUP2_I2C_APPS_CLK_SRC            5
+#define BLSP1_QUP2_SPI_APPS_CLK_SRC            6
+#define BLSP1_QUP3_I2C_APPS_CLK_SRC            7
+#define BLSP1_QUP3_SPI_APPS_CLK_SRC            8
+#define BLSP1_QUP4_I2C_APPS_CLK_SRC            9
+#define BLSP1_QUP4_SPI_APPS_CLK_SRC            10
+#define BLSP1_UART1_APPS_CLK_SRC               11
+#define BLSP1_UART2_APPS_CLK_SRC               12
+#define BLSP2_QUP1_I2C_APPS_CLK_SRC            13
+#define BLSP2_QUP1_SPI_APPS_CLK_SRC            14
+#define BLSP2_QUP2_I2C_APPS_CLK_SRC            15
+#define BLSP2_QUP2_SPI_APPS_CLK_SRC            16
+#define BLSP2_QUP3_I2C_APPS_CLK_SRC            17
+#define BLSP2_QUP3_SPI_APPS_CLK_SRC            18
+#define BLSP2_QUP4_I2C_APPS_CLK_SRC            19
+#define BLSP2_QUP4_SPI_APPS_CLK_SRC            20
+#define BLSP2_UART1_APPS_CLK_SRC               21
+#define BLSP2_UART2_APPS_CLK_SRC               22
+#define BYTE0_CLK_SRC                          23
+#define BYTE1_CLK_SRC                          24
+#define CAMSS_GP0_CLK_SRC                      25
+#define CAMSS_GP1_CLK_SRC                      26
+#define CAMSS_TOP_AHB_CLK_SRC                  27
+#define CCI_CLK_SRC                            28
+#define CPP_CLK_SRC                            29
+#define CRYPTO_CLK_SRC                         30
+#define CSI0PHYTIMER_CLK_SRC                   31
+#define CSI0P_CLK_SRC                          32
+#define CSI0_CLK_SRC                           33
+#define CSI1PHYTIMER_CLK_SRC                   34
+#define CSI1P_CLK_SRC                          35
+#define CSI1_CLK_SRC                           36
+#define CSI2PHYTIMER_CLK_SRC                   37
+#define CSI2P_CLK_SRC                          38
+#define CSI2_CLK_SRC                           39
+#define ESC0_CLK_SRC                           40
+#define ESC1_CLK_SRC                           41
+#define GCC_APC0_DROOP_DETECTOR_GPLL0_CLK      42
+#define GCC_APC1_DROOP_DETECTOR_GPLL0_CLK      43
+#define GCC_APSS_AHB_CLK                       44
+#define GCC_APSS_AXI_CLK                       45
+#define GCC_APSS_TCU_ASYNC_CLK                 46
+#define GCC_BIMC_GFX_CLK                       47
+#define GCC_BIMC_GPU_CLK                       48
+#define GCC_BLSP1_AHB_CLK                      49
+#define GCC_BLSP1_QUP1_I2C_APPS_CLK            50
+#define GCC_BLSP1_QUP1_SPI_APPS_CLK            51
+#define GCC_BLSP1_QUP2_I2C_APPS_CLK            52
+#define GCC_BLSP1_QUP2_SPI_APPS_CLK            53
+#define GCC_BLSP1_QUP3_I2C_APPS_CLK            54
+#define GCC_BLSP1_QUP3_SPI_APPS_CLK            55
+#define GCC_BLSP1_QUP4_I2C_APPS_CLK            56
+#define GCC_BLSP1_QUP4_SPI_APPS_CLK            57
+#define GCC_BLSP1_UART1_APPS_CLK               58
+#define GCC_BLSP1_UART2_APPS_CLK               59
+#define GCC_BLSP2_AHB_CLK                      60
+#define GCC_BLSP2_QUP1_I2C_APPS_CLK            61
+#define GCC_BLSP2_QUP1_SPI_APPS_CLK            62
+#define GCC_BLSP2_QUP2_I2C_APPS_CLK            63
+#define GCC_BLSP2_QUP2_SPI_APPS_CLK            64
+#define GCC_BLSP2_QUP3_I2C_APPS_CLK            65
+#define GCC_BLSP2_QUP3_SPI_APPS_CLK            66
+#define GCC_BLSP2_QUP4_I2C_APPS_CLK            67
+#define GCC_BLSP2_QUP4_SPI_APPS_CLK            68
+#define GCC_BLSP2_UART1_APPS_CLK               69
+#define GCC_BLSP2_UART2_APPS_CLK               70
+#define GCC_BOOT_ROM_AHB_CLK                   71
+#define GCC_CAMSS_AHB_CLK                      72
+#define GCC_CAMSS_CCI_AHB_CLK                  73
+#define GCC_CAMSS_CCI_CLK                      74
+#define GCC_CAMSS_CPP_AHB_CLK                  75
+#define GCC_CAMSS_CPP_AXI_CLK                  76
+#define GCC_CAMSS_CPP_CLK                      77
+#define GCC_CAMSS_CSI0PHYTIMER_CLK             78
+#define GCC_CAMSS_CSI0PHY_CLK                  79
+#define GCC_CAMSS_CSI0PIX_CLK                  80
+#define GCC_CAMSS_CSI0RDI_CLK                  81
+#define GCC_CAMSS_CSI0_AHB_CLK                 82
+#define GCC_CAMSS_CSI0_CLK                     83
+#define GCC_CAMSS_CSI0_CSIPHY_3P_CLK           84
+#define GCC_CAMSS_CSI1PHYTIMER_CLK             85
+#define GCC_CAMSS_CSI1PHY_CLK                  86
+#define GCC_CAMSS_CSI1PIX_CLK                  87
+#define GCC_CAMSS_CSI1RDI_CLK                  88
+#define GCC_CAMSS_CSI1_AHB_CLK                 89
+#define GCC_CAMSS_CSI1_CLK                     90
+#define GCC_CAMSS_CSI1_CSIPHY_3P_CLK           91
+#define GCC_CAMSS_CSI2PHYTIMER_CLK             92
+#define GCC_CAMSS_CSI2PHY_CLK                  93
+#define GCC_CAMSS_CSI2PIX_CLK                  94
+#define GCC_CAMSS_CSI2RDI_CLK                  95
+#define GCC_CAMSS_CSI2_AHB_CLK                 96
+#define GCC_CAMSS_CSI2_CLK                     97
+#define GCC_CAMSS_CSI2_CSIPHY_3P_CLK           98
+#define GCC_CAMSS_CSI_VFE0_CLK                 99
+#define GCC_CAMSS_CSI_VFE1_CLK                 100
+#define GCC_CAMSS_GP0_CLK                      101
+#define GCC_CAMSS_GP1_CLK                      102
+#define GCC_CAMSS_ISPIF_AHB_CLK                        103
+#define GCC_CAMSS_JPEG0_CLK                    104
+#define GCC_CAMSS_JPEG_AHB_CLK                 105
+#define GCC_CAMSS_JPEG_AXI_CLK                 106
+#define GCC_CAMSS_MCLK0_CLK                    107
+#define GCC_CAMSS_MCLK1_CLK                    108
+#define GCC_CAMSS_MCLK2_CLK                    109
+#define GCC_CAMSS_MCLK3_CLK                    110
+#define GCC_CAMSS_MICRO_AHB_CLK                        111
+#define GCC_CAMSS_TOP_AHB_CLK                  112
+#define GCC_CAMSS_VFE0_AHB_CLK                 113
+#define GCC_CAMSS_VFE0_AXI_CLK                 114
+#define GCC_CAMSS_VFE0_CLK                     115
+#define GCC_CAMSS_VFE1_AHB_CLK                 116
+#define GCC_CAMSS_VFE1_AXI_CLK                 117
+#define GCC_CAMSS_VFE1_CLK                     118
+#define GCC_CPP_TBU_CLK                                119
+#define GCC_CRYPTO_AHB_CLK                     120
+#define GCC_CRYPTO_AXI_CLK                     121
+#define GCC_CRYPTO_CLK                         122
+#define GCC_DCC_CLK                            123
+#define GCC_GP1_CLK                            124
+#define GCC_GP2_CLK                            125
+#define GCC_GP3_CLK                            126
+#define GCC_JPEG_TBU_CLK                       127
+#define GCC_MDP_TBU_CLK                                128
+#define GCC_MDSS_AHB_CLK                       129
+#define GCC_MDSS_AXI_CLK                       130
+#define GCC_MDSS_BYTE0_CLK                     131
+#define GCC_MDSS_BYTE1_CLK                     132
+#define GCC_MDSS_ESC0_CLK                      133
+#define GCC_MDSS_ESC1_CLK                      134
+#define GCC_MDSS_MDP_CLK                       135
+#define GCC_MDSS_PCLK0_CLK                     136
+#define GCC_MDSS_PCLK1_CLK                     137
+#define GCC_MDSS_VSYNC_CLK                     138
+#define GCC_MSS_CFG_AHB_CLK                    139
+#define GCC_MSS_Q6_BIMC_AXI_CLK                        140
+#define GCC_OXILI_AHB_CLK                      141
+#define GCC_OXILI_AON_CLK                      142
+#define GCC_OXILI_GFX3D_CLK                    143
+#define GCC_OXILI_TIMER_CLK                    144
+#define GCC_PCNOC_USB3_AXI_CLK                 145
+#define GCC_PDM2_CLK                           146
+#define GCC_PDM_AHB_CLK                                147
+#define GCC_PRNG_AHB_CLK                       148
+#define GCC_QDSS_DAP_CLK                       149
+#define GCC_QUSB_REF_CLK                       150
+#define GCC_RBCPR_GFX_CLK                      151
+#define GCC_SDCC1_AHB_CLK                      152
+#define GCC_SDCC1_APPS_CLK                     153
+#define GCC_SDCC1_ICE_CORE_CLK                 154
+#define GCC_SDCC2_AHB_CLK                      155
+#define GCC_SDCC2_APPS_CLK                     156
+#define GCC_SMMU_CFG_CLK                       157
+#define GCC_USB30_MASTER_CLK                   158
+#define GCC_USB30_MOCK_UTMI_CLK                        159
+#define GCC_USB30_SLEEP_CLK                    160
+#define GCC_USB3_AUX_CLK                       161
+#define GCC_USB3_PIPE_CLK                      162
+#define GCC_USB_PHY_CFG_AHB_CLK                        163
+#define GCC_USB_SS_REF_CLK                     164
+#define GCC_VENUS0_AHB_CLK                     165
+#define GCC_VENUS0_AXI_CLK                     166
+#define GCC_VENUS0_CORE0_VCODEC0_CLK           167
+#define GCC_VENUS0_VCODEC0_CLK                 168
+#define GCC_VENUS_TBU_CLK                      169
+#define GCC_VFE1_TBU_CLK                       170
+#define GCC_VFE_TBU_CLK                                171
+#define GFX3D_CLK_SRC                          172
+#define GP1_CLK_SRC                            173
+#define GP2_CLK_SRC                            174
+#define GP3_CLK_SRC                            175
+#define GPLL0                                  176
+#define GPLL0_EARLY                            177
+#define GPLL2                                  178
+#define GPLL2_EARLY                            179
+#define GPLL3                                  180
+#define GPLL3_EARLY                            181
+#define GPLL4                                  182
+#define GPLL4_EARLY                            183
+#define GPLL6                                  184
+#define GPLL6_EARLY                            185
+#define JPEG0_CLK_SRC                          186
+#define MCLK0_CLK_SRC                          187
+#define MCLK1_CLK_SRC                          188
+#define MCLK2_CLK_SRC                          189
+#define MCLK3_CLK_SRC                          190
+#define MDP_CLK_SRC                            191
+#define PCLK0_CLK_SRC                          192
+#define PCLK1_CLK_SRC                          193
+#define PDM2_CLK_SRC                           194
+#define RBCPR_GFX_CLK_SRC                      195
+#define SDCC1_APPS_CLK_SRC                     196
+#define SDCC1_ICE_CORE_CLK_SRC                 197
+#define SDCC2_APPS_CLK_SRC                     198
+#define USB30_MASTER_CLK_SRC                   199
+#define USB30_MOCK_UTMI_CLK_SRC                        200
+#define USB3_AUX_CLK_SRC                       201
+#define VCODEC0_CLK_SRC                                202
+#define VFE0_CLK_SRC                           203
+#define VFE1_CLK_SRC                           204
+#define VSYNC_CLK_SRC                          205
+
+/* GCC block resets */
+#define GCC_CAMSS_MICRO_BCR                    0
+#define GCC_MSS_BCR                            1
+#define GCC_QUSB2_PHY_BCR                      2
+#define GCC_USB3PHY_PHY_BCR                    3
+#define GCC_USB3_PHY_BCR                       4
+#define GCC_USB_30_BCR                         5
+
+/* GDSCs */
+#define CPP_GDSC                               0
+#define JPEG_GDSC                              1
+#define MDSS_GDSC                              2
+#define OXILI_CX_GDSC                          3
+#define OXILI_GX_GDSC                          4
+#define USB30_GDSC                             5
+#define VENUS_CORE0_GDSC                       6
+#define VENUS_GDSC                             7
+#define VFE0_GDSC                              8
+#define VFE1_GDSC                              9
+
+#endif
index 4394f15..3d5724b 100644 (file)
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
 /*
  * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
  */
diff --git a/include/dt-bindings/clock/qcom,gcc-sm6115.h b/include/dt-bindings/clock/qcom,gcc-sm6115.h
new file mode 100644 (file)
index 0000000..b91a7b4
--- /dev/null
@@ -0,0 +1,201 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (c) 2019-2021, The Linux Foundation. All rights reserved.
+ */
+
+#ifndef _DT_BINDINGS_CLK_QCOM_GCC_SM6115_H
+#define _DT_BINDINGS_CLK_QCOM_GCC_SM6115_H
+
+/* GCC clocks */
+#define GPLL0                                                  0
+#define GPLL0_OUT_AUX2                                         1
+#define GPLL0_OUT_MAIN                                         2
+#define GPLL10                                                 3
+#define GPLL10_OUT_MAIN                                                4
+#define GPLL11                                                 5
+#define GPLL11_OUT_MAIN                                                6
+#define GPLL3                                                  7
+#define GPLL4                                                  8
+#define GPLL4_OUT_MAIN                                         9
+#define GPLL6                                                  10
+#define GPLL6_OUT_MAIN                                         11
+#define GPLL7                                                  12
+#define GPLL7_OUT_MAIN                                         13
+#define GPLL8                                                  14
+#define GPLL8_OUT_MAIN                                         15
+#define GPLL9                                                  16
+#define GPLL9_OUT_MAIN                                         17
+#define GCC_CAMSS_CSI0PHYTIMER_CLK                             18
+#define GCC_CAMSS_CSI0PHYTIMER_CLK_SRC                         19
+#define GCC_CAMSS_CSI1PHYTIMER_CLK                             20
+#define GCC_CAMSS_CSI1PHYTIMER_CLK_SRC                         21
+#define GCC_CAMSS_CSI2PHYTIMER_CLK                             22
+#define GCC_CAMSS_CSI2PHYTIMER_CLK_SRC                         23
+#define GCC_CAMSS_MCLK0_CLK                                    24
+#define GCC_CAMSS_MCLK0_CLK_SRC                                        25
+#define GCC_CAMSS_MCLK1_CLK                                    26
+#define GCC_CAMSS_MCLK1_CLK_SRC                                        27
+#define GCC_CAMSS_MCLK2_CLK                                    28
+#define GCC_CAMSS_MCLK2_CLK_SRC                                        29
+#define GCC_CAMSS_MCLK3_CLK                                    30
+#define GCC_CAMSS_MCLK3_CLK_SRC                                        31
+#define GCC_CAMSS_NRT_AXI_CLK                                  32
+#define GCC_CAMSS_OPE_AHB_CLK                                  33
+#define GCC_CAMSS_OPE_AHB_CLK_SRC                              34
+#define GCC_CAMSS_OPE_CLK                                      35
+#define GCC_CAMSS_OPE_CLK_SRC                                  36
+#define GCC_CAMSS_RT_AXI_CLK                                   37
+#define GCC_CAMSS_TFE_0_CLK                                    38
+#define GCC_CAMSS_TFE_0_CLK_SRC                                        39
+#define GCC_CAMSS_TFE_0_CPHY_RX_CLK                            40
+#define GCC_CAMSS_TFE_0_CSID_CLK                               41
+#define GCC_CAMSS_TFE_0_CSID_CLK_SRC                           42
+#define GCC_CAMSS_TFE_1_CLK                                    43
+#define GCC_CAMSS_TFE_1_CLK_SRC                                        44
+#define GCC_CAMSS_TFE_1_CPHY_RX_CLK                            45
+#define GCC_CAMSS_TFE_1_CSID_CLK                               46
+#define GCC_CAMSS_TFE_1_CSID_CLK_SRC                           47
+#define GCC_CAMSS_TFE_2_CLK                                    48
+#define GCC_CAMSS_TFE_2_CLK_SRC                                        49
+#define GCC_CAMSS_TFE_2_CPHY_RX_CLK                            50
+#define GCC_CAMSS_TFE_2_CSID_CLK                               51
+#define GCC_CAMSS_TFE_2_CSID_CLK_SRC                           52
+#define GCC_CAMSS_TFE_CPHY_RX_CLK_SRC                          53
+#define GCC_CAMSS_TOP_AHB_CLK                                  54
+#define GCC_CAMSS_TOP_AHB_CLK_SRC                              55
+#define GCC_CFG_NOC_USB3_PRIM_AXI_CLK                          56
+#define GCC_CPUSS_AHB_CLK                                      57
+#define GCC_CPUSS_GNOC_CLK                                     60
+#define GCC_DISP_AHB_CLK                                       61
+#define GCC_DISP_GPLL0_DIV_CLK_SRC                             62
+#define GCC_DISP_HF_AXI_CLK                                    63
+#define GCC_DISP_THROTTLE_CORE_CLK                             64
+#define GCC_DISP_XO_CLK                                                65
+#define GCC_GP1_CLK                                            66
+#define GCC_GP1_CLK_SRC                                                67
+#define GCC_GP2_CLK                                            68
+#define GCC_GP2_CLK_SRC                                                69
+#define GCC_GP3_CLK                                            70
+#define GCC_GP3_CLK_SRC                                                71
+#define GCC_GPU_CFG_AHB_CLK                                    72
+#define GCC_GPU_GPLL0_CLK_SRC                                  73
+#define GCC_GPU_GPLL0_DIV_CLK_SRC                              74
+#define GCC_GPU_IREF_CLK                                       75
+#define GCC_GPU_MEMNOC_GFX_CLK                                 76
+#define GCC_GPU_SNOC_DVM_GFX_CLK                               77
+#define GCC_GPU_THROTTLE_CORE_CLK                              78
+#define GCC_GPU_THROTTLE_XO_CLK                                        79
+#define GCC_PDM2_CLK                                           80
+#define GCC_PDM2_CLK_SRC                                       81
+#define GCC_PDM_AHB_CLK                                                82
+#define GCC_PDM_XO4_CLK                                                83
+#define GCC_PRNG_AHB_CLK                                       84
+#define GCC_QMIP_CAMERA_NRT_AHB_CLK                            85
+#define GCC_QMIP_CAMERA_RT_AHB_CLK                             86
+#define GCC_QMIP_DISP_AHB_CLK                                  87
+#define GCC_QMIP_GPU_CFG_AHB_CLK                               88
+#define GCC_QMIP_VIDEO_VCODEC_AHB_CLK                          89
+#define GCC_QUPV3_WRAP0_CORE_2X_CLK                            90
+#define GCC_QUPV3_WRAP0_CORE_CLK                               91
+#define GCC_QUPV3_WRAP0_S0_CLK                                 92
+#define GCC_QUPV3_WRAP0_S0_CLK_SRC                             93
+#define GCC_QUPV3_WRAP0_S1_CLK                                 94
+#define GCC_QUPV3_WRAP0_S1_CLK_SRC                             95
+#define GCC_QUPV3_WRAP0_S2_CLK                                 96
+#define GCC_QUPV3_WRAP0_S2_CLK_SRC                             97
+#define GCC_QUPV3_WRAP0_S3_CLK                                 98
+#define GCC_QUPV3_WRAP0_S3_CLK_SRC                             99
+#define GCC_QUPV3_WRAP0_S4_CLK                                 100
+#define GCC_QUPV3_WRAP0_S4_CLK_SRC                             101
+#define GCC_QUPV3_WRAP0_S5_CLK                                 102
+#define GCC_QUPV3_WRAP0_S5_CLK_SRC                             103
+#define GCC_QUPV3_WRAP_0_M_AHB_CLK                             104
+#define GCC_QUPV3_WRAP_0_S_AHB_CLK                             105
+#define GCC_SDCC1_AHB_CLK                                      106
+#define GCC_SDCC1_APPS_CLK                                     107
+#define GCC_SDCC1_APPS_CLK_SRC                                 108
+#define GCC_SDCC1_ICE_CORE_CLK                                 109
+#define GCC_SDCC1_ICE_CORE_CLK_SRC                             110
+#define GCC_SDCC2_AHB_CLK                                      111
+#define GCC_SDCC2_APPS_CLK                                     112
+#define GCC_SDCC2_APPS_CLK_SRC                                 113
+#define GCC_SYS_NOC_CPUSS_AHB_CLK                              114
+#define GCC_SYS_NOC_UFS_PHY_AXI_CLK                            115
+#define GCC_SYS_NOC_USB3_PRIM_AXI_CLK                          116
+#define GCC_UFS_PHY_AHB_CLK                                    117
+#define GCC_UFS_PHY_AXI_CLK                                    118
+#define GCC_UFS_PHY_AXI_CLK_SRC                                        119
+#define GCC_UFS_PHY_ICE_CORE_CLK                               120
+#define GCC_UFS_PHY_ICE_CORE_CLK_SRC                           121
+#define GCC_UFS_PHY_PHY_AUX_CLK                                        122
+#define GCC_UFS_PHY_PHY_AUX_CLK_SRC                            123
+#define GCC_UFS_PHY_RX_SYMBOL_0_CLK                            124
+#define GCC_UFS_PHY_TX_SYMBOL_0_CLK                            125
+#define GCC_UFS_PHY_UNIPRO_CORE_CLK                            126
+#define GCC_UFS_PHY_UNIPRO_CORE_CLK_SRC                                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_CLK_SRC               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
+#define GCC_AHB2PHY_CSI_CLK                                    148
+#define GCC_AHB2PHY_USB_CLK                                    149
+#define GCC_BIMC_GPU_AXI_CLK                                   150
+#define GCC_BOOT_ROM_AHB_CLK                                   151
+#define GCC_CAM_THROTTLE_NRT_CLK                               152
+#define GCC_CAM_THROTTLE_RT_CLK                                        153
+#define GCC_CAMERA_AHB_CLK                                     154
+#define GCC_CAMERA_XO_CLK                                      155
+#define GCC_CAMSS_AXI_CLK                                      156
+#define GCC_CAMSS_AXI_CLK_SRC                                  157
+#define GCC_CAMSS_CAMNOC_ATB_CLK                               158
+#define GCC_CAMSS_CAMNOC_NTS_XO_CLK                            159
+#define GCC_CAMSS_CCI_0_CLK                                    160
+#define GCC_CAMSS_CCI_CLK_SRC                                  161
+#define GCC_CAMSS_CPHY_0_CLK                                   162
+#define GCC_CAMSS_CPHY_1_CLK                                   163
+#define GCC_CAMSS_CPHY_2_CLK                                   164
+#define GCC_UFS_CLKREF_CLK                                     165
+#define GCC_DISP_GPLL0_CLK_SRC                                 166
+
+/* GCC resets */
+#define GCC_QUSB2PHY_PRIM_BCR                                  0
+#define GCC_QUSB2PHY_SEC_BCR                                   1
+#define GCC_SDCC1_BCR                                          2
+#define GCC_UFS_PHY_BCR                                                3
+#define GCC_USB30_PRIM_BCR                                     4
+#define GCC_USB_PHY_CFG_AHB2PHY_BCR                            5
+#define GCC_VCODEC0_BCR                                                6
+#define GCC_VENUS_BCR                                          7
+#define GCC_VIDEO_INTERFACE_BCR                                        8
+#define GCC_USB3PHY_PHY_PRIM_SP0_BCR                           9
+#define GCC_USB3_PHY_PRIM_SP0_BCR                              10
+#define GCC_SDCC2_BCR                                          11
+
+/* Indexes for GDSCs */
+#define GCC_CAMSS_TOP_GDSC                     0
+#define GCC_UFS_PHY_GDSC                       1
+#define GCC_USB30_PRIM_GDSC                    2
+#define GCC_VCODEC0_GDSC                       3
+#define GCC_VENUS_GDSC                         4
+#define HLOS1_VOTE_TURING_MMU_TBU1_GDSC                5
+#define HLOS1_VOTE_TURING_MMU_TBU0_GDSC                6
+#define HLOS1_VOTE_MM_SNOC_MMU_TBU_RT_GDSC     7
+#define HLOS1_VOTE_MM_SNOC_MMU_TBU_NRT_GDSC    8
+
+#endif
diff --git a/include/dt-bindings/clock/qcom,gcc-sm6350.h b/include/dt-bindings/clock/qcom,gcc-sm6350.h
new file mode 100644 (file)
index 0000000..ba584ca
--- /dev/null
@@ -0,0 +1,178 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021, Konrad Dybcio <konrad.dybcio@somainline.org>
+ */
+
+#ifndef _DT_BINDINGS_CLK_QCOM_GCC_SM6350_H
+#define _DT_BINDINGS_CLK_QCOM_GCC_SM6350_H
+
+/* GCC clocks */
+#define GPLL0                                  0
+#define GPLL0_OUT_EVEN                         1
+#define GPLL0_OUT_ODD                          2
+#define GPLL6                                  3
+#define GPLL6_OUT_EVEN                         4
+#define GPLL7                                  5
+#define GCC_AGGRE_CNOC_PERIPH_CENTER_AHB_CLK   6
+#define GCC_AGGRE_NOC_CENTER_AHB_CLK           7
+#define GCC_AGGRE_NOC_PCIE_SF_AXI_CLK          8
+#define GCC_AGGRE_NOC_PCIE_TBU_CLK             9
+#define GCC_AGGRE_NOC_WLAN_AXI_CLK             10
+#define GCC_AGGRE_UFS_PHY_AXI_CLK              11
+#define GCC_AGGRE_USB3_PRIM_AXI_CLK            12
+#define GCC_BOOT_ROM_AHB_CLK                   13
+#define GCC_CAMERA_AHB_CLK                     14
+#define GCC_CAMERA_AXI_CLK                     15
+#define GCC_CAMERA_THROTTLE_NRT_AXI_CLK                16
+#define GCC_CAMERA_THROTTLE_RT_AXI_CLK         17
+#define GCC_CAMERA_XO_CLK                      18
+#define GCC_CE1_AHB_CLK                                19
+#define GCC_CE1_AXI_CLK                                20
+#define GCC_CE1_CLK                            21
+#define GCC_CFG_NOC_USB3_PRIM_AXI_CLK          22
+#define GCC_CPUSS_AHB_CLK                      23
+#define GCC_CPUSS_AHB_CLK_SRC                  24
+#define GCC_CPUSS_AHB_DIV_CLK_SRC              25
+#define GCC_CPUSS_GNOC_CLK                     26
+#define GCC_CPUSS_RBCPR_CLK                    27
+#define GCC_DDRSS_GPU_AXI_CLK                  28
+#define GCC_DISP_AHB_CLK                       29
+#define GCC_DISP_AXI_CLK                       30
+#define GCC_DISP_CC_SLEEP_CLK                  31
+#define GCC_DISP_CC_XO_CLK                     32
+#define GCC_DISP_GPLL0_CLK                     33
+#define GCC_DISP_THROTTLE_AXI_CLK              34
+#define GCC_DISP_XO_CLK                                35
+#define GCC_GP1_CLK                            36
+#define GCC_GP1_CLK_SRC                                37
+#define GCC_GP2_CLK                            38
+#define GCC_GP2_CLK_SRC                                39
+#define GCC_GP3_CLK                            40
+#define GCC_GP3_CLK_SRC                                41
+#define GCC_GPU_CFG_AHB_CLK                    42
+#define GCC_GPU_GPLL0_CLK                      43
+#define GCC_GPU_GPLL0_DIV_CLK                  44
+#define GCC_GPU_MEMNOC_GFX_CLK                 45
+#define GCC_GPU_SNOC_DVM_GFX_CLK               46
+#define GCC_NPU_AXI_CLK                                47
+#define GCC_NPU_BWMON_AXI_CLK                  48
+#define GCC_NPU_BWMON_DMA_CFG_AHB_CLK          49
+#define GCC_NPU_BWMON_DSP_CFG_AHB_CLK          50
+#define GCC_NPU_CFG_AHB_CLK                    51
+#define GCC_NPU_DMA_CLK                                52
+#define GCC_NPU_GPLL0_CLK                      53
+#define GCC_NPU_GPLL0_DIV_CLK                  54
+#define GCC_PCIE_0_AUX_CLK                     55
+#define GCC_PCIE_0_AUX_CLK_SRC                 56
+#define GCC_PCIE_0_CFG_AHB_CLK                 57
+#define GCC_PCIE_0_MSTR_AXI_CLK                        58
+#define GCC_PCIE_0_PIPE_CLK                    59
+#define GCC_PCIE_0_SLV_AXI_CLK                 60
+#define GCC_PCIE_0_SLV_Q2A_AXI_CLK             61
+#define GCC_PCIE_PHY_RCHNG_CLK                 62
+#define GCC_PCIE_PHY_RCHNG_CLK_SRC             63
+#define GCC_PDM2_CLK                           64
+#define GCC_PDM2_CLK_SRC                       65
+#define GCC_PDM_AHB_CLK                                66
+#define GCC_PDM_XO4_CLK                                67
+#define GCC_PRNG_AHB_CLK                       68
+#define GCC_QUPV3_WRAP0_CORE_2X_CLK            69
+#define GCC_QUPV3_WRAP0_CORE_CLK               70
+#define GCC_QUPV3_WRAP0_S0_CLK                 71
+#define GCC_QUPV3_WRAP0_S0_CLK_SRC             72
+#define GCC_QUPV3_WRAP0_S1_CLK                 73
+#define GCC_QUPV3_WRAP0_S1_CLK_SRC             74
+#define GCC_QUPV3_WRAP0_S2_CLK                 75
+#define GCC_QUPV3_WRAP0_S2_CLK_SRC             76
+#define GCC_QUPV3_WRAP0_S3_CLK                 77
+#define GCC_QUPV3_WRAP0_S3_CLK_SRC             78
+#define GCC_QUPV3_WRAP0_S4_CLK                 79
+#define GCC_QUPV3_WRAP0_S4_CLK_SRC             80
+#define GCC_QUPV3_WRAP0_S5_CLK                 81
+#define GCC_QUPV3_WRAP0_S5_CLK_SRC             82
+#define GCC_QUPV3_WRAP1_CORE_2X_CLK            83
+#define GCC_QUPV3_WRAP1_CORE_CLK               84
+#define GCC_QUPV3_WRAP1_S0_CLK                 85
+#define GCC_QUPV3_WRAP1_S0_CLK_SRC             86
+#define GCC_QUPV3_WRAP1_S1_CLK                 87
+#define GCC_QUPV3_WRAP1_S1_CLK_SRC             88
+#define GCC_QUPV3_WRAP1_S2_CLK                 89
+#define GCC_QUPV3_WRAP1_S2_CLK_SRC             90
+#define GCC_QUPV3_WRAP1_S3_CLK                 91
+#define GCC_QUPV3_WRAP1_S3_CLK_SRC             92
+#define GCC_QUPV3_WRAP1_S4_CLK                 93
+#define GCC_QUPV3_WRAP1_S4_CLK_SRC             94
+#define GCC_QUPV3_WRAP1_S5_CLK                 95
+#define GCC_QUPV3_WRAP1_S5_CLK_SRC             96
+#define GCC_QUPV3_WRAP_0_M_AHB_CLK             97
+#define GCC_QUPV3_WRAP_0_S_AHB_CLK             98
+#define GCC_QUPV3_WRAP_1_M_AHB_CLK             99
+#define GCC_QUPV3_WRAP_1_S_AHB_CLK             100
+#define GCC_SDCC1_AHB_CLK                      101
+#define GCC_SDCC1_APPS_CLK                     102
+#define GCC_SDCC1_APPS_CLK_SRC                 103
+#define GCC_SDCC1_ICE_CORE_CLK                 104
+#define GCC_SDCC1_ICE_CORE_CLK_SRC             105
+#define GCC_SDCC2_AHB_CLK                      106
+#define GCC_SDCC2_APPS_CLK                     107
+#define GCC_SDCC2_APPS_CLK_SRC                 108
+#define GCC_SYS_NOC_CPUSS_AHB_CLK              109
+#define GCC_UFS_MEM_CLKREF_CLK                 110
+#define GCC_UFS_PHY_AHB_CLK                    111
+#define GCC_UFS_PHY_AXI_CLK                    112
+#define GCC_UFS_PHY_AXI_CLK_SRC                        113
+#define GCC_UFS_PHY_ICE_CORE_CLK               114
+#define GCC_UFS_PHY_ICE_CORE_CLK_SRC           115
+#define GCC_UFS_PHY_PHY_AUX_CLK                        116
+#define GCC_UFS_PHY_PHY_AUX_CLK_SRC            117
+#define GCC_UFS_PHY_RX_SYMBOL_0_CLK            118
+#define GCC_UFS_PHY_RX_SYMBOL_1_CLK            119
+#define GCC_UFS_PHY_TX_SYMBOL_0_CLK            120
+#define GCC_UFS_PHY_UNIPRO_CORE_CLK            121
+#define GCC_UFS_PHY_UNIPRO_CORE_CLK_SRC                122
+#define GCC_USB30_PRIM_MASTER_CLK              123
+#define GCC_USB30_PRIM_MASTER_CLK_SRC          124
+#define GCC_USB30_PRIM_MOCK_UTMI_CLK           125
+#define GCC_USB30_PRIM_MOCK_UTMI_CLK_SRC       126
+#define GCC_USB30_PRIM_MOCK_UTMI_DIV_CLK_SRC   127
+#define GCC_USB3_PRIM_CLKREF_CLK               128
+#define GCC_USB30_PRIM_SLEEP_CLK               129
+#define GCC_USB3_PRIM_PHY_AUX_CLK              130
+#define GCC_USB3_PRIM_PHY_AUX_CLK_SRC          131
+#define GCC_USB3_PRIM_PHY_COM_AUX_CLK          132
+#define GCC_USB3_PRIM_PHY_PIPE_CLK             133
+#define GCC_VIDEO_AHB_CLK                      134
+#define GCC_VIDEO_AXI_CLK                      135
+#define GCC_VIDEO_THROTTLE_AXI_CLK             136
+#define GCC_VIDEO_XO_CLK                       137
+#define GCC_UFS_PHY_PHY_AUX_HW_CTL_CLK         138
+#define GCC_UFS_PHY_AXI_HW_CTL_CLK             139
+#define GCC_AGGRE_UFS_PHY_AXI_HW_CTL_CLK       140
+#define GCC_UFS_PHY_UNIPRO_CORE_HW_CTL_CLK     141
+#define GCC_UFS_PHY_ICE_CORE_HW_CTL_CLK                142
+#define GCC_RX5_PCIE_CLKREF_CLK                        143
+#define GCC_GPU_GPLL0_MAIN_DIV_CLK_SRC         144
+#define GCC_NPU_PLL0_MAIN_DIV_CLK_SRC          145
+
+/* GCC resets */
+#define GCC_QUSB2PHY_PRIM_BCR                  0
+#define GCC_QUSB2PHY_SEC_BCR                   1
+#define GCC_SDCC1_BCR                          2
+#define GCC_SDCC2_BCR                          3
+#define GCC_UFS_PHY_BCR                                4
+#define GCC_USB30_PRIM_BCR                     5
+#define GCC_PCIE_0_BCR                         6
+#define GCC_PCIE_0_PHY_BCR                     7
+#define GCC_QUPV3_WRAPPER_0_BCR                        8
+#define GCC_QUPV3_WRAPPER_1_BCR                        9
+#define GCC_USB3_PHY_PRIM_BCR                  10
+#define GCC_USB3_DP_PHY_PRIM_BCR               11
+
+/* GCC GDSCs */
+#define USB30_PRIM_GDSC                                0
+#define UFS_PHY_GDSC                           1
+#define HLOS1_VOTE_MMNOC_MMU_TBU_HF0_GDSC      2
+#define HLOS1_VOTE_MMNOC_MMU_TBU_HF1_GDSC      3
+
+#endif
diff --git a/include/dt-bindings/clock/qcom,gpucc-sc7280.h b/include/dt-bindings/clock/qcom,gpucc-sc7280.h
new file mode 100644 (file)
index 0000000..669b23b
--- /dev/null
@@ -0,0 +1,35 @@
+/* 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_GPU_CC_SC7280_H
+#define _DT_BINDINGS_CLK_QCOM_GPU_CC_SC7280_H
+
+/* GPU_CC clocks */
+#define GPU_CC_PLL0                            0
+#define GPU_CC_PLL1                            1
+#define GPU_CC_AHB_CLK                         2
+#define GPU_CC_CB_CLK                          3
+#define GPU_CC_CRC_AHB_CLK                     4
+#define GPU_CC_CX_GMU_CLK                      5
+#define GPU_CC_CX_SNOC_DVM_CLK                 6
+#define GPU_CC_CXO_AON_CLK                     7
+#define GPU_CC_CXO_CLK                         8
+#define GPU_CC_GMU_CLK_SRC                     9
+#define GPU_CC_GX_GMU_CLK                      10
+#define GPU_CC_HLOS1_VOTE_GPU_SMMU_CLK         11
+#define GPU_CC_HUB_AHB_DIV_CLK_SRC             12
+#define GPU_CC_HUB_AON_CLK                     13
+#define GPU_CC_HUB_CLK_SRC                     14
+#define GPU_CC_HUB_CX_INT_CLK                  15
+#define GPU_CC_HUB_CX_INT_DIV_CLK_SRC          16
+#define GPU_CC_MND1X_0_GFX3D_CLK               17
+#define GPU_CC_MND1X_1_GFX3D_CLK               18
+#define GPU_CC_SLEEP_CLK                       19
+
+/* GPU_CC power domains */
+#define GPU_CC_CX_GDSC                         0
+#define GPU_CC_GX_GDSC                         1
+
+#endif
diff --git a/include/dt-bindings/clock/qcom,mmcc-msm8994.h b/include/dt-bindings/clock/qcom,mmcc-msm8994.h
new file mode 100644 (file)
index 0000000..4b28909
--- /dev/null
@@ -0,0 +1,155 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2020, Konrad Dybcio
+ */
+
+#ifndef _DT_BINDINGS_CLK_MSM_MMCC_8994_H
+#define _DT_BINDINGS_CLK_MSM_MMCC_8994_H
+
+/* Clocks */
+#define MMPLL0_EARLY                                   0
+#define MMPLL0_PLL                                             1
+#define MMPLL1_EARLY                                   2
+#define MMPLL1_PLL                                             3
+#define MMPLL3_EARLY                                   4
+#define MMPLL3_PLL                                             5
+#define MMPLL4_EARLY                                   6
+#define MMPLL4_PLL                                             7
+#define MMPLL5_EARLY                                   8
+#define MMPLL5_PLL                                             9
+#define AXI_CLK_SRC                                            10
+#define RBBMTIMER_CLK_SRC                              11
+#define PCLK0_CLK_SRC                                  12
+#define PCLK1_CLK_SRC                                  13
+#define MDP_CLK_SRC                                            14
+#define VSYNC_CLK_SRC                                  15
+#define BYTE0_CLK_SRC                                  16
+#define BYTE1_CLK_SRC                                  17
+#define ESC0_CLK_SRC                                   18
+#define ESC1_CLK_SRC                                   19
+#define MDSS_AHB_CLK                                   20
+#define MDSS_PCLK0_CLK                                 21
+#define MDSS_PCLK1_CLK                                 22
+#define MDSS_VSYNC_CLK                                 23
+#define MDSS_BYTE0_CLK                                 24
+#define MDSS_BYTE1_CLK                                 25
+#define MDSS_ESC0_CLK                                  26
+#define MDSS_ESC1_CLK                                  27
+#define CSI0_CLK_SRC                                   28
+#define CSI1_CLK_SRC                                   29
+#define CSI2_CLK_SRC                                   30
+#define CSI3_CLK_SRC                                   31
+#define VFE0_CLK_SRC                                   32
+#define VFE1_CLK_SRC                                   33
+#define CPP_CLK_SRC                                            34
+#define JPEG0_CLK_SRC                                  35
+#define JPEG1_CLK_SRC                                  36
+#define JPEG2_CLK_SRC                                  37
+#define CSI2PHYTIMER_CLK_SRC                   38
+#define FD_CORE_CLK_SRC                                        39
+#define OCMEMNOC_CLK_SRC                               40
+#define CCI_CLK_SRC                                            41
+#define MMSS_GP0_CLK_SRC                               42
+#define MMSS_GP1_CLK_SRC                               43
+#define JPEG_DMA_CLK_SRC                               44
+#define MCLK0_CLK_SRC                                  45
+#define MCLK1_CLK_SRC                                  46
+#define MCLK2_CLK_SRC                                  47
+#define MCLK3_CLK_SRC                                  48
+#define CSI0PHYTIMER_CLK_SRC                   49
+#define CSI1PHYTIMER_CLK_SRC                   50
+#define EXTPCLK_CLK_SRC                                        51
+#define HDMI_CLK_SRC                                   52
+#define CAMSS_AHB_CLK                                  53
+#define CAMSS_CCI_CCI_AHB_CLK                  54
+#define CAMSS_CCI_CCI_CLK                              55
+#define CAMSS_VFE_CPP_AHB_CLK                  56
+#define CAMSS_VFE_CPP_AXI_CLK                  57
+#define CAMSS_VFE_CPP_CLK                              58
+#define CAMSS_CSI0_AHB_CLK                             59
+#define CAMSS_CSI0_CLK                                 60
+#define CAMSS_CSI0PHY_CLK                              61
+#define CAMSS_CSI0PIX_CLK                              62
+#define CAMSS_CSI0RDI_CLK                              63
+#define CAMSS_CSI1_AHB_CLK                             64
+#define CAMSS_CSI1_CLK                                 65
+#define CAMSS_CSI1PHY_CLK                              66
+#define CAMSS_CSI1PIX_CLK                              67
+#define CAMSS_CSI1RDI_CLK                              68
+#define CAMSS_CSI2_AHB_CLK                             69
+#define CAMSS_CSI2_CLK                                 70
+#define CAMSS_CSI2PHY_CLK                              71
+#define CAMSS_CSI2PIX_CLK                              72
+#define CAMSS_CSI2RDI_CLK                              73
+#define CAMSS_CSI3_AHB_CLK                             74
+#define CAMSS_CSI3_CLK                                 75
+#define CAMSS_CSI3PHY_CLK                              76
+#define CAMSS_CSI3PIX_CLK                              77
+#define CAMSS_CSI3RDI_CLK                              78
+#define CAMSS_CSI_VFE0_CLK                             79
+#define CAMSS_CSI_VFE1_CLK                             80
+#define CAMSS_GP0_CLK                                  81
+#define CAMSS_GP1_CLK                                  82
+#define CAMSS_ISPIF_AHB_CLK                            83
+#define CAMSS_JPEG_DMA_CLK                             84
+#define CAMSS_JPEG_JPEG0_CLK                   85
+#define CAMSS_JPEG_JPEG1_CLK                   86
+#define CAMSS_JPEG_JPEG2_CLK                   87
+#define CAMSS_JPEG_JPEG_AHB_CLK                        88
+#define CAMSS_JPEG_JPEG_AXI_CLK                        89
+#define CAMSS_MCLK0_CLK                                        90
+#define CAMSS_MCLK1_CLK                                        91
+#define CAMSS_MCLK2_CLK                                        92
+#define CAMSS_MCLK3_CLK                                        93
+#define CAMSS_MICRO_AHB_CLK                            94
+#define CAMSS_PHY0_CSI0PHYTIMER_CLK            95
+#define CAMSS_PHY1_CSI1PHYTIMER_CLK            96
+#define CAMSS_PHY2_CSI2PHYTIMER_CLK            97
+#define CAMSS_TOP_AHB_CLK                              98
+#define CAMSS_VFE_VFE0_CLK                             99
+#define CAMSS_VFE_VFE1_CLK                             100
+#define CAMSS_VFE_VFE_AHB_CLK                  101
+#define CAMSS_VFE_VFE_AXI_CLK                  102
+#define FD_AXI_CLK                                             103
+#define FD_CORE_CLK                                            104
+#define FD_CORE_UAR_CLK                                        105
+#define MDSS_AXI_CLK                                   106
+#define MDSS_EXTPCLK_CLK                               107
+#define MDSS_HDMI_AHB_CLK                              108
+#define MDSS_HDMI_CLK                                  109
+#define MDSS_MDP_CLK                                   110
+#define MMSS_MISC_AHB_CLK                              111
+#define MMSS_MMSSNOC_AXI_CLK                   112
+#define MMSS_S0_AXI_CLK                                        113
+#define OCMEMCX_OCMEMNOC_CLK                   114
+#define OXILI_GFX3D_CLK                                        115
+#define OXILI_RBBMTIMER_CLK                            116
+#define OXILICX_AHB_CLK                                        117
+#define VENUS0_AHB_CLK                                 118
+#define VENUS0_AXI_CLK                                 119
+#define VENUS0_OCMEMNOC_CLK                            120
+#define VENUS0_VCODEC0_CLK                             121
+#define VENUS0_CORE0_VCODEC_CLK                        122
+#define VENUS0_CORE1_VCODEC_CLK                        123
+#define VENUS0_CORE2_VCODEC_CLK                        124
+#define AHB_CLK_SRC                                            125
+#define FD_AHB_CLK                                             126
+
+/* GDSCs */
+#define VENUS_GDSC                                             0
+#define VENUS_CORE0_GDSC                               1
+#define VENUS_CORE1_GDSC                               2
+#define VENUS_CORE2_GDSC                               3
+#define CAMSS_TOP_GDSC                                 4
+#define MDSS_GDSC                                              5
+#define JPEG_GDSC                                              6
+#define VFE_GDSC                                               7
+#define CPP_GDSC                                               8
+#define OXILI_GX_GDSC                                  9
+#define OXILI_CX_GDSC                                  10
+#define FD_GDSC                                                        11
+
+/* Resets */
+#define CAMSS_MICRO_BCR                                        0
+
+#endif
index 8aaba7c..aa834d5 100644 (file)
 #define RPM_SMD_CE2_A_CLK                      103
 #define RPM_SMD_CE3_CLK                                104
 #define RPM_SMD_CE3_A_CLK                      105
+#define RPM_SMD_QUP_CLK                                106
+#define RPM_SMD_QUP_A_CLK                      107
+#define RPM_SMD_MMRT_CLK                       108
+#define RPM_SMD_MMRT_A_CLK                     109
+#define RPM_SMD_MMNRT_CLK                      110
+#define RPM_SMD_MMNRT_A_CLK                    111
+#define RPM_SMD_SNOC_PERIPH_CLK                        112
+#define RPM_SMD_SNOC_PERIPH_A_CLK              113
+#define RPM_SMD_SNOC_LPASS_CLK                 114
+#define RPM_SMD_SNOC_LPASS_A_CLK               115
 
 #endif
index 583a991..0a7d1be 100644 (file)
@@ -31,5 +31,7 @@
 #define RPMH_RF_CLK5_A                         22
 #define RPMH_PKA_CLK                           23
 #define RPMH_HWKM_CLK                          24
+#define RPMH_QLINK_CLK                         25
+#define RPMH_QLINK_CLK_A                       26
 
 #endif
diff --git a/include/dt-bindings/clock/qcom,videocc-sc7280.h b/include/dt-bindings/clock/qcom,videocc-sc7280.h
new file mode 100644 (file)
index 0000000..9e00c3a
--- /dev/null
@@ -0,0 +1,27 @@
+/* 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_VIDEO_CC_SC7280_H
+#define _DT_BINDINGS_CLK_QCOM_VIDEO_CC_SC7280_H
+
+/* VIDEO_CC clocks */
+#define VIDEO_PLL0                             0
+#define VIDEO_CC_IRIS_AHB_CLK                  1
+#define VIDEO_CC_IRIS_CLK_SRC                  2
+#define VIDEO_CC_MVS0_AXI_CLK                  3
+#define VIDEO_CC_MVS0_CORE_CLK                 4
+#define VIDEO_CC_MVSC_CORE_CLK                 5
+#define VIDEO_CC_MVSC_CTL_AXI_CLK              6
+#define VIDEO_CC_SLEEP_CLK                     7
+#define VIDEO_CC_SLEEP_CLK_SRC                 8
+#define VIDEO_CC_VENUS_AHB_CLK                 9
+#define VIDEO_CC_XO_CLK                                10
+#define VIDEO_CC_XO_CLK_SRC                    11
+
+/* VIDEO_CC power domains */
+#define MVS0_GDSC                              0
+#define MVSC_GDSC                              1
+
+#endif
index 35a5a01..a96a987 100644 (file)
@@ -81,6 +81,7 @@
 #define HCLK_OTG0              449
 #define HCLK_OTG1              450
 #define HCLK_NANDC             453
+#define HCLK_SFC               454
 #define HCLK_SDMMC             456
 #define HCLK_SDIO              457
 #define HCLK_EMMC              459
index d83b829..f59c875 100644 (file)
@@ -342,7 +342,7 @@ struct clk_fixed_rate {
        unsigned long   flags;
 };
 
-#define CLK_FIXED_RATE_PARENT_ACCURACY         BIT(0)
+#define CLK_FIXED_RATE_PARENT_ACCURACY BIT(0)
 
 extern const struct clk_ops clk_fixed_rate_ops;
 struct clk_hw *__clk_hw_register_fixed_rate(struct device *dev,
@@ -1001,6 +1001,12 @@ struct clk_hw *devm_clk_hw_register_fixed_factor(struct device *dev,
  * CLK_FRAC_DIVIDER_BIG_ENDIAN - By default little endian register accesses are
  *     used for the divider register.  Setting this flag makes the register
  *     accesses big endian.
+ * CLK_FRAC_DIVIDER_POWER_OF_TWO_PS - By default the resulting fraction might
+ *     be saturated and the caller will get quite far from the good enough
+ *     approximation. Instead the caller may require, by setting this flag,
+ *     to shift left by a few bits in case, when the asked one is quite small
+ *     to satisfy the desired range of denominator. It assumes that on the
+ *     caller's side the power-of-two capable prescaler exists.
  */
 struct clk_fractional_divider {
        struct clk_hw   hw;
@@ -1022,8 +1028,8 @@ struct clk_fractional_divider {
 
 #define CLK_FRAC_DIVIDER_ZERO_BASED            BIT(0)
 #define CLK_FRAC_DIVIDER_BIG_ENDIAN            BIT(1)
+#define CLK_FRAC_DIVIDER_POWER_OF_TWO_PS       BIT(2)
 
-extern const struct clk_ops clk_fractional_divider_ops;
 struct clk *clk_register_fractional_divider(struct device *dev,
                const char *name, const char *parent_name, unsigned long flags,
                void __iomem *reg, u8 mshift, u8 mwidth, u8 nshift, u8 nwidth,
@@ -1069,9 +1075,9 @@ struct clk_multiplier {
 
 #define to_clk_multiplier(_hw) container_of(_hw, struct clk_multiplier, hw)
 
-#define CLK_MULTIPLIER_ZERO_BYPASS             BIT(0)
+#define CLK_MULTIPLIER_ZERO_BYPASS     BIT(0)
 #define CLK_MULTIPLIER_ROUND_CLOSEST   BIT(1)
-#define CLK_MULTIPLIER_BIG_ENDIAN              BIT(2)
+#define CLK_MULTIPLIER_BIG_ENDIAN      BIT(2)
 
 extern const struct clk_ops clk_multiplier_ops;
 
index 207e1a3..41df326 100644 (file)
@@ -15,6 +15,6 @@ struct lpss_clk_data {
        struct clk *clk;
 };
 
-extern int lpt_clk_init(void);
+extern int lpss_atom_clk_init(void);
 
 #endif /* __CLK_LPSS_H */
index 8ddc786..ada3a0a 100644 (file)
@@ -47,6 +47,7 @@ extern void pm_clk_remove(struct device *dev, const char *con_id);
 extern void pm_clk_remove_clk(struct device *dev, struct clk *clk);
 extern int pm_clk_suspend(struct device *dev);
 extern int pm_clk_resume(struct device *dev);
+extern int devm_pm_clk_create(struct device *dev);
 #else
 static inline bool pm_clk_no_clocks(struct device *dev)
 {
@@ -83,6 +84,10 @@ static inline void pm_clk_remove(struct device *dev, const char *con_id)
 static inline void pm_clk_remove_clk(struct device *dev, struct clk *clk)
 {
 }
+static inline int devm_pm_clk_create(struct device *dev)
+{
+       return -EINVAL;
+}
 #endif
 
 #ifdef CONFIG_HAVE_CLK
index aab8b35..222da43 100644 (file)
@@ -59,6 +59,8 @@ extern void pm_runtime_put_suppliers(struct device *dev);
 extern void pm_runtime_new_link(struct device *dev);
 extern void pm_runtime_drop_link(struct device_link *link);
 
+extern int devm_pm_runtime_enable(struct device *dev);
+
 /**
  * pm_runtime_get_if_in_use - Conditionally bump up runtime PM usage counter.
  * @dev: Target device.
@@ -253,6 +255,8 @@ static inline void __pm_runtime_disable(struct device *dev, bool c) {}
 static inline void pm_runtime_allow(struct device *dev) {}
 static inline void pm_runtime_forbid(struct device *dev) {}
 
+static inline int devm_pm_runtime_enable(struct device *dev) { return 0; }
+
 static inline void pm_suspend_ignore_children(struct device *dev, bool enable) {}
 static inline void pm_runtime_get_noresume(struct device *dev) {}
 static inline void pm_runtime_put_noidle(struct device *dev) {}
index f2645ec..60e66fc 100644 (file)
@@ -29,6 +29,7 @@ struct qcom_smd_rpm;
 #define QCOM_SMD_RPM_NCPB      0x6270636E
 #define QCOM_SMD_RPM_OCMEM_PWR 0x706d636f
 #define QCOM_SMD_RPM_QPIC_CLK  0x63697071
+#define QCOM_SMD_RPM_QUP_CLK   0x707571
 #define QCOM_SMD_RPM_SMPA      0x61706d73
 #define QCOM_SMD_RPM_SMPB      0x62706d73
 #define QCOM_SMD_RPM_SPDM      0x63707362