Merge branches 'clk-samsung', 'clk-mtk', 'clk-rm', 'clk-ast' and 'clk-qcom' into...
authorStephen Boyd <sboyd@kernel.org>
Tue, 4 Oct 2022 17:53:41 +0000 (10:53 -0700)
committerStephen Boyd <sboyd@kernel.org>
Tue, 4 Oct 2022 17:53:41 +0000 (10:53 -0700)
 - Add resets for MediaTek MT8195 PCIe and USB
 - Remove DaVinci DM644x and DM646x clk driver support

* clk-samsung:
  clk: samsung: MAINTAINERS: add Krzysztof Kozlowski
  clk: samsung: exynos850: Implement CMU_MFCMSCL domain
  clk: samsung: exynos850: Implement CMU_IS domain
  clk: samsung: exynos850: Implement CMU_AUD domain
  clk: samsung: exynos850: Style fixes
  clk: samsung: exynosautov9: add fsys1 clock support
  clk: samsung: exynosautov9: add fsys0 clock support
  clk: samsung: exynosautov9: correct register offsets of peric0/c1
  clk: samsung: exynosautov9: add missing gate clks for peric0/c1
  dt-bindings: clock: exynos850: Add Exynos850 CMU_MFCMSCL
  dt-bindings: clock: exynos850: Add Exynos850 CMU_IS
  dt-bindings: clock: exynos850: Add Exynos850 CMU_AUD
  dt-bindings: clock: exynosautov9: add schema for cmu_fsys0/1
  dt-bindings: clock: exynosautov9: add fsys1 clock definitions
  dt-bindings: clock: exynosautov9: add fys0 clock definitions
  clk: samsung: exynos7885: Add TREX clocks
  clk: samsung: exynos7885: Implement CMU_FSYS domain
  dt-bindings: clock: exynosautov9: correct clock numbering of peric0/c1
  clk: samsung: exynos-clkout: Use of_device_get_match_data()

* clk-mtk: (42 commits)
  clk: mediatek: add driver for MT8365 SoC
  clk: mediatek: Export required common code symbols
  clk: mediatek: Provide mtk_devm_alloc_clk_data
  dt-bindings: clock: mediatek: add bindings for MT8365 SoC
  clk: mediatek: mt8192: deduplicate parent clock lists
  clk: mediatek: Migrate remaining clk_unregister_*() to clk_hw_unregister_*()
  clk: mediatek: fix unregister function in mtk_clk_register_dividers cleanup
  clk: mediatek: clk-mt8192: Add clock mux notifier for mfg_pll_sel
  clk: mediatek: clk-mt8192-mfg: Propagate rate changes to parent
  clk: mediatek: clk-mt8195-topckgen: Drop univplls from mfg mux parents
  clk: mediatek: clk-mt8195-topckgen: Add GPU clock mux notifier
  clk: mediatek: clk-mt8195-topckgen: Register mfg_ck_fast_ref as generic mux
  clk: mediatek: clk-mt8195-mfg: Reparent mfg_bg3d and propagate rate changes
  clk: mediatek: mt8183: Add clk mux notifier for MFG mux
  clk: mediatek: mux: add clk notifier functions
  clk: mediatek: mt8183: mfgcfg: Propagate rate changes to parent
  clk: mediatek: Use mtk_clk_register_gates_with_dev in simple probe
  clk: mediatek: gate: Export mtk_clk_register_gates_with_dev
  clk: mediatek: add VDOSYS1 clock
  dt-bindings: clk: mediatek: Add MT8195 DPI clocks
  ...

* clk-rm:
  clk: davinci: remove PLL and PSC clocks for DaVinci DM644x and DM646x

* clk-ast:
  clk: ast2600: BCLK comes from EPLL

* clk-qcom: (97 commits)
  clk: qcom: gcc-sm6375: Ensure unsigned long type
  clk: qcom: gcc-sm6375: Remove unused variables
  clk: qcom: kpss-xcc: convert to parent data API
  clk: introduce (devm_)hw_register_mux_parent_data_table API
  clk: qcom: gcc-msm8939: use ARRAY_SIZE instead of specifying num_parents
  clk: qcom: gcc-msm8939: use parent_hws where possible
  dt-bindings: clock: move qcom,gcc-msm8939 to qcom,gcc-msm8916.yaml
  clk: qcom: gcc-sm6350: Update the .pwrsts for usb gdscs
  clk: qcom: gcc-sc8280xp: use retention for USB power domains
  clk: qcom: gdsc: add missing error handling
  dt-bindings: clocks: qcom,gcc-sc8280xp: Fix typos
  clk: qcom: Add global clock controller driver for SM6375
  dt-bindings: clock: add SM6375 QCOM global clock bindings
  clk: qcom: alpha: Add support for programming the PLL_FSM_LEGACY_MODE bit
  clk: qcom: gcc-sc7280: Update the .pwrsts for usb gdscs
  clk: qcom: gcc-sc7180: Update the .pwrsts for usb gdsc
  clk: qcom: gdsc: Fix the handling of PWRSTS_RET support
  clk: qcom: Add SC8280XP GPU clock controller
  dt-bindings: clock: Add Qualcomm SC8280XP GPU binding
  clk: qcom: smd: Add SM6375 clocks
  ...

197 files changed:
Documentation/devicetree/bindings/arm/mediatek/mediatek,infracfg.yaml
Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml
Documentation/devicetree/bindings/arm/mediatek/mediatek,pericfg.yaml
Documentation/devicetree/bindings/clock/mediatek,apmixedsys.yaml
Documentation/devicetree/bindings/clock/mediatek,mt6795-clock.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/mediatek,mt6795-sys-clock.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/mediatek,mt8365-clock.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/mediatek,mt8365-sys-clock.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/mediatek,topckgen.yaml
Documentation/devicetree/bindings/clock/qcom,a53pll.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-apq8064.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-msm8660.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/qcom,gcc-msm8909.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/qcom,gcc-msm8916.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/qcom,gcc-msm8976.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-msm8994.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-msm8996.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-msm8998.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-other.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-qcm2290.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-sc7180.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-sc7280.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-sc8180x.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-sc8280xp.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-sdm845.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-sdx55.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-sdx65.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-sm6115.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-sm6125.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-sm6350.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-sm8150.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-sm8250.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-sm8350.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-sm8450.yaml
Documentation/devicetree/bindings/clock/qcom,gpucc.yaml
Documentation/devicetree/bindings/clock/qcom,mmcc.yaml
Documentation/devicetree/bindings/clock/qcom,msm8996-apcc.yaml
Documentation/devicetree/bindings/clock/qcom,rpmcc.yaml
Documentation/devicetree/bindings/clock/qcom,rpmhcc.yaml
Documentation/devicetree/bindings/clock/qcom,sc7280-lpasscc.yaml
Documentation/devicetree/bindings/clock/qcom,sc7280-lpasscorecc.yaml
Documentation/devicetree/bindings/clock/qcom,sm6115-dispcc.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/qcom,sm6375-gcc.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/qcom,sm8450-dispcc.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/samsung,exynos850-clock.yaml
Documentation/devicetree/bindings/clock/samsung,exynosautov9-clock.yaml
MAINTAINERS
drivers/clk/clk-ast2600.c
drivers/clk/davinci/Makefile
drivers/clk/davinci/pll-dm644x.c [deleted file]
drivers/clk/davinci/pll-dm646x.c [deleted file]
drivers/clk/davinci/pll.c
drivers/clk/davinci/pll.h
drivers/clk/davinci/psc-dm644x.c [deleted file]
drivers/clk/davinci/psc-dm646x.c [deleted file]
drivers/clk/davinci/psc.c
drivers/clk/davinci/psc.h
drivers/clk/mediatek/Kconfig
drivers/clk/mediatek/Makefile
drivers/clk/mediatek/clk-apmixed.c
drivers/clk/mediatek/clk-cpumux.c
drivers/clk/mediatek/clk-gate.c
drivers/clk/mediatek/clk-mt2701-bdp.c
drivers/clk/mediatek/clk-mt2701-img.c
drivers/clk/mediatek/clk-mt2701-vdec.c
drivers/clk/mediatek/clk-mt2712-bdp.c
drivers/clk/mediatek/clk-mt2712-img.c
drivers/clk/mediatek/clk-mt2712-jpgdec.c
drivers/clk/mediatek/clk-mt2712-mfg.c
drivers/clk/mediatek/clk-mt2712-vdec.c
drivers/clk/mediatek/clk-mt2712-venc.c
drivers/clk/mediatek/clk-mt6765-audio.c
drivers/clk/mediatek/clk-mt6765-cam.c
drivers/clk/mediatek/clk-mt6765-img.c
drivers/clk/mediatek/clk-mt6765-mipi0a.c
drivers/clk/mediatek/clk-mt6765-mm.c
drivers/clk/mediatek/clk-mt6765-vcodec.c
drivers/clk/mediatek/clk-mt6779-aud.c
drivers/clk/mediatek/clk-mt6779-cam.c
drivers/clk/mediatek/clk-mt6779-img.c
drivers/clk/mediatek/clk-mt6779-ipe.c
drivers/clk/mediatek/clk-mt6779-mfg.c
drivers/clk/mediatek/clk-mt6779-vdec.c
drivers/clk/mediatek/clk-mt6779-venc.c
drivers/clk/mediatek/clk-mt6795-apmixedsys.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt6795-infracfg.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt6795-mfg.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt6795-mm.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt6795-pericfg.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt6795-topckgen.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt6795-vdecsys.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt6795-vencsys.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt6797-img.c
drivers/clk/mediatek/clk-mt6797-vdec.c
drivers/clk/mediatek/clk-mt6797-venc.c
drivers/clk/mediatek/clk-mt8183-cam.c
drivers/clk/mediatek/clk-mt8183-img.c
drivers/clk/mediatek/clk-mt8183-ipu0.c
drivers/clk/mediatek/clk-mt8183-ipu1.c
drivers/clk/mediatek/clk-mt8183-ipu_adl.c
drivers/clk/mediatek/clk-mt8183-ipu_conn.c
drivers/clk/mediatek/clk-mt8183-mfgcfg.c
drivers/clk/mediatek/clk-mt8183-vdec.c
drivers/clk/mediatek/clk-mt8183-venc.c
drivers/clk/mediatek/clk-mt8183.c
drivers/clk/mediatek/clk-mt8192-cam.c
drivers/clk/mediatek/clk-mt8192-img.c
drivers/clk/mediatek/clk-mt8192-imp_iic_wrap.c
drivers/clk/mediatek/clk-mt8192-ipe.c
drivers/clk/mediatek/clk-mt8192-mdp.c
drivers/clk/mediatek/clk-mt8192-mfg.c
drivers/clk/mediatek/clk-mt8192-msdc.c
drivers/clk/mediatek/clk-mt8192-scp_adsp.c
drivers/clk/mediatek/clk-mt8192-vdec.c
drivers/clk/mediatek/clk-mt8192-venc.c
drivers/clk/mediatek/clk-mt8192.c
drivers/clk/mediatek/clk-mt8195-infra_ao.c
drivers/clk/mediatek/clk-mt8195-mfg.c
drivers/clk/mediatek/clk-mt8195-topckgen.c
drivers/clk/mediatek/clk-mt8195-vdo0.c
drivers/clk/mediatek/clk-mt8195-vdo1.c
drivers/clk/mediatek/clk-mt8365-apu.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8365-cam.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8365-mfg.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8365-mm.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8365-vdec.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8365-venc.c [new file with mode: 0644]
drivers/clk/mediatek/clk-mt8365.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/reset.c
drivers/clk/qcom/Kconfig
drivers/clk/qcom/Makefile
drivers/clk/qcom/a53-pll.c
drivers/clk/qcom/apss-ipq-pll.c
drivers/clk/qcom/apss-ipq6018.c
drivers/clk/qcom/clk-alpha-pll.c
drivers/clk/qcom/clk-alpha-pll.h
drivers/clk/qcom/clk-cpu-8996.c
drivers/clk/qcom/clk-rcg.h
drivers/clk/qcom/clk-rcg2.c
drivers/clk/qcom/clk-rpmh.c
drivers/clk/qcom/clk-smd-rpm.c
drivers/clk/qcom/dispcc-sm6115.c [new file with mode: 0644]
drivers/clk/qcom/dispcc-sm8450.c [new file with mode: 0644]
drivers/clk/qcom/gcc-msm8660.c
drivers/clk/qcom/gcc-msm8909.c [new file with mode: 0644]
drivers/clk/qcom/gcc-msm8916.c
drivers/clk/qcom/gcc-msm8939.c
drivers/clk/qcom/gcc-msm8960.c
drivers/clk/qcom/gcc-qcm2290.c
drivers/clk/qcom/gcc-sc7180.c
drivers/clk/qcom/gcc-sc7280.c
drivers/clk/qcom/gcc-sc8280xp.c
drivers/clk/qcom/gcc-sdm660.c
drivers/clk/qcom/gcc-sdm845.c
drivers/clk/qcom/gcc-sm6115.c
drivers/clk/qcom/gcc-sm6350.c
drivers/clk/qcom/gcc-sm6375.c [new file with mode: 0644]
drivers/clk/qcom/gdsc.c
drivers/clk/qcom/gdsc.h
drivers/clk/qcom/gpucc-sc8280xp.c [new file with mode: 0644]
drivers/clk/qcom/kpss-xcc.c
drivers/clk/qcom/lcc-ipq806x.c
drivers/clk/qcom/lcc-msm8960.c
drivers/clk/qcom/lpassaudiocc-sc7280.c
drivers/clk/qcom/lpasscc-sc7280.c
drivers/clk/qcom/lpasscorecc-sc7280.c
drivers/clk/qcom/mmcc-msm8960.c
drivers/clk/qcom/reset.c
drivers/clk/qcom/reset.h
drivers/clk/samsung/clk-exynos-clkout.c
drivers/clk/samsung/clk-exynos7885.c
drivers/clk/samsung/clk-exynos850.c
drivers/clk/samsung/clk-exynosautov9.c
include/dt-bindings/clock/exynos850.h
include/dt-bindings/clock/mediatek,mt6795-clk.h [new file with mode: 0644]
include/dt-bindings/clock/mediatek,mt8365-clk.h [new file with mode: 0644]
include/dt-bindings/clock/mt8195-clk.h
include/dt-bindings/clock/qcom,gcc-msm8909.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,gcc-sdm845.h
include/dt-bindings/clock/qcom,gpucc-sc8280xp.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,lcc-ipq806x.h
include/dt-bindings/clock/qcom,lpassaudiocc-sc7280.h
include/dt-bindings/clock/qcom,lpasscorecc-sc7280.h
include/dt-bindings/clock/qcom,rpmcc.h
include/dt-bindings/clock/qcom,sm6115-dispcc.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,sm6375-gcc.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,sm8450-dispcc.h [new file with mode: 0644]
include/dt-bindings/clock/samsung,exynosautov9.h
include/dt-bindings/reset/mediatek,mt6795-resets.h [new file with mode: 0644]
include/dt-bindings/reset/mt8195-resets.h
include/linux/clk-provider.h
include/linux/clk/davinci.h
include/linux/soc/qcom/smd-rpm.h

index 8681b78..1d7c837 100644 (file)
@@ -23,6 +23,7 @@ properties:
               - mediatek,mt2701-infracfg
               - mediatek,mt2712-infracfg
               - mediatek,mt6765-infracfg
+              - mediatek,mt6795-infracfg
               - mediatek,mt6779-infracfg_ao
               - mediatek,mt6797-infracfg
               - mediatek,mt7622-infracfg
@@ -60,6 +61,7 @@ if:
         enum:
           - mediatek,mt2701-infracfg
           - mediatek,mt2712-infracfg
+          - mediatek,mt6795-infracfg
           - mediatek,mt7622-infracfg
           - mediatek,mt7986-infracfg
           - mediatek,mt8135-infracfg
index 6ad023e..597ef18 100644 (file)
@@ -25,6 +25,7 @@ properties:
               - mediatek,mt2712-mmsys
               - mediatek,mt6765-mmsys
               - mediatek,mt6779-mmsys
+              - mediatek,mt6795-mmsys
               - mediatek,mt6797-mmsys
               - mediatek,mt8167-mmsys
               - mediatek,mt8173-mmsys
index 8585f6f..ef62cbb 100644 (file)
@@ -21,6 +21,7 @@ properties:
               - mediatek,mt2701-pericfg
               - mediatek,mt2712-pericfg
               - mediatek,mt6765-pericfg
+              - mediatek,mt6795-pericfg
               - mediatek,mt7622-pericfg
               - mediatek,mt7629-pericfg
               - mediatek,mt8135-pericfg
index 7705461..731bfe0 100644 (file)
@@ -34,6 +34,7 @@ properties:
               - mediatek,mt2712-apmixedsys
               - mediatek,mt6765-apmixedsys
               - mediatek,mt6779-apmixedsys
+              - mediatek,mt6795-apmixedsys
               - mediatek,mt7629-apmixedsys
               - mediatek,mt8167-apmixedsys
               - mediatek,mt8183-apmixedsys
diff --git a/Documentation/devicetree/bindings/clock/mediatek,mt6795-clock.yaml b/Documentation/devicetree/bindings/clock/mediatek,mt6795-clock.yaml
new file mode 100644 (file)
index 0000000..04469ea
--- /dev/null
@@ -0,0 +1,66 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/mediatek,mt6795-clock.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: MediaTek Functional Clock Controller for MT6795
+
+maintainers:
+  - AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+  - Chun-Jie Chen <chun-jie.chen@mediatek.com>
+
+description: |
+  The clock architecture in MediaTek like below
+  PLLs -->
+          dividers -->
+                      muxes
+                           -->
+                              clock gate
+
+  The devices provide clock gate control in different IP blocks.
+
+properties:
+  compatible:
+    enum:
+      - mediatek,mt6795-mfgcfg
+      - mediatek,mt6795-vdecsys
+      - mediatek,mt6795-vencsys
+
+  reg:
+    maxItems: 1
+
+  '#clock-cells':
+    const: 1
+
+required:
+  - compatible
+  - reg
+  - '#clock-cells'
+
+additionalProperties: false
+
+examples:
+  - |
+    soc {
+        #address-cells = <2>;
+        #size-cells = <2>;
+
+        mfgcfg: clock-controller@13000000 {
+            compatible = "mediatek,mt6795-mfgcfg";
+            reg = <0 0x13000000 0 0x1000>;
+            #clock-cells = <1>;
+        };
+
+        vdecsys: clock-controller@16000000 {
+            compatible = "mediatek,mt6795-vdecsys";
+            reg = <0 0x16000000 0 0x1000>;
+            #clock-cells = <1>;
+        };
+
+        vencsys: clock-controller@18000000 {
+            compatible = "mediatek,mt6795-vencsys";
+            reg = <0 0x18000000 0 0x1000>;
+            #clock-cells = <1>;
+        };
+    };
diff --git a/Documentation/devicetree/bindings/clock/mediatek,mt6795-sys-clock.yaml b/Documentation/devicetree/bindings/clock/mediatek,mt6795-sys-clock.yaml
new file mode 100644 (file)
index 0000000..378b761
--- /dev/null
@@ -0,0 +1,54 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/mediatek,mt6795-sys-clock.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: MediaTek System Clock Controller for MT6795
+
+maintainers:
+  - AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+  - 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 MT6795.
+
+properties:
+  compatible:
+    items:
+      - enum:
+          - mediatek,mt6795-apmixedsys
+          - mediatek,mt6795-infracfg
+          - mediatek,mt6795-pericfg
+          - mediatek,mt6795-topckgen
+      - const: syscon
+
+  reg:
+    maxItems: 1
+
+  '#clock-cells':
+    const: 1
+
+  '#reset-cells':
+    const: 1
+
+required:
+  - compatible
+  - reg
+  - '#clock-cells'
+
+additionalProperties: false
+
+examples:
+  - |
+    soc {
+        #address-cells = <2>;
+        #size-cells = <2>;
+
+        topckgen: clock-controller@10000000 {
+            compatible = "mediatek,mt6795-topckgen", "syscon";
+            reg = <0 0x10000000 0 0x1000>;
+            #clock-cells = <1>;
+        };
+    };
diff --git a/Documentation/devicetree/bindings/clock/mediatek,mt8365-clock.yaml b/Documentation/devicetree/bindings/clock/mediatek,mt8365-clock.yaml
new file mode 100644 (file)
index 0000000..b327ecb
--- /dev/null
@@ -0,0 +1,42 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/mediatek,mt8365-clock.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: MediaTek Functional Clock Controller for MT8365
+
+maintainers:
+  - Markus Schneider-Pargmann <msp@baylibre.com>
+
+properties:
+  compatible:
+    items:
+      - enum:
+          - mediatek,mt8365-apu
+          - mediatek,mt8365-imgsys
+          - mediatek,mt8365-mfgcfg
+          - mediatek,mt8365-vdecsys
+          - mediatek,mt8365-vencsys
+      - const: syscon
+
+  reg:
+    maxItems: 1
+
+  '#clock-cells':
+    const: 1
+
+required:
+  - compatible
+  - reg
+  - '#clock-cells'
+
+additionalProperties: false
+
+examples:
+  - |
+    apu: clock-controller@19020000 {
+        compatible = "mediatek,mt8365-apu", "syscon";
+        reg = <0x19020000 0x1000>;
+        #clock-cells = <1>;
+    };
diff --git a/Documentation/devicetree/bindings/clock/mediatek,mt8365-sys-clock.yaml b/Documentation/devicetree/bindings/clock/mediatek,mt8365-sys-clock.yaml
new file mode 100644 (file)
index 0000000..643f846
--- /dev/null
@@ -0,0 +1,47 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/mediatek,mt8365-sys-clock.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: MediaTek System Clock Controller for MT8365
+
+maintainers:
+  - Markus Schneider-Pargmann <msp@baylibre.com>
+
+description:
+  The apmixedsys module provides most of PLLs which generated from SoC 26m.
+  The topckgen provides dividers and muxes which provides the clock source to other IP blocks.
+  The infracfg_ao and pericfg_ao provides clock gate in peripheral and infrastructure IP blocks.
+
+properties:
+  compatible:
+    items:
+      - enum:
+          - mediatek,mt8365-topckgen
+          - mediatek,mt8365-infracfg
+          - mediatek,mt8365-apmixedsys
+          - mediatek,mt8365-pericfg
+          - mediatek,mt8365-mcucfg
+      - const: syscon
+
+  reg:
+    maxItems: 1
+
+  '#clock-cells':
+    const: 1
+
+required:
+  - compatible
+  - reg
+  - '#clock-cells'
+
+additionalProperties: false
+
+examples:
+  - |
+    topckgen: clock-controller@10000000 {
+        compatible = "mediatek,mt8365-topckgen", "syscon";
+        reg = <0x10000000 0x1000>;
+        #clock-cells = <1>;
+    };
index 5b8b37a..81531b5 100644 (file)
@@ -33,6 +33,7 @@ properties:
               - mediatek,mt2712-topckgen
               - mediatek,mt6765-topckgen
               - mediatek,mt6779-topckgen
+              - mediatek,mt6795-topckgen
               - mediatek,mt7629-topckgen
               - mediatek,mt7986-topckgen
               - mediatek,mt8167-topckgen
index fbd7584..fe6ca4f 100644 (file)
@@ -7,7 +7,7 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
 title: Qualcomm A53 PLL Binding
 
 maintainers:
-  - Sivaprakash Murugesan <sivaprak@codeaurora.org>
+  - Bjorn Andersson <andersson@kernel.org>
 
 description:
   The A53 PLL on few Qualcomm platforms is the main CPU PLL used used for
@@ -17,6 +17,7 @@ properties:
   compatible:
     enum:
       - qcom,ipq6018-a53pll
+      - qcom,ipq8074-a53pll
       - qcom,msm8916-a53pll
       - qcom,msm8939-a53pll
 
index 3cf404c..6b4efd6 100644 (file)
@@ -38,6 +38,15 @@ properties:
     description: child tsens device
     $ref: /schemas/thermal/qcom-tsens.yaml#
 
+  clocks:
+    maxItems: 3
+
+  clock-names:
+    items:
+      - const: cxo
+      - const: pxo
+      - const: pll4
+
   nvmem-cells:
     minItems: 1
     maxItems: 2
diff --git a/Documentation/devicetree/bindings/clock/qcom,gcc-msm8660.yaml b/Documentation/devicetree/bindings/clock/qcom,gcc-msm8660.yaml
new file mode 100644 (file)
index 0000000..09b2ea6
--- /dev/null
@@ -0,0 +1,54 @@
+# SPDX-License-Identifier: GPL-2.0-only
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/qcom,gcc-msm8660.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm Global Clock & Reset Controller Binding for MSM8660
+
+maintainers:
+  - Stephen Boyd <sboyd@kernel.org>
+  - Taniya Das <quic_tdas@quicinc.com>
+
+description: |
+  Qualcomm global clock control module which supports the clocks and resets on
+  MSM8660
+
+  See also:
+  - dt-bindings/clock/qcom,gcc-msm8660.h
+  - dt-bindings/reset/qcom,gcc-msm8660.h
+
+allOf:
+  - $ref: "qcom,gcc.yaml#"
+
+properties:
+  compatible:
+    enum:
+      - qcom,gcc-msm8660
+
+  clocks:
+    maxItems: 2
+
+  clock-names:
+    items:
+      - const: pxo
+      - const: cxo
+
+required:
+  - compatible
+
+unevaluatedProperties: false
+
+examples:
+  # Example for GCC for MSM8974:
+  - |
+    clock-controller@900000 {
+      compatible = "qcom,gcc-msm8660";
+      reg = <0x900000 0x4000>;
+      #clock-cells = <1>;
+      #reset-cells = <1>;
+      #power-domain-cells = <1>;
+      clocks = <&pxo_board>, <&cxo_board>;
+      clock-names = "pxo", "cxo";
+    };
+...
diff --git a/Documentation/devicetree/bindings/clock/qcom,gcc-msm8909.yaml b/Documentation/devicetree/bindings/clock/qcom,gcc-msm8909.yaml
new file mode 100644 (file)
index 0000000..2272ea5
--- /dev/null
@@ -0,0 +1,58 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/qcom,gcc-msm8909.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm Global Clock & Reset Controller Binding for MSM8909
+
+maintainers:
+  - Stephan Gerhold <stephan@gerhold.net>
+
+description: |
+  Qualcomm global clock control module which supports the clocks, resets and
+  power domains on MSM8909.
+
+  See also:
+  - dt-bindings/clock/qcom,gcc-msm8909.h
+
+properties:
+  compatible:
+    const: qcom,gcc-msm8909
+
+  clocks:
+    items:
+      - description: XO source
+      - description: Sleep clock source
+      - description: DSI phy instance 0 dsi clock
+      - description: DSI phy instance 0 byte clock
+
+  clock-names:
+    items:
+      - const: xo
+      - const: sleep_clk
+      - const: dsi0pll
+      - const: dsi0pllbyte
+
+required:
+  - compatible
+  - clocks
+  - clock-names
+
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
+
+examples:
+  - |
+    gcc: clock-controller@1800000 {
+      compatible = "qcom,gcc-msm8909";
+      reg = <0x01800000 0x80000>;
+      #clock-cells = <1>;
+      #reset-cells = <1>;
+      #power-domain-cells = <1>;
+      clocks = <&xo_board>, <&sleep_clk>, <&dsi0_phy 1>, <&dsi0_phy 0>;
+      clock-names = "xo", "sleep_clk", "dsi0pll", "dsi0pllbyte";
+    };
+...
diff --git a/Documentation/devicetree/bindings/clock/qcom,gcc-msm8916.yaml b/Documentation/devicetree/bindings/clock/qcom,gcc-msm8916.yaml
new file mode 100644 (file)
index 0000000..2ceb1e5
--- /dev/null
@@ -0,0 +1,66 @@
+# SPDX-License-Identifier: GPL-2.0-only
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/qcom,gcc-msm8916.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm Global Clock & Reset Controller Binding for MSM8916 and MSM8939
+
+maintainers:
+  - Stephen Boyd <sboyd@kernel.org>
+  - Taniya Das <quic_tdas@quicinc.com>
+
+description: |
+  Qualcomm global clock control module which supports the clocks, resets and
+  power domains on MSM8916 or MSM8939.
+
+  See also:
+  - dt-bindings/clock/qcom,gcc-msm8916.h
+  - dt-bindings/clock/qcom,gcc-msm8939.h
+  - dt-bindings/reset/qcom,gcc-msm8916.h
+  - dt-bindings/reset/qcom,gcc-msm8939.h
+
+properties:
+  compatible:
+    enum:
+      - qcom,gcc-msm8916
+      - qcom,gcc-msm8939
+
+  clocks:
+    items:
+      - description: XO source
+      - description: Sleep clock source
+      - description: DSI phy instance 0 dsi clock
+      - description: DSI phy instance 0 byte clock
+      - description: External MCLK clock
+      - description: External Primary I2S clock
+      - description: External Secondary I2S clock
+
+  clock-names:
+    items:
+      - const: xo
+      - const: sleep_clk
+      - const: dsi0pll
+      - const: dsi0pllbyte
+      - const: ext_mclk
+      - const: ext_pri_i2s
+      - const: ext_sec_i2s
+
+required:
+  - compatible
+
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
+
+examples:
+  - |
+    clock-controller@300000 {
+      compatible = "qcom,gcc-msm8916";
+      #clock-cells = <1>;
+      #reset-cells = <1>;
+      #power-domain-cells = <1>;
+      reg = <0x300000 0x90000>;
+    };
+...
index f3430b1..4b7d695 100644 (file)
@@ -45,29 +45,16 @@ properties:
     description:
       Phandle to voltage regulator providing power to the GX domain.
 
-  '#clock-cells':
-    const: 1
-
-  '#reset-cells':
-    const: 1
-
-  '#power-domain-cells':
-    const: 1
-
-  reg:
-    maxItems: 1
-
 required:
   - compatible
-  - reg
   - clocks
   - clock-names
   - vdd_gfx-supply
-  - '#clock-cells'
-  - '#reset-cells'
-  - '#power-domain-cells'
 
-additionalProperties: false
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
 
 examples:
   - |
index 22e67b2..7b9fef6 100644 (file)
@@ -32,28 +32,15 @@ properties:
       - const: xo
       - const: sleep
 
-  '#clock-cells':
-    const: 1
-
-  '#reset-cells':
-    const: 1
-
-  '#power-domain-cells':
-    const: 1
-
-  reg:
-    maxItems: 1
-
 required:
   - compatible
   - clocks
   - clock-names
-  - reg
-  - '#clock-cells'
-  - '#reset-cells'
-  - '#power-domain-cells'
 
-additionalProperties: false
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
 
 examples:
   - |
index 005e0ed..dfc5165 100644 (file)
@@ -49,30 +49,13 @@ properties:
       - const: ufs_rx_symbol_1_clk_src
       - const: ufs_tx_symbol_0_clk_src
 
-  '#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
-  - reg
-  - '#clock-cells'
-  - '#reset-cells'
-  - '#power-domain-cells'
 
-additionalProperties: false
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
 
 examples:
   - |
index 8151c0a..544a233 100644 (file)
@@ -37,32 +37,15 @@ properties:
       - const: core_bi_pll_test_se # Optional clock
     minItems: 2
 
-  '#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
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
 
 examples:
   - |
index 6c78df0..76988e0 100644 (file)
@@ -18,11 +18,7 @@ description: |
   - dt-bindings/clock/qcom,gcc-ipq4019.h
   - dt-bindings/clock/qcom,gcc-ipq6018.h
   - dt-bindings/reset/qcom,gcc-ipq6018.h
-  - 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
   - dt-bindings/clock/qcom,gcc-msm8974.h (qcom,gcc-msm8226 and qcom,gcc-msm8974)
   - dt-bindings/reset/qcom,gcc-msm8974.h (qcom,gcc-msm8226 and qcom,gcc-msm8974)
   - dt-bindings/clock/qcom,gcc-mdm9607.h
@@ -40,9 +36,6 @@ properties:
       - qcom,gcc-ipq6018
       - qcom,gcc-mdm9607
       - qcom,gcc-msm8226
-      - qcom,gcc-msm8660
-      - qcom,gcc-msm8916
-      - qcom,gcc-msm8939
       - qcom,gcc-msm8953
       - qcom,gcc-msm8974
       - qcom,gcc-msm8974pro
index 5de9c82..aec37e3 100644 (file)
@@ -30,32 +30,15 @@ properties:
       - 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
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
 
 examples:
   - |
index a404c8f..e4d490e 100644 (file)
@@ -33,32 +33,15 @@ properties:
       - 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
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
 
 examples:
   - |
index 5693b89..ea61367 100644 (file)
@@ -44,28 +44,15 @@ properties:
       - const: ufs_phy_tx_symbol_0_clk
       - const: usb3_phy_wrapper_gcc_usb30_pipe_clk
 
-  '#clock-cells':
-    const: 1
-
-  '#reset-cells':
-    const: 1
-
-  '#power-domain-cells':
-    const: 1
-
-  reg:
-    maxItems: 1
-
 required:
   - compatible
   - clocks
   - clock-names
-  - reg
-  - '#clock-cells'
-  - '#reset-cells'
-  - '#power-domain-cells'
 
-additionalProperties: false
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
 
 examples:
   - |
index f03ef96..30b5d12 100644 (file)
@@ -32,32 +32,15 @@ properties:
       - 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
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
 
 examples:
   - |
index 0bcdc69..b1bf768 100644 (file)
@@ -33,7 +33,7 @@ properties:
       - description: Primary USB SuperSpeed pipe clock
       - description: USB4 PHY pipegmux clock source
       - description: USB4 PHY DP gmux clock source
-      - description: USB4 PHY sys piegmux clock source
+      - description: USB4 PHY sys pipegmux clock source
       - description: USB4 PHY PCIe pipe clock
       - description: USB4 PHY router max pipe clock
       - description: Primary USB4 RX0 clock
@@ -46,7 +46,7 @@ properties:
       - description: Second USB4 PHY router max pipe clock
       - description: Secondary USB4 RX0 clock
       - description: Secondary USB4 RX1 clock
-      - description: Multiport USB first SupserSpeed pipe clock
+      - description: Multiport USB first SuperSpeed pipe clock
       - description: Multiport USB second SuperSpeed pipe clock
       - description: PCIe 2a pipe clock
       - description: PCIe 2b pipe clock
@@ -56,30 +56,17 @@ properties:
       - description: First EMAC controller reference clock
       - description: Second EMAC controller reference clock
 
-  '#clock-cells':
-    const: 1
-
-  '#reset-cells':
-    const: 1
-
-  '#power-domain-cells':
-    const: 1
-
-  reg:
-    maxItems: 1
-
   protected-clocks:
     maxItems: 389
 
 required:
   - compatible
   - clocks
-  - reg
-  - '#clock-cells'
-  - '#reset-cells'
-  - '#power-domain-cells'
 
-additionalProperties: false
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
 
 examples:
   - |
index daf7906..e169d46 100644 (file)
@@ -19,51 +19,67 @@ description: |
 
 properties:
   compatible:
-    const: qcom,gcc-sdm845
+    enum:
+      - qcom,gcc-sdm670
+      - qcom,gcc-sdm845
 
   clocks:
-    items:
-      - description: Board XO source
-      - description: Board active XO source
-      - description: Sleep clock source
-      - description: PCIE 0 Pipe clock source
-      - description: PCIE 1 Pipe clock source
+    minItems: 3
+    maxItems: 5
 
   clock-names:
-    items:
-      - const: bi_tcxo
-      - const: bi_tcxo_ao
-      - const: sleep_clk
-      - const: pcie_0_pipe_clk
-      - const: pcie_1_pipe_clk
-
-  '#clock-cells':
-    const: 1
-
-  '#reset-cells':
-    const: 1
+    minItems: 3
+    maxItems: 5
 
   power-domains:
     maxItems: 1
 
-  '#power-domain-cells':
-    const: 1
-
-  reg:
-    maxItems: 1
-
-  protected-clocks:
-    description:
-      Protected clock specifier list as per common clock binding.
-
 required:
   - compatible
-  - reg
-  - '#clock-cells'
-  - '#reset-cells'
-  - '#power-domain-cells'
 
-additionalProperties: false
+allOf:
+  - $ref: qcom,gcc.yaml#
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: qcom,gcc-sdm670
+    then:
+      properties:
+        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
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: qcom,gcc-sdm845
+    then:
+      properties:
+        clocks:
+          items:
+            - description: Board XO source
+            - description: Board active XO source
+            - description: Sleep clock source
+            - description: PCIE 0 Pipe clock source
+            - description: PCIE 1 Pipe clock source
+        clock-names:
+          items:
+            - const: bi_tcxo
+            - const: bi_tcxo_ao
+            - const: sleep_clk
+            - const: pcie_0_pipe_clk
+            - const: pcie_1_pipe_clk
+
+unevaluatedProperties: false
 
 examples:
   # Example for GCC for SDM845:
index b0d1c65..13ffa16 100644 (file)
@@ -35,28 +35,15 @@ properties:
       - const: core_bi_pll_test_se # Optional clock
     minItems: 2
 
-  '#clock-cells':
-    const: 1
-
-  '#reset-cells':
-    const: 1
-
-  '#power-domain-cells':
-    const: 1
-
-  reg:
-    maxItems: 1
-
 required:
   - compatible
   - clocks
   - clock-names
-  - reg
-  - '#clock-cells'
-  - '#reset-cells'
-  - '#power-domain-cells'
 
-additionalProperties: false
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
 
 examples:
   - |
index 16c4cdc..8a1419c 100644 (file)
@@ -20,9 +20,6 @@ properties:
   compatible:
     const: qcom,gcc-sdx65
 
-  reg:
-    maxItems: 1
-
   clocks:
     items:
       - description: Board XO source
@@ -43,25 +40,15 @@ properties:
       - const: core_bi_pll_test_se # Optional clock
     minItems: 5
 
-  '#clock-cells':
-    const: 1
-
-  '#reset-cells':
-    const: 1
-
-  '#power-domain-cells':
-    const: 1
-
 required:
   - compatible
-  - reg
   - clocks
   - clock-names
-  - '#clock-cells'
-  - '#reset-cells'
-  - '#power-domain-cells'
 
-additionalProperties: false
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
 
 examples:
   - |
index 26050da..bb81a27 100644 (file)
@@ -30,32 +30,15 @@ properties:
       - 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
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
 
 examples:
   - |
index ab12b39..03e84e1 100644 (file)
@@ -30,32 +30,15 @@ properties:
       - 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
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
 
 examples:
   - |
index 20926cd..cbe98c0 100644 (file)
@@ -32,32 +32,15 @@ properties:
       - 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
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
 
 examples:
   - |
index 12766a8..0333ccb 100644 (file)
@@ -31,32 +31,15 @@ properties:
       - 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
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
 
 examples:
   - |
index 80bd6ca..4e2a9ca 100644 (file)
@@ -31,32 +31,15 @@ properties:
       - 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
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
 
 examples:
   - |
index 1122700..3edbeca 100644 (file)
@@ -54,28 +54,15 @@ properties:
       - const: usb3_uni_phy_sec_gcc_usb30_pipe_clk # Optional clock
     minItems: 2
 
-  '#clock-cells':
-    const: 1
-
-  '#reset-cells':
-    const: 1
-
-  '#power-domain-cells':
-    const: 1
-
-  reg:
-    maxItems: 1
-
 required:
   - compatible
   - clocks
   - clock-names
-  - reg
-  - '#clock-cells'
-  - '#reset-cells'
-  - '#power-domain-cells'
 
-additionalProperties: false
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
 
 examples:
   - |
index 58d98a7..102ce68 100644 (file)
@@ -46,28 +46,15 @@ properties:
       - const: usb3_phy_wrapper_gcc_usb30_pipe_clk # Optional clock
     minItems: 2
 
-  '#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
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
 
 examples:
   - |
index 9ebcb19..a7d0af1 100644 (file)
@@ -17,6 +17,7 @@ description: |
     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-sc8280xp.h
     dt-bindings/clock/qcom,gpucc-sm6350.h
     dt-bindings/clock/qcom,gpucc-sm8150.h
     dt-bindings/clock/qcom,gpucc-sm8250.h
@@ -28,6 +29,7 @@ properties:
       - qcom,sc7180-gpucc
       - qcom,sc7280-gpucc
       - qcom,sc8180x-gpucc
+      - qcom,sc8280xp-gpucc
       - qcom,sm6350-gpucc
       - qcom,sm8150-gpucc
       - qcom,sm8250-gpucc
index 32e8701..03faab5 100644 (file)
@@ -31,30 +31,12 @@ properties:
       - qcom,mmcc-sdm660
 
   clocks:
-    items:
-      - description: Board XO source
-      - description: Board sleep source
-      - description: Global PLL 0 clock
-      - description: DSI phy instance 0 dsi clock
-      - description: DSI phy instance 0 byte clock
-      - description: DSI phy instance 1 dsi clock
-      - description: DSI phy instance 1 byte clock
-      - description: HDMI phy PLL clock
-      - description: DisplayPort phy PLL vco clock
-      - description: DisplayPort phy PLL link clock
+    minItems: 8
+    maxItems: 10
 
   clock-names:
-    items:
-      - const: xo
-      - const: sleep
-      - const: gpll0
-      - const: dsi0dsi
-      - const: dsi0byte
-      - const: dsi1dsi
-      - const: dsi1byte
-      - const: hdmipll
-      - const: dpvco
-      - const: dplink
+    minItems: 8
+    maxItems: 10
 
   '#clock-cells':
     const: 1
@@ -85,16 +67,179 @@ required:
 
 additionalProperties: false
 
-if:
-  properties:
-    compatible:
-      contains:
-        const: qcom,mmcc-msm8998
-
-then:
-  required:
-    - clocks
-    - clock-names
+allOf:
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - qcom,mmcc-apq8064
+              - qcom,mmcc-msm8960
+    then:
+      properties:
+        clocks:
+          items:
+            - description: Board PXO source
+            - description: PLL 3 clock
+            - description: PLL 3 Vote clock
+            - description: DSI phy instance 1 dsi clock
+            - description: DSI phy instance 1 byte clock
+            - description: DSI phy instance 2 dsi clock
+            - description: DSI phy instance 2 byte clock
+            - description: HDMI phy PLL clock
+
+        clock-names:
+          items:
+            - const: pxo
+            - const: pll3
+            - const: pll8_vote
+            - const: dsi1pll
+            - const: dsi1pllbyte
+            - const: dsi2pll
+            - const: dsi2pllbyte
+            - const: hdmipll
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - qcom,mmcc-msm8994
+              - qcom,mmcc-msm8998
+              - qcom,mmcc-sdm630
+              - qcom,mmcc-sdm660
+    then:
+      required:
+        - clocks
+        - clock-names
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: qcom,mmcc-msm8994
+    then:
+      properties:
+        clocks:
+          items:
+            - description: Board XO source
+            - description: Global PLL 0 clock
+            - description: MMSS NoC AHB clock
+            - description: GFX3D clock
+            - description: DSI phy instance 0 dsi clock
+            - description: DSI phy instance 0 byte clock
+            - description: DSI phy instance 1 dsi clock
+            - description: DSI phy instance 1 byte clock
+            - description: HDMI phy PLL clock
+
+        clock-names:
+          items:
+            - const: xo
+            - const: gpll0
+            - const: mmssnoc_ahb
+            - const: oxili_gfx3d_clk_src
+            - const: dsi0pll
+            - const: dsi0pllbyte
+            - const: dsi1pll
+            - const: dsi1pllbyte
+            - const: hdmipll
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: qcom,mmcc-msm8996
+    then:
+      properties:
+        clocks:
+          items:
+            - description: Board XO source
+            - description: Global PLL 0 clock
+            - description: MMSS NoC AHB clock
+            - description: DSI phy instance 0 dsi clock
+            - description: DSI phy instance 0 byte clock
+            - description: DSI phy instance 1 dsi clock
+            - description: DSI phy instance 1 byte clock
+            - description: HDMI phy PLL clock
+
+        clock-names:
+          items:
+            - const: xo
+            - const: gpll0
+            - const: gcc_mmss_noc_cfg_ahb_clk
+            - const: dsi0pll
+            - const: dsi0pllbyte
+            - const: dsi1pll
+            - const: dsi1pllbyte
+            - const: hdmipll
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: qcom,mmcc-msm8998
+    then:
+      properties:
+        clocks:
+          items:
+            - description: Board XO source
+            - description: Global PLL 0 clock
+            - description: DSI phy instance 0 dsi clock
+            - description: DSI phy instance 0 byte clock
+            - description: DSI phy instance 1 dsi clock
+            - description: DSI phy instance 1 byte clock
+            - description: HDMI phy PLL clock
+            - description: DisplayPort phy PLL link clock
+            - description: DisplayPort phy PLL vco clock
+            - description: Test clock
+
+        clock-names:
+          items:
+            - const: xo
+            - const: gpll0
+            - const: dsi0dsi
+            - const: dsi0byte
+            - const: dsi1dsi
+            - const: dsi1byte
+            - const: hdmipll
+            - const: dplink
+            - const: dpvco
+            - const: core_bi_pll_test_se
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - qcom,mmcc-sdm630
+              - qcom,mmcc-sdm660
+    then:
+      properties:
+        clocks:
+          items:
+            - description: Board XO source
+            - description: Board sleep source
+            - description: Global PLL 0 clock
+            - description: Global PLL 0 DIV clock
+            - description: DSI phy instance 0 dsi clock
+            - description: DSI phy instance 0 byte clock
+            - description: DSI phy instance 1 dsi clock
+            - description: DSI phy instance 1 byte clock
+            - description: DisplayPort phy PLL link clock
+            - description: DisplayPort phy PLL vco clock
+
+        clock-names:
+          items:
+            - const: xo
+            - const: sleep_clk
+            - const: gpll0
+            - const: gpll0_div
+            - const: dsi0pll
+            - const: dsi0pllbyte
+            - const: dsi1pll
+            - const: dsi1pllbyte
+            - const: dp_link_2x_clk_divsel_five
+            - const: dp_vco_divided_clk_src_mux
 
 examples:
   # Example for MMCC for MSM8960:
index a20cb10..c497123 100644 (file)
@@ -26,22 +26,18 @@ properties:
 
   clocks:
     items:
-      - description: Primary PLL clock for power cluster (little)
-      - description: Primary PLL clock for perf cluster (big)
-      - description: Alternate PLL clock for power cluster (little)
-      - description: Alternate PLL clock for perf cluster (big)
+      - description: XO source
 
   clock-names:
     items:
-      - const: pwrcl_pll
-      - const: perfcl_pll
-      - const: pwrcl_alt_pll
-      - const: perfcl_alt_pll
+      - const: xo
 
 required:
   - compatible
   - reg
   - '#clock-cells'
+  - clocks
+  - clock-names
 
 additionalProperties: false
 
@@ -51,4 +47,7 @@ examples:
         compatible = "qcom,msm8996-apcc";
         reg = <0x6400000 0x90000>;
         #clock-cells = <1>;
+
+        clocks = <&xo_board>;
+        clock-names = "xo";
     };
index d63b45a..2a95bf8 100644 (file)
@@ -29,6 +29,7 @@ properties:
           - qcom,rpmcc-mdm9607
           - qcom,rpmcc-msm8226
           - qcom,rpmcc-msm8660
+          - qcom,rpmcc-msm8909
           - qcom,rpmcc-msm8916
           - qcom,rpmcc-msm8936
           - qcom,rpmcc-msm8953
@@ -43,6 +44,7 @@ properties:
           - qcom,rpmcc-sdm660
           - qcom,rpmcc-sm6115
           - qcom,rpmcc-sm6125
+          - qcom,rpmcc-sm6375
       - const: qcom,rpmcc
 
   '#clock-cells':
index 8fcaf41..437a34b 100644 (file)
@@ -21,6 +21,7 @@ properties:
       - qcom,sc7280-rpmh-clk
       - qcom,sc8180x-rpmh-clk
       - qcom,sc8280xp-rpmh-clk
+      - qcom,sdm670-rpmh-clk
       - qcom,sdm845-rpmh-clk
       - qcom,sdx55-rpmh-clk
       - qcom,sdx65-rpmh-clk
index 47028d7..633887d 100644 (file)
@@ -36,13 +36,11 @@ properties:
     items:
       - description: LPASS qdsp6ss register
       - description: LPASS top-cc register
-      - description: LPASS cc register
 
   reg-names:
     items:
       - const: qdsp6ss
       - const: top_cc
-      - const: cc
 
 required:
   - compatible
@@ -59,8 +57,8 @@ examples:
     #include <dt-bindings/clock/qcom,lpass-sc7280.h>
     clock-controller@3000000 {
       compatible = "qcom,sc7280-lpasscc";
-      reg = <0x03000000 0x40>, <0x03c04000 0x4>, <0x03389000 0x24>;
-      reg-names = "qdsp6ss", "top_cc", "cc";
+      reg = <0x03000000 0x40>, <0x03c04000 0x4>;
+      reg-names = "qdsp6ss", "top_cc";
       clocks = <&gcc GCC_CFG_NOC_LPASS_CLK>;
       clock-names = "iface";
       #clock-cells = <1>;
index bad9135..f50e284 100644 (file)
@@ -22,6 +22,8 @@ properties:
 
   clock-names: true
 
+  reg: true
+
   compatible:
     enum:
       - qcom,sc7280-lpassaoncc
@@ -38,8 +40,14 @@ properties:
   '#power-domain-cells':
     const: 1
 
-  reg:
-    maxItems: 1
+  '#reset-cells':
+    const: 1
+
+  qcom,adsp-pil-mode:
+    description:
+      Indicates if the LPASS would be brought out of reset using
+      peripheral loader.
+    type: boolean
 
 required:
   - compatible
@@ -69,6 +77,11 @@ allOf:
           items:
             - const: bi_tcxo
             - const: lpass_aon_cc_main_rcg_clk_src
+
+        reg:
+          items:
+            - description: lpass core cc register
+            - description: lpass audio csr register
   - if:
       properties:
         compatible:
@@ -90,6 +103,8 @@ allOf:
             - const: bi_tcxo_ao
             - const: iface
 
+        reg:
+          maxItems: 1
   - if:
       properties:
         compatible:
@@ -108,6 +123,8 @@ allOf:
           items:
             - const: bi_tcxo
 
+        reg:
+          maxItems: 1
 examples:
   - |
     #include <dt-bindings/clock/qcom,rpmh.h>
@@ -116,13 +133,15 @@ examples:
     #include <dt-bindings/clock/qcom,lpasscorecc-sc7280.h>
     lpass_audiocc: clock-controller@3300000 {
       compatible = "qcom,sc7280-lpassaudiocc";
-      reg = <0x3300000 0x30000>;
+      reg = <0x3300000 0x30000>,
+            <0x32a9000 0x1000>;
       clocks = <&rpmhcc RPMH_CXO_CLK>,
                <&lpass_aon LPASS_AON_CC_MAIN_RCG_CLK_SRC>;
       clock-names = "bi_tcxo", "lpass_aon_cc_main_rcg_clk_src";
       power-domains = <&lpass_aon LPASS_AON_CC_LPASS_AUDIO_HM_GDSC>;
       #clock-cells = <1>;
       #power-domain-cells = <1>;
+      #reset-cells = <1>;
     };
 
   - |
@@ -165,6 +184,7 @@ examples:
       clocks = <&rpmhcc RPMH_CXO_CLK>, <&rpmhcc RPMH_CXO_CLK_A>,
                <&lpasscore LPASS_CORE_CC_CORE_CLK>;
       clock-names = "bi_tcxo", "bi_tcxo_ao","iface";
+      qcom,adsp-pil-mode;
       #clock-cells = <1>;
       #power-domain-cells = <1>;
     };
diff --git a/Documentation/devicetree/bindings/clock/qcom,sm6115-dispcc.yaml b/Documentation/devicetree/bindings/clock/qcom,sm6115-dispcc.yaml
new file mode 100644 (file)
index 0000000..6660ff1
--- /dev/null
@@ -0,0 +1,70 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/qcom,sm6115-dispcc.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm Display Clock Controller for SM6115
+
+maintainers:
+  - Bjorn Andersson <andersson@kernel.org>
+
+description: |
+  Qualcomm display clock control module which supports the clocks and
+  power domains on SM6115.
+
+  See also:
+    include/dt-bindings/clock/qcom,sm6115-dispcc.h
+
+properties:
+  compatible:
+    enum:
+      - qcom,sm6115-dispcc
+
+  clocks:
+    items:
+      - description: Board XO source
+      - description: Board sleep clock
+      - description: Byte clock from DSI PHY0
+      - description: Pixel clock from DSI PHY0
+      - description: GPLL0 DISP DIV clock from GCC
+
+  '#clock-cells':
+    const: 1
+
+  '#reset-cells':
+    const: 1
+
+  '#power-domain-cells':
+    const: 1
+
+  reg:
+    maxItems: 1
+
+required:
+  - compatible
+  - reg
+  - clocks
+  - '#clock-cells'
+  - '#reset-cells'
+  - '#power-domain-cells'
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/qcom,rpmcc.h>
+    #include <dt-bindings/clock/qcom,gcc-sm6115.h>
+    clock-controller@5f00000 {
+      compatible = "qcom,sm6115-dispcc";
+      reg = <0x5f00000 0x20000>;
+      clocks = <&rpmcc RPM_SMD_XO_CLK_SRC>,
+               <&sleep_clk>,
+               <&dsi0_phy 0>,
+               <&dsi0_phy 1>,
+               <&gcc GCC_DISP_GPLL0_DIV_CLK_SRC>;
+      #clock-cells = <1>;
+      #reset-cells = <1>;
+      #power-domain-cells = <1>;
+    };
+...
diff --git a/Documentation/devicetree/bindings/clock/qcom,sm6375-gcc.yaml b/Documentation/devicetree/bindings/clock/qcom,sm6375-gcc.yaml
new file mode 100644 (file)
index 0000000..3c573e1
--- /dev/null
@@ -0,0 +1,52 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/qcom,sm6375-gcc.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm Global Clock & Reset Controller Binding for SM6375
+
+maintainers:
+  - Konrad Dybcio <konrad.dybcio@somainline.org>
+
+description: |
+  Qualcomm global clock control module which supports the clocks, resets and
+  power domains on SM6375
+
+  See also:
+  - dt-bindings/clock/qcom,sm6375-gcc.h
+
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+properties:
+  compatible:
+    const: qcom,sm6375-gcc
+
+  clocks:
+    items:
+      - description: Board XO source
+      - description: Board XO Active-Only source
+      - description: Sleep clock source
+
+required:
+  - compatible
+  - clocks
+
+unevaluatedProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/qcom,rpmcc.h>
+    clock-controller@1400000 {
+      compatible = "qcom,sm6375-gcc";
+      reg = <0x01400000 0x1f0000>;
+      clocks = <&rpmcc RPM_SMD_XO_CLK_SRC>,
+               <&rpmcc RPM_SMD_XO_A_CLK_SRC>,
+               <&sleep_clk>;
+      #clock-cells = <1>;
+      #reset-cells = <1>;
+      #power-domain-cells = <1>;
+    };
+
+...
diff --git a/Documentation/devicetree/bindings/clock/qcom,sm8450-dispcc.yaml b/Documentation/devicetree/bindings/clock/qcom,sm8450-dispcc.yaml
new file mode 100644 (file)
index 0000000..1cc2457
--- /dev/null
@@ -0,0 +1,98 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/qcom,sm8450-dispcc.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm Display Clock & Reset Controller for SM8450
+
+maintainers:
+  - Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+
+description: |
+  Qualcomm display clock control module which supports the clocks, resets and
+  power domains on SM8450.
+
+  See also:
+    include/dt-bindings/clock/qcom,sm8450-dispcc.h
+
+properties:
+  compatible:
+    enum:
+      - qcom,sm8450-dispcc
+
+  clocks:
+    minItems: 3
+    items:
+      - description: Board XO source
+      - description: Board Always On XO source
+      - description: Display's AHB clock
+      - description: sleep clock
+      - description: Byte clock from DSI PHY0
+      - description: Pixel clock from DSI PHY0
+      - description: Byte clock from DSI PHY1
+      - description: Pixel clock from DSI PHY1
+      - description: Link clock from DP PHY0
+      - description: VCO DIV clock from DP PHY0
+      - description: Link clock from DP PHY1
+      - description: VCO DIV clock from DP PHY1
+      - description: Link clock from DP PHY2
+      - description: VCO DIV clock from DP PHY2
+      - description: Link clock from DP PHY3
+      - description: VCO DIV clock from DP PHY3
+
+  '#clock-cells':
+    const: 1
+
+  '#reset-cells':
+    const: 1
+
+  '#power-domain-cells':
+    const: 1
+
+  reg:
+    maxItems: 1
+
+  power-domains:
+    description:
+      A phandle and PM domain specifier for the MMCX power domain.
+    maxItems: 1
+
+  required-opps:
+    description:
+      A phandle to an OPP node describing required MMCX performance point.
+    maxItems: 1
+
+required:
+  - compatible
+  - reg
+  - clocks
+  - '#clock-cells'
+  - '#reset-cells'
+  - '#power-domain-cells'
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/qcom,gcc-sm8450.h>
+    #include <dt-bindings/clock/qcom,rpmh.h>
+    #include <dt-bindings/power/qcom-rpmpd.h>
+    clock-controller@af00000 {
+      compatible = "qcom,sm8450-dispcc";
+      reg = <0x0af00000 0x10000>;
+      clocks = <&rpmhcc RPMH_CXO_CLK>,
+               <&rpmhcc RPMH_CXO_CLK_A>,
+               <&gcc GCC_DISP_AHB_CLK>,
+               <&sleep_clk>,
+               <&dsi0_phy 0>,
+               <&dsi0_phy 1>,
+               <&dsi1_phy 0>,
+               <&dsi1_phy 1>;
+      #clock-cells = <1>;
+      #reset-cells = <1>;
+      #power-domain-cells = <1>;
+      power-domains = <&rpmhpd SM8450_MMCX>;
+      required-opps = <&rpmhpd_opp_low_svs>;
+    };
+...
index aa11815..141cf17 100644 (file)
@@ -33,10 +33,13 @@ properties:
     enum:
       - samsung,exynos850-cmu-top
       - samsung,exynos850-cmu-apm
+      - samsung,exynos850-cmu-aud
       - samsung,exynos850-cmu-cmgp
       - samsung,exynos850-cmu-core
       - samsung,exynos850-cmu-dpu
       - samsung,exynos850-cmu-hsi
+      - samsung,exynos850-cmu-is
+      - samsung,exynos850-cmu-mfcmscl
       - samsung,exynos850-cmu-peri
 
   clocks:
@@ -92,6 +95,24 @@ allOf:
       properties:
         compatible:
           contains:
+            const: samsung,exynos850-cmu-aud
+
+    then:
+      properties:
+        clocks:
+          items:
+            - description: External reference clock (26 MHz)
+            - description: AUD clock (from CMU_TOP)
+
+        clock-names:
+          items:
+            - const: oscclk
+            - const: dout_aud
+
+  - if:
+      properties:
+        compatible:
+          contains:
             const: samsung,exynos850-cmu-cmgp
 
     then:
@@ -176,6 +197,54 @@ allOf:
       properties:
         compatible:
           contains:
+            const: samsung,exynos850-cmu-is
+
+    then:
+      properties:
+        clocks:
+          items:
+            - description: External reference clock (26 MHz)
+            - description: CMU_IS bus clock (from CMU_TOP)
+            - description: Image Texture Processing core clock (from CMU_TOP)
+            - description: Visual Recognition Accelerator clock (from CMU_TOP)
+            - description: Geometric Distortion Correction clock (from CMU_TOP)
+
+        clock-names:
+          items:
+            - const: oscclk
+            - const: dout_is_bus
+            - const: dout_is_itp
+            - const: dout_is_vra
+            - const: dout_is_gdc
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: samsung,exynos850-cmu-mfcmscl
+
+    then:
+      properties:
+        clocks:
+          items:
+            - description: External reference clock (26 MHz)
+            - description: Multi-Format Codec clock (from CMU_TOP)
+            - description: Memory to Memory Scaler clock (from CMU_TOP)
+            - description: Multi-Channel Scaler clock (from CMU_TOP)
+            - description: JPEG codec clock (from CMU_TOP)
+
+        clock-names:
+          items:
+            - const: oscclk
+            - const: dout_mfcmscl_mfc
+            - const: dout_mfcmscl_m2m
+            - const: dout_mfcmscl_mcsc
+            - const: dout_mfcmscl_jpeg
+
+  - if:
+      properties:
+        compatible:
+          contains:
             const: samsung,exynos850-cmu-peri
 
     then:
index eafc715..2ab4642 100644 (file)
@@ -35,6 +35,8 @@ properties:
       - samsung,exynosautov9-cmu-top
       - samsung,exynosautov9-cmu-busmc
       - samsung,exynosautov9-cmu-core
+      - samsung,exynosautov9-cmu-fsys0
+      - samsung,exynosautov9-cmu-fsys1
       - samsung,exynosautov9-cmu-fsys2
       - samsung,exynosautov9-cmu-peric0
       - samsung,exynosautov9-cmu-peric1
@@ -111,6 +113,48 @@ allOf:
       properties:
         compatible:
           contains:
+            const: samsung,exynosautov9-cmu-fsys0
+
+    then:
+      properties:
+        clocks:
+          items:
+            - description: External reference clock (26 MHz)
+            - description: CMU_FSYS0 bus clock (from CMU_TOP)
+            - description: CMU_FSYS0 pcie clock (from CMU_TOP)
+
+        clock-names:
+          items:
+            - const: oscclk
+            - const: dout_clkcmu_fsys0_bus
+            - const: dout_clkcmu_fsys0_pcie
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: samsung,exynosautov9-cmu-fsys1
+
+    then:
+      properties:
+        clocks:
+          items:
+            - description: External reference clock (26 MHz)
+            - description: CMU_FSYS1 bus clock (from CMU_TOP)
+            - description: CMU_FSYS1 mmc card clock (from CMU_TOP)
+            - description: CMU_FSYS1 usb clock (from CMU_TOP)
+
+        clock-names:
+          items:
+            - const: oscclk
+            - const: dout_clkcmu_fsys1_bus
+            - const: dout_clkcmu_fsys1_mmc_card
+            - const: dout_clkcmu_fsys1_usbdrd
+
+  - if:
+      properties:
+        compatible:
+          contains:
             const: samsung,exynosautov9-cmu-fsys2
 
     then:
index c8cd867..1909dd5 100644 (file)
@@ -18023,12 +18023,14 @@ Q:    https://patchwork.linuxtv.org/project/linux-media/list/
 F:     drivers/media/platform/samsung/exynos4-is/
 
 SAMSUNG SOC CLOCK DRIVERS
+M:     Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
 M:     Sylwester Nawrocki <s.nawrocki@samsung.com>
 M:     Tomasz Figa <tomasz.figa@gmail.com>
 M:     Chanwoo Choi <cw00.choi@samsung.com>
 R:     Alim Akhtar <alim.akhtar@samsung.com>
 L:     linux-samsung-soc@vger.kernel.org
 S:     Supported
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux.git
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/snawrocki/clk.git
 F:     Documentation/devicetree/bindings/clock/samsung,*.yaml
 F:     Documentation/devicetree/bindings/clock/samsung,s3c*
index 24dab23..9c3305b 100644 (file)
@@ -622,7 +622,7 @@ static int aspeed_g6_clk_probe(struct platform_device *pdev)
        regmap_write(map, 0x308, 0x12000); /* 3x3 = 9 */
 
        /* P-Bus (BCLK) clock divider */
-       hw = clk_hw_register_divider_table(dev, "bclk", "hpll", 0,
+       hw = clk_hw_register_divider_table(dev, "bclk", "epll", 0,
                        scu_g6_base + ASPEED_G6_CLK_SELECTION1, 20, 3, 0,
                        ast2600_div_table,
                        &aspeed_g6_clk_lock);
index 11178b7..be6f55d 100644 (file)
@@ -8,14 +8,10 @@ obj-$(CONFIG_ARCH_DAVINCI_DA830)      += pll-da830.o
 obj-$(CONFIG_ARCH_DAVINCI_DA850)       += pll-da850.o
 obj-$(CONFIG_ARCH_DAVINCI_DM355)       += pll-dm355.o
 obj-$(CONFIG_ARCH_DAVINCI_DM365)       += pll-dm365.o
-obj-$(CONFIG_ARCH_DAVINCI_DM644x)      += pll-dm644x.o
-obj-$(CONFIG_ARCH_DAVINCI_DM646x)      += pll-dm646x.o
 
 obj-y += psc.o
 obj-$(CONFIG_ARCH_DAVINCI_DA830)       += psc-da830.o
 obj-$(CONFIG_ARCH_DAVINCI_DA850)       += psc-da850.o
 obj-$(CONFIG_ARCH_DAVINCI_DM355)       += psc-dm355.o
 obj-$(CONFIG_ARCH_DAVINCI_DM365)       += psc-dm365.o
-obj-$(CONFIG_ARCH_DAVINCI_DM644x)      += psc-dm644x.o
-obj-$(CONFIG_ARCH_DAVINCI_DM646x)      += psc-dm646x.o
 endif
diff --git a/drivers/clk/davinci/pll-dm644x.c b/drivers/clk/davinci/pll-dm644x.c
deleted file mode 100644 (file)
index 7650fad..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * PLL clock descriptions for TI DM644X
- *
- * Copyright (C) 2018 David Lechner <david@lechnology.com>
- */
-
-#include <linux/bitops.h>
-#include <linux/clk/davinci.h>
-#include <linux/clkdev.h>
-#include <linux/init.h>
-#include <linux/types.h>
-
-#include "pll.h"
-
-static const struct davinci_pll_clk_info dm644x_pll1_info = {
-       .name = "pll1",
-       .pllm_mask = GENMASK(4, 0),
-       .pllm_min = 1,
-       .pllm_max = 32,
-       .pllout_min_rate = 400000000,
-       .pllout_max_rate = 600000000, /* 810MHz @ 1.3V, -810 only */
-       .flags = PLL_HAS_CLKMODE | PLL_HAS_POSTDIV,
-};
-
-SYSCLK(1, pll1_sysclk1, pll1_pllen, 4, SYSCLK_FIXED_DIV);
-SYSCLK(2, pll1_sysclk2, pll1_pllen, 4, SYSCLK_FIXED_DIV);
-SYSCLK(3, pll1_sysclk3, pll1_pllen, 4, SYSCLK_FIXED_DIV);
-SYSCLK(5, pll1_sysclk5, pll1_pllen, 4, SYSCLK_FIXED_DIV);
-
-int dm644x_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip)
-{
-       struct clk *clk;
-
-       davinci_pll_clk_register(dev, &dm644x_pll1_info, "ref_clk", base, cfgchip);
-
-       clk = davinci_pll_sysclk_register(dev, &pll1_sysclk1, base);
-       clk_register_clkdev(clk, "pll1_sysclk1", "dm644x-psc");
-
-       clk = davinci_pll_sysclk_register(dev, &pll1_sysclk2, base);
-       clk_register_clkdev(clk, "pll1_sysclk2", "dm644x-psc");
-
-       clk = davinci_pll_sysclk_register(dev, &pll1_sysclk3, base);
-       clk_register_clkdev(clk, "pll1_sysclk3", "dm644x-psc");
-
-       clk = davinci_pll_sysclk_register(dev, &pll1_sysclk5, base);
-       clk_register_clkdev(clk, "pll1_sysclk5", "dm644x-psc");
-
-       clk = davinci_pll_auxclk_register(dev, "pll1_auxclk", base);
-       clk_register_clkdev(clk, "pll1_auxclk", "dm644x-psc");
-
-       davinci_pll_sysclkbp_clk_register(dev, "pll1_sysclkbp", base);
-
-       return 0;
-}
-
-static const struct davinci_pll_clk_info dm644x_pll2_info = {
-       .name = "pll2",
-       .pllm_mask = GENMASK(4, 0),
-       .pllm_min = 1,
-       .pllm_max = 32,
-       .pllout_min_rate = 400000000,
-       .pllout_max_rate = 900000000,
-       .flags = PLL_HAS_POSTDIV | PLL_POSTDIV_FIXED_DIV,
-};
-
-SYSCLK(1, pll2_sysclk1, pll2_pllen, 4, 0);
-SYSCLK(2, pll2_sysclk2, pll2_pllen, 4, 0);
-
-int dm644x_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip)
-{
-       davinci_pll_clk_register(dev, &dm644x_pll2_info, "oscin", base, cfgchip);
-
-       davinci_pll_sysclk_register(dev, &pll2_sysclk1, base);
-
-       davinci_pll_sysclk_register(dev, &pll2_sysclk2, base);
-
-       davinci_pll_sysclkbp_clk_register(dev, "pll2_sysclkbp", base);
-
-       return 0;
-}
diff --git a/drivers/clk/davinci/pll-dm646x.c b/drivers/clk/davinci/pll-dm646x.c
deleted file mode 100644 (file)
index 2698297..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * PLL clock descriptions for TI DM646X
- *
- * Copyright (C) 2018 David Lechner <david@lechnology.com>
- */
-
-#include <linux/clk-provider.h>
-#include <linux/clk/davinci.h>
-#include <linux/clkdev.h>
-#include <linux/init.h>
-#include <linux/types.h>
-
-#include "pll.h"
-
-static const struct davinci_pll_clk_info dm646x_pll1_info = {
-       .name = "pll1",
-       .pllm_mask = GENMASK(4, 0),
-       .pllm_min = 14,
-       .pllm_max = 32,
-       .flags = PLL_HAS_CLKMODE,
-};
-
-SYSCLK(1, pll1_sysclk1, pll1_pllen, 4, SYSCLK_FIXED_DIV);
-SYSCLK(2, pll1_sysclk2, pll1_pllen, 4, SYSCLK_FIXED_DIV);
-SYSCLK(3, pll1_sysclk3, pll1_pllen, 4, SYSCLK_FIXED_DIV);
-SYSCLK(4, pll1_sysclk4, pll1_pllen, 4, 0);
-SYSCLK(5, pll1_sysclk5, pll1_pllen, 4, 0);
-SYSCLK(6, pll1_sysclk6, pll1_pllen, 4, 0);
-SYSCLK(8, pll1_sysclk8, pll1_pllen, 4, 0);
-SYSCLK(9, pll1_sysclk9, pll1_pllen, 4, 0);
-
-int dm646x_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip)
-{
-       struct clk *clk;
-
-       davinci_pll_clk_register(dev, &dm646x_pll1_info, "ref_clk", base, cfgchip);
-
-       clk = davinci_pll_sysclk_register(dev, &pll1_sysclk1, base);
-       clk_register_clkdev(clk, "pll1_sysclk1", "dm646x-psc");
-
-       clk = davinci_pll_sysclk_register(dev, &pll1_sysclk2, base);
-       clk_register_clkdev(clk, "pll1_sysclk2", "dm646x-psc");
-
-       clk = davinci_pll_sysclk_register(dev, &pll1_sysclk3, base);
-       clk_register_clkdev(clk, "pll1_sysclk3", "dm646x-psc");
-       clk_register_clkdev(clk, NULL, "davinci-wdt");
-
-       clk = davinci_pll_sysclk_register(dev, &pll1_sysclk4, base);
-       clk_register_clkdev(clk, "pll1_sysclk4", "dm646x-psc");
-
-       clk = davinci_pll_sysclk_register(dev, &pll1_sysclk5, base);
-       clk_register_clkdev(clk, "pll1_sysclk5", "dm646x-psc");
-
-       davinci_pll_sysclk_register(dev, &pll1_sysclk6, base);
-
-       davinci_pll_sysclk_register(dev, &pll1_sysclk8, base);
-
-       davinci_pll_sysclk_register(dev, &pll1_sysclk9, base);
-
-       davinci_pll_sysclkbp_clk_register(dev, "pll1_sysclkbp", base);
-
-       davinci_pll_auxclk_register(dev, "pll1_auxclk", base);
-
-       return 0;
-}
-
-static const struct davinci_pll_clk_info dm646x_pll2_info = {
-       .name = "pll2",
-       .pllm_mask = GENMASK(4, 0),
-       .pllm_min = 14,
-       .pllm_max = 32,
-       .flags = 0,
-};
-
-SYSCLK(1, pll2_sysclk1, pll2_pllen, 4, SYSCLK_ALWAYS_ENABLED);
-
-int dm646x_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip)
-{
-       davinci_pll_clk_register(dev, &dm646x_pll2_info, "oscin", base, cfgchip);
-
-       davinci_pll_sysclk_register(dev, &pll2_sysclk1, base);
-
-       return 0;
-}
index 0d75043..0822066 100644 (file)
@@ -890,14 +890,6 @@ static const struct platform_device_id davinci_pll_id_table[] = {
        { .name = "dm365-pll1",  .driver_data = (kernel_ulong_t)dm365_pll1_init  },
        { .name = "dm365-pll2",  .driver_data = (kernel_ulong_t)dm365_pll2_init  },
 #endif
-#ifdef CONFIG_ARCH_DAVINCI_DM644x
-       { .name = "dm644x-pll1", .driver_data = (kernel_ulong_t)dm644x_pll1_init },
-       { .name = "dm644x-pll2", .driver_data = (kernel_ulong_t)dm644x_pll2_init },
-#endif
-#ifdef CONFIG_ARCH_DAVINCI_DM646x
-       { .name = "dm646x-pll1", .driver_data = (kernel_ulong_t)dm646x_pll1_init },
-       { .name = "dm646x-pll2", .driver_data = (kernel_ulong_t)dm646x_pll2_init },
-#endif
        { }
 };
 
index c2a453c..1773277 100644 (file)
@@ -130,11 +130,5 @@ int of_da850_pll1_init(struct device *dev, void __iomem *base, struct regmap *cf
 #ifdef CONFIG_ARCH_DAVINCI_DM355
 int dm355_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip);
 #endif
-#ifdef CONFIG_ARCH_DAVINCI_DM644x
-int dm644x_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip);
-#endif
-#ifdef CONFIG_ARCH_DAVINCI_DM646x
-int dm646x_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip);
-#endif
 
 #endif /* __CLK_DAVINCI_PLL_H___ */
diff --git a/drivers/clk/davinci/psc-dm644x.c b/drivers/clk/davinci/psc-dm644x.c
deleted file mode 100644 (file)
index 0cea6e0..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * PSC clock descriptions for TI DaVinci DM644x
- *
- * Copyright (C) 2018 David Lechner <david@lechnology.com>
- */
-
-#include <linux/clk-provider.h>
-#include <linux/clk/davinci.h>
-#include <linux/clk.h>
-#include <linux/clkdev.h>
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/types.h>
-
-#include "psc.h"
-
-LPSC_CLKDEV1(vpss_master_clkdev,       "master",       "vpss");
-LPSC_CLKDEV1(vpss_slave_clkdev,                "slave",        "vpss");
-LPSC_CLKDEV2(emac_clkdev,              NULL,           "davinci_emac.1",
-                                       "fck",          "davinci_mdio.0");
-LPSC_CLKDEV1(usb_clkdev,               "usb",          NULL);
-LPSC_CLKDEV1(ide_clkdev,               NULL,           "palm_bk3710");
-LPSC_CLKDEV2(aemif_clkdev,             "aemif",        NULL,
-                                       NULL,           "ti-aemif");
-LPSC_CLKDEV1(mmcsd_clkdev,             NULL,           "dm6441-mmc.0");
-LPSC_CLKDEV1(asp0_clkdev,              NULL,           "davinci-mcbsp");
-LPSC_CLKDEV1(i2c_clkdev,               NULL,           "i2c_davinci.1");
-LPSC_CLKDEV1(uart0_clkdev,             NULL,           "serial8250.0");
-LPSC_CLKDEV1(uart1_clkdev,             NULL,           "serial8250.1");
-LPSC_CLKDEV1(uart2_clkdev,             NULL,           "serial8250.2");
-/* REVISIT: gpio-davinci.c should be modified to drop con_id */
-LPSC_CLKDEV1(gpio_clkdev,              "gpio",         NULL);
-LPSC_CLKDEV1(timer0_clkdev,            "timer0",       NULL);
-LPSC_CLKDEV1(timer2_clkdev,            NULL,           "davinci-wdt");
-
-static const struct davinci_lpsc_clk_info dm644x_psc_info[] = {
-       LPSC(0,  0, vpss_master, pll1_sysclk3, vpss_master_clkdev, 0),
-       LPSC(1,  0, vpss_slave,  pll1_sysclk3, vpss_slave_clkdev,  0),
-       LPSC(6,  0, emac,        pll1_sysclk5, emac_clkdev,        0),
-       LPSC(9,  0, usb,         pll1_sysclk5, usb_clkdev,         0),
-       LPSC(10, 0, ide,         pll1_sysclk5, ide_clkdev,         0),
-       LPSC(11, 0, vlynq,       pll1_sysclk5, NULL,               0),
-       LPSC(14, 0, aemif,       pll1_sysclk5, aemif_clkdev,       0),
-       LPSC(15, 0, mmcsd,       pll1_sysclk5, mmcsd_clkdev,       0),
-       LPSC(17, 0, asp0,        pll1_sysclk5, asp0_clkdev,        0),
-       LPSC(18, 0, i2c,         pll1_auxclk,  i2c_clkdev,         0),
-       LPSC(19, 0, uart0,       pll1_auxclk,  uart0_clkdev,       0),
-       LPSC(20, 0, uart1,       pll1_auxclk,  uart1_clkdev,       0),
-       LPSC(21, 0, uart2,       pll1_auxclk,  uart2_clkdev,       0),
-       LPSC(22, 0, spi,         pll1_sysclk5, NULL,               0),
-       LPSC(23, 0, pwm0,        pll1_auxclk,  NULL,               0),
-       LPSC(24, 0, pwm1,        pll1_auxclk,  NULL,               0),
-       LPSC(25, 0, pwm2,        pll1_auxclk,  NULL,               0),
-       LPSC(26, 0, gpio,        pll1_sysclk5, gpio_clkdev,        0),
-       LPSC(27, 0, timer0,      pll1_auxclk,  timer0_clkdev,      LPSC_ALWAYS_ENABLED),
-       LPSC(28, 0, timer1,      pll1_auxclk,  NULL,               0),
-       /* REVISIT: why can't this be disabled? */
-       LPSC(29, 0, timer2,      pll1_auxclk,  timer2_clkdev,      LPSC_ALWAYS_ENABLED),
-       LPSC(31, 0, arm,         pll1_sysclk2, NULL,               LPSC_ALWAYS_ENABLED),
-       /* REVISIT how to disable? */
-       LPSC(39, 1, dsp,         pll1_sysclk1, NULL,               LPSC_ALWAYS_ENABLED),
-       /* REVISIT how to disable? */
-       LPSC(40, 1, vicp,        pll1_sysclk2, NULL,               LPSC_ALWAYS_ENABLED),
-       { }
-};
-
-int dm644x_psc_init(struct device *dev, void __iomem *base)
-{
-       return davinci_psc_register_clocks(dev, dm644x_psc_info, 41, base);
-}
-
-static struct clk_bulk_data dm644x_psc_parent_clks[] = {
-       { .id = "pll1_sysclk1" },
-       { .id = "pll1_sysclk2" },
-       { .id = "pll1_sysclk3" },
-       { .id = "pll1_sysclk5" },
-       { .id = "pll1_auxclk"  },
-};
-
-const struct davinci_psc_init_data dm644x_psc_init_data = {
-       .parent_clks            = dm644x_psc_parent_clks,
-       .num_parent_clks        = ARRAY_SIZE(dm644x_psc_parent_clks),
-       .psc_init               = &dm644x_psc_init,
-};
diff --git a/drivers/clk/davinci/psc-dm646x.c b/drivers/clk/davinci/psc-dm646x.c
deleted file mode 100644 (file)
index 20012dc..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * PSC clock descriptions for TI DaVinci DM646x
- *
- * Copyright (C) 2018 David Lechner <david@lechnology.com>
- */
-
-#include <linux/clk-provider.h>
-#include <linux/clk/davinci.h>
-#include <linux/clk.h>
-#include <linux/clkdev.h>
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/types.h>
-
-#include "psc.h"
-
-LPSC_CLKDEV1(ide_clkdev,       NULL,           "palm_bk3710");
-LPSC_CLKDEV2(emac_clkdev,      NULL,           "davinci_emac.1",
-                               "fck",          "davinci_mdio.0");
-LPSC_CLKDEV2(aemif_clkdev,     "aemif",        NULL,
-                               NULL,           "ti-aemif");
-LPSC_CLKDEV1(mcasp0_clkdev,    NULL,           "davinci-mcasp.0");
-LPSC_CLKDEV1(mcasp1_clkdev,    NULL,           "davinci-mcasp.1");
-LPSC_CLKDEV1(uart0_clkdev,     NULL,           "serial8250.0");
-LPSC_CLKDEV1(uart1_clkdev,     NULL,           "serial8250.1");
-LPSC_CLKDEV1(uart2_clkdev,     NULL,           "serial8250.2");
-LPSC_CLKDEV1(i2c_clkdev,       NULL,           "i2c_davinci.1");
-/* REVISIT: gpio-davinci.c should be modified to drop con_id */
-LPSC_CLKDEV1(gpio_clkdev,      "gpio",         NULL);
-LPSC_CLKDEV1(timer0_clkdev,    "timer0",        NULL);
-
-static const struct davinci_lpsc_clk_info dm646x_psc_info[] = {
-       LPSC(0,  0, arm,      pll1_sysclk2, NULL,          LPSC_ALWAYS_ENABLED),
-       /* REVISIT how to disable? */
-       LPSC(1,  0, dsp,      pll1_sysclk1, NULL,          LPSC_ALWAYS_ENABLED),
-       LPSC(4,  0, edma_cc,  pll1_sysclk2, NULL,          LPSC_ALWAYS_ENABLED),
-       LPSC(5,  0, edma_tc0, pll1_sysclk2, NULL,          LPSC_ALWAYS_ENABLED),
-       LPSC(6,  0, edma_tc1, pll1_sysclk2, NULL,          LPSC_ALWAYS_ENABLED),
-       LPSC(7,  0, edma_tc2, pll1_sysclk2, NULL,          LPSC_ALWAYS_ENABLED),
-       LPSC(8,  0, edma_tc3, pll1_sysclk2, NULL,          LPSC_ALWAYS_ENABLED),
-       LPSC(10, 0, ide,      pll1_sysclk4, ide_clkdev,    0),
-       LPSC(14, 0, emac,     pll1_sysclk3, emac_clkdev,   0),
-       LPSC(16, 0, vpif0,    ref_clk,      NULL,          LPSC_ALWAYS_ENABLED),
-       LPSC(17, 0, vpif1,    ref_clk,      NULL,          LPSC_ALWAYS_ENABLED),
-       LPSC(21, 0, aemif,    pll1_sysclk3, aemif_clkdev,  LPSC_ALWAYS_ENABLED),
-       LPSC(22, 0, mcasp0,   pll1_sysclk3, mcasp0_clkdev, 0),
-       LPSC(23, 0, mcasp1,   pll1_sysclk3, mcasp1_clkdev, 0),
-       LPSC(26, 0, uart0,    aux_clkin,    uart0_clkdev,  0),
-       LPSC(27, 0, uart1,    aux_clkin,    uart1_clkdev,  0),
-       LPSC(28, 0, uart2,    aux_clkin,    uart2_clkdev,  0),
-       /* REVIST: disabling hangs system */
-       LPSC(29, 0, pwm0,     pll1_sysclk3, NULL,          LPSC_ALWAYS_ENABLED),
-       /* REVIST: disabling hangs system */
-       LPSC(30, 0, pwm1,     pll1_sysclk3, NULL,          LPSC_ALWAYS_ENABLED),
-       LPSC(31, 0, i2c,      pll1_sysclk3, i2c_clkdev,    0),
-       LPSC(33, 0, gpio,     pll1_sysclk3, gpio_clkdev,   0),
-       LPSC(34, 0, timer0,   pll1_sysclk3, timer0_clkdev, LPSC_ALWAYS_ENABLED),
-       LPSC(35, 0, timer1,   pll1_sysclk3, NULL,          0),
-       { }
-};
-
-int dm646x_psc_init(struct device *dev, void __iomem *base)
-{
-       return davinci_psc_register_clocks(dev, dm646x_psc_info, 46, base);
-}
-
-static struct clk_bulk_data dm646x_psc_parent_clks[] = {
-       { .id = "ref_clk"      },
-       { .id = "aux_clkin"    },
-       { .id = "pll1_sysclk1" },
-       { .id = "pll1_sysclk2" },
-       { .id = "pll1_sysclk3" },
-       { .id = "pll1_sysclk4" },
-       { .id = "pll1_sysclk5" },
-};
-
-const struct davinci_psc_init_data dm646x_psc_init_data = {
-       .parent_clks            = dm646x_psc_parent_clks,
-       .num_parent_clks        = ARRAY_SIZE(dm646x_psc_parent_clks),
-       .psc_init               = &dm646x_psc_init,
-};
index 7387e7f..42a59db 100644 (file)
@@ -517,12 +517,6 @@ static const struct platform_device_id davinci_psc_id_table[] = {
 #ifdef CONFIG_ARCH_DAVINCI_DM365
        { .name = "dm365-psc",  .driver_data = (kernel_ulong_t)&dm365_psc_init_data  },
 #endif
-#ifdef CONFIG_ARCH_DAVINCI_DM644x
-       { .name = "dm644x-psc", .driver_data = (kernel_ulong_t)&dm644x_psc_init_data },
-#endif
-#ifdef CONFIG_ARCH_DAVINCI_DM646x
-       { .name = "dm646x-psc", .driver_data = (kernel_ulong_t)&dm646x_psc_init_data },
-#endif
        { }
 };
 
index 69070f8..5e382b6 100644 (file)
@@ -110,11 +110,5 @@ extern const struct davinci_psc_init_data dm355_psc_init_data;
 #ifdef CONFIG_ARCH_DAVINCI_DM365
 extern const struct davinci_psc_init_data dm365_psc_init_data;
 #endif
-#ifdef CONFIG_ARCH_DAVINCI_DM644x
-extern const struct davinci_psc_init_data dm644x_psc_init_data;
-#endif
-#ifdef CONFIG_ARCH_DAVINCI_DM646x
-extern const struct davinci_psc_init_data dm646x_psc_init_data;
-#endif
 
 #endif /* __CLK_DAVINCI_PSC_H__ */
index d5936cf..843cea0 100644 (file)
@@ -259,6 +259,43 @@ config COMMON_CLK_MT6779_AUDSYS
        help
          This driver supports Mediatek MT6779 audsys clocks.
 
+config COMMON_CLK_MT6795
+       tristate "Clock driver for MediaTek MT6795"
+       depends on ARCH_MEDIATEK || COMPILE_TEST
+       select COMMON_CLK_MEDIATEK
+       default ARCH_MEDIATEK
+       help
+         This driver supports MediaTek MT6795 basic clocks and clocks
+         required for various peripherals found on MediaTek.
+
+config COMMON_CLK_MT6795_MFGCFG
+       tristate "Clock driver for MediaTek MT6795 mfgcfg"
+       depends on COMMON_CLK_MT6795
+       default COMMON_CLK_MT6795
+       help
+         This driver supports MediaTek MT6795 mfgcfg clocks.
+
+config COMMON_CLK_MT6795_MMSYS
+       tristate "Clock driver for MediaTek MT6795 mmsys"
+       depends on COMMON_CLK_MT6795
+       default COMMON_CLK_MT6795
+       help
+         This driver supports MediaTek MT6795 mmsys clocks.
+
+config COMMON_CLK_MT6795_VDECSYS
+       tristate "Clock driver for MediaTek MT6795 VDECSYS"
+       depends on COMMON_CLK_MT6795
+       default COMMON_CLK_MT6795
+       help
+         This driver supports MediaTek MT6795 vdecsys clocks.
+
+config COMMON_CLK_MT6795_VENCSYS
+       tristate "Clock driver for MediaTek MT6795 VENCSYS"
+       depends on COMMON_CLK_MT6795
+       default COMMON_CLK_MT6795
+       help
+         This driver supports MediaTek MT6795 vencsys clocks.
+
 config COMMON_CLK_MT6797
        bool "Clock driver for MediaTek MT6797"
        depends on (ARCH_MEDIATEK && ARM64) || COMPILE_TEST
@@ -608,6 +645,56 @@ config COMMON_CLK_MT8195
         help
           This driver supports MediaTek MT8195 clocks.
 
+config COMMON_CLK_MT8365
+       tristate "Clock driver for MediaTek MT8365"
+       depends on ARCH_MEDIATEK || COMPILE_TEST
+       select COMMON_CLK_MEDIATEK
+       default ARCH_MEDIATEK && ARM64
+       help
+         This driver supports MediaTek MT8365 basic clocks.
+
+config COMMON_CLK_MT8365_APU
+       tristate "Clock driver for MediaTek MT8365 apu"
+       depends on COMMON_CLK_MT8365
+       default COMMON_CLK_MT8365
+       help
+         This driver supports MediaTek MT8365 apu clocks.
+
+config COMMON_CLK_MT8365_CAM
+       tristate "Clock driver for MediaTek MT8365 cam"
+       depends on COMMON_CLK_MT8365
+       default COMMON_CLK_MT8365
+       help
+         This driver supports MediaTek MT8365 cam clocks.
+
+config COMMON_CLK_MT8365_MFG
+       tristate "Clock driver for MediaTek MT8365 mfg"
+       depends on COMMON_CLK_MT8365
+       default COMMON_CLK_MT8365
+       help
+         This driver supports MediaTek MT8365 mfg clocks.
+
+config COMMON_CLK_MT8365_MMSYS
+       tristate "Clock driver for MediaTek MT8365 mmsys"
+       depends on COMMON_CLK_MT8365
+       default COMMON_CLK_MT8365
+       help
+         This driver supports MediaTek MT8365 mmsys clocks.
+
+config COMMON_CLK_MT8365_VDEC
+       tristate "Clock driver for MediaTek MT8365 vdec"
+       depends on COMMON_CLK_MT8365
+       default COMMON_CLK_MT8365
+       help
+         This driver supports MediaTek MT8365 vdec clocks.
+
+config COMMON_CLK_MT8365_VENC
+       tristate "Clock driver for MediaTek MT8365 venc"
+       depends on COMMON_CLK_MT8365
+       default COMMON_CLK_MT8365
+       help
+         This driver supports MediaTek MT8365 venc clocks.
+
 config COMMON_CLK_MT8516
        bool "Clock driver for MediaTek MT8516"
        depends on ARCH_MEDIATEK || COMPILE_TEST
index caf2ce9..ea3b732 100644 (file)
@@ -17,6 +17,12 @@ obj-$(CONFIG_COMMON_CLK_MT6779_VDECSYS) += clk-mt6779-vdec.o
 obj-$(CONFIG_COMMON_CLK_MT6779_VENCSYS) += clk-mt6779-venc.o
 obj-$(CONFIG_COMMON_CLK_MT6779_MFGCFG) += clk-mt6779-mfg.o
 obj-$(CONFIG_COMMON_CLK_MT6779_AUDSYS) += clk-mt6779-aud.o
+obj-$(CONFIG_COMMON_CLK_MT6795) += clk-mt6795-apmixedsys.o clk-mt6795-infracfg.o \
+                                  clk-mt6795-pericfg.o clk-mt6795-topckgen.o
+obj-$(CONFIG_COMMON_CLK_MT6795_MFGCFG) += clk-mt6795-mfg.o
+obj-$(CONFIG_COMMON_CLK_MT6795_MMSYS) += clk-mt6795-mm.o
+obj-$(CONFIG_COMMON_CLK_MT6795_VDECSYS) += clk-mt6795-vdecsys.o
+obj-$(CONFIG_COMMON_CLK_MT6795_VENCSYS) += clk-mt6795-vencsys.o
 obj-$(CONFIG_COMMON_CLK_MT6797) += clk-mt6797.o
 obj-$(CONFIG_COMMON_CLK_MT6797_IMGSYS) += clk-mt6797-img.o
 obj-$(CONFIG_COMMON_CLK_MT6797_MMSYS) += clk-mt6797-mm.o
@@ -97,5 +103,12 @@ obj-$(CONFIG_COMMON_CLK_MT8195) += clk-mt8195-apmixedsys.o clk-mt8195-topckgen.o
                                   clk-mt8195-venc.o clk-mt8195-vpp0.o clk-mt8195-vpp1.o \
                                   clk-mt8195-wpe.o clk-mt8195-imp_iic_wrap.o \
                                   clk-mt8195-apusys_pll.o
+obj-$(CONFIG_COMMON_CLK_MT8365) += clk-mt8365.o
+obj-$(CONFIG_COMMON_CLK_MT8365_APU) += clk-mt8365-apu.o
+obj-$(CONFIG_COMMON_CLK_MT8365_CAM) += clk-mt8365-cam.o
+obj-$(CONFIG_COMMON_CLK_MT8365_MFG) += clk-mt8365-mfg.o
+obj-$(CONFIG_COMMON_CLK_MT8365_MMSYS) += clk-mt8365-mm.o
+obj-$(CONFIG_COMMON_CLK_MT8365_VDEC) += clk-mt8365-vdec.o
+obj-$(CONFIG_COMMON_CLK_MT8365_VENC) += clk-mt8365-venc.o
 obj-$(CONFIG_COMMON_CLK_MT8516) += clk-mt8516.o
 obj-$(CONFIG_COMMON_CLK_MT8516_AUDSYS) += clk-mt8516-aud.o
index fc3d414..60e34f1 100644 (file)
@@ -70,7 +70,7 @@ static const struct clk_ops mtk_ref2usb_tx_ops = {
        .unprepare      = mtk_ref2usb_tx_unprepare,
 };
 
-struct clk_hw * __init mtk_clk_register_ref2usb_tx(const char *name,
+struct clk_hw *mtk_clk_register_ref2usb_tx(const char *name,
                        const char *parent_name, void __iomem *reg)
 {
        struct mtk_ref2usb_tx *tx;
@@ -98,5 +98,15 @@ struct clk_hw * __init mtk_clk_register_ref2usb_tx(const char *name,
 
        return &tx->hw;
 }
+EXPORT_SYMBOL_GPL(mtk_clk_register_ref2usb_tx);
+
+void mtk_clk_unregister_ref2usb_tx(struct clk_hw *hw)
+{
+       struct mtk_ref2usb_tx *tx = to_mtk_ref2usb_tx(hw);
+
+       clk_hw_unregister(hw);
+       kfree(tx);
+}
+EXPORT_SYMBOL_GPL(mtk_clk_unregister_ref2usb_tx);
 
 MODULE_LICENSE("GPL");
index 2b5d485..25618ef 100644 (file)
@@ -150,6 +150,7 @@ err:
 
        return PTR_ERR(hw);
 }
+EXPORT_SYMBOL_GPL(mtk_clk_register_cpumuxes);
 
 void mtk_clk_unregister_cpumuxes(const struct mtk_composite *clks, int num,
                                 struct clk_hw_onecell_data *clk_data)
@@ -166,5 +167,6 @@ void mtk_clk_unregister_cpumuxes(const struct mtk_composite *clks, int num,
                clk_data->hws[mux->id] = ERR_PTR(-ENOENT);
        }
 }
+EXPORT_SYMBOL_GPL(mtk_clk_unregister_cpumuxes);
 
 MODULE_LICENSE("GPL");
index 4218062..0c86713 100644 (file)
@@ -261,6 +261,7 @@ err:
 
        return PTR_ERR(hw);
 }
+EXPORT_SYMBOL_GPL(mtk_clk_register_gates_with_dev);
 
 int mtk_clk_register_gates(struct device_node *node,
                           const struct mtk_gate *clks, int num,
index 662a8ab..435ed48 100644 (file)
@@ -94,33 +94,23 @@ static const struct mtk_gate bdp_clks[] = {
        GATE_BDP1(CLK_BDP_HDMI_MON, "hdmi_mon", "hdmi_0_pll340m", 16),
 };
 
-static const struct of_device_id of_match_clk_mt2701_bdp[] = {
-       { .compatible = "mediatek,mt2701-bdpsys", },
-       {}
+static const struct mtk_clk_desc bdp_desc = {
+       .clks = bdp_clks,
+       .num_clks = ARRAY_SIZE(bdp_clks),
 };
 
-static int clk_mt2701_bdp_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       int r;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_BDP_NR);
-
-       mtk_clk_register_gates(node, bdp_clks, ARRAY_SIZE(bdp_clks),
-                                               clk_data);
-
-       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-       if (r)
-               dev_err(&pdev->dev,
-                       "could not register clock provider: %s: %d\n",
-                       pdev->name, r);
-
-       return r;
-}
+static const struct of_device_id of_match_clk_mt2701_bdp[] = {
+       {
+               .compatible = "mediatek,mt2701-bdpsys",
+               .data = &bdp_desc,
+       }, {
+               /* sentinel */
+       }
+};
 
 static struct platform_driver clk_mt2701_bdp_drv = {
-       .probe = clk_mt2701_bdp_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt2701-bdp",
                .of_match_table = of_match_clk_mt2701_bdp,
index c4f3cd2..7e53deb 100644 (file)
@@ -36,33 +36,23 @@ static const struct mtk_gate img_clks[] = {
        GATE_IMG(CLK_IMG_VENC, "img_venc", "mm_sel", 9),
 };
 
-static const struct of_device_id of_match_clk_mt2701_img[] = {
-       { .compatible = "mediatek,mt2701-imgsys", },
-       {}
+static const struct mtk_clk_desc img_desc = {
+       .clks = img_clks,
+       .num_clks = ARRAY_SIZE(img_clks),
 };
 
-static int clk_mt2701_img_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       int r;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_IMG_NR);
-
-       mtk_clk_register_gates(node, img_clks, ARRAY_SIZE(img_clks),
-                                               clk_data);
-
-       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-       if (r)
-               dev_err(&pdev->dev,
-                       "could not register clock provider: %s: %d\n",
-                       pdev->name, r);
-
-       return r;
-}
+static const struct of_device_id of_match_clk_mt2701_img[] = {
+       {
+               .compatible = "mediatek,mt2701-imgsys",
+               .data = &img_desc,
+       }, {
+               /* sentinel */
+       }
+};
 
 static struct platform_driver clk_mt2701_img_drv = {
-       .probe = clk_mt2701_img_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt2701-img",
                .of_match_table = of_match_clk_mt2701_img,
index a2f1811..d3089da 100644 (file)
@@ -47,33 +47,23 @@ static const struct mtk_gate vdec_clks[] = {
        GATE_VDEC1(CLK_VDEC_LARB, "vdec_larb_cken", "mm_sel", 0),
 };
 
-static const struct of_device_id of_match_clk_mt2701_vdec[] = {
-       { .compatible = "mediatek,mt2701-vdecsys", },
-       {}
+static const struct mtk_clk_desc vdec_desc = {
+       .clks = vdec_clks,
+       .num_clks = ARRAY_SIZE(vdec_clks),
 };
 
-static int clk_mt2701_vdec_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       int r;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_VDEC_NR);
-
-       mtk_clk_register_gates(node, vdec_clks, ARRAY_SIZE(vdec_clks),
-                                               clk_data);
-
-       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-       if (r)
-               dev_err(&pdev->dev,
-                       "could not register clock provider: %s: %d\n",
-                       pdev->name, r);
-
-       return r;
-}
+static const struct of_device_id of_match_clk_mt2701_vdec[] = {
+       {
+               .compatible = "mediatek,mt2701-vdecsys",
+               .data = &vdec_desc,
+       }, {
+               /* sentinel */
+       }
+};
 
 static struct platform_driver clk_mt2701_vdec_drv = {
-       .probe = clk_mt2701_vdec_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt2701-vdec",
                .of_match_table = of_match_clk_mt2701_vdec,
index 9acab43..684d03e 100644 (file)
@@ -58,33 +58,23 @@ static const struct mtk_gate bdp_clks[] = {
        GATE_BDP(CLK_BDP_TVD_CBUS, "bdp_tvd_cbus", "mm_sel", 30),
 };
 
-static int clk_mt2712_bdp_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       int r;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_BDP_NR_CLK);
-
-       mtk_clk_register_gates(node, bdp_clks, ARRAY_SIZE(bdp_clks),
-                       clk_data);
-
-       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-
-       if (r != 0)
-               pr_err("%s(): could not register clock provider: %d\n",
-                       __func__, r);
-
-       return r;
-}
+static const struct mtk_clk_desc bdp_desc = {
+       .clks = bdp_clks,
+       .num_clks = ARRAY_SIZE(bdp_clks),
+};
 
 static const struct of_device_id of_match_clk_mt2712_bdp[] = {
-       { .compatible = "mediatek,mt2712-bdpsys", },
-       {}
+       {
+               .compatible = "mediatek,mt2712-bdpsys",
+               .data = &bdp_desc,
+       }, {
+               /* sentinel */
+       }
 };
 
 static struct platform_driver clk_mt2712_bdp_drv = {
-       .probe = clk_mt2712_bdp_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt2712-bdp",
                .of_match_table = of_match_clk_mt2712_bdp,
index 5cc143e..335049c 100644 (file)
@@ -36,33 +36,23 @@ static const struct mtk_gate img_clks[] = {
        GATE_IMG(CLK_IMG_CAM_SV2_EN, "img_cam_sv2_en", "mm_sel", 11),
 };
 
-static int clk_mt2712_img_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       int r;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_IMG_NR_CLK);
-
-       mtk_clk_register_gates(node, img_clks, ARRAY_SIZE(img_clks),
-                       clk_data);
-
-       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-
-       if (r != 0)
-               pr_err("%s(): could not register clock provider: %d\n",
-                       __func__, r);
-
-       return r;
-}
+static const struct mtk_clk_desc img_desc = {
+       .clks = img_clks,
+       .num_clks = ARRAY_SIZE(img_clks),
+};
 
 static const struct of_device_id of_match_clk_mt2712_img[] = {
-       { .compatible = "mediatek,mt2712-imgsys", },
-       {}
+       {
+               .compatible = "mediatek,mt2712-imgsys",
+               .data = &img_desc,
+       }, {
+               /* sentinel */
+       }
 };
 
 static struct platform_driver clk_mt2712_img_drv = {
-       .probe = clk_mt2712_img_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt2712-img",
                .of_match_table = of_match_clk_mt2712_img,
index 31fc303..07ba7c5 100644 (file)
@@ -32,33 +32,23 @@ static const struct mtk_gate jpgdec_clks[] = {
        GATE_JPGDEC(CLK_JPGDEC_JPGDEC, "jpgdec_jpgdec", "jpgdec_sel", 4),
 };
 
-static int clk_mt2712_jpgdec_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       int r;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_JPGDEC_NR_CLK);
-
-       mtk_clk_register_gates(node, jpgdec_clks, ARRAY_SIZE(jpgdec_clks),
-                       clk_data);
-
-       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-
-       if (r != 0)
-               pr_err("%s(): could not register clock provider: %d\n",
-                       __func__, r);
-
-       return r;
-}
+static const struct mtk_clk_desc jpgdec_desc = {
+       .clks = jpgdec_clks,
+       .num_clks = ARRAY_SIZE(jpgdec_clks),
+};
 
 static const struct of_device_id of_match_clk_mt2712_jpgdec[] = {
-       { .compatible = "mediatek,mt2712-jpgdecsys", },
-       {}
+       {
+               .compatible = "mediatek,mt2712-jpgdecsys",
+               .data = &jpgdec_desc,
+       }, {
+               /* sentinel */
+       }
 };
 
 static struct platform_driver clk_mt2712_jpgdec_drv = {
-       .probe = clk_mt2712_jpgdec_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt2712-jpgdec",
                .of_match_table = of_match_clk_mt2712_jpgdec,
index a4d0967..42f8cf3 100644 (file)
@@ -31,33 +31,23 @@ static const struct mtk_gate mfg_clks[] = {
        GATE_MFG(CLK_MFG_BG3D, "mfg_bg3d", "mfg_sel", 0),
 };
 
-static int clk_mt2712_mfg_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       int r;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_MFG_NR_CLK);
-
-       mtk_clk_register_gates(node, mfg_clks, ARRAY_SIZE(mfg_clks),
-                       clk_data);
-
-       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-
-       if (r != 0)
-               pr_err("%s(): could not register clock provider: %d\n",
-                       __func__, r);
-
-       return r;
-}
+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_mt2712_mfg[] = {
-       { .compatible = "mediatek,mt2712-mfgcfg", },
-       {}
+       {
+               .compatible = "mediatek,mt2712-mfgcfg",
+               .data = &mfg_desc,
+       }, {
+               /* sentinel */
+       }
 };
 
 static struct platform_driver clk_mt2712_mfg_drv = {
-       .probe = clk_mt2712_mfg_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt2712-mfg",
                .of_match_table = of_match_clk_mt2712_mfg,
index af13f43..6296ed5 100644 (file)
@@ -50,33 +50,23 @@ static const struct mtk_gate vdec_clks[] = {
        GATE_VDEC1(CLK_VDEC_IMGRZ_CKEN, "vdec_imgrz_cken", "vdec_sel", 1),
 };
 
-static int clk_mt2712_vdec_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       int r;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_VDEC_NR_CLK);
-
-       mtk_clk_register_gates(node, vdec_clks, ARRAY_SIZE(vdec_clks),
-                       clk_data);
-
-       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-
-       if (r != 0)
-               pr_err("%s(): could not register clock provider: %d\n",
-                       __func__, r);
-
-       return r;
-}
+static const struct mtk_clk_desc vdec_desc = {
+       .clks = vdec_clks,
+       .num_clks = ARRAY_SIZE(vdec_clks),
+};
 
 static const struct of_device_id of_match_clk_mt2712_vdec[] = {
-       { .compatible = "mediatek,mt2712-vdecsys", },
-       {}
+       {
+               .compatible = "mediatek,mt2712-vdecsys",
+               .data = &vdec_desc,
+       }, {
+               /* sentinel */
+       }
 };
 
 static struct platform_driver clk_mt2712_vdec_drv = {
-       .probe = clk_mt2712_vdec_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt2712-vdec",
                .of_match_table = of_match_clk_mt2712_vdec,
index abc08a0..b9bfc35 100644 (file)
@@ -33,33 +33,23 @@ static const struct mtk_gate venc_clks[] = {
        GATE_VENC(CLK_VENC_SMI_LARB6, "venc_smi_larb6", "jpgdec_sel", 12),
 };
 
-static int clk_mt2712_venc_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       int r;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_VENC_NR_CLK);
-
-       mtk_clk_register_gates(node, venc_clks, ARRAY_SIZE(venc_clks),
-                       clk_data);
-
-       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-
-       if (r != 0)
-               pr_err("%s(): could not register clock provider: %d\n",
-                       __func__, r);
-
-       return r;
-}
+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_mt2712_venc[] = {
-       { .compatible = "mediatek,mt2712-vencsys", },
-       {}
+       {
+               .compatible = "mediatek,mt2712-vencsys",
+               .data = &venc_desc,
+       }, {
+               /* sentinel */
+       }
 };
 
 static struct platform_driver clk_mt2712_venc_drv = {
-       .probe = clk_mt2712_venc_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt2712-venc",
                .of_match_table = of_match_clk_mt2712_venc,
index 9c6e9ca..0aa6c0d 100644 (file)
@@ -64,33 +64,23 @@ static const struct mtk_gate audio_clks[] = {
                    "audio_ck", 7),
 };
 
-static int clk_mt6765_audio_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       int r;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_AUDIO_NR_CLK);
-
-       mtk_clk_register_gates(node, audio_clks,
-                              ARRAY_SIZE(audio_clks), clk_data);
-
-       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-
-       if (r)
-               pr_err("%s(): could not register clock provider: %d\n",
-                      __func__, r);
-
-       return r;
-}
+static const struct mtk_clk_desc audio_desc = {
+       .clks = audio_clks,
+       .num_clks = ARRAY_SIZE(audio_clks),
+};
 
 static const struct of_device_id of_match_clk_mt6765_audio[] = {
-       { .compatible = "mediatek,mt6765-audsys", },
-       {}
+       {
+               .compatible = "mediatek,mt6765-audsys",
+               .data = &audio_desc,
+       }, {
+               /* sentinel */
+       }
 };
 
 static struct platform_driver clk_mt6765_audio_drv = {
-       .probe = clk_mt6765_audio_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt6765-audio",
                .of_match_table = of_match_clk_mt6765_audio,
index 2586d3a..25f2bef 100644 (file)
@@ -39,32 +39,23 @@ static const struct mtk_gate cam_clks[] = {
        GATE_CAM(CLK_CAM_CCU, "cam_ccu", "mm_ck", 12),
 };
 
-static int clk_mt6765_cam_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       int r;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_CAM_NR_CLK);
-
-       mtk_clk_register_gates(node, cam_clks, ARRAY_SIZE(cam_clks), clk_data);
-
-       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-
-       if (r)
-               pr_err("%s(): could not register clock provider: %d\n",
-                      __func__, r);
-
-       return r;
-}
+static const struct mtk_clk_desc cam_desc = {
+       .clks = cam_clks,
+       .num_clks = ARRAY_SIZE(cam_clks),
+};
 
 static const struct of_device_id of_match_clk_mt6765_cam[] = {
-       { .compatible = "mediatek,mt6765-camsys", },
-       {}
+       {
+               .compatible = "mediatek,mt6765-camsys",
+               .data = &cam_desc,
+       }, {
+               /* sentinel */
+       }
 };
 
 static struct platform_driver clk_mt6765_cam_drv = {
-       .probe = clk_mt6765_cam_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt6765-cam",
                .of_match_table = of_match_clk_mt6765_cam,
index 8cc95b9..a62303e 100644 (file)
@@ -35,32 +35,23 @@ static const struct mtk_gate img_clks[] = {
        GATE_IMG(CLK_IMG_RSC, "img_rsc", "mm_ck", 5),
 };
 
-static int clk_mt6765_img_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       int r;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_IMG_NR_CLK);
-
-       mtk_clk_register_gates(node, img_clks, ARRAY_SIZE(img_clks), clk_data);
-
-       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-
-       if (r)
-               pr_err("%s(): could not register clock provider: %d\n",
-                      __func__, r);
-
-       return r;
-}
+static const struct mtk_clk_desc img_desc = {
+       .clks = img_clks,
+       .num_clks = ARRAY_SIZE(img_clks),
+};
 
 static const struct of_device_id of_match_clk_mt6765_img[] = {
-       { .compatible = "mediatek,mt6765-imgsys", },
-       {}
+       {
+               .compatible = "mediatek,mt6765-imgsys",
+               .data = &img_desc,
+       }, {
+               /* sentinel */
+       }
 };
 
 static struct platform_driver clk_mt6765_img_drv = {
-       .probe = clk_mt6765_img_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt6765-img",
                .of_match_table = of_match_clk_mt6765_img,
index c816e26..25c829f 100644 (file)
@@ -32,33 +32,23 @@ static const struct mtk_gate mipi0a_clks[] = {
                    "mipi0a_csr_0a", "f_fseninf_ck", 1),
 };
 
-static int clk_mt6765_mipi0a_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       int r;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_MIPI0A_NR_CLK);
-
-       mtk_clk_register_gates(node, mipi0a_clks,
-                              ARRAY_SIZE(mipi0a_clks), clk_data);
-
-       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-
-       if (r)
-               pr_err("%s(): could not register clock provider: %d\n",
-                      __func__, r);
-
-       return r;
-}
+static const struct mtk_clk_desc mipi0a_desc = {
+       .clks = mipi0a_clks,
+       .num_clks = ARRAY_SIZE(mipi0a_clks),
+};
 
 static const struct of_device_id of_match_clk_mt6765_mipi0a[] = {
-       { .compatible = "mediatek,mt6765-mipi0a", },
-       {}
+       {
+               .compatible = "mediatek,mt6765-mipi0a",
+               .data = &mipi0a_desc,
+       }, {
+               /* sentinel */
+       }
 };
 
 static struct platform_driver clk_mt6765_mipi0a_drv = {
-       .probe = clk_mt6765_mipi0a_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt6765-mipi0a",
                .of_match_table = of_match_clk_mt6765_mipi0a,
index ee6d3b8..bda7746 100644 (file)
@@ -61,32 +61,23 @@ static const struct mtk_gate mm_clks[] = {
        GATE_MM(CLK_MM_F26M_HRTWT, "mm_hrtwt", "f_f26m_ck", 29),
 };
 
-static int clk_mt6765_mm_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       int r;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_MM_NR_CLK);
-
-       mtk_clk_register_gates(node, mm_clks, ARRAY_SIZE(mm_clks), clk_data);
-
-       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-
-       if (r)
-               pr_err("%s(): could not register clock provider: %d\n",
-                      __func__, r);
-
-       return r;
-}
+static const struct mtk_clk_desc mm_desc = {
+       .clks = mm_clks,
+       .num_clks = ARRAY_SIZE(mm_clks),
+};
 
 static const struct of_device_id of_match_clk_mt6765_mm[] = {
-       { .compatible = "mediatek,mt6765-mmsys", },
-       {}
+       {
+               .compatible = "mediatek,mt6765-mmsys",
+               .data = &mm_desc,
+       }, {
+               /* sentinel */
+       }
 };
 
 static struct platform_driver clk_mt6765_mm_drv = {
-       .probe = clk_mt6765_mm_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt6765-mm",
                .of_match_table = of_match_clk_mt6765_mm,
index d804597..2bc1fbd 100644 (file)
@@ -34,33 +34,23 @@ static const struct mtk_gate venc_clks[] = {
        GATE_VENC(CLK_VENC_SET3_VDEC, "venc_set3_vdec", "mm_ck", 12),
 };
 
-static int clk_mt6765_vcodec_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       int r;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_VENC_NR_CLK);
-
-       mtk_clk_register_gates(node, venc_clks,
-                              ARRAY_SIZE(venc_clks), clk_data);
-
-       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-
-       if (r)
-               pr_err("%s(): could not register clock provider: %d\n",
-                      __func__, r);
-
-       return r;
-}
+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_mt6765_vcodec[] = {
-       { .compatible = "mediatek,mt6765-vcodecsys", },
-       {}
+       {
+               .compatible = "mediatek,mt6765-vcodecsys",
+               .data = &venc_desc,
+       }, {
+               /* sentinel */
+       }
 };
 
 static struct platform_driver clk_mt6765_vcodec_drv = {
-       .probe = clk_mt6765_vcodec_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt6765-vcodec",
                .of_match_table = of_match_clk_mt6765_vcodec,
index 97e44ab..6e473ae 100644 (file)
@@ -89,26 +89,23 @@ static const struct mtk_gate audio_clks[] = {
                    "audio_h_sel", 31),
 };
 
-static const struct of_device_id of_match_clk_mt6779_aud[] = {
-       { .compatible = "mediatek,mt6779-audio", },
-       {}
+static const struct mtk_clk_desc audio_desc = {
+       .clks = audio_clks,
+       .num_clks = ARRAY_SIZE(audio_clks),
 };
 
-static int clk_mt6779_aud_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_AUD_NR_CLK);
-
-       mtk_clk_register_gates(node, audio_clks, ARRAY_SIZE(audio_clks),
-                              clk_data);
-
-       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-}
+static const struct of_device_id of_match_clk_mt6779_aud[] = {
+       {
+               .compatible = "mediatek,mt6779-audio",
+               .data = &audio_desc,
+       }, {
+               /* sentinel */
+       }
+};
 
 static struct platform_driver clk_mt6779_aud_drv = {
-       .probe = clk_mt6779_aud_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt6779-aud",
                .of_match_table = of_match_clk_mt6779_aud,
index 9c5117a..7be3db9 100644 (file)
@@ -38,26 +38,23 @@ static const struct mtk_gate cam_clks[] = {
        GATE_CAM(CLK_CAM_FAKE_ENG, "camsys_fake_eng", "cam_sel", 14),
 };
 
-static const struct of_device_id of_match_clk_mt6779_cam[] = {
-       { .compatible = "mediatek,mt6779-camsys", },
-       {}
+static const struct mtk_clk_desc cam_desc = {
+       .clks = cam_clks,
+       .num_clks = ARRAY_SIZE(cam_clks),
 };
 
-static int clk_mt6779_cam_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_CAM_NR_CLK);
-
-       mtk_clk_register_gates(node, cam_clks, ARRAY_SIZE(cam_clks),
-                              clk_data);
-
-       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-}
+static const struct of_device_id of_match_clk_mt6779_cam[] = {
+       {
+               .compatible = "mediatek,mt6779-camsys",
+               .data = &cam_desc,
+       }, {
+               /* sentinel */
+       }
+};
 
 static struct platform_driver clk_mt6779_cam_drv = {
-       .probe = clk_mt6779_cam_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt6779-cam",
                .of_match_table = of_match_clk_mt6779_cam,
index 8012714..9bc51fc 100644 (file)
@@ -30,26 +30,23 @@ static const struct mtk_gate img_clks[] = {
        GATE_IMG(CLK_IMG_WPE_A, "imgsys_wpe_a", "img_sel", 7),
 };
 
-static const struct of_device_id of_match_clk_mt6779_img[] = {
-       { .compatible = "mediatek,mt6779-imgsys", },
-       {}
+static const struct mtk_clk_desc img_desc = {
+       .clks = img_clks,
+       .num_clks = ARRAY_SIZE(img_clks),
 };
 
-static int clk_mt6779_img_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_IMG_NR_CLK);
-
-       mtk_clk_register_gates(node, img_clks, ARRAY_SIZE(img_clks),
-                              clk_data);
-
-       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-}
+static const struct of_device_id of_match_clk_mt6779_img[] = {
+       {
+               .compatible = "mediatek,mt6779-imgsys",
+               .data = &img_desc,
+       }, {
+               /* sentinel */
+       }
+};
 
 static struct platform_driver clk_mt6779_img_drv = {
-       .probe = clk_mt6779_img_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt6779-img",
                .of_match_table = of_match_clk_mt6779_img,
index f67814c..92e9d1a 100644 (file)
@@ -32,26 +32,23 @@ static const struct mtk_gate ipe_clks[] = {
        GATE_IPE(CLK_IPE_DPE, "ipe_dpe", "ipe_sel", 6),
 };
 
-static const struct of_device_id of_match_clk_mt6779_ipe[] = {
-       { .compatible = "mediatek,mt6779-ipesys", },
-       {}
+static const struct mtk_clk_desc ipe_desc = {
+       .clks = ipe_clks,
+       .num_clks = ARRAY_SIZE(ipe_clks),
 };
 
-static int clk_mt6779_ipe_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_IPE_NR_CLK);
-
-       mtk_clk_register_gates(node, ipe_clks, ARRAY_SIZE(ipe_clks),
-                              clk_data);
-
-       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-}
+static const struct of_device_id of_match_clk_mt6779_ipe[] = {
+       {
+               .compatible = "mediatek,mt6779-ipesys",
+               .data = &ipe_desc,
+       }, {
+               /* sentinel */
+       }
+};
 
 static struct platform_driver clk_mt6779_ipe_drv = {
-       .probe = clk_mt6779_ipe_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt6779-ipe",
                .of_match_table = of_match_clk_mt6779_ipe,
index fc7387b..efc793a 100644 (file)
@@ -27,26 +27,23 @@ static const struct mtk_gate mfg_clks[] = {
        GATE_MFG(CLK_MFGCFG_BG3D, "mfg_bg3d", "mfg_sel", 0),
 };
 
-static int clk_mt6779_mfg_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_MFGCFG_NR_CLK);
-
-       mtk_clk_register_gates(node, mfg_clks, ARRAY_SIZE(mfg_clks),
-                              clk_data);
-
-       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-}
+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_mt6779_mfg[] = {
-       { .compatible = "mediatek,mt6779-mfgcfg", },
-       {}
+       {
+               .compatible = "mediatek,mt6779-mfgcfg",
+               .data = &mfg_desc,
+       }, {
+               /* sentinel */
+       }
 };
 
 static struct platform_driver clk_mt6779_mfg_drv = {
-       .probe = clk_mt6779_mfg_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt6779-mfg",
                .of_match_table = of_match_clk_mt6779_mfg,
index 7e195b0..3209a65 100644 (file)
@@ -39,26 +39,23 @@ static const struct mtk_gate vdec_clks[] = {
        GATE_VDEC1_I(CLK_VDEC_LARB1, "vdec_larb1_cken", "vdec_sel", 0),
 };
 
-static const struct of_device_id of_match_clk_mt6779_vdec[] = {
-       { .compatible = "mediatek,mt6779-vdecsys", },
-       {}
+static const struct mtk_clk_desc vdec_desc = {
+       .clks = vdec_clks,
+       .num_clks = ARRAY_SIZE(vdec_clks),
 };
 
-static int clk_mt6779_vdec_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_VDEC_GCON_NR_CLK);
-
-       mtk_clk_register_gates(node, vdec_clks, ARRAY_SIZE(vdec_clks),
-                              clk_data);
-
-       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-}
+static const struct of_device_id of_match_clk_mt6779_vdec[] = {
+       {
+               .compatible = "mediatek,mt6779-vdecsys",
+               .data = &vdec_desc,
+       }, {
+               /* sentinel */
+       }
+};
 
 static struct platform_driver clk_mt6779_vdec_drv = {
-       .probe = clk_mt6779_vdec_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt6779-vdec",
                .of_match_table = of_match_clk_mt6779_vdec,
index 573efa8..c25035c 100644 (file)
@@ -30,26 +30,23 @@ static const struct mtk_gate venc_clks[] = {
        GATE_VENC_I(CLK_VENC_GCON_GALS, "venc_gals", "venc_sel", 28),
 };
 
-static const struct of_device_id of_match_clk_mt6779_venc[] = {
-       { .compatible = "mediatek,mt6779-vencsys", },
-       {}
+static const struct mtk_clk_desc venc_desc = {
+       .clks = venc_clks,
+       .num_clks = ARRAY_SIZE(venc_clks),
 };
 
-static int clk_mt6779_venc_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_VENC_GCON_NR_CLK);
-
-       mtk_clk_register_gates(node, venc_clks, ARRAY_SIZE(venc_clks),
-                              clk_data);
-
-       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-}
+static const struct of_device_id of_match_clk_mt6779_venc[] = {
+       {
+               .compatible = "mediatek,mt6779-vencsys",
+               .data = &venc_desc,
+       }, {
+               /* sentinel */
+       }
+};
 
 static struct platform_driver clk_mt6779_venc_drv = {
-       .probe = clk_mt6779_venc_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt6779-venc",
                .of_match_table = of_match_clk_mt6779_venc,
diff --git a/drivers/clk/mediatek/clk-mt6795-apmixedsys.c b/drivers/clk/mediatek/clk-mt6795-apmixedsys.c
new file mode 100644 (file)
index 0000000..59761c7
--- /dev/null
@@ -0,0 +1,157 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2022 Collabora Ltd.
+ * Author: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+ */
+
+#include <dt-bindings/clock/mediatek,mt6795-clk.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include "clk-mtk.h"
+#include "clk-pll.h"
+
+#define REG_REF2USB            0x8
+#define REG_AP_PLL_CON7                0x1c
+ #define MD1_MTCMOS_OFF                BIT(0)
+ #define MD1_MEM_OFF           BIT(1)
+ #define MD1_CLK_OFF           BIT(4)
+ #define MD1_ISO_OFF           BIT(8)
+
+#define MT6795_PLL_FMAX                (3000UL * MHZ)
+#define MT6795_CON0_EN         BIT(0)
+#define MT6795_CON0_RST_BAR    BIT(24)
+
+#define PLL(_id, _name, _reg, _pwr_reg, _en_mask, _flags, _pcwbits,    \
+           _pd_reg, _pd_shift, _tuner_reg, _pcw_reg, _pcw_shift) {     \
+               .id = _id,                                              \
+               .name = _name,                                          \
+               .reg = _reg,                                            \
+               .pwr_reg = _pwr_reg,                                    \
+               .en_mask = MT6795_CON0_EN | _en_mask,                   \
+               .flags = _flags,                                        \
+               .rst_bar_mask = MT6795_CON0_RST_BAR,                    \
+               .fmax = MT6795_PLL_FMAX,                                \
+               .pcwbits = _pcwbits,                                    \
+               .pd_reg = _pd_reg,                                      \
+               .pd_shift = _pd_shift,                                  \
+               .tuner_reg = _tuner_reg,                                \
+               .pcw_reg = _pcw_reg,                                    \
+               .pcw_shift = _pcw_shift,                                \
+               .div_table = NULL,                                      \
+               .pll_en_bit = 0,                                        \
+       }
+
+static const struct mtk_pll_data plls[] = {
+       PLL(CLK_APMIXED_ARMCA53PLL, "armca53pll", 0x200, 0x20c, 0, PLL_AO,
+           21, 0x204, 24, 0x0, 0x204, 0),
+       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x220, 0x22c, 0xf0000101, HAVE_RST_BAR,
+           21, 0x220, 4, 0x0, 0x224, 0),
+       PLL(CLK_APMIXED_UNIVPLL, "univpll", 0x230, 0x23c, 0xfe000101, HAVE_RST_BAR,
+           7, 0x230, 4, 0x0, 0x234, 14),
+       PLL(CLK_APMIXED_MMPLL, "mmpll", 0x240, 0x24c, 0, 0, 21, 0x244, 24, 0x0, 0x244, 0),
+       PLL(CLK_APMIXED_MSDCPLL, "msdcpll", 0x250, 0x25c, 0, 0, 21, 0x250, 4, 0x0, 0x254, 0),
+       PLL(CLK_APMIXED_VENCPLL, "vencpll", 0x260, 0x26c, 0, 0, 21, 0x260, 4, 0x0, 0x264, 0),
+       PLL(CLK_APMIXED_TVDPLL, "tvdpll", 0x270, 0x27c, 0, 0, 21, 0x270, 4, 0x0, 0x274, 0),
+       PLL(CLK_APMIXED_MPLL, "mpll", 0x280, 0x28c, 0, 0, 21, 0x280, 4, 0x0, 0x284, 0),
+       PLL(CLK_APMIXED_VCODECPLL, "vcodecpll", 0x290, 0x29c, 0, 0, 21, 0x290, 4, 0x0, 0x294, 0),
+       PLL(CLK_APMIXED_APLL1, "apll1", 0x2a0, 0x2b0, 0, 0, 31, 0x2a0, 4, 0x2a8, 0x2a4, 0),
+       PLL(CLK_APMIXED_APLL2, "apll2", 0x2b4, 0x2c4, 0, 0, 31, 0x2b4, 4, 0x2bc, 0x2b8, 0),
+};
+
+static void clk_mt6795_apmixed_setup_md1(void __iomem *base)
+{
+       void __iomem *reg = base + REG_AP_PLL_CON7;
+
+       /* Turn on MD1 internal clock */
+       writel(readl(reg) & ~MD1_CLK_OFF, reg);
+
+       /* Unlock MD1's MTCMOS power path */
+       writel(readl(reg) & ~MD1_MTCMOS_OFF, reg);
+
+       /* Turn on ISO */
+       writel(readl(reg) & ~MD1_ISO_OFF, reg);
+
+       /* Turn on memory */
+       writel(readl(reg) & ~MD1_MEM_OFF, reg);
+}
+
+static const struct of_device_id of_match_clk_mt6795_apmixed[] = {
+       { .compatible = "mediatek,mt6795-apmixedsys" },
+       { /* sentinel */ }
+};
+
+static int clk_mt6795_apmixed_probe(struct platform_device *pdev)
+{
+       struct clk_hw_onecell_data *clk_data;
+       struct device *dev = &pdev->dev;
+       struct device_node *node = dev->of_node;
+       void __iomem *base;
+       struct clk_hw *hw;
+       int ret;
+
+       base = devm_platform_ioremap_resource(pdev, 0);
+       if (IS_ERR(base))
+               return PTR_ERR(base);
+
+       clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK);
+       if (!clk_data)
+               return -ENOMEM;
+
+       ret = mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
+       if (ret)
+               goto free_clk_data;
+
+       hw = mtk_clk_register_ref2usb_tx("ref2usb_tx", "clk26m", base + REG_REF2USB);
+       if (IS_ERR(hw)) {
+               ret = PTR_ERR(hw);
+               dev_err(dev, "Failed to register ref2usb_tx: %d\n", ret);
+               goto unregister_plls;
+       }
+       clk_data->hws[CLK_APMIXED_REF2USB_TX] = hw;
+
+       ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (ret) {
+               dev_err(dev, "Cannot register clock provider: %d\n", ret);
+               goto unregister_ref2usb;
+       }
+
+       /* Setup MD1 to avoid random crashes */
+       dev_dbg(dev, "Performing initial setup for MD1\n");
+       clk_mt6795_apmixed_setup_md1(base);
+
+       return 0;
+
+unregister_ref2usb:
+       mtk_clk_unregister_ref2usb_tx(clk_data->hws[CLK_APMIXED_REF2USB_TX]);
+unregister_plls:
+       mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
+free_clk_data:
+       mtk_free_clk_data(clk_data);
+       return ret;
+}
+
+static int clk_mt6795_apmixed_remove(struct platform_device *pdev)
+{
+       struct device_node *node = pdev->dev.of_node;
+       struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
+
+       of_clk_del_provider(node);
+       mtk_clk_unregister_ref2usb_tx(clk_data->hws[CLK_APMIXED_REF2USB_TX]);
+       mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
+       mtk_free_clk_data(clk_data);
+
+       return 0;
+}
+
+static struct platform_driver clk_mt6795_apmixed_drv = {
+       .probe = clk_mt6795_apmixed_probe,
+       .remove = clk_mt6795_apmixed_remove,
+       .driver = {
+               .name = "clk-mt6795-apmixed",
+               .of_match_table = of_match_clk_mt6795_apmixed,
+       },
+};
+module_platform_driver(clk_mt6795_apmixed_drv);
+
+MODULE_DESCRIPTION("MediaTek MT6795 apmixed clocks driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/clk/mediatek/clk-mt6795-infracfg.c b/drivers/clk/mediatek/clk-mt6795-infracfg.c
new file mode 100644 (file)
index 0000000..df7eed6
--- /dev/null
@@ -0,0 +1,151 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2022 Collabora Ltd.
+ * Author: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+ */
+
+#include <dt-bindings/clock/mediatek,mt6795-clk.h>
+#include <dt-bindings/reset/mediatek,mt6795-resets.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include "clk-cpumux.h"
+#include "clk-gate.h"
+#include "clk-mtk.h"
+#include "reset.h"
+
+#define GATE_ICG(_id, _name, _parent, _shift)                  \
+               GATE_MTK(_id, _name, _parent, &infra_cg_regs,   \
+                        _shift, &mtk_clk_gate_ops_no_setclr)
+
+static const struct mtk_gate_regs infra_cg_regs = {
+       .set_ofs = 0x0040,
+       .clr_ofs = 0x0044,
+       .sta_ofs = 0x0048,
+};
+
+static const char * const ca53_c0_parents[] = {
+       "clk26m",
+       "armca53pll",
+       "mainpll",
+       "univpll"
+};
+
+static const char * const ca53_c1_parents[] = {
+       "clk26m",
+       "armca53pll",
+       "mainpll",
+       "univpll"
+};
+
+static const struct mtk_composite cpu_muxes[] = {
+       MUX(CLK_INFRA_CA53_C0_SEL, "infra_ca53_c0_sel", ca53_c0_parents, 0x00, 0, 2),
+       MUX(CLK_INFRA_CA53_C1_SEL, "infra_ca53_c1_sel", ca53_c1_parents, 0x00, 2, 2),
+};
+
+static const struct mtk_gate infra_gates[] = {
+       GATE_ICG(CLK_INFRA_DBGCLK, "infra_dbgclk", "axi_sel", 0),
+       GATE_ICG(CLK_INFRA_SMI, "infra_smi", "mm_sel", 1),
+       GATE_ICG(CLK_INFRA_AUDIO, "infra_audio", "aud_intbus_sel", 5),
+       GATE_ICG(CLK_INFRA_GCE, "infra_gce", "axi_sel", 6),
+       GATE_ICG(CLK_INFRA_L2C_SRAM, "infra_l2c_sram", "axi_sel", 7),
+       GATE_ICG(CLK_INFRA_M4U, "infra_m4u", "mem_sel", 8),
+       GATE_ICG(CLK_INFRA_MD1MCU, "infra_md1mcu", "clk26m", 9),
+       GATE_ICG(CLK_INFRA_MD1BUS, "infra_md1bus", "axi_sel", 10),
+       GATE_ICG(CLK_INFRA_MD1DBB, "infra_dbb", "axi_sel", 11),
+       GATE_ICG(CLK_INFRA_DEVICE_APC, "infra_devapc", "clk26m", 12),
+       GATE_ICG(CLK_INFRA_TRNG, "infra_trng", "axi_sel", 13),
+       GATE_ICG(CLK_INFRA_MD1LTE, "infra_md1lte", "axi_sel", 14),
+       GATE_ICG(CLK_INFRA_CPUM, "infra_cpum", "cpum_ck", 15),
+       GATE_ICG(CLK_INFRA_KP, "infra_kp", "axi_sel", 16),
+};
+
+static u16 infra_ao_rst_ofs[] = { 0x30, 0x34 };
+
+static u16 infra_ao_idx_map[] = {
+       [MT6795_INFRA_RST0_SCPSYS_RST]    = 0 * RST_NR_PER_BANK + 5,
+       [MT6795_INFRA_RST0_PMIC_WRAP_RST] = 0 * RST_NR_PER_BANK + 7,
+       [MT6795_INFRA_RST1_MIPI_DSI_RST]  = 1 * RST_NR_PER_BANK + 4,
+       [MT6795_INFRA_RST1_MIPI_CSI_RST]  = 1 * RST_NR_PER_BANK + 7,
+       [MT6795_INFRA_RST1_MM_IOMMU_RST]  = 1 * RST_NR_PER_BANK + 15,
+};
+
+static const struct mtk_clk_rst_desc clk_rst_desc = {
+       .version = MTK_RST_SET_CLR,
+       .rst_bank_ofs = infra_ao_rst_ofs,
+       .rst_bank_nr = ARRAY_SIZE(infra_ao_rst_ofs),
+       .rst_idx_map = infra_ao_idx_map,
+       .rst_idx_map_nr = ARRAY_SIZE(infra_ao_idx_map),
+};
+
+static const struct of_device_id of_match_clk_mt6795_infracfg[] = {
+       { .compatible = "mediatek,mt6795-infracfg" },
+       { /* sentinel */ }
+};
+
+static int clk_mt6795_infracfg_probe(struct platform_device *pdev)
+{
+       struct clk_hw_onecell_data *clk_data;
+       struct device_node *node = pdev->dev.of_node;
+       void __iomem *base;
+       int ret;
+
+       base = devm_platform_ioremap_resource(pdev, 0);
+       if (IS_ERR(base))
+               return PTR_ERR(base);
+
+       clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
+       if (!clk_data)
+               return -ENOMEM;
+
+       ret = mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
+       if (ret)
+               goto free_clk_data;
+
+       ret = mtk_clk_register_gates(node, infra_gates, ARRAY_SIZE(infra_gates), clk_data);
+       if (ret)
+               goto free_clk_data;
+
+       ret = mtk_clk_register_cpumuxes(node, cpu_muxes, ARRAY_SIZE(cpu_muxes), clk_data);
+       if (ret)
+               goto unregister_gates;
+
+       ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (ret)
+               goto unregister_cpumuxes;
+
+       return 0;
+
+unregister_cpumuxes:
+       mtk_clk_unregister_cpumuxes(cpu_muxes, ARRAY_SIZE(cpu_muxes), clk_data);
+unregister_gates:
+       mtk_clk_unregister_gates(infra_gates, ARRAY_SIZE(infra_gates), clk_data);
+free_clk_data:
+       mtk_free_clk_data(clk_data);
+       return ret;
+}
+
+static int clk_mt6795_infracfg_remove(struct platform_device *pdev)
+{
+       struct device_node *node = pdev->dev.of_node;
+       struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
+
+       of_clk_del_provider(node);
+       mtk_clk_unregister_cpumuxes(cpu_muxes, ARRAY_SIZE(cpu_muxes), clk_data);
+       mtk_clk_unregister_gates(infra_gates, ARRAY_SIZE(infra_gates), clk_data);
+       mtk_free_clk_data(clk_data);
+
+       return 0;
+}
+
+static struct platform_driver clk_mt6795_infracfg_drv = {
+       .driver = {
+               .name = "clk-mt6795-infracfg",
+               .of_match_table = of_match_clk_mt6795_infracfg,
+       },
+       .probe = clk_mt6795_infracfg_probe,
+       .remove = clk_mt6795_infracfg_remove,
+};
+module_platform_driver(clk_mt6795_infracfg_drv);
+
+MODULE_DESCRIPTION("MediaTek MT6795 infracfg clocks driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/clk/mediatek/clk-mt6795-mfg.c b/drivers/clk/mediatek/clk-mt6795-mfg.c
new file mode 100644 (file)
index 0000000..ee7aab2
--- /dev/null
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2022 Collabora Ltd.
+ * Author: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+ */
+
+#include <dt-bindings/clock/mediatek,mt6795-clk.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include "clk-gate.h"
+#include "clk-mtk.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_BAXI, "mfg_baxi", "axi_mfg_in_sel", 0),
+       GATE_MFG(CLK_MFG_BMEM, "mfg_bmem", "mem_mfg_in_sel", 1),
+       GATE_MFG(CLK_MFG_BG3D, "mfg_bg3d", "mfg_sel", 2),
+       GATE_MFG(CLK_MFG_B26M, "mfg_b26m", "clk26m", 3),
+};
+
+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_mt6795_mfg[] = {
+       { .compatible = "mediatek,mt6795-mfgcfg", .data = &mfg_desc },
+       { /* sentinel */ }
+};
+
+static struct platform_driver clk_mt6795_mfg_drv = {
+       .driver = {
+               .name = "clk-mt6795-mfg",
+               .of_match_table = of_match_clk_mt6795_mfg,
+       },
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
+};
+module_platform_driver(clk_mt6795_mfg_drv);
+
+MODULE_DESCRIPTION("MediaTek MT6795 mfg clocks driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/clk/mediatek/clk-mt6795-mm.c b/drivers/clk/mediatek/clk-mt6795-mm.c
new file mode 100644 (file)
index 0000000..fd73f20
--- /dev/null
@@ -0,0 +1,132 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2022 Collabora Ltd.
+ * Author: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+ */
+
+#include <dt-bindings/clock/mediatek,mt6795-clk.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+#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)
+
+static const struct mtk_gate_regs mm0_cg_regs = {
+       .set_ofs = 0x0104,
+       .clr_ofs = 0x0108,
+       .sta_ofs = 0x0100,
+};
+
+static const struct mtk_gate_regs mm1_cg_regs = {
+       .set_ofs = 0x0114,
+       .clr_ofs = 0x0118,
+       .sta_ofs = 0x0110,
+};
+
+static const struct mtk_gate mm_gates[] = {
+       /* MM0 */
+       GATE_MM0(CLK_MM_SMI_COMMON, "mm_smi_common", "mm_sel", 0),
+       GATE_MM0(CLK_MM_SMI_LARB0, "mm_smi_larb0", "mm_sel", 1),
+       GATE_MM0(CLK_MM_CAM_MDP, "mm_cam_mdp", "mm_sel", 2),
+       GATE_MM0(CLK_MM_MDP_RDMA0, "mm_mdp_rdma0", "mm_sel", 3),
+       GATE_MM0(CLK_MM_MDP_RDMA1, "mm_mdp_rdma1", "mm_sel", 4),
+       GATE_MM0(CLK_MM_MDP_RSZ0, "mm_mdp_rsz0", "mm_sel", 5),
+       GATE_MM0(CLK_MM_MDP_RSZ1, "mm_mdp_rsz1", "mm_sel", 6),
+       GATE_MM0(CLK_MM_MDP_RSZ2, "mm_mdp_rsz2", "mm_sel", 7),
+       GATE_MM0(CLK_MM_MDP_TDSHP0, "mm_mdp_tdshp0", "mm_sel", 8),
+       GATE_MM0(CLK_MM_MDP_TDSHP1, "mm_mdp_tdshp1", "mm_sel", 9),
+       GATE_MM0(CLK_MM_MDP_CROP, "mm_mdp_crop", "mm_sel", 10),
+       GATE_MM0(CLK_MM_MDP_WDMA, "mm_mdp_wdma", "mm_sel", 11),
+       GATE_MM0(CLK_MM_MDP_WROT0, "mm_mdp_wrot0", "mm_sel", 12),
+       GATE_MM0(CLK_MM_MDP_WROT1, "mm_mdp_wrot1", "mm_sel", 13),
+       GATE_MM0(CLK_MM_FAKE_ENG, "mm_fake_eng", "mm_sel", 14),
+       GATE_MM0(CLK_MM_MUTEX_32K, "mm_mutex_32k", "clk32k", 15),
+       GATE_MM0(CLK_MM_DISP_OVL0, "mm_disp_ovl0", "mm_sel", 16),
+       GATE_MM0(CLK_MM_DISP_OVL1, "mm_disp_ovl1", "mm_sel", 17),
+       GATE_MM0(CLK_MM_DISP_RDMA0, "mm_disp_rdma0", "mm_sel", 18),
+       GATE_MM0(CLK_MM_DISP_RDMA1, "mm_disp_rdma1", "mm_sel", 19),
+       GATE_MM0(CLK_MM_DISP_RDMA2, "mm_disp_rdma2", "mm_sel", 20),
+       GATE_MM0(CLK_MM_DISP_WDMA0, "mm_disp_wdma0", "mm_sel", 21),
+       GATE_MM0(CLK_MM_DISP_WDMA1, "mm_disp_wdma1", "mm_sel", 22),
+       GATE_MM0(CLK_MM_DISP_COLOR0, "mm_disp_color0", "mm_sel", 23),
+       GATE_MM0(CLK_MM_DISP_COLOR1, "mm_disp_color1", "mm_sel", 24),
+       GATE_MM0(CLK_MM_DISP_AAL, "mm_disp_aal", "mm_sel", 25),
+       GATE_MM0(CLK_MM_DISP_GAMMA, "mm_disp_gamma", "mm_sel", 26),
+       GATE_MM0(CLK_MM_DISP_UFOE, "mm_disp_ufoe", "mm_sel", 27),
+       GATE_MM0(CLK_MM_DISP_SPLIT0, "mm_disp_split0", "mm_sel", 28),
+       GATE_MM0(CLK_MM_DISP_SPLIT1, "mm_disp_split1", "mm_sel", 29),
+       GATE_MM0(CLK_MM_DISP_MERGE, "mm_disp_merge", "mm_sel", 30),
+       GATE_MM0(CLK_MM_DISP_OD, "mm_disp_od", "mm_sel", 31),
+
+       /* MM1 */
+       GATE_MM1(CLK_MM_DISP_PWM0MM, "mm_disp_pwm0mm", "mm_sel", 0),
+       GATE_MM1(CLK_MM_DISP_PWM026M, "mm_disp_pwm026m", "pwm_sel", 1),
+       GATE_MM1(CLK_MM_DISP_PWM1MM, "mm_disp_pwm1mm", "mm_sel", 2),
+       GATE_MM1(CLK_MM_DISP_PWM126M, "mm_disp_pwm126m", "pwm_sel", 3),
+       GATE_MM1(CLK_MM_DSI0_ENGINE, "mm_dsi0_engine", "mm_sel", 4),
+       GATE_MM1(CLK_MM_DSI0_DIGITAL, "mm_dsi0_digital", "dsi0_dig", 5),
+       GATE_MM1(CLK_MM_DSI1_ENGINE, "mm_dsi1_engine", "mm_sel", 6),
+       GATE_MM1(CLK_MM_DSI1_DIGITAL, "mm_dsi1_digital", "dsi1_dig", 7),
+       GATE_MM1(CLK_MM_DPI_PIXEL, "mm_dpi_pixel", "dpi0_sel", 8),
+       GATE_MM1(CLK_MM_DPI_ENGINE, "mm_dpi_engine", "mm_sel", 9),
+};
+
+static int clk_mt6795_mm_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *node = dev->parent->of_node;
+       struct clk_hw_onecell_data *clk_data;
+       int ret;
+
+       clk_data = mtk_alloc_clk_data(CLK_MM_NR_CLK);
+       if (!clk_data)
+               return -ENOMEM;
+
+       ret = mtk_clk_register_gates(node, mm_gates, ARRAY_SIZE(mm_gates), clk_data);
+       if (ret)
+               goto free_clk_data;
+
+       ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (ret)
+               goto unregister_gates;
+
+       platform_set_drvdata(pdev, clk_data);
+
+       return 0;
+
+unregister_gates:
+       mtk_clk_unregister_gates(mm_gates, ARRAY_SIZE(mm_gates), clk_data);
+free_clk_data:
+       mtk_free_clk_data(clk_data);
+       return ret;
+}
+
+static int clk_mt6795_mm_remove(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *node = dev->parent->of_node;
+       struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
+
+       of_clk_del_provider(node);
+       mtk_clk_unregister_gates(mm_gates, ARRAY_SIZE(mm_gates), clk_data);
+       mtk_free_clk_data(clk_data);
+
+       return 0;
+}
+
+static struct platform_driver clk_mt6795_mm_drv = {
+       .driver = {
+               .name = "clk-mt6795-mm",
+       },
+       .probe = clk_mt6795_mm_probe,
+       .remove = clk_mt6795_mm_remove,
+};
+module_platform_driver(clk_mt6795_mm_drv);
+
+MODULE_DESCRIPTION("MediaTek MT6795 MultiMedia clocks driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/clk/mediatek/clk-mt6795-pericfg.c b/drivers/clk/mediatek/clk-mt6795-pericfg.c
new file mode 100644 (file)
index 0000000..cb28d35
--- /dev/null
@@ -0,0 +1,160 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2022 Collabora Ltd.
+ * Author: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+ */
+
+#include <dt-bindings/clock/mediatek,mt6795-clk.h>
+#include <dt-bindings/reset/mediatek,mt6795-resets.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include "clk-gate.h"
+#include "clk-mtk.h"
+#include "reset.h"
+
+#define GATE_PERI(_id, _name, _parent, _shift)                 \
+               GATE_MTK(_id, _name, _parent, &peri_cg_regs,    \
+                        _shift, &mtk_clk_gate_ops_setclr)
+
+static DEFINE_SPINLOCK(mt6795_peri_clk_lock);
+
+static const struct mtk_gate_regs peri_cg_regs = {
+       .set_ofs = 0x0008,
+       .clr_ofs = 0x0010,
+       .sta_ofs = 0x0018,
+};
+
+static const char * const uart_ck_sel_parents[] = {
+       "clk26m",
+       "uart_sel",
+};
+
+static const struct mtk_composite peri_clks[] = {
+       MUX(CLK_PERI_UART0_SEL, "uart0_ck_sel", uart_ck_sel_parents, 0x40c, 0, 1),
+       MUX(CLK_PERI_UART1_SEL, "uart1_ck_sel", uart_ck_sel_parents, 0x40c, 1, 1),
+       MUX(CLK_PERI_UART2_SEL, "uart2_ck_sel", uart_ck_sel_parents, 0x40c, 2, 1),
+       MUX(CLK_PERI_UART3_SEL, "uart3_ck_sel", uart_ck_sel_parents, 0x40c, 3, 1),
+};
+
+static const struct mtk_gate peri_gates[] = {
+       GATE_PERI(CLK_PERI_NFI, "peri_nfi", "axi_sel", 0),
+       GATE_PERI(CLK_PERI_THERM, "peri_therm", "axi_sel", 1),
+       GATE_PERI(CLK_PERI_PWM1, "peri_pwm1", "axi_sel", 2),
+       GATE_PERI(CLK_PERI_PWM2, "peri_pwm2", "axi_sel", 3),
+       GATE_PERI(CLK_PERI_PWM3, "peri_pwm3", "axi_sel", 4),
+       GATE_PERI(CLK_PERI_PWM4, "peri_pwm4", "axi_sel", 5),
+       GATE_PERI(CLK_PERI_PWM5, "peri_pwm5", "axi_sel", 6),
+       GATE_PERI(CLK_PERI_PWM6, "peri_pwm6", "axi_sel", 7),
+       GATE_PERI(CLK_PERI_PWM7, "peri_pwm7", "axi_sel", 8),
+       GATE_PERI(CLK_PERI_PWM, "peri_pwm", "axi_sel", 9),
+       GATE_PERI(CLK_PERI_USB0, "peri_usb0", "usb30_sel", 10),
+       GATE_PERI(CLK_PERI_USB1, "peri_usb1", "usb20_sel", 11),
+       GATE_PERI(CLK_PERI_AP_DMA, "peri_ap_dma", "axi_sel", 12),
+       GATE_PERI(CLK_PERI_MSDC30_0, "peri_msdc30_0", "msdc50_0_sel", 13),
+       GATE_PERI(CLK_PERI_MSDC30_1, "peri_msdc30_1", "msdc30_1_sel", 14),
+       GATE_PERI(CLK_PERI_MSDC30_2, "peri_msdc30_2", "msdc30_2_sel", 15),
+       GATE_PERI(CLK_PERI_MSDC30_3, "peri_msdc30_3", "msdc30_3_sel", 16),
+       GATE_PERI(CLK_PERI_NLI_ARB, "peri_nli_arb", "axi_sel", 17),
+       GATE_PERI(CLK_PERI_IRDA, "peri_irda", "irda_sel", 18),
+       GATE_PERI(CLK_PERI_UART0, "peri_uart0", "axi_sel", 19),
+       GATE_PERI(CLK_PERI_UART1, "peri_uart1", "axi_sel", 20),
+       GATE_PERI(CLK_PERI_UART2, "peri_uart2", "axi_sel", 21),
+       GATE_PERI(CLK_PERI_UART3, "peri_uart3", "axi_sel", 22),
+       GATE_PERI(CLK_PERI_I2C0, "peri_i2c0", "axi_sel", 23),
+       GATE_PERI(CLK_PERI_I2C1, "peri_i2c1", "axi_sel", 24),
+       GATE_PERI(CLK_PERI_I2C2, "peri_i2c2", "axi_sel", 25),
+       GATE_PERI(CLK_PERI_I2C3, "peri_i2c3", "axi_sel", 26),
+       GATE_PERI(CLK_PERI_I2C4, "peri_i2c4", "axi_sel", 27),
+       GATE_PERI(CLK_PERI_AUXADC, "peri_auxadc", "clk26m", 28),
+       GATE_PERI(CLK_PERI_SPI0, "peri_spi0", "spi_sel", 29),
+};
+
+static u16 peri_rst_ofs[] = { 0x0 };
+
+static u16 peri_idx_map[] = {
+       [MT6795_PERI_NFI_SW_RST]   = 14,
+       [MT6795_PERI_THERM_SW_RST] = 16,
+       [MT6795_PERI_MSDC1_SW_RST] = 20,
+};
+
+static const struct mtk_clk_rst_desc clk_rst_desc = {
+       .version = MTK_RST_SIMPLE,
+       .rst_bank_ofs = peri_rst_ofs,
+       .rst_bank_nr = ARRAY_SIZE(peri_rst_ofs),
+       .rst_idx_map = peri_idx_map,
+       .rst_idx_map_nr = ARRAY_SIZE(peri_idx_map),
+};
+
+static const struct of_device_id of_match_clk_mt6795_pericfg[] = {
+       { .compatible = "mediatek,mt6795-pericfg" },
+       { /* sentinel */ }
+};
+
+static int clk_mt6795_pericfg_probe(struct platform_device *pdev)
+{
+       struct clk_hw_onecell_data *clk_data;
+       struct device_node *node = pdev->dev.of_node;
+       void __iomem *base;
+       int ret;
+
+       base = devm_platform_ioremap_resource(pdev, 0);
+       if (IS_ERR(base))
+               return PTR_ERR(base);
+
+       clk_data = mtk_alloc_clk_data(CLK_PERI_NR_CLK);
+       if (!clk_data)
+               return -ENOMEM;
+
+       ret = mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
+       if (ret)
+               goto free_clk_data;
+
+       ret = mtk_clk_register_gates(node, peri_gates, ARRAY_SIZE(peri_gates), clk_data);
+       if (ret)
+               goto free_clk_data;
+
+       ret = mtk_clk_register_composites(peri_clks, ARRAY_SIZE(peri_clks), base,
+                                         &mt6795_peri_clk_lock, clk_data);
+       if (ret)
+               goto unregister_gates;
+
+       ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (ret)
+               goto unregister_composites;
+
+       return 0;
+
+unregister_composites:
+       mtk_clk_unregister_composites(peri_clks, ARRAY_SIZE(peri_clks), clk_data);
+unregister_gates:
+       mtk_clk_unregister_gates(peri_gates, ARRAY_SIZE(peri_gates), clk_data);
+free_clk_data:
+       mtk_free_clk_data(clk_data);
+       return ret;
+}
+
+static int clk_mt6795_pericfg_remove(struct platform_device *pdev)
+{
+       struct device_node *node = pdev->dev.of_node;
+       struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
+
+       of_clk_del_provider(node);
+       mtk_clk_unregister_composites(peri_clks, ARRAY_SIZE(peri_clks), clk_data);
+       mtk_clk_unregister_gates(peri_gates, ARRAY_SIZE(peri_gates), clk_data);
+       mtk_free_clk_data(clk_data);
+
+       return 0;
+}
+
+static struct platform_driver clk_mt6795_pericfg_drv = {
+       .driver = {
+               .name = "clk-mt6795-pericfg",
+               .of_match_table = of_match_clk_mt6795_pericfg,
+       },
+       .probe = clk_mt6795_pericfg_probe,
+       .remove = clk_mt6795_pericfg_remove,
+};
+module_platform_driver(clk_mt6795_pericfg_drv);
+
+MODULE_DESCRIPTION("MediaTek MT6795 pericfg clocks driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/clk/mediatek/clk-mt6795-topckgen.c b/drivers/clk/mediatek/clk-mt6795-topckgen.c
new file mode 100644 (file)
index 0000000..2948dd1
--- /dev/null
@@ -0,0 +1,610 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2022 Collabora Ltd.
+ * Author: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+ */
+
+#include <dt-bindings/clock/mediatek,mt6795-clk.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include "clk-gate.h"
+#include "clk-mtk.h"
+#include "clk-mux.h"
+
+/*
+ * For some clocks, we don't care what their actual rates are. And these
+ * clocks may change their rate on different products or different scenarios.
+ * So we model these clocks' rate as 0, to denote it's not an actual rate.
+ */
+#define DUMMY_RATE     0
+
+#define TOP_MUX_GATE_NOSR(_id, _name, _parents, _reg, _shift, _width, _gate, _flags) \
+               MUX_GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, _reg,          \
+                       (_reg + 0x4), (_reg + 0x8), _shift, _width,             \
+                       _gate, 0, -1, _flags)
+
+#define TOP_MUX_GATE(_id, _name, _parents, _reg, _shift, _width, _gate, _flags)        \
+               TOP_MUX_GATE_NOSR(_id, _name, _parents, _reg, _shift, _width,   \
+                                 _gate, CLK_SET_RATE_PARENT | _flags)
+
+static DEFINE_SPINLOCK(mt6795_top_clk_lock);
+
+static const char * const aud_1_parents[] = {
+       "clk26m",
+       "apll1_ck",
+       "univpll2_d4",
+       "univpll2_d8"
+};
+
+static const char * const aud_2_parents[] = {
+       "clk26m",
+       "apll2_ck",
+       "univpll2_d4",
+       "univpll2_d8"
+};
+
+static const char * const aud_intbus_parents[] = {
+       "clk26m",
+       "syspll1_d4",
+       "syspll4_d2",
+       "univpll3_d2",
+       "univpll2_d8",
+       "dmpll_d4",
+       "dmpll_d8"
+};
+
+static const char * const audio_parents[] = {
+       "clk26m",
+       "syspll3_d4",
+       "syspll4_d4",
+       "syspll1_d16"
+};
+
+static const char * const axi_mfg_in_parents[] = {
+       "clk26m",
+       "axi_sel",
+       "dmpll_d2"
+};
+
+static const char * const axi_parents[] = {
+       "clk26m",
+       "syspll1_d2",
+       "syspll_d5",
+       "syspll1_d4",
+       "univpll_d5",
+       "univpll2_d2",
+       "dmpll_d2",
+       "dmpll_d4"
+};
+
+static const char * const camtg_parents[] = {
+       "clk26m",
+       "univpll_d26",
+       "univpll2_d2",
+       "syspll3_d2",
+       "syspll3_d4",
+       "univpll1_d4",
+       "dmpll_d8"
+};
+
+static const char * const cci400_parents[] = {
+       "clk26m",
+       "vencpll_ck",
+       "clk26m",
+       "clk26m",
+       "univpll_d2",
+       "syspll_d2",
+       "msdcpll_ck",
+       "dmpll_ck"
+};
+
+static const char * const ddrphycfg_parents[] = {
+       "clk26m",
+       "syspll1_d8"
+};
+
+static const char * const dpi0_parents[] = {
+       "clk26m",
+       "tvdpll_d2",
+       "tvdpll_d4",
+       "clk26m",
+       "clk26m",
+       "tvdpll_d8",
+       "tvdpll_d16"
+};
+
+static const char * const i2s0_m_ck_parents[] = {
+       "apll1_div1",
+       "apll2_div1"
+};
+
+static const char * const i2s1_m_ck_parents[] = {
+       "apll1_div2",
+       "apll2_div2"
+};
+
+static const char * const i2s2_m_ck_parents[] = {
+       "apll1_div3",
+       "apll2_div3"
+};
+
+static const char * const i2s3_m_ck_parents[] = {
+       "apll1_div4",
+       "apll2_div4"
+};
+
+static const char * const i2s3_b_ck_parents[] = {
+       "apll1_div5",
+       "apll2_div5"
+};
+
+static const char * const irda_parents[] = {
+       "clk26m",
+       "univpll2_d4",
+       "syspll2_d4",
+       "dmpll_d8",
+};
+
+static const char * const mem_mfg_in_parents[] = {
+       "clk26m",
+       "mmpll_ck",
+       "dmpll_ck"
+};
+
+static const char * const mem_parents[] = {
+       "clk26m",
+       "dmpll_ck"
+};
+
+static const char * const mfg_parents[] = {
+       "clk26m",
+       "mmpll_ck",
+       "dmpll_ck",
+       "clk26m",
+       "clk26m",
+       "clk26m",
+       "clk26m",
+       "clk26m",
+       "clk26m",
+       "syspll_d3",
+       "syspll1_d2",
+       "syspll_d5",
+       "univpll_d3",
+       "univpll1_d2",
+       "univpll_d5",
+       "univpll2_d2"
+};
+
+static const char * const mm_parents[] = {
+       "clk26m",
+       "vencpll_d2",
+       "syspll_d3",
+       "syspll1_d2",
+       "syspll_d5",
+       "syspll1_d4",
+       "univpll1_d2",
+       "univpll2_d2",
+       "dmpll_d2"
+};
+
+static const char * const mjc_parents[] = {
+       "clk26m",
+       "univpll_d3",
+       "vcodecpll_ck",
+       "tvdpll_445p5m",
+       "vencpll_d2",
+       "syspll_d3",
+       "univpll1_d2",
+       "syspll_d5",
+       "syspll1_d2",
+       "univpll_d5",
+       "univpll2_d2",
+       "dmpll_ck"
+};
+
+static const char * const msdc50_0_h_parents[] = {
+       "clk26m",
+       "syspll1_d2",
+       "syspll2_d2",
+       "syspll4_d2",
+       "univpll_d5",
+       "univpll1_d4"
+};
+
+static const char * const msdc50_0_parents[] = {
+       "clk26m",
+       "msdcpll_ck",
+       "msdcpll_d2",
+       "univpll1_d4",
+       "syspll2_d2",
+       "syspll_d7",
+       "msdcpll_d4",
+       "vencpll_d4",
+       "tvdpll_ck",
+       "univpll_d2",
+       "univpll1_d2",
+       "mmpll_ck"
+};
+
+static const char * const msdc30_1_parents[] = {
+       "clk26m",
+       "univpll2_d2",
+       "msdcpll_d4",
+       "univpll1_d4",
+       "syspll2_d2",
+       "syspll_d7",
+       "univpll_d7",
+       "vencpll_d4"
+};
+
+static const char * const msdc30_2_parents[] = {
+       "clk26m",
+       "univpll2_d2",
+       "msdcpll_d4",
+       "univpll1_d4",
+       "syspll2_d2",
+       "syspll_d7",
+       "univpll_d7",
+       "vencpll_d2"
+};
+
+static const char * const msdc30_3_parents[] = {
+       "clk26m",
+       "univpll2_d2",
+       "msdcpll_d4",
+       "univpll1_d4",
+       "syspll2_d2",
+       "syspll_d7",
+       "univpll_d7",
+       "vencpll_d4"
+};
+
+static const char * const pmicspi_parents[] = {
+       "clk26m",
+       "syspll1_d8",
+       "syspll3_d4",
+       "syspll1_d16",
+       "univpll3_d4",
+       "univpll_d26",
+       "dmpll_d8",
+       "dmpll_d16"
+};
+
+static const char * const pwm_parents[] = {
+       "clk26m",
+       "univpll2_d4",
+       "univpll3_d2",
+       "univpll1_d4"
+};
+
+static const char * const scam_parents[] = {
+       "clk26m",
+       "syspll3_d2",
+       "univpll2_d4",
+       "dmpll_d4"
+};
+
+static const char * const scp_parents[] = {
+       "clk26m",
+       "syspll1_d2",
+       "univpll_d5",
+       "syspll_d5",
+       "dmpll_d2",
+       "dmpll_d4"
+};
+
+static const char * const spi_parents[] = {
+       "clk26m",
+       "syspll3_d2",
+       "syspll1_d4",
+       "syspll4_d2",
+       "univpll3_d2",
+       "univpll2_d4",
+       "univpll1_d8"
+};
+
+static const char * const uart_parents[] = {
+       "clk26m",
+       "univpll2_d8"
+};
+
+static const char * const usb20_parents[] = {
+       "clk26m",
+       "univpll1_d8",
+       "univpll3_d4"
+};
+
+static const char * const usb30_parents[] = {
+       "clk26m",
+       "univpll3_d2",
+       "usb_syspll_125m",
+       "univpll2_d4"
+};
+
+static const char * const vdec_parents[] = {
+       "clk26m",
+       "vcodecpll_ck",
+       "tvdpll_445p5m",
+       "univpll_d3",
+       "vencpll_d2",
+       "syspll_d3",
+       "univpll1_d2",
+       "mmpll_d2",
+       "dmpll_d2",
+       "dmpll_d4"
+};
+
+static const char * const venc_parents[] = {
+       "clk26m",
+       "vcodecpll_ck",
+       "tvdpll_445p5m",
+       "univpll_d3",
+       "vencpll_d2",
+       "syspll_d3",
+       "univpll1_d2",
+       "univpll2_d2",
+       "dmpll_d2",
+       "dmpll_d4"
+};
+
+static const struct mtk_fixed_clk fixed_clks[] = {
+       FIXED_CLK(CLK_TOP_ADSYS_26M, "adsys_26m", "clk26m", 26 * MHZ),
+       FIXED_CLK(CLK_TOP_CLKPH_MCK_O, "clkph_mck_o", "clk26m", DUMMY_RATE),
+       FIXED_CLK(CLK_TOP_USB_SYSPLL_125M, "usb_syspll_125m", "clk26m", 125 * MHZ),
+       FIXED_CLK(CLK_TOP_DSI0_DIG, "dsi0_dig", "clk26m", DUMMY_RATE),
+       FIXED_CLK(CLK_TOP_DSI1_DIG, "dsi1_dig", "clk26m", DUMMY_RATE),
+};
+
+static const struct mtk_fixed_factor top_divs[] = {
+       FACTOR(CLK_TOP_ARMCA53PLL_754M, "armca53pll_754m", "clk26m", 1, 2),
+       FACTOR(CLK_TOP_ARMCA53PLL_502M, "armca53pll_502m", "clk26m", 1, 3),
+
+       FACTOR(CLK_TOP_MAIN_H546M, "main_h546m", "mainpll", 1, 2),
+       FACTOR(CLK_TOP_MAIN_H364M, "main_h364m", "mainpll", 1, 3),
+       FACTOR(CLK_TOP_MAIN_H218P4M, "main_h218p4m", "mainpll", 1, 5),
+       FACTOR(CLK_TOP_MAIN_H156M, "main_h156m", "mainpll", 1, 7),
+
+       FACTOR(CLK_TOP_TVDPLL_445P5M, "tvdpll_445p5m", "tvdpll", 1, 4),
+       FACTOR(CLK_TOP_TVDPLL_594M, "tvdpll_594m", "tvdpll", 1, 3),
+
+       FACTOR(CLK_TOP_UNIV_624M, "univ_624m", "univpll", 1, 2),
+       FACTOR(CLK_TOP_UNIV_416M, "univ_416m", "univpll", 1, 3),
+       FACTOR(CLK_TOP_UNIV_249P6M, "univ_249p6m", "univpll", 1, 5),
+       FACTOR(CLK_TOP_UNIV_178P3M, "univ_178p3m", "univpll", 1, 7),
+       FACTOR(CLK_TOP_UNIV_48M, "univ_48m", "univpll", 1, 26),
+
+       FACTOR(CLK_TOP_CLKRTC_EXT, "clkrtc_ext", "clk32k", 1, 1),
+       FACTOR(CLK_TOP_CLKRTC_INT, "clkrtc_int", "clk26m", 1, 793),
+       FACTOR(CLK_TOP_FPC, "fpc_ck", "clk26m", 1, 1),
+
+       FACTOR(CLK_TOP_HDMITXPLL_D2, "hdmitxpll_d2", "clk26m", 1, 2),
+       FACTOR(CLK_TOP_HDMITXPLL_D3, "hdmitxpll_d3", "clk26m", 1, 3),
+
+       FACTOR(CLK_TOP_ARMCA53PLL_D2, "armca53pll_d2", "clk26m", 1, 1),
+       FACTOR(CLK_TOP_ARMCA53PLL_D3, "armca53pll_d3", "clk26m", 1, 1),
+
+       FACTOR(CLK_TOP_APLL1, "apll1_ck", "apll1", 1, 1),
+       FACTOR(CLK_TOP_APLL2, "apll2_ck", "apll2", 1, 1),
+
+       FACTOR(CLK_TOP_DMPLL, "dmpll_ck", "clkph_mck_o", 1, 1),
+       FACTOR(CLK_TOP_DMPLL_D2, "dmpll_d2", "clkph_mck_o", 1, 2),
+       FACTOR(CLK_TOP_DMPLL_D4, "dmpll_d4", "clkph_mck_o", 1, 4),
+       FACTOR(CLK_TOP_DMPLL_D8, "dmpll_d8", "clkph_mck_o", 1, 8),
+       FACTOR(CLK_TOP_DMPLL_D16, "dmpll_d16", "clkph_mck_o", 1, 16),
+
+       FACTOR(CLK_TOP_MMPLL, "mmpll_ck", "mmpll", 1, 1),
+       FACTOR(CLK_TOP_MMPLL_D2, "mmpll_d2", "mmpll", 1, 2),
+
+       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_MSDCPLL2, "msdcpll2_ck", "msdcpll2", 1, 1),
+       FACTOR(CLK_TOP_MSDCPLL2_D2, "msdcpll2_d2", "msdcpll2", 1, 2),
+       FACTOR(CLK_TOP_MSDCPLL2_D4, "msdcpll2_d4", "msdcpll2", 1, 4),
+
+       FACTOR(CLK_TOP_SYSPLL_D2, "syspll_d2", "main_h546m", 1, 1),
+       FACTOR(CLK_TOP_SYSPLL1_D2, "syspll1_d2", "main_h546m", 1, 2),
+       FACTOR(CLK_TOP_SYSPLL1_D4, "syspll1_d4", "main_h546m", 1, 4),
+       FACTOR(CLK_TOP_SYSPLL1_D8, "syspll1_d8", "main_h546m", 1, 8),
+       FACTOR(CLK_TOP_SYSPLL1_D16, "syspll1_d16", "main_h546m", 1, 16),
+       FACTOR(CLK_TOP_SYSPLL_D3, "syspll_d3", "main_h364m", 1, 1),
+       FACTOR(CLK_TOP_SYSPLL2_D2, "syspll2_d2", "main_h364m", 1, 2),
+       FACTOR(CLK_TOP_SYSPLL2_D4, "syspll2_d4", "main_h364m", 1, 4),
+       FACTOR(CLK_TOP_SYSPLL_D5, "syspll_d5", "main_h218p4m", 1, 1),
+       FACTOR(CLK_TOP_SYSPLL3_D2, "syspll3_d2", "main_h218p4m", 1, 2),
+       FACTOR(CLK_TOP_SYSPLL3_D4, "syspll3_d4", "main_h218p4m", 1, 4),
+       FACTOR(CLK_TOP_SYSPLL_D7, "syspll_d7", "main_h156m", 1, 1),
+       FACTOR(CLK_TOP_SYSPLL4_D2, "syspll4_d2", "main_h156m", 1, 2),
+       FACTOR(CLK_TOP_SYSPLL4_D4, "syspll4_d4", "main_h156m", 1, 4),
+
+       FACTOR(CLK_TOP_TVDPLL, "tvdpll_ck", "tvdpll_594m", 1, 1),
+       FACTOR(CLK_TOP_TVDPLL_D2, "tvdpll_d2", "tvdpll_594m", 1, 2),
+       FACTOR(CLK_TOP_TVDPLL_D4, "tvdpll_d4", "tvdpll_594m", 1, 4),
+       FACTOR(CLK_TOP_TVDPLL_D8, "tvdpll_d8", "tvdpll_594m", 1, 8),
+       FACTOR(CLK_TOP_TVDPLL_D16, "tvdpll_d16", "tvdpll_594m", 1, 16),
+
+       FACTOR(CLK_TOP_UNIVPLL_D2, "univpll_d2", "univ_624m", 1, 1),
+       FACTOR(CLK_TOP_UNIVPLL1_D2, "univpll1_d2", "univ_624m", 1, 2),
+       FACTOR(CLK_TOP_UNIVPLL1_D4, "univpll1_d4", "univ_624m", 1, 4),
+       FACTOR(CLK_TOP_UNIVPLL1_D8, "univpll1_d8", "univ_624m", 1, 8),
+       FACTOR(CLK_TOP_UNIVPLL_D3, "univpll_d3", "univ_416m", 1, 1),
+       FACTOR(CLK_TOP_UNIVPLL2_D2, "univpll2_d2", "univ_416m", 1, 2),
+       FACTOR(CLK_TOP_UNIVPLL2_D4, "univpll2_d4", "univ_416m", 1, 4),
+       FACTOR(CLK_TOP_UNIVPLL2_D8, "univpll2_d8", "univ_416m", 1, 8),
+       FACTOR(CLK_TOP_UNIVPLL_D5, "univpll_d5", "univ_249p6m", 1, 1),
+       FACTOR(CLK_TOP_UNIVPLL3_D2, "univpll3_d2", "univ_249p6m", 1, 2),
+       FACTOR(CLK_TOP_UNIVPLL3_D4, "univpll3_d4", "univ_249p6m", 1, 4),
+       FACTOR(CLK_TOP_UNIVPLL3_D8, "univpll3_d8", "univ_249p6m", 1, 8),
+       FACTOR(CLK_TOP_UNIVPLL_D7, "univpll_d7", "univ_178p3m", 1, 1),
+       FACTOR(CLK_TOP_UNIVPLL_D26, "univpll_d26", "univ_48m", 1, 1),
+       FACTOR(CLK_TOP_UNIVPLL_D52, "univpll_d52", "univ_48m", 1, 2),
+
+       FACTOR(CLK_TOP_VCODECPLL, "vcodecpll_ck", "vcodecpll", 1, 3),
+       FACTOR(CLK_TOP_VCODECPLL_370P5, "vcodecpll_370p5", "vcodecpll", 1, 4),
+
+       FACTOR(CLK_TOP_VENCPLL, "vencpll_ck", "vencpll", 1, 1),
+       FACTOR(CLK_TOP_VENCPLL_D2, "vencpll_d2", "vencpll", 1, 2),
+       FACTOR(CLK_TOP_VENCPLL_D4, "vencpll_d4", "vencpll", 1, 4),
+};
+
+static const struct mtk_mux top_muxes[] = {
+       /* CLK_CFG_0 */
+       TOP_MUX_GATE_NOSR(CLK_TOP_AXI_SEL, "axi_sel", axi_parents,
+                         0x40, 0, 3, 7, CLK_IS_CRITICAL),
+       TOP_MUX_GATE_NOSR(CLK_TOP_MEM_SEL, "mem_sel", mem_parents,
+                         0x40, 8, 1, 15, CLK_IS_CRITICAL),
+       TOP_MUX_GATE(CLK_TOP_DDRPHYCFG_SEL, "ddrphycfg_sel", ddrphycfg_parents,
+                    0x40, 16, 1, 23, CLK_IS_CRITICAL),
+       TOP_MUX_GATE(CLK_TOP_MM_SEL, "mm_sel", mm_parents, 0x40, 24, 3, 31, 0),
+       /* CLK_CFG_1 */
+       TOP_MUX_GATE(CLK_TOP_PWM_SEL, "pwm_sel", pwm_parents, 0x50, 0, 2, 7, 0),
+       TOP_MUX_GATE(CLK_TOP_VDEC_SEL, "vdec_sel", vdec_parents, 0x50, 8, 4, 15, 0),
+       TOP_MUX_GATE(CLK_TOP_VENC_SEL, "venc_sel", venc_parents, 0x50, 16, 4, 23, 0),
+       TOP_MUX_GATE(CLK_TOP_MFG_SEL, "mfg_sel", mfg_parents, 0x50, 24, 4, 31, 0),
+       /* CLK_CFG_2 */
+       TOP_MUX_GATE(CLK_TOP_CAMTG_SEL, "camtg_sel", camtg_parents, 0x60, 0, 3, 7, 0),
+       TOP_MUX_GATE(CLK_TOP_UART_SEL, "uart_sel", uart_parents, 0x60, 8, 1, 15, 0),
+       TOP_MUX_GATE(CLK_TOP_SPI_SEL, "spi_sel", spi_parents, 0x60, 16, 3, 23, 0),
+       TOP_MUX_GATE(CLK_TOP_USB20_SEL, "usb20_sel", usb20_parents, 0x60, 24, 2, 31, 0),
+       /* CLK_CFG_3 */
+       TOP_MUX_GATE(CLK_TOP_USB30_SEL, "usb30_sel", usb30_parents, 0x70, 0, 2, 7, 0),
+       TOP_MUX_GATE(CLK_TOP_MSDC50_0_H_SEL, "msdc50_0_h_sel", msdc50_0_h_parents,
+                    0x70, 8, 3, 15, 0),
+       TOP_MUX_GATE(CLK_TOP_MSDC50_0_SEL, "msdc50_0_sel", msdc50_0_parents, 0x70, 16, 4, 23, 0),
+       TOP_MUX_GATE(CLK_TOP_MSDC30_1_SEL, "msdc30_1_sel", msdc30_1_parents, 0x70, 24, 3, 31, 0),
+       /* CLK_CFG_4 */
+       TOP_MUX_GATE(CLK_TOP_MSDC30_2_SEL, "msdc30_2_sel", msdc30_2_parents, 0x80, 0, 3, 7, 0),
+       TOP_MUX_GATE(CLK_TOP_MSDC30_3_SEL, "msdc30_3_sel", msdc30_3_parents, 0x80, 8, 3, 15, 0),
+       TOP_MUX_GATE(CLK_TOP_AUDIO_SEL, "audio_sel", audio_parents, 0x80, 16, 2, 23, 0),
+       TOP_MUX_GATE(CLK_TOP_AUD_INTBUS_SEL, "aud_intbus_sel", aud_intbus_parents,
+                    0x80, 24, 3, 31, 0),
+       /* CLK_CFG_5 */
+       TOP_MUX_GATE(CLK_TOP_PMICSPI_SEL, "pmicspi_sel", pmicspi_parents, 0x90, 0, 3, 5, 0),
+       TOP_MUX_GATE(CLK_TOP_SCP_SEL, "scp_sel", scp_parents, 0x90, 8, 3, 15, 0),
+       TOP_MUX_GATE(CLK_TOP_MJC_SEL, "mjc_sel", mjc_parents, 0x90, 24, 4, 31, 0),
+       /* CLK_CFG_6 */
+       /*
+        * The dpi0_sel clock should not propagate rate changes to its parent
+        * clock so the dpi driver can have full control over PLL and divider.
+        */
+       TOP_MUX_GATE_NOSR(CLK_TOP_DPI0_SEL, "dpi0_sel", dpi0_parents, 0xa0, 0, 3, 7, 0),
+       TOP_MUX_GATE(CLK_TOP_IRDA_SEL, "irda_sel", irda_parents, 0xa0, 8, 2, 15, 0),
+       TOP_MUX_GATE(CLK_TOP_CCI400_SEL, "cci400_sel", cci400_parents,
+                    0xa0, 16, 3, 23, CLK_IS_CRITICAL),
+       TOP_MUX_GATE(CLK_TOP_AUD_1_SEL, "aud_1_sel", aud_1_parents, 0xa0, 24, 2, 31, 0),
+       /* CLK_CFG_7 */
+       TOP_MUX_GATE(CLK_TOP_AUD_2_SEL, "aud_2_sel", aud_2_parents, 0xb0, 0, 2, 7, 0),
+       TOP_MUX_GATE(CLK_TOP_MEM_MFG_IN_SEL, "mem_mfg_in_sel", mem_mfg_in_parents,
+                    0xb0, 8, 2, 15, 0),
+       TOP_MUX_GATE(CLK_TOP_AXI_MFG_IN_SEL, "axi_mfg_in_sel", axi_mfg_in_parents,
+                    0xb0, 16, 2, 23, 0),
+       TOP_MUX_GATE(CLK_TOP_SCAM_SEL, "scam_sel", scam_parents, 0xb0, 24, 2, 31, 0),
+};
+
+static struct mtk_composite top_aud_divs[] = {
+       MUX(CLK_TOP_I2S0_M_SEL, "i2s0_m_ck_sel", i2s0_m_ck_parents, 0x120, 4, 1),
+       MUX(CLK_TOP_I2S1_M_SEL, "i2s1_m_ck_sel", i2s1_m_ck_parents, 0x120, 5, 1),
+       MUX(CLK_TOP_I2S2_M_SEL, "i2s2_m_ck_sel", i2s2_m_ck_parents, 0x120, 6, 1),
+       MUX(CLK_TOP_I2S3_M_SEL, "i2s3_m_ck_sel", i2s3_m_ck_parents, 0x120, 7, 1),
+       MUX(CLK_TOP_I2S3_B_SEL, "i2s3_b_ck_sel", i2s3_b_ck_parents, 0x120, 8, 1),
+
+       DIV_GATE(CLK_TOP_APLL1_DIV0, "apll1_div0", "aud_1_sel", 0x12c, 8, 0x120, 4, 24),
+       DIV_GATE(CLK_TOP_APLL1_DIV1, "apll1_div1", "aud_1_sel", 0x12c, 9, 0x124, 8, 0),
+       DIV_GATE(CLK_TOP_APLL1_DIV2, "apll1_div2", "aud_1_sel", 0x12c, 10, 0x124, 8, 8),
+       DIV_GATE(CLK_TOP_APLL1_DIV3, "apll1_div3", "aud_1_sel", 0x12c, 11, 0x124, 8, 16),
+       DIV_GATE(CLK_TOP_APLL1_DIV4, "apll1_div4", "aud_1_sel", 0x12c, 12, 0x124, 8, 24),
+       DIV_GATE(CLK_TOP_APLL1_DIV5, "apll1_div5", "apll1_div4", 0x12c, 13, 0x12c, 4, 0),
+
+       DIV_GATE(CLK_TOP_APLL2_DIV0, "apll2_div0", "aud_2_sel", 0x12c, 16, 0x120, 4, 28),
+       DIV_GATE(CLK_TOP_APLL2_DIV1, "apll2_div1", "aud_2_sel", 0x12c, 17, 0x128, 8, 0),
+       DIV_GATE(CLK_TOP_APLL2_DIV2, "apll2_div2", "aud_2_sel", 0x12c, 18, 0x128, 8, 8),
+       DIV_GATE(CLK_TOP_APLL2_DIV3, "apll2_div3", "aud_2_sel", 0x12c, 19, 0x128, 8, 16),
+       DIV_GATE(CLK_TOP_APLL2_DIV4, "apll2_div4", "aud_2_sel", 0x12c, 20, 0x128, 8, 24),
+       DIV_GATE(CLK_TOP_APLL2_DIV5, "apll2_div5", "apll2_div4", 0x12c, 21, 0x12c, 4, 4),
+};
+
+
+static const struct of_device_id of_match_clk_mt6795_topckgen[] = {
+       { .compatible = "mediatek,mt6795-topckgen" },
+       { /* sentinel */ }
+};
+
+static int clk_mt6795_topckgen_probe(struct platform_device *pdev)
+{
+       struct clk_hw_onecell_data *clk_data;
+       struct device_node *node = pdev->dev.of_node;
+       void __iomem *base;
+       int ret;
+
+       base = devm_platform_ioremap_resource(pdev, 0);
+       if (IS_ERR(base))
+               return PTR_ERR(base);
+
+       clk_data = mtk_alloc_clk_data(CLK_TOP_NR_CLK);
+       if (!clk_data)
+               return -ENOMEM;
+
+       ret = mtk_clk_register_fixed_clks(fixed_clks, ARRAY_SIZE(fixed_clks), clk_data);
+       if (ret)
+               goto free_clk_data;
+
+       ret = mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
+       if (ret)
+               goto unregister_fixed_clks;
+
+       ret = mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes), node,
+                                    &mt6795_top_clk_lock, clk_data);
+       if (ret)
+               goto unregister_factors;
+
+       ret = mtk_clk_register_composites(top_aud_divs, ARRAY_SIZE(top_aud_divs), base,
+                                         &mt6795_top_clk_lock, clk_data);
+       if (ret)
+               goto unregister_muxes;
+
+       ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (ret)
+               goto unregister_composites;
+
+       return 0;
+
+unregister_composites:
+       mtk_clk_unregister_composites(top_aud_divs, ARRAY_SIZE(top_aud_divs), clk_data);
+unregister_muxes:
+       mtk_clk_unregister_muxes(top_muxes, ARRAY_SIZE(top_muxes), clk_data);
+unregister_factors:
+       mtk_clk_unregister_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
+unregister_fixed_clks:
+       mtk_clk_unregister_fixed_clks(fixed_clks, ARRAY_SIZE(fixed_clks), clk_data);
+free_clk_data:
+       mtk_free_clk_data(clk_data);
+       return ret;
+}
+
+static int clk_mt6795_topckgen_remove(struct platform_device *pdev)
+{
+       struct device_node *node = pdev->dev.of_node;
+       struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev);
+
+       of_clk_del_provider(node);
+       mtk_clk_unregister_composites(top_aud_divs, ARRAY_SIZE(top_aud_divs), clk_data);
+       mtk_clk_unregister_muxes(top_muxes, ARRAY_SIZE(top_muxes), clk_data);
+       mtk_clk_unregister_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
+       mtk_clk_unregister_fixed_clks(fixed_clks, ARRAY_SIZE(fixed_clks), clk_data);
+       mtk_free_clk_data(clk_data);
+
+       return 0;
+}
+
+static struct platform_driver clk_mt6795_topckgen_drv = {
+       .driver = {
+               .name = "clk-mt6795-topckgen",
+               .of_match_table = of_match_clk_mt6795_topckgen,
+       },
+       .probe = clk_mt6795_topckgen_probe,
+       .remove = clk_mt6795_topckgen_remove,
+};
+module_platform_driver(clk_mt6795_topckgen_drv);
+
+MODULE_DESCRIPTION("MediaTek MT6795 topckgen clocks driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/clk/mediatek/clk-mt6795-vdecsys.c b/drivers/clk/mediatek/clk-mt6795-vdecsys.c
new file mode 100644 (file)
index 0000000..d85d04e
--- /dev/null
@@ -0,0 +1,55 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2022 Collabora Ltd.
+ * Author: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+ */
+
+#include <dt-bindings/clock/mediatek,mt6795-clk.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+#define GATE_VDEC(_id, _name, _parent, _regs)                  \
+               GATE_MTK(_id, _name, _parent, _regs, 0,         \
+                        &mtk_clk_gate_ops_setclr_inv)
+
+static const struct mtk_gate_regs vdec0_cg_regs = {
+       .set_ofs = 0x0000,
+       .clr_ofs = 0x0004,
+       .sta_ofs = 0x0000,
+};
+
+static const struct mtk_gate_regs vdec1_cg_regs = {
+       .set_ofs = 0x0008,
+       .clr_ofs = 0x000c,
+       .sta_ofs = 0x0008,
+};
+
+static const struct mtk_gate vdec_clks[] = {
+       GATE_VDEC(CLK_VDEC_CKEN, "vdec_cken", "vdec_sel", &vdec0_cg_regs),
+       GATE_VDEC(CLK_VDEC_LARB_CKEN, "vdec_larb_cken", "mm_sel", &vdec1_cg_regs),
+};
+
+static const struct mtk_clk_desc vdec_desc = {
+       .clks = vdec_clks,
+       .num_clks = ARRAY_SIZE(vdec_clks),
+};
+
+static const struct of_device_id of_match_clk_mt6795_vdecsys[] = {
+       { .compatible = "mediatek,mt6795-vdecsys", .data = &vdec_desc },
+       { /* sentinel */ }
+};
+
+static struct platform_driver clk_mt6795_vdecsys_drv = {
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
+       .driver = {
+               .name = "clk-mt6795-vdecsys",
+               .of_match_table = of_match_clk_mt6795_vdecsys,
+       },
+};
+module_platform_driver(clk_mt6795_vdecsys_drv);
+
+MODULE_DESCRIPTION("MediaTek MT6795 vdecsys clocks driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/clk/mediatek/clk-mt6795-vencsys.c b/drivers/clk/mediatek/clk-mt6795-vencsys.c
new file mode 100644 (file)
index 0000000..de40a98
--- /dev/null
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2022 Collabora Ltd.
+ * Author: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+ */
+
+#include <dt-bindings/clock/mediatek,mt6795-clk.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+static const struct mtk_gate_regs venc_cg_regs = {
+       .set_ofs = 0x4,
+       .clr_ofs = 0x8,
+       .sta_ofs = 0x0,
+};
+
+#define GATE_VENC(_id, _name, _parent, _shift)                 \
+       GATE_MTK(_id, _name, _parent, &venc_cg_regs, _shift, &mtk_clk_gate_ops_setclr_inv)
+
+static const struct mtk_gate venc_clks[] = {
+       GATE_VENC(CLK_VENC_LARB, "venc_larb", "venc_sel", 0),
+       GATE_VENC(CLK_VENC_VENC, "venc_venc", "venc_sel", 4),
+       GATE_VENC(CLK_VENC_JPGENC, "venc_jpgenc", "venc_sel", 8),
+       GATE_VENC(CLK_VENC_JPGDEC, "venc_jpgdec", "venc_sel", 12),
+};
+
+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_mt6795_vencsys[] = {
+       { .compatible = "mediatek,mt6795-vencsys", .data = &venc_desc },
+       { /* sentinel */ }
+};
+
+static struct platform_driver clk_mt6795_vencsys_drv = {
+       .driver = {
+               .name = "clk-mt6795-vencsys",
+               .of_match_table = of_match_clk_mt6795_vencsys,
+       },
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
+};
+module_platform_driver(clk_mt6795_vencsys_drv);
+
+MODULE_DESCRIPTION("MediaTek MT6795 vdecsys clocks driver");
+MODULE_LICENSE("GPL");
index 25d17db..7c6a53f 100644 (file)
@@ -32,33 +32,23 @@ static const struct mtk_gate img_clks[] = {
        GATE_IMG(CLK_IMG_LARB6, "img_larb6", "mm_sel", 0),
 };
 
-static const struct of_device_id of_match_clk_mt6797_img[] = {
-       { .compatible = "mediatek,mt6797-imgsys", },
-       {}
+static const struct mtk_clk_desc img_desc = {
+       .clks = img_clks,
+       .num_clks = ARRAY_SIZE(img_clks),
 };
 
-static int clk_mt6797_img_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       int r;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_IMG_NR);
-
-       mtk_clk_register_gates(node, img_clks, ARRAY_SIZE(img_clks),
-                              clk_data);
-
-       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-       if (r)
-               dev_err(&pdev->dev,
-                       "could not register clock provider: %s: %d\n",
-                       pdev->name, r);
-
-       return r;
-}
+static const struct of_device_id of_match_clk_mt6797_img[] = {
+       {
+               .compatible = "mediatek,mt6797-imgsys",
+               .data = &img_desc,
+       }, {
+               /* sentinel */
+       }
+};
 
 static struct platform_driver clk_mt6797_img_drv = {
-       .probe = clk_mt6797_img_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt6797-img",
                .of_match_table = of_match_clk_mt6797_img,
index de85789..6120fcc 100644 (file)
@@ -49,33 +49,23 @@ static const struct mtk_gate vdec_clks[] = {
        GATE_VDEC1(CLK_VDEC_LARB1_CKEN, "vdec_larb1_cken", "mm_sel", 0),
 };
 
-static const struct of_device_id of_match_clk_mt6797_vdec[] = {
-       { .compatible = "mediatek,mt6797-vdecsys", },
-       {}
+static const struct mtk_clk_desc vdec_desc = {
+       .clks = vdec_clks,
+       .num_clks = ARRAY_SIZE(vdec_clks),
 };
 
-static int clk_mt6797_vdec_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       int r;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_VDEC_NR);
-
-       mtk_clk_register_gates(node, vdec_clks, ARRAY_SIZE(vdec_clks),
-                              clk_data);
-
-       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-       if (r)
-               dev_err(&pdev->dev,
-                       "could not register clock provider: %s: %d\n",
-                       pdev->name, r);
-
-       return r;
-}
+static const struct of_device_id of_match_clk_mt6797_vdec[] = {
+       {
+               .compatible = "mediatek,mt6797-vdecsys",
+               .data = &vdec_desc,
+       }, {
+               /* sentinel */
+       }
+};
 
 static struct platform_driver clk_mt6797_vdec_drv = {
-       .probe = clk_mt6797_vdec_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt6797-vdec",
                .of_match_table = of_match_clk_mt6797_vdec,
index 78b7ed5..834d383 100644 (file)
@@ -34,33 +34,23 @@ static const struct mtk_gate venc_clks[] = {
        GATE_VENC(CLK_VENC_3, "venc_3", "venc_sel", 12),
 };
 
-static const struct of_device_id of_match_clk_mt6797_venc[] = {
-       { .compatible = "mediatek,mt6797-vencsys", },
-       {}
+static const struct mtk_clk_desc venc_desc = {
+       .clks = venc_clks,
+       .num_clks = ARRAY_SIZE(venc_clks),
 };
 
-static int clk_mt6797_venc_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       int r;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_VENC_NR);
-
-       mtk_clk_register_gates(node, venc_clks, ARRAY_SIZE(venc_clks),
-                              clk_data);
-
-       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-       if (r)
-               dev_err(&pdev->dev,
-                       "could not register clock provider: %s: %d\n",
-                       pdev->name, r);
-
-       return r;
-}
+static const struct of_device_id of_match_clk_mt6797_venc[] = {
+       {
+               .compatible = "mediatek,mt6797-vencsys",
+               .data = &venc_desc,
+       }, {
+               /* sentinel */
+       }
+};
 
 static struct platform_driver clk_mt6797_venc_drv = {
-       .probe = clk_mt6797_venc_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt6797-venc",
                .of_match_table = of_match_clk_mt6797_venc,
index fcc598a..6907b1a 100644 (file)
@@ -34,26 +34,23 @@ static const struct mtk_gate cam_clks[] = {
        GATE_CAM(CLK_CAM_CCU, "cam_ccu", "cam_sel", 12),
 };
 
-static int clk_mt8183_cam_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_CAM_NR_CLK);
-
-       mtk_clk_register_gates(node, cam_clks, ARRAY_SIZE(cam_clks),
-                       clk_data);
-
-       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-}
+static const struct mtk_clk_desc cam_desc = {
+       .clks = cam_clks,
+       .num_clks = ARRAY_SIZE(cam_clks),
+};
 
 static const struct of_device_id of_match_clk_mt8183_cam[] = {
-       { .compatible = "mediatek,mt8183-camsys", },
-       {}
+       {
+               .compatible = "mediatek,mt8183-camsys",
+               .data = &cam_desc,
+       }, {
+               /* sentinel */
+       }
 };
 
 static struct platform_driver clk_mt8183_cam_drv = {
-       .probe = clk_mt8183_cam_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt8183-cam",
                .of_match_table = of_match_clk_mt8183_cam,
index eb2def2..8d88442 100644 (file)
@@ -34,26 +34,23 @@ static const struct mtk_gate img_clks[] = {
        GATE_IMG(CLK_IMG_OWE, "img_owe", "img_sel", 9),
 };
 
-static int clk_mt8183_img_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_IMG_NR_CLK);
-
-       mtk_clk_register_gates(node, img_clks, ARRAY_SIZE(img_clks),
-                       clk_data);
-
-       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-}
+static const struct mtk_clk_desc img_desc = {
+       .clks = img_clks,
+       .num_clks = ARRAY_SIZE(img_clks),
+};
 
 static const struct of_device_id of_match_clk_mt8183_img[] = {
-       { .compatible = "mediatek,mt8183-imgsys", },
-       {}
+       {
+               .compatible = "mediatek,mt8183-imgsys",
+               .data = &img_desc,
+       }, {
+               /* sentinel */
+       }
 };
 
 static struct platform_driver clk_mt8183_img_drv = {
-       .probe = clk_mt8183_img_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt8183-img",
                .of_match_table = of_match_clk_mt8183_img,
index b30fc9f..953a8a3 100644 (file)
@@ -27,26 +27,23 @@ static const struct mtk_gate ipu_core0_clks[] = {
        GATE_IPU_CORE0(CLK_IPU_CORE0_IPU, "ipu_core0_ipu", "dsp_sel", 2),
 };
 
-static int clk_mt8183_ipu_core0_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_IPU_CORE0_NR_CLK);
-
-       mtk_clk_register_gates(node, ipu_core0_clks, ARRAY_SIZE(ipu_core0_clks),
-                       clk_data);
-
-       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-}
+static const struct mtk_clk_desc ipu_core0_desc = {
+       .clks = ipu_core0_clks,
+       .num_clks = ARRAY_SIZE(ipu_core0_clks),
+};
 
 static const struct of_device_id of_match_clk_mt8183_ipu_core0[] = {
-       { .compatible = "mediatek,mt8183-ipu_core0", },
-       {}
+       {
+               .compatible = "mediatek,mt8183-ipu_core0",
+               .data = &ipu_core0_desc,
+       }, {
+               /* sentinel */
+       }
 };
 
 static struct platform_driver clk_mt8183_ipu_core0_drv = {
-       .probe = clk_mt8183_ipu_core0_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt8183-ipu_core0",
                .of_match_table = of_match_clk_mt8183_ipu_core0,
index b378957..221d122 100644 (file)
@@ -27,26 +27,23 @@ static const struct mtk_gate ipu_core1_clks[] = {
        GATE_IPU_CORE1(CLK_IPU_CORE1_IPU, "ipu_core1_ipu", "dsp_sel", 2),
 };
 
-static int clk_mt8183_ipu_core1_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_IPU_CORE1_NR_CLK);
-
-       mtk_clk_register_gates(node, ipu_core1_clks, ARRAY_SIZE(ipu_core1_clks),
-                       clk_data);
-
-       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-}
+static const struct mtk_clk_desc ipu_core1_desc = {
+       .clks = ipu_core1_clks,
+       .num_clks = ARRAY_SIZE(ipu_core1_clks),
+};
 
 static const struct of_device_id of_match_clk_mt8183_ipu_core1[] = {
-       { .compatible = "mediatek,mt8183-ipu_core1", },
-       {}
+       {
+               .compatible = "mediatek,mt8183-ipu_core1",
+               .data = &ipu_core1_desc,
+       }, {
+               /* sentinel */
+       }
 };
 
 static struct platform_driver clk_mt8183_ipu_core1_drv = {
-       .probe = clk_mt8183_ipu_core1_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt8183-ipu_core1",
                .of_match_table = of_match_clk_mt8183_ipu_core1,
index 941b43a..8c4fd96 100644 (file)
@@ -25,26 +25,23 @@ static const struct mtk_gate ipu_adl_clks[] = {
        GATE_IPU_ADL_I(CLK_IPU_ADL_CABGEN, "ipu_adl_cabgen", "dsp_sel", 24),
 };
 
-static int clk_mt8183_ipu_adl_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_IPU_ADL_NR_CLK);
-
-       mtk_clk_register_gates(node, ipu_adl_clks, ARRAY_SIZE(ipu_adl_clks),
-                       clk_data);
-
-       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-}
+static const struct mtk_clk_desc ipu_adl_desc = {
+       .clks = ipu_adl_clks,
+       .num_clks = ARRAY_SIZE(ipu_adl_clks),
+};
 
 static const struct of_device_id of_match_clk_mt8183_ipu_adl[] = {
-       { .compatible = "mediatek,mt8183-ipu_adl", },
-       {}
+       {
+               .compatible = "mediatek,mt8183-ipu_adl",
+               .data = &ipu_adl_desc,
+       }, {
+               /* sentinel */
+       }
 };
 
 static struct platform_driver clk_mt8183_ipu_adl_drv = {
-       .probe = clk_mt8183_ipu_adl_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt8183-ipu_adl",
                .of_match_table = of_match_clk_mt8183_ipu_adl,
index ae82c2e..14a4c3f 100644 (file)
@@ -94,26 +94,23 @@ static const struct mtk_gate ipu_conn_clks[] = {
                "ipu_conn_cab3to1_slice", "dsp1_sel", 17),
 };
 
-static int clk_mt8183_ipu_conn_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_IPU_CONN_NR_CLK);
-
-       mtk_clk_register_gates(node, ipu_conn_clks, ARRAY_SIZE(ipu_conn_clks),
-                       clk_data);
-
-       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-}
+static const struct mtk_clk_desc ipu_conn_desc = {
+       .clks = ipu_conn_clks,
+       .num_clks = ARRAY_SIZE(ipu_conn_clks),
+};
 
 static const struct of_device_id of_match_clk_mt8183_ipu_conn[] = {
-       { .compatible = "mediatek,mt8183-ipu_conn", },
-       {}
+       {
+               .compatible = "mediatek,mt8183-ipu_conn",
+               .data = &ipu_conn_desc,
+       }, {
+               /* sentinel */
+       }
 };
 
 static struct platform_driver clk_mt8183_ipu_conn_drv = {
-       .probe = clk_mt8183_ipu_conn_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt8183-ipu_conn",
                .of_match_table = of_match_clk_mt8183_ipu_conn,
index d774eda..730c9ae 100644 (file)
@@ -18,36 +18,31 @@ static const struct mtk_gate_regs mfg_cg_regs = {
        .sta_ofs = 0x0,
 };
 
-#define GATE_MFG(_id, _name, _parent, _shift)                  \
-       GATE_MTK(_id, _name, _parent, &mfg_cg_regs, _shift,     \
-               &mtk_clk_gate_ops_setclr)
+#define GATE_MFG(_id, _name, _parent, _shift)                          \
+       GATE_MTK_FLAGS(_id, _name, _parent, &mfg_cg_regs, _shift,       \
+                      &mtk_clk_gate_ops_setclr, CLK_SET_RATE_PARENT)
 
 static const struct mtk_gate mfg_clks[] = {
        GATE_MFG(CLK_MFG_BG3D, "mfg_bg3d", "mfg_sel", 0)
 };
 
-static int clk_mt8183_mfg_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       struct device_node *node = pdev->dev.of_node;
-
-       pm_runtime_enable(&pdev->dev);
-
-       clk_data = mtk_alloc_clk_data(CLK_MFG_NR_CLK);
-
-       mtk_clk_register_gates_with_dev(node, mfg_clks, ARRAY_SIZE(mfg_clks),
-                       clk_data, &pdev->dev);
-
-       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-}
+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_mt8183_mfg[] = {
-       { .compatible = "mediatek,mt8183-mfgcfg", },
-       {}
+       {
+               .compatible = "mediatek,mt8183-mfgcfg",
+               .data = &mfg_desc,
+       }, {
+               /* sentinel */
+       }
 };
 
 static struct platform_driver clk_mt8183_mfg_drv = {
-       .probe = clk_mt8183_mfg_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt8183-mfg",
                .of_match_table = of_match_clk_mt8183_mfg,
index 0548cde..c294e50 100644 (file)
@@ -38,26 +38,23 @@ static const struct mtk_gate vdec_clks[] = {
        GATE_VDEC1_I(CLK_VDEC_LARB1, "vdec_larb1", "mm_sel", 0),
 };
 
-static int clk_mt8183_vdec_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_VDEC_NR_CLK);
-
-       mtk_clk_register_gates(node, vdec_clks, ARRAY_SIZE(vdec_clks),
-                       clk_data);
-
-       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-}
+static const struct mtk_clk_desc vdec_desc = {
+       .clks = vdec_clks,
+       .num_clks = ARRAY_SIZE(vdec_clks),
+};
 
 static const struct of_device_id of_match_clk_mt8183_vdec[] = {
-       { .compatible = "mediatek,mt8183-vdecsys", },
-       {}
+       {
+               .compatible = "mediatek,mt8183-vdecsys",
+               .data = &vdec_desc,
+       }, {
+               /* sentinel */
+       }
 };
 
 static struct platform_driver clk_mt8183_vdec_drv = {
-       .probe = clk_mt8183_vdec_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt8183-vdec",
                .of_match_table = of_match_clk_mt8183_vdec,
index f86ec60..0051c5d 100644 (file)
@@ -30,26 +30,23 @@ static const struct mtk_gate venc_clks[] = {
                "mm_sel", 8),
 };
 
-static int clk_mt8183_venc_probe(struct platform_device *pdev)
-{
-       struct clk_hw_onecell_data *clk_data;
-       struct device_node *node = pdev->dev.of_node;
-
-       clk_data = mtk_alloc_clk_data(CLK_VENC_NR_CLK);
-
-       mtk_clk_register_gates(node, venc_clks, ARRAY_SIZE(venc_clks),
-                       clk_data);
-
-       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
-}
+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_mt8183_venc[] = {
-       { .compatible = "mediatek,mt8183-vencsys", },
-       {}
+       {
+               .compatible = "mediatek,mt8183-vencsys",
+               .data = &venc_desc,
+       }, {
+               /* sentinel */
+       }
 };
 
 static struct platform_driver clk_mt8183_venc_drv = {
-       .probe = clk_mt8183_venc_probe,
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt8183-venc",
                .of_match_table = of_match_clk_mt8183_venc,
index 8512101..1860a35 100644 (file)
@@ -1198,10 +1198,33 @@ static void clk_mt8183_top_init_early(struct device_node *node)
 CLK_OF_DECLARE_DRIVER(mt8183_topckgen, "mediatek,mt8183-topckgen",
                        clk_mt8183_top_init_early);
 
+/* Register mux notifier for MFG mux */
+static int clk_mt8183_reg_mfg_mux_notifier(struct device *dev, struct clk *clk)
+{
+       struct mtk_mux_nb *mfg_mux_nb;
+       int i;
+
+       mfg_mux_nb = devm_kzalloc(dev, sizeof(*mfg_mux_nb), GFP_KERNEL);
+       if (!mfg_mux_nb)
+               return -ENOMEM;
+
+       for (i = 0; i < ARRAY_SIZE(top_muxes); i++)
+               if (top_muxes[i].id == CLK_TOP_MUX_MFG)
+                       break;
+       if (i == ARRAY_SIZE(top_muxes))
+               return -EINVAL;
+
+       mfg_mux_nb->ops = top_muxes[i].ops;
+       mfg_mux_nb->bypass_index = 0; /* Bypass to 26M crystal */
+
+       return devm_mtk_clk_mux_notifier_register(dev, clk, mfg_mux_nb);
+}
+
 static int clk_mt8183_top_probe(struct platform_device *pdev)
 {
        void __iomem *base;
        struct device_node *node = pdev->dev.of_node;
+       int ret;
 
        base = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(base))
@@ -1227,6 +1250,11 @@ static int clk_mt8183_top_probe(struct platform_device *pdev)
        mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks),
                top_clk_data);
 
+       ret = clk_mt8183_reg_mfg_mux_notifier(&pdev->dev,
+                                             top_clk_data->hws[CLK_TOP_MUX_MFG]->clk);
+       if (ret)
+               return ret;
+
        return of_clk_add_hw_provider(node, of_clk_hw_onecell_get,
                                      top_clk_data);
 }
index fc74cd8..90b57d4 100644 (file)
@@ -98,6 +98,7 @@ static const struct of_device_id of_match_clk_mt8192_cam[] = {
 
 static struct platform_driver clk_mt8192_cam_drv = {
        .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt8192-cam",
                .of_match_table = of_match_clk_mt8192_cam,
index 7ce3abe..da82d65 100644 (file)
@@ -61,6 +61,7 @@ static const struct of_device_id of_match_clk_mt8192_img[] = {
 
 static struct platform_driver clk_mt8192_img_drv = {
        .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt8192-img",
                .of_match_table = of_match_clk_mt8192_img,
index 700356a..ff8e20b 100644 (file)
@@ -110,6 +110,7 @@ static const struct of_device_id of_match_clk_mt8192_imp_iic_wrap[] = {
 
 static struct platform_driver clk_mt8192_imp_iic_wrap_drv = {
        .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt8192-imp_iic_wrap",
                .of_match_table = of_match_clk_mt8192_imp_iic_wrap,
index 730d91b..0225abe 100644 (file)
@@ -48,6 +48,7 @@ static const struct of_device_id of_match_clk_mt8192_ipe[] = {
 
 static struct platform_driver clk_mt8192_ipe_drv = {
        .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt8192-ipe",
                .of_match_table = of_match_clk_mt8192_ipe,
index 93c87ae..4675788 100644 (file)
@@ -73,6 +73,7 @@ static const struct of_device_id of_match_clk_mt8192_mdp[] = {
 
 static struct platform_driver clk_mt8192_mdp_drv = {
        .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt8192-mdp",
                .of_match_table = of_match_clk_mt8192_mdp,
index 3bbc746..ec5b44f 100644 (file)
@@ -18,8 +18,10 @@ static const struct mtk_gate_regs mfg_cg_regs = {
        .sta_ofs = 0x0,
 };
 
-#define GATE_MFG(_id, _name, _parent, _shift)  \
-       GATE_MTK(_id, _name, _parent, &mfg_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+#define GATE_MFG(_id, _name, _parent, _shift)                  \
+       GATE_MTK_FLAGS(_id, _name, _parent, &mfg_cg_regs,       \
+                      _shift, &mtk_clk_gate_ops_setclr,        \
+                      CLK_SET_RATE_PARENT)
 
 static const struct mtk_gate mfg_clks[] = {
        GATE_MFG(CLK_MFG_BG3D, "mfg_bg3d", "mfg_pll_sel", 0),
@@ -41,6 +43,7 @@ static const struct of_device_id of_match_clk_mt8192_mfg[] = {
 
 static struct platform_driver clk_mt8192_mfg_drv = {
        .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt8192-mfg",
                .of_match_table = of_match_clk_mt8192_mfg,
index 635f7a0..a72e1b7 100644 (file)
@@ -55,6 +55,7 @@ static const struct of_device_id of_match_clk_mt8192_msdc[] = {
 
 static struct platform_driver clk_mt8192_msdc_drv = {
        .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt8192-msdc",
                .of_match_table = of_match_clk_mt8192_msdc,
index 58725d7..18a8679 100644 (file)
@@ -41,6 +41,7 @@ static const struct of_device_id of_match_clk_mt8192_scp_adsp[] = {
 
 static struct platform_driver clk_mt8192_scp_adsp_drv = {
        .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt8192-scp_adsp",
                .of_match_table = of_match_clk_mt8192_scp_adsp,
index b1d95cf..e149962 100644 (file)
@@ -85,6 +85,7 @@ static const struct of_device_id of_match_clk_mt8192_vdec[] = {
 
 static struct platform_driver clk_mt8192_vdec_drv = {
        .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt8192-vdec",
                .of_match_table = of_match_clk_mt8192_vdec,
index c0d867b..80b8bb1 100644 (file)
@@ -44,6 +44,7 @@ static const struct of_device_id of_match_clk_mt8192_venc[] = {
 
 static struct platform_driver clk_mt8192_venc_drv = {
        .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
        .driver = {
                .name = "clk-mt8192-venc",
                .of_match_table = of_match_clk_mt8192_venc,
index ebbd279..d0f2269 100644 (file)
@@ -167,22 +167,7 @@ static const char * const mdp_parents[] = {
        "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[] = {
+static const char * const img_parents[] = {
        "clk26m",
        "univpll_d4",
        "tvdpll_ck",
@@ -280,61 +265,6 @@ static const char * const camtg_parents[] = {
        "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"
@@ -362,15 +292,7 @@ static const char * const msdc50_0_parents[] = {
        "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[] = {
+static const char * const msdc30_parents[] = {
        "clk26m",
        "univpll_d6_d2",
        "mainpll_d6_d2",
@@ -457,39 +379,6 @@ static const char * const seninf_parents[] = {
        "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",
@@ -649,52 +538,7 @@ static const char * const sflash_parents[] = {
        "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[] = {
+static const char * const apll_i2s_m_parents[] = {
        "aud_1_sel",
        "aud_2_sel"
 };
@@ -724,9 +568,9 @@ static const struct mtk_mux top_mtk_muxes[] = {
        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),
+                            img_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),
+                            img_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),
@@ -747,16 +591,16 @@ static const struct mtk_mux top_mtk_muxes[] = {
                             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),
+                            camtg_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),
+                            camtg_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),
+                            camtg_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),
+                            camtg_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),
+                            camtg_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",
@@ -767,9 +611,9 @@ static const struct mtk_mux top_mtk_muxes[] = {
        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),
+                            msdc30_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),
+                            msdc30_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 */
@@ -796,12 +640,12 @@ static const struct mtk_mux top_mtk_muxes[] = {
        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),
+                            seninf_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),
+                            seninf_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),
+                            seninf_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",
@@ -847,16 +691,16 @@ static const struct mtk_mux top_mtk_muxes[] = {
 
 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),
+       MUX(CLK_TOP_APLL_I2S0_M_SEL, "apll_i2s0_m_sel", apll_i2s_m_parents, 0x320, 16, 1),
+       MUX(CLK_TOP_APLL_I2S1_M_SEL, "apll_i2s1_m_sel", apll_i2s_m_parents, 0x320, 17, 1),
+       MUX(CLK_TOP_APLL_I2S2_M_SEL, "apll_i2s2_m_sel", apll_i2s_m_parents, 0x320, 18, 1),
+       MUX(CLK_TOP_APLL_I2S3_M_SEL, "apll_i2s3_m_sel", apll_i2s_m_parents, 0x320, 19, 1),
+       MUX(CLK_TOP_APLL_I2S4_M_SEL, "apll_i2s4_m_sel", apll_i2s_m_parents, 0x320, 20, 1),
+       MUX(CLK_TOP_APLL_I2S5_M_SEL, "apll_i2s5_m_sel", apll_i2s_m_parents, 0x320, 21, 1),
+       MUX(CLK_TOP_APLL_I2S6_M_SEL, "apll_i2s6_m_sel", apll_i2s_m_parents, 0x320, 22, 1),
+       MUX(CLK_TOP_APLL_I2S7_M_SEL, "apll_i2s7_m_sel", apll_i2s_m_parents, 0x320, 23, 1),
+       MUX(CLK_TOP_APLL_I2S8_M_SEL, "apll_i2s8_m_sel", apll_i2s_m_parents, 0x320, 24, 1),
+       MUX(CLK_TOP_APLL_I2S9_M_SEL, "apll_i2s9_m_sel", apll_i2s_m_parents, 0x320, 25, 1),
 };
 
 static const struct mtk_composite top_adj_divs[] = {
@@ -1224,6 +1068,28 @@ static void clk_mt8192_top_init_early(struct device_node *node)
 CLK_OF_DECLARE_DRIVER(mt8192_topckgen, "mediatek,mt8192-topckgen",
                      clk_mt8192_top_init_early);
 
+/* Register mux notifier for MFG mux */
+static int clk_mt8192_reg_mfg_mux_notifier(struct device *dev, struct clk *clk)
+{
+       struct mtk_mux_nb *mfg_mux_nb;
+       int i;
+
+       mfg_mux_nb = devm_kzalloc(dev, sizeof(*mfg_mux_nb), GFP_KERNEL);
+       if (!mfg_mux_nb)
+               return -ENOMEM;
+
+       for (i = 0; i < ARRAY_SIZE(top_mtk_muxes); i++)
+               if (top_mtk_muxes[i].id == CLK_TOP_MFG_PLL_SEL)
+                       break;
+       if (i == ARRAY_SIZE(top_mtk_muxes))
+               return -EINVAL;
+
+       mfg_mux_nb->ops = top_mtk_muxes[i].ops;
+       mfg_mux_nb->bypass_index = 0; /* Bypass to 26M crystal */
+
+       return devm_mtk_clk_mux_notifier_register(dev, clk, mfg_mux_nb);
+}
+
 static int clk_mt8192_top_probe(struct platform_device *pdev)
 {
        struct device_node *node = pdev->dev.of_node;
@@ -1247,6 +1113,12 @@ static int clk_mt8192_top_probe(struct platform_device *pdev)
        if (r)
                return r;
 
+       r = clk_mt8192_reg_mfg_mux_notifier(&pdev->dev,
+                                           top_clk_data->hws[CLK_TOP_MFG_PLL_SEL]->clk);
+       if (r)
+               return r;
+
+
        return of_clk_add_hw_provider(node, of_clk_hw_onecell_get,
                                      top_clk_data);
 }
index 97657f2..fcd4104 100644 (file)
@@ -55,8 +55,12 @@ static const struct mtk_gate_regs infra_ao4_cg_regs = {
 #define GATE_INFRA_AO1(_id, _name, _parent, _shift)    \
        GATE_INFRA_AO1_FLAGS(_id, _name, _parent, _shift, 0)
 
+#define GATE_INFRA_AO2_FLAGS(_id, _name, _parent, _shift, _flag)       \
+       GATE_MTK_FLAGS(_id, _name, _parent, &infra_ao2_cg_regs, _shift, \
+                      &mtk_clk_gate_ops_setclr, _flag)
+
 #define GATE_INFRA_AO2(_id, _name, _parent, _shift)                    \
-       GATE_MTK(_id, _name, _parent, &infra_ao2_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+       GATE_INFRA_AO2_FLAGS(_id, _name, _parent, _shift, 0)
 
 #define GATE_INFRA_AO3_FLAGS(_id, _name, _parent, _shift, _flag)               \
        GATE_MTK_FLAGS(_id, _name, _parent, &infra_ao3_cg_regs, _shift, \
@@ -136,8 +140,11 @@ static const struct mtk_gate infra_ao_clks[] = {
        GATE_INFRA_AO2(CLK_INFRA_AO_UNIPRO_SYS, "infra_ao_unipro_sys", "top_ufs", 11),
        GATE_INFRA_AO2(CLK_INFRA_AO_UNIPRO_TICK, "infra_ao_unipro_tick", "top_ufs_tick1us", 12),
        GATE_INFRA_AO2(CLK_INFRA_AO_UFS_MP_SAP_B, "infra_ao_ufs_mp_sap_b", "top_ufs_mp_sap_cfg", 13),
-       GATE_INFRA_AO2(CLK_INFRA_AO_PWRMCU, "infra_ao_pwrmcu", "top_pwrmcu", 15),
-       GATE_INFRA_AO2(CLK_INFRA_AO_PWRMCU_BUS_H, "infra_ao_pwrmcu_bus_h", "top_axi", 17),
+       /* pwrmcu is used by ATF for platform PM: clocks must never be disabled by the kernel */
+       GATE_INFRA_AO2_FLAGS(CLK_INFRA_AO_PWRMCU, "infra_ao_pwrmcu", "top_pwrmcu", 15,
+                            CLK_IS_CRITICAL),
+       GATE_INFRA_AO2_FLAGS(CLK_INFRA_AO_PWRMCU_BUS_H, "infra_ao_pwrmcu_bus_h", "top_axi", 17,
+                            CLK_IS_CRITICAL),
        GATE_INFRA_AO2(CLK_INFRA_AO_APDMA_B, "infra_ao_apdma_b", "top_axi", 18),
        GATE_INFRA_AO2(CLK_INFRA_AO_SPI4, "infra_ao_spi4", "top_spi", 25),
        GATE_INFRA_AO2(CLK_INFRA_AO_SPI5, "infra_ao_spi5", "top_spi", 26),
@@ -193,6 +200,9 @@ static u16 infra_ao_rst_ofs[] = {
 
 static u16 infra_ao_idx_map[] = {
        [MT8195_INFRA_RST0_THERM_CTRL_SWRST] = 0 * RST_NR_PER_BANK + 0,
+       [MT8195_INFRA_RST2_USBSIF_P1_SWRST] = 2 * RST_NR_PER_BANK + 18,
+       [MT8195_INFRA_RST2_PCIE_P0_SWRST] = 2 * RST_NR_PER_BANK + 26,
+       [MT8195_INFRA_RST2_PCIE_P1_SWRST] = 2 * RST_NR_PER_BANK + 27,
        [MT8195_INFRA_RST3_THERM_CTRL_PTP_SWRST] = 3 * RST_NR_PER_BANK + 5,
        [MT8195_INFRA_RST4_THERM_CTRL_MCU_SWRST] = 4 * RST_NR_PER_BANK + 10,
 };
index 9411c55..c94cb71 100644 (file)
@@ -17,10 +17,12 @@ static const struct mtk_gate_regs mfg_cg_regs = {
 };
 
 #define GATE_MFG(_id, _name, _parent, _shift)                  \
-       GATE_MTK(_id, _name, _parent, &mfg_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
+       GATE_MTK_FLAGS(_id, _name, _parent, &mfg_cg_regs,       \
+                      _shift, &mtk_clk_gate_ops_setclr,        \
+                      CLK_SET_RATE_PARENT)
 
 static const struct mtk_gate mfg_clks[] = {
-       GATE_MFG(CLK_MFG_BG3D, "mfg_bg3d", "top_mfg_core_tmp", 0),
+       GATE_MFG(CLK_MFG_BG3D, "mfg_bg3d", "mfg_ck_fast_ref", 0),
 };
 
 static const struct mtk_clk_desc mfg_desc = {
index ec70e1f..8cbab5c 100644 (file)
@@ -298,11 +298,14 @@ static const char * const ipu_if_parents[] = {
        "mmpll_d4"
 };
 
+/*
+ * MFG can be also parented to "univpll_d6" and "univpll_d7":
+ * these have been removed from the parents list to let us
+ * achieve GPU DVFS without any special clock handlers.
+ */
 static const char * const mfg_parents[] = {
        "clk26m",
-       "mainpll_d5_d2",
-       "univpll_d6",
-       "univpll_d7"
+       "mainpll_d5_d2"
 };
 
 static const char * const camtg_parents[] = {
@@ -1149,11 +1152,6 @@ static const struct mtk_mux top_mtk_muxes[] = {
         */
 };
 
-static struct mtk_composite top_muxes[] = {
-       /* CLK_MISC_CFG_3 */
-       MUX(CLK_TOP_MFG_CK_FAST_REF, "mfg_ck_fast_ref", mfg_fast_parents, 0x0250, 8, 1),
-};
-
 static const struct mtk_composite top_adj_divs[] = {
        DIV_GATE(CLK_TOP_APLL12_DIV0, "apll12_div0", "top_i2si1_mck", 0x0320, 0, 0x0328, 8, 0),
        DIV_GATE(CLK_TOP_APLL12_DIV1, "apll12_div1", "top_i2si2_mck", 0x0320, 1, 0x0328, 8, 8),
@@ -1222,10 +1220,26 @@ static const struct of_device_id of_match_clk_mt8195_topck[] = {
        {}
 };
 
+/* Register mux notifier for MFG mux */
+static int clk_mt8195_reg_mfg_mux_notifier(struct device *dev, struct clk *clk)
+{
+       struct mtk_mux_nb *mfg_mux_nb;
+
+       mfg_mux_nb = devm_kzalloc(dev, sizeof(*mfg_mux_nb), GFP_KERNEL);
+       if (!mfg_mux_nb)
+               return -ENOMEM;
+
+       mfg_mux_nb->ops = &clk_mux_ops;
+       mfg_mux_nb->bypass_index = 0; /* Bypass to TOP_MFG_CORE_TMP */
+
+       return devm_mtk_clk_mux_notifier_register(dev, clk, mfg_mux_nb);
+}
+
 static int clk_mt8195_topck_probe(struct platform_device *pdev)
 {
        struct clk_hw_onecell_data *top_clk_data;
        struct device_node *node = pdev->dev.of_node;
+       struct clk_hw *hw;
        int r;
        void __iomem *base;
 
@@ -1253,15 +1267,22 @@ static int clk_mt8195_topck_probe(struct platform_device *pdev)
        if (r)
                goto unregister_factors;
 
-       r = mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
-                                       &mt8195_clk_lock, top_clk_data);
+       hw = devm_clk_hw_register_mux(&pdev->dev, "mfg_ck_fast_ref", mfg_fast_parents,
+                                     ARRAY_SIZE(mfg_fast_parents), CLK_SET_RATE_PARENT,
+                                     (base + 0x250), 8, 1, 0, &mt8195_clk_lock);
+       if (IS_ERR(hw))
+               goto unregister_muxes;
+       top_clk_data->hws[CLK_TOP_MFG_CK_FAST_REF] = hw;
+
+       r = clk_mt8195_reg_mfg_mux_notifier(&pdev->dev,
+                                           top_clk_data->hws[CLK_TOP_MFG_CK_FAST_REF]->clk);
        if (r)
                goto unregister_muxes;
 
        r = mtk_clk_register_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), base,
                                        &mt8195_clk_lock, top_clk_data);
        if (r)
-               goto unregister_composite_muxes;
+               goto unregister_muxes;
 
        r = mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks), top_clk_data);
        if (r)
@@ -1279,8 +1300,6 @@ unregister_gates:
        mtk_clk_unregister_gates(top_clks, ARRAY_SIZE(top_clks), top_clk_data);
 unregister_composite_divs:
        mtk_clk_unregister_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), top_clk_data);
-unregister_composite_muxes:
-       mtk_clk_unregister_composites(top_muxes, ARRAY_SIZE(top_muxes), top_clk_data);
 unregister_muxes:
        mtk_clk_unregister_muxes(top_mtk_muxes, ARRAY_SIZE(top_mtk_muxes), top_clk_data);
 unregister_factors:
@@ -1300,7 +1319,6 @@ static int clk_mt8195_topck_remove(struct platform_device *pdev)
        of_clk_del_provider(node);
        mtk_clk_unregister_gates(top_clks, ARRAY_SIZE(top_clks), top_clk_data);
        mtk_clk_unregister_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), top_clk_data);
-       mtk_clk_unregister_composites(top_muxes, ARRAY_SIZE(top_muxes), top_clk_data);
        mtk_clk_unregister_muxes(top_mtk_muxes, ARRAY_SIZE(top_mtk_muxes), top_clk_data);
        mtk_clk_unregister_factors(top_divs, ARRAY_SIZE(top_divs), top_clk_data);
        mtk_clk_unregister_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks), top_clk_data);
index 261a7f7..07b46bf 100644 (file)
@@ -37,6 +37,10 @@ static const struct mtk_gate_regs vdo0_2_cg_regs = {
 #define GATE_VDO0_2(_id, _name, _parent, _shift)                       \
        GATE_MTK(_id, _name, _parent, &vdo0_2_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
 
+#define GATE_VDO0_2_FLAGS(_id, _name, _parent, _shift, _flags)         \
+       GATE_MTK_FLAGS(_id, _name, _parent, &vdo0_2_cg_regs, _shift,    \
+                      &mtk_clk_gate_ops_setclr, _flags)
+
 static const struct mtk_gate vdo0_clks[] = {
        /* VDO0_0 */
        GATE_VDO0_0(CLK_VDO0_DISP_OVL0, "vdo0_disp_ovl0", "top_vpp", 0),
@@ -85,7 +89,8 @@ static const struct mtk_gate vdo0_clks[] = {
        /* VDO0_2 */
        GATE_VDO0_2(CLK_VDO0_DSI0_DSI, "vdo0_dsi0_dsi", "top_dsi_occ", 0),
        GATE_VDO0_2(CLK_VDO0_DSI1_DSI, "vdo0_dsi1_dsi", "top_dsi_occ", 8),
-       GATE_VDO0_2(CLK_VDO0_DP_INTF0_DP_INTF, "vdo0_dp_intf0_dp_intf", "top_edp", 16),
+       GATE_VDO0_2_FLAGS(CLK_VDO0_DP_INTF0_DP_INTF, "vdo0_dp_intf0_dp_intf",
+                         "top_edp", 16, CLK_SET_RATE_PARENT),
 };
 
 static int clk_mt8195_vdo0_probe(struct platform_device *pdev)
index 3378487..835335b 100644 (file)
@@ -34,6 +34,12 @@ static const struct mtk_gate_regs vdo1_3_cg_regs = {
        .sta_ofs = 0x140,
 };
 
+static const struct mtk_gate_regs vdo1_4_cg_regs = {
+       .set_ofs = 0x400,
+       .clr_ofs = 0x400,
+       .sta_ofs = 0x400,
+};
+
 #define GATE_VDO1_0(_id, _name, _parent, _shift)                       \
        GATE_MTK(_id, _name, _parent, &vdo1_0_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
 
@@ -43,9 +49,16 @@ static const struct mtk_gate_regs vdo1_3_cg_regs = {
 #define GATE_VDO1_2(_id, _name, _parent, _shift)                       \
        GATE_MTK(_id, _name, _parent, &vdo1_2_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
 
+#define GATE_VDO1_2_FLAGS(_id, _name, _parent, _shift, _flags)         \
+       GATE_MTK_FLAGS(_id, _name, _parent, &vdo1_2_cg_regs, _shift,    \
+                      &mtk_clk_gate_ops_setclr, _flags)
+
 #define GATE_VDO1_3(_id, _name, _parent, _shift)                       \
        GATE_MTK(_id, _name, _parent, &vdo1_3_cg_regs, _shift, &mtk_clk_gate_ops_setclr)
 
+#define GATE_VDO1_4(_id, _name, _parent, _shift)                       \
+       GATE_MTK(_id, _name, _parent, &vdo1_4_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr_inv)
+
 static const struct mtk_gate vdo1_clks[] = {
        /* VDO1_0 */
        GATE_VDO1_0(CLK_VDO1_SMI_LARB2, "vdo1_smi_larb2", "top_vpp", 0),
@@ -99,10 +112,12 @@ static const struct mtk_gate vdo1_clks[] = {
        GATE_VDO1_2(CLK_VDO1_DISP_MONITOR_DPI0, "vdo1_disp_monitor_dpi0", "top_vpp", 1),
        GATE_VDO1_2(CLK_VDO1_DPI1, "vdo1_dpi1", "top_vpp", 8),
        GATE_VDO1_2(CLK_VDO1_DISP_MONITOR_DPI1, "vdo1_disp_monitor_dpi1", "top_vpp", 9),
-       GATE_VDO1_2(CLK_VDO1_DPINTF, "vdo1_dpintf", "top_vpp", 16),
+       GATE_VDO1_2_FLAGS(CLK_VDO1_DPINTF, "vdo1_dpintf", "top_dp", 16, CLK_SET_RATE_PARENT),
        GATE_VDO1_2(CLK_VDO1_DISP_MONITOR_DPINTF, "vdo1_disp_monitor_dpintf", "top_vpp", 17),
        /* VDO1_3 */
        GATE_VDO1_3(CLK_VDO1_26M_SLOW, "vdo1_26m_slow", "clk26m", 8),
+       /* VDO1_4 */
+       GATE_VDO1_4(CLK_VDO1_DPI1_HDMI, "vdo1_dpi1_hdmi", "hdmi_txpll", 0),
 };
 
 static int clk_mt8195_vdo1_probe(struct platform_device *pdev)
diff --git a/drivers/clk/mediatek/clk-mt8365-apu.c b/drivers/clk/mediatek/clk-mt8365-apu.c
new file mode 100644 (file)
index 0000000..91ffe89
--- /dev/null
@@ -0,0 +1,55 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2022 MediaTek Inc.
+ */
+
+#include <dt-bindings/clock/mediatek,mt8365-clk.h>
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+static const struct mtk_gate_regs apu_cg_regs = {
+       .set_ofs = 0x4,
+       .clr_ofs = 0x8,
+       .sta_ofs = 0x0,
+};
+
+#define GATE_APU(_id, _name, _parent, _shift) \
+               GATE_MTK(_id, _name, _parent, &apu_cg_regs, _shift, \
+                        &mtk_clk_gate_ops_setclr)
+
+static const struct mtk_gate apu_clks[] = {
+       GATE_APU(CLK_APU_AHB, "apu_ahb", "ifr_apu_axi", 5),
+       GATE_APU(CLK_APU_EDMA, "apu_edma", "apu_sel", 4),
+       GATE_APU(CLK_APU_IF_CK, "apu_if_ck", "apu_if_sel", 3),
+       GATE_APU(CLK_APU_JTAG, "apu_jtag", "clk26m", 2),
+       GATE_APU(CLK_APU_AXI, "apu_axi", "apu_sel", 1),
+       GATE_APU(CLK_APU_IPU_CK, "apu_ck", "apu_sel", 0),
+};
+
+static const struct mtk_clk_desc apu_desc = {
+       .clks = apu_clks,
+       .num_clks = ARRAY_SIZE(apu_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8365_apu[] = {
+       {
+               .compatible = "mediatek,mt8365-apu",
+               .data = &apu_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8365_apu_drv = {
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
+       .driver = {
+               .name = "clk-mt8365-apu",
+               .of_match_table = of_match_clk_mt8365_apu,
+       },
+};
+builtin_platform_driver(clk_mt8365_apu_drv);
+MODULE_LICENSE("GPL");
diff --git a/drivers/clk/mediatek/clk-mt8365-cam.c b/drivers/clk/mediatek/clk-mt8365-cam.c
new file mode 100644 (file)
index 0000000..31d5b5c
--- /dev/null
@@ -0,0 +1,57 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2022 MediaTek Inc.
+ */
+
+#include <dt-bindings/clock/mediatek,mt8365-clk.h>
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+
+#include "clk-gate.h"
+#include "clk-mtk.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_LARB2, "cam_larb2", "mm_sel", 0),
+       GATE_CAM(CLK_CAM, "cam", "mm_sel", 6),
+       GATE_CAM(CLK_CAMTG, "camtg", "mm_sel", 7),
+       GATE_CAM(CLK_CAM_SENIF, "cam_senif", "mm_sel", 8),
+       GATE_CAM(CLK_CAMSV0, "camsv0", "mm_sel", 9),
+       GATE_CAM(CLK_CAMSV1, "camsv1", "mm_sel", 10),
+       GATE_CAM(CLK_CAM_FDVT, "cam_fdvt", "mm_sel", 11),
+       GATE_CAM(CLK_CAM_WPE, "cam_wpe", "mm_sel", 12),
+};
+
+static const struct mtk_clk_desc cam_desc = {
+       .clks = cam_clks,
+       .num_clks = ARRAY_SIZE(cam_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8365_cam[] = {
+       {
+               .compatible = "mediatek,mt8365-imgsys",
+               .data = &cam_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8365_cam_drv = {
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
+       .driver = {
+               .name = "clk-mt8365-cam",
+               .of_match_table = of_match_clk_mt8365_cam,
+       },
+};
+builtin_platform_driver(clk_mt8365_cam_drv);
+MODULE_LICENSE("GPL");
diff --git a/drivers/clk/mediatek/clk-mt8365-mfg.c b/drivers/clk/mediatek/clk-mt8365-mfg.c
new file mode 100644 (file)
index 0000000..587b491
--- /dev/null
@@ -0,0 +1,63 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2022 MediaTek Inc.
+ */
+
+#include <dt-bindings/clock/mediatek,mt8365-clk.h>
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+
+#include "clk-gate.h"
+#include "clk-mtk.h"
+
+static const struct mtk_gate_regs mfg0_cg_regs = {
+       .set_ofs = 0x4,
+       .clr_ofs = 0x8,
+       .sta_ofs = 0x0,
+};
+
+static const struct mtk_gate_regs mfg1_cg_regs = {
+       .set_ofs = 0x280,
+       .clr_ofs = 0x280,
+       .sta_ofs = 0x280,
+};
+
+#define GATE_MFG0(_id, _name, _parent, _shift) \
+               GATE_MTK(_id, _name, _parent, &mfg0_cg_regs, _shift, \
+                        &mtk_clk_gate_ops_setclr)
+
+#define GATE_MFG1(_id, _name, _parent, _shift) \
+               GATE_MTK(_id, _name, _parent, &mfg1_cg_regs, _shift, \
+                        &mtk_clk_gate_ops_no_setclr)
+
+static const struct mtk_gate mfg_clks[] = {
+       /* MFG0 */
+       GATE_MFG0(CLK_MFG_BG3D, "mfg_bg3d", "mfg_sel", 0),
+       /* MFG1 */
+       GATE_MFG1(CLK_MFG_MBIST_DIAG, "mfg_mbist_diag", "mbist_diag_sel", 24),
+};
+
+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_mt8365_mfg[] = {
+       {
+               .compatible = "mediatek,mt8365-mfgcfg",
+               .data = &mfg_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8365_mfg_drv = {
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
+       .driver = {
+               .name = "clk-mt8365-mfg",
+               .of_match_table = of_match_clk_mt8365_mfg,
+       },
+};
+builtin_platform_driver(clk_mt8365_mfg_drv);
+MODULE_LICENSE("GPL");
diff --git a/drivers/clk/mediatek/clk-mt8365-mm.c b/drivers/clk/mediatek/clk-mt8365-mm.c
new file mode 100644 (file)
index 0000000..5c8bf18
--- /dev/null
@@ -0,0 +1,112 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2022 MediaTek Inc.
+ * Copyright (c) 2022 BayLibre, SAS
+ */
+
+#include <dt-bindings/clock/mediatek,mt8365-clk.h>
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+
+#include "clk-gate.h"
+#include "clk-mtk.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,
+};
+
+#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)
+
+static const struct mtk_gate mm_clks[] = {
+       /* MM0 */
+       GATE_MM0(CLK_MM_MM_MDP_RDMA0, "mm_mdp_rdma0", "mm_sel", 0),
+       GATE_MM0(CLK_MM_MM_MDP_CCORR0, "mm_mdp_ccorr0", "mm_sel", 1),
+       GATE_MM0(CLK_MM_MM_MDP_RSZ0, "mm_mdp_rsz0", "mm_sel", 2),
+       GATE_MM0(CLK_MM_MM_MDP_RSZ1, "mm_mdp_rsz1", "mm_sel", 3),
+       GATE_MM0(CLK_MM_MM_MDP_TDSHP0, "mm_mdp_tdshp0", "mm_sel", 4),
+       GATE_MM0(CLK_MM_MM_MDP_WROT0, "mm_mdp_wrot0", "mm_sel", 5),
+       GATE_MM0(CLK_MM_MM_MDP_WDMA0, "mm_mdp_wdma0", "mm_sel", 6),
+       GATE_MM0(CLK_MM_MM_DISP_OVL0, "mm_disp_ovl0", "mm_sel", 7),
+       GATE_MM0(CLK_MM_MM_DISP_OVL0_2L, "mm_disp_ovl0_2l", "mm_sel", 8),
+       GATE_MM0(CLK_MM_MM_DISP_RSZ0, "mm_disp_rsz0", "mm_sel", 9),
+       GATE_MM0(CLK_MM_MM_DISP_RDMA0, "mm_disp_rdma0", "mm_sel", 10),
+       GATE_MM0(CLK_MM_MM_DISP_WDMA0, "mm_disp_wdma0", "mm_sel", 11),
+       GATE_MM0(CLK_MM_MM_DISP_COLOR0, "mm_disp_color0", "mm_sel", 12),
+       GATE_MM0(CLK_MM_MM_DISP_CCORR0, "mm_disp_ccorr0", "mm_sel", 13),
+       GATE_MM0(CLK_MM_MM_DISP_AAL0, "mm_disp_aal0", "mm_sel", 14),
+       GATE_MM0(CLK_MM_MM_DISP_GAMMA0, "mm_disp_gamma0", "mm_sel", 15),
+       GATE_MM0(CLK_MM_MM_DISP_DITHER0, "mm_disp_dither0", "mm_sel", 16),
+       GATE_MM0(CLK_MM_MM_DSI0, "mm_dsi0", "mm_sel", 17),
+       GATE_MM0(CLK_MM_MM_DISP_RDMA1, "mm_disp_rdma1", "mm_sel", 18),
+       GATE_MM0(CLK_MM_MM_MDP_RDMA1, "mm_mdp_rdma1", "mm_sel", 19),
+       GATE_MM0(CLK_MM_DPI0_DPI0, "mm_dpi0_dpi0", "vpll_dpix", 20),
+       GATE_MM0(CLK_MM_MM_FAKE, "mm_fake", "mm_sel", 21),
+       GATE_MM0(CLK_MM_MM_SMI_COMMON, "mm_smi_common", "mm_sel", 22),
+       GATE_MM0(CLK_MM_MM_SMI_LARB0, "mm_smi_larb0", "mm_sel", 23),
+       GATE_MM0(CLK_MM_MM_SMI_COMM0, "mm_smi_comm0", "mm_sel", 24),
+       GATE_MM0(CLK_MM_MM_SMI_COMM1, "mm_smi_comm1", "mm_sel", 25),
+       GATE_MM0(CLK_MM_MM_CAM_MDP, "mm_cam_mdp", "mm_sel", 26),
+       GATE_MM0(CLK_MM_MM_SMI_IMG, "mm_smi_img", "mm_sel", 27),
+       GATE_MM0(CLK_MM_MM_SMI_CAM, "mm_smi_cam", "mm_sel", 28),
+       GATE_MM0(CLK_MM_IMG_IMG_DL_RELAY, "mm_dl_relay", "mm_sel", 29),
+       GATE_MM0(CLK_MM_IMG_IMG_DL_ASYNC_TOP, "mm_dl_async_top", "mm_sel", 30),
+       GATE_MM0(CLK_MM_DSI0_DIG_DSI, "mm_dsi0_dig_dsi", "dsi0_lntc_dsick", 31),
+       /* MM1 */
+       GATE_MM1(CLK_MM_26M_HRTWT, "mm_f26m_hrtwt", "clk26m", 0),
+       GATE_MM1(CLK_MM_MM_DPI0, "mm_dpi0", "mm_sel", 1),
+       GATE_MM1(CLK_MM_LVDSTX_PXL, "mm_flvdstx_pxl", "vpll_dpix", 2),
+       GATE_MM1(CLK_MM_LVDSTX_CTS, "mm_flvdstx_cts", "lvdstx_dig_cts", 3),
+};
+
+static int clk_mt8365_mm_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *node = dev->parent->of_node;
+       struct clk_hw_onecell_data *clk_data;
+       int ret;
+
+       clk_data = mtk_alloc_clk_data(CLK_MM_NR_CLK);
+
+       ret = mtk_clk_register_gates_with_dev(node, mm_clks,
+                                             ARRAY_SIZE(mm_clks), clk_data,
+                                             dev);
+       if (ret)
+               goto err_free_clk_data;
+
+       ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (ret)
+               goto err_unregister_gates;
+
+       return 0;
+
+err_unregister_gates:
+       mtk_clk_unregister_gates(mm_clks, ARRAY_SIZE(mm_clks), clk_data);
+
+err_free_clk_data:
+       mtk_free_clk_data(clk_data);
+
+       return ret;
+}
+
+static struct platform_driver clk_mt8365_mm_drv = {
+       .probe = clk_mt8365_mm_probe,
+       .driver = {
+               .name = "clk-mt8365-mm",
+       },
+};
+builtin_platform_driver(clk_mt8365_mm_drv);
+MODULE_LICENSE("GPL");
diff --git a/drivers/clk/mediatek/clk-mt8365-vdec.c b/drivers/clk/mediatek/clk-mt8365-vdec.c
new file mode 100644 (file)
index 0000000..cdc678e
--- /dev/null
@@ -0,0 +1,63 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2022 MediaTek Inc.
+ */
+
+#include <dt-bindings/clock/mediatek,mt8365-clk.h>
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+
+#include "clk-gate.h"
+#include "clk-mtk.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 = 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)
+
+static const struct mtk_gate vdec_clks[] = {
+       /* VDEC0 */
+       GATE_VDEC0(CLK_VDEC_VDEC, "vdec_fvdec_ck", "mm_sel", 0),
+       /* VDEC1 */
+       GATE_VDEC1(CLK_VDEC_LARB1, "vdec_flarb1_ck", "mm_sel", 0),
+};
+
+static const struct mtk_clk_desc vdec_desc = {
+       .clks = vdec_clks,
+       .num_clks = ARRAY_SIZE(vdec_clks),
+};
+
+static const struct of_device_id of_match_clk_mt8365_vdec[] = {
+       {
+               .compatible = "mediatek,mt8365-vdecsys",
+               .data = &vdec_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8365_vdec_drv = {
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
+       .driver = {
+               .name = "clk-mt8365-vdec",
+               .of_match_table = of_match_clk_mt8365_vdec,
+       },
+};
+builtin_platform_driver(clk_mt8365_vdec_drv);
+MODULE_LICENSE("GPL");
diff --git a/drivers/clk/mediatek/clk-mt8365-venc.c b/drivers/clk/mediatek/clk-mt8365-venc.c
new file mode 100644 (file)
index 0000000..0e080c2
--- /dev/null
@@ -0,0 +1,52 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2022 MediaTek Inc.
+ */
+
+#include <dt-bindings/clock/mediatek,mt8365-clk.h>
+#include <linux/clk-provider.h>
+#include <linux/platform_device.h>
+
+#include "clk-gate.h"
+#include "clk-mtk.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[] = {
+       /* VENC */
+       GATE_VENC(CLK_VENC, "venc_fvenc_ck", "mm_sel", 4),
+       GATE_VENC(CLK_VENC_JPGENC, "venc_jpgenc_ck", "mm_sel", 8),
+};
+
+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_mt8365_venc[] = {
+       {
+               .compatible = "mediatek,mt8365-vencsys",
+               .data = &venc_desc,
+       }, {
+               /* sentinel */
+       }
+};
+
+static struct platform_driver clk_mt8365_venc_drv = {
+       .probe = mtk_clk_simple_probe,
+       .remove = mtk_clk_simple_remove,
+       .driver = {
+               .name = "clk-mt8365-venc",
+               .of_match_table = of_match_clk_mt8365_venc,
+       },
+};
+builtin_platform_driver(clk_mt8365_venc_drv);
+MODULE_LICENSE("GPL");
diff --git a/drivers/clk/mediatek/clk-mt8365.c b/drivers/clk/mediatek/clk-mt8365.c
new file mode 100644 (file)
index 0000000..adfecb6
--- /dev/null
@@ -0,0 +1,1155 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2022 MediaTek Inc.
+ */
+
+#include <dt-bindings/clock/mediatek,mt8365-clk.h>
+#include <linux/clk.h>
+#include <linux/clk-provider.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-gate.h"
+#include "clk-mtk.h"
+#include "clk-mux.h"
+#include "clk-pll.h"
+
+static DEFINE_SPINLOCK(mt8365_clk_lock);
+
+static const struct mtk_fixed_clk top_fixed_clks[] = {
+       FIXED_CLK(CLK_TOP_I2S0_BCK, "i2s0_bck", NULL, 26000000),
+       FIXED_CLK(CLK_TOP_DSI0_LNTC_DSICK, "dsi0_lntc_dsick", "clk26m",
+                 75000000),
+       FIXED_CLK(CLK_TOP_VPLL_DPIX, "vpll_dpix", "clk26m", 75000000),
+       FIXED_CLK(CLK_TOP_LVDSTX_CLKDIG_CTS, "lvdstx_dig_cts", "clk26m",
+                 52500000),
+};
+
+static const struct mtk_fixed_factor top_divs[] = {
+       FACTOR(CLK_TOP_SYS_26M_D2, "sys_26m_d2", "clk26m", 1, 2),
+       FACTOR(CLK_TOP_SYSPLL_D2, "syspll_d2", "mainpll", 1, 2),
+       FACTOR(CLK_TOP_SYSPLL1_D2, "syspll1_d2", "mainpll", 1, 4),
+       FACTOR(CLK_TOP_SYSPLL1_D4, "syspll1_d4", "mainpll", 1, 8),
+       FACTOR(CLK_TOP_SYSPLL1_D8, "syspll1_d8", "mainpll", 1, 16),
+       FACTOR(CLK_TOP_SYSPLL1_D16, "syspll1_d16", "mainpll", 1, 32),
+       FACTOR(CLK_TOP_SYSPLL_D3, "syspll_d3", "mainpll", 1, 3),
+       FACTOR(CLK_TOP_SYSPLL2_D2, "syspll2_d2", "mainpll", 1, 6),
+       FACTOR(CLK_TOP_SYSPLL2_D4, "syspll2_d4", "mainpll", 1, 12),
+       FACTOR(CLK_TOP_SYSPLL2_D8, "syspll2_d8", "mainpll", 1, 24),
+       FACTOR(CLK_TOP_SYSPLL_D5, "syspll_d5", "mainpll", 1, 5),
+       FACTOR(CLK_TOP_SYSPLL3_D2, "syspll3_d2", "mainpll", 1, 10),
+       FACTOR(CLK_TOP_SYSPLL3_D4, "syspll3_d4", "mainpll", 1, 20),
+       FACTOR(CLK_TOP_SYSPLL_D7, "syspll_d7", "mainpll", 1, 7),
+       FACTOR(CLK_TOP_SYSPLL4_D2, "syspll4_d2", "mainpll", 1, 14),
+       FACTOR(CLK_TOP_SYSPLL4_D4, "syspll4_d4", "mainpll", 1, 28),
+       FACTOR(CLK_TOP_UNIVPLL, "univpll", "univ_en", 1, 2),
+       FACTOR(CLK_TOP_UNIVPLL_D2, "univpll_d2", "univpll", 1, 2),
+       FACTOR(CLK_TOP_UNIVPLL1_D2, "univpll1_d2", "univpll", 1, 4),
+       FACTOR(CLK_TOP_UNIVPLL1_D4, "univpll1_d4", "univpll", 1, 8),
+       FACTOR(CLK_TOP_UNIVPLL_D3, "univpll_d3", "univpll", 1, 3),
+       FACTOR(CLK_TOP_UNIVPLL2_D2, "univpll2_d2", "univpll", 1, 6),
+       FACTOR(CLK_TOP_UNIVPLL2_D4, "univpll2_d4", "univpll", 1, 12),
+       FACTOR(CLK_TOP_UNIVPLL2_D8, "univpll2_d8", "univpll", 1, 24),
+       FACTOR(CLK_TOP_UNIVPLL2_D32, "univpll2_d32", "univpll", 1, 96),
+       FACTOR(CLK_TOP_UNIVPLL_D5, "univpll_d5", "univpll", 1, 5),
+       FACTOR(CLK_TOP_UNIVPLL3_D2, "univpll3_d2", "univpll", 1, 10),
+       FACTOR(CLK_TOP_UNIVPLL3_D4, "univpll3_d4", "univpll", 1, 20),
+       FACTOR(CLK_TOP_MMPLL, "mmpll_ck", "mmpll", 1, 1),
+       FACTOR(CLK_TOP_MMPLL_D2, "mmpll_d2", "mmpll", 1, 2),
+       FACTOR(CLK_TOP_MFGPLL, "mfgpll_ck", "mfgpll", 1, 1),
+       FACTOR(CLK_TOP_LVDSPLL_D2, "lvdspll_d2", "lvdspll", 1, 2),
+       FACTOR(CLK_TOP_LVDSPLL_D4, "lvdspll_d4", "lvdspll", 1, 4),
+       FACTOR(CLK_TOP_LVDSPLL_D8, "lvdspll_d8", "lvdspll", 1, 8),
+       FACTOR(CLK_TOP_LVDSPLL_D16, "lvdspll_d16", "lvdspll", 1, 16),
+       FACTOR(CLK_TOP_USB20_192M, "usb20_192m_ck", "usb20_en", 1, 13),
+       FACTOR(CLK_TOP_USB20_192M_D4, "usb20_192m_d4", "usb20_192m_ck", 1, 4),
+       FACTOR(CLK_TOP_USB20_192M_D8, "usb20_192m_d8", "usb20_192m_ck", 1, 8),
+       FACTOR(CLK_TOP_USB20_192M_D16, "usb20_192m_d16", "usb20_192m_ck",
+              1, 16),
+       FACTOR(CLK_TOP_USB20_192M_D32, "usb20_192m_d32", "usb20_192m_ck",
+              1, 32),
+       FACTOR(CLK_TOP_APLL1, "apll1_ck", "apll1", 1, 1),
+       FACTOR(CLK_TOP_APLL1_D2, "apll1_d2", "apll1_ck", 1, 2),
+       FACTOR(CLK_TOP_APLL1_D4, "apll1_d4", "apll1_ck", 1, 4),
+       FACTOR(CLK_TOP_APLL1_D8, "apll1_d8", "apll1_ck", 1, 8),
+       FACTOR(CLK_TOP_APLL2, "apll2_ck", "apll2", 1, 1),
+       FACTOR(CLK_TOP_APLL2_D2, "apll2_d2", "apll2_ck", 1, 2),
+       FACTOR(CLK_TOP_APLL2_D4, "apll2_d4", "apll2_ck", 1, 4),
+       FACTOR(CLK_TOP_APLL2_D8, "apll2_d8", "apll2_ck", 1, 8),
+       FACTOR(CLK_TOP_MSDCPLL, "msdcpll_ck", "msdcpll", 1, 1),
+       FACTOR(CLK_TOP_MSDCPLL_D2, "msdcpll_d2", "msdcpll", 1, 2),
+       FACTOR(CLK_TOP_DSPPLL, "dsppll_ck", "dsppll", 1, 1),
+       FACTOR(CLK_TOP_DSPPLL_D2, "dsppll_d2", "dsppll", 1, 2),
+       FACTOR(CLK_TOP_DSPPLL_D4, "dsppll_d4", "dsppll", 1, 4),
+       FACTOR(CLK_TOP_DSPPLL_D8, "dsppll_d8", "dsppll", 1, 8),
+       FACTOR(CLK_TOP_APUPLL, "apupll_ck", "apupll", 1, 1),
+       FACTOR(CLK_TOP_CLK26M_D52, "clk26m_d52", "clk26m", 1, 52),
+};
+
+static const char * const axi_parents[] = {
+       "clk26m",
+       "syspll_d7",
+       "syspll1_d4",
+       "syspll3_d2"
+};
+
+static const char * const mem_parents[] = {
+       "clk26m",
+       "mmpll_ck",
+       "syspll_d3",
+       "syspll1_d2"
+};
+
+static const char * const mm_parents[] = {
+       "clk26m",
+       "mmpll_ck",
+       "syspll1_d2",
+       "syspll_d5",
+       "syspll1_d4",
+       "univpll_d5",
+       "univpll1_d2",
+       "mmpll_d2"
+};
+
+static const char * const scp_parents[] = {
+       "clk26m",
+       "syspll4_d2",
+       "univpll2_d2",
+       "syspll1_d2",
+       "univpll1_d2",
+       "syspll_d3",
+       "univpll_d3"
+};
+
+static const char * const mfg_parents[] = {
+       "clk26m",
+       "mfgpll_ck",
+       "syspll_d3",
+       "univpll_d3"
+};
+
+static const char * const atb_parents[] = {
+       "clk26m",
+       "syspll1_d4",
+       "syspll1_d2"
+};
+
+static const char * const camtg_parents[] = {
+       "clk26m",
+       "usb20_192m_d8",
+       "univpll2_d8",
+       "usb20_192m_d4",
+       "univpll2_d32",
+       "usb20_192m_d16",
+       "usb20_192m_d32"
+};
+
+static const char * const uart_parents[] = {
+       "clk26m",
+       "univpll2_d8"
+};
+
+static const char * const spi_parents[] = {
+       "clk26m",
+       "univpll2_d2",
+       "univpll2_d4",
+       "univpll2_d8"
+};
+
+static const char * const msdc50_0_hc_parents[] = {
+       "clk26m",
+       "syspll1_d2",
+       "univpll1_d4",
+       "syspll2_d2"
+};
+
+static const char * const msdc50_0_parents[] = {
+       "clk26m",
+       "msdcpll_ck",
+       "univpll1_d2",
+       "syspll1_d2",
+       "univpll_d5",
+       "syspll2_d2",
+       "univpll1_d4",
+       "syspll4_d2"
+};
+
+static const char * const msdc50_2_parents[] = {
+       "clk26m",
+       "msdcpll_ck",
+       "univpll_d3",
+       "univpll1_d2",
+       "syspll1_d2",
+       "univpll2_d2",
+       "syspll2_d2",
+       "univpll1_d4"
+};
+
+static const char * const msdc30_1_parents[] = {
+       "clk26m",
+       "msdcpll_d2",
+       "univpll2_d2",
+       "syspll2_d2",
+       "univpll1_d4",
+       "syspll1_d4",
+       "syspll2_d4",
+       "univpll2_d8"
+};
+
+static const char * const audio_parents[] = {
+       "clk26m",
+       "syspll3_d4",
+       "syspll4_d4",
+       "syspll1_d16"
+};
+
+static const char * const aud_intbus_parents[] = {
+       "clk26m",
+       "syspll1_d4",
+       "syspll4_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 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 aud_spdif_parents[] = {
+       "clk26m",
+       "univpll_d2"
+};
+
+static const char * const disp_pwm_parents[] = {
+       "clk26m",
+       "univpll2_d4"
+};
+
+static const char * const dxcc_parents[] = {
+       "clk26m",
+       "syspll1_d2",
+       "syspll1_d4",
+       "syspll1_d8"
+};
+
+static const char * const ssusb_sys_parents[] = {
+       "clk26m",
+       "univpll3_d4",
+       "univpll2_d4",
+       "univpll3_d2"
+};
+
+static const char * const spm_parents[] = {
+       "clk26m",
+       "syspll1_d8"
+};
+
+static const char * const i2c_parents[] = {
+       "clk26m",
+       "univpll3_d4",
+       "univpll3_d2",
+       "syspll1_d8",
+       "syspll2_d8"
+};
+
+static const char * const pwm_parents[] = {
+       "clk26m",
+       "univpll3_d4",
+       "syspll1_d8"
+};
+
+static const char * const senif_parents[] = {
+       "clk26m",
+       "univpll1_d4",
+       "univpll1_d2",
+       "univpll2_d2"
+};
+
+static const char * const aes_fde_parents[] = {
+       "clk26m",
+       "msdcpll_ck",
+       "univpll_d3",
+       "univpll2_d2",
+       "univpll1_d2",
+       "syspll1_d2"
+};
+
+static const char * const dpi0_parents[] = {
+       "clk26m",
+       "lvdspll_d2",
+       "lvdspll_d4",
+       "lvdspll_d8",
+       "lvdspll_d16"
+};
+
+static const char * const dsp_parents[] = {
+       "clk26m",
+       "sys_26m_d2",
+       "dsppll_ck",
+       "dsppll_d2",
+       "dsppll_d4",
+       "dsppll_d8"
+};
+
+static const char * const nfi2x_parents[] = {
+       "clk26m",
+       "syspll2_d2",
+       "syspll_d7",
+       "syspll_d3",
+       "syspll2_d4",
+       "msdcpll_d2",
+       "univpll1_d2",
+       "univpll_d5"
+};
+
+static const char * const nfiecc_parents[] = {
+       "clk26m",
+       "syspll4_d2",
+       "univpll2_d4",
+       "syspll_d7",
+       "univpll1_d2",
+       "syspll1_d2",
+       "univpll2_d2",
+       "syspll_d5"
+};
+
+static const char * const ecc_parents[] = {
+       "clk26m",
+       "univpll2_d2",
+       "univpll1_d2",
+       "univpll_d3",
+       "syspll_d2"
+};
+
+static const char * const eth_parents[] = {
+       "clk26m",
+       "univpll2_d8",
+       "syspll4_d4",
+       "syspll1_d8",
+       "syspll4_d2"
+};
+
+static const char * const gcpu_parents[] = {
+       "clk26m",
+       "univpll_d3",
+       "univpll2_d2",
+       "syspll_d3",
+       "syspll2_d2"
+};
+
+static const char * const gcpu_cpm_parents[] = {
+       "clk26m",
+       "univpll2_d2",
+       "syspll2_d2"
+};
+
+static const char * const apu_parents[] = {
+       "clk26m",
+       "univpll_d2",
+       "apupll_ck",
+       "mmpll_ck",
+       "syspll_d3",
+       "univpll1_d2",
+       "syspll1_d2",
+       "syspll1_d4"
+};
+
+static const char * const mbist_diag_parents[] = {
+       "clk26m",
+       "syspll4_d4",
+       "univpll2_d8"
+};
+
+static const char * const apll_i2s0_parents[] = {
+       "aud_1_sel",
+       "aud_2_sel"
+};
+
+static struct mtk_composite top_misc_mux_gates[] = {
+       /* CLK_CFG_11 */
+       MUX_GATE(CLK_TOP_MBIST_DIAG_SEL, "mbist_diag_sel", mbist_diag_parents,
+                0x0ec, 0, 2, 7),
+};
+
+struct mt8365_clk_audio_mux {
+       int id;
+       const char *name;
+       u8 shift;
+};
+
+static struct mt8365_clk_audio_mux top_misc_muxes[] = {
+       { CLK_TOP_APLL_I2S0_SEL, "apll_i2s0_sel", 11},
+       { CLK_TOP_APLL_I2S1_SEL, "apll_i2s1_sel", 12},
+       { CLK_TOP_APLL_I2S2_SEL, "apll_i2s2_sel", 13},
+       { CLK_TOP_APLL_I2S3_SEL, "apll_i2s3_sel", 14},
+       { CLK_TOP_APLL_TDMOUT_SEL, "apll_tdmout_sel", 15},
+       { CLK_TOP_APLL_TDMIN_SEL, "apll_tdmin_sel", 16},
+       { CLK_TOP_APLL_SPDIF_SEL, "apll_spdif_sel", 17},
+};
+
+#define CLK_CFG_UPDATE 0x004
+#define CLK_CFG_UPDATE1 0x008
+
+static const struct mtk_mux top_muxes[] = {
+       /* CLK_CFG_0 */
+       MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_AXI_SEL, "axi_sel", axi_parents,
+                                  0x040, 0x044, 0x048, 0, 2, 7, CLK_CFG_UPDATE,
+                                  0, CLK_IS_CRITICAL),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_MEM_SEL, "mem_sel", mem_parents, 0x040,
+                            0x044, 0x048, 8, 2, 15, CLK_CFG_UPDATE, 1),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_MM_SEL, "mm_sel", mm_parents, 0x040, 0x044,
+                            0x048, 16, 3, 23, CLK_CFG_UPDATE, 2),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SCP_SEL, "scp_sel", scp_parents, 0x040,
+                            0x044, 0x048, 24, 3, 31, CLK_CFG_UPDATE, 3),
+       /* CLK_CFG_1 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_MFG_SEL, "mfg_sel", mfg_parents, 0x050,
+                            0x054, 0x058, 0, 2, 7, CLK_CFG_UPDATE, 4),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_ATB_SEL, "atb_sel", atb_parents, 0x050,
+                            0x054, 0x058, 8, 2, 15, CLK_CFG_UPDATE, 5),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG_SEL, "camtg_sel", camtg_parents,
+                            0x050, 0x054, 0x058, 16, 3, 23, CLK_CFG_UPDATE, 6),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG1_SEL, "camtg1_sel", camtg_parents,
+                            0x050, 0x054, 0x058, 24, 3, 31, CLK_CFG_UPDATE, 7),
+       /* CLK_CFG_2 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_UART_SEL, "uart_sel", uart_parents, 0x060,
+                            0x064, 0x068, 0, 1, 7, CLK_CFG_UPDATE, 8),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SPI_SEL, "spi_sel", spi_parents, 0x060,
+                            0x064, 0x068, 8, 2, 15, CLK_CFG_UPDATE, 9),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC50_0_HC_SEL, "msdc50_0_hc_sel",
+                            msdc50_0_hc_parents, 0x060, 0x064, 0x068, 16, 2,
+                            23, CLK_CFG_UPDATE, 10),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC2_2_HC_SEL, "msdc2_2_hc_sel",
+                            msdc50_0_hc_parents, 0x060, 0x064, 0x068, 24, 2,
+                            31, CLK_CFG_UPDATE, 11),
+       /* CLK_CFG_3 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC50_0_SEL, "msdc50_0_sel",
+                            msdc50_0_parents, 0x070, 0x074, 0x078, 0, 3, 7,
+                            CLK_CFG_UPDATE, 12),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC50_2_SEL, "msdc50_2_sel",
+                            msdc50_2_parents, 0x070, 0x074, 0x078, 8, 3, 15,
+                            CLK_CFG_UPDATE, 13),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC30_1_SEL, "msdc30_1_sel",
+                            msdc30_1_parents, 0x070, 0x074, 0x078, 16, 3, 23,
+                            CLK_CFG_UPDATE, 14),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUDIO_SEL, "audio_sel", audio_parents,
+                            0x070, 0x074, 0x078, 24, 2, 31, CLK_CFG_UPDATE,
+                            15),
+       /* CLK_CFG_4 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_INTBUS_SEL, "aud_intbus_sel",
+                            aud_intbus_parents, 0x080, 0x084, 0x088, 0, 2, 7,
+                            CLK_CFG_UPDATE, 16),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_1_SEL, "aud_1_sel", aud_1_parents,
+                            0x080, 0x084, 0x088, 8, 1, 15, CLK_CFG_UPDATE, 17),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_2_SEL, "aud_2_sel", aud_2_parents,
+                            0x080, 0x084, 0x088, 16, 1, 23, CLK_CFG_UPDATE,
+                            18),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_ENGEN1_SEL, "aud_engen1_sel",
+                            aud_engen1_parents, 0x080, 0x084, 0x088, 24, 2, 31,
+                            CLK_CFG_UPDATE, 19),
+       /* CLK_CFG_5 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_ENGEN2_SEL, "aud_engen2_sel",
+                            aud_engen2_parents, 0x090, 0x094, 0x098, 0, 2, 7,
+                            CLK_CFG_UPDATE, 20),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_SPDIF_SEL, "aud_spdif_sel",
+                            aud_spdif_parents, 0x090, 0x094, 0x098, 8, 1, 15,
+                            CLK_CFG_UPDATE, 21),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DISP_PWM_SEL, "disp_pwm_sel",
+                            disp_pwm_parents, 0x090, 0x094, 0x098, 16, 2, 23,
+                            CLK_CFG_UPDATE, 22),
+       /* CLK_CFG_6 */
+       MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_DXCC_SEL, "dxcc_sel", dxcc_parents,
+                                  0x0a0, 0x0a4, 0x0a8, 0, 2, 7, CLK_CFG_UPDATE,
+                                  24, CLK_IS_CRITICAL),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SSUSB_SYS_SEL, "ssusb_sys_sel",
+                            ssusb_sys_parents, 0x0a0, 0x0a4, 0x0a8, 8, 2, 15,
+                            CLK_CFG_UPDATE, 25),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SSUSB_XHCI_SEL, "ssusb_xhci_sel",
+                            ssusb_sys_parents, 0x0a0, 0x0a4, 0x0a8, 16, 2, 23,
+                            CLK_CFG_UPDATE, 26),
+       MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SPM_SEL, "spm_sel", spm_parents,
+                                  0x0a0, 0x0a4, 0x0a8, 24, 1, 31,
+                                  CLK_CFG_UPDATE, 27, CLK_IS_CRITICAL),
+       /* CLK_CFG_7 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_I2C_SEL, "i2c_sel", i2c_parents, 0x0b0,
+                            0x0b4, 0x0b8, 0, 3, 7, CLK_CFG_UPDATE, 28),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_PWM_SEL, "pwm_sel", pwm_parents, 0x0b0,
+                            0x0b4, 0x0b8, 8, 2, 15, CLK_CFG_UPDATE, 29),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_SENIF_SEL, "senif_sel", senif_parents,
+                            0x0b0, 0x0b4, 0x0b8, 16, 2, 23, CLK_CFG_UPDATE,
+                            30),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_AES_FDE_SEL, "aes_fde_sel",
+                            aes_fde_parents, 0x0b0, 0x0b4, 0x0b8, 24, 3, 31,
+                            CLK_CFG_UPDATE, 31),
+       /* CLK_CFG_8 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTM_SEL, "camtm_sel", senif_parents,
+                            0x0c0, 0x0c4, 0x0c8, 0, 2, 7, CLK_CFG_UPDATE1, 0),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DPI0_SEL, "dpi0_sel", dpi0_parents, 0x0c0,
+                            0x0c4, 0x0c8, 8, 3, 15, CLK_CFG_UPDATE1, 1),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DPI1_SEL, "dpi1_sel", dpi0_parents, 0x0c0,
+                            0x0c4, 0x0c8, 16, 3, 23, CLK_CFG_UPDATE1, 2),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_DSP_SEL, "dsp_sel", dsp_parents, 0x0c0,
+                            0x0c4, 0x0c8, 24, 3, 31, CLK_CFG_UPDATE1, 3),
+       /* CLK_CFG_9 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_NFI2X_SEL, "nfi2x_sel", nfi2x_parents,
+                            0x0d0, 0x0d4, 0x0d8, 0, 3, 7, CLK_CFG_UPDATE1, 4),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_NFIECC_SEL, "nfiecc_sel", nfiecc_parents,
+                            0x0d0, 0x0d4, 0x0d8, 8, 3, 15, CLK_CFG_UPDATE1, 5),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_ECC_SEL, "ecc_sel", ecc_parents, 0x0d0,
+                            0x0d4, 0x0d8, 16, 3, 23, CLK_CFG_UPDATE1, 6),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_ETH_SEL, "eth_sel", eth_parents, 0x0d0,
+                            0x0d4, 0x0d8, 24, 3, 31, CLK_CFG_UPDATE1, 7),
+       /* CLK_CFG_10 */
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_GCPU_SEL, "gcpu_sel", gcpu_parents, 0x0e0,
+                            0x0e4, 0x0e8, 0, 3, 7, CLK_CFG_UPDATE1, 8),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_GCPU_CPM_SEL, "gcpu_cpm_sel",
+                            gcpu_cpm_parents, 0x0e0, 0x0e4, 0x0e8, 8, 2, 15,
+                            CLK_CFG_UPDATE1, 9),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_APU_SEL, "apu_sel", apu_parents, 0x0e0,
+                            0x0e4, 0x0e8, 16, 3, 23, CLK_CFG_UPDATE1, 10),
+       MUX_GATE_CLR_SET_UPD(CLK_TOP_APU_IF_SEL, "apu_if_sel", apu_parents,
+                            0x0e0, 0x0e4, 0x0e8, 24, 3, 31, CLK_CFG_UPDATE1,
+                            11),
+};
+
+static const char * const mcu_bus_parents[] = {
+       "clk26m",
+       "armpll",
+       "mainpll",
+       "univpll_d2"
+};
+
+static struct mtk_composite mcu_muxes[] = {
+       /* bus_pll_divider_cfg */
+       MUX_GATE_FLAGS(CLK_MCU_BUS_SEL, "mcu_bus_sel", mcu_bus_parents, 0x7C0,
+                      9, 2, -1, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL),
+};
+
+#define DIV_ADJ_F(_id, _name, _parent, _reg, _shift, _width, _flags) { \
+               .id = _id,                                      \
+               .name = _name,                                  \
+               .parent_name = _parent,                         \
+               .div_reg = _reg,                                \
+               .div_shift = _shift,                            \
+               .div_width = _width,                            \
+               .clk_divider_flags = _flags,                    \
+}
+
+static const struct mtk_clk_divider top_adj_divs[] = {
+       DIV_ADJ_F(CLK_TOP_APLL12_CK_DIV0, "apll12_ck_div0", "apll_i2s0_sel",
+                 0x324, 0, 8, CLK_DIVIDER_ROUND_CLOSEST),
+       DIV_ADJ_F(CLK_TOP_APLL12_CK_DIV1, "apll12_ck_div1", "apll_i2s1_sel",
+                 0x324, 8, 8, CLK_DIVIDER_ROUND_CLOSEST),
+       DIV_ADJ_F(CLK_TOP_APLL12_CK_DIV2, "apll12_ck_div2", "apll_i2s2_sel",
+                 0x324, 16, 8, CLK_DIVIDER_ROUND_CLOSEST),
+       DIV_ADJ_F(CLK_TOP_APLL12_CK_DIV3, "apll12_ck_div3", "apll_i2s3_sel",
+                 0x324, 24, 8, CLK_DIVIDER_ROUND_CLOSEST),
+       DIV_ADJ_F(CLK_TOP_APLL12_CK_DIV6, "apll12_ck_div6", "apll_spdif_sel",
+                 0x32c, 0, 8, CLK_DIVIDER_ROUND_CLOSEST),
+};
+
+struct mtk_simple_gate {
+       int id;
+       const char *name;
+       const char *parent;
+       u32 reg;
+       u8 shift;
+       unsigned long gate_flags;
+};
+
+static const struct mtk_simple_gate top_clk_gates[] = {
+       { CLK_TOP_CONN_32K, "conn_32k", "clk32k", 0x0, 10, CLK_GATE_SET_TO_DISABLE },
+       { CLK_TOP_CONN_26M, "conn_26m", "clk26m", 0x0, 11, CLK_GATE_SET_TO_DISABLE },
+       { CLK_TOP_DSP_32K, "dsp_32k", "clk32k", 0x0, 16, CLK_GATE_SET_TO_DISABLE },
+       { CLK_TOP_DSP_26M, "dsp_26m", "clk26m", 0x0, 17, CLK_GATE_SET_TO_DISABLE },
+       { CLK_TOP_USB20_48M_EN, "usb20_48m_en", "usb20_192m_d4", 0x104, 8, 0 },
+       { CLK_TOP_UNIVPLL_48M_EN, "univpll_48m_en", "usb20_192m_d4", 0x104, 9, 0 },
+       { CLK_TOP_LVDSTX_CLKDIG_EN, "lvdstx_dig_en", "lvdstx_dig_cts", 0x104, 20, 0 },
+       { CLK_TOP_VPLL_DPIX_EN, "vpll_dpix_en", "vpll_dpix", 0x104, 21, 0 },
+       { CLK_TOP_SSUSB_TOP_CK_EN, "ssusb_top_ck_en", NULL, 0x104, 22, 0 },
+       { CLK_TOP_SSUSB_PHY_CK_EN, "ssusb_phy_ck_en", NULL, 0x104, 23, 0 },
+       { CLK_TOP_AUD_I2S0_M, "aud_i2s0_m_ck", "apll12_ck_div0", 0x320, 0, 0 },
+       { CLK_TOP_AUD_I2S1_M, "aud_i2s1_m_ck", "apll12_ck_div1", 0x320, 1, 0 },
+       { CLK_TOP_AUD_I2S2_M, "aud_i2s2_m_ck", "apll12_ck_div2", 0x320, 2, 0 },
+       { CLK_TOP_AUD_I2S3_M, "aud_i2s3_m_ck", "apll12_ck_div3", 0x320, 3, 0 },
+       { CLK_TOP_AUD_TDMOUT_M, "aud_tdmout_m_ck", "apll12_ck_div4", 0x320, 4, 0 },
+       { CLK_TOP_AUD_TDMOUT_B, "aud_tdmout_b_ck", "apll12_ck_div4b", 0x320, 5, 0 },
+       { CLK_TOP_AUD_TDMIN_M, "aud_tdmin_m_ck", "apll12_ck_div5", 0x320, 6, 0 },
+       { CLK_TOP_AUD_TDMIN_B, "aud_tdmin_b_ck", "apll12_ck_div5b", 0x320, 7, 0 },
+       { CLK_TOP_AUD_SPDIF_M, "aud_spdif_m_ck", "apll12_ck_div6", 0x320, 8, 0 },
+};
+
+static const struct mtk_gate_regs ifr2_cg_regs = {
+       .set_ofs = 0x80,
+       .clr_ofs = 0x84,
+       .sta_ofs = 0x90,
+};
+
+static const struct mtk_gate_regs ifr3_cg_regs = {
+       .set_ofs = 0x88,
+       .clr_ofs = 0x8c,
+       .sta_ofs = 0x94,
+};
+
+static const struct mtk_gate_regs ifr4_cg_regs = {
+       .set_ofs = 0xa4,
+       .clr_ofs = 0xa8,
+       .sta_ofs = 0xac,
+};
+
+static const struct mtk_gate_regs ifr5_cg_regs = {
+       .set_ofs = 0xc0,
+       .clr_ofs = 0xc4,
+       .sta_ofs = 0xc8,
+};
+
+static const struct mtk_gate_regs ifr6_cg_regs = {
+       .set_ofs = 0xd0,
+       .clr_ofs = 0xd4,
+       .sta_ofs = 0xd8,
+};
+
+#define GATE_IFR2(_id, _name, _parent, _shift) {       \
+               .id = _id,                              \
+               .name = _name,                          \
+               .parent_name = _parent,                 \
+               .regs = &ifr2_cg_regs,                  \
+               .shift = _shift,                        \
+               .ops = &mtk_clk_gate_ops_setclr,        \
+       }
+
+#define GATE_IFR3(_id, _name, _parent, _shift) {       \
+               .id = _id,                              \
+               .name = _name,                          \
+               .parent_name = _parent,                 \
+               .regs = &ifr3_cg_regs,                  \
+               .shift = _shift,                        \
+               .ops = &mtk_clk_gate_ops_setclr,        \
+       }
+
+#define GATE_IFR4(_id, _name, _parent, _shift) {       \
+               .id = _id,                              \
+               .name = _name,                          \
+               .parent_name = _parent,                 \
+               .regs = &ifr4_cg_regs,                  \
+               .shift = _shift,                        \
+               .ops = &mtk_clk_gate_ops_setclr,        \
+       }
+
+#define GATE_IFR5(_id, _name, _parent, _shift) {       \
+               .id = _id,                              \
+               .name = _name,                          \
+               .parent_name = _parent,                 \
+               .regs = &ifr5_cg_regs,                  \
+               .shift = _shift,                        \
+               .ops = &mtk_clk_gate_ops_setclr,        \
+       }
+
+#define GATE_IFR6(_id, _name, _parent, _shift) {       \
+               .id = _id,                              \
+               .name = _name,                          \
+               .parent_name = _parent,                 \
+               .regs = &ifr6_cg_regs,                  \
+               .shift = _shift,                        \
+               .ops = &mtk_clk_gate_ops_setclr,        \
+       }
+
+static const struct mtk_gate ifr_clks[] = {
+       /* IFR2 */
+       GATE_IFR2(CLK_IFR_PMIC_TMR, "ifr_pmic_tmr", "clk26m", 0),
+       GATE_IFR2(CLK_IFR_PMIC_AP, "ifr_pmic_ap", "clk26m", 1),
+       GATE_IFR2(CLK_IFR_PMIC_MD, "ifr_pmic_md", "clk26m", 2),
+       GATE_IFR2(CLK_IFR_PMIC_CONN, "ifr_pmic_conn", "clk26m", 3),
+       GATE_IFR2(CLK_IFR_ICUSB, "ifr_icusb", "axi_sel", 8),
+       GATE_IFR2(CLK_IFR_GCE, "ifr_gce", "axi_sel", 9),
+       GATE_IFR2(CLK_IFR_THERM, "ifr_therm", "axi_sel", 10),
+       GATE_IFR2(CLK_IFR_PWM_HCLK, "ifr_pwm_hclk", "axi_sel", 15),
+       GATE_IFR2(CLK_IFR_PWM1, "ifr_pwm1", "pwm_sel", 16),
+       GATE_IFR2(CLK_IFR_PWM2, "ifr_pwm2", "pwm_sel", 17),
+       GATE_IFR2(CLK_IFR_PWM3, "ifr_pwm3", "pwm_sel", 18),
+       GATE_IFR2(CLK_IFR_PWM4, "ifr_pwm4", "pwm_sel", 19),
+       GATE_IFR2(CLK_IFR_PWM5, "ifr_pwm5", "pwm_sel", 20),
+       GATE_IFR2(CLK_IFR_PWM, "ifr_pwm", "pwm_sel", 21),
+       GATE_IFR2(CLK_IFR_UART0, "ifr_uart0", "uart_sel", 22),
+       GATE_IFR2(CLK_IFR_UART1, "ifr_uart1", "uart_sel", 23),
+       GATE_IFR2(CLK_IFR_UART2, "ifr_uart2", "uart_sel", 24),
+       GATE_IFR2(CLK_IFR_DSP_UART, "ifr_dsp_uart", "uart_sel", 26),
+       GATE_IFR2(CLK_IFR_GCE_26M, "ifr_gce_26m", "clk26m", 27),
+       GATE_IFR2(CLK_IFR_CQ_DMA_FPC, "ifr_cq_dma_fpc", "axi_sel", 28),
+       GATE_IFR2(CLK_IFR_BTIF, "ifr_btif", "axi_sel", 31),
+       /* IFR3 */
+       GATE_IFR3(CLK_IFR_SPI0, "ifr_spi0", "spi_sel", 1),
+       GATE_IFR3(CLK_IFR_MSDC0_HCLK, "ifr_msdc0", "msdc50_0_hc_sel", 2),
+       GATE_IFR3(CLK_IFR_MSDC2_HCLK, "ifr_msdc2", "msdc2_2_hc_sel", 3),
+       GATE_IFR3(CLK_IFR_MSDC1_HCLK, "ifr_msdc1", "axi_sel", 4),
+       GATE_IFR3(CLK_IFR_DVFSRC, "ifr_dvfsrc", "clk26m", 7),
+       GATE_IFR3(CLK_IFR_GCPU, "ifr_gcpu", "axi_sel", 8),
+       GATE_IFR3(CLK_IFR_TRNG, "ifr_trng", "axi_sel", 9),
+       GATE_IFR3(CLK_IFR_AUXADC, "ifr_auxadc", "clk26m", 10),
+       GATE_IFR3(CLK_IFR_AUXADC_MD, "ifr_auxadc_md", "clk26m", 14),
+       GATE_IFR3(CLK_IFR_AP_DMA, "ifr_ap_dma", "axi_sel", 18),
+       GATE_IFR3(CLK_IFR_DEBUGSYS, "ifr_debugsys", "axi_sel", 24),
+       GATE_IFR3(CLK_IFR_AUDIO, "ifr_audio", "axi_sel", 25),
+       /* IFR4 */
+       GATE_IFR4(CLK_IFR_PWM_FBCLK6, "ifr_pwm_fbclk6", "pwm_sel", 0),
+       GATE_IFR4(CLK_IFR_DISP_PWM, "ifr_disp_pwm", "disp_pwm_sel", 2),
+       GATE_IFR4(CLK_IFR_AUD_26M_BK, "ifr_aud_26m_bk", "clk26m", 4),
+       GATE_IFR4(CLK_IFR_CQ_DMA, "ifr_cq_dma", "axi_sel", 27),
+       /* IFR5 */
+       GATE_IFR5(CLK_IFR_MSDC0_SF, "ifr_msdc0_sf", "msdc50_0_sel", 0),
+       GATE_IFR5(CLK_IFR_MSDC1_SF, "ifr_msdc1_sf", "msdc50_0_sel", 1),
+       GATE_IFR5(CLK_IFR_MSDC2_SF, "ifr_msdc2_sf", "msdc50_0_sel", 2),
+       GATE_IFR5(CLK_IFR_AP_MSDC0, "ifr_ap_msdc0", "msdc50_0_sel", 7),
+       GATE_IFR5(CLK_IFR_MD_MSDC0, "ifr_md_msdc0", "msdc50_0_sel", 8),
+       GATE_IFR5(CLK_IFR_MSDC0_SRC, "ifr_msdc0_src", "msdc50_0_sel", 9),
+       GATE_IFR5(CLK_IFR_MSDC1_SRC, "ifr_msdc1_src", "msdc30_1_sel", 10),
+       GATE_IFR5(CLK_IFR_MSDC2_SRC, "ifr_msdc2_src", "msdc50_2_sel", 11),
+       GATE_IFR5(CLK_IFR_PWRAP_TMR, "ifr_pwrap_tmr", "clk26m", 12),
+       GATE_IFR5(CLK_IFR_PWRAP_SPI, "ifr_pwrap_spi", "clk26m", 13),
+       GATE_IFR5(CLK_IFR_PWRAP_SYS, "ifr_pwrap_sys", "clk26m", 14),
+       GATE_IFR5(CLK_IFR_IRRX_26M, "ifr_irrx_26m", "clk26m", 22),
+       GATE_IFR5(CLK_IFR_IRRX_32K, "ifr_irrx_32k", "clk32k", 23),
+       GATE_IFR5(CLK_IFR_I2C0_AXI, "ifr_i2c0_axi", "i2c_sel", 24),
+       GATE_IFR5(CLK_IFR_I2C1_AXI, "ifr_i2c1_axi", "i2c_sel", 25),
+       GATE_IFR5(CLK_IFR_I2C2_AXI, "ifr_i2c2_axi", "i2c_sel", 26),
+       GATE_IFR5(CLK_IFR_I2C3_AXI, "ifr_i2c3_axi", "i2c_sel", 27),
+       GATE_IFR5(CLK_IFR_NIC_AXI, "ifr_nic_axi", "axi_sel", 28),
+       GATE_IFR5(CLK_IFR_NIC_SLV_AXI, "ifr_nic_slv_axi", "axi_sel", 29),
+       GATE_IFR5(CLK_IFR_APU_AXI, "ifr_apu_axi", "axi_sel", 30),
+       /* IFR6 */
+       GATE_IFR6(CLK_IFR_NFIECC, "ifr_nfiecc", "nfiecc_sel", 0),
+       GATE_IFR6(CLK_IFR_NFI1X_BK, "ifr_nfi1x_bk", "nfi2x_sel", 1),
+       GATE_IFR6(CLK_IFR_NFIECC_BK, "ifr_nfiecc_bk", "nfi2x_sel", 2),
+       GATE_IFR6(CLK_IFR_NFI_BK, "ifr_nfi_bk", "axi_sel", 3),
+       GATE_IFR6(CLK_IFR_MSDC2_AP_BK, "ifr_msdc2_ap_bk", "axi_sel", 4),
+       GATE_IFR6(CLK_IFR_MSDC2_MD_BK, "ifr_msdc2_md_bk", "axi_sel", 5),
+       GATE_IFR6(CLK_IFR_MSDC2_BK, "ifr_msdc2_bk", "axi_sel", 6),
+       GATE_IFR6(CLK_IFR_SUSB_133_BK, "ifr_susb_133_bk", "axi_sel", 7),
+       GATE_IFR6(CLK_IFR_SUSB_66_BK, "ifr_susb_66_bk", "axi_sel", 8),
+       GATE_IFR6(CLK_IFR_SSUSB_SYS, "ifr_ssusb_sys", "ssusb_sys_sel", 9),
+       GATE_IFR6(CLK_IFR_SSUSB_REF, "ifr_ssusb_ref", "ssusb_sys_sel", 10),
+       GATE_IFR6(CLK_IFR_SSUSB_XHCI, "ifr_ssusb_xhci", "ssusb_xhci_sel", 11),
+};
+
+static const struct mtk_simple_gate peri_clks[] = {
+       { CLK_PERIAXI, "periaxi", "axi_sel", 0x20c, 31, 0 },
+};
+
+#define MT8365_PLL_FMAX                (3800UL * MHZ)
+#define MT8365_PLL_FMIN                (1500UL * MHZ)
+#define CON0_MT8365_RST_BAR    BIT(23)
+
+#define PLL_B(_id, _name, _reg, _pwr_reg, _en_mask, _flags, _pcwbits,  \
+               _pd_reg, _pd_shift, _tuner_reg, _tuner_en_reg,          \
+               _tuner_en_bit,  _pcw_reg, _pcw_shift, _div_table,       \
+               _rst_bar_mask, _pcw_chg_reg) {                          \
+               .id = _id,                                              \
+               .name = _name,                                          \
+               .reg = _reg,                                            \
+               .pwr_reg = _pwr_reg,                                    \
+               .en_mask = _en_mask,                                    \
+               .flags = _flags,                                        \
+               .rst_bar_mask = _rst_bar_mask,                          \
+               .fmax = MT8365_PLL_FMAX,                                \
+               .fmin = MT8365_PLL_FMIN,                                \
+               .pcwbits = _pcwbits,                                    \
+               .pcwibits = 8,                                          \
+               .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,                            \
+               .div_table = _div_table,                                \
+       }
+
+#define PLL(_id, _name, _reg, _pwr_reg, _en_mask, _flags, _pcwbits,    \
+                       _pd_reg, _pd_shift, _tuner_reg,                 \
+                       _tuner_en_reg, _tuner_en_bit, _pcw_reg,         \
+                       _pcw_shift, _rst_bar_mask, _pcw_chg_reg)        \
+               PLL_B(_id, _name, _reg, _pwr_reg, _en_mask, _flags,     \
+                       _pcwbits, _pd_reg, _pd_shift,                   \
+                       _tuner_reg, _tuner_en_reg, _tuner_en_bit,       \
+                       _pcw_reg, _pcw_shift, NULL, _rst_bar_mask,      \
+                       _pcw_chg_reg)                                   \
+
+static const struct mtk_pll_div_table armpll_div_table[] = {
+       { .div = 0, .freq = MT8365_PLL_FMAX },
+       { .div = 1, .freq = 1500 * MHZ },
+       { .div = 2, .freq = 750 * MHZ },
+       { .div = 3, .freq = 375 * MHZ },
+       { .div = 4, .freq = 182500000 },
+       { } /* sentinel */
+};
+
+static const struct mtk_pll_div_table mfgpll_div_table[] = {
+       { .div = 0, .freq = MT8365_PLL_FMAX },
+       { .div = 1, .freq = 1600 * MHZ },
+       { .div = 2, .freq = 800 * MHZ },
+       { .div = 3, .freq = 400 * MHZ },
+       { .div = 4, .freq = 200 * MHZ },
+       { } /* sentinel */
+};
+
+static const struct mtk_pll_div_table dsppll_div_table[] = {
+       { .div = 0, .freq = MT8365_PLL_FMAX },
+       { .div = 1, .freq = 1600 * MHZ },
+       { .div = 2, .freq = 600 * MHZ },
+       { .div = 3, .freq = 400 * MHZ },
+       { .div = 4, .freq = 200 * MHZ },
+       { } /* sentinel */
+};
+
+static const struct mtk_pll_data plls[] = {
+       PLL_B(CLK_APMIXED_ARMPLL, "armpll", 0x030C, 0x0318, 0x00000001, PLL_AO,
+             22, 0x0310, 24, 0, 0, 0, 0x0310, 0, armpll_div_table, 0, 0),
+       PLL(CLK_APMIXED_MAINPLL, "mainpll", 0x0228, 0x0234, 0xFF000001,
+           HAVE_RST_BAR, 22, 0x022C, 24, 0, 0, 0, 0x022C, 0,
+           CON0_MT8365_RST_BAR, 0),
+       PLL(CLK_APMIXED_UNIVPLL, "univpll2", 0x0208, 0x0214, 0xFF000001,
+           HAVE_RST_BAR, 22, 0x020C, 24, 0, 0, 0, 0x020C, 0,
+           CON0_MT8365_RST_BAR, 0),
+       PLL_B(CLK_APMIXED_MFGPLL, "mfgpll", 0x0218, 0x0224, 0x00000001, 0, 22,
+             0x021C, 24, 0, 0, 0, 0x021C, 0, mfgpll_div_table, 0, 0),
+       PLL(CLK_APMIXED_MSDCPLL, "msdcpll", 0x0350, 0x035C, 0x00000001, 0, 22,
+           0x0354, 24, 0, 0, 0, 0x0354, 0, 0, 0),
+       PLL(CLK_APMIXED_MMPLL, "mmpll", 0x0330, 0x033C, 0x00000001, 0, 22,
+           0x0334, 24, 0, 0, 0, 0x0334, 0, 0, 0),
+       PLL(CLK_APMIXED_APLL1, "apll1", 0x031C, 0x032C, 0x00000001, 0, 32,
+           0x0320, 24, 0x0040, 0x000C, 0, 0x0324, 0, 0, 0x0320),
+       PLL(CLK_APMIXED_APLL2, "apll2", 0x0360, 0x0370, 0x00000001, 0, 32,
+           0x0364, 24, 0x004C, 0x000C, 5, 0x0368, 0, 0, 0x0364),
+       PLL(CLK_APMIXED_LVDSPLL, "lvdspll", 0x0374, 0x0380, 0x00000001, 0, 22,
+           0x0378, 24, 0, 0, 0, 0x0378, 0, 0, 0),
+       PLL_B(CLK_APMIXED_DSPPLL, "dsppll", 0x0390, 0x039C, 0x00000001, 0, 22,
+             0x0394, 24, 0, 0, 0, 0x0394, 0, dsppll_div_table, 0, 0),
+       PLL(CLK_APMIXED_APUPLL, "apupll", 0x03A0, 0x03AC, 0x00000001, 0, 22,
+           0x03A4, 24, 0, 0, 0, 0x03A4, 0, 0, 0),
+};
+
+static int clk_mt8365_apmixed_probe(struct platform_device *pdev)
+{
+       void __iomem *base;
+       struct clk_hw_onecell_data *clk_data;
+       struct device_node *node = pdev->dev.of_node;
+       struct device *dev = &pdev->dev;
+       struct clk_hw *hw;
+       int ret;
+
+       base = devm_platform_ioremap_resource(pdev, 0);
+       if (IS_ERR(base))
+               return PTR_ERR(base);
+
+       clk_data = mtk_devm_alloc_clk_data(dev, CLK_APMIXED_NR_CLK);
+       if (!clk_data)
+               return -ENOMEM;
+
+       hw = devm_clk_hw_register_gate(dev, "univ_en", "univpll2", 0,
+                                      base + 0x204, 0, 0, NULL);
+       if (IS_ERR(hw))
+               return PTR_ERR(hw);
+       clk_data->hws[CLK_APMIXED_UNIV_EN] = hw;
+
+       hw = devm_clk_hw_register_gate(dev, "usb20_en", "univ_en", 0,
+                                      base + 0x204, 1, 0, NULL);
+       if (IS_ERR(hw))
+               return PTR_ERR(hw);
+       clk_data->hws[CLK_APMIXED_USB20_EN] = hw;
+
+       ret = mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
+       if (ret)
+               return ret;
+
+       ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (ret)
+               goto unregister_plls;
+
+       return 0;
+
+unregister_plls:
+       mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
+
+       return ret;
+}
+
+static int
+clk_mt8365_register_mtk_simple_gates(struct device *dev, void __iomem *base,
+                                    struct clk_hw_onecell_data *clk_data,
+                                    const struct mtk_simple_gate *gates,
+                                    unsigned int num_gates)
+{
+       unsigned int i;
+
+       for (i = 0; i != num_gates; ++i) {
+               const struct mtk_simple_gate *gate = &gates[i];
+               struct clk_hw *hw;
+
+               hw = devm_clk_hw_register_gate(dev, gate->name, gate->parent, 0,
+                                              base + gate->reg, gate->shift,
+                                              gate->gate_flags, NULL);
+               if (IS_ERR(hw))
+                       return PTR_ERR(hw);
+
+               clk_data->hws[gate->id] = hw;
+       }
+
+       return 0;
+}
+
+static int clk_mt8365_top_probe(struct platform_device *pdev)
+{
+       void __iomem *base;
+       struct clk_hw_onecell_data *clk_data;
+       struct device_node *node = pdev->dev.of_node;
+       struct device *dev = &pdev->dev;
+       int ret;
+       int i;
+
+       base = devm_platform_ioremap_resource(pdev, 0);
+       if (IS_ERR(base))
+               return PTR_ERR(base);
+
+       clk_data = mtk_alloc_clk_data(CLK_TOP_NR_CLK);
+       if (!clk_data)
+               return -ENOMEM;
+
+       ret = mtk_clk_register_fixed_clks(top_fixed_clks,
+                                         ARRAY_SIZE(top_fixed_clks), clk_data);
+       if (ret)
+               goto free_clk_data;
+
+       ret = mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs),
+                                      clk_data);
+       if (ret)
+               goto unregister_fixed_clks;
+
+       ret = mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes), node,
+                                    &mt8365_clk_lock, clk_data);
+       if (ret)
+               goto unregister_factors;
+
+       ret = mtk_clk_register_composites(top_misc_mux_gates,
+                                         ARRAY_SIZE(top_misc_mux_gates), base,
+                                         &mt8365_clk_lock, clk_data);
+       if (ret)
+               goto unregister_muxes;
+
+       for (i = 0; i != ARRAY_SIZE(top_misc_muxes); ++i) {
+               struct mt8365_clk_audio_mux *mux = &top_misc_muxes[i];
+               struct clk_hw *hw;
+
+               hw = devm_clk_hw_register_mux(dev, mux->name, apll_i2s0_parents,
+                                             ARRAY_SIZE(apll_i2s0_parents),
+                                             CLK_SET_RATE_PARENT, base + 0x320,
+                                             mux->shift, 1, 0, NULL);
+               if (IS_ERR(hw)) {
+                       ret = PTR_ERR(hw);
+                       goto unregister_composites;
+               }
+
+               clk_data->hws[mux->id] = hw;
+       }
+
+       ret = mtk_clk_register_dividers(top_adj_divs, ARRAY_SIZE(top_adj_divs),
+                                       base, &mt8365_clk_lock, clk_data);
+       if (ret)
+               goto unregister_composites;
+
+       ret = clk_mt8365_register_mtk_simple_gates(dev, base, clk_data,
+                                                  top_clk_gates,
+                                                  ARRAY_SIZE(top_clk_gates));
+       if (ret)
+               goto unregister_dividers;
+
+       ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (ret)
+               goto unregister_dividers;
+
+       return 0;
+unregister_dividers:
+       mtk_clk_unregister_dividers(top_adj_divs, ARRAY_SIZE(top_adj_divs),
+                                   clk_data);
+unregister_composites:
+       mtk_clk_unregister_composites(top_misc_mux_gates,
+                                     ARRAY_SIZE(top_misc_mux_gates), clk_data);
+unregister_muxes:
+       mtk_clk_unregister_muxes(top_muxes, ARRAY_SIZE(top_muxes), clk_data);
+unregister_factors:
+       mtk_clk_unregister_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
+unregister_fixed_clks:
+       mtk_clk_unregister_fixed_clks(top_fixed_clks,
+                                     ARRAY_SIZE(top_fixed_clks), clk_data);
+free_clk_data:
+       mtk_free_clk_data(clk_data);
+
+       return ret;
+}
+
+static int clk_mt8365_infra_probe(struct platform_device *pdev)
+{
+       struct clk_hw_onecell_data *clk_data;
+       struct device_node *node = pdev->dev.of_node;
+       int ret;
+
+       clk_data = mtk_alloc_clk_data(CLK_IFR_NR_CLK);
+       if (!clk_data)
+               return -ENOMEM;
+
+       ret = mtk_clk_register_gates(node, ifr_clks, ARRAY_SIZE(ifr_clks),
+                                    clk_data);
+       if (ret)
+               goto free_clk_data;
+
+       ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (ret)
+               goto unregister_gates;
+
+       return 0;
+
+unregister_gates:
+       mtk_clk_unregister_gates(ifr_clks, ARRAY_SIZE(ifr_clks), clk_data);
+free_clk_data:
+       mtk_free_clk_data(clk_data);
+
+       return ret;
+}
+
+static int clk_mt8365_peri_probe(struct platform_device *pdev)
+{
+       void __iomem *base;
+       struct clk_hw_onecell_data *clk_data;
+       struct device *dev = &pdev->dev;
+       struct device_node *node = dev->of_node;
+       int ret;
+
+       base = devm_platform_ioremap_resource(pdev, 0);
+       if (IS_ERR(base))
+               return PTR_ERR(base);
+
+       clk_data = mtk_devm_alloc_clk_data(dev, CLK_PERI_NR_CLK);
+       if (!clk_data)
+               return -ENOMEM;
+
+       ret = clk_mt8365_register_mtk_simple_gates(dev, base, clk_data,
+                                                  peri_clks,
+                                                  ARRAY_SIZE(peri_clks));
+       if (ret)
+               return ret;
+
+       ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+
+       return ret;
+}
+
+static int clk_mt8365_mcu_probe(struct platform_device *pdev)
+{
+       struct clk_hw_onecell_data *clk_data;
+       struct device_node *node = pdev->dev.of_node;
+       void __iomem *base;
+       int ret;
+
+       base = devm_platform_ioremap_resource(pdev, 0);
+       if (IS_ERR(base))
+               return PTR_ERR(base);
+
+       clk_data = mtk_alloc_clk_data(CLK_MCU_NR_CLK);
+       if (!clk_data)
+               return -ENOMEM;
+
+       ret = mtk_clk_register_composites(mcu_muxes, ARRAY_SIZE(mcu_muxes),
+                                         base, &mt8365_clk_lock, clk_data);
+       if (ret)
+               goto free_clk_data;
+
+       ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (ret)
+               goto unregister_composites;
+
+       return 0;
+
+unregister_composites:
+       mtk_clk_unregister_composites(mcu_muxes, ARRAY_SIZE(mcu_muxes),
+                                     clk_data);
+free_clk_data:
+       mtk_free_clk_data(clk_data);
+
+       return ret;
+}
+
+static const struct of_device_id of_match_clk_mt8365[] = {
+       {
+               .compatible = "mediatek,mt8365-apmixedsys",
+               .data = clk_mt8365_apmixed_probe,
+       }, {
+               .compatible = "mediatek,mt8365-topckgen",
+               .data = clk_mt8365_top_probe,
+       }, {
+               .compatible = "mediatek,mt8365-infracfg",
+               .data = clk_mt8365_infra_probe,
+       }, {
+               .compatible = "mediatek,mt8365-pericfg",
+               .data = clk_mt8365_peri_probe,
+       }, {
+               .compatible = "mediatek,mt8365-mcucfg",
+               .data = clk_mt8365_mcu_probe,
+       }, {
+               /* sentinel */
+       }
+};
+
+static int clk_mt8365_probe(struct platform_device *pdev)
+{
+       int (*clk_probe)(struct platform_device *pdev);
+       int ret;
+
+       clk_probe = of_device_get_match_data(&pdev->dev);
+       if (!clk_probe)
+               return -EINVAL;
+
+       ret = clk_probe(pdev);
+       if (ret)
+               dev_err(&pdev->dev,
+                       "%s: could not register clock provider: %d\n",
+                       pdev->name, ret);
+
+       return ret;
+}
+
+static struct platform_driver clk_mt8365_drv = {
+       .probe = clk_mt8365_probe,
+       .driver = {
+               .name = "clk-mt8365",
+               .of_match_table = of_match_clk_mt8365,
+       },
+};
+
+static int __init clk_mt8365_init(void)
+{
+       return platform_driver_register(&clk_mt8365_drv);
+}
+arch_initcall(clk_mt8365_init);
+MODULE_LICENSE("GPL");
index 05a188c..d31f01d 100644 (file)
 #include "clk-mtk.h"
 #include "clk-gate.h"
 
-struct clk_hw_onecell_data *mtk_alloc_clk_data(unsigned int clk_num)
+static void mtk_init_clk_data(struct clk_hw_onecell_data *clk_data,
+                             unsigned int clk_num)
 {
        int i;
+
+       clk_data->num = clk_num;
+
+       for (i = 0; i < clk_num; i++)
+               clk_data->hws[i] = ERR_PTR(-ENOENT);
+}
+
+struct clk_hw_onecell_data *mtk_devm_alloc_clk_data(struct device *dev,
+                                                   unsigned int clk_num)
+{
        struct clk_hw_onecell_data *clk_data;
 
-       clk_data = kzalloc(struct_size(clk_data, hws, clk_num), GFP_KERNEL);
+       clk_data = devm_kzalloc(dev, struct_size(clk_data, hws, clk_num),
+                               GFP_KERNEL);
        if (!clk_data)
                return NULL;
 
-       clk_data->num = clk_num;
+       mtk_init_clk_data(clk_data, clk_num);
 
-       for (i = 0; i < clk_num; i++)
-               clk_data->hws[i] = ERR_PTR(-ENOENT);
+       return clk_data;
+}
+EXPORT_SYMBOL_GPL(mtk_devm_alloc_clk_data);
+
+struct clk_hw_onecell_data *mtk_alloc_clk_data(unsigned int clk_num)
+{
+       struct clk_hw_onecell_data *clk_data;
+
+       clk_data = kzalloc(struct_size(clk_data, hws, clk_num), GFP_KERNEL);
+       if (!clk_data)
+               return NULL;
+
+       mtk_init_clk_data(clk_data, clk_num);
 
        return clk_data;
 }
@@ -80,7 +103,7 @@ err:
                if (IS_ERR_OR_NULL(clk_data->hws[rc->id]))
                        continue;
 
-               clk_unregister_fixed_rate(clk_data->hws[rc->id]->clk);
+               clk_hw_unregister_fixed_rate(clk_data->hws[rc->id]);
                clk_data->hws[rc->id] = ERR_PTR(-ENOENT);
        }
 
@@ -102,7 +125,7 @@ void mtk_clk_unregister_fixed_clks(const struct mtk_fixed_clk *clks, int num,
                if (IS_ERR_OR_NULL(clk_data->hws[rc->id]))
                        continue;
 
-               clk_unregister_fixed_rate(clk_data->hws[rc->id]->clk);
+               clk_hw_unregister_fixed_rate(clk_data->hws[rc->id]);
                clk_data->hws[rc->id] = ERR_PTR(-ENOENT);
        }
 }
@@ -146,7 +169,7 @@ err:
                if (IS_ERR_OR_NULL(clk_data->hws[ff->id]))
                        continue;
 
-               clk_unregister_fixed_factor(clk_data->hws[ff->id]->clk);
+               clk_hw_unregister_fixed_factor(clk_data->hws[ff->id]);
                clk_data->hws[ff->id] = ERR_PTR(-ENOENT);
        }
 
@@ -168,7 +191,7 @@ void mtk_clk_unregister_factors(const struct mtk_fixed_factor *clks, int num,
                if (IS_ERR_OR_NULL(clk_data->hws[ff->id]))
                        continue;
 
-               clk_unregister_fixed_factor(clk_data->hws[ff->id]->clk);
+               clk_hw_unregister_fixed_factor(clk_data->hws[ff->id]);
                clk_data->hws[ff->id] = ERR_PTR(-ENOENT);
        }
 }
@@ -393,12 +416,13 @@ err:
                if (IS_ERR_OR_NULL(clk_data->hws[mcd->id]))
                        continue;
 
-               mtk_clk_unregister_composite(clk_data->hws[mcd->id]);
+               clk_hw_unregister_divider(clk_data->hws[mcd->id]);
                clk_data->hws[mcd->id] = ERR_PTR(-ENOENT);
        }
 
        return PTR_ERR(hw);
 }
+EXPORT_SYMBOL_GPL(mtk_clk_register_dividers);
 
 void mtk_clk_unregister_dividers(const struct mtk_clk_divider *mcds, int num,
                                 struct clk_hw_onecell_data *clk_data)
@@ -414,10 +438,11 @@ void mtk_clk_unregister_dividers(const struct mtk_clk_divider *mcds, int num,
                if (IS_ERR_OR_NULL(clk_data->hws[mcd->id]))
                        continue;
 
-               clk_unregister_divider(clk_data->hws[mcd->id]->clk);
+               clk_hw_unregister_divider(clk_data->hws[mcd->id]);
                clk_data->hws[mcd->id] = ERR_PTR(-ENOENT);
        }
 }
+EXPORT_SYMBOL_GPL(mtk_clk_unregister_dividers);
 
 int mtk_clk_simple_probe(struct platform_device *pdev)
 {
@@ -434,7 +459,8 @@ int mtk_clk_simple_probe(struct platform_device *pdev)
        if (!clk_data)
                return -ENOMEM;
 
-       r = mtk_clk_register_gates(node, mcd->clks, mcd->num_clks, clk_data);
+       r = mtk_clk_register_gates_with_dev(node, mcd->clks, mcd->num_clks,
+                                           clk_data, &pdev->dev);
        if (r)
                goto free_data;
 
@@ -459,6 +485,7 @@ free_data:
        mtk_free_clk_data(clk_data);
        return r;
 }
+EXPORT_SYMBOL_GPL(mtk_clk_simple_probe);
 
 int mtk_clk_simple_remove(struct platform_device *pdev)
 {
@@ -472,5 +499,6 @@ int mtk_clk_simple_remove(struct platform_device *pdev)
 
        return 0;
 }
+EXPORT_SYMBOL_GPL(mtk_clk_simple_remove);
 
 MODULE_LICENSE("GPL");
index 1b95c48..63ae794 100644 (file)
@@ -184,10 +184,13 @@ void mtk_clk_unregister_dividers(const struct mtk_clk_divider *mcds, int num,
                                 struct clk_hw_onecell_data *clk_data);
 
 struct clk_hw_onecell_data *mtk_alloc_clk_data(unsigned int clk_num);
+struct clk_hw_onecell_data *mtk_devm_alloc_clk_data(struct device *dev,
+                                                   unsigned int clk_num);
 void mtk_free_clk_data(struct clk_hw_onecell_data *clk_data);
 
 struct clk_hw *mtk_clk_register_ref2usb_tx(const char *name,
                        const char *parent_name, void __iomem *reg);
+void mtk_clk_unregister_ref2usb_tx(struct clk_hw *hw);
 
 struct mtk_clk_desc {
        const struct mtk_gate *clks;
index cd5f9fd..4421e48 100644 (file)
@@ -4,6 +4,7 @@
  * Author: Owen Chen <owen.chen@mediatek.com>
  */
 
+#include <linux/clk.h>
 #include <linux/clk-provider.h>
 #include <linux/compiler_types.h>
 #include <linux/container_of.h>
@@ -259,4 +260,41 @@ void mtk_clk_unregister_muxes(const struct mtk_mux *muxes, int num,
 }
 EXPORT_SYMBOL_GPL(mtk_clk_unregister_muxes);
 
+/*
+ * This clock notifier is called when the frequency of the parent
+ * PLL clock is to be changed. The idea is to switch the parent to a
+ * stable clock, such as the main oscillator, while the PLL frequency
+ * stabilizes.
+ */
+static int mtk_clk_mux_notifier_cb(struct notifier_block *nb,
+                                  unsigned long event, void *_data)
+{
+       struct clk_notifier_data *data = _data;
+       struct clk_hw *hw = __clk_get_hw(data->clk);
+       struct mtk_mux_nb *mux_nb = to_mtk_mux_nb(nb);
+       int ret = 0;
+
+       switch (event) {
+       case PRE_RATE_CHANGE:
+               mux_nb->original_index = mux_nb->ops->get_parent(hw);
+               ret = mux_nb->ops->set_parent(hw, mux_nb->bypass_index);
+               break;
+       case POST_RATE_CHANGE:
+       case ABORT_RATE_CHANGE:
+               ret = mux_nb->ops->set_parent(hw, mux_nb->original_index);
+               break;
+       }
+
+       return notifier_from_errno(ret);
+}
+
+int devm_mtk_clk_mux_notifier_register(struct device *dev, struct clk *clk,
+                                      struct mtk_mux_nb *mux_nb)
+{
+       mux_nb->nb.notifier_call = mtk_clk_mux_notifier_cb;
+
+       return devm_clk_notifier_register(dev, clk, &mux_nb->nb);
+}
+EXPORT_SYMBOL_GPL(devm_mtk_clk_mux_notifier_register);
+
 MODULE_LICENSE("GPL");
index 6539c58..83ff420 100644 (file)
@@ -7,12 +7,14 @@
 #ifndef __DRV_CLK_MTK_MUX_H
 #define __DRV_CLK_MTK_MUX_H
 
+#include <linux/notifier.h>
 #include <linux/spinlock.h>
 #include <linux/types.h>
 
 struct clk;
 struct clk_hw_onecell_data;
 struct clk_ops;
+struct device;
 struct device_node;
 
 struct mtk_mux {
@@ -89,4 +91,17 @@ int mtk_clk_register_muxes(const struct mtk_mux *muxes,
 void mtk_clk_unregister_muxes(const struct mtk_mux *muxes, int num,
                              struct clk_hw_onecell_data *clk_data);
 
+struct mtk_mux_nb {
+       struct notifier_block   nb;
+       const struct clk_ops    *ops;
+
+       u8      bypass_index;   /* Which parent to temporarily use */
+       u8      original_index; /* Set by notifier callback */
+};
+
+#define to_mtk_mux_nb(_nb)     container_of(_nb, struct mtk_mux_nb, nb)
+
+int devm_mtk_clk_mux_notifier_register(struct device *dev, struct clk *clk,
+                                      struct mtk_mux_nb *mux_nb);
+
 #endif /* __DRV_CLK_MTK_MUX_H */
index 1795055..290ceda 100644 (file)
@@ -228,5 +228,6 @@ int mtk_register_reset_controller_with_dev(struct device *dev,
 
        return 0;
 }
+EXPORT_SYMBOL_GPL(mtk_register_reset_controller_with_dev);
 
 MODULE_LICENSE("GPL");
index 1cf1ef7..76e6dee 100644 (file)
@@ -180,6 +180,14 @@ config MSM_GCC_8660
          Say Y if you want to use peripheral devices such as UART, SPI,
          i2c, USB, SD/eMMC, etc.
 
+config MSM_GCC_8909
+       tristate "MSM8909 Global Clock Controller"
+       select QCOM_GDSC
+       help
+         Support for the global clock controller on msm8909 devices.
+         Say Y if you want to use devices such as UART, SPI, I2C, USB,
+         SD/eMMC, display, graphics, camera etc.
+
 config MSM_GCC_8916
        tristate "MSM8916 Global Clock Controller"
        select QCOM_GDSC
@@ -445,6 +453,14 @@ config SC_GPUCC_7280
          Say Y if you want to support graphics controller devices and
          functionality such as 3D graphics.
 
+config SC_GPUCC_8280XP
+       tristate "SC8280XP Graphics Clock Controller"
+       select SC_GCC_8280XP
+       help
+         Support for the graphics clock controller on SC8280XP devices.
+         Say Y if you want to support graphics controller devices and
+         functionality such as 3D graphics.
+
 config SC_LPASSCC_7280
        tristate "SC7280 Low Power Audio Subsystem (LPASS) Clock Controller"
        select SC_GCC_7280
@@ -545,10 +561,10 @@ config QCS_Q6SSTOP_404
          controller to reset the Q6SSTOP subsystem.
 
 config SDM_GCC_845
-       tristate "SDM845 Global Clock Controller"
+       tristate "SDM845/SDM670 Global Clock Controller"
        select QCOM_GDSC
        help
-         Support for the global clock controller on SDM845 devices.
+         Support for the global clock controller on SDM845 and SDM670 devices.
          Say Y if you want to use peripheral devices such as UART, SPI,
          i2C, USB, UFS, SDDC, PCIe, etc.
 
@@ -616,6 +632,15 @@ config SM_CAMCC_8450
          Support for the camera clock controller on SM8450 devices.
          Say Y if you want to support camera devices and camera functionality.
 
+config SM_DISPCC_6115
+       tristate "SM6115 Display Clock Controller"
+       depends on SM_GCC_6115
+       help
+         Support for the display clock controller on Qualcomm Technologies, Inc
+         SM6115/SM4250 devices.
+         Say Y if you want to support display devices and functionality such as
+         splash screen
+
 config SM_DISPCC_6125
        tristate "SM6125 Display Clock Controller"
        depends on SM_GCC_6125
@@ -643,8 +668,18 @@ config SM_DISPCC_6350
          Say Y if you want to support display devices and functionality such as
          splash screen.
 
+config SM_DISPCC_8450
+       tristate "SM8450 Display Clock Controller"
+       depends on SM_GCC_8450
+       help
+         Support for the display clock controller on Qualcomm Technologies, Inc
+         SM8450 devices.
+         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"
+       select QCOM_GDSC
        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,
@@ -665,6 +700,14 @@ config SM_GCC_6350
          Say Y if you want to use peripheral devices such as UART,
          SPI, I2C, USB, SD/UFS, PCIe etc.
 
+config SM_GCC_6375
+       tristate "SM6375 Global Clock Controller"
+       select QCOM_GDSC
+       help
+         Support for the global clock controller on SM6375 devices.
+         Say Y if you want to use peripheral devices such as UART,
+         SPI, I2C, USB, SD/UFS etc.
+
 config SM_GCC_8150
        tristate "SM8150 Global Clock Controller"
        help
index fbcf040..e6cecf9 100644 (file)
@@ -32,6 +32,7 @@ obj-$(CONFIG_MDM_GCC_9607) += gcc-mdm9607.o
 obj-$(CONFIG_MDM_GCC_9615) += gcc-mdm9615.o
 obj-$(CONFIG_MDM_LCC_9615) += lcc-mdm9615.o
 obj-$(CONFIG_MSM_GCC_8660) += gcc-msm8660.o
+obj-$(CONFIG_MSM_GCC_8909) += gcc-msm8909.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
@@ -71,6 +72,7 @@ obj-$(CONFIG_SC_GCC_8180X) += gcc-sc8180x.o
 obj-$(CONFIG_SC_GCC_8280XP) += gcc-sc8280xp.o
 obj-$(CONFIG_SC_GPUCC_7180) += gpucc-sc7180.o
 obj-$(CONFIG_SC_GPUCC_7280) += gpucc-sc7280.o
+obj-$(CONFIG_SC_GPUCC_8280XP) += gpucc-sc8280xp.o
 obj-$(CONFIG_SC_LPASSCC_7280) += lpasscc-sc7280.o
 obj-$(CONFIG_SC_LPASS_CORECC_7180) += lpasscorecc-sc7180.o
 obj-$(CONFIG_SC_LPASS_CORECC_7280) += lpasscorecc-sc7280.o lpassaudiocc-sc7280.o
@@ -90,12 +92,15 @@ obj-$(CONFIG_SDX_GCC_55) += gcc-sdx55.o
 obj-$(CONFIG_SDX_GCC_65) += gcc-sdx65.o
 obj-$(CONFIG_SM_CAMCC_8250) += camcc-sm8250.o
 obj-$(CONFIG_SM_CAMCC_8450) += camcc-sm8450.o
+obj-$(CONFIG_SM_DISPCC_6115) += dispcc-sm6115.o
 obj-$(CONFIG_SM_DISPCC_6125) += dispcc-sm6125.o
 obj-$(CONFIG_SM_DISPCC_6350) += dispcc-sm6350.o
 obj-$(CONFIG_SM_DISPCC_8250) += dispcc-sm8250.o
+obj-$(CONFIG_SM_DISPCC_8450) += dispcc-sm8450.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_6375) += gcc-sm6375.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 329d2c5..f9c5e29 100644 (file)
@@ -127,7 +127,9 @@ static int qcom_a53pll_probe(struct platform_device *pdev)
        if (!init.name)
                return -ENOMEM;
 
-       init.parent_names = (const char *[]){ "xo" };
+       init.parent_data = &(const struct clk_parent_data){
+               .fw_name = "xo", .name = "xo_board",
+       };
        init.num_parents = 1;
        init.ops = &clk_pll_sr2_ops;
        pll->clkr.hw.init = &init;
index bef7899..a5aea27 100644 (file)
@@ -2,6 +2,7 @@
 // Copyright (c) 2018, The Linux Foundation. All rights reserved.
 #include <linux/clk-provider.h>
 #include <linux/module.h>
+#include <linux/of_device.h>
 #include <linux/platform_device.h>
 #include <linux/regmap.h>
 
@@ -36,12 +37,28 @@ static struct clk_alpha_pll ipq_pll = {
        },
 };
 
-static const struct alpha_pll_config ipq_pll_config = {
+static const struct alpha_pll_config ipq6018_pll_config = {
        .l = 0x37,
-       .config_ctl_val = 0x04141200,
-       .config_ctl_hi_val = 0x0,
+       .config_ctl_val = 0x240d4828,
+       .config_ctl_hi_val = 0x6,
        .early_output_mask = BIT(3),
+       .aux2_output_mask = BIT(2),
+       .aux_output_mask = BIT(1),
        .main_output_mask = BIT(0),
+       .test_ctl_val = 0x1c0000C0,
+       .test_ctl_hi_val = 0x4000,
+};
+
+static const struct alpha_pll_config ipq8074_pll_config = {
+       .l = 0x48,
+       .config_ctl_val = 0x200d4828,
+       .config_ctl_hi_val = 0x6,
+       .early_output_mask = BIT(3),
+       .aux2_output_mask = BIT(2),
+       .aux_output_mask = BIT(1),
+       .main_output_mask = BIT(0),
+       .test_ctl_val = 0x1c000000,
+       .test_ctl_hi_val = 0x4000,
 };
 
 static const struct regmap_config ipq_pll_regmap_config = {
@@ -54,6 +71,7 @@ static const struct regmap_config ipq_pll_regmap_config = {
 
 static int apss_ipq_pll_probe(struct platform_device *pdev)
 {
+       const struct alpha_pll_config *ipq_pll_config;
        struct device *dev = &pdev->dev;
        struct regmap *regmap;
        void __iomem *base;
@@ -67,7 +85,11 @@ static int apss_ipq_pll_probe(struct platform_device *pdev)
        if (IS_ERR(regmap))
                return PTR_ERR(regmap);
 
-       clk_alpha_pll_configure(&ipq_pll, regmap, &ipq_pll_config);
+       ipq_pll_config = of_device_get_match_data(&pdev->dev);
+       if (!ipq_pll_config)
+               return -ENODEV;
+
+       clk_alpha_pll_configure(&ipq_pll, regmap, ipq_pll_config);
 
        ret = devm_clk_register_regmap(dev, &ipq_pll.clkr);
        if (ret)
@@ -78,7 +100,8 @@ static int apss_ipq_pll_probe(struct platform_device *pdev)
 }
 
 static const struct of_device_id apss_ipq_pll_match_table[] = {
-       { .compatible = "qcom,ipq6018-a53pll" },
+       { .compatible = "qcom,ipq6018-a53pll", .data = &ipq6018_pll_config },
+       { .compatible = "qcom,ipq8074-a53pll", .data = &ipq8074_pll_config },
        { }
 };
 MODULE_DEVICE_TABLE(of, apss_ipq_pll_match_table);
index d78ff2f..f2f502e 100644 (file)
@@ -16,7 +16,7 @@
 #include "clk-regmap.h"
 #include "clk-branch.h"
 #include "clk-alpha-pll.h"
-#include "clk-regmap-mux.h"
+#include "clk-rcg.h"
 
 enum {
        P_XO,
@@ -33,16 +33,15 @@ static const struct parent_map parents_apcs_alias0_clk_src_map[] = {
        { P_APSS_PLL_EARLY, 5 },
 };
 
-static struct clk_regmap_mux apcs_alias0_clk_src = {
-       .reg = 0x0050,
-       .width = 3,
-       .shift = 7,
+static struct clk_rcg2 apcs_alias0_clk_src = {
+       .cmd_rcgr = 0x0050,
+       .hid_width = 5,
        .parent_map = parents_apcs_alias0_clk_src_map,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "apcs_alias0_clk_src",
                .parent_data = parents_apcs_alias0_clk_src,
-               .num_parents = 2,
-               .ops = &clk_regmap_mux_closest_ops,
+               .num_parents = ARRAY_SIZE(parents_apcs_alias0_clk_src),
+               .ops = &clk_rcg2_mux_closest_ops,
                .flags = CLK_SET_RATE_PARENT,
        },
 };
@@ -57,7 +56,7 @@ static struct clk_branch apcs_alias0_core_clk = {
                        .parent_hws = (const struct clk_hw *[]){
                                &apcs_alias0_clk_src.clkr.hw },
                        .num_parents = 1,
-                       .flags = CLK_SET_RATE_PARENT,
+                       .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
                        .ops = &clk_branch2_ops,
                },
        },
index b426847..1973d79 100644 (file)
@@ -27,6 +27,7 @@
 # define PLL_VOTE_FSM_RESET    BIT(21)
 # define PLL_UPDATE            BIT(22)
 # define PLL_UPDATE_BYPASS     BIT(23)
+# define PLL_FSM_LEGACY_MODE   BIT(24)
 # define PLL_OFFLINE_ACK       BIT(28)
 # define ALPHA_PLL_ACK_LATCH   BIT(29)
 # define PLL_ACTIVE_FLAG       BIT(30)
@@ -166,6 +167,27 @@ const u8 clk_alpha_pll_regs[][PLL_OFF_MAX_REGS] = {
                [PLL_OFF_TEST_CTL] = 0x28,
                [PLL_OFF_TEST_CTL_U] = 0x2c,
        },
+       [CLK_ALPHA_PLL_TYPE_DEFAULT_EVO] =  {
+               [PLL_OFF_L_VAL] = 0x04,
+               [PLL_OFF_ALPHA_VAL] = 0x08,
+               [PLL_OFF_ALPHA_VAL_U] = 0x0c,
+               [PLL_OFF_TEST_CTL] = 0x10,
+               [PLL_OFF_TEST_CTL_U] = 0x14,
+               [PLL_OFF_USER_CTL] = 0x18,
+               [PLL_OFF_USER_CTL_U] = 0x1c,
+               [PLL_OFF_CONFIG_CTL] = 0x20,
+               [PLL_OFF_STATUS] = 0x24,
+       },
+       [CLK_ALPHA_PLL_TYPE_BRAMMO_EVO] =  {
+               [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,
+       },
 };
 EXPORT_SYMBOL_GPL(clk_alpha_pll_regs);
 
@@ -1102,6 +1124,10 @@ void clk_fabia_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
                regmap_update_bits(regmap, PLL_USER_CTL(pll), mask, val);
        }
 
+       if (pll->flags & SUPPORTS_FSM_LEGACY_MODE)
+               regmap_update_bits(regmap, PLL_MODE(pll), PLL_FSM_LEGACY_MODE,
+                                                       PLL_FSM_LEGACY_MODE);
+
        regmap_update_bits(regmap, PLL_MODE(pll), PLL_UPDATE_BYPASS,
                                                        PLL_UPDATE_BYPASS);
 
@@ -2088,7 +2114,7 @@ static int alpha_pll_lucid_evo_enable(struct clk_hw *hw)
        return ret;
 }
 
-static void alpha_pll_lucid_evo_disable(struct clk_hw *hw)
+static void _alpha_pll_lucid_evo_disable(struct clk_hw *hw, bool reset)
 {
        struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
        struct regmap *regmap = pll->clkr.regmap;
@@ -2117,9 +2143,12 @@ static void alpha_pll_lucid_evo_disable(struct clk_hw *hw)
 
        /* Place the PLL mode in STANDBY */
        regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY);
+
+       if (reset)
+               regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, 0);
 }
 
-static int alpha_pll_lucid_evo_prepare(struct clk_hw *hw)
+static int _alpha_pll_lucid_evo_prepare(struct clk_hw *hw, bool reset)
 {
        struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
        struct clk_hw *p;
@@ -2139,11 +2168,31 @@ static int alpha_pll_lucid_evo_prepare(struct clk_hw *hw)
        if (ret)
                return ret;
 
-       alpha_pll_lucid_evo_disable(hw);
+       _alpha_pll_lucid_evo_disable(hw, reset);
 
        return 0;
 }
 
+static void alpha_pll_lucid_evo_disable(struct clk_hw *hw)
+{
+       _alpha_pll_lucid_evo_disable(hw, false);
+}
+
+static int alpha_pll_lucid_evo_prepare(struct clk_hw *hw)
+{
+       return _alpha_pll_lucid_evo_prepare(hw, false);
+}
+
+static void alpha_pll_reset_lucid_evo_disable(struct clk_hw *hw)
+{
+       _alpha_pll_lucid_evo_disable(hw, true);
+}
+
+static int alpha_pll_reset_lucid_evo_prepare(struct clk_hw *hw)
+{
+       return _alpha_pll_lucid_evo_prepare(hw, true);
+}
+
 static unsigned long alpha_pll_lucid_evo_recalc_rate(struct clk_hw *hw,
                                                     unsigned long parent_rate)
 {
@@ -2191,6 +2240,17 @@ const struct clk_ops clk_alpha_pll_lucid_evo_ops = {
 };
 EXPORT_SYMBOL_GPL(clk_alpha_pll_lucid_evo_ops);
 
+const struct clk_ops clk_alpha_pll_reset_lucid_evo_ops = {
+       .prepare = alpha_pll_reset_lucid_evo_prepare,
+       .enable = alpha_pll_lucid_evo_enable,
+       .disable = alpha_pll_reset_lucid_evo_disable,
+       .is_enabled = clk_trion_pll_is_enabled,
+       .recalc_rate = alpha_pll_lucid_evo_recalc_rate,
+       .round_rate = clk_alpha_pll_round_rate,
+       .set_rate = alpha_pll_lucid_5lpe_set_rate,
+};
+EXPORT_SYMBOL_GPL(clk_alpha_pll_reset_lucid_evo_ops);
+
 void clk_rivian_evo_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
                                  const struct alpha_pll_config *config)
 {
index 447efb8..f9524b3 100644 (file)
@@ -19,6 +19,8 @@ enum {
        CLK_ALPHA_PLL_TYPE_ZONDA,
        CLK_ALPHA_PLL_TYPE_LUCID_EVO,
        CLK_ALPHA_PLL_TYPE_RIVIAN_EVO,
+       CLK_ALPHA_PLL_TYPE_DEFAULT_EVO,
+       CLK_ALPHA_PLL_TYPE_BRAMMO_EVO,
        CLK_ALPHA_PLL_TYPE_MAX,
 };
 
@@ -70,9 +72,10 @@ struct clk_alpha_pll {
 
        const struct pll_vco *vco_table;
        size_t num_vco;
-#define SUPPORTS_OFFLINE_REQ   BIT(0)
-#define SUPPORTS_FSM_MODE      BIT(2)
+#define SUPPORTS_OFFLINE_REQ           BIT(0)
+#define SUPPORTS_FSM_MODE              BIT(2)
 #define SUPPORTS_DYNAMIC_UPDATE        BIT(3)
+#define SUPPORTS_FSM_LEGACY_MODE       BIT(4)
        u8 flags;
 
        struct clk_regmap clkr;
@@ -155,6 +158,7 @@ extern const struct clk_ops clk_alpha_pll_zonda_ops;
 #define clk_alpha_pll_postdiv_zonda_ops clk_alpha_pll_postdiv_fabia_ops
 
 extern const struct clk_ops clk_alpha_pll_lucid_evo_ops;
+extern const struct clk_ops clk_alpha_pll_reset_lucid_evo_ops;
 extern const struct clk_ops clk_alpha_pll_fixed_lucid_evo_ops;
 extern const struct clk_ops clk_alpha_pll_postdiv_lucid_evo_ops;
 
index 4a4fde8..ee76ef9 100644 (file)
@@ -49,6 +49,7 @@
  * detect voltage droops.
  */
 
+#include <linux/bitfield.h>
 #include <linux/clk.h>
 #include <linux/clk-provider.h>
 #include <linux/io.h>
 
 #include "clk-alpha-pll.h"
 #include "clk-regmap.h"
+#include "clk-regmap-mux.h"
 
 enum _pmux_input {
-       DIV_2_INDEX = 0,
+       SMUX_INDEX = 0,
        PLL_INDEX,
        ACD_INDEX,
        ALT_INDEX,
@@ -75,6 +77,8 @@ enum _pmux_input {
 #define ALT_PLL_OFFSET 0x100
 #define SSSCTL_OFFSET 0x160
 
+#define PMUX_MASK      0x3
+
 static const u8 prim_pll_regs[PLL_OFF_MAX_REGS] = {
        [PLL_OFF_L_VAL] = 0x04,
        [PLL_OFF_ALPHA_VAL] = 0x08,
@@ -111,30 +115,90 @@ static const struct alpha_pll_config hfpll_config = {
        .early_output_mask = BIT(3),
 };
 
-static struct clk_alpha_pll perfcl_pll = {
-       .offset = PERFCL_REG_OFFSET,
+static const struct clk_parent_data pll_parent[] = {
+       { .fw_name = "xo" },
+};
+
+static struct clk_alpha_pll pwrcl_pll = {
+       .offset = PWRCL_REG_OFFSET,
        .regs = prim_pll_regs,
        .flags = SUPPORTS_DYNAMIC_UPDATE | SUPPORTS_FSM_MODE,
        .clkr.hw.init = &(struct clk_init_data){
-               .name = "perfcl_pll",
-               .parent_names = (const char *[]){ "xo" },
-               .num_parents = 1,
+               .name = "pwrcl_pll",
+               .parent_data = pll_parent,
+               .num_parents = ARRAY_SIZE(pll_parent),
                .ops = &clk_alpha_pll_huayra_ops,
        },
 };
 
-static struct clk_alpha_pll pwrcl_pll = {
-       .offset = PWRCL_REG_OFFSET,
+static struct clk_alpha_pll perfcl_pll = {
+       .offset = PERFCL_REG_OFFSET,
        .regs = prim_pll_regs,
        .flags = SUPPORTS_DYNAMIC_UPDATE | SUPPORTS_FSM_MODE,
        .clkr.hw.init = &(struct clk_init_data){
-               .name = "pwrcl_pll",
-               .parent_names = (const char *[]){ "xo" },
-               .num_parents = 1,
+               .name = "perfcl_pll",
+               .parent_data = pll_parent,
+               .num_parents = ARRAY_SIZE(pll_parent),
                .ops = &clk_alpha_pll_huayra_ops,
        },
 };
 
+static struct clk_fixed_factor pwrcl_pll_postdiv = {
+       .mult = 1,
+       .div = 2,
+       .hw.init = &(struct clk_init_data){
+               .name = "pwrcl_pll_postdiv",
+               .parent_data = &(const struct clk_parent_data){
+                       .hw = &pwrcl_pll.clkr.hw
+               },
+               .num_parents = 1,
+               .ops = &clk_fixed_factor_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
+static struct clk_fixed_factor perfcl_pll_postdiv = {
+       .mult = 1,
+       .div = 2,
+       .hw.init = &(struct clk_init_data){
+               .name = "perfcl_pll_postdiv",
+               .parent_data = &(const struct clk_parent_data){
+                       .hw = &perfcl_pll.clkr.hw
+               },
+               .num_parents = 1,
+               .ops = &clk_fixed_factor_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
+static struct clk_fixed_factor perfcl_pll_acd = {
+       .mult = 1,
+       .div = 1,
+       .hw.init = &(struct clk_init_data){
+               .name = "perfcl_pll_acd",
+               .parent_data = &(const struct clk_parent_data){
+                       .hw = &perfcl_pll.clkr.hw
+               },
+               .num_parents = 1,
+               .ops = &clk_fixed_factor_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
+static struct clk_fixed_factor pwrcl_pll_acd = {
+       .mult = 1,
+       .div = 1,
+       .hw.init = &(struct clk_init_data){
+               .name = "pwrcl_pll_acd",
+               .parent_data = &(const struct clk_parent_data){
+                       .hw = &pwrcl_pll.clkr.hw
+               },
+               .num_parents = 1,
+               .ops = &clk_fixed_factor_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
 static const struct pll_vco alt_pll_vco_modes[] = {
        VCO(3,  250000000,  500000000),
        VCO(2,  500000000,  750000000),
@@ -153,93 +217,87 @@ static const struct alpha_pll_config altpll_config = {
        .early_output_mask = BIT(3),
 };
 
-static struct clk_alpha_pll perfcl_alt_pll = {
-       .offset = PERFCL_REG_OFFSET + ALT_PLL_OFFSET,
+static struct clk_alpha_pll pwrcl_alt_pll = {
+       .offset = PWRCL_REG_OFFSET + ALT_PLL_OFFSET,
        .regs = alt_pll_regs,
        .vco_table = alt_pll_vco_modes,
        .num_vco = ARRAY_SIZE(alt_pll_vco_modes),
        .flags = SUPPORTS_OFFLINE_REQ | SUPPORTS_FSM_MODE,
        .clkr.hw.init = &(struct clk_init_data) {
-               .name = "perfcl_alt_pll",
-               .parent_names = (const char *[]){ "xo" },
-               .num_parents = 1,
+               .name = "pwrcl_alt_pll",
+               .parent_data = pll_parent,
+               .num_parents = ARRAY_SIZE(pll_parent),
                .ops = &clk_alpha_pll_hwfsm_ops,
        },
 };
 
-static struct clk_alpha_pll pwrcl_alt_pll = {
-       .offset = PWRCL_REG_OFFSET + ALT_PLL_OFFSET,
+static struct clk_alpha_pll perfcl_alt_pll = {
+       .offset = PERFCL_REG_OFFSET + ALT_PLL_OFFSET,
        .regs = alt_pll_regs,
        .vco_table = alt_pll_vco_modes,
        .num_vco = ARRAY_SIZE(alt_pll_vco_modes),
        .flags = SUPPORTS_OFFLINE_REQ | SUPPORTS_FSM_MODE,
        .clkr.hw.init = &(struct clk_init_data) {
-               .name = "pwrcl_alt_pll",
-               .parent_names = (const char *[]){ "xo" },
-               .num_parents = 1,
+               .name = "perfcl_alt_pll",
+               .parent_data = pll_parent,
+               .num_parents = ARRAY_SIZE(pll_parent),
                .ops = &clk_alpha_pll_hwfsm_ops,
        },
 };
 
-struct clk_cpu_8996_mux {
+struct clk_cpu_8996_pmux {
        u32     reg;
-       u8      shift;
-       u8      width;
        struct notifier_block nb;
-       struct clk_hw   *pll;
-       struct clk_hw   *pll_div_2;
        struct clk_regmap clkr;
 };
 
 static int cpu_clk_notifier_cb(struct notifier_block *nb, unsigned long event,
                               void *data);
 
-#define to_clk_cpu_8996_mux_nb(_nb) \
-       container_of(_nb, struct clk_cpu_8996_mux, nb)
+#define to_clk_cpu_8996_pmux_nb(_nb) \
+       container_of(_nb, struct clk_cpu_8996_pmux, nb)
 
-static inline struct clk_cpu_8996_mux *to_clk_cpu_8996_mux_hw(struct clk_hw *hw)
+static inline struct clk_cpu_8996_pmux *to_clk_cpu_8996_pmux_hw(struct clk_hw *hw)
 {
-       return container_of(to_clk_regmap(hw), struct clk_cpu_8996_mux, clkr);
+       return container_of(to_clk_regmap(hw), struct clk_cpu_8996_pmux, clkr);
 }
 
-static u8 clk_cpu_8996_mux_get_parent(struct clk_hw *hw)
+static u8 clk_cpu_8996_pmux_get_parent(struct clk_hw *hw)
 {
        struct clk_regmap *clkr = to_clk_regmap(hw);
-       struct clk_cpu_8996_mux *cpuclk = to_clk_cpu_8996_mux_hw(hw);
-       u32 mask = GENMASK(cpuclk->width - 1, 0);
+       struct clk_cpu_8996_pmux *cpuclk = to_clk_cpu_8996_pmux_hw(hw);
        u32 val;
 
        regmap_read(clkr->regmap, cpuclk->reg, &val);
-       val >>= cpuclk->shift;
 
-       return val & mask;
+       return FIELD_GET(PMUX_MASK, val);
 }
 
-static int clk_cpu_8996_mux_set_parent(struct clk_hw *hw, u8 index)
+static int clk_cpu_8996_pmux_set_parent(struct clk_hw *hw, u8 index)
 {
        struct clk_regmap *clkr = to_clk_regmap(hw);
-       struct clk_cpu_8996_mux *cpuclk = to_clk_cpu_8996_mux_hw(hw);
-       u32 mask = GENMASK(cpuclk->width + cpuclk->shift - 1, cpuclk->shift);
+       struct clk_cpu_8996_pmux *cpuclk = to_clk_cpu_8996_pmux_hw(hw);
        u32 val;
 
-       val = index;
-       val <<= cpuclk->shift;
+       val = FIELD_PREP(PMUX_MASK, index);
 
-       return regmap_update_bits(clkr->regmap, cpuclk->reg, mask, val);
+       return regmap_update_bits(clkr->regmap, cpuclk->reg, PMUX_MASK, val);
 }
 
-static int clk_cpu_8996_mux_determine_rate(struct clk_hw *hw,
+static int clk_cpu_8996_pmux_determine_rate(struct clk_hw *hw,
                                           struct clk_rate_request *req)
 {
-       struct clk_cpu_8996_mux *cpuclk = to_clk_cpu_8996_mux_hw(hw);
-       struct clk_hw *parent = cpuclk->pll;
+       struct clk_hw *parent;
 
-       if (cpuclk->pll_div_2 && req->rate < DIV_2_THRESHOLD) {
-               if (req->rate < (DIV_2_THRESHOLD / 2))
-                       return -EINVAL;
+       if (req->rate < (DIV_2_THRESHOLD / 2))
+               return -EINVAL;
 
-               parent = cpuclk->pll_div_2;
-       }
+       if (req->rate < DIV_2_THRESHOLD)
+               parent = clk_hw_get_parent_by_index(hw, SMUX_INDEX);
+       else
+               parent = clk_hw_get_parent_by_index(hw, ACD_INDEX);
+       if (!parent)
+               return -EINVAL;
 
        req->best_parent_rate = clk_hw_round_rate(parent, req->rate);
        req->best_parent_hw = parent;
@@ -247,83 +305,83 @@ static int clk_cpu_8996_mux_determine_rate(struct clk_hw *hw,
        return 0;
 }
 
-static const struct clk_ops clk_cpu_8996_mux_ops = {
-       .set_parent = clk_cpu_8996_mux_set_parent,
-       .get_parent = clk_cpu_8996_mux_get_parent,
-       .determine_rate = clk_cpu_8996_mux_determine_rate,
+static const struct clk_ops clk_cpu_8996_pmux_ops = {
+       .set_parent = clk_cpu_8996_pmux_set_parent,
+       .get_parent = clk_cpu_8996_pmux_get_parent,
+       .determine_rate = clk_cpu_8996_pmux_determine_rate,
+};
+
+static const struct clk_parent_data pwrcl_smux_parents[] = {
+       { .fw_name = "xo" },
+       { .hw = &pwrcl_pll_postdiv.hw },
 };
 
-static struct clk_cpu_8996_mux pwrcl_smux = {
+static const struct clk_parent_data perfcl_smux_parents[] = {
+       { .fw_name = "xo" },
+       { .hw = &perfcl_pll_postdiv.hw },
+};
+
+static struct clk_regmap_mux pwrcl_smux = {
        .reg = PWRCL_REG_OFFSET + MUX_OFFSET,
        .shift = 2,
        .width = 2,
        .clkr.hw.init = &(struct clk_init_data) {
                .name = "pwrcl_smux",
-               .parent_names = (const char *[]){
-                       "xo",
-                       "pwrcl_pll_main",
-               },
-               .num_parents = 2,
-               .ops = &clk_cpu_8996_mux_ops,
+               .parent_data = pwrcl_smux_parents,
+               .num_parents = ARRAY_SIZE(pwrcl_smux_parents),
+               .ops = &clk_regmap_mux_closest_ops,
                .flags = CLK_SET_RATE_PARENT,
        },
 };
 
-static struct clk_cpu_8996_mux perfcl_smux = {
+static struct clk_regmap_mux perfcl_smux = {
        .reg = PERFCL_REG_OFFSET + MUX_OFFSET,
        .shift = 2,
        .width = 2,
        .clkr.hw.init = &(struct clk_init_data) {
                .name = "perfcl_smux",
-               .parent_names = (const char *[]){
-                       "xo",
-                       "perfcl_pll_main",
-               },
-               .num_parents = 2,
-               .ops = &clk_cpu_8996_mux_ops,
+               .parent_data = perfcl_smux_parents,
+               .num_parents = ARRAY_SIZE(perfcl_smux_parents),
+               .ops = &clk_regmap_mux_closest_ops,
                .flags = CLK_SET_RATE_PARENT,
        },
 };
 
-static struct clk_cpu_8996_mux pwrcl_pmux = {
+static const struct clk_hw *pwrcl_pmux_parents[] = {
+       [SMUX_INDEX] = &pwrcl_smux.clkr.hw,
+       [PLL_INDEX] = &pwrcl_pll.clkr.hw,
+       [ACD_INDEX] = &pwrcl_pll_acd.hw,
+       [ALT_INDEX] = &pwrcl_alt_pll.clkr.hw,
+};
+
+static const struct clk_hw *perfcl_pmux_parents[] = {
+       [SMUX_INDEX] = &perfcl_smux.clkr.hw,
+       [PLL_INDEX] = &perfcl_pll.clkr.hw,
+       [ACD_INDEX] = &perfcl_pll_acd.hw,
+       [ALT_INDEX] = &perfcl_alt_pll.clkr.hw,
+};
+
+static struct clk_cpu_8996_pmux pwrcl_pmux = {
        .reg = PWRCL_REG_OFFSET + MUX_OFFSET,
-       .shift = 0,
-       .width = 2,
-       .pll = &pwrcl_pll.clkr.hw,
-       .pll_div_2 = &pwrcl_smux.clkr.hw,
        .nb.notifier_call = cpu_clk_notifier_cb,
        .clkr.hw.init = &(struct clk_init_data) {
                .name = "pwrcl_pmux",
-               .parent_names = (const char *[]){
-                       "pwrcl_smux",
-                       "pwrcl_pll",
-                       "pwrcl_pll_acd",
-                       "pwrcl_alt_pll",
-               },
-               .num_parents = 4,
-               .ops = &clk_cpu_8996_mux_ops,
+               .parent_hws = pwrcl_pmux_parents,
+               .num_parents = ARRAY_SIZE(pwrcl_pmux_parents),
+               .ops = &clk_cpu_8996_pmux_ops,
                /* CPU clock is critical and should never be gated */
                .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
        },
 };
 
-static struct clk_cpu_8996_mux perfcl_pmux = {
+static struct clk_cpu_8996_pmux perfcl_pmux = {
        .reg = PERFCL_REG_OFFSET + MUX_OFFSET,
-       .shift = 0,
-       .width = 2,
-       .pll = &perfcl_pll.clkr.hw,
-       .pll_div_2 = &perfcl_smux.clkr.hw,
        .nb.notifier_call = cpu_clk_notifier_cb,
        .clkr.hw.init = &(struct clk_init_data) {
                .name = "perfcl_pmux",
-               .parent_names = (const char *[]){
-                       "perfcl_smux",
-                       "perfcl_pll",
-                       "perfcl_pll_acd",
-                       "perfcl_alt_pll",
-               },
-               .num_parents = 4,
-               .ops = &clk_cpu_8996_mux_ops,
+               .parent_hws = perfcl_pmux_parents,
+               .num_parents = ARRAY_SIZE(perfcl_pmux_parents),
+               .ops = &clk_cpu_8996_pmux_ops,
                /* CPU clock is critical and should never be gated */
                .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
        },
@@ -338,15 +396,22 @@ static const struct regmap_config cpu_msm8996_regmap_config = {
        .val_format_endian      = REGMAP_ENDIAN_LITTLE,
 };
 
+static struct clk_hw *cpu_msm8996_hw_clks[] = {
+       &pwrcl_pll_postdiv.hw,
+       &perfcl_pll_postdiv.hw,
+       &pwrcl_pll_acd.hw,
+       &perfcl_pll_acd.hw,
+};
+
 static struct clk_regmap *cpu_msm8996_clks[] = {
-       &perfcl_pll.clkr,
        &pwrcl_pll.clkr,
-       &perfcl_alt_pll.clkr,
+       &perfcl_pll.clkr,
        &pwrcl_alt_pll.clkr,
-       &perfcl_smux.clkr,
+       &perfcl_alt_pll.clkr,
        &pwrcl_smux.clkr,
-       &perfcl_pmux.clkr,
+       &perfcl_smux.clkr,
        &pwrcl_pmux.clkr,
+       &perfcl_pmux.clkr,
 };
 
 static int qcom_cpu_clk_msm8996_register_clks(struct device *dev,
@@ -354,67 +419,33 @@ static int qcom_cpu_clk_msm8996_register_clks(struct device *dev,
 {
        int i, ret;
 
-       perfcl_smux.pll = clk_hw_register_fixed_factor(dev, "perfcl_pll_main",
-                                                      "perfcl_pll",
-                                                      CLK_SET_RATE_PARENT,
-                                                      1, 2);
-       if (IS_ERR(perfcl_smux.pll)) {
-               dev_err(dev, "Failed to initialize perfcl_pll_main\n");
-               return PTR_ERR(perfcl_smux.pll);
-       }
-
-       pwrcl_smux.pll = clk_hw_register_fixed_factor(dev, "pwrcl_pll_main",
-                                                     "pwrcl_pll",
-                                                     CLK_SET_RATE_PARENT,
-                                                     1, 2);
-       if (IS_ERR(pwrcl_smux.pll)) {
-               dev_err(dev, "Failed to initialize pwrcl_pll_main\n");
-               clk_hw_unregister(perfcl_smux.pll);
-               return PTR_ERR(pwrcl_smux.pll);
+       for (i = 0; i < ARRAY_SIZE(cpu_msm8996_hw_clks); i++) {
+               ret = devm_clk_hw_register(dev, cpu_msm8996_hw_clks[i]);
+               if (ret)
+                       return ret;
        }
 
        for (i = 0; i < ARRAY_SIZE(cpu_msm8996_clks); i++) {
                ret = devm_clk_register_regmap(dev, cpu_msm8996_clks[i]);
-               if (ret) {
-                       clk_hw_unregister(perfcl_smux.pll);
-                       clk_hw_unregister(pwrcl_smux.pll);
+               if (ret)
                        return ret;
-               }
        }
 
-       clk_alpha_pll_configure(&perfcl_pll, regmap, &hfpll_config);
        clk_alpha_pll_configure(&pwrcl_pll, regmap, &hfpll_config);
-       clk_alpha_pll_configure(&perfcl_alt_pll, regmap, &altpll_config);
+       clk_alpha_pll_configure(&perfcl_pll, regmap, &hfpll_config);
        clk_alpha_pll_configure(&pwrcl_alt_pll, regmap, &altpll_config);
+       clk_alpha_pll_configure(&perfcl_alt_pll, regmap, &altpll_config);
 
        /* Enable alt PLLs */
        clk_prepare_enable(pwrcl_alt_pll.clkr.hw.clk);
        clk_prepare_enable(perfcl_alt_pll.clkr.hw.clk);
 
-       clk_notifier_register(pwrcl_pmux.clkr.hw.clk, &pwrcl_pmux.nb);
-       clk_notifier_register(perfcl_pmux.clkr.hw.clk, &perfcl_pmux.nb);
+       devm_clk_notifier_register(dev, pwrcl_pmux.clkr.hw.clk, &pwrcl_pmux.nb);
+       devm_clk_notifier_register(dev, perfcl_pmux.clkr.hw.clk, &perfcl_pmux.nb);
 
        return ret;
 }
 
-static int qcom_cpu_clk_msm8996_unregister_clks(void)
-{
-       int ret = 0;
-
-       ret = clk_notifier_unregister(pwrcl_pmux.clkr.hw.clk, &pwrcl_pmux.nb);
-       if (ret)
-               return ret;
-
-       ret = clk_notifier_unregister(perfcl_pmux.clkr.hw.clk, &perfcl_pmux.nb);
-       if (ret)
-               return ret;
-
-       clk_hw_unregister(perfcl_smux.pll);
-       clk_hw_unregister(pwrcl_smux.pll);
-
-       return 0;
-}
-
 #define CPU_AFINITY_MASK 0xFFF
 #define PWRCL_CPU_REG_MASK 0x3
 #define PERFCL_CPU_REG_MASK 0x103
@@ -456,22 +487,22 @@ static void qcom_cpu_clk_msm8996_acd_init(void __iomem *base)
 static int cpu_clk_notifier_cb(struct notifier_block *nb, unsigned long event,
                               void *data)
 {
-       struct clk_cpu_8996_mux *cpuclk = to_clk_cpu_8996_mux_nb(nb);
+       struct clk_cpu_8996_pmux *cpuclk = to_clk_cpu_8996_pmux_nb(nb);
        struct clk_notifier_data *cnd = data;
        int ret;
 
        switch (event) {
        case PRE_RATE_CHANGE:
-               ret = clk_cpu_8996_mux_set_parent(&cpuclk->clkr.hw, ALT_INDEX);
+               ret = clk_cpu_8996_pmux_set_parent(&cpuclk->clkr.hw, ALT_INDEX);
                qcom_cpu_clk_msm8996_acd_init(base);
                break;
        case POST_RATE_CHANGE:
                if (cnd->new_rate < DIV_2_THRESHOLD)
-                       ret = clk_cpu_8996_mux_set_parent(&cpuclk->clkr.hw,
-                                                         DIV_2_INDEX);
+                       ret = clk_cpu_8996_pmux_set_parent(&cpuclk->clkr.hw,
+                                                          SMUX_INDEX);
                else
-                       ret = clk_cpu_8996_mux_set_parent(&cpuclk->clkr.hw,
-                                                         ACD_INDEX);
+                       ret = clk_cpu_8996_pmux_set_parent(&cpuclk->clkr.hw,
+                                                          ACD_INDEX);
                break;
        default:
                ret = 0;
@@ -513,11 +544,6 @@ static int qcom_cpu_clk_msm8996_driver_probe(struct platform_device *pdev)
        return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, data);
 }
 
-static int qcom_cpu_clk_msm8996_driver_remove(struct platform_device *pdev)
-{
-       return qcom_cpu_clk_msm8996_unregister_clks();
-}
-
 static const struct of_device_id qcom_cpu_clk_msm8996_match_table[] = {
        { .compatible = "qcom,msm8996-apcc" },
        {}
@@ -526,7 +552,6 @@ MODULE_DEVICE_TABLE(of, qcom_cpu_clk_msm8996_match_table);
 
 static struct platform_driver qcom_cpu_clk_msm8996_driver = {
        .probe = qcom_cpu_clk_msm8996_driver_probe,
-       .remove = qcom_cpu_clk_msm8996_driver_remove,
        .driver = {
                .name = "qcom-msm8996-apcc",
                .of_match_table = qcom_cpu_clk_msm8996_match_table,
index 012e745..01581f4 100644 (file)
@@ -167,6 +167,7 @@ struct clk_rcg2_gfx3d {
 
 extern const struct clk_ops clk_rcg2_ops;
 extern const struct clk_ops clk_rcg2_floor_ops;
+extern const struct clk_ops clk_rcg2_mux_closest_ops;
 extern const struct clk_ops clk_edp_pixel_ops;
 extern const struct clk_ops clk_byte_ops;
 extern const struct clk_ops clk_byte2_ops;
index 28019ed..609c10f 100644 (file)
@@ -509,6 +509,13 @@ const struct clk_ops clk_rcg2_floor_ops = {
 };
 EXPORT_SYMBOL_GPL(clk_rcg2_floor_ops);
 
+const struct clk_ops clk_rcg2_mux_closest_ops = {
+       .determine_rate = __clk_mux_determine_rate_closest,
+       .get_parent = clk_rcg2_get_parent,
+       .set_parent = clk_rcg2_set_parent,
+};
+EXPORT_SYMBOL_GPL(clk_rcg2_mux_closest_ops);
+
 struct frac_entry {
        int num;
        int den;
index c07cab6..0471bab 100644 (file)
@@ -195,10 +195,6 @@ static int clk_rpmh_aggregate_state_send_command(struct clk_rpmh *c,
 {
        int ret;
 
-       /* Nothing required to be done if already off or on */
-       if (enable == c->state)
-               return 0;
-
        c->state = enable ? c->valid_state_mask : 0;
        c->aggr_state = c->state | c->peer->state;
        c->peer->aggr_state = c->aggr_state;
@@ -382,6 +378,26 @@ static const struct clk_rpmh_desc clk_rpmh_sdm845 = {
        .num_clks = ARRAY_SIZE(sdm845_rpmh_clocks),
 };
 
+static struct clk_hw *sdm670_rpmh_clocks[] = {
+       [RPMH_CXO_CLK]          = &sdm845_bi_tcxo.hw,
+       [RPMH_CXO_CLK_A]        = &sdm845_bi_tcxo_ao.hw,
+       [RPMH_LN_BB_CLK2]       = &sdm845_ln_bb_clk2.hw,
+       [RPMH_LN_BB_CLK2_A]     = &sdm845_ln_bb_clk2_ao.hw,
+       [RPMH_LN_BB_CLK3]       = &sdm845_ln_bb_clk3.hw,
+       [RPMH_LN_BB_CLK3_A]     = &sdm845_ln_bb_clk3_ao.hw,
+       [RPMH_RF_CLK1]          = &sdm845_rf_clk1.hw,
+       [RPMH_RF_CLK1_A]        = &sdm845_rf_clk1_ao.hw,
+       [RPMH_RF_CLK2]          = &sdm845_rf_clk2.hw,
+       [RPMH_RF_CLK2_A]        = &sdm845_rf_clk2_ao.hw,
+       [RPMH_IPA_CLK]          = &sdm845_ipa.hw,
+       [RPMH_CE_CLK]           = &sdm845_ce.hw,
+};
+
+static const struct clk_rpmh_desc clk_rpmh_sdm670 = {
+       .clks = sdm670_rpmh_clocks,
+       .num_clks = ARRAY_SIZE(sdm670_rpmh_clocks),
+};
+
 DEFINE_CLK_RPMH_VRM(sdx55, rf_clk1, rf_clk1_ao, "rfclkd1", 1);
 DEFINE_CLK_RPMH_VRM(sdx55, rf_clk2, rf_clk2_ao, "rfclkd2", 1);
 DEFINE_CLK_RPMH_BCM(sdx55, qpic_clk, "QP0");
@@ -715,6 +731,7 @@ static const struct of_device_id clk_rpmh_match_table[] = {
        { .compatible = "qcom,sc8180x-rpmh-clk", .data = &clk_rpmh_sc8180x},
        { .compatible = "qcom,sc8280xp-rpmh-clk", .data = &clk_rpmh_sc8280xp},
        { .compatible = "qcom,sdm845-rpmh-clk", .data = &clk_rpmh_sdm845},
+       { .compatible = "qcom,sdm670-rpmh-clk", .data = &clk_rpmh_sdm670},
        { .compatible = "qcom,sdx55-rpmh-clk",  .data = &clk_rpmh_sdx55},
        { .compatible = "qcom,sdx65-rpmh-clk",  .data = &clk_rpmh_sdx65},
        { .compatible = "qcom,sm6350-rpmh-clk", .data = &clk_rpmh_sm6350},
index 10b4e6d..fea5058 100644 (file)
@@ -417,6 +417,7 @@ DEFINE_CLK_SMD_RPM_BRANCH(sdm660, bi_tcxo, bi_tcxo_a, QCOM_SMD_RPM_MISC_CLK, 0,
 DEFINE_CLK_SMD_RPM(msm8916, pcnoc_clk, pcnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 0);
 DEFINE_CLK_SMD_RPM(msm8916, snoc_clk, snoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 1);
 DEFINE_CLK_SMD_RPM(msm8916, bimc_clk, bimc_a_clk, QCOM_SMD_RPM_MEM_CLK, 0);
+DEFINE_CLK_SMD_RPM(qcs404, qpic_clk, qpic_a_clk, QCOM_SMD_RPM_QPIC_CLK, 0);
 DEFINE_CLK_SMD_RPM_QDSS(msm8916, qdss_clk, qdss_a_clk, QCOM_SMD_RPM_MISC_CLK, 1);
 DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8916, bb_clk1, bb_clk1_a, 1, 19200000);
 DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8916, bb_clk2, bb_clk2_a, 2, 19200000);
@@ -427,6 +428,40 @@ DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8916, bb_clk2_pin, bb_clk2_a_pin, 2, 192
 DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8916, rf_clk1_pin, rf_clk1_a_pin, 4, 19200000);
 DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8916, rf_clk2_pin, rf_clk2_a_pin, 5, 19200000);
 
+static struct clk_smd_rpm *msm8909_clks[] = {
+       [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_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_CLK2]               = &msm8916_bb_clk2,
+       [RPM_SMD_BB_CLK2_A]             = &msm8916_bb_clk2_a,
+       [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_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,
+       [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_msm8909 = {
+       .clks = msm8909_clks,
+       .num_clks = ARRAY_SIZE(msm8909_clks),
+};
+
 static struct clk_smd_rpm *msm8916_clks[] = {
        [RPM_SMD_PCNOC_CLK]             = &msm8916_pcnoc_clk,
        [RPM_SMD_PCNOC_A_CLK]           = &msm8916_pcnoc_a_clk,
@@ -787,7 +822,6 @@ static const struct rpm_smd_clk_desc rpm_clk_msm8996 = {
 };
 
 DEFINE_CLK_SMD_RPM(qcs404, bimc_gpu_clk, bimc_gpu_a_clk, QCOM_SMD_RPM_MEM_CLK, 2);
-DEFINE_CLK_SMD_RPM(qcs404, qpic_clk, qpic_a_clk, QCOM_SMD_RPM_QPIC_CLK, 0);
 DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(qcs404, ln_bb_clk_pin, ln_bb_clk_a_pin, 8, 19200000);
 
 static struct clk_smd_rpm *qcs404_clks[] = {
@@ -1085,13 +1119,54 @@ static const struct rpm_smd_clk_desc rpm_clk_sm6115 = {
        .num_clks = ARRAY_SIZE(sm6115_clks),
 };
 
+/* SM6375 */
+DEFINE_CLK_SMD_RPM(sm6375, mmnrt_clk, mmnrt_a_clk, QCOM_SMD_RPM_MMXI_CLK, 0);
+DEFINE_CLK_SMD_RPM(sm6375, mmrt_clk, mmrt_a_clk, QCOM_SMD_RPM_MMXI_CLK, 1);
+DEFINE_CLK_SMD_RPM(qcm2290, hwkm_clk, hwkm_a_clk, QCOM_SMD_RPM_HWKM_CLK, 0);
+DEFINE_CLK_SMD_RPM(qcm2290, pka_clk, pka_a_clk, QCOM_SMD_RPM_PKA_CLK, 0);
+DEFINE_CLK_SMD_RPM_BRANCH(sm6375, bimc_freq_log, bimc_freq_log_a, QCOM_SMD_RPM_MISC_CLK, 4, 1);
+static struct clk_smd_rpm *sm6375_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_CNOC_CLK] = &sm6125_cnoc_clk,
+       [RPM_SMD_CNOC_A_CLK] = &sm6125_cnoc_a_clk,
+       [RPM_SMD_IPA_CLK] = &msm8976_ipa_clk,
+       [RPM_SMD_IPA_A_CLK] = &msm8976_ipa_a_clk,
+       [RPM_SMD_QUP_CLK] = &sm6125_qup_clk,
+       [RPM_SMD_QUP_A_CLK] = &sm6125_qup_a_clk,
+       [RPM_SMD_MMRT_CLK] = &sm6375_mmrt_clk,
+       [RPM_SMD_MMRT_A_CLK] = &sm6375_mmrt_a_clk,
+       [RPM_SMD_MMNRT_CLK] = &sm6375_mmnrt_clk,
+       [RPM_SMD_MMNRT_A_CLK] = &sm6375_mmnrt_a_clk,
+       [RPM_SMD_SNOC_PERIPH_CLK] = &sm6125_snoc_periph_clk,
+       [RPM_SMD_SNOC_PERIPH_A_CLK] = &sm6125_snoc_periph_a_clk,
+       [RPM_SMD_SNOC_LPASS_CLK] = &sm6125_snoc_lpass_clk,
+       [RPM_SMD_SNOC_LPASS_A_CLK] = &sm6125_snoc_lpass_a_clk,
+       [RPM_SMD_CE1_CLK] = &msm8992_ce1_clk,
+       [RPM_SMD_CE1_A_CLK] = &msm8992_ce1_a_clk,
+       [RPM_SMD_HWKM_CLK] = &qcm2290_hwkm_clk,
+       [RPM_SMD_HWKM_A_CLK] = &qcm2290_hwkm_a_clk,
+       [RPM_SMD_PKA_CLK] = &qcm2290_pka_clk,
+       [RPM_SMD_PKA_A_CLK] = &qcm2290_pka_a_clk,
+       [RPM_SMD_BIMC_FREQ_LOG] = &sm6375_bimc_freq_log,
+};
+
+static const struct rpm_smd_clk_desc rpm_clk_sm6375 = {
+       .clks = sm6375_clks,
+       .num_clks = ARRAY_SIZE(sm6375_clks),
+};
+
 /* QCM2290 */
 DEFINE_CLK_SMD_RPM_XO_BUFFER(qcm2290, ln_bb_clk2, ln_bb_clk2_a, 0x2, 19200000);
 DEFINE_CLK_SMD_RPM_XO_BUFFER(qcm2290, rf_clk3, rf_clk3_a, 6, 38400000);
 
 DEFINE_CLK_SMD_RPM(qcm2290, qpic_clk, qpic_a_clk, QCOM_SMD_RPM_QPIC_CLK, 0);
-DEFINE_CLK_SMD_RPM(qcm2290, hwkm_clk, hwkm_a_clk, QCOM_SMD_RPM_HWKM_CLK, 0);
-DEFINE_CLK_SMD_RPM(qcm2290, pka_clk, pka_a_clk, QCOM_SMD_RPM_PKA_CLK, 0);
 DEFINE_CLK_SMD_RPM(qcm2290, cpuss_gnoc_clk, cpuss_gnoc_a_clk,
                   QCOM_SMD_RPM_MEM_CLK, 1);
 DEFINE_CLK_SMD_RPM(qcm2290, bimc_gpu_clk, bimc_gpu_a_clk,
@@ -1146,6 +1221,7 @@ static const struct rpm_smd_clk_desc rpm_clk_qcm2290 = {
 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-msm8909", .data = &rpm_clk_msm8909 },
        { .compatible = "qcom,rpmcc-msm8916", .data = &rpm_clk_msm8916 },
        { .compatible = "qcom,rpmcc-msm8936", .data = &rpm_clk_msm8936 },
        { .compatible = "qcom,rpmcc-msm8953", .data = &rpm_clk_msm8953 },
@@ -1160,6 +1236,7 @@ static const struct of_device_id rpm_smd_clk_match_table[] = {
        { .compatible = "qcom,rpmcc-sdm660",  .data = &rpm_clk_sdm660  },
        { .compatible = "qcom,rpmcc-sm6115",  .data = &rpm_clk_sm6115  },
        { .compatible = "qcom,rpmcc-sm6125",  .data = &rpm_clk_sm6125  },
+       { .compatible = "qcom,rpmcc-sm6375",  .data = &rpm_clk_sm6375  },
        { }
 };
 MODULE_DEVICE_TABLE(of, rpm_smd_clk_match_table);
diff --git a/drivers/clk/qcom/dispcc-sm6115.c b/drivers/clk/qcom/dispcc-sm6115.c
new file mode 100644 (file)
index 0000000..818bb8f
--- /dev/null
@@ -0,0 +1,608 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Based on dispcc-qcm2290.c
+ * Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2021, Linaro Ltd.
+ */
+
+#include <linux/err.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/of.h>
+#include <linux/regmap.h>
+
+#include <dt-bindings/clock/qcom,sm6115-dispcc.h>
+
+#include "clk-alpha-pll.h"
+#include "clk-branch.h"
+#include "clk-rcg.h"
+#include "clk-regmap.h"
+#include "clk-regmap-divider.h"
+#include "common.h"
+#include "gdsc.h"
+
+enum {
+       DT_BI_TCXO,
+       DT_SLEEP_CLK,
+       DT_DSI0_PHY_PLL_OUT_BYTECLK,
+       DT_DSI0_PHY_PLL_OUT_DSICLK,
+       DT_GPLL0_DISP_DIV,
+};
+
+enum {
+       P_BI_TCXO,
+       P_DISP_CC_PLL0_OUT_MAIN,
+       P_DSI0_PHY_PLL_OUT_BYTECLK,
+       P_DSI0_PHY_PLL_OUT_DSICLK,
+       P_GPLL0_OUT_MAIN,
+       P_SLEEP_CLK,
+};
+
+static const struct clk_parent_data parent_data_tcxo = { .index = DT_BI_TCXO };
+
+static const struct pll_vco spark_vco[] = {
+       { 500000000, 1000000000, 2 },
+};
+
+/* 768MHz configuration */
+static const struct alpha_pll_config disp_cc_pll0_config = {
+       .l = 0x28,
+       .alpha = 0x0,
+       .alpha_en_mask = BIT(24),
+       .vco_val = 0x2 << 20,
+       .vco_mask = GENMASK(21, 20),
+       .main_output_mask = BIT(0),
+       .config_ctl_val = 0x4001055B,
+};
+
+static struct clk_alpha_pll disp_cc_pll0 = {
+       .offset = 0x0,
+       .vco_table = spark_vco,
+       .num_vco = ARRAY_SIZE(spark_vco),
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_pll0",
+                       .parent_data = &parent_data_tcxo,
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static const struct clk_div_table post_div_table_disp_cc_pll0_out_main[] = {
+       { 0x0, 1 },
+       { }
+};
+static struct clk_alpha_pll_postdiv disp_cc_pll0_out_main = {
+       .offset = 0x0,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_disp_cc_pll0_out_main,
+       .num_post_div = ARRAY_SIZE(post_div_table_disp_cc_pll0_out_main),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "disp_cc_pll0_out_main",
+               .parent_hws = (const struct clk_hw*[]){
+                       &disp_cc_pll0.clkr.hw,
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_alpha_pll_postdiv_ops,
+       },
+};
+
+static const struct parent_map disp_cc_parent_map_0[] = {
+       { P_BI_TCXO, 0 },
+       { P_DSI0_PHY_PLL_OUT_BYTECLK, 1 },
+};
+
+static const struct clk_parent_data disp_cc_parent_data_0[] = {
+       { .index = DT_BI_TCXO },
+       { .index = DT_DSI0_PHY_PLL_OUT_BYTECLK },
+};
+
+static const struct parent_map disp_cc_parent_map_1[] = {
+       { P_BI_TCXO, 0 },
+};
+
+static const struct clk_parent_data disp_cc_parent_data_1[] = {
+       { .index = DT_BI_TCXO },
+};
+
+static const struct parent_map disp_cc_parent_map_2[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_MAIN, 4 },
+};
+
+static const struct clk_parent_data disp_cc_parent_data_2[] = {
+       { .index = DT_BI_TCXO },
+       { .index = DT_GPLL0_DISP_DIV },
+};
+
+static const struct parent_map disp_cc_parent_map_3[] = {
+       { P_BI_TCXO, 0 },
+       { P_DISP_CC_PLL0_OUT_MAIN, 1 },
+};
+
+static const struct clk_parent_data disp_cc_parent_data_3[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &disp_cc_pll0_out_main.clkr.hw },
+};
+
+static const struct parent_map disp_cc_parent_map_4[] = {
+       { P_BI_TCXO, 0 },
+       { P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
+};
+
+static const struct clk_parent_data disp_cc_parent_data_4[] = {
+       { .index = DT_BI_TCXO },
+       { .index = DT_DSI0_PHY_PLL_OUT_DSICLK },
+};
+
+static const struct parent_map disp_cc_parent_map_5[] = {
+       { P_SLEEP_CLK, 0 },
+};
+
+static const struct clk_parent_data disp_cc_parent_data_5[] = {
+       { .index = DT_SLEEP_CLK, },
+};
+
+static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = {
+       .cmd_rcgr = 0x20bc,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_0,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "disp_cc_mdss_byte0_clk_src",
+               .parent_data = disp_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
+               /* For set_rate and set_parent to succeed, parent(s) must be enabled */
+               .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE | CLK_GET_RATE_NOCACHE,
+               .ops = &clk_byte2_ops,
+       },
+};
+
+static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = {
+       .reg = 0x20d4,
+       .shift = 0,
+       .width = 2,
+       .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 const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(37500000, P_GPLL0_OUT_MAIN, 8, 0, 0),
+       F(75000000, P_GPLL0_OUT_MAIN, 4, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = {
+       .cmd_rcgr = 0x2154,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_2,
+       .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_2,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_2),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_disp_cc_mdss_esc0_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = {
+       .cmd_rcgr = 0x20d8,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_0,
+       .freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "disp_cc_mdss_esc0_clk_src",
+               .parent_data = disp_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(192000000, P_DISP_CC_PLL0_OUT_MAIN, 4, 0, 0),
+       F(256000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
+       F(307200000, P_DISP_CC_PLL0_OUT_MAIN, 2.5, 0, 0),
+       F(384000000, P_DISP_CC_PLL0_OUT_MAIN, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = {
+       .cmd_rcgr = 0x2074,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_3,
+       .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_3,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = {
+       .cmd_rcgr = 0x205c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_4,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "disp_cc_mdss_pclk0_clk_src",
+               .parent_data = disp_cc_parent_data_4,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
+               /* For set_rate and set_parent to succeed, parent(s) must be enabled */
+               .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE | CLK_GET_RATE_NOCACHE,
+               .ops = &clk_pixel_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_disp_cc_mdss_rot_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(192000000, P_DISP_CC_PLL0_OUT_MAIN, 4, 0, 0),
+       F(256000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
+       F(307200000, P_DISP_CC_PLL0_OUT_MAIN, 2.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 disp_cc_mdss_rot_clk_src = {
+       .cmd_rcgr = 0x208c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_3,
+       .freq_tbl = ftbl_disp_cc_mdss_rot_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "disp_cc_mdss_rot_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_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = {
+       .cmd_rcgr = 0x20a4,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_1,
+       .freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "disp_cc_mdss_vsync_clk_src",
+               .parent_data = disp_cc_parent_data_1,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_disp_cc_sleep_clk_src[] = {
+       F(32764, P_SLEEP_CLK, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 disp_cc_sleep_clk_src = {
+       .cmd_rcgr = 0x6050,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_5,
+       .freq_tbl = ftbl_disp_cc_sleep_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "disp_cc_sleep_clk_src",
+               .parent_data = disp_cc_parent_data_5,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_5),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch disp_cc_mdss_ahb_clk = {
+       .halt_reg = 0x2044,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2044,
+               .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 = 0x2024,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2024,
+               .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 | CLK_GET_RATE_NOCACHE,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_byte0_intf_clk = {
+       .halt_reg = 0x2028,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2028,
+               .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 | CLK_GET_RATE_NOCACHE,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_esc0_clk = {
+       .halt_reg = 0x202c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x202c,
+               .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 = 0x2008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2008,
+               .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 = 0x2018,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x2018,
+               .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 = 0x4004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x4004,
+               .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 = 0x2004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2004,
+               .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 | CLK_GET_RATE_NOCACHE,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_rot_clk = {
+       .halt_reg = 0x2010,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2010,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_mdss_rot_clk",
+                       .parent_names = (const char *[]){
+                               "disp_cc_mdss_rot_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_vsync_clk = {
+       .halt_reg = 0x2020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2020,
+               .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 = 0x6068,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x6068,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "disp_cc_sleep_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &disp_cc_sleep_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct gdsc mdss_gdsc = {
+       .gdscr = 0x3000,
+       .pd = {
+               .name = "mdss_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = HW_CTRL,
+};
+
+static struct gdsc *disp_cc_sm6115_gdscs[] = {
+       [MDSS_GDSC] = &mdss_gdsc,
+};
+
+static struct clk_regmap *disp_cc_sm6115_clocks[] = {
+       [DISP_CC_PLL0] = &disp_cc_pll0.clkr,
+       [DISP_CC_PLL0_OUT_MAIN] = &disp_cc_pll0_out_main.clkr,
+       [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_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_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr,
+       [DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr,
+       [DISP_CC_SLEEP_CLK] = &disp_cc_sleep_clk.clkr,
+       [DISP_CC_SLEEP_CLK_SRC] = &disp_cc_sleep_clk_src.clkr,
+};
+
+static const struct regmap_config disp_cc_sm6115_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_sm6115_desc = {
+       .config = &disp_cc_sm6115_regmap_config,
+       .clks = disp_cc_sm6115_clocks,
+       .num_clks = ARRAY_SIZE(disp_cc_sm6115_clocks),
+       .gdscs = disp_cc_sm6115_gdscs,
+       .num_gdscs = ARRAY_SIZE(disp_cc_sm6115_gdscs),
+};
+
+static const struct of_device_id disp_cc_sm6115_match_table[] = {
+       { .compatible = "qcom,sm6115-dispcc" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, disp_cc_sm6115_match_table);
+
+static int disp_cc_sm6115_probe(struct platform_device *pdev)
+{
+       struct regmap *regmap;
+       int ret;
+
+       regmap = qcom_cc_map(pdev, &disp_cc_sm6115_desc);
+       if (IS_ERR(regmap))
+               return PTR_ERR(regmap);
+
+       clk_alpha_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config);
+
+       /* Keep DISP_CC_XO_CLK always-ON */
+       regmap_update_bits(regmap, 0x604c, BIT(0), BIT(0));
+
+       ret = qcom_cc_really_probe(pdev, &disp_cc_sm6115_desc, regmap);
+       if (ret) {
+               dev_err(&pdev->dev, "Failed to register DISP CC clocks\n");
+               return ret;
+       }
+
+       return ret;
+}
+
+static struct platform_driver disp_cc_sm6115_driver = {
+       .probe = disp_cc_sm6115_probe,
+       .driver = {
+               .name = "dispcc-sm6115",
+               .of_match_table = disp_cc_sm6115_match_table,
+       },
+};
+
+module_platform_driver(disp_cc_sm6115_driver);
+MODULE_DESCRIPTION("Qualcomm SM6115 Display Clock controller");
+MODULE_LICENSE("GPL");
diff --git a/drivers/clk/qcom/dispcc-sm8450.c b/drivers/clk/qcom/dispcc-sm8450.c
new file mode 100644 (file)
index 0000000..0cd7ebe
--- /dev/null
@@ -0,0 +1,1829 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022, Linaro Ltd.
+ */
+
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/err.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/of.h>
+#include <linux/regmap.h>
+#include <linux/pm_runtime.h>
+
+#include <dt-bindings/clock/qcom,sm8450-dispcc.h>
+
+#include "common.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 "clk-regmap-mux.h"
+#include "reset.h"
+#include "gdsc.h"
+
+/* Need to match the order of clocks in DT binding */
+enum {
+       DT_BI_TCXO,
+       DT_BI_TCXO_AO,
+       DT_AHB_CLK,
+       DT_SLEEP_CLK,
+
+       DT_DSI0_PHY_PLL_OUT_BYTECLK,
+       DT_DSI0_PHY_PLL_OUT_DSICLK,
+       DT_DSI1_PHY_PLL_OUT_BYTECLK,
+       DT_DSI1_PHY_PLL_OUT_DSICLK,
+
+       DT_DP0_PHY_PLL_LINK_CLK,
+       DT_DP0_PHY_PLL_VCO_DIV_CLK,
+       DT_DP1_PHY_PLL_LINK_CLK,
+       DT_DP1_PHY_PLL_VCO_DIV_CLK,
+       DT_DP2_PHY_PLL_LINK_CLK,
+       DT_DP2_PHY_PLL_VCO_DIV_CLK,
+       DT_DP3_PHY_PLL_LINK_CLK,
+       DT_DP3_PHY_PLL_VCO_DIV_CLK,
+};
+
+#define DISP_CC_MISC_CMD       0xF000
+
+enum {
+       P_BI_TCXO,
+       P_DISP_CC_PLL0_OUT_MAIN,
+       P_DISP_CC_PLL1_OUT_EVEN,
+       P_DISP_CC_PLL1_OUT_MAIN,
+       P_DP0_PHY_PLL_LINK_CLK,
+       P_DP0_PHY_PLL_VCO_DIV_CLK,
+       P_DP1_PHY_PLL_LINK_CLK,
+       P_DP1_PHY_PLL_VCO_DIV_CLK,
+       P_DP2_PHY_PLL_LINK_CLK,
+       P_DP2_PHY_PLL_VCO_DIV_CLK,
+       P_DP3_PHY_PLL_LINK_CLK,
+       P_DP3_PHY_PLL_VCO_DIV_CLK,
+       P_DSI0_PHY_PLL_OUT_BYTECLK,
+       P_DSI0_PHY_PLL_OUT_DSICLK,
+       P_DSI1_PHY_PLL_OUT_BYTECLK,
+       P_DSI1_PHY_PLL_OUT_DSICLK,
+       P_SLEEP_CLK,
+};
+
+static struct pll_vco lucid_evo_vco[] = {
+       { 249600000, 2000000000, 0 },
+};
+
+static const struct alpha_pll_config disp_cc_pll0_config = {
+       .l = 0xD,
+       .alpha = 0x6492,
+       .config_ctl_val = 0x20485699,
+       .config_ctl_hi_val = 0x00182261,
+       .config_ctl_hi1_val = 0x32AA299C,
+       .user_ctl_val = 0x00000000,
+       .user_ctl_hi_val = 0x00000805,
+};
+
+static struct clk_alpha_pll disp_cc_pll0 = {
+       .offset = 0x0,
+       .vco_table = lucid_evo_vco,
+       .num_vco = ARRAY_SIZE(lucid_evo_vco),
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
+       .clkr = {
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_pll0",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .index = DT_BI_TCXO,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_reset_lucid_evo_ops,
+               },
+       },
+};
+
+static const struct alpha_pll_config disp_cc_pll1_config = {
+       .l = 0x1F,
+       .alpha = 0x4000,
+       .config_ctl_val = 0x20485699,
+       .config_ctl_hi_val = 0x00182261,
+       .config_ctl_hi1_val = 0x32AA299C,
+       .user_ctl_val = 0x00000000,
+       .user_ctl_hi_val = 0x00000805,
+};
+
+static struct clk_alpha_pll disp_cc_pll1 = {
+       .offset = 0x1000,
+       .vco_table = lucid_evo_vco,
+       .num_vco = ARRAY_SIZE(lucid_evo_vco),
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_EVO],
+       .clkr = {
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_pll1",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .index = DT_BI_TCXO,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_reset_lucid_evo_ops,
+               },
+       },
+};
+
+static const struct parent_map disp_cc_parent_map_0[] = {
+       { P_BI_TCXO, 0 },
+       { P_DP0_PHY_PLL_LINK_CLK, 1 },
+       { P_DP0_PHY_PLL_VCO_DIV_CLK, 2 },
+       { P_DP3_PHY_PLL_VCO_DIV_CLK, 3 },
+       { P_DP1_PHY_PLL_VCO_DIV_CLK, 4 },
+       { P_DP2_PHY_PLL_VCO_DIV_CLK, 6 },
+};
+
+static const struct clk_parent_data disp_cc_parent_data_0[] = {
+       { .index = DT_BI_TCXO },
+       { .index = DT_DP0_PHY_PLL_LINK_CLK },
+       { .index = DT_DP0_PHY_PLL_VCO_DIV_CLK },
+       { .index = DT_DP3_PHY_PLL_VCO_DIV_CLK },
+       { .index = DT_DP1_PHY_PLL_VCO_DIV_CLK },
+       { .index = DT_DP2_PHY_PLL_VCO_DIV_CLK },
+};
+
+static const struct parent_map disp_cc_parent_map_1[] = {
+       { P_BI_TCXO, 0 },
+};
+
+static const struct clk_parent_data disp_cc_parent_data_1[] = {
+       { .index = DT_BI_TCXO },
+};
+
+static const struct clk_parent_data disp_cc_parent_data_1_ao[] = {
+       { .index = DT_BI_TCXO_AO },
+};
+
+static const struct parent_map disp_cc_parent_map_2[] = {
+       { P_BI_TCXO, 0 },
+       { P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
+       { P_DSI0_PHY_PLL_OUT_BYTECLK, 2 },
+       { P_DSI1_PHY_PLL_OUT_DSICLK, 3 },
+       { P_DSI1_PHY_PLL_OUT_BYTECLK, 4 },
+};
+
+static const struct clk_parent_data disp_cc_parent_data_2[] = {
+       { .index = DT_BI_TCXO },
+       { .index = DT_DSI0_PHY_PLL_OUT_DSICLK },
+       { .index = DT_DSI0_PHY_PLL_OUT_BYTECLK },
+       { .index = DT_DSI1_PHY_PLL_OUT_DSICLK },
+       { .index = DT_DSI1_PHY_PLL_OUT_BYTECLK },
+};
+
+static const struct parent_map disp_cc_parent_map_3[] = {
+       { P_BI_TCXO, 0 },
+       { P_DP0_PHY_PLL_LINK_CLK, 1 },
+       { P_DP1_PHY_PLL_LINK_CLK, 2 },
+       { P_DP2_PHY_PLL_LINK_CLK, 3 },
+       { P_DP3_PHY_PLL_LINK_CLK, 4 },
+};
+
+static const struct clk_parent_data disp_cc_parent_data_3[] = {
+       { .index = DT_BI_TCXO },
+       { .index = DT_DP0_PHY_PLL_LINK_CLK },
+       { .index = DT_DP1_PHY_PLL_LINK_CLK },
+       { .index = DT_DP2_PHY_PLL_LINK_CLK },
+       { .index = DT_DP3_PHY_PLL_LINK_CLK },
+};
+
+static const struct parent_map disp_cc_parent_map_4[] = {
+       { P_BI_TCXO, 0 },
+       { P_DSI0_PHY_PLL_OUT_BYTECLK, 2 },
+       { P_DSI1_PHY_PLL_OUT_BYTECLK, 4 },
+};
+
+static const struct clk_parent_data disp_cc_parent_data_4[] = {
+       { .index = DT_BI_TCXO },
+       { .index = DT_DSI0_PHY_PLL_OUT_BYTECLK },
+       { .index = DT_DSI1_PHY_PLL_OUT_BYTECLK },
+};
+
+static const struct parent_map disp_cc_parent_map_5[] = {
+       { P_BI_TCXO, 0 },
+       { P_DISP_CC_PLL0_OUT_MAIN, 1 },
+       { P_DISP_CC_PLL1_OUT_MAIN, 4 },
+       { P_DISP_CC_PLL1_OUT_EVEN, 6 },
+};
+
+static const struct clk_parent_data disp_cc_parent_data_5[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &disp_cc_pll0.clkr.hw },
+       { .hw = &disp_cc_pll1.clkr.hw },
+       { .hw = &disp_cc_pll1.clkr.hw },
+};
+
+static const struct parent_map disp_cc_parent_map_6[] = {
+       { P_BI_TCXO, 0 },
+       { P_DISP_CC_PLL1_OUT_MAIN, 4 },
+       { P_DISP_CC_PLL1_OUT_EVEN, 6 },
+};
+
+static const struct clk_parent_data disp_cc_parent_data_6[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &disp_cc_pll1.clkr.hw },
+       { .hw = &disp_cc_pll1.clkr.hw },
+};
+
+static const struct parent_map disp_cc_parent_map_7[] = {
+       { P_SLEEP_CLK, 0 },
+};
+
+static const struct clk_parent_data disp_cc_parent_data_7[] = {
+       { .index = DT_SLEEP_CLK },
+};
+
+static const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(37500000, P_DISP_CC_PLL1_OUT_MAIN, 16, 0, 0),
+       F(75000000, P_DISP_CC_PLL1_OUT_MAIN, 8, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = {
+       .cmd_rcgr = 0x8324,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_6,
+       .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_6,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_6),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_disp_cc_mdss_byte0_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = {
+       .cmd_rcgr = 0x8134,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_2,
+       .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
+       .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 struct clk_rcg2 disp_cc_mdss_byte1_clk_src = {
+       .cmd_rcgr = 0x8150,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_2,
+       .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_byte1_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 struct clk_rcg2 disp_cc_mdss_dptx0_aux_clk_src = {
+       .cmd_rcgr = 0x81ec,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_1,
+       .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_dptx0_aux_clk_src",
+               .parent_data = disp_cc_parent_data_1,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_disp_cc_mdss_dptx0_link_clk_src[] = {
+       F(162000, P_DP0_PHY_PLL_LINK_CLK, 1, 0, 0),
+       F(270000, P_DP0_PHY_PLL_LINK_CLK, 1, 0, 0),
+       F(540000, P_DP0_PHY_PLL_LINK_CLK, 1, 0, 0),
+       F(810000, P_DP0_PHY_PLL_LINK_CLK, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 disp_cc_mdss_dptx0_link_clk_src = {
+       .cmd_rcgr = 0x819c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_3,
+       .freq_tbl = ftbl_disp_cc_mdss_dptx0_link_clk_src,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_dptx0_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_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_dptx0_pixel0_clk_src = {
+       .cmd_rcgr = 0x81bc,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_0,
+       .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_dptx0_pixel0_clk_src",
+               .parent_data = disp_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_dp_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_dptx0_pixel1_clk_src = {
+       .cmd_rcgr = 0x81d4,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_0,
+       .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_dptx0_pixel1_clk_src",
+               .parent_data = disp_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_dp_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_dptx1_aux_clk_src = {
+       .cmd_rcgr = 0x8254,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_1,
+       .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_dptx1_aux_clk_src",
+               .parent_data = disp_cc_parent_data_1,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_dp_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_dptx1_link_clk_src = {
+       .cmd_rcgr = 0x8234,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_3,
+       .freq_tbl = ftbl_disp_cc_mdss_dptx0_link_clk_src,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_dptx1_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_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_dptx1_pixel0_clk_src = {
+       .cmd_rcgr = 0x8204,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_0,
+       .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_dptx1_pixel0_clk_src",
+               .parent_data = disp_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_dp_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_dptx1_pixel1_clk_src = {
+       .cmd_rcgr = 0x821c,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_0,
+       .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_dptx1_pixel1_clk_src",
+               .parent_data = disp_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_dp_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_dptx2_aux_clk_src = {
+       .cmd_rcgr = 0x82bc,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_1,
+       .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_dptx2_aux_clk_src",
+               .parent_data = disp_cc_parent_data_1,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_dptx2_link_clk_src = {
+       .cmd_rcgr = 0x826c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_3,
+       .freq_tbl = ftbl_disp_cc_mdss_dptx0_link_clk_src,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_dptx2_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_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_dptx2_pixel0_clk_src = {
+       .cmd_rcgr = 0x828c,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_0,
+       .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_dptx2_pixel0_clk_src",
+               .parent_data = disp_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_dp_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_dptx2_pixel1_clk_src = {
+       .cmd_rcgr = 0x82a4,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_0,
+       .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_dptx2_pixel1_clk_src",
+               .parent_data = disp_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_dp_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_dptx3_aux_clk_src = {
+       .cmd_rcgr = 0x8308,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_1,
+       .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_dptx3_aux_clk_src",
+               .parent_data = disp_cc_parent_data_1,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_dptx3_link_clk_src = {
+       .cmd_rcgr = 0x82ec,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_3,
+       .freq_tbl = ftbl_disp_cc_mdss_dptx0_link_clk_src,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_dptx3_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_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_dptx3_pixel0_clk_src = {
+       .cmd_rcgr = 0x82d4,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_0,
+       .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_dptx3_pixel0_clk_src",
+               .parent_data = disp_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_dp_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = {
+       .cmd_rcgr = 0x816c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_4,
+       .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_esc0_clk_src",
+               .parent_data = disp_cc_parent_data_4,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_esc1_clk_src = {
+       .cmd_rcgr = 0x8184,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_4,
+       .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_esc1_clk_src",
+               .parent_data = disp_cc_parent_data_4,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_4),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(85714286, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
+       F(100000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
+       F(150000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
+       F(172000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
+       F(200000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
+       F(325000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
+       F(375000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
+       F(500000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = {
+       .cmd_rcgr = 0x80ec,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_5,
+       .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_5,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_5),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = {
+       .cmd_rcgr = 0x80bc,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_2,
+       .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_pclk0_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_pixel_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_pclk1_clk_src = {
+       .cmd_rcgr = 0x80d4,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_2,
+       .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_pclk1_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_pixel_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_disp_cc_mdss_rot_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(150000000, P_DISP_CC_PLL1_OUT_MAIN, 4, 0, 0),
+       F(200000000, P_DISP_CC_PLL1_OUT_MAIN, 3, 0, 0),
+       F(300000000, P_DISP_CC_PLL1_OUT_MAIN, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 disp_cc_mdss_rot_clk_src = {
+       .cmd_rcgr = 0x8104,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_5,
+       .freq_tbl = ftbl_disp_cc_mdss_rot_clk_src,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_rot_clk_src",
+               .parent_data = disp_cc_parent_data_5,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_5),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = {
+       .cmd_rcgr = 0x811c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_1,
+       .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_vsync_clk_src",
+               .parent_data = disp_cc_parent_data_1,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_1),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_disp_cc_sleep_clk_src[] = {
+       F(32000, P_SLEEP_CLK, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 disp_cc_sleep_clk_src = {
+       .cmd_rcgr = 0xe060,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_7,
+       .freq_tbl = ftbl_disp_cc_sleep_clk_src,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_sleep_clk_src",
+               .parent_data = disp_cc_parent_data_7,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_7),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 disp_cc_xo_clk_src = {
+       .cmd_rcgr = 0xe044,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = disp_cc_parent_map_1,
+       .freq_tbl = ftbl_disp_cc_mdss_byte0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_xo_clk_src",
+               .parent_data = disp_cc_parent_data_1_ao,
+               .num_parents = ARRAY_SIZE(disp_cc_parent_data_1_ao),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = {
+       .reg = 0x814c,
+       .shift = 0,
+       .width = 4,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_byte0_div_clk_src",
+               .parent_data = &(const struct clk_parent_data) {
+                       .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_byte1_div_clk_src = {
+       .reg = 0x8168,
+       .shift = 0,
+       .width = 4,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_byte1_div_clk_src",
+               .parent_data = &(const struct clk_parent_data) {
+                       .hw = &disp_cc_mdss_byte1_clk_src.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_regmap_div_ops,
+       },
+};
+
+static struct clk_regmap_div disp_cc_mdss_dptx0_link_div_clk_src = {
+       .reg = 0x81b4,
+       .shift = 0,
+       .width = 4,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_dptx0_link_div_clk_src",
+               .parent_data = &(const struct clk_parent_data) {
+                       .hw = &disp_cc_mdss_dptx0_link_clk_src.clkr.hw,
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_regmap_div_ro_ops,
+       },
+};
+
+static struct clk_regmap_div disp_cc_mdss_dptx1_link_div_clk_src = {
+       .reg = 0x824c,
+       .shift = 0,
+       .width = 4,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_dptx1_link_div_clk_src",
+               .parent_data = &(const struct clk_parent_data) {
+                       .hw = &disp_cc_mdss_dptx1_link_clk_src.clkr.hw,
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_regmap_div_ro_ops,
+       },
+};
+
+static struct clk_regmap_div disp_cc_mdss_dptx2_link_div_clk_src = {
+       .reg = 0x8284,
+       .shift = 0,
+       .width = 4,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_dptx2_link_div_clk_src",
+               .parent_data = &(const struct clk_parent_data) {
+                       .hw = &disp_cc_mdss_dptx2_link_clk_src.clkr.hw,
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_regmap_div_ro_ops,
+       },
+};
+
+static struct clk_regmap_div disp_cc_mdss_dptx3_link_div_clk_src = {
+       .reg = 0x8304,
+       .shift = 0,
+       .width = 4,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "disp_cc_mdss_dptx3_link_div_clk_src",
+               .parent_data = &(const struct clk_parent_data) {
+                       .hw = &disp_cc_mdss_dptx3_link_clk_src.clkr.hw,
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_regmap_div_ro_ops,
+       },
+};
+
+static struct clk_branch disp_cc_mdss_ahb1_clk = {
+       .halt_reg = 0xa020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xa020,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_ahb1_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .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_ahb_clk = {
+       .halt_reg = 0x80a4,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x80a4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_ahb_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .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 = 0x8028,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8028,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_byte0_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .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 = 0x802c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x802c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_byte0_intf_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .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_byte1_clk = {
+       .halt_reg = 0x8030,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8030,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_byte1_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_byte1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_byte1_intf_clk = {
+       .halt_reg = 0x8034,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8034,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_byte1_intf_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_byte1_div_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_dptx0_aux_clk = {
+       .halt_reg = 0x8058,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8058,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx0_aux_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx0_aux_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_dptx0_crypto_clk = {
+       .halt_reg = 0x804c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x804c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx0_crypto_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx0_link_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_dptx0_link_clk = {
+       .halt_reg = 0x8040,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx0_link_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx0_link_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_dptx0_link_intf_clk = {
+       .halt_reg = 0x8048,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8048,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx0_link_intf_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx0_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_dptx0_pixel0_clk = {
+       .halt_reg = 0x8050,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8050,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx0_pixel0_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx0_pixel0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_dptx0_pixel1_clk = {
+       .halt_reg = 0x8054,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8054,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx0_pixel1_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx0_pixel1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_dptx0_usb_router_link_intf_clk = {
+       .halt_reg = 0x8044,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8044,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx0_usb_router_link_intf_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx0_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_dptx1_aux_clk = {
+       .halt_reg = 0x8074,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8074,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx1_aux_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx1_aux_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_dptx1_crypto_clk = {
+       .halt_reg = 0x8070,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8070,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx1_crypto_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx1_link_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_dptx1_link_clk = {
+       .halt_reg = 0x8064,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8064,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx1_link_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx1_link_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_dptx1_link_intf_clk = {
+       .halt_reg = 0x806c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x806c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx1_link_intf_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx1_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_dptx1_pixel0_clk = {
+       .halt_reg = 0x805c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x805c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx1_pixel0_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx1_pixel0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_dptx1_pixel1_clk = {
+       .halt_reg = 0x8060,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8060,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx1_pixel1_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx1_pixel1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_dptx1_usb_router_link_intf_clk = {
+       .halt_reg = 0x8068,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8068,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx1_usb_router_link_intf_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx0_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_dptx2_aux_clk = {
+       .halt_reg = 0x808c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x808c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx2_aux_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx2_aux_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_dptx2_crypto_clk = {
+       .halt_reg = 0x8088,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8088,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx2_crypto_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx2_link_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_dptx2_link_clk = {
+       .halt_reg = 0x8080,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8080,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx2_link_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx2_link_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_dptx2_link_intf_clk = {
+       .halt_reg = 0x8084,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8084,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx2_link_intf_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx2_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_dptx2_pixel0_clk = {
+       .halt_reg = 0x8078,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8078,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx2_pixel0_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx2_pixel0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_dptx2_pixel1_clk = {
+       .halt_reg = 0x807c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x807c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx2_pixel1_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx2_pixel1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_dptx3_aux_clk = {
+       .halt_reg = 0x809c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x809c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx3_aux_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx3_aux_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_dptx3_crypto_clk = {
+       .halt_reg = 0x80a0,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x80a0,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx3_crypto_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx3_link_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_dptx3_link_clk = {
+       .halt_reg = 0x8094,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8094,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx3_link_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx3_link_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_dptx3_link_intf_clk = {
+       .halt_reg = 0x8098,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8098,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx3_link_intf_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx3_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_dptx3_pixel0_clk = {
+       .halt_reg = 0x8090,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8090,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_dptx3_pixel0_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_dptx3_pixel0_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 = 0x8038,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8038,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_esc0_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .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_esc1_clk = {
+       .halt_reg = 0x803c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x803c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_esc1_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_esc1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_mdp1_clk = {
+       .halt_reg = 0xa004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xa004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_mdp1_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .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_clk = {
+       .halt_reg = 0x800c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x800c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_mdp_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .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_lut1_clk = {
+       .halt_reg = 0xa014,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xa014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_mdp_lut1_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .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 = 0x801c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x801c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_mdp_lut_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .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 = 0xc004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0xc004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_non_gdsc_ahb_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .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 = 0x8004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_pclk0_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .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_pclk1_clk = {
+       .halt_reg = 0x8008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_pclk1_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_mdss_pclk1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch disp_cc_mdss_rot1_clk = {
+       .halt_reg = 0xa00c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xa00c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_rot1_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .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_rot_clk = {
+       .halt_reg = 0x8014,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_rot_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .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 = 0xc00c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xc00c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_rscc_ahb_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .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 = 0xc008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xc008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_rscc_vsync_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .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_vsync1_clk = {
+       .halt_reg = 0xa01c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xa01c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_vsync1_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .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 = 0x8024,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8024,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_mdss_vsync_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .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 = 0xe078,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xe078,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "disp_cc_sleep_clk",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .hw = &disp_cc_sleep_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct gdsc mdss_gdsc = {
+       .gdscr = 0x9000,
+       .pd = {
+               .name = "mdss_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = HW_CTRL | RETAIN_FF_ENABLE,
+};
+
+static struct gdsc mdss_int2_gdsc = {
+       .gdscr = 0xb000,
+       .pd = {
+               .name = "mdss_int2_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = HW_CTRL | RETAIN_FF_ENABLE,
+};
+
+static struct clk_regmap *disp_cc_sm8450_clocks[] = {
+       [DISP_CC_MDSS_AHB1_CLK] = &disp_cc_mdss_ahb1_clk.clkr,
+       [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_BYTE1_CLK] = &disp_cc_mdss_byte1_clk.clkr,
+       [DISP_CC_MDSS_BYTE1_CLK_SRC] = &disp_cc_mdss_byte1_clk_src.clkr,
+       [DISP_CC_MDSS_BYTE1_DIV_CLK_SRC] = &disp_cc_mdss_byte1_div_clk_src.clkr,
+       [DISP_CC_MDSS_BYTE1_INTF_CLK] = &disp_cc_mdss_byte1_intf_clk.clkr,
+       [DISP_CC_MDSS_DPTX0_AUX_CLK] = &disp_cc_mdss_dptx0_aux_clk.clkr,
+       [DISP_CC_MDSS_DPTX0_AUX_CLK_SRC] = &disp_cc_mdss_dptx0_aux_clk_src.clkr,
+       [DISP_CC_MDSS_DPTX0_CRYPTO_CLK] = &disp_cc_mdss_dptx0_crypto_clk.clkr,
+       [DISP_CC_MDSS_DPTX0_LINK_CLK] = &disp_cc_mdss_dptx0_link_clk.clkr,
+       [DISP_CC_MDSS_DPTX0_LINK_CLK_SRC] = &disp_cc_mdss_dptx0_link_clk_src.clkr,
+       [DISP_CC_MDSS_DPTX0_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dptx0_link_div_clk_src.clkr,
+       [DISP_CC_MDSS_DPTX0_LINK_INTF_CLK] = &disp_cc_mdss_dptx0_link_intf_clk.clkr,
+       [DISP_CC_MDSS_DPTX0_PIXEL0_CLK] = &disp_cc_mdss_dptx0_pixel0_clk.clkr,
+       [DISP_CC_MDSS_DPTX0_PIXEL0_CLK_SRC] = &disp_cc_mdss_dptx0_pixel0_clk_src.clkr,
+       [DISP_CC_MDSS_DPTX0_PIXEL1_CLK] = &disp_cc_mdss_dptx0_pixel1_clk.clkr,
+       [DISP_CC_MDSS_DPTX0_PIXEL1_CLK_SRC] = &disp_cc_mdss_dptx0_pixel1_clk_src.clkr,
+       [DISP_CC_MDSS_DPTX0_USB_ROUTER_LINK_INTF_CLK] =
+               &disp_cc_mdss_dptx0_usb_router_link_intf_clk.clkr,
+       [DISP_CC_MDSS_DPTX1_AUX_CLK] = &disp_cc_mdss_dptx1_aux_clk.clkr,
+       [DISP_CC_MDSS_DPTX1_AUX_CLK_SRC] = &disp_cc_mdss_dptx1_aux_clk_src.clkr,
+       [DISP_CC_MDSS_DPTX1_CRYPTO_CLK] = &disp_cc_mdss_dptx1_crypto_clk.clkr,
+       [DISP_CC_MDSS_DPTX1_LINK_CLK] = &disp_cc_mdss_dptx1_link_clk.clkr,
+       [DISP_CC_MDSS_DPTX1_LINK_CLK_SRC] = &disp_cc_mdss_dptx1_link_clk_src.clkr,
+       [DISP_CC_MDSS_DPTX1_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dptx1_link_div_clk_src.clkr,
+       [DISP_CC_MDSS_DPTX1_LINK_INTF_CLK] = &disp_cc_mdss_dptx1_link_intf_clk.clkr,
+       [DISP_CC_MDSS_DPTX1_PIXEL0_CLK] = &disp_cc_mdss_dptx1_pixel0_clk.clkr,
+       [DISP_CC_MDSS_DPTX1_PIXEL0_CLK_SRC] = &disp_cc_mdss_dptx1_pixel0_clk_src.clkr,
+       [DISP_CC_MDSS_DPTX1_PIXEL1_CLK] = &disp_cc_mdss_dptx1_pixel1_clk.clkr,
+       [DISP_CC_MDSS_DPTX1_PIXEL1_CLK_SRC] = &disp_cc_mdss_dptx1_pixel1_clk_src.clkr,
+       [DISP_CC_MDSS_DPTX1_USB_ROUTER_LINK_INTF_CLK] =
+               &disp_cc_mdss_dptx1_usb_router_link_intf_clk.clkr,
+       [DISP_CC_MDSS_DPTX2_AUX_CLK] = &disp_cc_mdss_dptx2_aux_clk.clkr,
+       [DISP_CC_MDSS_DPTX2_AUX_CLK_SRC] = &disp_cc_mdss_dptx2_aux_clk_src.clkr,
+       [DISP_CC_MDSS_DPTX2_CRYPTO_CLK] = &disp_cc_mdss_dptx2_crypto_clk.clkr,
+       [DISP_CC_MDSS_DPTX2_LINK_CLK] = &disp_cc_mdss_dptx2_link_clk.clkr,
+       [DISP_CC_MDSS_DPTX2_LINK_CLK_SRC] = &disp_cc_mdss_dptx2_link_clk_src.clkr,
+       [DISP_CC_MDSS_DPTX2_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dptx2_link_div_clk_src.clkr,
+       [DISP_CC_MDSS_DPTX2_LINK_INTF_CLK] = &disp_cc_mdss_dptx2_link_intf_clk.clkr,
+       [DISP_CC_MDSS_DPTX2_PIXEL0_CLK] = &disp_cc_mdss_dptx2_pixel0_clk.clkr,
+       [DISP_CC_MDSS_DPTX2_PIXEL0_CLK_SRC] = &disp_cc_mdss_dptx2_pixel0_clk_src.clkr,
+       [DISP_CC_MDSS_DPTX2_PIXEL1_CLK] = &disp_cc_mdss_dptx2_pixel1_clk.clkr,
+       [DISP_CC_MDSS_DPTX2_PIXEL1_CLK_SRC] = &disp_cc_mdss_dptx2_pixel1_clk_src.clkr,
+       [DISP_CC_MDSS_DPTX3_AUX_CLK] = &disp_cc_mdss_dptx3_aux_clk.clkr,
+       [DISP_CC_MDSS_DPTX3_AUX_CLK_SRC] = &disp_cc_mdss_dptx3_aux_clk_src.clkr,
+       [DISP_CC_MDSS_DPTX3_CRYPTO_CLK] = &disp_cc_mdss_dptx3_crypto_clk.clkr,
+       [DISP_CC_MDSS_DPTX3_LINK_CLK] = &disp_cc_mdss_dptx3_link_clk.clkr,
+       [DISP_CC_MDSS_DPTX3_LINK_CLK_SRC] = &disp_cc_mdss_dptx3_link_clk_src.clkr,
+       [DISP_CC_MDSS_DPTX3_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dptx3_link_div_clk_src.clkr,
+       [DISP_CC_MDSS_DPTX3_LINK_INTF_CLK] = &disp_cc_mdss_dptx3_link_intf_clk.clkr,
+       [DISP_CC_MDSS_DPTX3_PIXEL0_CLK] = &disp_cc_mdss_dptx3_pixel0_clk.clkr,
+       [DISP_CC_MDSS_DPTX3_PIXEL0_CLK_SRC] = &disp_cc_mdss_dptx3_pixel0_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_ESC1_CLK] = &disp_cc_mdss_esc1_clk.clkr,
+       [DISP_CC_MDSS_ESC1_CLK_SRC] = &disp_cc_mdss_esc1_clk_src.clkr,
+       [DISP_CC_MDSS_MDP1_CLK] = &disp_cc_mdss_mdp1_clk.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_LUT1_CLK] = &disp_cc_mdss_mdp_lut1_clk.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_PCLK1_CLK] = &disp_cc_mdss_pclk1_clk.clkr,
+       [DISP_CC_MDSS_PCLK1_CLK_SRC] = &disp_cc_mdss_pclk1_clk_src.clkr,
+       [DISP_CC_MDSS_ROT1_CLK] = &disp_cc_mdss_rot1_clk.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_VSYNC1_CLK] = &disp_cc_mdss_vsync1_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_PLL1] = &disp_cc_pll1.clkr,
+       [DISP_CC_SLEEP_CLK] = &disp_cc_sleep_clk.clkr,
+       [DISP_CC_SLEEP_CLK_SRC] = &disp_cc_sleep_clk_src.clkr,
+       [DISP_CC_XO_CLK_SRC] = &disp_cc_xo_clk_src.clkr,
+};
+
+static const struct qcom_reset_map disp_cc_sm8450_resets[] = {
+       [DISP_CC_MDSS_CORE_BCR] = { 0x8000 },
+       [DISP_CC_MDSS_CORE_INT2_BCR] = { 0xa000 },
+       [DISP_CC_MDSS_RSCC_BCR] = { 0xc000 },
+};
+
+static struct gdsc *disp_cc_sm8450_gdscs[] = {
+       [MDSS_GDSC] = &mdss_gdsc,
+       [MDSS_INT2_GDSC] = &mdss_int2_gdsc,
+};
+
+static const struct regmap_config disp_cc_sm8450_regmap_config = {
+       .reg_bits = 32,
+       .reg_stride = 4,
+       .val_bits = 32,
+       .max_register = 0x11008,
+       .fast_io = true,
+};
+
+static struct qcom_cc_desc disp_cc_sm8450_desc = {
+       .config = &disp_cc_sm8450_regmap_config,
+       .clks = disp_cc_sm8450_clocks,
+       .num_clks = ARRAY_SIZE(disp_cc_sm8450_clocks),
+       .resets = disp_cc_sm8450_resets,
+       .num_resets = ARRAY_SIZE(disp_cc_sm8450_resets),
+       .gdscs = disp_cc_sm8450_gdscs,
+       .num_gdscs = ARRAY_SIZE(disp_cc_sm8450_gdscs),
+};
+
+static const struct of_device_id disp_cc_sm8450_match_table[] = {
+       { .compatible = "qcom,sm8450-dispcc" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, disp_cc_sm8450_match_table);
+
+static void disp_cc_sm8450_pm_runtime_disable(void *data)
+{
+       pm_runtime_disable(data);
+}
+
+static int disp_cc_sm8450_probe(struct platform_device *pdev)
+{
+       struct regmap *regmap;
+       int ret;
+
+       pm_runtime_enable(&pdev->dev);
+
+       ret = devm_add_action_or_reset(&pdev->dev, disp_cc_sm8450_pm_runtime_disable, &pdev->dev);
+       if (ret)
+               return ret;
+
+       ret = pm_runtime_resume_and_get(&pdev->dev);
+       if (ret)
+               return ret;
+
+       regmap = qcom_cc_map(pdev, &disp_cc_sm8450_desc);
+       if (IS_ERR(regmap))
+               return PTR_ERR(regmap);
+
+       clk_lucid_evo_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config);
+       clk_lucid_evo_pll_configure(&disp_cc_pll1, regmap, &disp_cc_pll1_config);
+
+       /* Enable clock gating for MDP clocks */
+       regmap_update_bits(regmap, DISP_CC_MISC_CMD, 0x10, 0x10);
+
+       /*
+        * Keep clocks always enabled:
+        *      disp_cc_xo_clk
+        */
+       regmap_update_bits(regmap, 0xe05c, BIT(0), BIT(0));
+
+       ret = qcom_cc_really_probe(pdev, &disp_cc_sm8450_desc, regmap);
+
+       pm_runtime_put(&pdev->dev);
+
+       return ret;
+}
+
+static struct platform_driver disp_cc_sm8450_driver = {
+       .probe = disp_cc_sm8450_probe,
+       .driver = {
+               .name = "disp_cc-sm8450",
+               .of_match_table = disp_cc_sm8450_match_table,
+       },
+};
+
+static int __init disp_cc_sm8450_init(void)
+{
+       return platform_driver_register(&disp_cc_sm8450_driver);
+}
+subsys_initcall(disp_cc_sm8450_init);
+
+static void __exit disp_cc_sm8450_exit(void)
+{
+       platform_driver_unregister(&disp_cc_sm8450_driver);
+}
+module_exit(disp_cc_sm8450_exit);
+
+MODULE_DESCRIPTION("QTI DISPCC SM8450 Driver");
+MODULE_LICENSE("GPL");
index 94ea2d8..657e115 100644 (file)
@@ -34,7 +34,9 @@ static struct clk_pll pll8 = {
        .status_bit = 16,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pll8",
-               .parent_names = (const char *[]){ "pxo" },
+               .parent_data = &(const struct clk_parent_data){
+                       .fw_name = "pxo", .name = "pxo_board",
+               },
                .num_parents = 1,
                .ops = &clk_pll_ops,
        },
@@ -45,7 +47,9 @@ static struct clk_regmap pll8_vote = {
        .enable_mask = BIT(8),
        .hw.init = &(struct clk_init_data){
                .name = "pll8_vote",
-               .parent_names = (const char *[]){ "pll8" },
+               .parent_hws = (const struct clk_hw*[]){
+                       &pll8.clkr.hw
+               },
                .num_parents = 1,
                .ops = &clk_pll_vote_ops,
        },
@@ -62,9 +66,9 @@ static const struct parent_map gcc_pxo_pll8_map[] = {
        { P_PLL8, 3 }
 };
 
-static const char * const gcc_pxo_pll8[] = {
-       "pxo",
-       "pll8_vote",
+static const struct clk_parent_data gcc_pxo_pll8[] = {
+       { .fw_name = "pxo", .name = "pxo_board" },
+       { .hw = &pll8_vote.hw },
 };
 
 static const struct parent_map gcc_pxo_pll8_cxo_map[] = {
@@ -73,10 +77,10 @@ static const struct parent_map gcc_pxo_pll8_cxo_map[] = {
        { P_CXO, 5 }
 };
 
-static const char * const gcc_pxo_pll8_cxo[] = {
-       "pxo",
-       "pll8_vote",
-       "cxo",
+static const struct clk_parent_data gcc_pxo_pll8_cxo[] = {
+       { .fw_name = "pxo", .name = "pxo_board" },
+       { .hw = &pll8_vote.hw },
+       { .fw_name = "cxo", .name = "cxo_board" },
 };
 
 static struct freq_tbl clk_tbl_gsbi_uart[] = {
@@ -122,8 +126,8 @@ static struct clk_rcg gsbi1_uart_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi1_uart_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -138,8 +142,8 @@ static struct clk_branch gsbi1_uart_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi1_uart_clk",
-                       .parent_names = (const char *[]){
-                               "gsbi1_uart_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi1_uart_src.clkr.hw
                        },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
@@ -173,8 +177,8 @@ static struct clk_rcg gsbi2_uart_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi2_uart_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -189,8 +193,8 @@ static struct clk_branch gsbi2_uart_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi2_uart_clk",
-                       .parent_names = (const char *[]){
-                               "gsbi2_uart_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi2_uart_src.clkr.hw
                        },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
@@ -224,8 +228,8 @@ static struct clk_rcg gsbi3_uart_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi3_uart_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -240,8 +244,8 @@ static struct clk_branch gsbi3_uart_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi3_uart_clk",
-                       .parent_names = (const char *[]){
-                               "gsbi3_uart_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi3_uart_src.clkr.hw
                        },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
@@ -275,8 +279,8 @@ static struct clk_rcg gsbi4_uart_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi4_uart_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -291,8 +295,8 @@ static struct clk_branch gsbi4_uart_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi4_uart_clk",
-                       .parent_names = (const char *[]){
-                               "gsbi4_uart_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi4_uart_src.clkr.hw
                        },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
@@ -326,8 +330,8 @@ static struct clk_rcg gsbi5_uart_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi5_uart_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -342,8 +346,8 @@ static struct clk_branch gsbi5_uart_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi5_uart_clk",
-                       .parent_names = (const char *[]){
-                               "gsbi5_uart_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi5_uart_src.clkr.hw
                        },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
@@ -377,8 +381,8 @@ static struct clk_rcg gsbi6_uart_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi6_uart_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -393,8 +397,8 @@ static struct clk_branch gsbi6_uart_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi6_uart_clk",
-                       .parent_names = (const char *[]){
-                               "gsbi6_uart_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi6_uart_src.clkr.hw
                        },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
@@ -428,8 +432,8 @@ static struct clk_rcg gsbi7_uart_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi7_uart_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -444,8 +448,8 @@ static struct clk_branch gsbi7_uart_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi7_uart_clk",
-                       .parent_names = (const char *[]){
-                               "gsbi7_uart_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi7_uart_src.clkr.hw
                        },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
@@ -479,8 +483,8 @@ static struct clk_rcg gsbi8_uart_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi8_uart_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -495,7 +499,9 @@ static struct clk_branch gsbi8_uart_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi8_uart_clk",
-                       .parent_names = (const char *[]){ "gsbi8_uart_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi8_uart_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -528,8 +534,8 @@ static struct clk_rcg gsbi9_uart_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi9_uart_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -544,7 +550,9 @@ static struct clk_branch gsbi9_uart_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi9_uart_clk",
-                       .parent_names = (const char *[]){ "gsbi9_uart_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi9_uart_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -577,8 +585,8 @@ static struct clk_rcg gsbi10_uart_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi10_uart_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -593,7 +601,9 @@ static struct clk_branch gsbi10_uart_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi10_uart_clk",
-                       .parent_names = (const char *[]){ "gsbi10_uart_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi10_uart_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -626,8 +636,8 @@ static struct clk_rcg gsbi11_uart_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi11_uart_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -642,7 +652,9 @@ static struct clk_branch gsbi11_uart_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi11_uart_clk",
-                       .parent_names = (const char *[]){ "gsbi11_uart_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi11_uart_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -675,8 +687,8 @@ static struct clk_rcg gsbi12_uart_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi12_uart_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -691,7 +703,9 @@ static struct clk_branch gsbi12_uart_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi12_uart_clk",
-                       .parent_names = (const char *[]){ "gsbi12_uart_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi12_uart_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -737,8 +751,8 @@ static struct clk_rcg gsbi1_qup_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi1_qup_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -753,7 +767,9 @@ static struct clk_branch gsbi1_qup_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi1_qup_clk",
-                       .parent_names = (const char *[]){ "gsbi1_qup_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi1_qup_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -786,8 +802,8 @@ static struct clk_rcg gsbi2_qup_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi2_qup_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -802,7 +818,9 @@ static struct clk_branch gsbi2_qup_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi2_qup_clk",
-                       .parent_names = (const char *[]){ "gsbi2_qup_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi2_qup_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -835,8 +853,8 @@ static struct clk_rcg gsbi3_qup_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi3_qup_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -851,7 +869,9 @@ static struct clk_branch gsbi3_qup_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi3_qup_clk",
-                       .parent_names = (const char *[]){ "gsbi3_qup_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi3_qup_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -884,8 +904,8 @@ static struct clk_rcg gsbi4_qup_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi4_qup_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -900,7 +920,9 @@ static struct clk_branch gsbi4_qup_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi4_qup_clk",
-                       .parent_names = (const char *[]){ "gsbi4_qup_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi4_qup_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -933,8 +955,8 @@ static struct clk_rcg gsbi5_qup_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi5_qup_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -949,7 +971,9 @@ static struct clk_branch gsbi5_qup_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi5_qup_clk",
-                       .parent_names = (const char *[]){ "gsbi5_qup_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi5_qup_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -982,8 +1006,8 @@ static struct clk_rcg gsbi6_qup_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi6_qup_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -998,7 +1022,9 @@ static struct clk_branch gsbi6_qup_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi6_qup_clk",
-                       .parent_names = (const char *[]){ "gsbi6_qup_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi6_qup_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1031,8 +1057,8 @@ static struct clk_rcg gsbi7_qup_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi7_qup_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -1047,7 +1073,9 @@ static struct clk_branch gsbi7_qup_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi7_qup_clk",
-                       .parent_names = (const char *[]){ "gsbi7_qup_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi7_qup_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1080,8 +1108,8 @@ static struct clk_rcg gsbi8_qup_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi8_qup_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -1096,7 +1124,9 @@ static struct clk_branch gsbi8_qup_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi8_qup_clk",
-                       .parent_names = (const char *[]){ "gsbi8_qup_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi8_qup_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1129,8 +1159,8 @@ static struct clk_rcg gsbi9_qup_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi9_qup_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -1145,7 +1175,9 @@ static struct clk_branch gsbi9_qup_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi9_qup_clk",
-                       .parent_names = (const char *[]){ "gsbi9_qup_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi9_qup_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1178,8 +1210,8 @@ static struct clk_rcg gsbi10_qup_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi10_qup_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -1194,7 +1226,9 @@ static struct clk_branch gsbi10_qup_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi10_qup_clk",
-                       .parent_names = (const char *[]){ "gsbi10_qup_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi10_qup_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1227,8 +1261,8 @@ static struct clk_rcg gsbi11_qup_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi11_qup_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -1243,7 +1277,9 @@ static struct clk_branch gsbi11_qup_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi11_qup_clk",
-                       .parent_names = (const char *[]){ "gsbi11_qup_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi11_qup_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1276,8 +1312,8 @@ static struct clk_rcg gsbi12_qup_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi12_qup_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -1292,7 +1328,9 @@ static struct clk_branch gsbi12_qup_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi12_qup_clk",
-                       .parent_names = (const char *[]){ "gsbi12_qup_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi12_qup_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1338,8 +1376,8 @@ static struct clk_rcg gp0_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gp0_src",
-                       .parent_names = gcc_pxo_pll8_cxo,
-                       .num_parents = 3,
+                       .parent_data = gcc_pxo_pll8_cxo,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8_cxo),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -1354,7 +1392,9 @@ static struct clk_branch gp0_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gp0_clk",
-                       .parent_names = (const char *[]){ "gp0_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gp0_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1387,8 +1427,8 @@ static struct clk_rcg gp1_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gp1_src",
-                       .parent_names = gcc_pxo_pll8_cxo,
-                       .num_parents = 3,
+                       .parent_data = gcc_pxo_pll8_cxo,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8_cxo),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_RATE_GATE,
                },
@@ -1403,7 +1443,9 @@ static struct clk_branch gp1_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gp1_clk",
-                       .parent_names = (const char *[]){ "gp1_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gp1_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1436,8 +1478,8 @@ static struct clk_rcg gp2_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gp2_src",
-                       .parent_names = gcc_pxo_pll8_cxo,
-                       .num_parents = 3,
+                       .parent_data = gcc_pxo_pll8_cxo,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8_cxo),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_RATE_GATE,
                },
@@ -1452,7 +1494,9 @@ static struct clk_branch gp2_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gp2_clk",
-                       .parent_names = (const char *[]){ "gp2_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gp2_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1488,8 +1532,8 @@ static struct clk_rcg prng_src = {
        .clkr.hw = {
                .init = &(struct clk_init_data){
                        .name = "prng_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                },
        },
@@ -1504,7 +1548,9 @@ static struct clk_branch prng_clk = {
                .enable_mask = BIT(10),
                .hw.init = &(struct clk_init_data){
                        .name = "prng_clk",
-                       .parent_names = (const char *[]){ "prng_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &prng_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                },
@@ -1547,8 +1593,8 @@ static struct clk_rcg sdc1_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "sdc1_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                },
        }
@@ -1562,7 +1608,9 @@ static struct clk_branch sdc1_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "sdc1_clk",
-                       .parent_names = (const char *[]){ "sdc1_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &sdc1_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1595,8 +1643,8 @@ static struct clk_rcg sdc2_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "sdc2_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                },
        }
@@ -1610,7 +1658,9 @@ static struct clk_branch sdc2_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "sdc2_clk",
-                       .parent_names = (const char *[]){ "sdc2_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &sdc2_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1643,8 +1693,8 @@ static struct clk_rcg sdc3_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "sdc3_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                },
        }
@@ -1658,7 +1708,9 @@ static struct clk_branch sdc3_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "sdc3_clk",
-                       .parent_names = (const char *[]){ "sdc3_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &sdc3_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1691,8 +1743,8 @@ static struct clk_rcg sdc4_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "sdc4_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                },
        }
@@ -1706,7 +1758,9 @@ static struct clk_branch sdc4_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "sdc4_clk",
-                       .parent_names = (const char *[]){ "sdc4_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &sdc4_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1739,8 +1793,8 @@ static struct clk_rcg sdc5_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "sdc5_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                },
        }
@@ -1754,7 +1808,9 @@ static struct clk_branch sdc5_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "sdc5_clk",
-                       .parent_names = (const char *[]){ "sdc5_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &sdc5_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1792,8 +1848,8 @@ static struct clk_rcg tsif_ref_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "tsif_ref_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_RATE_GATE,
                },
@@ -1808,7 +1864,9 @@ static struct clk_branch tsif_ref_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "tsif_ref_clk",
-                       .parent_names = (const char *[]){ "tsif_ref_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &tsif_ref_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1846,8 +1904,8 @@ static struct clk_rcg usb_hs1_xcvr_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "usb_hs1_xcvr_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_RATE_GATE,
                },
@@ -1862,7 +1920,9 @@ static struct clk_branch usb_hs1_xcvr_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "usb_hs1_xcvr_clk",
-                       .parent_names = (const char *[]){ "usb_hs1_xcvr_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb_hs1_xcvr_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1895,16 +1955,14 @@ static struct clk_rcg usb_fs1_xcvr_fs_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "usb_fs1_xcvr_fs_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_RATE_GATE,
                },
        }
 };
 
-static const char * const usb_fs1_xcvr_fs_src_p[] = { "usb_fs1_xcvr_fs_src" };
-
 static struct clk_branch usb_fs1_xcvr_fs_clk = {
        .halt_reg = 0x2fcc,
        .halt_bit = 15,
@@ -1913,7 +1971,9 @@ static struct clk_branch usb_fs1_xcvr_fs_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "usb_fs1_xcvr_fs_clk",
-                       .parent_names = usb_fs1_xcvr_fs_src_p,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb_fs1_xcvr_fs_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1928,7 +1988,9 @@ static struct clk_branch usb_fs1_system_clk = {
                .enable_reg = 0x296c,
                .enable_mask = BIT(4),
                .hw.init = &(struct clk_init_data){
-                       .parent_names = usb_fs1_xcvr_fs_src_p,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb_fs1_xcvr_fs_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .name = "usb_fs1_system_clk",
                        .ops = &clk_branch_ops,
@@ -1962,16 +2024,14 @@ static struct clk_rcg usb_fs2_xcvr_fs_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "usb_fs2_xcvr_fs_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_RATE_GATE,
                },
        }
 };
 
-static const char * const usb_fs2_xcvr_fs_src_p[] = { "usb_fs2_xcvr_fs_src" };
-
 static struct clk_branch usb_fs2_xcvr_fs_clk = {
        .halt_reg = 0x2fcc,
        .halt_bit = 12,
@@ -1980,7 +2040,9 @@ static struct clk_branch usb_fs2_xcvr_fs_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "usb_fs2_xcvr_fs_clk",
-                       .parent_names = usb_fs2_xcvr_fs_src_p,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb_fs2_xcvr_fs_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1996,7 +2058,9 @@ static struct clk_branch usb_fs2_system_clk = {
                .enable_mask = BIT(4),
                .hw.init = &(struct clk_init_data){
                        .name = "usb_fs2_system_clk",
-                       .parent_names = usb_fs2_xcvr_fs_src_p,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb_fs2_xcvr_fs_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
diff --git a/drivers/clk/qcom/gcc-msm8909.c b/drivers/clk/qcom/gcc-msm8909.c
new file mode 100644 (file)
index 0000000..2a00b11
--- /dev/null
@@ -0,0 +1,2731 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (C) 2022 Kernkonzept GmbH.
+ *
+ * Based on gcc-msm8916.c:
+ *   Copyright 2015 Linaro Limited
+ * adapted with data from clock-gcc-8909.c in Qualcomm's msm-3.18 release:
+ *   Copyright (c) 2014-2016, The Linux Foundation. All rights reserved.
+ */
+
+#include <linux/bitops.h>
+#include <linux/clk-provider.h>
+#include <linux/err.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+#include <linux/reset-controller.h>
+
+#include <dt-bindings/clock/qcom,gcc-msm8909.h>
+
+#include "clk-alpha-pll.h"
+#include "clk-branch.h"
+#include "clk-pll.h"
+#include "clk-rcg.h"
+#include "clk-regmap.h"
+#include "common.h"
+#include "gdsc.h"
+#include "reset.h"
+
+/* Need to match the order of clocks in DT binding */
+enum {
+       DT_XO,
+       DT_SLEEP_CLK,
+       DT_DSI0PLL,
+       DT_DSI0PLL_BYTE,
+};
+
+enum {
+       P_XO,
+       P_SLEEP_CLK,
+       P_GPLL0,
+       P_GPLL1,
+       P_GPLL2,
+       P_BIMC,
+       P_DSI0PLL,
+       P_DSI0PLL_BYTE,
+};
+
+static const struct parent_map gcc_xo_map[] = {
+       { P_XO, 0 },
+};
+
+static const struct clk_parent_data gcc_xo_data[] = {
+       { .index = DT_XO },
+};
+
+static const struct clk_parent_data gcc_sleep_clk_data[] = {
+       { .index = DT_SLEEP_CLK },
+};
+
+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 = gcc_xo_data,
+                       .num_parents = ARRAY_SIZE(gcc_xo_data),
+                       /* Avoid rate changes for shared clock */
+                       .ops = &clk_alpha_pll_fixed_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,
+               /* Avoid rate changes for shared clock */
+               .ops = &clk_alpha_pll_postdiv_ro_ops,
+       },
+};
+
+static struct clk_pll gpll1 = {
+       .l_reg = 0x20004,
+       .m_reg = 0x20008,
+       .n_reg = 0x2000c,
+       .config_reg = 0x20010,
+       .mode_reg = 0x20000,
+       .status_reg = 0x2001c,
+       .status_bit = 17,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gpll1",
+               .parent_data = gcc_xo_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_data),
+               .ops = &clk_pll_ops,
+       },
+};
+
+static struct clk_regmap gpll1_vote = {
+       .enable_reg = 0x45000,
+       .enable_mask = BIT(1),
+       .hw.init = &(struct clk_init_data) {
+               .name = "gpll1_vote",
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gpll1.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_pll_vote_ops,
+       },
+};
+
+static struct clk_alpha_pll gpll2_early = {
+       .offset = 0x25000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .enable_reg = 0x45000,
+               .enable_mask = BIT(3),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gpll2_early",
+                       .parent_data = gcc_xo_data,
+                       .num_parents = ARRAY_SIZE(gcc_xo_data),
+                       /* Avoid rate changes for shared clock */
+                       .ops = &clk_alpha_pll_fixed_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll_postdiv gpll2 = {
+       .offset = 0x25000,
+       .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,
+               /* Avoid rate changes for shared clock */
+               .ops = &clk_alpha_pll_postdiv_ro_ops,
+       },
+};
+
+static struct clk_alpha_pll bimc_pll_early = {
+       .offset = 0x23000,
+       .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 = "bimc_pll_early",
+                       .parent_data = gcc_xo_data,
+                       .num_parents = ARRAY_SIZE(gcc_xo_data),
+                       /* Avoid rate changes for shared clock */
+                       .ops = &clk_alpha_pll_fixed_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll_postdiv bimc_pll = {
+       .offset = 0x23000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "bimc_pll",
+               .parent_hws = (const struct clk_hw*[]) {
+                       &bimc_pll_early.clkr.hw,
+               },
+               .num_parents = 1,
+               /* Avoid rate changes for shared clock */
+               .ops = &clk_alpha_pll_postdiv_ro_ops,
+       },
+};
+
+static const struct parent_map gcc_xo_gpll0_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+};
+
+static const struct clk_parent_data gcc_xo_gpll0_data[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+};
+
+static const struct parent_map gcc_xo_gpll0_bimc_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_BIMC, 2 },
+};
+
+static const struct clk_parent_data gcc_xo_gpll0_bimc_data[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &bimc_pll.clkr.hw },
+};
+
+static const struct freq_tbl ftbl_apss_ahb_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(50000000, P_GPLL0, 16, 0, 0),
+       F(100000000, P_GPLL0, 8, 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_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "apss_ahb_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 bimc_ddr_clk_src = {
+       .cmd_rcgr = 0x32004,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_bimc_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "bimc_ddr_clk_src",
+               .parent_data = gcc_xo_gpll0_bimc_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_bimc_data),
+               .ops = &clk_rcg2_ops,
+               .flags = CLK_GET_RATE_NOCACHE,
+       },
+};
+
+static struct clk_rcg2 bimc_gpu_clk_src = {
+       .cmd_rcgr = 0x31028,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_bimc_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "bimc_gpu_clk_src",
+               .parent_data = gcc_xo_gpll0_bimc_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_bimc_data),
+               .ops = &clk_rcg2_ops,
+               .flags = CLK_GET_RATE_NOCACHE,
+       },
+};
+
+static const struct freq_tbl ftbl_blsp_i2c_apps_clk_src[] = {
+       F(19200000, P_XO, 1, 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_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup1_i2c_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_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_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup2_i2c_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_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_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup3_i2c_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_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_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup4_i2c_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 blsp1_qup5_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x06000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup5_i2c_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 blsp1_qup6_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x07000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup6_i2c_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_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(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_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup1_spi_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_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_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup2_spi_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_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_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup3_spi_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_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_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup4_spi_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 blsp1_qup5_spi_apps_clk_src = {
+       .cmd_rcgr = 0x06024,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_blsp_spi_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup5_spi_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 blsp1_qup6_spi_apps_clk_src = {
+       .cmd_rcgr = 0x07024,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_blsp_spi_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup6_spi_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct freq_tbl ftbl_blsp_uart_apps_clk_src[] = {
+       F(3686400, P_GPLL0, 1, 72, 15625),
+       F(7372800, P_GPLL0, 1, 144, 15625),
+       F(14745600, P_GPLL0, 1, 288, 15625),
+       F(16000000, P_GPLL0, 10, 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),
+       { }
+};
+
+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_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_uart1_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_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_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_uart2_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct parent_map gcc_byte0_map[] = {
+       { P_XO, 0 },
+       { P_DSI0PLL_BYTE, 1 },
+};
+
+static const struct clk_parent_data gcc_byte_data[] = {
+       { .index = DT_XO },
+       { .index = DT_DSI0PLL_BYTE },
+};
+
+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 const struct freq_tbl ftbl_camss_gp_clk_src[] = {
+       F(100000000, P_GPLL0, 8, 0, 0),
+       F(200000000, P_GPLL0, 4, 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_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "camss_gp0_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_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_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "camss_gp1_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct freq_tbl ftbl_camss_top_ahb_clk_src[] = {
+       F(40000000, P_GPLL0, 10, 1, 2),
+       F(80000000, P_GPLL0, 10, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 camss_top_ahb_clk_src = {
+       .cmd_rcgr = 0x5a000,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_camss_top_ahb_clk_src,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "camss_top_ahb_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct freq_tbl ftbl_crypto_clk_src[] = {
+       F(50000000, P_GPLL0, 16, 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_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "crypto_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct freq_tbl ftbl_csi_clk_src[] = {
+       F(100000000, P_GPLL0, 8, 0, 0),
+       F(200000000, P_GPLL0, 4, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 csi0_clk_src = {
+       .cmd_rcgr = 0x4e020,
+       .hid_width = 5,
+       .freq_tbl = ftbl_csi_clk_src,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "csi0_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_map),
+               .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_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "csi1_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct freq_tbl ftbl_csi_phytimer_clk_src[] = {
+       F(100000000, P_GPLL0, 8, 0, 0),
+       F(200000000, P_GPLL0, 4, 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_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "csi0phytimer_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct freq_tbl ftbl_esc0_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 esc0_clk_src = {
+       .cmd_rcgr = 0x4d05c,
+       .hid_width = 5,
+       .freq_tbl = ftbl_esc0_clk_src,
+       .parent_map = gcc_xo_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "esc0_clk_src",
+               .parent_data = gcc_xo_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct parent_map gcc_gfx3d_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL1, 2 },
+};
+
+static const struct clk_parent_data gcc_gfx3d_data[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll1_vote.hw },
+};
+
+static const struct freq_tbl ftbl_gfx3d_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(50000000, P_GPLL0, 16, 0, 0),
+       F(80000000, P_GPLL0, 10, 0, 0),
+       F(100000000, P_GPLL0, 8, 0, 0),
+       F(160000000, P_GPLL0, 5, 0, 0),
+       F(177780000, P_GPLL0, 4.5, 0, 0),
+       F(200000000, P_GPLL0, 4, 0, 0),
+       F(266670000, P_GPLL0, 3, 0, 0),
+       F(307200000, P_GPLL1, 4, 0, 0),
+       F(409600000, P_GPLL1, 3, 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_ops,
+       }
+};
+
+static const struct freq_tbl ftbl_gp_clk_src[] = {
+       F(150000, P_XO, 1, 1, 128),
+       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_xo_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gp1_clk_src",
+               .parent_data = gcc_xo_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_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_xo_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gp2_clk_src",
+               .parent_data = gcc_xo_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_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_xo_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gp3_clk_src",
+               .parent_data = gcc_xo_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct parent_map gcc_mclk_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL2, 3 },
+};
+
+static const struct clk_parent_data gcc_mclk_data[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll2.clkr.hw },
+};
+
+static const struct freq_tbl ftbl_mclk_clk_src[] = {
+       F(24000000, P_GPLL2, 1, 1, 33),
+       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 const struct parent_map gcc_mdp_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL1, 3 },
+};
+
+static const struct clk_parent_data gcc_mdp_data[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll1_vote.hw },
+};
+
+static const struct freq_tbl ftbl_mdp_clk_src[] = {
+       F(50000000, P_GPLL0, 16, 0, 0),
+       F(80000000, P_GPLL0, 10, 0, 0),
+       F(100000000, P_GPLL0, 8, 0, 0),
+       F(160000000, P_GPLL0, 5, 0, 0),
+       F(177780000, P_GPLL0, 4.5, 0, 0),
+       F(200000000, P_GPLL0, 4, 0, 0),
+       F(266670000, P_GPLL0, 3, 0, 0),
+       F(307200000, P_GPLL1, 4, 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 },
+};
+
+static const struct clk_parent_data gcc_pclk_data[] = {
+       { .index = DT_XO },
+       { .index = DT_DSI0PLL },
+};
+
+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 pcnoc_bfdcd_clk_src = {
+       .cmd_rcgr = 0x27000,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_bimc_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "pcnoc_bfdcd_clk_src",
+               .parent_data = gcc_xo_gpll0_bimc_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_bimc_data),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_pdm2_clk_src[] = {
+       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_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "pdm2_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct freq_tbl ftbl_gcc_sdcc1_2_apps_clk[] = {
+       F(144000, P_XO, 16, 3, 25),
+       F(400000, P_XO, 12, 1, 4),
+       F(20000000, P_GPLL0, 10, 1, 4),
+       F(25000000, P_GPLL0, 16, 1, 2),
+       F(50000000, P_GPLL0, 16, 0, 0),
+       F(100000000, P_GPLL0, 8, 0, 0),
+       F(177770000, P_GPLL0, 4.5, 0, 0),
+       F(200000000, P_GPLL0, 4, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 sdcc1_apps_clk_src = {
+       .cmd_rcgr = 0x42004,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_gcc_sdcc1_2_apps_clk,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "sdcc1_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
+               .ops = &clk_rcg2_floor_ops,
+       }
+};
+
+static struct clk_rcg2 sdcc2_apps_clk_src = {
+       .cmd_rcgr = 0x43004,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_gcc_sdcc1_2_apps_clk,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "sdcc2_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
+               .ops = &clk_rcg2_floor_ops,
+       }
+};
+
+static struct clk_rcg2 system_noc_bfdcd_clk_src = {
+       .cmd_rcgr = 0x26004,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_bimc_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "system_noc_bfdcd_clk_src",
+               .parent_data = gcc_xo_gpll0_bimc_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_bimc_data),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_usb_hs_system_clk[] = {
+       F(57140000, P_GPLL0, 14, 0, 0),
+       F(80000000, P_GPLL0, 10, 0, 0),
+       F(100000000, P_GPLL0, 8, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 usb_hs_system_clk_src = {
+       .cmd_rcgr = 0x41010,
+       .hid_width = 5,
+       .freq_tbl = ftbl_gcc_usb_hs_system_clk,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "usb_hs_system_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct parent_map gcc_vcodec0_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL1, 3 },
+};
+
+static const struct clk_parent_data gcc_vcodec0_data[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll1_vote.hw },
+};
+
+static const struct freq_tbl ftbl_vcodec0_clk_src[] = {
+       F(133330000, P_GPLL0, 6, 0, 0),
+       F(266670000, P_GPLL0, 3, 0, 0),
+       F(307200000, P_GPLL1, 4, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 vcodec0_clk_src = {
+       .cmd_rcgr = 0x4c000,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .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 freq_tbl ftbl_gcc_camss_vfe0_clk[] = {
+       F(50000000, P_GPLL0, 16, 0, 0),
+       F(80000000, P_GPLL0, 10, 0, 0),
+       F(100000000, P_GPLL0, 8, 0, 0),
+       F(133330000, P_GPLL0, 6, 0, 0),
+       F(160000000, P_GPLL0, 5, 0, 0),
+       F(177780000, P_GPLL0, 4.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),
+       { }
+};
+
+static struct clk_rcg2 vfe0_clk_src = {
+       .cmd_rcgr = 0x58000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_gcc_camss_vfe0_clk,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "vfe0_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+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_xo_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "vsync_clk_src",
+               .parent_data = gcc_xo_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_branch gcc_apss_tcu_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_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &bimc_ddr_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .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",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp1_sleep_clk = {
+       .halt_reg = 0x01004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(9),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_sleep_clk",
+                       .parent_data = gcc_sleep_clk_data,
+                       .num_parents = ARRAY_SIZE(gcc_sleep_clk_data),
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_boot_rom_ahb_clk = {
+       .halt_reg = 0x1300c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(7),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_boot_rom_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .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_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",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .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",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_gfx_tbu_clk = {
+       .halt_reg = 0x12010,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x4500c,
+               .enable_mask = BIT(3),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_gfx_tbu_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &bimc_ddr_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_gfx_tcu_clk = {
+       .halt_reg = 0x12020,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x4500c,
+               .enable_mask = BIT(2),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_gfx_tcu_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &bimc_ddr_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_gtcu_ahb_clk = {
+       .halt_reg = 0x12044,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x4500c,
+               .enable_mask = BIT(13),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_gtcu_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .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",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &system_noc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .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",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+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",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+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",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &system_noc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .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",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &system_noc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_bimc_gfx_clk = {
+       .halt_reg = 0x31024,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x31024,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_bimc_gfx_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &bimc_gpu_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_bimc_gpu_clk = {
+       .halt_reg = 0x31040,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x31040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_bimc_gpu_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &bimc_gpu_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .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_blsp1_qup5_i2c_apps_clk = {
+       .halt_reg = 0x06020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x06020,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_qup5_i2c_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &blsp1_qup5_i2c_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp1_qup6_i2c_apps_clk = {
+       .halt_reg = 0x07020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x07020,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_qup6_i2c_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &blsp1_qup6_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_blsp1_qup5_spi_apps_clk = {
+       .halt_reg = 0x0601c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0601c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_qup5_spi_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &blsp1_qup5_spi_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp1_qup6_spi_apps_clk = {
+       .halt_reg = 0x0701c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0701c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_qup6_spi_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &blsp1_qup6_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_camss_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_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+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_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_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_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_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_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_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_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_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_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_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_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_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_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_top_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_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_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_vfe_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_vfe_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_vfe_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_vfe_axi_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &system_noc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .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_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",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .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",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &system_noc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .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_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_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_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",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .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",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &bimc_ddr_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .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",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &pcnoc_bfdcd_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_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",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_sdcc1_ahb_clk = {
+       .halt_reg = 0x4201c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4201c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_sdcc1_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .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_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",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_sdcc2_apps_clk = {
+       .halt_reg = 0x43018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x43018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_sdcc2_apps_clk",
+                       .parent_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_usb2a_phy_sleep_clk = {
+       .halt_reg = 0x4102c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4102c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_usb2a_phy_sleep_clk",
+                       .parent_data = gcc_sleep_clk_data,
+                       .num_parents = ARRAY_SIZE(gcc_sleep_clk_data),
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_usb_hs_ahb_clk = {
+       .halt_reg = 0x41008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x41008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_usb_hs_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_usb_hs_phy_cfg_ahb_clk = {
+       .halt_reg = 0x41030,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x41030,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_usb_hs_phy_cfg_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_usb_hs_system_clk = {
+       .halt_reg = 0x41004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x41004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_usb_hs_system_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &usb_hs_system_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+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",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .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",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &system_noc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .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 gdsc mdss_gdsc = {
+       .gdscr = 0x4d078,
+       .cxcs = (unsigned int []) { 0x4d080, 0x4d088 },
+       .cxc_count = 2,
+       .pd = {
+               .name = "mdss_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc oxili_gdsc = {
+       .gdscr = 0x5901c,
+       .cxcs = (unsigned int []) { 0x59020 },
+       .cxc_count = 1,
+       .pd = {
+               .name = "oxili_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_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_gdsc",
+       },
+       .flags = HW_CTRL,
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc vfe_gdsc = {
+       .gdscr = 0x58034,
+       .cxcs = (unsigned int []) { 0x58038, 0x58048, 0x58050 },
+       .cxc_count = 3,
+       .pd = {
+               .name = "vfe_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct clk_regmap *gcc_msm8909_clocks[] = {
+       [GPLL0_EARLY] = &gpll0_early.clkr,
+       [GPLL0] = &gpll0.clkr,
+       [GPLL1] = &gpll1.clkr,
+       [GPLL1_VOTE] = &gpll1_vote,
+       [GPLL2_EARLY] = &gpll2_early.clkr,
+       [GPLL2] = &gpll2.clkr,
+       [BIMC_PLL_EARLY] = &bimc_pll_early.clkr,
+       [BIMC_PLL] = &bimc_pll.clkr,
+       [APSS_AHB_CLK_SRC] = &apss_ahb_clk_src.clkr,
+       [BIMC_DDR_CLK_SRC] = &bimc_ddr_clk_src.clkr,
+       [BIMC_GPU_CLK_SRC] = &bimc_gpu_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_QUP5_I2C_APPS_CLK_SRC] = &blsp1_qup5_i2c_apps_clk_src.clkr,
+       [BLSP1_QUP5_SPI_APPS_CLK_SRC] = &blsp1_qup5_spi_apps_clk_src.clkr,
+       [BLSP1_QUP6_I2C_APPS_CLK_SRC] = &blsp1_qup6_i2c_apps_clk_src.clkr,
+       [BLSP1_QUP6_SPI_APPS_CLK_SRC] = &blsp1_qup6_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,
+       [BYTE0_CLK_SRC] = &byte0_clk_src.clkr,
+       [CAMSS_GP0_CLK_SRC] = &camss_gp0_clk_src.clkr,
+       [CAMSS_GP1_CLK_SRC] = &camss_gp1_clk_src.clkr,
+       [CAMSS_TOP_AHB_CLK_SRC] = &camss_top_ahb_clk_src.clkr,
+       [CRYPTO_CLK_SRC] = &crypto_clk_src.clkr,
+       [CSI0_CLK_SRC] = &csi0_clk_src.clkr,
+       [CSI0PHYTIMER_CLK_SRC] = &csi0phytimer_clk_src.clkr,
+       [CSI1_CLK_SRC] = &csi1_clk_src.clkr,
+       [ESC0_CLK_SRC] = &esc0_clk_src.clkr,
+       [GFX3D_CLK_SRC] = &gfx3d_clk_src.clkr,
+       [GP1_CLK_SRC] = &gp1_clk_src.clkr,
+       [GP2_CLK_SRC] = &gp2_clk_src.clkr,
+       [GP3_CLK_SRC] = &gp3_clk_src.clkr,
+       [MCLK0_CLK_SRC] = &mclk0_clk_src.clkr,
+       [MCLK1_CLK_SRC] = &mclk1_clk_src.clkr,
+       [MDP_CLK_SRC] = &mdp_clk_src.clkr,
+       [PCLK0_CLK_SRC] = &pclk0_clk_src.clkr,
+       [PCNOC_BFDCD_CLK_SRC] = &pcnoc_bfdcd_clk_src.clkr,
+       [PDM2_CLK_SRC] = &pdm2_clk_src.clkr,
+       [SDCC1_APPS_CLK_SRC] = &sdcc1_apps_clk_src.clkr,
+       [SDCC2_APPS_CLK_SRC] = &sdcc2_apps_clk_src.clkr,
+       [SYSTEM_NOC_BFDCD_CLK_SRC] = &system_noc_bfdcd_clk_src.clkr,
+       [USB_HS_SYSTEM_CLK_SRC] = &usb_hs_system_clk_src.clkr,
+       [VCODEC0_CLK_SRC] = &vcodec0_clk_src.clkr,
+       [VFE0_CLK_SRC] = &vfe0_clk_src.clkr,
+       [VSYNC_CLK_SRC] = &vsync_clk_src.clkr,
+       [GCC_APSS_TCU_CLK] = &gcc_apss_tcu_clk.clkr,
+       [GCC_BLSP1_AHB_CLK] = &gcc_blsp1_ahb_clk.clkr,
+       [GCC_BLSP1_SLEEP_CLK] = &gcc_blsp1_sleep_clk.clkr,
+       [GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr,
+       [GCC_CRYPTO_CLK] = &gcc_crypto_clk.clkr,
+       [GCC_CRYPTO_AHB_CLK] = &gcc_crypto_ahb_clk.clkr,
+       [GCC_CRYPTO_AXI_CLK] = &gcc_crypto_axi_clk.clkr,
+       [GCC_GFX_TBU_CLK] = &gcc_gfx_tbu_clk.clkr,
+       [GCC_GFX_TCU_CLK] = &gcc_gfx_tcu_clk.clkr,
+       [GCC_GTCU_AHB_CLK] = &gcc_gtcu_ahb_clk.clkr,
+       [GCC_MDP_TBU_CLK] = &gcc_mdp_tbu_clk.clkr,
+       [GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr,
+       [GCC_SMMU_CFG_CLK] = &gcc_smmu_cfg_clk.clkr,
+       [GCC_VENUS_TBU_CLK] = &gcc_venus_tbu_clk.clkr,
+       [GCC_VFE_TBU_CLK] = &gcc_vfe_tbu_clk.clkr,
+       [GCC_BIMC_GFX_CLK] = &gcc_bimc_gfx_clk.clkr,
+       [GCC_BIMC_GPU_CLK] = &gcc_bimc_gpu_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_QUP5_I2C_APPS_CLK] = &gcc_blsp1_qup5_i2c_apps_clk.clkr,
+       [GCC_BLSP1_QUP5_SPI_APPS_CLK] = &gcc_blsp1_qup5_spi_apps_clk.clkr,
+       [GCC_BLSP1_QUP6_I2C_APPS_CLK] = &gcc_blsp1_qup6_i2c_apps_clk.clkr,
+       [GCC_BLSP1_QUP6_SPI_APPS_CLK] = &gcc_blsp1_qup6_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_CAMSS_AHB_CLK] = &gcc_camss_ahb_clk.clkr,
+       [GCC_CAMSS_CSI0_CLK] = &gcc_camss_csi0_clk.clkr,
+       [GCC_CAMSS_CSI0_AHB_CLK] = &gcc_camss_csi0_ahb_clk.clkr,
+       [GCC_CAMSS_CSI0PHY_CLK] = &gcc_camss_csi0phy_clk.clkr,
+       [GCC_CAMSS_CSI0PHYTIMER_CLK] = &gcc_camss_csi0phytimer_clk.clkr,
+       [GCC_CAMSS_CSI0PIX_CLK] = &gcc_camss_csi0pix_clk.clkr,
+       [GCC_CAMSS_CSI0RDI_CLK] = &gcc_camss_csi0rdi_clk.clkr,
+       [GCC_CAMSS_CSI1_CLK] = &gcc_camss_csi1_clk.clkr,
+       [GCC_CAMSS_CSI1_AHB_CLK] = &gcc_camss_csi1_ahb_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_CSI_VFE0_CLK] = &gcc_camss_csi_vfe0_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_MCLK0_CLK] = &gcc_camss_mclk0_clk.clkr,
+       [GCC_CAMSS_MCLK1_CLK] = &gcc_camss_mclk1_clk.clkr,
+       [GCC_CAMSS_TOP_AHB_CLK] = &gcc_camss_top_ahb_clk.clkr,
+       [GCC_CAMSS_VFE0_CLK] = &gcc_camss_vfe0_clk.clkr,
+       [GCC_CAMSS_VFE_AHB_CLK] = &gcc_camss_vfe_ahb_clk.clkr,
+       [GCC_CAMSS_VFE_AXI_CLK] = &gcc_camss_vfe_axi_clk.clkr,
+       [GCC_GP1_CLK] = &gcc_gp1_clk.clkr,
+       [GCC_GP2_CLK] = &gcc_gp2_clk.clkr,
+       [GCC_GP3_CLK] = &gcc_gp3_clk.clkr,
+       [GCC_MDSS_AHB_CLK] = &gcc_mdss_ahb_clk.clkr,
+       [GCC_MDSS_AXI_CLK] = &gcc_mdss_axi_clk.clkr,
+       [GCC_MDSS_BYTE0_CLK] = &gcc_mdss_byte0_clk.clkr,
+       [GCC_MDSS_ESC0_CLK] = &gcc_mdss_esc0_clk.clkr,
+       [GCC_MDSS_MDP_CLK] = &gcc_mdss_mdp_clk.clkr,
+       [GCC_MDSS_PCLK0_CLK] = &gcc_mdss_pclk0_clk.clkr,
+       [GCC_MDSS_VSYNC_CLK] = &gcc_mdss_vsync_clk.clkr,
+       [GCC_MSS_CFG_AHB_CLK] = &gcc_mss_cfg_ahb_clk.clkr,
+       [GCC_MSS_Q6_BIMC_AXI_CLK] = &gcc_mss_q6_bimc_axi_clk.clkr,
+       [GCC_OXILI_AHB_CLK] = &gcc_oxili_ahb_clk.clkr,
+       [GCC_OXILI_GFX3D_CLK] = &gcc_oxili_gfx3d_clk.clkr,
+       [GCC_PDM2_CLK] = &gcc_pdm2_clk.clkr,
+       [GCC_PDM_AHB_CLK] = &gcc_pdm_ahb_clk.clkr,
+       [GCC_SDCC1_AHB_CLK] = &gcc_sdcc1_ahb_clk.clkr,
+       [GCC_SDCC1_APPS_CLK] = &gcc_sdcc1_apps_clk.clkr,
+       [GCC_SDCC2_AHB_CLK] = &gcc_sdcc2_ahb_clk.clkr,
+       [GCC_SDCC2_APPS_CLK] = &gcc_sdcc2_apps_clk.clkr,
+       [GCC_USB2A_PHY_SLEEP_CLK] = &gcc_usb2a_phy_sleep_clk.clkr,
+       [GCC_USB_HS_AHB_CLK] = &gcc_usb_hs_ahb_clk.clkr,
+       [GCC_USB_HS_PHY_CFG_AHB_CLK] = &gcc_usb_hs_phy_cfg_ahb_clk.clkr,
+       [GCC_USB_HS_SYSTEM_CLK] = &gcc_usb_hs_system_clk.clkr,
+       [GCC_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,
+};
+
+static struct gdsc *gcc_msm8909_gdscs[] = {
+       [MDSS_GDSC] = &mdss_gdsc,
+       [OXILI_GDSC] = &oxili_gdsc,
+       [VENUS_GDSC] = &venus_gdsc,
+       [VENUS_CORE0_GDSC] = &venus_core0_gdsc,
+       [VFE_GDSC] = &vfe_gdsc,
+};
+
+static const struct qcom_reset_map gcc_msm8909_resets[] = {
+       [GCC_AUDIO_CORE_BCR] = { 0x1c008 },
+       [GCC_BLSP1_BCR] = { 0x01000 },
+       [GCC_BLSP1_QUP1_BCR] = { 0x02000 },
+       [GCC_BLSP1_QUP2_BCR] = { 0x03008 },
+       [GCC_BLSP1_QUP3_BCR] = { 0x04018 },
+       [GCC_BLSP1_QUP4_BCR] = { 0x05018 },
+       [GCC_BLSP1_QUP5_BCR] = { 0x06018 },
+       [GCC_BLSP1_QUP6_BCR] = { 0x07018 },
+       [GCC_BLSP1_UART1_BCR] = { 0x02038 },
+       [GCC_BLSP1_UART2_BCR] = { 0x03028 },
+       [GCC_CAMSS_CSI0_BCR] = { 0x4e038 },
+       [GCC_CAMSS_CSI0PHY_BCR] = { 0x4e044 },
+       [GCC_CAMSS_CSI0PIX_BCR] = { 0x4e054 },
+       [GCC_CAMSS_CSI0RDI_BCR] = { 0x4e04c },
+       [GCC_CAMSS_CSI1_BCR] = { 0x4f038 },
+       [GCC_CAMSS_CSI1PHY_BCR] = { 0x4f044 },
+       [GCC_CAMSS_CSI1PIX_BCR] = { 0x4f054 },
+       [GCC_CAMSS_CSI1RDI_BCR] = { 0x4f04c },
+       [GCC_CAMSS_CSI_VFE0_BCR] = { 0x5804c },
+       [GCC_CAMSS_GP0_BCR] = { 0x54014 },
+       [GCC_CAMSS_GP1_BCR] = { 0x55014 },
+       [GCC_CAMSS_ISPIF_BCR] = { 0x50000 },
+       [GCC_CAMSS_MCLK0_BCR] = { 0x52014 },
+       [GCC_CAMSS_MCLK1_BCR] = { 0x53014 },
+       [GCC_CAMSS_PHY0_BCR] = { 0x4e018 },
+       [GCC_CAMSS_TOP_BCR] = { 0x56000 },
+       [GCC_CAMSS_TOP_AHB_BCR] = { 0x5a018 },
+       [GCC_CAMSS_VFE_BCR] = { 0x58030 },
+       [GCC_CRYPTO_BCR] = { 0x16000 },
+       [GCC_MDSS_BCR] = { 0x4d074 },
+       [GCC_OXILI_BCR] = { 0x59018 },
+       [GCC_PDM_BCR] = { 0x44000 },
+       [GCC_PRNG_BCR] = { 0x13000 },
+       [GCC_QUSB2_PHY_BCR] = { 0x4103c },
+       [GCC_SDCC1_BCR] = { 0x42000 },
+       [GCC_SDCC2_BCR] = { 0x43000 },
+       [GCC_ULT_AUDIO_BCR] = { 0x1c0b4 },
+       [GCC_USB2A_PHY_BCR] = { 0x41028 },
+       [GCC_USB2_HS_PHY_ONLY_BCR] = { .reg = 0x41034, .udelay = 15 },
+       [GCC_USB_HS_BCR] = { 0x41000 },
+       [GCC_VENUS0_BCR] = { 0x4c014 },
+       /* Subsystem Restart */
+       [GCC_MSS_RESTART] = { 0x3e000 },
+};
+
+static const struct regmap_config gcc_msm8909_regmap_config = {
+       .reg_bits       = 32,
+       .reg_stride     = 4,
+       .val_bits       = 32,
+       .max_register   = 0x80000,
+       .fast_io        = true,
+};
+
+static const struct qcom_cc_desc gcc_msm8909_desc = {
+       .config = &gcc_msm8909_regmap_config,
+       .clks = gcc_msm8909_clocks,
+       .num_clks = ARRAY_SIZE(gcc_msm8909_clocks),
+       .resets = gcc_msm8909_resets,
+       .num_resets = ARRAY_SIZE(gcc_msm8909_resets),
+       .gdscs = gcc_msm8909_gdscs,
+       .num_gdscs = ARRAY_SIZE(gcc_msm8909_gdscs),
+};
+
+static const struct of_device_id gcc_msm8909_match_table[] = {
+       { .compatible = "qcom,gcc-msm8909" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, gcc_msm8909_match_table);
+
+static int gcc_msm8909_probe(struct platform_device *pdev)
+{
+       return qcom_cc_probe(pdev, &gcc_msm8909_desc);
+}
+
+static struct platform_driver gcc_msm8909_driver = {
+       .probe          = gcc_msm8909_probe,
+       .driver         = {
+               .name   = "gcc-msm8909",
+               .of_match_table = gcc_msm8909_match_table,
+       },
+};
+
+static int __init gcc_msm8909_init(void)
+{
+       return platform_driver_register(&gcc_msm8909_driver);
+}
+core_initcall(gcc_msm8909_init);
+
+static void __exit gcc_msm8909_exit(void)
+{
+       platform_driver_unregister(&gcc_msm8909_driver);
+}
+module_exit(gcc_msm8909_exit);
+
+MODULE_DESCRIPTION("Qualcomm GCC MSM8909 Driver");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:gcc-msm8909");
index 9a46794..0c8fe19 100644 (file)
@@ -42,14 +42,138 @@ enum {
        P_EXT_MCLK,
 };
 
+static struct clk_pll gpll0 = {
+       .l_reg = 0x21004,
+       .m_reg = 0x21008,
+       .n_reg = 0x2100c,
+       .config_reg = 0x21010,
+       .mode_reg = 0x21000,
+       .status_reg = 0x2101c,
+       .status_bit = 17,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll0",
+               .parent_data = &(const struct clk_parent_data){
+                       .fw_name = "xo", .name = "xo_board",
+               },
+               .num_parents = 1,
+               .ops = &clk_pll_ops,
+       },
+};
+
+static struct clk_regmap gpll0_vote = {
+       .enable_reg = 0x45000,
+       .enable_mask = BIT(0),
+       .hw.init = &(struct clk_init_data){
+               .name = "gpll0_vote",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll0.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_pll_vote_ops,
+       },
+};
+
+static struct clk_pll gpll1 = {
+       .l_reg = 0x20004,
+       .m_reg = 0x20008,
+       .n_reg = 0x2000c,
+       .config_reg = 0x20010,
+       .mode_reg = 0x20000,
+       .status_reg = 0x2001c,
+       .status_bit = 17,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll1",
+               .parent_data = &(const struct clk_parent_data){
+                       .fw_name = "xo", .name = "xo_board",
+               },
+               .num_parents = 1,
+               .ops = &clk_pll_ops,
+       },
+};
+
+static struct clk_regmap gpll1_vote = {
+       .enable_reg = 0x45000,
+       .enable_mask = BIT(1),
+       .hw.init = &(struct clk_init_data){
+               .name = "gpll1_vote",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll1.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_pll_vote_ops,
+       },
+};
+
+static struct clk_pll gpll2 = {
+       .l_reg = 0x4a004,
+       .m_reg = 0x4a008,
+       .n_reg = 0x4a00c,
+       .config_reg = 0x4a010,
+       .mode_reg = 0x4a000,
+       .status_reg = 0x4a01c,
+       .status_bit = 17,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll2",
+               .parent_data = &(const struct clk_parent_data){
+                       .fw_name = "xo", .name = "xo_board",
+               },
+               .num_parents = 1,
+               .ops = &clk_pll_ops,
+       },
+};
+
+static struct clk_regmap gpll2_vote = {
+       .enable_reg = 0x45000,
+       .enable_mask = BIT(2),
+       .hw.init = &(struct clk_init_data){
+               .name = "gpll2_vote",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll2.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_pll_vote_ops,
+       },
+};
+
+static struct clk_pll bimc_pll = {
+       .l_reg = 0x23004,
+       .m_reg = 0x23008,
+       .n_reg = 0x2300c,
+       .config_reg = 0x23010,
+       .mode_reg = 0x23000,
+       .status_reg = 0x2301c,
+       .status_bit = 17,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "bimc_pll",
+               .parent_data = &(const struct clk_parent_data){
+                       .fw_name = "xo", .name = "xo_board",
+               },
+               .num_parents = 1,
+               .ops = &clk_pll_ops,
+       },
+};
+
+static struct clk_regmap bimc_pll_vote = {
+       .enable_reg = 0x45000,
+       .enable_mask = BIT(3),
+       .hw.init = &(struct clk_init_data){
+               .name = "bimc_pll_vote",
+               .parent_hws = (const struct clk_hw*[]){
+                       &bimc_pll.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_pll_vote_ops,
+       },
+};
+
 static const struct parent_map gcc_xo_gpll0_map[] = {
        { P_XO, 0 },
        { P_GPLL0, 1 },
 };
 
-static const char * const gcc_xo_gpll0[] = {
-       "xo",
-       "gpll0_vote",
+static const struct clk_parent_data gcc_xo_gpll0[] = {
+       { .fw_name = "xo", .name = "xo_board" },
+       { .hw = &gpll0_vote.hw },
 };
 
 static const struct parent_map gcc_xo_gpll0_bimc_map[] = {
@@ -58,10 +182,10 @@ static const struct parent_map gcc_xo_gpll0_bimc_map[] = {
        { P_BIMC, 2 },
 };
 
-static const char * const gcc_xo_gpll0_bimc[] = {
-       "xo",
-       "gpll0_vote",
-       "bimc_pll_vote",
+static const struct clk_parent_data gcc_xo_gpll0_bimc[] = {
+       { .fw_name = "xo", .name = "xo_board" },
+       { .hw = &gpll0_vote.hw },
+       { .hw = &bimc_pll_vote.hw },
 };
 
 static const struct parent_map gcc_xo_gpll0a_gpll1_gpll2a_map[] = {
@@ -71,11 +195,11 @@ static const struct parent_map gcc_xo_gpll0a_gpll1_gpll2a_map[] = {
        { P_GPLL2_AUX, 2 },
 };
 
-static const char * const gcc_xo_gpll0a_gpll1_gpll2a[] = {
-       "xo",
-       "gpll0_vote",
-       "gpll1_vote",
-       "gpll2_vote",
+static const struct clk_parent_data gcc_xo_gpll0a_gpll1_gpll2a[] = {
+       { .fw_name = "xo", .name = "xo_board" },
+       { .hw = &gpll0_vote.hw },
+       { .hw = &gpll1_vote.hw },
+       { .hw = &gpll2_vote.hw },
 };
 
 static const struct parent_map gcc_xo_gpll0_gpll2_map[] = {
@@ -84,10 +208,10 @@ static const struct parent_map gcc_xo_gpll0_gpll2_map[] = {
        { P_GPLL2, 2 },
 };
 
-static const char * const gcc_xo_gpll0_gpll2[] = {
-       "xo",
-       "gpll0_vote",
-       "gpll2_vote",
+static const struct clk_parent_data gcc_xo_gpll0_gpll2[] = {
+       { .fw_name = "xo", .name = "xo_board" },
+       { .hw = &gpll0_vote.hw },
+       { .hw = &gpll2_vote.hw },
 };
 
 static const struct parent_map gcc_xo_gpll0a_map[] = {
@@ -95,9 +219,9 @@ static const struct parent_map gcc_xo_gpll0a_map[] = {
        { P_GPLL0_AUX, 2 },
 };
 
-static const char * const gcc_xo_gpll0a[] = {
-       "xo",
-       "gpll0_vote",
+static const struct clk_parent_data gcc_xo_gpll0a[] = {
+       { .fw_name = "xo", .name = "xo_board" },
+       { .hw = &gpll0_vote.hw },
 };
 
 static const struct parent_map gcc_xo_gpll0_gpll1a_sleep_map[] = {
@@ -107,11 +231,11 @@ static const struct parent_map gcc_xo_gpll0_gpll1a_sleep_map[] = {
        { P_SLEEP_CLK, 6 },
 };
 
-static const char * const gcc_xo_gpll0_gpll1a_sleep[] = {
-       "xo",
-       "gpll0_vote",
-       "gpll1_vote",
-       "sleep_clk",
+static const struct clk_parent_data gcc_xo_gpll0_gpll1a_sleep[] = {
+       { .fw_name = "xo", .name = "xo_board" },
+       { .hw = &gpll0_vote.hw },
+       { .hw = &gpll1_vote.hw },
+       { .fw_name = "sleep_clk", .name = "sleep_clk" },
 };
 
 static const struct parent_map gcc_xo_gpll0_gpll1a_map[] = {
@@ -120,10 +244,10 @@ static const struct parent_map gcc_xo_gpll0_gpll1a_map[] = {
        { P_GPLL1_AUX, 2 },
 };
 
-static const char * const gcc_xo_gpll0_gpll1a[] = {
-       "xo",
-       "gpll0_vote",
-       "gpll1_vote",
+static const struct clk_parent_data gcc_xo_gpll0_gpll1a[] = {
+       { .fw_name = "xo", .name = "xo_board" },
+       { .hw = &gpll0_vote.hw },
+       { .hw = &gpll1_vote.hw },
 };
 
 static const struct parent_map gcc_xo_dsibyte_map[] = {
@@ -131,9 +255,9 @@ static const struct parent_map gcc_xo_dsibyte_map[] = {
        { P_DSI0_PHYPLL_BYTE, 2 },
 };
 
-static const char * const gcc_xo_dsibyte[] = {
-       "xo",
-       "dsi0pllbyte",
+static const struct clk_parent_data gcc_xo_dsibyte[] = {
+       { .fw_name = "xo", .name = "xo_board" },
+       { .fw_name = "dsi0pllbyte", .name = "dsi0pllbyte" },
 };
 
 static const struct parent_map gcc_xo_gpll0a_dsibyte_map[] = {
@@ -142,10 +266,10 @@ static const struct parent_map gcc_xo_gpll0a_dsibyte_map[] = {
        { P_DSI0_PHYPLL_BYTE, 1 },
 };
 
-static const char * const gcc_xo_gpll0a_dsibyte[] = {
-       "xo",
-       "gpll0_vote",
-       "dsi0pllbyte",
+static const struct clk_parent_data gcc_xo_gpll0a_dsibyte[] = {
+       { .fw_name = "xo", .name = "xo_board" },
+       { .hw = &gpll0_vote.hw },
+       { .fw_name = "dsi0pllbyte", .name = "dsi0pllbyte" },
 };
 
 static const struct parent_map gcc_xo_gpll0_dsiphy_map[] = {
@@ -154,10 +278,10 @@ static const struct parent_map gcc_xo_gpll0_dsiphy_map[] = {
        { P_DSI0_PHYPLL_DSI, 2 },
 };
 
-static const char * const gcc_xo_gpll0_dsiphy[] = {
-       "xo",
-       "gpll0_vote",
-       "dsi0pll",
+static const struct clk_parent_data gcc_xo_gpll0_dsiphy[] = {
+       { .fw_name = "xo", .name = "xo_board" },
+       { .hw = &gpll0_vote.hw },
+       { .fw_name = "dsi0pll", .name = "dsi0pll" },
 };
 
 static const struct parent_map gcc_xo_gpll0a_dsiphy_map[] = {
@@ -166,10 +290,10 @@ static const struct parent_map gcc_xo_gpll0a_dsiphy_map[] = {
        { P_DSI0_PHYPLL_DSI, 1 },
 };
 
-static const char * const gcc_xo_gpll0a_dsiphy[] = {
-       "xo",
-       "gpll0_vote",
-       "dsi0pll",
+static const struct clk_parent_data gcc_xo_gpll0a_dsiphy[] = {
+       { .fw_name = "xo", .name = "xo_board" },
+       { .hw = &gpll0_vote.hw },
+       { .fw_name = "dsi0pll", .name = "dsi0pll" },
 };
 
 static const struct parent_map gcc_xo_gpll0a_gpll1_gpll2_map[] = {
@@ -179,11 +303,11 @@ static const struct parent_map gcc_xo_gpll0a_gpll1_gpll2_map[] = {
        { P_GPLL2, 2 },
 };
 
-static const char * const gcc_xo_gpll0a_gpll1_gpll2[] = {
-       "xo",
-       "gpll0_vote",
-       "gpll1_vote",
-       "gpll2_vote",
+static const struct clk_parent_data gcc_xo_gpll0a_gpll1_gpll2[] = {
+       { .fw_name = "xo", .name = "xo_board" },
+       { .hw = &gpll0_vote.hw },
+       { .hw = &gpll1_vote.hw },
+       { .hw = &gpll2_vote.hw },
 };
 
 static const struct parent_map gcc_xo_gpll0_gpll1_sleep_map[] = {
@@ -193,11 +317,11 @@ static const struct parent_map gcc_xo_gpll0_gpll1_sleep_map[] = {
        { P_SLEEP_CLK, 6 }
 };
 
-static const char * const gcc_xo_gpll0_gpll1_sleep[] = {
-       "xo",
-       "gpll0_vote",
-       "gpll1_vote",
-       "sleep_clk",
+static const struct clk_parent_data gcc_xo_gpll0_gpll1_sleep[] = {
+       { .fw_name = "xo", .name = "xo_board" },
+       { .hw = &gpll0_vote.hw },
+       { .hw = &gpll1_vote.hw },
+       { .fw_name = "sleep_clk", .name = "sleep_clk" },
 };
 
 static const struct parent_map gcc_xo_gpll1_epi2s_emclk_sleep_map[] = {
@@ -208,12 +332,12 @@ static const struct parent_map gcc_xo_gpll1_epi2s_emclk_sleep_map[] = {
        { P_SLEEP_CLK, 6 }
 };
 
-static const char * const gcc_xo_gpll1_epi2s_emclk_sleep[] = {
-       "xo",
-       "gpll1_vote",
-       "ext_pri_i2s",
-       "ext_mclk",
-       "sleep_clk",
+static const struct clk_parent_data gcc_xo_gpll1_epi2s_emclk_sleep[] = {
+       { .fw_name = "xo", .name = "xo_board" },
+       { .hw = &gpll1_vote.hw },
+       { .fw_name = "ext_pri_i2s", .name = "ext_pri_i2s" },
+       { .fw_name = "ext_mclk", .name = "ext_mclk" },
+       { .fw_name = "sleep_clk", .name = "sleep_clk" },
 };
 
 static const struct parent_map gcc_xo_gpll1_esi2s_emclk_sleep_map[] = {
@@ -224,12 +348,12 @@ static const struct parent_map gcc_xo_gpll1_esi2s_emclk_sleep_map[] = {
        { P_SLEEP_CLK, 6 }
 };
 
-static const char * const gcc_xo_gpll1_esi2s_emclk_sleep[] = {
-       "xo",
-       "gpll1_vote",
-       "ext_sec_i2s",
-       "ext_mclk",
-       "sleep_clk",
+static const struct clk_parent_data gcc_xo_gpll1_esi2s_emclk_sleep[] = {
+       { .fw_name = "xo", .name = "xo_board" },
+       { .hw = &gpll1_vote.hw },
+       { .fw_name = "ext_sec_i2s", .name = "ext_sec_i2s" },
+       { .fw_name = "ext_mclk", .name = "ext_mclk" },
+       { .fw_name = "sleep_clk", .name = "sleep_clk" },
 };
 
 static const struct parent_map gcc_xo_sleep_map[] = {
@@ -237,9 +361,9 @@ static const struct parent_map gcc_xo_sleep_map[] = {
        { P_SLEEP_CLK, 6 }
 };
 
-static const char * const gcc_xo_sleep[] = {
-       "xo",
-       "sleep_clk",
+static const struct clk_parent_data gcc_xo_sleep[] = {
+       { .fw_name = "xo", .name = "xo_board" },
+       { .fw_name = "sleep_clk", .name = "sleep_clk" },
 };
 
 static const struct parent_map gcc_xo_gpll1_emclk_sleep_map[] = {
@@ -249,119 +373,11 @@ static const struct parent_map gcc_xo_gpll1_emclk_sleep_map[] = {
        { P_SLEEP_CLK, 6 }
 };
 
-static const char * const gcc_xo_gpll1_emclk_sleep[] = {
-       "xo",
-       "gpll1_vote",
-       "ext_mclk",
-       "sleep_clk",
-};
-
-static struct clk_pll gpll0 = {
-       .l_reg = 0x21004,
-       .m_reg = 0x21008,
-       .n_reg = 0x2100c,
-       .config_reg = 0x21010,
-       .mode_reg = 0x21000,
-       .status_reg = 0x2101c,
-       .status_bit = 17,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "gpll0",
-               .parent_names = (const char *[]){ "xo" },
-               .num_parents = 1,
-               .ops = &clk_pll_ops,
-       },
-};
-
-static struct clk_regmap gpll0_vote = {
-       .enable_reg = 0x45000,
-       .enable_mask = BIT(0),
-       .hw.init = &(struct clk_init_data){
-               .name = "gpll0_vote",
-               .parent_names = (const char *[]){ "gpll0" },
-               .num_parents = 1,
-               .ops = &clk_pll_vote_ops,
-       },
-};
-
-static struct clk_pll gpll1 = {
-       .l_reg = 0x20004,
-       .m_reg = 0x20008,
-       .n_reg = 0x2000c,
-       .config_reg = 0x20010,
-       .mode_reg = 0x20000,
-       .status_reg = 0x2001c,
-       .status_bit = 17,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "gpll1",
-               .parent_names = (const char *[]){ "xo" },
-               .num_parents = 1,
-               .ops = &clk_pll_ops,
-       },
-};
-
-static struct clk_regmap gpll1_vote = {
-       .enable_reg = 0x45000,
-       .enable_mask = BIT(1),
-       .hw.init = &(struct clk_init_data){
-               .name = "gpll1_vote",
-               .parent_names = (const char *[]){ "gpll1" },
-               .num_parents = 1,
-               .ops = &clk_pll_vote_ops,
-       },
-};
-
-static struct clk_pll gpll2 = {
-       .l_reg = 0x4a004,
-       .m_reg = 0x4a008,
-       .n_reg = 0x4a00c,
-       .config_reg = 0x4a010,
-       .mode_reg = 0x4a000,
-       .status_reg = 0x4a01c,
-       .status_bit = 17,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "gpll2",
-               .parent_names = (const char *[]){ "xo" },
-               .num_parents = 1,
-               .ops = &clk_pll_ops,
-       },
-};
-
-static struct clk_regmap gpll2_vote = {
-       .enable_reg = 0x45000,
-       .enable_mask = BIT(2),
-       .hw.init = &(struct clk_init_data){
-               .name = "gpll2_vote",
-               .parent_names = (const char *[]){ "gpll2" },
-               .num_parents = 1,
-               .ops = &clk_pll_vote_ops,
-       },
-};
-
-static struct clk_pll bimc_pll = {
-       .l_reg = 0x23004,
-       .m_reg = 0x23008,
-       .n_reg = 0x2300c,
-       .config_reg = 0x23010,
-       .mode_reg = 0x23000,
-       .status_reg = 0x2301c,
-       .status_bit = 17,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "bimc_pll",
-               .parent_names = (const char *[]){ "xo" },
-               .num_parents = 1,
-               .ops = &clk_pll_ops,
-       },
-};
-
-static struct clk_regmap bimc_pll_vote = {
-       .enable_reg = 0x45000,
-       .enable_mask = BIT(3),
-       .hw.init = &(struct clk_init_data){
-               .name = "bimc_pll_vote",
-               .parent_names = (const char *[]){ "bimc_pll" },
-               .num_parents = 1,
-               .ops = &clk_pll_vote_ops,
-       },
+static const struct clk_parent_data gcc_xo_gpll1_emclk_sleep[] = {
+       { .fw_name = "xo", .name = "xo_board" },
+       { .hw = &gpll1_vote.hw },
+       { .fw_name = "ext_mclk", .name = "ext_mclk" },
+       { .fw_name = "sleep_clk", .name = "sleep_clk" },
 };
 
 static struct clk_rcg2 pcnoc_bfdcd_clk_src = {
@@ -370,8 +386,8 @@ static struct clk_rcg2 pcnoc_bfdcd_clk_src = {
        .parent_map = gcc_xo_gpll0_bimc_map,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pcnoc_bfdcd_clk_src",
-               .parent_names = gcc_xo_gpll0_bimc,
-               .num_parents = 3,
+               .parent_data = gcc_xo_gpll0_bimc,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_bimc),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -382,8 +398,8 @@ static struct clk_rcg2 system_noc_bfdcd_clk_src = {
        .parent_map = gcc_xo_gpll0_bimc_map,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "system_noc_bfdcd_clk_src",
-               .parent_names = gcc_xo_gpll0_bimc,
-               .num_parents = 3,
+               .parent_data = gcc_xo_gpll0_bimc,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_bimc),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -402,8 +418,8 @@ static struct clk_rcg2 camss_ahb_clk_src = {
        .freq_tbl = ftbl_gcc_camss_ahb_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "camss_ahb_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -423,8 +439,8 @@ static struct clk_rcg2 apss_ahb_clk_src = {
        .freq_tbl = ftbl_apss_ahb_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "apss_ahb_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -442,8 +458,8 @@ static struct clk_rcg2 csi0_clk_src = {
        .freq_tbl = ftbl_gcc_camss_csi0_1_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "csi0_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -455,8 +471,8 @@ static struct clk_rcg2 csi1_clk_src = {
        .freq_tbl = ftbl_gcc_camss_csi0_1_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "csi1_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -483,8 +499,8 @@ static struct clk_rcg2 gfx3d_clk_src = {
        .freq_tbl = ftbl_gcc_oxili_gfx3d_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gfx3d_clk_src",
-               .parent_names = gcc_xo_gpll0a_gpll1_gpll2a,
-               .num_parents = 4,
+               .parent_data = gcc_xo_gpll0a_gpll1_gpll2a,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0a_gpll1_gpll2a),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -510,8 +526,8 @@ static struct clk_rcg2 vfe0_clk_src = {
        .freq_tbl = ftbl_gcc_camss_vfe0_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "vfe0_clk_src",
-               .parent_names = gcc_xo_gpll0_gpll2,
-               .num_parents = 3,
+               .parent_data = gcc_xo_gpll0_gpll2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll2),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -529,8 +545,8 @@ static struct clk_rcg2 blsp1_qup1_i2c_apps_clk_src = {
        .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup1_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -558,8 +574,8 @@ static struct clk_rcg2 blsp1_qup1_spi_apps_clk_src = {
        .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup1_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -571,8 +587,8 @@ static struct clk_rcg2 blsp1_qup2_i2c_apps_clk_src = {
        .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup2_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -585,8 +601,8 @@ static struct clk_rcg2 blsp1_qup2_spi_apps_clk_src = {
        .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup2_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -598,8 +614,8 @@ static struct clk_rcg2 blsp1_qup3_i2c_apps_clk_src = {
        .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup3_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -612,8 +628,8 @@ static struct clk_rcg2 blsp1_qup3_spi_apps_clk_src = {
        .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup3_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -625,8 +641,8 @@ static struct clk_rcg2 blsp1_qup4_i2c_apps_clk_src = {
        .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup4_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -639,8 +655,8 @@ static struct clk_rcg2 blsp1_qup4_spi_apps_clk_src = {
        .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup4_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -652,8 +668,8 @@ static struct clk_rcg2 blsp1_qup5_i2c_apps_clk_src = {
        .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup5_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -666,8 +682,8 @@ static struct clk_rcg2 blsp1_qup5_spi_apps_clk_src = {
        .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup5_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -679,8 +695,8 @@ static struct clk_rcg2 blsp1_qup6_i2c_apps_clk_src = {
        .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup6_i2c_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -693,8 +709,8 @@ static struct clk_rcg2 blsp1_qup6_spi_apps_clk_src = {
        .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup6_spi_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -726,8 +742,8 @@ static struct clk_rcg2 blsp1_uart1_apps_clk_src = {
        .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_uart1_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -740,8 +756,8 @@ static struct clk_rcg2 blsp1_uart2_apps_clk_src = {
        .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_uart2_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -759,8 +775,8 @@ static struct clk_rcg2 cci_clk_src = {
        .freq_tbl = ftbl_gcc_camss_cci_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "cci_clk_src",
-               .parent_names = gcc_xo_gpll0a,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0a,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0a),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -792,8 +808,8 @@ static struct clk_rcg2 camss_gp0_clk_src = {
        .freq_tbl = ftbl_gcc_camss_gp0_1_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "camss_gp0_clk_src",
-               .parent_names = gcc_xo_gpll0_gpll1a_sleep,
-               .num_parents = 4,
+               .parent_data = gcc_xo_gpll0_gpll1a_sleep,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll1a_sleep),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -806,8 +822,8 @@ static struct clk_rcg2 camss_gp1_clk_src = {
        .freq_tbl = ftbl_gcc_camss_gp0_1_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "camss_gp1_clk_src",
-               .parent_names = gcc_xo_gpll0_gpll1a_sleep,
-               .num_parents = 4,
+               .parent_data = gcc_xo_gpll0_gpll1a_sleep,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll1a_sleep),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -826,8 +842,8 @@ static struct clk_rcg2 jpeg0_clk_src = {
        .freq_tbl = ftbl_gcc_camss_jpeg0_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "jpeg0_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -847,8 +863,8 @@ static struct clk_rcg2 mclk0_clk_src = {
        .freq_tbl = ftbl_gcc_camss_mclk0_1_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "mclk0_clk_src",
-               .parent_names = gcc_xo_gpll0_gpll1a_sleep,
-               .num_parents = 4,
+               .parent_data = gcc_xo_gpll0_gpll1a_sleep,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll1a_sleep),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -861,8 +877,8 @@ static struct clk_rcg2 mclk1_clk_src = {
        .freq_tbl = ftbl_gcc_camss_mclk0_1_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "mclk1_clk_src",
-               .parent_names = gcc_xo_gpll0_gpll1a_sleep,
-               .num_parents = 4,
+               .parent_data = gcc_xo_gpll0_gpll1a_sleep,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll1a_sleep),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -880,8 +896,8 @@ static struct clk_rcg2 csi0phytimer_clk_src = {
        .freq_tbl = ftbl_gcc_camss_csi0_1phytimer_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "csi0phytimer_clk_src",
-               .parent_names = gcc_xo_gpll0_gpll1a,
-               .num_parents = 3,
+               .parent_data = gcc_xo_gpll0_gpll1a,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll1a),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -893,8 +909,8 @@ static struct clk_rcg2 csi1phytimer_clk_src = {
        .freq_tbl = ftbl_gcc_camss_csi0_1phytimer_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "csi1phytimer_clk_src",
-               .parent_names = gcc_xo_gpll0_gpll1a,
-               .num_parents = 3,
+               .parent_data = gcc_xo_gpll0_gpll1a,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll1a),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -913,8 +929,8 @@ static struct clk_rcg2 cpp_clk_src = {
        .freq_tbl = ftbl_gcc_camss_cpp_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "cpp_clk_src",
-               .parent_names = gcc_xo_gpll0_gpll2,
-               .num_parents = 3,
+               .parent_data = gcc_xo_gpll0_gpll2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll2),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -934,8 +950,8 @@ static struct clk_rcg2 crypto_clk_src = {
        .freq_tbl = ftbl_gcc_crypto_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "crypto_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -975,8 +991,8 @@ static struct clk_rcg2 gp1_clk_src = {
        .freq_tbl = ftbl_gcc_gp1_3_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gp1_clk_src",
-               .parent_names = gcc_xo_gpll0_gpll1a_sleep,
-               .num_parents = 3,
+               .parent_data = gcc_xo_gpll0_gpll1a_sleep,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll1a_sleep),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -989,8 +1005,8 @@ static struct clk_rcg2 gp2_clk_src = {
        .freq_tbl = ftbl_gcc_gp1_3_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gp2_clk_src",
-               .parent_names = gcc_xo_gpll0_gpll1a_sleep,
-               .num_parents = 3,
+               .parent_data = gcc_xo_gpll0_gpll1a_sleep,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll1a_sleep),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1003,8 +1019,8 @@ static struct clk_rcg2 gp3_clk_src = {
        .freq_tbl = ftbl_gcc_gp1_3_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gp3_clk_src",
-               .parent_names = gcc_xo_gpll0_gpll1a_sleep,
-               .num_parents = 3,
+               .parent_data = gcc_xo_gpll0_gpll1a_sleep,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll1a_sleep),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1015,8 +1031,8 @@ static struct clk_rcg2 byte0_clk_src = {
        .parent_map = gcc_xo_gpll0a_dsibyte_map,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "byte0_clk_src",
-               .parent_names = gcc_xo_gpll0a_dsibyte,
-               .num_parents = 3,
+               .parent_data = gcc_xo_gpll0a_dsibyte,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0a_dsibyte),
                .ops = &clk_byte2_ops,
                .flags = CLK_SET_RATE_PARENT,
        },
@@ -1034,8 +1050,8 @@ static struct clk_rcg2 esc0_clk_src = {
        .freq_tbl = ftbl_gcc_mdss_esc0_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "esc0_clk_src",
-               .parent_names = gcc_xo_dsibyte,
-               .num_parents = 2,
+               .parent_data = gcc_xo_dsibyte,
+               .num_parents = ARRAY_SIZE(gcc_xo_dsibyte),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1059,8 +1075,8 @@ static struct clk_rcg2 mdp_clk_src = {
        .freq_tbl = ftbl_gcc_mdss_mdp_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "mdp_clk_src",
-               .parent_names = gcc_xo_gpll0_dsiphy,
-               .num_parents = 3,
+               .parent_data = gcc_xo_gpll0_dsiphy,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_dsiphy),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1072,8 +1088,8 @@ static struct clk_rcg2 pclk0_clk_src = {
        .parent_map = gcc_xo_gpll0a_dsiphy_map,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pclk0_clk_src",
-               .parent_names = gcc_xo_gpll0a_dsiphy,
-               .num_parents = 3,
+               .parent_data = gcc_xo_gpll0a_dsiphy,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0a_dsiphy),
                .ops = &clk_pixel_ops,
                .flags = CLK_SET_RATE_PARENT,
        },
@@ -1091,8 +1107,8 @@ static struct clk_rcg2 vsync_clk_src = {
        .freq_tbl = ftbl_gcc_mdss_vsync_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "vsync_clk_src",
-               .parent_names = gcc_xo_gpll0a,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0a,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0a),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1109,8 +1125,8 @@ static struct clk_rcg2 pdm2_clk_src = {
        .freq_tbl = ftbl_gcc_pdm2_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pdm2_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1134,8 +1150,8 @@ static struct clk_rcg2 sdcc1_apps_clk_src = {
        .freq_tbl = ftbl_gcc_sdcc1_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "sdcc1_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_floor_ops,
        },
 };
@@ -1159,8 +1175,8 @@ static struct clk_rcg2 sdcc2_apps_clk_src = {
        .freq_tbl = ftbl_gcc_sdcc2_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "sdcc2_apps_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_floor_ops,
        },
 };
@@ -1179,8 +1195,8 @@ static struct clk_rcg2 apss_tcu_clk_src = {
        .freq_tbl = ftbl_gcc_apss_tcu_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "apss_tcu_clk_src",
-               .parent_names = gcc_xo_gpll0a_gpll1_gpll2,
-               .num_parents = 4,
+               .parent_data = gcc_xo_gpll0a_gpll1_gpll2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0a_gpll1_gpll2),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1202,8 +1218,8 @@ static struct clk_rcg2 bimc_gpu_clk_src = {
        .freq_tbl = ftbl_gcc_bimc_gpu_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "bimc_gpu_clk_src",
-               .parent_names = gcc_xo_gpll0_bimc,
-               .num_parents = 3,
+               .parent_data = gcc_xo_gpll0_bimc,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_bimc),
                .flags = CLK_GET_RATE_NOCACHE,
                .ops = &clk_rcg2_ops,
        },
@@ -1221,8 +1237,8 @@ static struct clk_rcg2 usb_hs_system_clk_src = {
        .freq_tbl = ftbl_gcc_usb_hs_system_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "usb_hs_system_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1247,8 +1263,8 @@ static struct clk_rcg2 ultaudio_ahbfabric_clk_src = {
        .freq_tbl = ftbl_gcc_ultaudio_ahb_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "ultaudio_ahbfabric_clk_src",
-               .parent_names = gcc_xo_gpll0_gpll1_sleep,
-               .num_parents = 4,
+               .parent_data = gcc_xo_gpll0_gpll1_sleep,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll1_sleep),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1260,8 +1276,8 @@ static struct clk_branch gcc_ultaudio_ahbfabric_ixfabric_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ultaudio_ahbfabric_ixfabric_clk",
-                       .parent_names = (const char *[]){
-                               "ultaudio_ahbfabric_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &ultaudio_ahbfabric_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1277,8 +1293,8 @@ static struct clk_branch gcc_ultaudio_ahbfabric_ixfabric_lpm_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ultaudio_ahbfabric_ixfabric_lpm_clk",
-                       .parent_names = (const char *[]){
-                               "ultaudio_ahbfabric_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &ultaudio_ahbfabric_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1326,8 +1342,8 @@ static struct clk_rcg2 ultaudio_lpaif_pri_i2s_clk_src = {
        .freq_tbl = ftbl_gcc_ultaudio_lpaif_i2s_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "ultaudio_lpaif_pri_i2s_clk_src",
-               .parent_names = gcc_xo_gpll1_epi2s_emclk_sleep,
-               .num_parents = 5,
+               .parent_data = gcc_xo_gpll1_epi2s_emclk_sleep,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll1_epi2s_emclk_sleep),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1339,8 +1355,8 @@ static struct clk_branch gcc_ultaudio_lpaif_pri_i2s_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ultaudio_lpaif_pri_i2s_clk",
-                       .parent_names = (const char *[]){
-                               "ultaudio_lpaif_pri_i2s_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &ultaudio_lpaif_pri_i2s_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1357,8 +1373,8 @@ static struct clk_rcg2 ultaudio_lpaif_sec_i2s_clk_src = {
        .freq_tbl = ftbl_gcc_ultaudio_lpaif_i2s_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "ultaudio_lpaif_sec_i2s_clk_src",
-               .parent_names = gcc_xo_gpll1_esi2s_emclk_sleep,
-               .num_parents = 5,
+               .parent_data = gcc_xo_gpll1_esi2s_emclk_sleep,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll1_esi2s_emclk_sleep),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1370,8 +1386,8 @@ static struct clk_branch gcc_ultaudio_lpaif_sec_i2s_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ultaudio_lpaif_sec_i2s_clk",
-                       .parent_names = (const char *[]){
-                               "ultaudio_lpaif_sec_i2s_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &ultaudio_lpaif_sec_i2s_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1388,8 +1404,8 @@ static struct clk_rcg2 ultaudio_lpaif_aux_i2s_clk_src = {
        .freq_tbl = ftbl_gcc_ultaudio_lpaif_i2s_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "ultaudio_lpaif_aux_i2s_clk_src",
-               .parent_names = gcc_xo_gpll1_esi2s_emclk_sleep,
-               .num_parents = 5,
+               .parent_data = gcc_xo_gpll1_esi2s_emclk_sleep,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll1_esi2s_emclk_sleep),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1401,8 +1417,8 @@ static struct clk_branch gcc_ultaudio_lpaif_aux_i2s_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ultaudio_lpaif_aux_i2s_clk",
-                       .parent_names = (const char *[]){
-                               "ultaudio_lpaif_aux_i2s_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &ultaudio_lpaif_aux_i2s_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1423,8 +1439,8 @@ static struct clk_rcg2 ultaudio_xo_clk_src = {
        .freq_tbl = ftbl_gcc_ultaudio_xo_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "ultaudio_xo_clk_src",
-               .parent_names = gcc_xo_sleep,
-               .num_parents = 2,
+               .parent_data = gcc_xo_sleep,
+               .num_parents = ARRAY_SIZE(gcc_xo_sleep),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1436,8 +1452,8 @@ static struct clk_branch gcc_ultaudio_avsync_xo_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ultaudio_avsync_xo_clk",
-                       .parent_names = (const char *[]){
-                               "ultaudio_xo_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &ultaudio_xo_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1453,8 +1469,8 @@ static struct clk_branch gcc_ultaudio_stc_xo_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ultaudio_stc_xo_clk",
-                       .parent_names = (const char *[]){
-                               "ultaudio_xo_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &ultaudio_xo_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1479,8 +1495,8 @@ static struct clk_rcg2 codec_digcodec_clk_src = {
        .freq_tbl = ftbl_codec_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "codec_digcodec_clk_src",
-               .parent_names = gcc_xo_gpll1_emclk_sleep,
-               .num_parents = 4,
+               .parent_data = gcc_xo_gpll1_emclk_sleep,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll1_emclk_sleep),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1492,8 +1508,8 @@ static struct clk_branch gcc_codec_digcodec_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ultaudio_codec_digcodec_clk",
-                       .parent_names = (const char *[]){
-                               "codec_digcodec_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &codec_digcodec_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1509,8 +1525,8 @@ static struct clk_branch gcc_ultaudio_pcnoc_mport_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ultaudio_pcnoc_mport_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -1525,8 +1541,8 @@ static struct clk_branch gcc_ultaudio_pcnoc_sway_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ultaudio_pcnoc_sway_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -1549,8 +1565,8 @@ static struct clk_rcg2 vcodec0_clk_src = {
        .freq_tbl = ftbl_gcc_venus0_vcodec0_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "vcodec0_clk_src",
-               .parent_names = gcc_xo_gpll0,
-               .num_parents = 2,
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1563,8 +1579,8 @@ static struct clk_branch gcc_blsp1_ahb_clk = {
                .enable_mask = BIT(10),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -1579,8 +1595,8 @@ static struct clk_branch gcc_blsp1_sleep_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_sleep_clk",
-                       .parent_names = (const char *[]){
-                               "sleep_clk_src",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "sleep_clk", .name = "sleep_clk_src",
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1596,8 +1612,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,
@@ -1613,8 +1629,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,
@@ -1630,8 +1646,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,
@@ -1647,8 +1663,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,
@@ -1664,8 +1680,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,
@@ -1681,8 +1697,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,
@@ -1698,8 +1714,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,
@@ -1715,8 +1731,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,
@@ -1732,8 +1748,8 @@ static struct clk_branch gcc_blsp1_qup5_i2c_apps_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup5_i2c_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_qup5_i2c_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup5_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1749,8 +1765,8 @@ static struct clk_branch gcc_blsp1_qup5_spi_apps_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup5_spi_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_qup5_spi_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup5_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1766,8 +1782,8 @@ static struct clk_branch gcc_blsp1_qup6_i2c_apps_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup6_i2c_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_qup6_i2c_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup6_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1783,8 +1799,8 @@ static struct clk_branch gcc_blsp1_qup6_spi_apps_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup6_spi_apps_clk",
-                       .parent_names = (const char *[]){
-                               "blsp1_qup6_spi_apps_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup6_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1800,8 +1816,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,
@@ -1817,8 +1833,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,
@@ -1835,8 +1851,8 @@ static struct clk_branch gcc_boot_rom_ahb_clk = {
                .enable_mask = BIT(7),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_boot_rom_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -1851,8 +1867,8 @@ static struct clk_branch gcc_camss_cci_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_cci_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "camss_ahb_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_ahb_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1868,8 +1884,8 @@ static struct clk_branch gcc_camss_cci_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_cci_clk",
-                       .parent_names = (const char *[]){
-                               "cci_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &cci_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1885,8 +1901,8 @@ static struct clk_branch gcc_camss_csi0_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi0_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "camss_ahb_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_ahb_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1902,8 +1918,8 @@ static struct clk_branch gcc_camss_csi0_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi0_clk",
-                       .parent_names = (const char *[]){
-                               "csi0_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1919,8 +1935,8 @@ static struct clk_branch gcc_camss_csi0phy_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi0phy_clk",
-                       .parent_names = (const char *[]){
-                               "csi0_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1936,8 +1952,8 @@ static struct clk_branch gcc_camss_csi0pix_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi0pix_clk",
-                       .parent_names = (const char *[]){
-                               "csi0_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1953,8 +1969,8 @@ static struct clk_branch gcc_camss_csi0rdi_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi0rdi_clk",
-                       .parent_names = (const char *[]){
-                               "csi0_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1970,8 +1986,8 @@ static struct clk_branch gcc_camss_csi1_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi1_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "camss_ahb_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_ahb_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1987,8 +2003,8 @@ static struct clk_branch gcc_camss_csi1_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi1_clk",
-                       .parent_names = (const char *[]){
-                               "csi1_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi1_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2004,8 +2020,8 @@ static struct clk_branch gcc_camss_csi1phy_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi1phy_clk",
-                       .parent_names = (const char *[]){
-                               "csi1_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi1_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2021,8 +2037,8 @@ static struct clk_branch gcc_camss_csi1pix_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi1pix_clk",
-                       .parent_names = (const char *[]){
-                               "csi1_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi1_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2038,8 +2054,8 @@ static struct clk_branch gcc_camss_csi1rdi_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi1rdi_clk",
-                       .parent_names = (const char *[]){
-                               "csi1_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi1_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2055,8 +2071,8 @@ static struct clk_branch gcc_camss_csi_vfe0_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi_vfe0_clk",
-                       .parent_names = (const char *[]){
-                               "vfe0_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vfe0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2072,8 +2088,8 @@ static struct clk_branch gcc_camss_gp0_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_gp0_clk",
-                       .parent_names = (const char *[]){
-                               "camss_gp0_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_gp0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2089,8 +2105,8 @@ static struct clk_branch gcc_camss_gp1_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_gp1_clk",
-                       .parent_names = (const char *[]){
-                               "camss_gp1_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_gp1_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2106,8 +2122,8 @@ static struct clk_branch gcc_camss_ispif_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_ispif_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "camss_ahb_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_ahb_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2123,8 +2139,8 @@ static struct clk_branch gcc_camss_jpeg0_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_jpeg0_clk",
-                       .parent_names = (const char *[]){
-                               "jpeg0_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &jpeg0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2140,8 +2156,8 @@ static struct clk_branch gcc_camss_jpeg_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_jpeg_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "camss_ahb_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_ahb_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2157,8 +2173,8 @@ static struct clk_branch gcc_camss_jpeg_axi_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_jpeg_axi_clk",
-                       .parent_names = (const char *[]){
-                               "system_noc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &system_noc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2174,8 +2190,8 @@ static struct clk_branch gcc_camss_mclk0_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_mclk0_clk",
-                       .parent_names = (const char *[]){
-                               "mclk0_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &mclk0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2191,8 +2207,8 @@ static struct clk_branch gcc_camss_mclk1_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_mclk1_clk",
-                       .parent_names = (const char *[]){
-                               "mclk1_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &mclk1_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2208,8 +2224,8 @@ static struct clk_branch gcc_camss_micro_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_micro_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "camss_ahb_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_ahb_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2225,8 +2241,8 @@ static struct clk_branch gcc_camss_csi0phytimer_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi0phytimer_clk",
-                       .parent_names = (const char *[]){
-                               "csi0phytimer_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi0phytimer_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2242,8 +2258,8 @@ static struct clk_branch gcc_camss_csi1phytimer_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi1phytimer_clk",
-                       .parent_names = (const char *[]){
-                               "csi1phytimer_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi1phytimer_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2259,8 +2275,8 @@ static struct clk_branch gcc_camss_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "camss_ahb_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_ahb_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2276,8 +2292,8 @@ static struct clk_branch gcc_camss_top_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_top_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2293,8 +2309,8 @@ static struct clk_branch gcc_camss_cpp_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_cpp_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "camss_ahb_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_ahb_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2310,8 +2326,8 @@ static struct clk_branch gcc_camss_cpp_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_cpp_clk",
-                       .parent_names = (const char *[]){
-                               "cpp_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &cpp_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2327,8 +2343,8 @@ static struct clk_branch gcc_camss_vfe0_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_vfe0_clk",
-                       .parent_names = (const char *[]){
-                               "vfe0_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vfe0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2344,8 +2360,8 @@ static struct clk_branch gcc_camss_vfe_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_vfe_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "camss_ahb_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_ahb_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2361,8 +2377,8 @@ static struct clk_branch gcc_camss_vfe_axi_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_vfe_axi_clk",
-                       .parent_names = (const char *[]){
-                               "system_noc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &system_noc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2379,8 +2395,8 @@ static struct clk_branch gcc_crypto_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_crypto_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2397,8 +2413,8 @@ static struct clk_branch gcc_crypto_axi_clk = {
                .enable_mask = BIT(1),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_crypto_axi_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2415,8 +2431,8 @@ static struct clk_branch gcc_crypto_clk = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_crypto_clk",
-                       .parent_names = (const char *[]){
-                               "crypto_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &crypto_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2432,8 +2448,8 @@ static struct clk_branch gcc_oxili_gmem_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_oxili_gmem_clk",
-                       .parent_names = (const char *[]){
-                               "gfx3d_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gfx3d_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2449,8 +2465,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,
@@ -2466,8 +2482,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,
@@ -2483,8 +2499,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,
@@ -2500,8 +2516,8 @@ static struct clk_branch gcc_mdss_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mdss_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2517,8 +2533,8 @@ static struct clk_branch gcc_mdss_axi_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mdss_axi_clk",
-                       .parent_names = (const char *[]){
-                               "system_noc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &system_noc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2534,8 +2550,8 @@ static struct clk_branch gcc_mdss_byte0_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mdss_byte0_clk",
-                       .parent_names = (const char *[]){
-                               "byte0_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &byte0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2551,8 +2567,8 @@ static struct clk_branch gcc_mdss_esc0_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mdss_esc0_clk",
-                       .parent_names = (const char *[]){
-                               "esc0_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &esc0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2568,8 +2584,8 @@ static struct clk_branch gcc_mdss_mdp_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mdss_mdp_clk",
-                       .parent_names = (const char *[]){
-                               "mdp_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &mdp_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2585,8 +2601,8 @@ static struct clk_branch gcc_mdss_pclk0_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mdss_pclk0_clk",
-                       .parent_names = (const char *[]){
-                               "pclk0_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pclk0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2602,8 +2618,8 @@ static struct clk_branch gcc_mdss_vsync_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mdss_vsync_clk",
-                       .parent_names = (const char *[]){
-                               "vsync_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vsync_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2619,25 +2635,8 @@ static struct clk_branch gcc_mss_cfg_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mss_cfg_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_bfdcd_clk_src",
-                       },
-                       .num_parents = 1,
-                       .flags = CLK_SET_RATE_PARENT,
-                       .ops = &clk_branch2_ops,
-               },
-       },
-};
-
-static struct clk_branch gcc_mss_q6_bimc_axi_clk = {
-       .halt_reg = 0x49004,
-       .clkr = {
-               .enable_reg = 0x49004,
-               .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data){
-                       .name = "gcc_mss_q6_bimc_axi_clk",
-                       .parent_names = (const char *[]){
-                               "bimc_ddr_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2653,8 +2652,8 @@ static struct clk_branch gcc_oxili_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_oxili_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2670,8 +2669,8 @@ static struct clk_branch gcc_oxili_gfx3d_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_oxili_gfx3d_clk",
-                       .parent_names = (const char *[]){
-                               "gfx3d_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gfx3d_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2687,8 +2686,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,
@@ -2704,8 +2703,8 @@ static struct clk_branch gcc_pdm_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_pdm_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2722,8 +2721,8 @@ static struct clk_branch gcc_prng_ahb_clk = {
                .enable_mask = BIT(8),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_prng_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -2738,8 +2737,8 @@ static struct clk_branch gcc_sdcc1_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc1_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2755,8 +2754,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,
@@ -2772,8 +2771,8 @@ static struct clk_branch gcc_sdcc2_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc2_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2789,8 +2788,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,
@@ -2805,13 +2804,30 @@ static struct clk_rcg2 bimc_ddr_clk_src = {
        .parent_map = gcc_xo_gpll0_bimc_map,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "bimc_ddr_clk_src",
-               .parent_names = gcc_xo_gpll0_bimc,
-               .num_parents = 3,
+               .parent_data = gcc_xo_gpll0_bimc,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_bimc),
                .ops = &clk_rcg2_ops,
                .flags = CLK_GET_RATE_NOCACHE,
        },
 };
 
+static struct clk_branch gcc_mss_q6_bimc_axi_clk = {
+       .halt_reg = 0x49004,
+       .clkr = {
+               .enable_reg = 0x49004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_mss_q6_bimc_axi_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &bimc_ddr_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
 static struct clk_branch gcc_apss_tcu_clk = {
        .halt_reg = 0x12018,
        .clkr = {
@@ -2819,8 +2835,8 @@ static struct clk_branch gcc_apss_tcu_clk = {
                .enable_mask = BIT(1),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_apss_tcu_clk",
-                       .parent_names = (const char *[]){
-                               "bimc_ddr_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &bimc_ddr_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -2835,8 +2851,8 @@ static struct clk_branch gcc_gfx_tcu_clk = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_gfx_tcu_clk",
-                       .parent_names = (const char *[]){
-                               "bimc_ddr_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &bimc_ddr_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -2851,8 +2867,8 @@ static struct clk_branch gcc_gtcu_ahb_clk = {
                .enable_mask = BIT(13),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_gtcu_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2868,8 +2884,8 @@ static struct clk_branch gcc_bimc_gfx_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_bimc_gfx_clk",
-                       .parent_names = (const char *[]){
-                               "bimc_gpu_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &bimc_gpu_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2885,8 +2901,8 @@ static struct clk_branch gcc_bimc_gpu_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_bimc_gpu_clk",
-                       .parent_names = (const char *[]){
-                               "bimc_gpu_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &bimc_gpu_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2902,8 +2918,8 @@ static struct clk_branch gcc_jpeg_tbu_clk = {
                .enable_mask = BIT(10),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_jpeg_tbu_clk",
-                       .parent_names = (const char *[]){
-                               "system_noc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &system_noc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2919,8 +2935,8 @@ static struct clk_branch gcc_mdp_tbu_clk = {
                .enable_mask = BIT(4),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mdp_tbu_clk",
-                       .parent_names = (const char *[]){
-                               "system_noc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &system_noc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2936,8 +2952,8 @@ static struct clk_branch gcc_smmu_cfg_clk = {
                .enable_mask = BIT(12),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_smmu_cfg_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2953,8 +2969,8 @@ static struct clk_branch gcc_venus_tbu_clk = {
                .enable_mask = BIT(5),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_venus_tbu_clk",
-                       .parent_names = (const char *[]){
-                               "system_noc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &system_noc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2970,8 +2986,8 @@ static struct clk_branch gcc_vfe_tbu_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_vfe_tbu_clk",
-                       .parent_names = (const char *[]){
-                               "system_noc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &system_noc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2987,8 +3003,8 @@ static struct clk_branch gcc_usb2a_phy_sleep_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb2a_phy_sleep_clk",
-                       .parent_names = (const char *[]){
-                               "sleep_clk_src",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "sleep_clk", .name = "sleep_clk_src",
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3004,8 +3020,8 @@ static struct clk_branch gcc_usb_hs_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb_hs_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3021,8 +3037,8 @@ static struct clk_branch gcc_usb_hs_system_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb_hs_system_clk",
-                       .parent_names = (const char *[]){
-                               "usb_hs_system_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb_hs_system_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3038,8 +3054,8 @@ static struct clk_branch gcc_venus0_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_venus0_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3055,8 +3071,8 @@ static struct clk_branch gcc_venus0_axi_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_venus0_axi_clk",
-                       .parent_names = (const char *[]){
-                               "system_noc_bfdcd_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &system_noc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3072,8 +3088,8 @@ static struct clk_branch gcc_venus0_vcodec0_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_venus0_vcodec0_clk",
-                       .parent_names = (const char *[]){
-                               "vcodec0_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vcodec0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
index 8e2d9fb..af608f1 100644 (file)
@@ -614,7 +614,7 @@ static struct clk_rcg2 pcnoc_bfdcd_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pcnoc_bfdcd_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -626,7 +626,7 @@ static struct clk_rcg2 system_noc_bfdcd_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "system_noc_bfdcd_clk_src",
                .parent_data = gcc_xo_gpll0_gpll6a_parent_data,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll6a_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -638,7 +638,7 @@ static struct clk_rcg2 bimc_ddr_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "bimc_ddr_clk_src",
                .parent_data = gcc_xo_gpll0_bimc_parent_data,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_bimc_parent_data),
                .ops = &clk_rcg2_ops,
                .flags = CLK_GET_RATE_NOCACHE,
        },
@@ -651,7 +651,7 @@ static struct clk_rcg2 system_mm_noc_bfdcd_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "system_mm_noc_bfdcd_clk_src",
                .parent_data = gcc_xo_gpll0_gpll6a_parent_data,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll6a_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -671,7 +671,7 @@ static struct clk_rcg2 camss_ahb_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "camss_ahb_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -692,7 +692,7 @@ static struct clk_rcg2 apss_ahb_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "apss_ahb_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -711,7 +711,7 @@ static struct clk_rcg2 csi0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "csi0_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -724,7 +724,7 @@ static struct clk_rcg2 csi1_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "csi1_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -753,7 +753,7 @@ static struct clk_rcg2 gfx3d_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gfx3d_clk_src",
                .parent_data = gcc_xo_gpll0_gpll2a_gpll3_gpll6a_parent_data,
-               .num_parents = 5,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll2a_gpll3_gpll6a_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -782,7 +782,7 @@ static struct clk_rcg2 vfe0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "vfe0_clk_src",
                .parent_data = gcc_xo_gpll0_gpll2_gpll4_parent_data,
-               .num_parents = 4,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll2_gpll4_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -801,7 +801,7 @@ static struct clk_rcg2 blsp1_qup1_i2c_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup1_i2c_apps_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -826,7 +826,7 @@ static struct clk_rcg2 blsp1_qup1_spi_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup1_spi_apps_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -839,7 +839,7 @@ static struct clk_rcg2 blsp1_qup2_i2c_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup2_i2c_apps_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -853,7 +853,7 @@ static struct clk_rcg2 blsp1_qup2_spi_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup2_spi_apps_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -866,7 +866,7 @@ static struct clk_rcg2 blsp1_qup3_i2c_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup3_i2c_apps_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -880,7 +880,7 @@ static struct clk_rcg2 blsp1_qup3_spi_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup3_spi_apps_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -893,7 +893,7 @@ static struct clk_rcg2 blsp1_qup4_i2c_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup4_i2c_apps_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -907,7 +907,7 @@ static struct clk_rcg2 blsp1_qup4_spi_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup4_spi_apps_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -920,7 +920,7 @@ static struct clk_rcg2 blsp1_qup5_i2c_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup5_i2c_apps_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -934,7 +934,7 @@ static struct clk_rcg2 blsp1_qup5_spi_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup5_spi_apps_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -947,7 +947,7 @@ static struct clk_rcg2 blsp1_qup6_i2c_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup6_i2c_apps_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -961,7 +961,7 @@ static struct clk_rcg2 blsp1_qup6_spi_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup6_spi_apps_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -994,7 +994,7 @@ static struct clk_rcg2 blsp1_uart1_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_uart1_apps_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1008,7 +1008,7 @@ static struct clk_rcg2 blsp1_uart2_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_uart2_apps_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1028,7 +1028,7 @@ static struct clk_rcg2 cci_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "cci_clk_src",
                .parent_data = gcc_xo_gpll0a_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0a_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1048,7 +1048,7 @@ static struct clk_rcg2 camss_gp0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "camss_gp0_clk_src",
                .parent_data = gcc_xo_gpll0_gpll1a_sleep_parent_data,
-               .num_parents = 4,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll1a_sleep_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1062,7 +1062,7 @@ static struct clk_rcg2 camss_gp1_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "camss_gp1_clk_src",
                .parent_data = gcc_xo_gpll0_gpll1a_sleep_parent_data,
-               .num_parents = 4,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll1a_sleep_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1082,7 +1082,7 @@ static struct clk_rcg2 jpeg0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "jpeg0_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1102,7 +1102,7 @@ static struct clk_rcg2 mclk0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "mclk0_clk_src",
                .parent_data = gcc_xo_gpll0_gpll1a_gpll6_sleep_parent_data,
-               .num_parents = 5,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll1a_gpll6_sleep_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1116,7 +1116,7 @@ static struct clk_rcg2 mclk1_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "mclk1_clk_src",
                .parent_data = gcc_xo_gpll0_gpll1a_gpll6_sleep_parent_data,
-               .num_parents = 5,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll1a_gpll6_sleep_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1135,7 +1135,7 @@ static struct clk_rcg2 csi0phytimer_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "csi0phytimer_clk_src",
                .parent_data = gcc_xo_gpll0_gpll1a_parent_data,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll1a_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1148,7 +1148,7 @@ static struct clk_rcg2 csi1phytimer_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "csi1phytimer_clk_src",
                .parent_data = gcc_xo_gpll0_gpll1a_parent_data,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll1a_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1171,7 +1171,7 @@ static struct clk_rcg2 cpp_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "cpp_clk_src",
                .parent_data = gcc_xo_gpll0_gpll2_parent_data,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll2_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1193,7 +1193,7 @@ static struct clk_rcg2 crypto_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "crypto_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1212,7 +1212,7 @@ static struct clk_rcg2 gp1_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gp1_clk_src",
                .parent_data = gcc_xo_gpll0_gpll1a_sleep_parent_data,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll1a_sleep_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1226,7 +1226,7 @@ static struct clk_rcg2 gp2_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gp2_clk_src",
                .parent_data = gcc_xo_gpll0_gpll1a_sleep_parent_data,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll1a_sleep_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1240,7 +1240,7 @@ static struct clk_rcg2 gp3_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gp3_clk_src",
                .parent_data = gcc_xo_gpll0_gpll1a_sleep_parent_data,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll1a_sleep_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1252,7 +1252,7 @@ static struct clk_rcg2 byte0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "byte0_clk_src",
                .parent_data = gcc_xo_gpll0a_dsibyte_parent_data,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0a_dsibyte_parent_data),
                .ops = &clk_byte2_ops,
                .flags = CLK_SET_RATE_PARENT,
        },
@@ -1265,7 +1265,7 @@ static struct clk_rcg2 byte1_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "byte1_clk_src",
                .parent_data = gcc_xo_gpll0a_dsibyte_parent_data,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0a_dsibyte_parent_data),
                .ops = &clk_byte2_ops,
                .flags = CLK_SET_RATE_PARENT,
        },
@@ -1284,7 +1284,7 @@ static struct clk_rcg2 esc0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "esc0_clk_src",
                .parent_data = gcc_xo_dsibyte_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_dsibyte_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1297,7 +1297,7 @@ static struct clk_rcg2 esc1_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "esc1_clk_src",
                .parent_data = gcc_xo_dsibyte_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_dsibyte_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1325,7 +1325,7 @@ static struct clk_rcg2 mdp_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "mdp_clk_src",
                .parent_data = gcc_xo_gpll1_dsiphy_gpll6_gpll3a_gpll0a_parent_data,
-               .num_parents = 6,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll1_dsiphy_gpll6_gpll3a_gpll0a_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1338,7 +1338,7 @@ static struct clk_rcg2 pclk0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pclk0_clk_src",
                .parent_data = gcc_xo_gpll0a_dsiphy_parent_data,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0a_dsiphy_parent_data),
                .ops = &clk_pixel_ops,
                .flags = CLK_SET_RATE_PARENT,
        },
@@ -1352,7 +1352,7 @@ static struct clk_rcg2 pclk1_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pclk1_clk_src",
                .parent_data = gcc_xo_gpll0a_dsiphy_parent_data,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0a_dsiphy_parent_data),
                .ops = &clk_pixel_ops,
                .flags = CLK_SET_RATE_PARENT,
        },
@@ -1371,7 +1371,7 @@ static struct clk_rcg2 vsync_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "vsync_clk_src",
                .parent_data = gcc_xo_gpll0a_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0a_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1390,7 +1390,7 @@ static struct clk_rcg2 pdm2_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pdm2_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1416,7 +1416,7 @@ static struct clk_rcg2 sdcc1_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "sdcc1_apps_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_floor_ops,
        },
 };
@@ -1430,7 +1430,7 @@ static struct clk_rcg2 sdcc2_apps_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "sdcc2_apps_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_floor_ops,
        },
 };
@@ -1450,7 +1450,7 @@ static struct clk_rcg2 apss_tcu_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "apss_tcu_clk_src",
                .parent_data = gcc_xo_gpll0_gpll5a_gpll6_bimc_parent_data,
-               .num_parents = 5,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll5a_gpll6_bimc_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1473,7 +1473,7 @@ static struct clk_rcg2 bimc_gpu_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "bimc_gpu_clk_src",
                .parent_data = gcc_xo_gpll0_gpll5a_gpll6_bimc_parent_data,
-               .num_parents = 5,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll5a_gpll6_bimc_parent_data),
                .flags = CLK_GET_RATE_NOCACHE,
                .ops = &clk_rcg2_ops,
        },
@@ -1494,7 +1494,7 @@ static struct clk_rcg2 usb_hs_system_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "usb_hs_system_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1512,7 +1512,7 @@ static struct clk_rcg2 usb_fs_system_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "usb_fs_system_clk_src",
                .parent_data = gcc_xo_gpll6_gpll0_parent_data,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll6_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1530,7 +1530,7 @@ static struct clk_rcg2 usb_fs_ic_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "usb_fs_ic_clk_src",
                .parent_data = gcc_xo_gpll6_gpll0a_parent_data,
-               .num_parents = 3,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll6_gpll0a_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1556,7 +1556,7 @@ static struct clk_rcg2 ultaudio_ahbfabric_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "ultaudio_ahbfabric_clk_src",
                .parent_data = gcc_xo_gpll0_gpll1_sleep_parent_data,
-               .num_parents = 4,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll1_sleep_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1568,8 +1568,8 @@ static struct clk_branch gcc_ultaudio_ahbfabric_ixfabric_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ultaudio_ahbfabric_ixfabric_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &ultaudio_ahbfabric_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &ultaudio_ahbfabric_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1585,8 +1585,8 @@ static struct clk_branch gcc_ultaudio_ahbfabric_ixfabric_lpm_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ultaudio_ahbfabric_ixfabric_lpm_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &ultaudio_ahbfabric_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &ultaudio_ahbfabric_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1635,7 +1635,7 @@ static struct clk_rcg2 ultaudio_lpaif_pri_i2s_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "ultaudio_lpaif_pri_i2s_clk_src",
                .parent_data = gcc_xo_gpll1_epi2s_emclk_sleep_parent_data,
-               .num_parents = 5,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll1_epi2s_emclk_sleep_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1647,8 +1647,8 @@ static struct clk_branch gcc_ultaudio_lpaif_pri_i2s_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ultaudio_lpaif_pri_i2s_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &ultaudio_lpaif_pri_i2s_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &ultaudio_lpaif_pri_i2s_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1666,7 +1666,7 @@ static struct clk_rcg2 ultaudio_lpaif_sec_i2s_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "ultaudio_lpaif_sec_i2s_clk_src",
                .parent_data = gcc_xo_gpll1_esi2s_emclk_sleep_parent_data,
-               .num_parents = 5,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll1_esi2s_emclk_sleep_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1678,8 +1678,8 @@ static struct clk_branch gcc_ultaudio_lpaif_sec_i2s_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ultaudio_lpaif_sec_i2s_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &ultaudio_lpaif_sec_i2s_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &ultaudio_lpaif_sec_i2s_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1697,7 +1697,7 @@ static struct clk_rcg2 ultaudio_lpaif_aux_i2s_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "ultaudio_lpaif_aux_i2s_clk_src",
                .parent_data = gcc_xo_gpll1_esi2s_emclk_sleep_parent_data,
-               .num_parents = 5,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll1_esi2s_emclk_sleep_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1709,8 +1709,8 @@ static struct clk_branch gcc_ultaudio_lpaif_aux_i2s_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ultaudio_lpaif_aux_i2s_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &ultaudio_lpaif_aux_i2s_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &ultaudio_lpaif_aux_i2s_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1732,7 +1732,7 @@ static struct clk_rcg2 ultaudio_xo_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "ultaudio_xo_clk_src",
                .parent_data = gcc_xo_sleep_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_sleep_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1744,8 +1744,8 @@ static struct clk_branch gcc_ultaudio_avsync_xo_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ultaudio_avsync_xo_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &ultaudio_xo_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &ultaudio_xo_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1761,8 +1761,8 @@ static struct clk_branch gcc_ultaudio_stc_xo_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ultaudio_stc_xo_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &ultaudio_xo_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &ultaudio_xo_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1788,7 +1788,7 @@ static struct clk_rcg2 codec_digcodec_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "codec_digcodec_clk_src",
                .parent_data = gcc_xo_gpll1_emclk_sleep_parent_data,
-               .num_parents = 4,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll1_emclk_sleep_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1800,8 +1800,8 @@ static struct clk_branch gcc_codec_digcodec_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ultaudio_codec_digcodec_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &codec_digcodec_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &codec_digcodec_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1817,8 +1817,8 @@ static struct clk_branch gcc_ultaudio_pcnoc_mport_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ultaudio_pcnoc_mport_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &pcnoc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -1833,8 +1833,8 @@ static struct clk_branch gcc_ultaudio_pcnoc_sway_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_ultaudio_pcnoc_sway_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &pcnoc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -1858,7 +1858,7 @@ static struct clk_rcg2 vcodec0_clk_src = {
        .clkr.hw.init = &(struct clk_init_data){
                .name = "vcodec0_clk_src",
                .parent_data = gcc_xo_gpll0_parent_data,
-               .num_parents = 2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_parent_data),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -1871,8 +1871,8 @@ static struct clk_branch gcc_blsp1_ahb_clk = {
                .enable_mask = BIT(10),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_ahb_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &pcnoc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -1899,8 +1899,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_data = &(const struct clk_parent_data){
-                               .hw = &blsp1_qup1_i2c_apps_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup1_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1916,8 +1916,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_data = &(const struct clk_parent_data){
-                               .hw = &blsp1_qup1_spi_apps_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup1_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1933,8 +1933,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_data = &(const struct clk_parent_data){
-                               .hw = &blsp1_qup2_i2c_apps_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup2_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1950,8 +1950,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_data = &(const struct clk_parent_data){
-                               .hw = &blsp1_qup2_spi_apps_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup2_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1967,8 +1967,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_data = &(const struct clk_parent_data){
-                               .hw = &blsp1_qup3_i2c_apps_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup3_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1984,8 +1984,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_data = &(const struct clk_parent_data){
-                               .hw = &blsp1_qup3_spi_apps_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup3_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2001,8 +2001,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_data = &(const struct clk_parent_data){
-                               .hw = &blsp1_qup4_i2c_apps_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup4_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2018,8 +2018,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_data = &(const struct clk_parent_data){
-                               .hw = &blsp1_qup4_spi_apps_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup4_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2035,8 +2035,8 @@ static struct clk_branch gcc_blsp1_qup5_i2c_apps_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup5_i2c_apps_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &blsp1_qup5_i2c_apps_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup5_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2052,8 +2052,8 @@ static struct clk_branch gcc_blsp1_qup5_spi_apps_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup5_spi_apps_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &blsp1_qup5_spi_apps_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup5_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2069,8 +2069,8 @@ static struct clk_branch gcc_blsp1_qup6_i2c_apps_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup6_i2c_apps_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &blsp1_qup6_i2c_apps_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup6_i2c_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2086,8 +2086,8 @@ static struct clk_branch gcc_blsp1_qup6_spi_apps_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_blsp1_qup6_spi_apps_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &blsp1_qup6_spi_apps_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup6_spi_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2103,8 +2103,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_data = &(const struct clk_parent_data){
-                               .hw = &blsp1_uart1_apps_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_uart1_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2120,8 +2120,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_data = &(const struct clk_parent_data){
-                               .hw = &blsp1_uart2_apps_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_uart2_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2138,8 +2138,8 @@ static struct clk_branch gcc_boot_rom_ahb_clk = {
                .enable_mask = BIT(7),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_boot_rom_ahb_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &pcnoc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -2154,8 +2154,8 @@ static struct clk_branch gcc_camss_cci_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_cci_ahb_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &camss_ahb_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_ahb_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2171,8 +2171,8 @@ static struct clk_branch gcc_camss_cci_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_cci_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &cci_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &cci_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2188,8 +2188,8 @@ static struct clk_branch gcc_camss_csi0_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi0_ahb_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &camss_ahb_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_ahb_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2205,8 +2205,8 @@ static struct clk_branch gcc_camss_csi0_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi0_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &csi0_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2222,8 +2222,8 @@ static struct clk_branch gcc_camss_csi0phy_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi0phy_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &csi0_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2239,8 +2239,8 @@ static struct clk_branch gcc_camss_csi0pix_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi0pix_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &csi0_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2256,8 +2256,8 @@ static struct clk_branch gcc_camss_csi0rdi_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi0rdi_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &csi0_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2273,8 +2273,8 @@ static struct clk_branch gcc_camss_csi1_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi1_ahb_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &camss_ahb_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_ahb_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2290,8 +2290,8 @@ static struct clk_branch gcc_camss_csi1_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi1_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &csi1_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi1_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2307,8 +2307,8 @@ static struct clk_branch gcc_camss_csi1phy_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi1phy_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &csi1_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi1_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2324,8 +2324,8 @@ static struct clk_branch gcc_camss_csi1pix_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi1pix_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &csi1_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi1_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2341,8 +2341,8 @@ static struct clk_branch gcc_camss_csi1rdi_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi1rdi_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &csi1_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi1_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2358,8 +2358,8 @@ static struct clk_branch gcc_camss_csi_vfe0_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi_vfe0_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &vfe0_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vfe0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2375,8 +2375,8 @@ static struct clk_branch gcc_camss_gp0_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_gp0_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &camss_gp0_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_gp0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2392,8 +2392,8 @@ static struct clk_branch gcc_camss_gp1_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_gp1_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &camss_gp1_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_gp1_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2409,8 +2409,8 @@ static struct clk_branch gcc_camss_ispif_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_ispif_ahb_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &camss_ahb_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_ahb_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2426,8 +2426,8 @@ static struct clk_branch gcc_camss_jpeg0_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_jpeg0_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &jpeg0_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &jpeg0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2443,8 +2443,8 @@ static struct clk_branch gcc_camss_jpeg_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_jpeg_ahb_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &camss_ahb_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_ahb_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2460,8 +2460,8 @@ static struct clk_branch gcc_camss_jpeg_axi_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_jpeg_axi_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &system_mm_noc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &system_mm_noc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2477,8 +2477,8 @@ static struct clk_branch gcc_camss_mclk0_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_mclk0_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &mclk0_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &mclk0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2494,8 +2494,8 @@ static struct clk_branch gcc_camss_mclk1_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_mclk1_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &mclk1_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &mclk1_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2511,8 +2511,8 @@ static struct clk_branch gcc_camss_micro_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_micro_ahb_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &camss_ahb_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_ahb_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2528,8 +2528,8 @@ static struct clk_branch gcc_camss_csi0phytimer_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi0phytimer_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &csi0phytimer_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi0phytimer_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2545,8 +2545,8 @@ static struct clk_branch gcc_camss_csi1phytimer_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_csi1phytimer_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &csi1phytimer_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi1phytimer_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2562,8 +2562,8 @@ static struct clk_branch gcc_camss_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_ahb_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &camss_ahb_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_ahb_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2579,8 +2579,8 @@ static struct clk_branch gcc_camss_top_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_top_ahb_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &pcnoc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2596,8 +2596,8 @@ static struct clk_branch gcc_camss_cpp_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_cpp_ahb_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &camss_ahb_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_ahb_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2613,8 +2613,8 @@ static struct clk_branch gcc_camss_cpp_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_cpp_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &cpp_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &cpp_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2630,8 +2630,8 @@ static struct clk_branch gcc_camss_vfe0_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_vfe0_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &vfe0_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vfe0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2647,8 +2647,8 @@ static struct clk_branch gcc_camss_vfe_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_vfe_ahb_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &camss_ahb_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_ahb_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2664,8 +2664,8 @@ static struct clk_branch gcc_camss_vfe_axi_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_camss_vfe_axi_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &system_mm_noc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &system_mm_noc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2682,8 +2682,8 @@ static struct clk_branch gcc_crypto_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_crypto_ahb_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &pcnoc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2700,8 +2700,8 @@ static struct clk_branch gcc_crypto_axi_clk = {
                .enable_mask = BIT(1),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_crypto_axi_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &pcnoc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2718,8 +2718,8 @@ static struct clk_branch gcc_crypto_clk = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_crypto_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &crypto_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &crypto_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2735,8 +2735,8 @@ static struct clk_branch gcc_oxili_gmem_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_oxili_gmem_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &gfx3d_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gfx3d_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2752,8 +2752,8 @@ static struct clk_branch gcc_gp1_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_gp1_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &gp1_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gp1_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2769,8 +2769,8 @@ static struct clk_branch gcc_gp2_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_gp2_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &gp2_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gp2_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2786,8 +2786,8 @@ static struct clk_branch gcc_gp3_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_gp3_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &gp3_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gp3_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2803,8 +2803,8 @@ static struct clk_branch gcc_mdss_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mdss_ahb_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &pcnoc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2820,8 +2820,8 @@ static struct clk_branch gcc_mdss_axi_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mdss_axi_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &system_mm_noc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &system_mm_noc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2837,8 +2837,8 @@ static struct clk_branch gcc_mdss_byte0_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mdss_byte0_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &byte0_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &byte0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2854,8 +2854,8 @@ static struct clk_branch gcc_mdss_byte1_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mdss_byte1_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &byte1_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &byte1_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2871,8 +2871,8 @@ static struct clk_branch gcc_mdss_esc0_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mdss_esc0_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &esc0_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &esc0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2888,8 +2888,8 @@ static struct clk_branch gcc_mdss_esc1_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mdss_esc1_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &esc1_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &esc1_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2905,8 +2905,8 @@ static struct clk_branch gcc_mdss_mdp_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mdss_mdp_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &mdp_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &mdp_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2922,8 +2922,8 @@ static struct clk_branch gcc_mdss_pclk0_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mdss_pclk0_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &pclk0_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pclk0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2939,8 +2939,8 @@ static struct clk_branch gcc_mdss_pclk1_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mdss_pclk1_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &pclk1_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pclk1_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2956,8 +2956,8 @@ static struct clk_branch gcc_mdss_vsync_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mdss_vsync_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &vsync_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vsync_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2973,8 +2973,8 @@ static struct clk_branch gcc_mss_cfg_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mss_cfg_ahb_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &pcnoc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2990,8 +2990,8 @@ static struct clk_branch gcc_mss_q6_bimc_axi_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mss_q6_bimc_axi_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &bimc_ddr_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &bimc_ddr_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3007,8 +3007,8 @@ static struct clk_branch gcc_oxili_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_oxili_ahb_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &pcnoc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3024,8 +3024,8 @@ static struct clk_branch gcc_oxili_gfx3d_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_oxili_gfx3d_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &gfx3d_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gfx3d_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3041,8 +3041,8 @@ static struct clk_branch gcc_pdm2_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_pdm2_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &pdm2_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pdm2_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3058,8 +3058,8 @@ static struct clk_branch gcc_pdm_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_pdm_ahb_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &pcnoc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3076,8 +3076,8 @@ static struct clk_branch gcc_prng_ahb_clk = {
                .enable_mask = BIT(8),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_prng_ahb_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &pcnoc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -3092,8 +3092,8 @@ static struct clk_branch gcc_sdcc1_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc1_ahb_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &pcnoc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3109,8 +3109,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_data = &(const struct clk_parent_data){
-                               .hw = &sdcc1_apps_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &sdcc1_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3126,8 +3126,8 @@ static struct clk_branch gcc_sdcc2_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_sdcc2_ahb_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &pcnoc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3143,8 +3143,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_data = &(const struct clk_parent_data){
-                               .hw = &sdcc2_apps_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &sdcc2_apps_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3161,8 +3161,8 @@ static struct clk_branch gcc_apss_tcu_clk = {
                .enable_mask = BIT(1),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_apss_tcu_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &bimc_ddr_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &bimc_ddr_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -3178,8 +3178,8 @@ static struct clk_branch gcc_gfx_tcu_clk = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_gfx_tcu_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &bimc_ddr_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &bimc_ddr_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -3195,8 +3195,8 @@ static struct clk_branch gcc_gfx_tbu_clk = {
                .enable_mask = BIT(3),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_gfx_tbu_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &bimc_ddr_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &bimc_ddr_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -3212,8 +3212,8 @@ static struct clk_branch gcc_mdp_tbu_clk = {
                .enable_mask = BIT(4),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mdp_tbu_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &system_mm_noc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &system_mm_noc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3230,8 +3230,8 @@ static struct clk_branch gcc_venus_tbu_clk = {
                .enable_mask = BIT(5),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_venus_tbu_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &system_mm_noc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &system_mm_noc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3248,8 +3248,8 @@ static struct clk_branch gcc_vfe_tbu_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_vfe_tbu_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &system_mm_noc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &system_mm_noc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3266,8 +3266,8 @@ static struct clk_branch gcc_jpeg_tbu_clk = {
                .enable_mask = BIT(10),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_jpeg_tbu_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &system_mm_noc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &system_mm_noc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3284,8 +3284,8 @@ static struct clk_branch gcc_smmu_cfg_clk = {
                .enable_mask = BIT(12),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_smmu_cfg_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &pcnoc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3302,8 +3302,8 @@ static struct clk_branch gcc_gtcu_ahb_clk = {
                .enable_mask = BIT(13),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_gtcu_ahb_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &pcnoc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3320,8 +3320,8 @@ static struct clk_branch gcc_cpp_tbu_clk = {
                .enable_mask = BIT(14),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_cpp_tbu_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &pcnoc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3338,8 +3338,8 @@ static struct clk_branch gcc_mdp_rt_tbu_clk = {
                .enable_mask = BIT(15),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_mdp_rt_tbu_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &pcnoc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3355,8 +3355,8 @@ static struct clk_branch gcc_bimc_gfx_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_bimc_gfx_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &bimc_gpu_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &bimc_gpu_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3372,8 +3372,8 @@ static struct clk_branch gcc_bimc_gpu_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_bimc_gpu_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &bimc_gpu_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &bimc_gpu_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3401,8 +3401,8 @@ static struct clk_branch gcc_usb_fs_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb_fs_ahb_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &pcnoc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3418,8 +3418,8 @@ static struct clk_branch gcc_usb_fs_ic_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb_fs_ic_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &usb_fs_ic_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb_fs_ic_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3435,8 +3435,8 @@ static struct clk_branch gcc_usb_fs_system_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb_fs_system_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &usb_fs_system_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb_fs_system_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3452,8 +3452,8 @@ static struct clk_branch gcc_usb_hs_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb_hs_ahb_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &pcnoc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3469,8 +3469,8 @@ static struct clk_branch gcc_usb_hs_system_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_usb_hs_system_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &usb_hs_system_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb_hs_system_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3486,8 +3486,8 @@ static struct clk_branch gcc_venus0_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_venus0_ahb_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &pcnoc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcnoc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3503,8 +3503,8 @@ static struct clk_branch gcc_venus0_axi_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_venus0_axi_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &system_mm_noc_bfdcd_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &system_mm_noc_bfdcd_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3520,8 +3520,8 @@ static struct clk_branch gcc_venus0_vcodec0_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_venus0_vcodec0_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &vcodec0_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vcodec0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3537,8 +3537,8 @@ static struct clk_branch gcc_venus0_core0_vcodec0_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_venus0_core0_vcodec0_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &vcodec0_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vcodec0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
@@ -3554,8 +3554,8 @@ static struct clk_branch gcc_venus0_core1_vcodec0_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_venus0_core1_vcodec0_clk",
-                       .parent_data = &(const struct clk_parent_data){
-                               .hw = &vcodec0_clk_src.clkr.hw,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vcodec0_clk_src.clkr.hw,
                        },
                        .num_parents = 1,
                        .flags = CLK_SET_RATE_PARENT,
index a6e13b9..9dd4e7f 100644 (file)
@@ -35,7 +35,9 @@ static struct clk_pll pll3 = {
        .status_bit = 16,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pll3",
-               .parent_names = (const char *[]){ "pxo" },
+               .parent_data = &(const struct clk_parent_data){
+                       .fw_name = "pxo", .name = "pxo_board",
+               },
                .num_parents = 1,
                .ops = &clk_pll_ops,
        },
@@ -46,7 +48,9 @@ static struct clk_regmap pll4_vote = {
        .enable_mask = BIT(4),
        .hw.init = &(struct clk_init_data){
                .name = "pll4_vote",
-               .parent_names = (const char *[]){ "pll4" },
+               .parent_data = &(const struct clk_parent_data){
+                       .fw_name = "pll4", .name = "pll4",
+               },
                .num_parents = 1,
                .ops = &clk_pll_vote_ops,
        },
@@ -62,7 +66,9 @@ static struct clk_pll pll8 = {
        .status_bit = 16,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pll8",
-               .parent_names = (const char *[]){ "pxo" },
+               .parent_data = &(const struct clk_parent_data){
+                       .fw_name = "pxo", .name = "pxo_board",
+               },
                .num_parents = 1,
                .ops = &clk_pll_ops,
        },
@@ -73,7 +79,9 @@ static struct clk_regmap pll8_vote = {
        .enable_mask = BIT(8),
        .hw.init = &(struct clk_init_data){
                .name = "pll8_vote",
-               .parent_names = (const char *[]){ "pll8" },
+               .parent_hws = (const struct clk_hw*[]){
+                       &pll8.clkr.hw
+               },
                .num_parents = 1,
                .ops = &clk_pll_vote_ops,
        },
@@ -96,7 +104,9 @@ static struct hfpll_data hfpll0_data = {
 static struct clk_hfpll hfpll0 = {
        .d = &hfpll0_data,
        .clkr.hw.init = &(struct clk_init_data){
-               .parent_names = (const char *[]){ "pxo" },
+               .parent_data = &(const struct clk_parent_data){
+                       .fw_name = "pxo", .name = "pxo_board",
+               },
                .num_parents = 1,
                .name = "hfpll0",
                .ops = &clk_ops_hfpll,
@@ -136,7 +146,9 @@ static struct hfpll_data hfpll1_data = {
 static struct clk_hfpll hfpll1 = {
        .d = &hfpll1_data,
        .clkr.hw.init = &(struct clk_init_data){
-               .parent_names = (const char *[]){ "pxo" },
+               .parent_data = &(const struct clk_parent_data){
+                       .fw_name = "pxo", .name = "pxo_board",
+               },
                .num_parents = 1,
                .name = "hfpll1",
                .ops = &clk_ops_hfpll,
@@ -162,7 +174,9 @@ static struct hfpll_data hfpll2_data = {
 static struct clk_hfpll hfpll2 = {
        .d = &hfpll2_data,
        .clkr.hw.init = &(struct clk_init_data){
-               .parent_names = (const char *[]){ "pxo" },
+               .parent_data = &(const struct clk_parent_data){
+                       .fw_name = "pxo", .name = "pxo_board",
+               },
                .num_parents = 1,
                .name = "hfpll2",
                .ops = &clk_ops_hfpll,
@@ -188,7 +202,9 @@ static struct hfpll_data hfpll3_data = {
 static struct clk_hfpll hfpll3 = {
        .d = &hfpll3_data,
        .clkr.hw.init = &(struct clk_init_data){
-               .parent_names = (const char *[]){ "pxo" },
+               .parent_data = &(const struct clk_parent_data){
+                       .fw_name = "pxo", .name = "pxo_board",
+               },
                .num_parents = 1,
                .name = "hfpll3",
                .ops = &clk_ops_hfpll,
@@ -228,7 +244,9 @@ static struct hfpll_data hfpll_l2_data = {
 static struct clk_hfpll hfpll_l2 = {
        .d = &hfpll_l2_data,
        .clkr.hw.init = &(struct clk_init_data){
-               .parent_names = (const char *[]){ "pxo" },
+               .parent_data = &(const struct clk_parent_data){
+                       .fw_name = "pxo", .name = "pxo_board",
+               },
                .num_parents = 1,
                .name = "hfpll_l2",
                .ops = &clk_ops_hfpll,
@@ -247,7 +265,9 @@ static struct clk_pll pll14 = {
        .status_bit = 16,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pll14",
-               .parent_names = (const char *[]){ "pxo" },
+               .parent_data = &(const struct clk_parent_data){
+                       .fw_name = "pxo", .name = "pxo_board",
+               },
                .num_parents = 1,
                .ops = &clk_pll_ops,
        },
@@ -258,7 +278,9 @@ static struct clk_regmap pll14_vote = {
        .enable_mask = BIT(14),
        .hw.init = &(struct clk_init_data){
                .name = "pll14_vote",
-               .parent_names = (const char *[]){ "pll14" },
+               .parent_hws = (const struct clk_hw*[]){
+                       &pll14.clkr.hw
+               },
                .num_parents = 1,
                .ops = &clk_pll_vote_ops,
        },
@@ -276,9 +298,9 @@ static const struct parent_map gcc_pxo_pll8_map[] = {
        { P_PLL8, 3 }
 };
 
-static const char * const gcc_pxo_pll8[] = {
-       "pxo",
-       "pll8_vote",
+static const struct clk_parent_data gcc_pxo_pll8[] = {
+       { .fw_name = "pxo", .name = "pxo_board" },
+       { .hw = &pll8_vote.hw },
 };
 
 static const struct parent_map gcc_pxo_pll8_cxo_map[] = {
@@ -287,10 +309,10 @@ static const struct parent_map gcc_pxo_pll8_cxo_map[] = {
        { P_CXO, 5 }
 };
 
-static const char * const gcc_pxo_pll8_cxo[] = {
-       "pxo",
-       "pll8_vote",
-       "cxo",
+static const struct clk_parent_data gcc_pxo_pll8_cxo[] = {
+       { .fw_name = "pxo", .name = "pxo_board" },
+       { .hw = &pll8_vote.hw },
+       { .fw_name = "cxo", .name = "cxo_board" },
 };
 
 static const struct parent_map gcc_pxo_pll8_pll3_map[] = {
@@ -299,10 +321,10 @@ static const struct parent_map gcc_pxo_pll8_pll3_map[] = {
        { P_PLL3, 6 }
 };
 
-static const char * const gcc_pxo_pll8_pll3[] = {
-       "pxo",
-       "pll8_vote",
-       "pll3",
+static const struct clk_parent_data gcc_pxo_pll8_pll3[] = {
+       { .fw_name = "pxo", .name = "pxo_board" },
+       { .hw = &pll8_vote.hw },
+       { .hw = &pll3.clkr.hw },
 };
 
 static struct freq_tbl clk_tbl_gsbi_uart[] = {
@@ -348,8 +370,8 @@ static struct clk_rcg gsbi1_uart_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi1_uart_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -364,8 +386,8 @@ static struct clk_branch gsbi1_uart_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi1_uart_clk",
-                       .parent_names = (const char *[]){
-                               "gsbi1_uart_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi1_uart_src.clkr.hw
                        },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
@@ -399,8 +421,8 @@ static struct clk_rcg gsbi2_uart_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi2_uart_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -415,8 +437,8 @@ static struct clk_branch gsbi2_uart_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi2_uart_clk",
-                       .parent_names = (const char *[]){
-                               "gsbi2_uart_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi2_uart_src.clkr.hw
                        },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
@@ -450,8 +472,8 @@ static struct clk_rcg gsbi3_uart_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi3_uart_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -466,8 +488,8 @@ static struct clk_branch gsbi3_uart_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi3_uart_clk",
-                       .parent_names = (const char *[]){
-                               "gsbi3_uart_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi3_uart_src.clkr.hw
                        },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
@@ -501,8 +523,8 @@ static struct clk_rcg gsbi4_uart_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi4_uart_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -517,8 +539,8 @@ static struct clk_branch gsbi4_uart_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi4_uart_clk",
-                       .parent_names = (const char *[]){
-                               "gsbi4_uart_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi4_uart_src.clkr.hw
                        },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
@@ -552,8 +574,8 @@ static struct clk_rcg gsbi5_uart_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi5_uart_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -568,8 +590,8 @@ static struct clk_branch gsbi5_uart_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi5_uart_clk",
-                       .parent_names = (const char *[]){
-                               "gsbi5_uart_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi5_uart_src.clkr.hw
                        },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
@@ -603,8 +625,8 @@ static struct clk_rcg gsbi6_uart_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi6_uart_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -619,8 +641,8 @@ static struct clk_branch gsbi6_uart_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi6_uart_clk",
-                       .parent_names = (const char *[]){
-                               "gsbi6_uart_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi6_uart_src.clkr.hw
                        },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
@@ -654,8 +676,8 @@ static struct clk_rcg gsbi7_uart_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi7_uart_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -670,8 +692,8 @@ static struct clk_branch gsbi7_uart_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi7_uart_clk",
-                       .parent_names = (const char *[]){
-                               "gsbi7_uart_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi7_uart_src.clkr.hw
                        },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
@@ -705,8 +727,8 @@ static struct clk_rcg gsbi8_uart_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi8_uart_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -721,7 +743,9 @@ static struct clk_branch gsbi8_uart_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi8_uart_clk",
-                       .parent_names = (const char *[]){ "gsbi8_uart_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi8_uart_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -754,8 +778,8 @@ static struct clk_rcg gsbi9_uart_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi9_uart_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -770,7 +794,9 @@ static struct clk_branch gsbi9_uart_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi9_uart_clk",
-                       .parent_names = (const char *[]){ "gsbi9_uart_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi9_uart_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -803,8 +829,8 @@ static struct clk_rcg gsbi10_uart_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi10_uart_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -819,7 +845,9 @@ static struct clk_branch gsbi10_uart_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi10_uart_clk",
-                       .parent_names = (const char *[]){ "gsbi10_uart_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi10_uart_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -852,8 +880,8 @@ static struct clk_rcg gsbi11_uart_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi11_uart_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -868,7 +896,9 @@ static struct clk_branch gsbi11_uart_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi11_uart_clk",
-                       .parent_names = (const char *[]){ "gsbi11_uart_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi11_uart_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -901,8 +931,8 @@ static struct clk_rcg gsbi12_uart_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi12_uart_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -917,7 +947,9 @@ static struct clk_branch gsbi12_uart_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi12_uart_clk",
-                       .parent_names = (const char *[]){ "gsbi12_uart_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi12_uart_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -963,8 +995,8 @@ static struct clk_rcg gsbi1_qup_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi1_qup_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -979,7 +1011,9 @@ static struct clk_branch gsbi1_qup_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi1_qup_clk",
-                       .parent_names = (const char *[]){ "gsbi1_qup_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi1_qup_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1012,8 +1046,8 @@ static struct clk_rcg gsbi2_qup_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi2_qup_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -1028,7 +1062,9 @@ static struct clk_branch gsbi2_qup_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi2_qup_clk",
-                       .parent_names = (const char *[]){ "gsbi2_qup_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi2_qup_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1061,8 +1097,8 @@ static struct clk_rcg gsbi3_qup_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi3_qup_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -1077,7 +1113,9 @@ static struct clk_branch gsbi3_qup_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi3_qup_clk",
-                       .parent_names = (const char *[]){ "gsbi3_qup_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi3_qup_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1110,8 +1148,8 @@ static struct clk_rcg gsbi4_qup_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi4_qup_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -1126,7 +1164,9 @@ static struct clk_branch gsbi4_qup_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi4_qup_clk",
-                       .parent_names = (const char *[]){ "gsbi4_qup_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi4_qup_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1159,8 +1199,8 @@ static struct clk_rcg gsbi5_qup_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi5_qup_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -1175,7 +1215,9 @@ static struct clk_branch gsbi5_qup_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi5_qup_clk",
-                       .parent_names = (const char *[]){ "gsbi5_qup_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi5_qup_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1208,8 +1250,8 @@ static struct clk_rcg gsbi6_qup_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi6_qup_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -1224,7 +1266,9 @@ static struct clk_branch gsbi6_qup_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi6_qup_clk",
-                       .parent_names = (const char *[]){ "gsbi6_qup_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi6_qup_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1257,8 +1301,8 @@ static struct clk_rcg gsbi7_qup_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi7_qup_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -1273,7 +1317,9 @@ static struct clk_branch gsbi7_qup_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi7_qup_clk",
-                       .parent_names = (const char *[]){ "gsbi7_qup_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi7_qup_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1306,8 +1352,8 @@ static struct clk_rcg gsbi8_qup_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi8_qup_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -1322,7 +1368,9 @@ static struct clk_branch gsbi8_qup_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi8_qup_clk",
-                       .parent_names = (const char *[]){ "gsbi8_qup_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi8_qup_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1355,8 +1403,8 @@ static struct clk_rcg gsbi9_qup_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi9_qup_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -1371,7 +1419,9 @@ static struct clk_branch gsbi9_qup_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi9_qup_clk",
-                       .parent_names = (const char *[]){ "gsbi9_qup_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi9_qup_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1404,8 +1454,8 @@ static struct clk_rcg gsbi10_qup_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi10_qup_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -1420,7 +1470,9 @@ static struct clk_branch gsbi10_qup_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi10_qup_clk",
-                       .parent_names = (const char *[]){ "gsbi10_qup_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi10_qup_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1453,8 +1505,8 @@ static struct clk_rcg gsbi11_qup_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi11_qup_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -1469,7 +1521,9 @@ static struct clk_branch gsbi11_qup_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi11_qup_clk",
-                       .parent_names = (const char *[]){ "gsbi11_qup_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi11_qup_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1502,8 +1556,8 @@ static struct clk_rcg gsbi12_qup_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi12_qup_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -1518,7 +1572,9 @@ static struct clk_branch gsbi12_qup_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gsbi12_qup_clk",
-                       .parent_names = (const char *[]){ "gsbi12_qup_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gsbi12_qup_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1564,8 +1620,8 @@ static struct clk_rcg gp0_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gp0_src",
-                       .parent_names = gcc_pxo_pll8_cxo,
-                       .num_parents = 3,
+                       .parent_data = gcc_pxo_pll8_cxo,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8_cxo),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_PARENT_GATE,
                },
@@ -1580,7 +1636,9 @@ static struct clk_branch gp0_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gp0_clk",
-                       .parent_names = (const char *[]){ "gp0_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gp0_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1613,8 +1671,8 @@ static struct clk_rcg gp1_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gp1_src",
-                       .parent_names = gcc_pxo_pll8_cxo,
-                       .num_parents = 3,
+                       .parent_data = gcc_pxo_pll8_cxo,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8_cxo),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_RATE_GATE,
                },
@@ -1629,7 +1687,9 @@ static struct clk_branch gp1_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gp1_clk",
-                       .parent_names = (const char *[]){ "gp1_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gp1_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1662,8 +1722,8 @@ static struct clk_rcg gp2_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "gp2_src",
-                       .parent_names = gcc_pxo_pll8_cxo,
-                       .num_parents = 3,
+                       .parent_data = gcc_pxo_pll8_cxo,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8_cxo),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_RATE_GATE,
                },
@@ -1678,7 +1738,9 @@ static struct clk_branch gp2_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "gp2_clk",
-                       .parent_names = (const char *[]){ "gp2_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gp2_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1714,8 +1776,8 @@ static struct clk_rcg prng_src = {
        .clkr = {
                .hw.init = &(struct clk_init_data){
                        .name = "prng_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                },
        },
@@ -1730,7 +1792,9 @@ static struct clk_branch prng_clk = {
                .enable_mask = BIT(10),
                .hw.init = &(struct clk_init_data){
                        .name = "prng_clk",
-                       .parent_names = (const char *[]){ "prng_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &prng_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                },
@@ -1776,8 +1840,8 @@ static struct clk_rcg sdc1_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "sdc1_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                },
        }
@@ -1791,7 +1855,9 @@ static struct clk_branch sdc1_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "sdc1_clk",
-                       .parent_names = (const char *[]){ "sdc1_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &sdc1_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1824,8 +1890,8 @@ static struct clk_rcg sdc2_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "sdc2_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                },
        }
@@ -1839,7 +1905,9 @@ static struct clk_branch sdc2_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "sdc2_clk",
-                       .parent_names = (const char *[]){ "sdc2_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &sdc2_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1872,8 +1940,8 @@ static struct clk_rcg sdc3_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "sdc3_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                },
        }
@@ -1887,7 +1955,9 @@ static struct clk_branch sdc3_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "sdc3_clk",
-                       .parent_names = (const char *[]){ "sdc3_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &sdc3_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1920,8 +1990,8 @@ static struct clk_rcg sdc4_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "sdc4_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                },
        }
@@ -1935,7 +2005,9 @@ static struct clk_branch sdc4_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "sdc4_clk",
-                       .parent_names = (const char *[]){ "sdc4_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &sdc4_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1968,8 +2040,8 @@ static struct clk_rcg sdc5_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "sdc5_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                },
        }
@@ -1983,7 +2055,9 @@ static struct clk_branch sdc5_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "sdc5_clk",
-                       .parent_names = (const char *[]){ "sdc5_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &sdc5_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2021,8 +2095,8 @@ static struct clk_rcg tsif_ref_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "tsif_ref_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_RATE_GATE,
                },
@@ -2037,7 +2111,9 @@ static struct clk_branch tsif_ref_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "tsif_ref_clk",
-                       .parent_names = (const char *[]){ "tsif_ref_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &tsif_ref_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2075,8 +2151,8 @@ static struct clk_rcg usb_hs1_xcvr_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "usb_hs1_xcvr_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_RATE_GATE,
                },
@@ -2091,7 +2167,9 @@ static struct clk_branch usb_hs1_xcvr_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "usb_hs1_xcvr_clk",
-                       .parent_names = (const char *[]){ "usb_hs1_xcvr_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb_hs1_xcvr_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2124,8 +2202,8 @@ static struct clk_rcg usb_hs3_xcvr_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "usb_hs3_xcvr_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_RATE_GATE,
                },
@@ -2140,7 +2218,9 @@ static struct clk_branch usb_hs3_xcvr_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "usb_hs3_xcvr_clk",
-                       .parent_names = (const char *[]){ "usb_hs3_xcvr_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb_hs3_xcvr_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2173,8 +2253,8 @@ static struct clk_rcg usb_hs4_xcvr_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "usb_hs4_xcvr_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_RATE_GATE,
                },
@@ -2189,7 +2269,9 @@ static struct clk_branch usb_hs4_xcvr_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "usb_hs4_xcvr_clk",
-                       .parent_names = (const char *[]){ "usb_hs4_xcvr_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb_hs4_xcvr_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2222,16 +2304,14 @@ static struct clk_rcg usb_hsic_xcvr_fs_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "usb_hsic_xcvr_fs_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_RATE_GATE,
                },
        }
 };
 
-static const char * const usb_hsic_xcvr_fs_src_p[] = { "usb_hsic_xcvr_fs_src" };
-
 static struct clk_branch usb_hsic_xcvr_fs_clk = {
        .halt_reg = 0x2fc8,
        .halt_bit = 2,
@@ -2240,7 +2320,9 @@ static struct clk_branch usb_hsic_xcvr_fs_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "usb_hsic_xcvr_fs_clk",
-                       .parent_names = usb_hsic_xcvr_fs_src_p,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb_hsic_xcvr_fs_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2255,7 +2337,9 @@ static struct clk_branch usb_hsic_system_clk = {
                .enable_reg = 0x292c,
                .enable_mask = BIT(4),
                .hw.init = &(struct clk_init_data){
-                       .parent_names = usb_hsic_xcvr_fs_src_p,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb_hsic_xcvr_fs_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .name = "usb_hsic_system_clk",
                        .ops = &clk_branch_ops,
@@ -2271,7 +2355,9 @@ static struct clk_branch usb_hsic_hsic_clk = {
                .enable_reg = 0x2b44,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .parent_names = (const char *[]){ "pll14_vote" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pll14_vote.hw
+                       },
                        .num_parents = 1,
                        .name = "usb_hsic_hsic_clk",
                        .ops = &clk_branch_ops,
@@ -2317,16 +2403,14 @@ static struct clk_rcg usb_fs1_xcvr_fs_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "usb_fs1_xcvr_fs_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_RATE_GATE,
                },
        }
 };
 
-static const char * const usb_fs1_xcvr_fs_src_p[] = { "usb_fs1_xcvr_fs_src" };
-
 static struct clk_branch usb_fs1_xcvr_fs_clk = {
        .halt_reg = 0x2fcc,
        .halt_bit = 15,
@@ -2335,7 +2419,9 @@ static struct clk_branch usb_fs1_xcvr_fs_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "usb_fs1_xcvr_fs_clk",
-                       .parent_names = usb_fs1_xcvr_fs_src_p,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb_fs1_xcvr_fs_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2350,7 +2436,9 @@ static struct clk_branch usb_fs1_system_clk = {
                .enable_reg = 0x296c,
                .enable_mask = BIT(4),
                .hw.init = &(struct clk_init_data){
-                       .parent_names = usb_fs1_xcvr_fs_src_p,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb_fs1_xcvr_fs_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .name = "usb_fs1_system_clk",
                        .ops = &clk_branch_ops,
@@ -2384,16 +2472,14 @@ static struct clk_rcg usb_fs2_xcvr_fs_src = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "usb_fs2_xcvr_fs_src",
-                       .parent_names = gcc_pxo_pll8,
-                       .num_parents = 2,
+                       .parent_data = gcc_pxo_pll8,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_RATE_GATE,
                },
        }
 };
 
-static const char * const usb_fs2_xcvr_fs_src_p[] = { "usb_fs2_xcvr_fs_src" };
-
 static struct clk_branch usb_fs2_xcvr_fs_clk = {
        .halt_reg = 0x2fcc,
        .halt_bit = 12,
@@ -2402,7 +2488,9 @@ static struct clk_branch usb_fs2_xcvr_fs_clk = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "usb_fs2_xcvr_fs_clk",
-                       .parent_names = usb_fs2_xcvr_fs_src_p,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb_fs2_xcvr_fs_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2418,7 +2506,9 @@ static struct clk_branch usb_fs2_system_clk = {
                .enable_mask = BIT(4),
                .hw.init = &(struct clk_init_data){
                        .name = "usb_fs2_system_clk",
-                       .parent_names = usb_fs2_xcvr_fs_src_p,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &usb_fs2_xcvr_fs_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2872,8 +2962,8 @@ static struct clk_rcg ce3_src = {
                .enable_mask = BIT(7),
                .hw.init = &(struct clk_init_data){
                        .name = "ce3_src",
-                       .parent_names = gcc_pxo_pll8_pll3,
-                       .num_parents = 3,
+                       .parent_data = gcc_pxo_pll8_pll3,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll3),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_RATE_GATE,
                },
@@ -2888,7 +2978,9 @@ static struct clk_branch ce3_core_clk = {
                .enable_mask = BIT(4),
                .hw.init = &(struct clk_init_data){
                        .name = "ce3_core_clk",
-                       .parent_names = (const char *[]){ "ce3_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &ce3_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2904,7 +2996,9 @@ static struct clk_branch ce3_h_clk = {
                .enable_mask = BIT(4),
                .hw.init = &(struct clk_init_data){
                        .name = "ce3_h_clk",
-                       .parent_names = (const char *[]){ "ce3_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &ce3_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2934,8 +3028,8 @@ static struct clk_rcg sata_clk_src = {
                .enable_mask = BIT(7),
                .hw.init = &(struct clk_init_data){
                        .name = "sata_clk_src",
-                       .parent_names = gcc_pxo_pll8_pll3,
-                       .num_parents = 3,
+                       .parent_data = gcc_pxo_pll8_pll3,
+                       .num_parents = ARRAY_SIZE(gcc_pxo_pll8_pll3),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_RATE_GATE,
                },
@@ -2950,7 +3044,9 @@ static struct clk_branch sata_rxoob_clk = {
                .enable_mask = BIT(4),
                .hw.init = &(struct clk_init_data){
                        .name = "sata_rxoob_clk",
-                       .parent_names = (const char *[]){ "sata_clk_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &sata_clk_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2966,7 +3062,9 @@ static struct clk_branch sata_pmalive_clk = {
                .enable_mask = BIT(4),
                .hw.init = &(struct clk_init_data){
                        .name = "sata_pmalive_clk",
-                       .parent_names = (const char *[]){ "sata_clk_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &sata_clk_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2982,7 +3080,9 @@ static struct clk_branch sata_phy_ref_clk = {
                .enable_mask = BIT(4),
                .hw.init = &(struct clk_init_data){
                        .name = "sata_phy_ref_clk",
-                       .parent_names = (const char *[]){ "pxo" },
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "pxo", .name = "pxo_board",
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                },
index b6fa7b8..7792b8f 100644 (file)
@@ -54,33 +54,9 @@ static const struct pll_vco spark_vco[] = {
        { 750000000, 1500000000, 1 },
 };
 
-static const u8 clk_alpha_pll_regs_offset[][PLL_OFF_MAX_REGS] = {
-       [CLK_ALPHA_PLL_TYPE_DEFAULT] =  {
-               [PLL_OFF_L_VAL] = 0x04,
-               [PLL_OFF_ALPHA_VAL] = 0x08,
-               [PLL_OFF_ALPHA_VAL_U] = 0x0c,
-               [PLL_OFF_TEST_CTL] = 0x10,
-               [PLL_OFF_TEST_CTL_U] = 0x14,
-               [PLL_OFF_USER_CTL] = 0x18,
-               [PLL_OFF_USER_CTL_U] = 0x1C,
-               [PLL_OFF_CONFIG_CTL] = 0x20,
-               [PLL_OFF_STATUS] = 0x24,
-       },
-       [CLK_ALPHA_PLL_TYPE_BRAMMO] =  {
-               [PLL_OFF_L_VAL] = 0x04,
-               [PLL_OFF_ALPHA_VAL] = 0x08,
-               [PLL_OFF_ALPHA_VAL_U] = 0x0c,
-               [PLL_OFF_TEST_CTL] = 0x10,
-               [PLL_OFF_TEST_CTL_U] = 0x14,
-               [PLL_OFF_USER_CTL] = 0x18,
-               [PLL_OFF_CONFIG_CTL] = 0x1C,
-               [PLL_OFF_STATUS] = 0x20,
-       },
-};
-
 static struct clk_alpha_pll gpll0 = {
        .offset = 0x0,
-       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr = {
                .enable_reg = 0x79000,
                .enable_mask = BIT(0),
@@ -106,7 +82,7 @@ static struct clk_alpha_pll_postdiv gpll0_out_aux2 = {
        .post_div_table = post_div_table_gpll0_out_aux2,
        .num_post_div = ARRAY_SIZE(post_div_table_gpll0_out_aux2),
        .width = 4,
-       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll0_out_aux2",
                .parent_hws = (const struct clk_hw *[]){ &gpll0.clkr.hw },
@@ -117,7 +93,7 @@ static struct clk_alpha_pll_postdiv gpll0_out_aux2 = {
 
 static struct clk_alpha_pll gpll1 = {
        .offset = 0x1000,
-       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr = {
                .enable_reg = 0x79000,
                .enable_mask = BIT(1),
@@ -147,7 +123,7 @@ static struct clk_alpha_pll gpll10 = {
        .offset = 0xa000,
        .vco_table = spark_vco,
        .num_vco = ARRAY_SIZE(spark_vco),
-       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr = {
                .enable_reg = 0x79000,
                .enable_mask = BIT(10),
@@ -179,7 +155,7 @@ static struct clk_alpha_pll gpll11 = {
        .offset = 0xb000,
        .vco_table = default_vco,
        .num_vco = ARRAY_SIZE(default_vco),
-       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .flags = SUPPORTS_DYNAMIC_UPDATE,
        .clkr = {
                .enable_reg = 0x79000,
@@ -197,7 +173,7 @@ static struct clk_alpha_pll gpll11 = {
 
 static struct clk_alpha_pll gpll3 = {
        .offset = 0x3000,
-       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr = {
                .enable_reg = 0x79000,
                .enable_mask = BIT(3),
@@ -223,7 +199,7 @@ static struct clk_alpha_pll_postdiv gpll3_out_main = {
        .post_div_table = post_div_table_gpll3_out_main,
        .num_post_div = ARRAY_SIZE(post_div_table_gpll3_out_main),
        .width = 4,
-       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll3_out_main",
                .parent_hws = (const struct clk_hw *[]){ &gpll3.clkr.hw },
@@ -234,7 +210,7 @@ static struct clk_alpha_pll_postdiv gpll3_out_main = {
 
 static struct clk_alpha_pll gpll4 = {
        .offset = 0x4000,
-       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr = {
                .enable_reg = 0x79000,
                .enable_mask = BIT(4),
@@ -251,7 +227,7 @@ static struct clk_alpha_pll gpll4 = {
 
 static struct clk_alpha_pll gpll5 = {
        .offset = 0x5000,
-       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr = {
                .enable_reg = 0x79000,
                .enable_mask = BIT(5),
@@ -268,7 +244,7 @@ static struct clk_alpha_pll gpll5 = {
 
 static struct clk_alpha_pll gpll6 = {
        .offset = 0x6000,
-       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr = {
                .enable_reg = 0x79000,
                .enable_mask = BIT(6),
@@ -294,7 +270,7 @@ static struct clk_alpha_pll_postdiv gpll6_out_main = {
        .post_div_table = post_div_table_gpll6_out_main,
        .num_post_div = ARRAY_SIZE(post_div_table_gpll6_out_main),
        .width = 4,
-       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll6_out_main",
                .parent_hws = (const struct clk_hw *[]){ &gpll6.clkr.hw },
@@ -305,7 +281,7 @@ static struct clk_alpha_pll_postdiv gpll6_out_main = {
 
 static struct clk_alpha_pll gpll7 = {
        .offset = 0x7000,
-       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr = {
                .enable_reg = 0x79000,
                .enable_mask = BIT(7),
@@ -340,7 +316,7 @@ static struct clk_alpha_pll gpll8 = {
        .offset = 0x8000,
        .vco_table = default_vco,
        .num_vco = ARRAY_SIZE(default_vco),
-       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .flags = SUPPORTS_DYNAMIC_UPDATE,
        .clkr = {
                .enable_reg = 0x79000,
@@ -367,7 +343,7 @@ static struct clk_alpha_pll_postdiv gpll8_out_main = {
        .post_div_table = post_div_table_gpll8_out_main,
        .num_post_div = ARRAY_SIZE(post_div_table_gpll8_out_main),
        .width = 4,
-       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll8_out_main",
                .parent_hws = (const struct clk_hw *[]){ &gpll8.clkr.hw },
@@ -393,7 +369,7 @@ static struct clk_alpha_pll gpll9 = {
        .offset = 0x9000,
        .vco_table = brammo_vco,
        .num_vco = ARRAY_SIZE(brammo_vco),
-       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_BRAMMO],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_BRAMMO_EVO],
        .clkr = {
                .enable_reg = 0x79000,
                .enable_mask = BIT(9),
@@ -419,7 +395,7 @@ static struct clk_alpha_pll_postdiv gpll9_out_main = {
        .post_div_table = post_div_table_gpll9_out_main,
        .num_post_div = ARRAY_SIZE(post_div_table_gpll9_out_main),
        .width = 2,
-       .regs = clk_alpha_pll_regs_offset[CLK_ALPHA_PLL_TYPE_BRAMMO],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_BRAMMO_EVO],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll9_out_main",
                .parent_hws = (const struct clk_hw *[]){ &gpll9.clkr.hw },
index c2ea099..2d39802 100644 (file)
@@ -2224,7 +2224,7 @@ static struct gdsc usb30_prim_gdsc = {
        .pd = {
                .name = "usb30_prim_gdsc",
        },
-       .pwrsts = PWRSTS_OFF_ON,
+       .pwrsts = PWRSTS_RET_ON,
 };
 
 static struct gdsc hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc = {
index 7ff64d4..8afb757 100644 (file)
@@ -3108,7 +3108,7 @@ static struct gdsc gcc_pcie_1_gdsc = {
        .pd = {
                .name = "gcc_pcie_1_gdsc",
        },
-       .pwrsts = PWRSTS_OFF_ON,
+       .pwrsts = PWRSTS_RET_ON,
        .flags = VOTABLE,
 };
 
@@ -3126,7 +3126,7 @@ static struct gdsc gcc_usb30_prim_gdsc = {
        .pd = {
                .name = "gcc_usb30_prim_gdsc",
        },
-       .pwrsts = PWRSTS_OFF_ON,
+       .pwrsts = PWRSTS_RET_ON,
        .flags = VOTABLE,
 };
 
@@ -3135,7 +3135,7 @@ static struct gdsc gcc_usb30_sec_gdsc = {
        .pd = {
                .name = "gcc_usb30_sec_gdsc",
        },
-       .pwrsts = PWRSTS_OFF_ON,
+       .pwrsts = PWRSTS_RET_ON,
        .flags = VOTABLE,
 };
 
index a2f3ffc..a18ed88 100644 (file)
@@ -6768,6 +6768,10 @@ static struct gdsc pcie_1_tunnel_gdsc = {
        .flags = VOTABLE,
 };
 
+/*
+ * The Qualcomm PCIe driver does not yet implement suspend so to keep the
+ * PCIe power domains always-on for now.
+ */
 static struct gdsc pcie_2a_gdsc = {
        .gdscr = 0x9d004,
        .collapse_ctrl = 0x52128,
@@ -6776,7 +6780,7 @@ static struct gdsc pcie_2a_gdsc = {
                .name = "pcie_2a_gdsc",
        },
        .pwrsts = PWRSTS_OFF_ON,
-       .flags = VOTABLE,
+       .flags = VOTABLE | ALWAYS_ON,
 };
 
 static struct gdsc pcie_2b_gdsc = {
@@ -6787,7 +6791,7 @@ static struct gdsc pcie_2b_gdsc = {
                .name = "pcie_2b_gdsc",
        },
        .pwrsts = PWRSTS_OFF_ON,
-       .flags = VOTABLE,
+       .flags = VOTABLE | ALWAYS_ON,
 };
 
 static struct gdsc pcie_3a_gdsc = {
@@ -6798,7 +6802,7 @@ static struct gdsc pcie_3a_gdsc = {
                .name = "pcie_3a_gdsc",
        },
        .pwrsts = PWRSTS_OFF_ON,
-       .flags = VOTABLE,
+       .flags = VOTABLE | ALWAYS_ON,
 };
 
 static struct gdsc pcie_3b_gdsc = {
@@ -6809,7 +6813,7 @@ static struct gdsc pcie_3b_gdsc = {
                .name = "pcie_3b_gdsc",
        },
        .pwrsts = PWRSTS_OFF_ON,
-       .flags = VOTABLE,
+       .flags = VOTABLE | ALWAYS_ON,
 };
 
 static struct gdsc pcie_4_gdsc = {
@@ -6820,7 +6824,7 @@ static struct gdsc pcie_4_gdsc = {
                .name = "pcie_4_gdsc",
        },
        .pwrsts = PWRSTS_OFF_ON,
-       .flags = VOTABLE,
+       .flags = VOTABLE | ALWAYS_ON,
 };
 
 static struct gdsc ufs_card_gdsc = {
@@ -6844,7 +6848,7 @@ static struct gdsc usb30_mp_gdsc = {
        .pd = {
                .name = "usb30_mp_gdsc",
        },
-       .pwrsts = PWRSTS_OFF_ON,
+       .pwrsts = PWRSTS_RET_ON,
 };
 
 static struct gdsc usb30_prim_gdsc = {
@@ -6852,7 +6856,7 @@ static struct gdsc usb30_prim_gdsc = {
        .pd = {
                .name = "usb30_prim_gdsc",
        },
-       .pwrsts = PWRSTS_OFF_ON,
+       .pwrsts = PWRSTS_RET_ON,
 };
 
 static struct gdsc usb30_sec_gdsc = {
@@ -6860,7 +6864,7 @@ static struct gdsc usb30_sec_gdsc = {
        .pd = {
                .name = "usb30_sec_gdsc",
        },
-       .pwrsts = PWRSTS_OFF_ON,
+       .pwrsts = PWRSTS_RET_ON,
 };
 
 static struct clk_regmap *gcc_sc8280xp_clocks[] = {
index 9b97425..db918c9 100644 (file)
@@ -757,7 +757,7 @@ static struct clk_rcg2 sdcc1_apps_clk_src = {
                .name = "sdcc1_apps_clk_src",
                .parent_data = gcc_parent_data_xo_gpll0_gpll4_gpll0_early_div,
                .num_parents = ARRAY_SIZE(gcc_parent_data_xo_gpll0_gpll4_gpll0_early_div),
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_floor_ops,
        },
 };
 
index 58aa3ec..6af08e0 100644 (file)
@@ -31,6 +31,7 @@ enum {
        P_GPLL0_OUT_EVEN,
        P_GPLL0_OUT_MAIN,
        P_GPLL4_OUT_MAIN,
+       P_GPLL6_OUT_MAIN,
        P_SLEEP_CLK,
 };
 
@@ -68,6 +69,23 @@ static struct clk_alpha_pll gpll4 = {
        },
 };
 
+static struct clk_alpha_pll gpll6 = {
+       .offset = 0x13000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
+       .clkr = {
+               .enable_reg = 0x52000,
+               .enable_mask = BIT(6),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll6",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "bi_tcxo", .name = "bi_tcxo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_fixed_fabia_ops,
+               },
+       },
+};
+
 static const struct clk_div_table post_div_table_fabia_even[] = {
        { 0x0, 1 },
        { 0x1, 2 },
@@ -194,6 +212,19 @@ static const struct clk_parent_data gcc_parent_data_10[] = {
        { .hw = &gpll0_out_even.clkr.hw },
 };
 
+static const struct parent_map gcc_parent_map_11[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL6_OUT_MAIN, 2 },
+       { P_GPLL0_OUT_EVEN, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_11[] = {
+       { .fw_name = "bi_tcxo", .name = "bi_tcxo" },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll6.clkr.hw },
+       { .hw = &gpll0_out_even.clkr.hw },
+};
 
 static const struct freq_tbl ftbl_gcc_cpuss_ahb_clk_src[] = {
        F(19200000, P_BI_TCXO, 1, 0, 0),
@@ -233,6 +264,26 @@ static struct clk_rcg2 gcc_cpuss_rbcpr_clk_src = {
        },
 };
 
+static const struct freq_tbl ftbl_gcc_sdm670_cpuss_rbcpr_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(50000000, P_GPLL0_OUT_MAIN, 12, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_sdm670_cpuss_rbcpr_clk_src = {
+       .cmd_rcgr = 0x4815c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_3,
+       .freq_tbl = ftbl_gcc_sdm670_cpuss_rbcpr_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_cpuss_rbcpr_clk_src",
+               .parent_data = gcc_parent_data_8_ao,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_8_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),
@@ -656,6 +707,54 @@ static struct clk_rcg2 gcc_qupv3_wrap1_s7_clk_src = {
        .clkr.hw.init = &gcc_qupv3_wrap1_s7_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_EVEN, 5, 1, 3),
+       F(25000000, P_GPLL0_OUT_EVEN, 6, 1, 2),
+       F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0),
+       F(100000000, P_GPLL0_OUT_MAIN, 6, 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 = 0x26028,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_11,
+       .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_11,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_11),
+               .ops = &clk_rcg2_floor_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_sdcc1_ice_core_clk_src[] = {
+       F(75000000, P_GPLL0_OUT_EVEN, 4, 0, 0),
+       F(150000000, P_GPLL0_OUT_MAIN, 4, 0, 0),
+       F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
+       F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_sdcc1_ice_core_clk_src = {
+       .cmd_rcgr = 0x26010,
+       .mnd_width = 8,
+       .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_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_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(9600000, P_BI_TCXO, 2, 0, 0),
@@ -705,6 +804,31 @@ static struct clk_rcg2 gcc_sdcc4_apps_clk_src = {
        },
 };
 
+static const struct freq_tbl ftbl_gcc_sdm670_sdcc4_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_EVEN, 12, 0, 0),
+       F(33333333, P_GPLL0_OUT_EVEN, 9, 0, 0),
+       F(50000000, P_GPLL0_OUT_MAIN, 12, 0, 0),
+       F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_sdm670_sdcc4_apps_clk_src = {
+       .cmd_rcgr = 0x1600c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_sdm670_sdcc4_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_sdcc4_apps_clk_src",
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+               .ops = &clk_rcg2_floor_ops,
+       },
+};
+
 static const struct freq_tbl ftbl_gcc_tsif_ref_clk_src[] = {
        F(105495, P_BI_TCXO, 2, 1, 91),
        { }
@@ -1283,6 +1407,28 @@ static struct clk_branch gcc_cpuss_rbcpr_clk = {
        },
 };
 
+/*
+ * The source clock frequencies are different for SDM670; define a child clock
+ * pointing to the source clock that uses SDM670 frequencies.
+ */
+static struct clk_branch gcc_sdm670_cpuss_rbcpr_clk = {
+       .halt_reg = 0x48008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x48008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_cpuss_rbcpr_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_sdm670_cpuss_rbcpr_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
 static struct clk_branch gcc_ddrss_gpu_axi_clk = {
        .halt_reg = 0x44038,
        .halt_check = BRANCH_VOTED,
@@ -2353,6 +2499,55 @@ static struct clk_branch gcc_qupv3_wrap_1_s_ahb_clk = {
        },
 };
 
+static struct clk_branch gcc_sdcc1_ahb_clk = {
+       .halt_reg = 0x26008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x26008,
+               .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 = 0x26004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x26004,
+               .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 = 0x2600c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2600c,
+               .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 = 0x14008,
        .halt_check = BRANCH_HALT,
@@ -2415,6 +2610,28 @@ static struct clk_branch gcc_sdcc4_apps_clk = {
        },
 };
 
+/*
+ * The source clock frequencies are different for SDM670; define a child clock
+ * pointing to the source clock that uses SDM670 frequencies.
+ */
+static struct clk_branch gcc_sdm670_sdcc4_apps_clk = {
+       .halt_reg = 0x16004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x16004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_sdcc4_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_sdm670_sdcc4_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 = 0x414c,
        .halt_check = BRANCH_HALT_VOTED,
@@ -3308,6 +3525,155 @@ static struct gdsc hlos1_vote_mmnoc_mmu_tbu_sf_gdsc = {
        .flags = VOTABLE,
 };
 
+static struct clk_regmap *gcc_sdm670_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_APC_VS_CLK] = &gcc_apc_vs_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_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_RBCPR_CLK] = &gcc_sdm670_cpuss_rbcpr_clk.clkr,
+       [GCC_CPUSS_RBCPR_CLK_SRC] = &gcc_sdm670_cpuss_rbcpr_clk_src.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_GPLL0_CLK_SRC] = &gcc_disp_gpll0_clk_src.clkr,
+       [GCC_DISP_GPLL0_DIV_CLK_SRC] = &gcc_disp_gpll0_div_clk_src.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_VS_CLK] = &gcc_gpu_vs_clk.clkr,
+       [GCC_MSS_AXIS2_CLK] = &gcc_mss_axis2_clk.clkr,
+       [GCC_MSS_CFG_AHB_CLK] = &gcc_mss_cfg_ahb_clk.clkr,
+       [GCC_MSS_GPLL0_DIV_CLK_SRC] = &gcc_mss_gpll0_div_clk_src.clkr,
+       [GCC_MSS_MFAB_AXIS_CLK] = &gcc_mss_mfab_axis_clk.clkr,
+       [GCC_MSS_Q6_MEMNOC_AXI_CLK] = &gcc_mss_q6_memnoc_axi_clk.clkr,
+       [GCC_MSS_SNOC_AXI_CLK] = &gcc_mss_snoc_axi_clk.clkr,
+       [GCC_MSS_VS_CLK] = &gcc_mss_vs_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_AHB_CLK] = &gcc_qmip_camera_ahb_clk.clkr,
+       [GCC_QMIP_DISP_AHB_CLK] = &gcc_qmip_disp_ahb_clk.clkr,
+       [GCC_QMIP_VIDEO_AHB_CLK] = &gcc_qmip_video_ahb_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_WRAP0_S6_CLK] = &gcc_qupv3_wrap0_s6_clk.clkr,
+       [GCC_QUPV3_WRAP0_S6_CLK_SRC] = &gcc_qupv3_wrap0_s6_clk_src.clkr,
+       [GCC_QUPV3_WRAP0_S7_CLK] = &gcc_qupv3_wrap0_s7_clk.clkr,
+       [GCC_QUPV3_WRAP0_S7_CLK_SRC] = &gcc_qupv3_wrap0_s7_clk_src.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_WRAP1_S6_CLK] = &gcc_qupv3_wrap1_s6_clk.clkr,
+       [GCC_QUPV3_WRAP1_S6_CLK_SRC] = &gcc_qupv3_wrap1_s6_clk_src.clkr,
+       [GCC_QUPV3_WRAP1_S7_CLK] = &gcc_qupv3_wrap1_s7_clk.clkr,
+       [GCC_QUPV3_WRAP1_S7_CLK_SRC] = &gcc_qupv3_wrap1_s7_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_SRC] = &gcc_sdcc1_ice_core_clk_src.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_SDCC2_APPS_CLK_SRC] = &gcc_sdcc2_apps_clk_src.clkr,
+       [GCC_SDCC4_AHB_CLK] = &gcc_sdcc4_ahb_clk.clkr,
+       [GCC_SDCC4_APPS_CLK] = &gcc_sdm670_sdcc4_apps_clk.clkr,
+       [GCC_SDCC4_APPS_CLK_SRC] = &gcc_sdm670_sdcc4_apps_clk_src.clkr,
+       [GCC_SYS_NOC_CPUSS_AHB_CLK] = &gcc_sys_noc_cpuss_ahb_clk.clkr,
+       [GCC_TSIF_AHB_CLK] = &gcc_tsif_ahb_clk.clkr,
+       [GCC_TSIF_INACTIVITY_TIMERS_CLK] =
+                                       &gcc_tsif_inactivity_timers_clk.clkr,
+       [GCC_TSIF_REF_CLK] = &gcc_tsif_ref_clk.clkr,
+       [GCC_TSIF_REF_CLK_SRC] = &gcc_tsif_ref_clk_src.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_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_USB_PHY_CFG_AHB2PHY_CLK] = &gcc_usb_phy_cfg_ahb2phy_clk.clkr,
+       [GCC_VDDA_VS_CLK] = &gcc_vdda_vs_clk.clkr,
+       [GCC_VDDCX_VS_CLK] = &gcc_vddcx_vs_clk.clkr,
+       [GCC_VDDMX_VS_CLK] = &gcc_vddmx_vs_clk.clkr,
+       [GCC_VIDEO_AHB_CLK] = &gcc_video_ahb_clk.clkr,
+       [GCC_VIDEO_AXI_CLK] = &gcc_video_axi_clk.clkr,
+       [GCC_VIDEO_XO_CLK] = &gcc_video_xo_clk.clkr,
+       [GCC_VS_CTRL_AHB_CLK] = &gcc_vs_ctrl_ahb_clk.clkr,
+       [GCC_VS_CTRL_CLK] = &gcc_vs_ctrl_clk.clkr,
+       [GCC_VS_CTRL_CLK_SRC] = &gcc_vs_ctrl_clk_src.clkr,
+       [GCC_VSENSOR_CLK_SRC] = &gcc_vsensor_clk_src.clkr,
+       [GPLL0] = &gpll0.clkr,
+       [GPLL0_OUT_EVEN] = &gpll0_out_even.clkr,
+       [GPLL4] = &gpll4.clkr,
+       [GPLL6] = &gpll6.clkr,
+       [GCC_CPUSS_DVM_BUS_CLK] = &gcc_cpuss_dvm_bus_clk.clkr,
+       [GCC_CPUSS_GNOC_CLK] = &gcc_cpuss_gnoc_clk.clkr,
+       [GCC_QSPI_CORE_CLK_SRC] = &gcc_qspi_core_clk_src.clkr,
+       [GCC_QSPI_CORE_CLK] = &gcc_qspi_core_clk.clkr,
+       [GCC_QSPI_CNOC_PERIPH_AHB_CLK] = &gcc_qspi_cnoc_periph_ahb_clk.clkr,
+};
+
 static struct clk_regmap *gcc_sdm845_clocks[] = {
        [GCC_AGGRE_NOC_PCIE_TBU_CLK] = &gcc_aggre_noc_pcie_tbu_clk.clkr,
        [GCC_AGGRE_UFS_CARD_AXI_CLK] = &gcc_aggre_ufs_card_axi_clk.clkr,
@@ -3533,6 +3899,22 @@ static const struct qcom_reset_map gcc_sdm845_resets[] = {
        [GCC_PCIE_1_PHY_BCR] = { 0x8e01c },
 };
 
+static struct gdsc *gcc_sdm670_gdscs[] = {
+       [UFS_PHY_GDSC] = &ufs_phy_gdsc,
+       [USB30_PRIM_GDSC] = &usb30_prim_gdsc,
+       [HLOS1_VOTE_AGGRE_NOC_MMU_AUDIO_TBU_GDSC] =
+                       &hlos1_vote_aggre_noc_mmu_audio_tbu_gdsc,
+       [HLOS1_VOTE_AGGRE_NOC_MMU_TBU1_GDSC] =
+                       &hlos1_vote_aggre_noc_mmu_tbu1_gdsc,
+       [HLOS1_VOTE_AGGRE_NOC_MMU_TBU2_GDSC] =
+                       &hlos1_vote_aggre_noc_mmu_tbu2_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,
+       [HLOS1_VOTE_MMNOC_MMU_TBU_SF_GDSC] = &hlos1_vote_mmnoc_mmu_tbu_sf_gdsc,
+};
+
 static struct gdsc *gcc_sdm845_gdscs[] = {
        [PCIE_0_GDSC] = &pcie_0_gdsc,
        [PCIE_1_GDSC] = &pcie_1_gdsc,
@@ -3563,6 +3945,17 @@ static const struct regmap_config gcc_sdm845_regmap_config = {
        .fast_io        = true,
 };
 
+static const struct qcom_cc_desc gcc_sdm670_desc = {
+       .config = &gcc_sdm845_regmap_config,
+       .clks = gcc_sdm670_clocks,
+       .num_clks = ARRAY_SIZE(gcc_sdm670_clocks),
+       /* Snapdragon 670 can function without its own exclusive resets. */
+       .resets = gcc_sdm845_resets,
+       .num_resets = ARRAY_SIZE(gcc_sdm845_resets),
+       .gdscs = gcc_sdm670_gdscs,
+       .num_gdscs = ARRAY_SIZE(gcc_sdm670_gdscs),
+};
+
 static const struct qcom_cc_desc gcc_sdm845_desc = {
        .config = &gcc_sdm845_regmap_config,
        .clks = gcc_sdm845_clocks,
@@ -3574,7 +3967,8 @@ static const struct qcom_cc_desc gcc_sdm845_desc = {
 };
 
 static const struct of_device_id gcc_sdm845_match_table[] = {
-       { .compatible = "qcom,gcc-sdm845" },
+       { .compatible = "qcom,gcc-sdm670", .data = &gcc_sdm670_desc },
+       { .compatible = "qcom,gcc-sdm845", .data = &gcc_sdm845_desc },
        { }
 };
 MODULE_DEVICE_TABLE(of, gcc_sdm845_match_table);
@@ -3600,6 +3994,7 @@ static const struct clk_rcg_dfs_data gcc_dfs_clocks[] = {
 
 static int gcc_sdm845_probe(struct platform_device *pdev)
 {
+       const struct qcom_cc_desc *gcc_desc;
        struct regmap *regmap;
        int ret;
 
@@ -3616,7 +4011,8 @@ static int gcc_sdm845_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
-       return qcom_cc_really_probe(pdev, &gcc_sdm845_desc, regmap);
+       gcc_desc = of_device_get_match_data(&pdev->dev);
+       return qcom_cc_really_probe(pdev, gcc_desc, regmap);
 }
 
 static struct platform_driver gcc_sdm845_driver = {
index 68fe9f6..565f991 100644 (file)
@@ -57,7 +57,7 @@ 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],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr = {
                .enable_reg = 0x79000,
                .enable_mask = BIT(0),
@@ -83,7 +83,7 @@ static struct clk_alpha_pll_postdiv gpll0_out_aux2 = {
        .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],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll0_out_aux2",
                .parent_hws = (const struct clk_hw *[]){ &gpll0.clkr.hw },
@@ -92,18 +92,6 @@ static struct clk_alpha_pll_postdiv gpll0_out_aux2 = {
        },
 };
 
-/* 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 },
        { }
@@ -115,7 +103,7 @@ static struct clk_alpha_pll_postdiv gpll0_out_main = {
        .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],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll0_out_main",
                .parent_hws = (const struct clk_hw *[]){ &gpll0.clkr.hw },
@@ -137,7 +125,7 @@ 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],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr = {
                .enable_reg = 0x79000,
                .enable_mask = BIT(10),
@@ -163,7 +151,7 @@ static struct clk_alpha_pll_postdiv gpll10_out_main = {
        .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],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll10_out_main",
                .parent_hws = (const struct clk_hw *[]){ &gpll10.clkr.hw },
@@ -189,7 +177,7 @@ static struct clk_alpha_pll gpll11 = {
        .vco_table = default_vco,
        .num_vco = ARRAY_SIZE(default_vco),
        .flags = SUPPORTS_DYNAMIC_UPDATE,
-       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr = {
                .enable_reg = 0x79000,
                .enable_mask = BIT(11),
@@ -215,7 +203,7 @@ static struct clk_alpha_pll_postdiv gpll11_out_main = {
        .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],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll11_out_main",
                .parent_hws = (const struct clk_hw *[]){ &gpll11.clkr.hw },
@@ -229,7 +217,7 @@ 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],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr = {
                .enable_reg = 0x79000,
                .enable_mask = BIT(3),
@@ -248,7 +236,7 @@ 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],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr = {
                .enable_reg = 0x79000,
                .enable_mask = BIT(4),
@@ -274,7 +262,7 @@ static struct clk_alpha_pll_postdiv gpll4_out_main = {
        .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],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll4_out_main",
                .parent_hws = (const struct clk_hw *[]){ &gpll4.clkr.hw },
@@ -287,7 +275,7 @@ 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],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr = {
                .enable_reg = 0x79000,
                .enable_mask = BIT(6),
@@ -313,7 +301,7 @@ static struct clk_alpha_pll_postdiv gpll6_out_main = {
        .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],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll6_out_main",
                .parent_hws = (const struct clk_hw *[]){ &gpll6.clkr.hw },
@@ -326,7 +314,7 @@ 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],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr = {
                .enable_reg = 0x79000,
                .enable_mask = BIT(7),
@@ -352,7 +340,7 @@ static struct clk_alpha_pll_postdiv gpll7_out_main = {
        .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],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll7_out_main",
                .parent_hws = (const struct clk_hw *[]){ &gpll7.clkr.hw },
@@ -380,7 +368,7 @@ 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],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .flags = SUPPORTS_DYNAMIC_UPDATE,
        .clkr = {
                .enable_reg = 0x79000,
@@ -407,7 +395,7 @@ static struct clk_alpha_pll_postdiv gpll8_out_main = {
        .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],
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT_EVO],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll8_out_main",
                .parent_hws = (const struct clk_hw *[]){ &gpll8.clkr.hw },
@@ -431,7 +419,7 @@ static struct clk_alpha_pll gpll9 = {
        .offset = 0x9000,
        .vco_table = gpll9_vco,
        .num_vco = ARRAY_SIZE(gpll9_vco),
-       .regs = clk_gpll9_regs,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_BRAMMO_EVO],
        .clkr = {
                .enable_reg = 0x79000,
                .enable_mask = BIT(9),
@@ -457,7 +445,7 @@ static struct clk_alpha_pll_postdiv gpll9_out_main = {
        .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,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_BRAMMO_EVO],
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gpll9_out_main",
                .parent_hws = (const struct clk_hw *[]){ &gpll9.clkr.hw },
index 6941240..9b4e4bb 100644 (file)
@@ -2316,7 +2316,7 @@ static struct gdsc usb30_prim_gdsc = {
        .pd = {
                .name = "usb30_prim_gdsc",
        },
-       .pwrsts = PWRSTS_OFF_ON,
+       .pwrsts = PWRSTS_RET_ON,
 };
 
 static struct gdsc ufs_phy_gdsc = {
diff --git a/drivers/clk/qcom/gcc-sm6375.c b/drivers/clk/qcom/gcc-sm6375.c
new file mode 100644 (file)
index 0000000..89a1cc9
--- /dev/null
@@ -0,0 +1,3919 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022, Konrad Dybcio <konrad.dybcio@somainline.org>
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/regmap.h>
+
+#include <dt-bindings/clock/qcom,sm6375-gcc.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 "clk-regmap-phy-mux.h"
+#include "gdsc.h"
+#include "reset.h"
+
+enum {
+       DT_BI_TCXO,
+       DT_BI_TCXO_AO,
+       DT_SLEEP_CLK
+};
+
+enum {
+       P_BI_TCXO,
+       P_GPLL0_OUT_EVEN,
+       P_GPLL0_OUT_MAIN,
+       P_GPLL0_OUT_ODD,
+       P_GPLL10_OUT_EVEN,
+       P_GPLL11_OUT_EVEN,
+       P_GPLL11_OUT_ODD,
+       P_GPLL3_OUT_EVEN,
+       P_GPLL3_OUT_MAIN,
+       P_GPLL4_OUT_EVEN,
+       P_GPLL5_OUT_EVEN,
+       P_GPLL6_OUT_EVEN,
+       P_GPLL6_OUT_MAIN,
+       P_GPLL7_OUT_EVEN,
+       P_GPLL8_OUT_EVEN,
+       P_GPLL8_OUT_MAIN,
+       P_GPLL9_OUT_EARLY,
+       P_GPLL9_OUT_MAIN,
+       P_SLEEP_CLK,
+};
+
+static struct pll_vco lucid_vco[] = {
+       { 249600000, 2000000000, 0 },
+};
+
+static struct pll_vco zonda_vco[] = {
+       { 595200000, 3600000000UL, 0 },
+};
+
+static struct clk_alpha_pll gpll0 = {
+       .offset = 0x0,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr = {
+               .enable_reg = 0x79000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll0",
+                       .parent_data = &(const struct clk_parent_data){
+                               .index = DT_BI_TCXO,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_fixed_lucid_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_LUCID],
+       .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_lucid_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_LUCID],
+       .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_lucid_ops,
+       },
+};
+
+static struct clk_alpha_pll gpll1 = {
+       .offset = 0x1000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr = {
+               .enable_reg = 0x79000,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll1",
+                       .parent_data = &(const struct clk_parent_data){
+                               .index = DT_BI_TCXO,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_lucid_ops,
+               },
+       },
+};
+
+/* 1152MHz Configuration */
+static const struct alpha_pll_config gpll10_config = {
+       .l = 0x3c,
+       .alpha = 0x0,
+       .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 gpll10 = {
+       .offset = 0xa000,
+       .vco_table = lucid_vco,
+       .num_vco = ARRAY_SIZE(lucid_vco),
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .flags = SUPPORTS_FSM_LEGACY_MODE,
+       .clkr = {
+               .enable_reg = 0x79000,
+               .enable_mask = BIT(10),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll10",
+                       .parent_data = &(const struct clk_parent_data){
+                               .index = DT_BI_TCXO,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_fixed_lucid_ops,
+               },
+       },
+};
+
+/* 532MHz Configuration */
+static const struct alpha_pll_config gpll11_config = {
+       .l = 0x1b,
+       .alpha = 0xb555,
+       .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 gpll11 = {
+       .offset = 0xb000,
+       .vco_table = lucid_vco,
+       .num_vco = ARRAY_SIZE(lucid_vco),
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .flags = SUPPORTS_FSM_LEGACY_MODE,
+       .clkr = {
+               .enable_reg = 0x79000,
+               .enable_mask = BIT(11),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll11",
+                       .parent_data = &(const struct clk_parent_data){
+                               .index = DT_BI_TCXO,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_lucid_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll gpll3 = {
+       .offset = 0x3000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr = {
+               .enable_reg = 0x79000,
+               .enable_mask = BIT(3),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll3",
+                       .parent_data = &(const struct clk_parent_data){
+                               .index = DT_BI_TCXO,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_fixed_lucid_ops,
+               },
+       },
+};
+
+static const struct clk_div_table post_div_table_gpll3_out_even[] = {
+       { 0x1, 2 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv gpll3_out_even = {
+       .offset = 0x3000,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_gpll3_out_even,
+       .num_post_div = ARRAY_SIZE(post_div_table_gpll3_out_even),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll3_out_even",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll3.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_lucid_ops,
+       },
+};
+
+static struct clk_alpha_pll gpll4 = {
+       .offset = 0x4000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr = {
+               .enable_reg = 0x79000,
+               .enable_mask = BIT(4),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll4",
+                       .parent_data = &(const struct clk_parent_data){
+                               .index = DT_BI_TCXO,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_fixed_lucid_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll gpll5 = {
+       .offset = 0x5000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr = {
+               .enable_reg = 0x79000,
+               .enable_mask = BIT(5),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll5",
+                       .parent_data = &(const struct clk_parent_data){
+                               .index = DT_BI_TCXO,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_fixed_lucid_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll gpll6 = {
+       .offset = 0x6000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr = {
+               .enable_reg = 0x79000,
+               .enable_mask = BIT(6),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll6",
+                       .parent_data = &(const struct clk_parent_data){
+                               .index = DT_BI_TCXO,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_fixed_lucid_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_LUCID],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll6_out_even",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll6.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_lucid_ops,
+       },
+};
+
+static struct clk_alpha_pll gpll7 = {
+       .offset = 0x7000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr = {
+               .enable_reg = 0x79000,
+               .enable_mask = BIT(7),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll7",
+                       .parent_data = &(const struct clk_parent_data){
+                               .index = DT_BI_TCXO,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_fixed_lucid_ops,
+               },
+       },
+};
+
+/* 400MHz Configuration */
+static const struct alpha_pll_config gpll8_config = {
+       .l = 0x14,
+       .alpha = 0xd555,
+       .config_ctl_val = 0x20485699,
+       .config_ctl_hi_val = 0x00002261,
+       .config_ctl_hi1_val = 0x329a299c,
+       .user_ctl_val = 0x00000101,
+       .user_ctl_hi_val = 0x00000805,
+       .user_ctl_hi1_val = 0x00000000,
+};
+
+static struct clk_alpha_pll gpll8 = {
+       .offset = 0x8000,
+       .vco_table = lucid_vco,
+       .num_vco = ARRAY_SIZE(lucid_vco),
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .flags = SUPPORTS_FSM_LEGACY_MODE,
+       .clkr = {
+               .enable_reg = 0x79000,
+               .enable_mask = BIT(8),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll8",
+                       .parent_data = &(const struct clk_parent_data){
+                               .index = DT_BI_TCXO,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_lucid_ops,
+               },
+       },
+};
+
+static const struct clk_div_table post_div_table_gpll8_out_even[] = {
+       { 0x1, 2 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv gpll8_out_even = {
+       .offset = 0x8000,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_gpll8_out_even,
+       .num_post_div = ARRAY_SIZE(post_div_table_gpll8_out_even),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll8_out_even",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll8.clkr.hw,
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_alpha_pll_postdiv_lucid_ops,
+       },
+};
+
+/* 1440MHz Configuration */
+static const struct alpha_pll_config gpll9_config = {
+       .l = 0x4b,
+       .alpha = 0x0,
+       .config_ctl_val = 0x08200800,
+       .config_ctl_hi_val = 0x05022011,
+       .config_ctl_hi1_val = 0x08000000,
+       .user_ctl_val = 0x00000301,
+};
+
+static struct clk_alpha_pll gpll9 = {
+       .offset = 0x9000,
+       .vco_table = zonda_vco,
+       .num_vco = ARRAY_SIZE(zonda_vco),
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_ZONDA],
+       .clkr = {
+               .enable_reg = 0x79000,
+               .enable_mask = BIT(9),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll9",
+                       .parent_data = &(const struct clk_parent_data){
+                               .index = DT_BI_TCXO,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_zonda_ops,
+               },
+       },
+};
+
+static const struct clk_div_table post_div_table_gpll9_out_main[] = {
+       { 0x3, 4 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv gpll9_out_main = {
+       .offset = 0x9000,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_gpll9_out_main,
+       .num_post_div = ARRAY_SIZE(post_div_table_gpll9_out_main),
+       .width = 2,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_ZONDA],
+       .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_zonda_ops,
+       },
+};
+
+static const struct parent_map gcc_parent_map_0[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL0_OUT_EVEN, 2 },
+};
+
+static const struct clk_parent_data gcc_parent_data_0[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_even.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_1[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL0_OUT_EVEN, 2 },
+       { P_GPLL6_OUT_EVEN, 4 },
+};
+
+static const struct clk_parent_data gcc_parent_data_1[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_even.clkr.hw },
+       { .hw = &gpll6_out_even.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_2[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL0_OUT_EVEN, 2 },
+       { P_GPLL0_OUT_ODD, 4 },
+};
+
+static const struct clk_parent_data gcc_parent_data_2[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_even.clkr.hw },
+       { .hw = &gpll0_out_odd.clkr.hw },
+};
+
+static const struct clk_parent_data gcc_parent_data_2_ao[] = {
+       { .index = DT_BI_TCXO_AO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_even.clkr.hw },
+       { .hw = &gpll0_out_odd.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_3[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL9_OUT_EARLY, 2 },
+       { P_GPLL10_OUT_EVEN, 3 },
+       { P_GPLL9_OUT_MAIN, 4 },
+       { P_GPLL3_OUT_EVEN, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_3[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll9.clkr.hw },
+       { .hw = &gpll10.clkr.hw },
+       { .hw = &gpll9_out_main.clkr.hw },
+       { .hw = &gpll3_out_even.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_4[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL0_OUT_EVEN, 2 },
+       { P_GPLL0_OUT_ODD, 4 },
+       { P_GPLL4_OUT_EVEN, 5 },
+       { P_GPLL3_OUT_EVEN, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_4[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_even.clkr.hw },
+       { .hw = &gpll0_out_odd.clkr.hw },
+       { .hw = &gpll4.clkr.hw },
+       { .hw = &gpll3_out_even.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_5[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL8_OUT_MAIN, 2 },
+       { P_GPLL10_OUT_EVEN, 3 },
+       { P_GPLL9_OUT_MAIN, 4 },
+       { P_GPLL8_OUT_EVEN, 5 },
+       { P_GPLL3_OUT_EVEN, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_5[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll8.clkr.hw },
+       { .hw = &gpll10.clkr.hw },
+       { .hw = &gpll9_out_main.clkr.hw },
+       { .hw = &gpll8_out_even.clkr.hw },
+       { .hw = &gpll3_out_even.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_6[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL8_OUT_MAIN, 2 },
+       { P_GPLL5_OUT_EVEN, 3 },
+       { P_GPLL9_OUT_MAIN, 4 },
+       { P_GPLL8_OUT_EVEN, 5 },
+       { P_GPLL3_OUT_MAIN, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_6[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll8.clkr.hw },
+       { .hw = &gpll5.clkr.hw },
+       { .hw = &gpll9_out_main.clkr.hw },
+       { .hw = &gpll8_out_even.clkr.hw },
+       { .hw = &gpll3.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_7[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL0_OUT_EVEN, 2 },
+       { P_GPLL0_OUT_ODD, 4 },
+       { P_SLEEP_CLK, 5 },
+};
+
+static const struct clk_parent_data gcc_parent_data_7[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_even.clkr.hw },
+       { .hw = &gpll0_out_odd.clkr.hw },
+       { .index = DT_SLEEP_CLK },
+};
+
+static const struct parent_map gcc_parent_map_8[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL0_OUT_EVEN, 2 },
+       { P_GPLL10_OUT_EVEN, 3 },
+       { P_GPLL4_OUT_EVEN, 5 },
+       { P_GPLL3_OUT_MAIN, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_8[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_even.clkr.hw },
+       { .hw = &gpll10.clkr.hw },
+       { .hw = &gpll4.clkr.hw },
+       { .hw = &gpll3.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_9[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL0_OUT_EVEN, 2 },
+       { P_GPLL10_OUT_EVEN, 3 },
+       { P_GPLL9_OUT_MAIN, 4 },
+       { P_GPLL8_OUT_EVEN, 5 },
+       { P_GPLL3_OUT_MAIN, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_9[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_even.clkr.hw },
+       { .hw = &gpll10.clkr.hw },
+       { .hw = &gpll9_out_main.clkr.hw },
+       { .hw = &gpll8_out_even.clkr.hw },
+       { .hw = &gpll3.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_10[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL8_OUT_MAIN, 2 },
+       { P_GPLL10_OUT_EVEN, 3 },
+       { P_GPLL9_OUT_MAIN, 4 },
+       { P_GPLL8_OUT_EVEN, 5 },
+       { P_GPLL3_OUT_MAIN, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_10[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll8.clkr.hw },
+       { .hw = &gpll10.clkr.hw },
+       { .hw = &gpll9_out_main.clkr.hw },
+       { .hw = &gpll8_out_even.clkr.hw },
+       { .hw = &gpll3.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_11[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL8_OUT_MAIN, 2 },
+       { P_GPLL10_OUT_EVEN, 3 },
+       { P_GPLL6_OUT_MAIN, 4 },
+       { P_GPLL3_OUT_EVEN, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_11[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll8.clkr.hw },
+       { .hw = &gpll10.clkr.hw },
+       { .hw = &gpll6.clkr.hw },
+       { .hw = &gpll3_out_even.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_12[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL0_OUT_EVEN, 2 },
+       { P_GPLL7_OUT_EVEN, 3 },
+       { P_GPLL4_OUT_EVEN, 5 },
+};
+
+static const struct clk_parent_data gcc_parent_data_12[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_even.clkr.hw },
+       { .hw = &gpll7.clkr.hw },
+       { .hw = &gpll4.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_13[] = {
+       { P_BI_TCXO, 0 },
+       { P_SLEEP_CLK, 5 },
+};
+
+static const struct clk_parent_data gcc_parent_data_13[] = {
+       { .index = DT_BI_TCXO },
+       { .index = DT_SLEEP_CLK },
+};
+
+static const struct parent_map gcc_parent_map_14[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL11_OUT_ODD, 2 },
+       { P_GPLL11_OUT_EVEN, 3 },
+};
+
+static const struct clk_parent_data gcc_parent_data_14[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &gpll11.clkr.hw },
+       { .hw = &gpll11.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_EVEN, 2, 0, 0),
+       F(240000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0),
+       F(300000000, P_GPLL0_OUT_EVEN, 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_8,
+       .freq_tbl = ftbl_gcc_camss_axi_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_camss_axi_clk_src",
+               .parent_data = gcc_parent_data_8,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_8),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_camss_cci_0_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(37500000, P_GPLL0_OUT_EVEN, 8, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_camss_cci_0_clk_src = {
+       .cmd_rcgr = 0x56000,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_9,
+       .freq_tbl = ftbl_gcc_camss_cci_0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_camss_cci_0_clk_src",
+               .parent_data = gcc_parent_data_9,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_9),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_camss_cci_1_clk_src = {
+       .cmd_rcgr = 0x5c000,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_9,
+       .freq_tbl = ftbl_gcc_camss_cci_0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_camss_cci_1_clk_src",
+               .parent_data = gcc_parent_data_9,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_9),
+               .ops = &clk_rcg2_shared_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_ODD, 2, 0, 0),
+       F(300000000, P_GPLL0_OUT_EVEN, 1, 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_parent_data_4,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_4),
+               .ops = &clk_rcg2_shared_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_parent_data_4,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_4),
+               .ops = &clk_rcg2_shared_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_parent_data_4,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_4),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_camss_csi3phytimer_clk_src = {
+       .cmd_rcgr = 0x59054,
+       .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_csi3phytimer_clk_src",
+               .parent_data = gcc_parent_data_4,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_4),
+               .ops = &clk_rcg2_shared_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, 15),
+       F(65454545, P_GPLL9_OUT_EARLY, 11, 1, 2),
+       { }
+};
+
+static struct clk_rcg2 gcc_camss_mclk0_clk_src = {
+       .cmd_rcgr = 0x51000,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_3,
+       .freq_tbl = ftbl_gcc_camss_mclk0_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_camss_mclk0_clk_src",
+               .parent_data = gcc_parent_data_3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_3),
+               .ops = &clk_rcg2_shared_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_parent_data_3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_3),
+               .ops = &clk_rcg2_shared_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_parent_data_3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_3),
+               .ops = &clk_rcg2_shared_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_parent_data_3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_3),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_camss_mclk4_clk_src = {
+       .cmd_rcgr = 0x51070,
+       .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_mclk4_clk_src",
+               .parent_data = gcc_parent_data_3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_3),
+               .ops = &clk_rcg2_shared_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_MAIN, 3.5, 0, 0),
+       F(240000000, P_GPLL0_OUT_MAIN, 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_10,
+       .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_parent_data_10,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_10),
+               .ops = &clk_rcg2_shared_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_EVEN, 1, 0, 0),
+       F(266600000, P_GPLL8_OUT_EVEN, 1, 0, 0),
+       F(480000000, P_GPLL8_OUT_EVEN, 1, 0, 0),
+       F(580000000, P_GPLL8_OUT_EVEN, 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_10,
+       .freq_tbl = ftbl_gcc_camss_ope_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_camss_ope_clk_src",
+               .parent_data = gcc_parent_data_10,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_10),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_camss_tfe_0_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(120000000, P_GPLL0_OUT_MAIN, 5, 0, 0),
+       F(133333333, P_GPLL0_OUT_MAIN, 4.5, 0, 0),
+       F(144000000, P_GPLL9_OUT_MAIN, 2.5, 0, 0),
+       F(150000000, P_GPLL0_OUT_MAIN, 4, 0, 0),
+       F(171428571, P_GPLL0_OUT_MAIN, 3.5, 0, 0),
+       F(180000000, P_GPLL9_OUT_MAIN, 2, 0, 0),
+       F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
+       F(240000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0),
+       F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0),
+       F(329142857, P_GPLL10_OUT_EVEN, 3.5, 0, 0),
+       F(384000000, P_GPLL10_OUT_EVEN, 3, 0, 0),
+       F(460800000, P_GPLL10_OUT_EVEN, 2.5, 0, 0),
+       F(576000000, P_GPLL10_OUT_EVEN, 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_parent_data_5,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_5),
+               .ops = &clk_rcg2_shared_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_MAIN, 5, 0, 0),
+       F(266571429, P_GPLL5_OUT_EVEN, 3.5, 0, 0),
+       F(426400000, P_GPLL3_OUT_MAIN, 2.5, 0, 0),
+       F(466500000, P_GPLL5_OUT_EVEN, 2, 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_parent_data_6,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_6),
+               .ops = &clk_rcg2_shared_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_parent_data_5,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_5),
+               .ops = &clk_rcg2_shared_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_parent_data_6,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_6),
+               .ops = &clk_rcg2_shared_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_parent_data_5,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_5),
+               .ops = &clk_rcg2_shared_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_parent_data_6,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_6),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_camss_tfe_cphy_rx_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(256000000, P_GPLL6_OUT_MAIN, 3, 0, 0),
+       F(384000000, P_GPLL6_OUT_MAIN, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_camss_tfe_cphy_rx_clk_src = {
+       .cmd_rcgr = 0x52064,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_11,
+       .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_parent_data_11,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_11),
+               .ops = &clk_rcg2_shared_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_EVEN, 7.5, 0, 0),
+       F(80000000, P_GPLL0_OUT_MAIN, 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_8,
+       .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_parent_data_8,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_8),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_cpuss_ahb_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(50000000, P_GPLL0_OUT_ODD, 4, 0, 0),
+       F(100000000, P_GPLL0_OUT_ODD, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_cpuss_ahb_clk_src = {
+       .cmd_rcgr = 0x2b13c,
+       .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_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_gp1_clk_src[] = {
+       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 = 0x4d004,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_7,
+       .freq_tbl = ftbl_gcc_gp1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_gp1_clk_src",
+               .parent_data = gcc_parent_data_7,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_7),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_gp2_clk_src = {
+       .cmd_rcgr = 0x4e004,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_7,
+       .freq_tbl = ftbl_gcc_gp1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_gp2_clk_src",
+               .parent_data = gcc_parent_data_7,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_7),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_gp3_clk_src = {
+       .cmd_rcgr = 0x4f004,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_7,
+       .freq_tbl = ftbl_gcc_gp1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_gp3_clk_src",
+               .parent_data = gcc_parent_data_7,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_7),
+               .ops = &clk_rcg2_shared_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 = 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_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+               .ops = &clk_rcg2_shared_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_1,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_1),
+       .ops = &clk_rcg2_shared_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_parent_data_1,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_1),
+       .ops = &clk_rcg2_shared_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_parent_data_1,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_1),
+       .ops = &clk_rcg2_shared_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_parent_data_1,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_1),
+       .ops = &clk_rcg2_shared_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_parent_data_1,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_1),
+       .ops = &clk_rcg2_shared_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_parent_data_1,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_1),
+       .ops = &clk_rcg2_shared_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 struct clk_init_data gcc_qupv3_wrap1_s0_clk_src_init = {
+       .name = "gcc_qupv3_wrap1_s0_clk_src",
+       .parent_data = gcc_parent_data_1,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_1),
+       .ops = &clk_rcg2_shared_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap1_s0_clk_src = {
+       .cmd_rcgr = 0x5301c,
+       .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_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_1,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_1),
+       .ops = &clk_rcg2_shared_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap1_s1_clk_src = {
+       .cmd_rcgr = 0x5314c,
+       .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_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_1,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_1),
+       .ops = &clk_rcg2_shared_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap1_s2_clk_src = {
+       .cmd_rcgr = 0x5327c,
+       .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_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_1,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_1),
+       .ops = &clk_rcg2_shared_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap1_s3_clk_src = {
+       .cmd_rcgr = 0x533ac,
+       .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_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_1,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_1),
+       .ops = &clk_rcg2_shared_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap1_s4_clk_src = {
+       .cmd_rcgr = 0x534dc,
+       .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_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_1,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_1),
+       .ops = &clk_rcg2_shared_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap1_s5_clk_src = {
+       .cmd_rcgr = 0x5360c,
+       .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_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(20000000, P_GPLL0_OUT_EVEN, 5, 1, 3),
+       F(25000000, P_GPLL0_OUT_EVEN, 6, 1, 2),
+       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 = 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_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_sdcc1_ice_core_clk_src[] = {
+       F(75000000, P_GPLL0_OUT_EVEN, 4, 0, 0),
+       F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0),
+       F(150000000, P_GPLL0_OUT_EVEN, 2, 0, 0),
+       F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
+       F(300000000, P_GPLL0_OUT_EVEN, 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_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+               .ops = &clk_rcg2_shared_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_EVEN, 12, 0, 0),
+       F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0),
+       F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0),
+       F(202000000, P_GPLL7_OUT_EVEN, 4, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_sdcc2_apps_clk_src = {
+       .cmd_rcgr = 0x1e00c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_12,
+       .freq_tbl = ftbl_gcc_sdcc2_apps_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_sdcc2_apps_clk_src",
+               .parent_data = gcc_parent_data_12,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_12),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_ufs_phy_axi_clk_src[] = {
+       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),
+       F(240000000, P_GPLL0_OUT_MAIN, 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_2,
+       .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_2,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_2),
+               .ops = &clk_rcg2_shared_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 = 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_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+               .ops = &clk_rcg2_shared_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_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+               .ops = &clk_rcg2_shared_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 = 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_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_usb30_prim_master_clk_src[] = {
+       F(66666667, P_GPLL0_OUT_EVEN, 4.5, 0, 0),
+       F(133333333, P_GPLL0_OUT_MAIN, 4.5, 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_usb30_prim_master_clk_src = {
+       .cmd_rcgr = 0x1a01c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_2,
+       .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_2,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_2),
+               .ops = &clk_rcg2_shared_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_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_usb3_prim_phy_aux_clk_src = {
+       .cmd_rcgr = 0x1a060,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_13,
+       .freq_tbl = ftbl_gcc_usb30_prim_mock_utmi_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_usb3_prim_phy_aux_clk_src",
+               .parent_data = gcc_parent_data_13,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_13),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_video_venus_clk_src[] = {
+       F(133000000, P_GPLL11_OUT_EVEN, 4, 0, 0),
+       F(240000000, P_GPLL11_OUT_EVEN, 2.5, 0, 0),
+       F(300000000, P_GPLL11_OUT_EVEN, 2, 0, 0),
+       F(384000000, P_GPLL11_OUT_EVEN, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_video_venus_clk_src = {
+       .cmd_rcgr = 0x58060,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_14,
+       .freq_tbl = ftbl_gcc_video_venus_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_video_venus_clk_src",
+               .parent_data = gcc_parent_data_14,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_14),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static struct clk_regmap_div gcc_cpuss_ahb_postdiv_clk_src = {
+       .reg = 0x2b154,
+       .shift = 0,
+       .width = 4,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gcc_cpuss_ahb_postdiv_clk_src",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gcc_cpuss_ahb_clk_src.clkr.hw,
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_regmap_div_ro_ops,
+       },
+};
+
+static struct clk_regmap_div gcc_usb30_prim_mock_utmi_postdiv_clk_src = {
+       .reg = 0x1a04c,
+       .shift = 0,
+       .width = 4,
+       .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,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_regmap_div_ro_ops,
+       },
+};
+
+static struct clk_branch gcc_ahb2phy_csi_clk = {
+       .halt_reg = 0x1d004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .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_VOTED,
+       .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_VOTED,
+       .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_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_data = &(const struct clk_parent_data){
+                               .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_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_data = &(const struct clk_parent_data){
+                               .hw = &gcc_camss_cci_0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camss_cci_1_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_cci_1_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &gcc_camss_cci_1_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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_3_clk = {
+       .halt_reg = 0x520f8,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x520f8,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_cphy_3_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_csi3phytimer_clk = {
+       .halt_reg = 0x5906c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5906c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_csi3phytimer_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &gcc_camss_csi3phytimer_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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_mclk4_clk = {
+       .halt_reg = 0x51088,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x51088,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camss_mclk4_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &gcc_camss_mclk4_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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_VOTED,
+       .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_data = &(const struct clk_parent_data){
+                               .hw = &gcc_usb30_prim_master_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_disp_ahb_clk = {
+       .halt_reg = 0x1700c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .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_names =
+                       (const char *[]){ "gpll0" },
+               .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_data = &(const struct clk_parent_data){
+                               .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_VOTED,
+       .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_sleep_clk = {
+       .halt_reg = 0x17074,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x17074,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x17074,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_disp_sleep_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_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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_VOTED,
+       .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .hw = &gpll0_out_even.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .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_data = &(const struct clk_parent_data){
+                               .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_VOTED,
+       .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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 = 0x53014,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(20),
+               .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 = 0x5300c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(19),
+               .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 = 0x53018,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(21),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap1_s0_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .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 = 0x53148,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(22),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap1_s1_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .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 = 0x53278,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(23),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap1_s2_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .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 = 0x533a8,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(24),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap1_s3_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .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 = 0x534d8,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(25),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap1_s4_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .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 = 0x53608,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(26),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap1_s5_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .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 = 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_qupv3_wrap_1_m_ahb_clk = {
+       .halt_reg = 0x53004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x53004,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(17),
+               .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 = 0x53008,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x53008,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x7900c,
+               .enable_mask = BIT(18),
+               .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 = 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_data = &(const struct clk_parent_data){
+                               .hw = &gcc_sdcc1_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sdcc1_ice_core_clk = {
+       .halt_reg = 0x3800c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &gcc_cpuss_ahb_postdiv_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_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_data = &(const struct clk_parent_data){
+                               .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_VOTED,
+       .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_data = &(const struct clk_parent_data){
+                               .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_phy_ahb_clk = {
+       .halt_reg = 0x45014,
+       .halt_check = BRANCH_HALT_VOTED,
+       .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_VOTED,
+       .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_data = &(const struct clk_parent_data){
+                               .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_VOTED,
+       .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_data = &(const struct clk_parent_data){
+                               .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_VOTED,
+       .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_data = &(const struct clk_parent_data){
+                               .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_VOTED,
+       .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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_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_rx5_pcie_clkref_en_clk = {
+       .halt_reg = 0x8c00c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8c00c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_rx5_pcie_clkref_en_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_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_data = &(const struct clk_parent_data){
+                               .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_DELAY,
+       .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_axi0_clk = {
+       .halt_reg = 0x1701c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .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_VOTED,
+       .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_data = &(const struct clk_parent_data){
+                               .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_data = &(const struct clk_parent_data){
+                               .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 usb30_prim_gdsc = {
+       .gdscr = 0x1a004,
+       .pd = {
+               .name = "usb30_prim_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc ufs_phy_gdsc = {
+       .gdscr = 0x45004,
+       .pd = {
+               .name = "ufs_phy_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc camss_top_gdsc = {
+       .gdscr = 0x58004,
+       .pd = {
+               .name = "camss_top_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc venus_gdsc = {
+       .gdscr = 0x5807c,
+       .pd = {
+               .name = "venus_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc vcodec0_gdsc = {
+       .gdscr = 0x58098,
+       .pd = {
+               .name = "vcodec0_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = HW_CTRL,
+};
+
+static struct gdsc hlos1_vote_mm_snoc_mmu_tbu_rt_gdsc = {
+       .gdscr = 0x7d074,
+       .pd = {
+               .name = "hlos1_vote_mm_snoc_mmu_tbu_rt_gdsc",
+       },
+       .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_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE,
+};
+
+static struct gdsc hlos1_vote_turing_mmu_tbu1_gdsc = {
+       .gdscr = 0x7d060,
+       .pd = {
+               .name = "hlos1_vote_turing_mmu_tbu1_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE,
+};
+
+static struct gdsc hlos1_vote_turing_mmu_tbu0_gdsc = {
+       .gdscr = 0x7d07c,
+       .pd = {
+               .name = "hlos1_vote_turing_mmu_tbu0_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE,
+};
+
+static struct clk_regmap *gcc_sm6375_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_CAMSS_AXI_CLK] = &gcc_camss_axi_clk.clkr,
+       [GCC_CAMSS_AXI_CLK_SRC] = &gcc_camss_axi_clk_src.clkr,
+       [GCC_CAMSS_CCI_0_CLK] = &gcc_camss_cci_0_clk.clkr,
+       [GCC_CAMSS_CCI_0_CLK_SRC] = &gcc_camss_cci_0_clk_src.clkr,
+       [GCC_CAMSS_CCI_1_CLK] = &gcc_camss_cci_1_clk.clkr,
+       [GCC_CAMSS_CCI_1_CLK_SRC] = &gcc_camss_cci_1_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_CPHY_3_CLK] = &gcc_camss_cphy_3_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_CSI3PHYTIMER_CLK] = &gcc_camss_csi3phytimer_clk.clkr,
+       [GCC_CAMSS_CSI3PHYTIMER_CLK_SRC] = &gcc_camss_csi3phytimer_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_MCLK4_CLK] = &gcc_camss_mclk4_clk.clkr,
+       [GCC_CAMSS_MCLK4_CLK_SRC] = &gcc_camss_mclk4_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_AHB_CLK_SRC] = &gcc_cpuss_ahb_clk_src.clkr,
+       [GCC_CPUSS_AHB_POSTDIV_CLK_SRC] = &gcc_cpuss_ahb_postdiv_clk_src.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_SLEEP_CLK] = &gcc_disp_sleep_clk.clkr,
+       [GCC_DISP_THROTTLE_CORE_CLK] = &gcc_disp_throttle_core_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_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_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_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_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,
+       [GCC_UFS_MEM_CLKREF_CLK] = &gcc_ufs_mem_clkref_clk.clkr,
+       [GCC_RX5_PCIE_CLKREF_EN_CLK] = &gcc_rx5_pcie_clkref_en_clk.clkr,
+       [GPLL0] = &gpll0.clkr,
+       [GPLL0_OUT_EVEN] = &gpll0_out_even.clkr,
+       [GPLL0_OUT_ODD] = &gpll0_out_odd.clkr,
+       [GPLL1] = &gpll1.clkr,
+       [GPLL10] = &gpll10.clkr,
+       [GPLL11] = &gpll11.clkr,
+       [GPLL3] = &gpll3.clkr,
+       [GPLL3_OUT_EVEN] = &gpll3_out_even.clkr,
+       [GPLL4] = &gpll4.clkr,
+       [GPLL5] = &gpll5.clkr,
+       [GPLL6] = &gpll6.clkr,
+       [GPLL6_OUT_EVEN] = &gpll6_out_even.clkr,
+       [GPLL7] = &gpll7.clkr,
+       [GPLL8] = &gpll8.clkr,
+       [GPLL8_OUT_EVEN] = &gpll8_out_even.clkr,
+       [GPLL9] = &gpll9.clkr,
+       [GPLL9_OUT_MAIN] = &gpll9_out_main.clkr,
+};
+
+static const struct qcom_reset_map gcc_sm6375_resets[] = {
+       [GCC_MMSS_BCR] = { 0x17000 },
+       [GCC_USB30_PRIM_BCR] = { 0x1a000 },
+       [GCC_USB3_PHY_PRIM_SP0_BCR] = { 0x1b000 },
+       [GCC_USB3_DP_PHY_PRIM_BCR] = { 0x1b020 },
+       [GCC_QUSB2PHY_PRIM_BCR] = { 0x1c000 },
+       [GCC_QUSB2PHY_SEC_BCR] = { 0x1c004 },
+       [GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x1d000 },
+       [GCC_SDCC2_BCR] = { 0x1e000 },
+       [GCC_QUPV3_WRAPPER_0_BCR] = { 0x1f000 },
+       [GCC_PDM_BCR] = { 0x20000 },
+       [GCC_GPU_BCR] = { 0x36000 },
+       [GCC_SDCC1_BCR] = { 0x38000 },
+       [GCC_UFS_PHY_BCR] = { 0x45000 },
+       [GCC_CAMSS_TFE_BCR] = { 0x52000 },
+       [GCC_QUPV3_WRAPPER_1_BCR] = { 0x53000 },
+       [GCC_CAMSS_OPE_BCR] = { 0x55000 },
+       [GCC_CAMSS_TOP_BCR] = { 0x58000 },
+       [GCC_VENUS_BCR] = { 0x58078 },
+       [GCC_VCODEC0_BCR] = { 0x58094 },
+       [GCC_VIDEO_INTERFACE_BCR] = { 0x6e000 },
+};
+
+
+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 struct gdsc *gcc_sm6375_gdscs[] = {
+       [USB30_PRIM_GDSC] = &usb30_prim_gdsc,
+       [UFS_PHY_GDSC] = &ufs_phy_gdsc,
+       [CAMSS_TOP_GDSC] = &camss_top_gdsc,
+       [VENUS_GDSC] = &venus_gdsc,
+       [VCODEC0_GDSC] = &vcodec0_gdsc,
+       [HLOS1_VOTE_MM_SNOC_MMU_TBU_NRT_GDSC] = &hlos1_vote_mm_snoc_mmu_tbu_nrt_gdsc,
+       [HLOS1_VOTE_MM_SNOC_MMU_TBU_RT_GDSC] = &hlos1_vote_mm_snoc_mmu_tbu_rt_gdsc,
+       [HLOS1_VOTE_TURING_MMU_TBU0_GDSC] = &hlos1_vote_turing_mmu_tbu0_gdsc,
+       [HLOS1_VOTE_TURING_MMU_TBU1_GDSC] = &hlos1_vote_turing_mmu_tbu1_gdsc,
+};
+
+static const struct regmap_config gcc_sm6375_regmap_config = {
+       .reg_bits = 32,
+       .reg_stride = 4,
+       .val_bits = 32,
+       .max_register = 0xc7000,
+       .fast_io = true,
+};
+
+static const struct qcom_cc_desc gcc_sm6375_desc = {
+       .config = &gcc_sm6375_regmap_config,
+       .clks = gcc_sm6375_clocks,
+       .num_clks = ARRAY_SIZE(gcc_sm6375_clocks),
+       .resets = gcc_sm6375_resets,
+       .num_resets = ARRAY_SIZE(gcc_sm6375_resets),
+       .gdscs = gcc_sm6375_gdscs,
+       .num_gdscs = ARRAY_SIZE(gcc_sm6375_gdscs),
+};
+
+static const struct of_device_id gcc_sm6375_match_table[] = {
+       { .compatible = "qcom,sm6375-gcc" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, gcc_sm6375_match_table);
+
+static int gcc_sm6375_probe(struct platform_device *pdev)
+{
+       struct regmap *regmap;
+       int ret;
+
+       regmap = qcom_cc_map(pdev, &gcc_sm6375_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;
+
+       /*
+        * Keep the following clocks always on:
+        * GCC_CAMERA_XO_CLK, GCC_CPUSS_GNOC_CLK, GCC_DISP_XO_CLK
+        */
+       regmap_update_bits(regmap, 0x17028, BIT(0), BIT(0));
+       regmap_update_bits(regmap, 0x2b004, BIT(0), BIT(0));
+       regmap_update_bits(regmap, 0x1702c, BIT(0), BIT(0));
+
+       clk_lucid_pll_configure(&gpll10, regmap, &gpll10_config);
+       clk_lucid_pll_configure(&gpll11, regmap, &gpll11_config);
+       clk_lucid_pll_configure(&gpll8, regmap, &gpll8_config);
+       clk_zonda_pll_configure(&gpll9, regmap, &gpll9_config);
+
+       return qcom_cc_really_probe(pdev, &gcc_sm6375_desc, regmap);
+}
+
+static struct platform_driver gcc_sm6375_driver = {
+       .probe = gcc_sm6375_probe,
+       .driver = {
+               .name = "gcc-sm6375",
+               .of_match_table = gcc_sm6375_match_table,
+       },
+};
+
+static int __init gcc_sm6375_init(void)
+{
+       return platform_driver_register(&gcc_sm6375_driver);
+}
+subsys_initcall(gcc_sm6375_init);
+
+static void __exit gcc_sm6375_exit(void)
+{
+       platform_driver_unregister(&gcc_sm6375_driver);
+}
+module_exit(gcc_sm6375_exit);
+
+MODULE_DESCRIPTION("QTI GCC SM6375 Driver");
+MODULE_LICENSE("GPL");
index d324400..7cf5e13 100644 (file)
@@ -368,6 +368,16 @@ static int _gdsc_disable(struct gdsc *sc)
        if (sc->pwrsts & PWRSTS_OFF)
                gdsc_clear_mem_on(sc);
 
+       /*
+        * If the GDSC supports only a Retention state, apart from ON,
+        * leave it in ON state.
+        * There is no SW control to transition the GDSC into
+        * Retention state. This happens in HW when the parent
+        * domain goes down to a Low power state
+        */
+       if (sc->pwrsts == PWRSTS_RET_ON)
+               return 0;
+
        ret = gdsc_toggle_logic(sc, GDSC_OFF);
        if (ret)
                return ret;
@@ -439,11 +449,8 @@ static int gdsc_init(struct gdsc *sc)
 
                /* ...and the power-domain */
                ret = gdsc_pm_runtime_get(sc);
-               if (ret) {
-                       if (sc->rsupply)
-                               regulator_disable(sc->rsupply);
-                       return ret;
-               }
+               if (ret)
+                       goto err_disable_supply;
 
                /*
                 * Votable GDSCs can be ON due to Vote from other masters.
@@ -452,14 +459,14 @@ static int gdsc_init(struct gdsc *sc)
                if (sc->flags & VOTABLE) {
                        ret = gdsc_update_collapse_bit(sc, false);
                        if (ret)
-                               return ret;
+                               goto err_put_rpm;
                }
 
                /* Turn on HW trigger mode if supported */
                if (sc->flags & HW_CTRL) {
                        ret = gdsc_hwctrl(sc, true);
                        if (ret < 0)
-                               return ret;
+                               goto err_put_rpm;
                }
 
                /*
@@ -486,9 +493,21 @@ static int gdsc_init(struct gdsc *sc)
                sc->pd.power_off = gdsc_disable;
        if (!sc->pd.power_on)
                sc->pd.power_on = gdsc_enable;
-       pm_genpd_init(&sc->pd, NULL, !on);
+
+       ret = pm_genpd_init(&sc->pd, NULL, !on);
+       if (ret)
+               goto err_put_rpm;
 
        return 0;
+
+err_put_rpm:
+       if (on)
+               gdsc_pm_runtime_put(sc);
+err_disable_supply:
+       if (on && sc->rsupply)
+               regulator_disable(sc->rsupply);
+
+       return ret;
 }
 
 int gdsc_register(struct gdsc_desc *desc,
index 5de48c9..981a12c 100644 (file)
@@ -49,6 +49,11 @@ struct gdsc {
        const u8                        pwrsts;
 /* Powerdomain allowable state bitfields */
 #define PWRSTS_OFF             BIT(0)
+/*
+ * There is no SW control to transition a GDSC into
+ * PWRSTS_RET. This happens in HW when the parent
+ * domain goes down to a low power state
+ */
 #define PWRSTS_RET             BIT(1)
 #define PWRSTS_ON              BIT(2)
 #define PWRSTS_OFF_ON          (PWRSTS_OFF | PWRSTS_ON)
diff --git a/drivers/clk/qcom/gpucc-sc8280xp.c b/drivers/clk/qcom/gpucc-sc8280xp.c
new file mode 100644 (file)
index 0000000..ea1e950
--- /dev/null
@@ -0,0 +1,461 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+
+#include <dt-bindings/clock/qcom,gpucc-sc8280xp.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"
+
+/* Need to match the order of clocks in DT binding */
+enum {
+       DT_BI_TCXO,
+       DT_GCC_GPU_GPLL0_CLK_SRC,
+       DT_GCC_GPU_GPLL0_DIV_CLK_SRC,
+};
+
+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 clk_parent_data parent_data_tcxo = { .index = DT_BI_TCXO };
+
+static const struct pll_vco lucid_5lpe_vco[] = {
+       { 249600000, 1800000000, 0 },
+};
+
+static struct alpha_pll_config gpu_cc_pll0_config = {
+       .l = 0x1c,
+       .alpha = 0xa555,
+       .config_ctl_val = 0x20485699,
+       .config_ctl_hi_val = 0x00002261,
+       .config_ctl_hi1_val = 0x2a9a699c,
+       .test_ctl_val = 0x00000000,
+       .test_ctl_hi_val = 0x00000000,
+       .test_ctl_hi1_val = 0x01800000,
+       .user_ctl_val = 0x00000000,
+       .user_ctl_hi_val = 0x00000805,
+       .user_ctl_hi1_val = 0x00000000,
+};
+
+static struct clk_alpha_pll gpu_cc_pll0 = {
+       .offset = 0x0,
+       .vco_table = lucid_5lpe_vco,
+       .num_vco = ARRAY_SIZE(lucid_5lpe_vco),
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr = {
+               .hw.init = &(const struct clk_init_data){
+                       .name = "gpu_cc_pll0",
+                       .parent_data = &parent_data_tcxo,
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_lucid_5lpe_ops,
+               },
+       },
+};
+
+static 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 = 0x2a9a699c,
+       .test_ctl_val = 0x00000000,
+       .test_ctl_hi_val = 0x00000000,
+       .test_ctl_hi1_val = 0x01800000,
+       .user_ctl_val = 0x00000000,
+       .user_ctl_hi_val = 0x00000805,
+       .user_ctl_hi1_val = 0x00000000,
+};
+
+static struct clk_alpha_pll gpu_cc_pll1 = {
+       .offset = 0x100,
+       .vco_table = lucid_5lpe_vco,
+       .num_vco = ARRAY_SIZE(lucid_5lpe_vco),
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr = {
+               .hw.init = &(const struct clk_init_data){
+                       .name = "gpu_cc_pll1",
+                       .parent_data = &parent_data_tcxo,
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_lucid_5lpe_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[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &gpu_cc_pll0.clkr.hw },
+       { .hw = &gpu_cc_pll1.clkr.hw },
+       { .index = DT_GCC_GPU_GPLL0_CLK_SRC },
+       { .index = DT_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[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &gpu_cc_pll1.clkr.hw },
+       { .index = DT_GCC_GPU_GPLL0_CLK_SRC },
+       { .index = DT_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 = &(const 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(200000000, P_GCC_GPU_GPLL0_CLK_SRC, 3, 0, 0),
+       F(300000000, P_GCC_GPU_GPLL0_CLK_SRC, 2, 0, 0),
+       F(400000000, P_GCC_GPU_GPLL0_CLK_SRC, 1.5, 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 = &(const 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 = &(const 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 = &(const 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 = &(const 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 = &(const 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 = &(const 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 = &(const 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 = &(const struct clk_init_data){
+                       .name = "gpu_cc_cxo_aon_clk",
+                       .ops = &clk_branch2_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 = &(const 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_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5000,
+               .enable_mask = BIT(0),
+               .hw.init = &(const 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 = &(const 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 = &(const 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_sleep_clk = {
+       .halt_reg = 0x1090,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x1090,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data){
+                       .name = "gpu_cc_sleep_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_regmap *gpu_cc_sc8280xp_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_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_PLL0] = &gpu_cc_pll0.clkr,
+       [GPU_CC_PLL1] = &gpu_cc_pll1.clkr,
+       [GPU_CC_SLEEP_CLK] = &gpu_cc_sleep_clk.clkr,
+};
+
+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_sc8280xp_gdscs[] = {
+       [GPU_CC_CX_GDSC] = &cx_gdsc,
+       [GPU_CC_GX_GDSC] = &gx_gdsc,
+};
+
+static const struct regmap_config gpu_cc_sc8280xp_regmap_config = {
+       .reg_bits = 32,
+       .reg_stride = 4,
+       .val_bits = 32,
+       .max_register = 0x8030,
+       .fast_io = true,
+};
+
+static struct qcom_cc_desc gpu_cc_sc8280xp_desc = {
+       .config = &gpu_cc_sc8280xp_regmap_config,
+       .clks = gpu_cc_sc8280xp_clocks,
+       .num_clks = ARRAY_SIZE(gpu_cc_sc8280xp_clocks),
+       .gdscs = gpu_cc_sc8280xp_gdscs,
+       .num_gdscs = ARRAY_SIZE(gpu_cc_sc8280xp_gdscs),
+};
+
+static int gpu_cc_sc8280xp_probe(struct platform_device *pdev)
+{
+       struct regmap *regmap;
+
+       regmap = qcom_cc_map(pdev, &gpu_cc_sc8280xp_desc);
+       if (IS_ERR(regmap))
+               return PTR_ERR(regmap);
+
+       clk_lucid_pll_configure(&gpu_cc_pll0, regmap, &gpu_cc_pll0_config);
+       clk_lucid_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config);
+
+       /*
+        * Keep the clocks always-ON
+        * GPU_CC_CB_CLK, GPU_CC_CXO_CLK
+        */
+       regmap_update_bits(regmap, 0x1170, BIT(0), BIT(0));
+       regmap_update_bits(regmap, 0x109c, BIT(0), BIT(0));
+
+       return qcom_cc_really_probe(pdev, &gpu_cc_sc8280xp_desc, regmap);
+}
+
+static const struct of_device_id gpu_cc_sc8280xp_match_table[] = {
+       { .compatible = "qcom,sc8280xp-gpucc" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, gpu_cc_sc8280xp_match_table);
+
+static struct platform_driver gpu_cc_sc8280xp_driver = {
+       .probe = gpu_cc_sc8280xp_probe,
+       .driver = {
+               .name = "gpu_cc-sc8280xp",
+               .of_match_table = gpu_cc_sc8280xp_match_table,
+       },
+};
+module_platform_driver(gpu_cc_sc8280xp_driver);
+
+MODULE_DESCRIPTION("Qualcomm SC8280XP GPU clock controller");
+MODULE_LICENSE("GPL");
index 88d4b33..b1b3702 100644 (file)
@@ -12,9 +12,9 @@
 #include <linux/clk.h>
 #include <linux/clk-provider.h>
 
-static const char *aux_parents[] = {
-       "pll8_vote",
-       "pxo",
+static const struct clk_parent_data aux_parents[] = {
+       { .fw_name = "pll8_vote", .name = "pll8_vote" },
+       { .fw_name = "pxo", .name = "pxo_board" },
 };
 
 static const u32 aux_parent_map[] = {
@@ -32,8 +32,8 @@ MODULE_DEVICE_TABLE(of, kpss_xcc_match_table);
 static int kpss_xcc_driver_probe(struct platform_device *pdev)
 {
        const struct of_device_id *id;
-       struct clk *clk;
        void __iomem *base;
+       struct clk_hw *hw;
        const char *name;
 
        id = of_match_device(kpss_xcc_match_table, &pdev->dev);
@@ -55,24 +55,16 @@ static int kpss_xcc_driver_probe(struct platform_device *pdev)
                base += 0x28;
        }
 
-       clk = clk_register_mux_table(&pdev->dev, name, aux_parents,
-                                    ARRAY_SIZE(aux_parents), 0, base, 0, 0x3,
-                                    0, aux_parent_map, NULL);
+       hw = devm_clk_hw_register_mux_parent_data_table(&pdev->dev, name, aux_parents,
+                                                       ARRAY_SIZE(aux_parents), 0,
+                                                       base, 0, 0x3,
+                                                       0, aux_parent_map, NULL);
 
-       platform_set_drvdata(pdev, clk);
-
-       return PTR_ERR_OR_ZERO(clk);
-}
-
-static int kpss_xcc_driver_remove(struct platform_device *pdev)
-{
-       clk_unregister_mux(platform_get_drvdata(pdev));
-       return 0;
+       return PTR_ERR_OR_ZERO(hw);
 }
 
 static struct platform_driver kpss_xcc_driver = {
        .probe = kpss_xcc_driver_probe,
-       .remove = kpss_xcc_driver_remove,
        .driver = {
                .name = "kpss-xcc",
                .of_match_table = kpss_xcc_match_table,
index 1a2be4a..81a44a9 100644 (file)
@@ -22,6 +22,7 @@
 #include "clk-branch.h"
 #include "clk-regmap-divider.h"
 #include "clk-regmap-mux.h"
+#include "reset.h"
 
 static struct clk_pll pll4 = {
        .l_reg = 0x4,
@@ -33,7 +34,9 @@ static struct clk_pll pll4 = {
        .status_bit = 16,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pll4",
-               .parent_names = (const char *[]){ "pxo" },
+               .parent_data = &(const struct clk_parent_data) {
+                       .fw_name = "pxo", .name = "pxo_board",
+               },
                .num_parents = 1,
                .ops = &clk_pll_ops,
        },
@@ -63,9 +66,9 @@ static const struct parent_map lcc_pxo_pll4_map[] = {
        { P_PLL4, 2 }
 };
 
-static const char * const lcc_pxo_pll4[] = {
-       "pxo",
-       "pll4_vote",
+static const struct clk_parent_data lcc_pxo_pll4[] = {
+       { .fw_name = "pxo", .name = "pxo_board" },
+       { .fw_name = "pll4_vote", .name = "pll4_vote" },
 };
 
 static struct freq_tbl clk_tbl_aif_mi2s[] = {
@@ -130,18 +133,14 @@ static struct clk_rcg mi2s_osr_src = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "mi2s_osr_src",
-                       .parent_names = lcc_pxo_pll4,
-                       .num_parents = 2,
+                       .parent_data = lcc_pxo_pll4,
+                       .num_parents = ARRAY_SIZE(lcc_pxo_pll4),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_RATE_GATE,
                },
        },
 };
 
-static const char * const lcc_mi2s_parents[] = {
-       "mi2s_osr_src",
-};
-
 static struct clk_branch mi2s_osr_clk = {
        .halt_reg = 0x50,
        .halt_bit = 1,
@@ -151,7 +150,9 @@ static struct clk_branch mi2s_osr_clk = {
                .enable_mask = BIT(17),
                .hw.init = &(struct clk_init_data){
                        .name = "mi2s_osr_clk",
-                       .parent_names = lcc_mi2s_parents,
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &mi2s_osr_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -166,7 +167,9 @@ static struct clk_regmap_div mi2s_div_clk = {
        .clkr = {
                .hw.init = &(struct clk_init_data){
                        .name = "mi2s_div_clk",
-                       .parent_names = lcc_mi2s_parents,
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &mi2s_osr_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .ops = &clk_regmap_div_ops,
                },
@@ -182,7 +185,9 @@ static struct clk_branch mi2s_bit_div_clk = {
                .enable_mask = BIT(15),
                .hw.init = &(struct clk_init_data){
                        .name = "mi2s_bit_div_clk",
-                       .parent_names = (const char *[]){ "mi2s_div_clk" },
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &mi2s_div_clk.clkr.hw,
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -190,6 +195,10 @@ static struct clk_branch mi2s_bit_div_clk = {
        },
 };
 
+static const struct clk_parent_data lcc_mi2s_bit_div_codec_clk[] = {
+       { .hw = &mi2s_bit_div_clk.clkr.hw, },
+       { .fw_name = "mi2s_codec", .name = "mi2s_codec_clk" },
+};
 
 static struct clk_regmap_mux mi2s_bit_clk = {
        .reg = 0x48,
@@ -198,11 +207,8 @@ static struct clk_regmap_mux mi2s_bit_clk = {
        .clkr = {
                .hw.init = &(struct clk_init_data){
                        .name = "mi2s_bit_clk",
-                       .parent_names = (const char *[]){
-                               "mi2s_bit_div_clk",
-                               "mi2s_codec_clk",
-                       },
-                       .num_parents = 2,
+                       .parent_data = lcc_mi2s_bit_div_codec_clk,
+                       .num_parents = ARRAY_SIZE(lcc_mi2s_bit_div_codec_clk),
                        .ops = &clk_regmap_mux_closest_ops,
                        .flags = CLK_SET_RATE_PARENT,
                },
@@ -244,8 +250,8 @@ static struct clk_rcg pcm_src = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "pcm_src",
-                       .parent_names = lcc_pxo_pll4,
-                       .num_parents = 2,
+                       .parent_data = lcc_pxo_pll4,
+                       .num_parents = ARRAY_SIZE(lcc_pxo_pll4),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_RATE_GATE,
                },
@@ -261,7 +267,9 @@ static struct clk_branch pcm_clk_out = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "pcm_clk_out",
-                       .parent_names = (const char *[]){ "pcm_src" },
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &pcm_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -269,6 +277,11 @@ static struct clk_branch pcm_clk_out = {
        },
 };
 
+static const struct clk_parent_data lcc_pcm_clk_out_codec_clk[] = {
+       { .hw = &pcm_clk_out.clkr.hw, },
+       { .fw_name = "pcm_codec_clk", .name = "pcm_codec_clk" },
+};
+
 static struct clk_regmap_mux pcm_clk = {
        .reg = 0x54,
        .shift = 10,
@@ -276,11 +289,8 @@ static struct clk_regmap_mux pcm_clk = {
        .clkr = {
                .hw.init = &(struct clk_init_data){
                        .name = "pcm_clk",
-                       .parent_names = (const char *[]){
-                               "pcm_clk_out",
-                               "pcm_codec_clk",
-                       },
-                       .num_parents = 2,
+                       .parent_data = lcc_pcm_clk_out_codec_clk,
+                       .num_parents = ARRAY_SIZE(lcc_pcm_clk_out_codec_clk),
                        .ops = &clk_regmap_mux_closest_ops,
                        .flags = CLK_SET_RATE_PARENT,
                },
@@ -324,18 +334,14 @@ static struct clk_rcg spdif_src = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "spdif_src",
-                       .parent_names = lcc_pxo_pll4,
-                       .num_parents = 2,
+                       .parent_data = lcc_pxo_pll4,
+                       .num_parents = ARRAY_SIZE(lcc_pxo_pll4),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_RATE_GATE,
                },
        },
 };
 
-static const char * const lcc_spdif_parents[] = {
-       "spdif_src",
-};
-
 static struct clk_branch spdif_clk = {
        .halt_reg = 0xd4,
        .halt_bit = 1,
@@ -345,7 +351,9 @@ static struct clk_branch spdif_clk = {
                .enable_mask = BIT(12),
                .hw.init = &(struct clk_init_data){
                        .name = "spdif_clk",
-                       .parent_names = lcc_spdif_parents,
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &spdif_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -383,8 +391,8 @@ static struct clk_rcg ahbix_clk = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "ahbix",
-                       .parent_names = lcc_pxo_pll4,
-                       .num_parents = 2,
+                       .parent_data = lcc_pxo_pll4,
+                       .num_parents = ARRAY_SIZE(lcc_pxo_pll4),
                        .ops = &clk_rcg_lcc_ops,
                },
        },
@@ -405,6 +413,10 @@ static struct clk_regmap *lcc_ipq806x_clks[] = {
        [AHBIX_CLK] = &ahbix_clk.clkr,
 };
 
+static const struct qcom_reset_map lcc_ipq806x_resets[] = {
+       [LCC_PCM_RESET] = { 0x54, 13 },
+};
+
 static const struct regmap_config lcc_ipq806x_regmap_config = {
        .reg_bits       = 32,
        .reg_stride     = 4,
@@ -417,6 +429,8 @@ static const struct qcom_cc_desc lcc_ipq806x_desc = {
        .config = &lcc_ipq806x_regmap_config,
        .clks = lcc_ipq806x_clks,
        .num_clks = ARRAY_SIZE(lcc_ipq806x_clks),
+       .resets = lcc_ipq806x_resets,
+       .num_resets = ARRAY_SIZE(lcc_ipq806x_resets),
 };
 
 static const struct of_device_id lcc_ipq806x_match_table[] = {
index 84817cf..3926184 100644 (file)
@@ -33,7 +33,9 @@ static struct clk_pll pll4 = {
        .status_bit = 16,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pll4",
-               .parent_names = (const char *[]){ "pxo" },
+               .parent_data = (const struct clk_parent_data[]){
+                       { .fw_name = "pxo", .name = "pxo_board" },
+               },
                .num_parents = 1,
                .ops = &clk_pll_ops,
        },
@@ -49,9 +51,9 @@ static const struct parent_map lcc_pxo_pll4_map[] = {
        { P_PLL4, 2 }
 };
 
-static const char * const lcc_pxo_pll4[] = {
-       "pxo",
-       "pll4_vote",
+static const struct clk_parent_data lcc_pxo_pll4[] = {
+       { .fw_name = "pxo", .name = "pxo_board" },
+       { .fw_name = "pll4_vote", .name = "pll4_vote" },
 };
 
 static struct freq_tbl clk_tbl_aif_osr_492[] = {
@@ -86,112 +88,7 @@ static struct freq_tbl clk_tbl_aif_osr_393[] = {
        { }
 };
 
-static struct clk_rcg mi2s_osr_src = {
-       .ns_reg = 0x48,
-       .md_reg = 0x4c,
-       .mn = {
-               .mnctr_en_bit = 8,
-               .mnctr_reset_bit = 7,
-               .mnctr_mode_shift = 5,
-               .n_val_shift = 24,
-               .m_val_shift = 8,
-               .width = 8,
-       },
-       .p = {
-               .pre_div_shift = 3,
-               .pre_div_width = 2,
-       },
-       .s = {
-               .src_sel_shift = 0,
-               .parent_map = lcc_pxo_pll4_map,
-       },
-       .freq_tbl = clk_tbl_aif_osr_393,
-       .clkr = {
-               .enable_reg = 0x48,
-               .enable_mask = BIT(9),
-               .hw.init = &(struct clk_init_data){
-                       .name = "mi2s_osr_src",
-                       .parent_names = lcc_pxo_pll4,
-                       .num_parents = 2,
-                       .ops = &clk_rcg_ops,
-                       .flags = CLK_SET_RATE_GATE,
-               },
-       },
-};
-
-static const char * const lcc_mi2s_parents[] = {
-       "mi2s_osr_src",
-};
-
-static struct clk_branch mi2s_osr_clk = {
-       .halt_reg = 0x50,
-       .halt_bit = 1,
-       .halt_check = BRANCH_HALT_ENABLE,
-       .clkr = {
-               .enable_reg = 0x48,
-               .enable_mask = BIT(17),
-               .hw.init = &(struct clk_init_data){
-                       .name = "mi2s_osr_clk",
-                       .parent_names = lcc_mi2s_parents,
-                       .num_parents = 1,
-                       .ops = &clk_branch_ops,
-                       .flags = CLK_SET_RATE_PARENT,
-               },
-       },
-};
-
-static struct clk_regmap_div mi2s_div_clk = {
-       .reg = 0x48,
-       .shift = 10,
-       .width = 4,
-       .clkr = {
-               .enable_reg = 0x48,
-               .enable_mask = BIT(15),
-               .hw.init = &(struct clk_init_data){
-                       .name = "mi2s_div_clk",
-                       .parent_names = lcc_mi2s_parents,
-                       .num_parents = 1,
-                       .ops = &clk_regmap_div_ops,
-               },
-       },
-};
-
-static struct clk_branch mi2s_bit_div_clk = {
-       .halt_reg = 0x50,
-       .halt_bit = 0,
-       .halt_check = BRANCH_HALT_ENABLE,
-       .clkr = {
-               .enable_reg = 0x48,
-               .enable_mask = BIT(15),
-               .hw.init = &(struct clk_init_data){
-                       .name = "mi2s_bit_div_clk",
-                       .parent_names = (const char *[]){ "mi2s_div_clk" },
-                       .num_parents = 1,
-                       .ops = &clk_branch_ops,
-                       .flags = CLK_SET_RATE_PARENT,
-               },
-       },
-};
-
-static struct clk_regmap_mux mi2s_bit_clk = {
-       .reg = 0x48,
-       .shift = 14,
-       .width = 1,
-       .clkr = {
-               .hw.init = &(struct clk_init_data){
-                       .name = "mi2s_bit_clk",
-                       .parent_names = (const char *[]){
-                               "mi2s_bit_div_clk",
-                               "mi2s_codec_clk",
-                       },
-                       .num_parents = 2,
-                       .ops = &clk_regmap_mux_closest_ops,
-                       .flags = CLK_SET_RATE_PARENT,
-               },
-       },
-};
-
-#define CLK_AIF_OSR_DIV(prefix, _ns, _md, hr)                  \
+#define CLK_AIF_OSR_SRC(prefix, _ns, _md)                      \
 static struct clk_rcg prefix##_osr_src = {                     \
        .ns_reg = _ns,                                          \
        .md_reg = _md,                                          \
@@ -217,85 +114,103 @@ static struct clk_rcg prefix##_osr_src = {                       \
                .enable_mask = BIT(9),                          \
                .hw.init = &(struct clk_init_data){             \
                        .name = #prefix "_osr_src",             \
-                       .parent_names = lcc_pxo_pll4,           \
-                       .num_parents = 2,                       \
+                       .parent_data = lcc_pxo_pll4,            \
+                       .num_parents = ARRAY_SIZE(lcc_pxo_pll4), \
                        .ops = &clk_rcg_ops,                    \
                        .flags = CLK_SET_RATE_GATE,             \
                },                                              \
        },                                                      \
 };                                                             \
-                                                               \
-static const char * const lcc_##prefix##_parents[] = {         \
-       #prefix "_osr_src",                                     \
-};                                                             \
-                                                               \
+
+#define CLK_AIF_OSR_CLK(prefix, _ns, hr, en_bit)               \
 static struct clk_branch prefix##_osr_clk = {                  \
        .halt_reg = hr,                                         \
        .halt_bit = 1,                                          \
        .halt_check = BRANCH_HALT_ENABLE,                       \
        .clkr = {                                               \
                .enable_reg = _ns,                              \
-               .enable_mask = BIT(21),                         \
+               .enable_mask = BIT(en_bit),                     \
                .hw.init = &(struct clk_init_data){             \
                        .name = #prefix "_osr_clk",             \
-                       .parent_names = lcc_##prefix##_parents, \
+                       .parent_hws = (const struct clk_hw*[]){ \
+                               &prefix##_osr_src.clkr.hw,      \
+                       },                                      \
                        .num_parents = 1,                       \
                        .ops = &clk_branch_ops,                 \
                        .flags = CLK_SET_RATE_PARENT,           \
                },                                              \
        },                                                      \
 };                                                             \
-                                                               \
+
+#define CLK_AIF_OSR_DIV_CLK(prefix, _ns, _width)               \
 static struct clk_regmap_div prefix##_div_clk = {              \
        .reg = _ns,                                             \
        .shift = 10,                                            \
-       .width = 8,                                             \
+       .width = _width,                                        \
        .clkr = {                                               \
                .hw.init = &(struct clk_init_data){             \
                        .name = #prefix "_div_clk",             \
-                       .parent_names = lcc_##prefix##_parents, \
+                       .parent_hws = (const struct clk_hw*[]){ \
+                               &prefix##_osr_src.clkr.hw,      \
+                       },                                      \
                        .num_parents = 1,                       \
                        .ops = &clk_regmap_div_ops,             \
                },                                              \
        },                                                      \
 };                                                             \
-                                                               \
+
+#define CLK_AIF_OSR_BIT_DIV_CLK(prefix, _ns, hr, en_bit)       \
 static struct clk_branch prefix##_bit_div_clk = {              \
        .halt_reg = hr,                                         \
        .halt_bit = 0,                                          \
        .halt_check = BRANCH_HALT_ENABLE,                       \
        .clkr = {                                               \
                .enable_reg = _ns,                              \
-               .enable_mask = BIT(19),                         \
+               .enable_mask = BIT(en_bit),                     \
                .hw.init = &(struct clk_init_data){             \
                        .name = #prefix "_bit_div_clk",         \
-                       .parent_names = (const char *[]){       \
-                               #prefix "_div_clk"              \
-                       },                                      \
+                       .parent_hws = (const struct clk_hw*[]){ \
+                               &prefix##_div_clk.clkr.hw,      \
+                       },                                      \
                        .num_parents = 1,                       \
                        .ops = &clk_branch_ops,                 \
                        .flags = CLK_SET_RATE_PARENT,           \
                },                                              \
        },                                                      \
 };                                                             \
-                                                               \
+
+#define CLK_AIF_OSR_BIT_CLK(prefix, _ns, _shift)               \
 static struct clk_regmap_mux prefix##_bit_clk = {              \
        .reg = _ns,                                             \
-       .shift = 18,                                            \
+       .shift = _shift,                                        \
        .width = 1,                                             \
        .clkr = {                                               \
                .hw.init = &(struct clk_init_data){             \
                        .name = #prefix "_bit_clk",             \
-                       .parent_names = (const char *[]){       \
-                               #prefix "_bit_div_clk",         \
-                               #prefix "_codec_clk",           \
+                       .parent_data = (const struct clk_parent_data[]){ \
+                               { .hw = &prefix##_bit_div_clk.clkr.hw, }, \
+                               { .fw_name = #prefix "_codec_clk", \
+                                 .name = #prefix "_codec_clk", }, \
                        },                                      \
                        .num_parents = 2,                       \
                        .ops = &clk_regmap_mux_closest_ops,     \
                        .flags = CLK_SET_RATE_PARENT,           \
                },                                              \
        },                                                      \
-}
+};
+
+CLK_AIF_OSR_SRC(mi2s, 0x48, 0x4c)
+CLK_AIF_OSR_CLK(mi2s, 0x48, 0x50, 17)
+CLK_AIF_OSR_DIV_CLK(mi2s, 0x48, 4)
+CLK_AIF_OSR_BIT_DIV_CLK(mi2s, 0x48, 0x50, 15)
+CLK_AIF_OSR_BIT_CLK(mi2s, 0x48, 14)
+
+#define CLK_AIF_OSR_DIV(prefix, _ns, _md, hr)                  \
+       CLK_AIF_OSR_SRC(prefix, _ns, _md)                       \
+       CLK_AIF_OSR_CLK(prefix, _ns, hr, 21)                    \
+       CLK_AIF_OSR_DIV_CLK(prefix, _ns, 8)                     \
+       CLK_AIF_OSR_BIT_DIV_CLK(prefix, _ns, hr, 19)            \
+       CLK_AIF_OSR_BIT_CLK(prefix, _ns, 18)
 
 CLK_AIF_OSR_DIV(codec_i2s_mic, 0x60, 0x64, 0x68);
 CLK_AIF_OSR_DIV(spare_i2s_mic, 0x78, 0x7c, 0x80);
@@ -361,8 +276,8 @@ static struct clk_rcg pcm_src = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "pcm_src",
-                       .parent_names = lcc_pxo_pll4,
-                       .num_parents = 2,
+                       .parent_data = lcc_pxo_pll4,
+                       .num_parents = ARRAY_SIZE(lcc_pxo_pll4),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_RATE_GATE,
                },
@@ -378,7 +293,9 @@ static struct clk_branch pcm_clk_out = {
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
                        .name = "pcm_clk_out",
-                       .parent_names = (const char *[]){ "pcm_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &pcm_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -393,9 +310,9 @@ static struct clk_regmap_mux pcm_clk = {
        .clkr = {
                .hw.init = &(struct clk_init_data){
                        .name = "pcm_clk",
-                       .parent_names = (const char *[]){
-                               "pcm_clk_out",
-                               "pcm_codec_clk",
+                       .parent_data = (const struct clk_parent_data[]){
+                               { .hw = &pcm_clk_out.clkr.hw },
+                               { .fw_name = "pcm_codec_clk", .name = "pcm_codec_clk" },
                        },
                        .num_parents = 2,
                        .ops = &clk_regmap_mux_closest_ops,
@@ -429,18 +346,14 @@ static struct clk_rcg slimbus_src = {
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
                        .name = "slimbus_src",
-                       .parent_names = lcc_pxo_pll4,
-                       .num_parents = 2,
+                       .parent_data = lcc_pxo_pll4,
+                       .num_parents = ARRAY_SIZE(lcc_pxo_pll4),
                        .ops = &clk_rcg_ops,
                        .flags = CLK_SET_RATE_GATE,
                },
        },
 };
 
-static const char * const lcc_slimbus_parents[] = {
-       "slimbus_src",
-};
-
 static struct clk_branch audio_slimbus_clk = {
        .halt_reg = 0xd4,
        .halt_bit = 0,
@@ -450,7 +363,9 @@ static struct clk_branch audio_slimbus_clk = {
                .enable_mask = BIT(10),
                .hw.init = &(struct clk_init_data){
                        .name = "audio_slimbus_clk",
-                       .parent_names = lcc_slimbus_parents,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &slimbus_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -467,7 +382,9 @@ static struct clk_branch sps_slimbus_clk = {
                .enable_mask = BIT(12),
                .hw.init = &(struct clk_init_data){
                        .name = "sps_slimbus_clk",
-                       .parent_names = lcc_slimbus_parents,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &slimbus_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
index 6ab6e5a..063e036 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/pm_runtime.h>
 #include <linux/regmap.h>
 
+#include <dt-bindings/clock/qcom,lpass-sc7280.h>
 #include <dt-bindings/clock/qcom,lpassaudiocc-sc7280.h>
 
 #include "clk-alpha-pll.h"
@@ -22,6 +23,7 @@
 #include "clk-regmap-mux.h"
 #include "common.h"
 #include "gdsc.h"
+#include "reset.h"
 
 enum {
        P_BI_TCXO,
@@ -38,6 +40,32 @@ static const struct pll_vco zonda_vco[] = {
        { 595200000UL, 3600000000UL, 0 },
 };
 
+static struct clk_branch lpass_q6ss_ahbm_clk = {
+       .halt_reg = 0x901c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x901c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                               .name = "lpass_q6ss_ahbm_clk",
+                               .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch lpass_q6ss_ahbs_clk = {
+       .halt_reg = 0x9020,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x9020,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "lpass_q6ss_ahbs_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
 /* 1128.96MHz configuration */
 static const struct alpha_pll_config lpass_audio_cc_pll_config = {
        .l = 0x3a,
@@ -221,7 +249,7 @@ static struct clk_rcg2 lpass_aon_cc_main_rcg_clk_src = {
                .parent_data = lpass_aon_cc_parent_data_0,
                .num_parents = ARRAY_SIZE(lpass_aon_cc_parent_data_0),
                .flags = CLK_OPS_PARENT_ENABLE,
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -614,6 +642,11 @@ static struct gdsc lpass_aon_cc_lpass_audio_hm_gdsc = {
        .flags = RETAIN_FF_ENABLE,
 };
 
+static struct clk_regmap *lpass_cc_sc7280_clocks[] = {
+       [LPASS_Q6SS_AHBM_CLK] = &lpass_q6ss_ahbm_clk.clkr,
+       [LPASS_Q6SS_AHBS_CLK] = &lpass_q6ss_ahbs_clk.clkr,
+};
+
 static struct clk_regmap *lpass_aon_cc_sc7280_clocks[] = {
        [LPASS_AON_CC_AUDIO_HM_H_CLK] = &lpass_aon_cc_audio_hm_h_clk.clkr,
        [LPASS_AON_CC_VA_MEM0_CLK] = &lpass_aon_cc_va_mem0_clk.clkr,
@@ -659,12 +692,30 @@ static struct regmap_config lpass_audio_cc_sc7280_regmap_config = {
        .fast_io = true,
 };
 
+static const struct qcom_cc_desc lpass_cc_sc7280_desc = {
+       .config = &lpass_audio_cc_sc7280_regmap_config,
+       .clks = lpass_cc_sc7280_clocks,
+       .num_clks = ARRAY_SIZE(lpass_cc_sc7280_clocks),
+};
+
 static const struct qcom_cc_desc lpass_audio_cc_sc7280_desc = {
        .config = &lpass_audio_cc_sc7280_regmap_config,
        .clks = lpass_audio_cc_sc7280_clocks,
        .num_clks = ARRAY_SIZE(lpass_audio_cc_sc7280_clocks),
 };
 
+static const struct qcom_reset_map lpass_audio_cc_sc7280_resets[] = {
+       [LPASS_AUDIO_SWR_RX_CGCR] =  { 0xa0, 1 },
+       [LPASS_AUDIO_SWR_TX_CGCR] =  { 0xa8, 1 },
+       [LPASS_AUDIO_SWR_WSA_CGCR] = { 0xb0, 1 },
+};
+
+static const struct qcom_cc_desc lpass_audio_cc_reset_sc7280_desc = {
+       .config = &lpass_audio_cc_sc7280_regmap_config,
+       .resets = lpass_audio_cc_sc7280_resets,
+       .num_resets = ARRAY_SIZE(lpass_audio_cc_sc7280_resets),
+};
+
 static const struct of_device_id lpass_audio_cc_sc7280_match_table[] = {
        { .compatible = "qcom,sc7280-lpassaudiocc" },
        { }
@@ -741,6 +792,13 @@ static int lpass_audio_cc_sc7280_probe(struct platform_device *pdev)
                return ret;
        }
 
+       ret = qcom_cc_probe_by_index(pdev, 1, &lpass_audio_cc_reset_sc7280_desc);
+       if (ret) {
+               dev_err(&pdev->dev, "Failed to register LPASS AUDIO CC Resets\n");
+               pm_runtime_disable(&pdev->dev);
+               return ret;
+       }
+
        pm_runtime_mark_last_busy(&pdev->dev);
        pm_runtime_put_autosuspend(&pdev->dev);
        pm_runtime_put_sync(&pdev->dev);
@@ -785,6 +843,12 @@ static int lpass_aon_cc_sc7280_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
+       if (of_property_read_bool(pdev->dev.of_node, "qcom,adsp-pil-mode")) {
+               lpass_audio_cc_sc7280_regmap_config.name = "cc";
+               desc = &lpass_cc_sc7280_desc;
+               return qcom_cc_probe(pdev, desc);
+       }
+
        lpass_audio_cc_sc7280_regmap_config.name = "lpasscc_aon";
        lpass_audio_cc_sc7280_regmap_config.max_register = 0xa0008;
        desc = &lpass_aon_cc_sc7280_desc;
index b39ee1c..5c1e17b 100644 (file)
 #include "clk-branch.h"
 #include "common.h"
 
-static struct clk_branch lpass_q6ss_ahbm_clk = {
-       .halt_reg = 0x1c,
-       .halt_check = BRANCH_HALT,
-       .clkr = {
-               .enable_reg = 0x1c,
-               .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data){
-                       .name = "lpass_q6ss_ahbm_clk",
-                       .ops = &clk_branch2_ops,
-               },
-       },
-};
-
-static struct clk_branch lpass_q6ss_ahbs_clk = {
-       .halt_reg = 0x20,
-       .halt_check = BRANCH_HALT_VOTED,
-       .clkr = {
-               .enable_reg = 0x20,
-               .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data){
-                       .name = "lpass_q6ss_ahbs_clk",
-                       .ops = &clk_branch2_ops,
-               },
-       },
-};
-
 static struct clk_branch lpass_top_cc_lpi_q6_axim_hs_clk = {
        .halt_reg = 0x0,
        .halt_check = BRANCH_HALT,
@@ -105,17 +79,6 @@ static struct regmap_config lpass_regmap_config = {
        .fast_io        = true,
 };
 
-static struct clk_regmap *lpass_cc_sc7280_clocks[] = {
-       [LPASS_Q6SS_AHBM_CLK] = &lpass_q6ss_ahbm_clk.clkr,
-       [LPASS_Q6SS_AHBS_CLK] = &lpass_q6ss_ahbs_clk.clkr,
-};
-
-static const struct qcom_cc_desc lpass_cc_sc7280_desc = {
-       .config = &lpass_regmap_config,
-       .clks = lpass_cc_sc7280_clocks,
-       .num_clks = ARRAY_SIZE(lpass_cc_sc7280_clocks),
-};
-
 static struct clk_regmap *lpass_cc_top_sc7280_clocks[] = {
        [LPASS_TOP_CC_LPI_Q6_AXIM_HS_CLK] =
                                &lpass_top_cc_lpi_q6_axim_hs_clk.clkr,
@@ -169,13 +132,6 @@ static int lpass_cc_sc7280_probe(struct platform_device *pdev)
        if (ret)
                goto destroy_pm_clk;
 
-       lpass_regmap_config.name = "cc";
-       desc = &lpass_cc_sc7280_desc;
-
-       ret = qcom_cc_probe_by_index(pdev, 2, desc);
-       if (ret)
-               goto destroy_pm_clk;
-
        return 0;
 
 destroy_pm_clk:
index 1f1f1bd..6ad19b0 100644 (file)
@@ -190,6 +190,19 @@ static struct clk_rcg2 lpass_core_cc_ext_if1_clk_src = {
        },
 };
 
+static struct clk_rcg2 lpass_core_cc_ext_mclk0_clk_src = {
+       .cmd_rcgr = 0x20000,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = lpass_core_cc_parent_map_0,
+       .freq_tbl = ftbl_lpass_core_cc_ext_if0_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data){
+               .name = "lpass_core_cc_ext_mclk0_clk_src",
+               .parent_data = lpass_core_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(lpass_core_cc_parent_data_0),
+               .ops = &clk_rcg2_ops,
+       },
+};
 
 static struct clk_branch lpass_core_cc_core_clk = {
        .halt_reg = 0x1f000,
@@ -283,6 +296,24 @@ static struct clk_branch lpass_core_cc_lpm_mem0_core_clk = {
        },
 };
 
+static struct clk_branch lpass_core_cc_ext_mclk0_clk = {
+       .halt_reg = 0x20014,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x20014,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data){
+                       .name = "lpass_core_cc_ext_mclk0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &lpass_core_cc_ext_mclk0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
 static struct clk_branch lpass_core_cc_sysnoc_mport_core_clk = {
        .halt_reg = 0x23000,
        .halt_check = BRANCH_HALT_VOTED,
@@ -326,6 +357,8 @@ static struct clk_regmap *lpass_core_cc_sc7280_clocks[] = {
        [LPASS_CORE_CC_LPM_CORE_CLK] = &lpass_core_cc_lpm_core_clk.clkr,
        [LPASS_CORE_CC_LPM_MEM0_CORE_CLK] = &lpass_core_cc_lpm_mem0_core_clk.clkr,
        [LPASS_CORE_CC_SYSNOC_MPORT_CORE_CLK] = &lpass_core_cc_sysnoc_mport_core_clk.clkr,
+       [LPASS_CORE_CC_EXT_MCLK0_CLK] = &lpass_core_cc_ext_mclk0_clk.clkr,
+       [LPASS_CORE_CC_EXT_MCLK0_CLK_SRC] = &lpass_core_cc_ext_mclk0_clk_src.clkr,
 };
 
 static struct regmap_config lpass_core_cc_sc7280_regmap_config = {
index aaaad65..6bf908a 100644 (file)
@@ -41,70 +41,6 @@ enum {
 
 #define F_MN(f, s, _m, _n) { .freq = f, .src = s, .m = _m, .n = _n }
 
-static const struct parent_map mmcc_pxo_pll8_pll2_map[] = {
-       { P_PXO, 0 },
-       { P_PLL8, 2 },
-       { P_PLL2, 1 }
-};
-
-static const char * const mmcc_pxo_pll8_pll2[] = {
-       "pxo",
-       "pll8_vote",
-       "pll2",
-};
-
-static const struct parent_map mmcc_pxo_pll8_pll2_pll3_map[] = {
-       { P_PXO, 0 },
-       { P_PLL8, 2 },
-       { P_PLL2, 1 },
-       { P_PLL3, 3 }
-};
-
-static const char * const mmcc_pxo_pll8_pll2_pll15[] = {
-       "pxo",
-       "pll8_vote",
-       "pll2",
-       "pll15",
-};
-
-static const struct parent_map mmcc_pxo_pll8_pll2_pll15_map[] = {
-       { P_PXO, 0 },
-       { P_PLL8, 2 },
-       { P_PLL2, 1 },
-       { P_PLL15, 3 }
-};
-
-static const char * const mmcc_pxo_pll8_pll2_pll3[] = {
-       "pxo",
-       "pll8_vote",
-       "pll2",
-       "pll3",
-};
-
-static const struct parent_map mmcc_pxo_dsi2_dsi1_map[] = {
-       { P_PXO, 0 },
-       { P_DSI2_PLL_DSICLK, 1 },
-       { P_DSI1_PLL_DSICLK, 3 },
-};
-
-static const char * const mmcc_pxo_dsi2_dsi1[] = {
-       "pxo",
-       "dsi2pll",
-       "dsi1pll",
-};
-
-static const struct parent_map mmcc_pxo_dsi1_dsi2_byte_map[] = {
-       { P_PXO, 0 },
-       { P_DSI1_PLL_BYTECLK, 1 },
-       { P_DSI2_PLL_BYTECLK, 2 },
-};
-
-static const char * const mmcc_pxo_dsi1_dsi2_byte[] = {
-       "pxo",
-       "dsi1pllbyte",
-       "dsi2pllbyte",
-};
-
 static struct clk_pll pll2 = {
        .l_reg = 0x320,
        .m_reg = 0x324,
@@ -115,7 +51,9 @@ static struct clk_pll pll2 = {
        .status_bit = 16,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pll2",
-               .parent_names = (const char *[]){ "pxo" },
+               .parent_data = (const struct clk_parent_data[]){
+                       { .fw_name = "pxo", .name = "pxo_board" },
+               },
                .num_parents = 1,
                .ops = &clk_pll_ops,
        },
@@ -131,7 +69,9 @@ static struct clk_pll pll15 = {
        .status_bit = 16,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pll15",
-               .parent_names = (const char *[]){ "pxo" },
+               .parent_data = (const struct clk_parent_data[]){
+                       { .fw_name = "pxo", .name = "pxo_board" },
+               },
                .num_parents = 1,
                .ops = &clk_pll_ops,
        },
@@ -151,6 +91,70 @@ static const struct pll_config pll15_config = {
        .main_output_mask = BIT(23),
 };
 
+static const struct parent_map mmcc_pxo_pll8_pll2_map[] = {
+       { P_PXO, 0 },
+       { P_PLL8, 2 },
+       { P_PLL2, 1 }
+};
+
+static const struct clk_parent_data mmcc_pxo_pll8_pll2[] = {
+       { .fw_name = "pxo", .name = "pxo_board" },
+       { .fw_name = "pll8_vote", .name = "pll8_vote" },
+       { .hw = &pll2.clkr.hw },
+};
+
+static const struct parent_map mmcc_pxo_pll8_pll2_pll3_map[] = {
+       { P_PXO, 0 },
+       { P_PLL8, 2 },
+       { P_PLL2, 1 },
+       { P_PLL3, 3 }
+};
+
+static const struct clk_parent_data mmcc_pxo_pll8_pll2_pll15[] = {
+       { .fw_name = "pxo", .name = "pxo_board" },
+       { .fw_name = "pll8_vote", .name = "pll8_vote" },
+       { .hw = &pll2.clkr.hw },
+       { .hw = &pll15.clkr.hw },
+};
+
+static const struct parent_map mmcc_pxo_pll8_pll2_pll15_map[] = {
+       { P_PXO, 0 },
+       { P_PLL8, 2 },
+       { P_PLL2, 1 },
+       { P_PLL15, 3 }
+};
+
+static const struct clk_parent_data mmcc_pxo_pll8_pll2_pll3[] = {
+       { .fw_name = "pxo", .name = "pxo_board" },
+       { .fw_name = "pll8_vote", .name = "pll8_vote" },
+       { .hw = &pll2.clkr.hw },
+       { .fw_name = "pll3", .name = "pll3" },
+};
+
+static const struct parent_map mmcc_pxo_dsi2_dsi1_map[] = {
+       { P_PXO, 0 },
+       { P_DSI2_PLL_DSICLK, 1 },
+       { P_DSI1_PLL_DSICLK, 3 },
+};
+
+static const struct clk_parent_data mmcc_pxo_dsi2_dsi1[] = {
+       { .fw_name = "pxo", .name = "pxo_board" },
+       { .fw_name = "dsi2pll", .name = "dsi2pll" },
+       { .fw_name = "dsi1pll", .name = "dsi1pll" },
+};
+
+static const struct parent_map mmcc_pxo_dsi1_dsi2_byte_map[] = {
+       { P_PXO, 0 },
+       { P_DSI1_PLL_BYTECLK, 1 },
+       { P_DSI2_PLL_BYTECLK, 2 },
+};
+
+static const struct clk_parent_data mmcc_pxo_dsi1_dsi2_byte[] = {
+       { .fw_name = "pxo", .name = "pxo_board" },
+       { .fw_name = "dsi1pllbyte", .name = "dsi1pllbyte" },
+       { .fw_name = "dsi2pllbyte", .name = "dsi2pllbyte" },
+};
+
 static struct freq_tbl clk_tbl_cam[] = {
        {   6000000, P_PLL8, 4, 1, 16 },
        {   8000000, P_PLL8, 4, 1, 12 },
@@ -192,8 +196,8 @@ static struct clk_rcg camclk0_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "camclk0_src",
-                       .parent_names = mmcc_pxo_pll8_pll2,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_pll8_pll2,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
                        .ops = &clk_rcg_ops,
                },
        },
@@ -207,7 +211,9 @@ static struct clk_branch camclk0_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "camclk0_clk",
-                       .parent_names = (const char *[]){ "camclk0_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camclk0_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                },
@@ -241,8 +247,8 @@ static struct clk_rcg camclk1_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "camclk1_src",
-                       .parent_names = mmcc_pxo_pll8_pll2,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_pll8_pll2,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
                        .ops = &clk_rcg_ops,
                },
        },
@@ -256,7 +262,9 @@ static struct clk_branch camclk1_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "camclk1_clk",
-                       .parent_names = (const char *[]){ "camclk1_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camclk1_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                },
@@ -290,8 +298,8 @@ static struct clk_rcg camclk2_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "camclk2_src",
-                       .parent_names = mmcc_pxo_pll8_pll2,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_pll8_pll2,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
                        .ops = &clk_rcg_ops,
                },
        },
@@ -305,7 +313,9 @@ static struct clk_branch camclk2_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "camclk2_clk",
-                       .parent_names = (const char *[]){ "camclk2_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camclk2_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                },
@@ -345,8 +355,8 @@ static struct clk_rcg csi0_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "csi0_src",
-                       .parent_names = mmcc_pxo_pll8_pll2,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_pll8_pll2,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
                        .ops = &clk_rcg_ops,
                },
        },
@@ -359,7 +369,9 @@ static struct clk_branch csi0_clk = {
                .enable_reg = 0x0040,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .parent_names = (const char *[]){ "csi0_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi0_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .name = "csi0_clk",
                        .ops = &clk_branch_ops,
@@ -375,7 +387,9 @@ static struct clk_branch csi0_phy_clk = {
                .enable_reg = 0x0040,
                .enable_mask = BIT(8),
                .hw.init = &(struct clk_init_data){
-                       .parent_names = (const char *[]){ "csi0_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi0_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .name = "csi0_phy_clk",
                        .ops = &clk_branch_ops,
@@ -409,8 +423,8 @@ static struct clk_rcg csi1_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "csi1_src",
-                       .parent_names = mmcc_pxo_pll8_pll2,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_pll8_pll2,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
                        .ops = &clk_rcg_ops,
                },
        },
@@ -423,7 +437,9 @@ static struct clk_branch csi1_clk = {
                .enable_reg = 0x0024,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .parent_names = (const char *[]){ "csi1_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi1_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .name = "csi1_clk",
                        .ops = &clk_branch_ops,
@@ -439,7 +455,9 @@ static struct clk_branch csi1_phy_clk = {
                .enable_reg = 0x0024,
                .enable_mask = BIT(8),
                .hw.init = &(struct clk_init_data){
-                       .parent_names = (const char *[]){ "csi1_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi1_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .name = "csi1_phy_clk",
                        .ops = &clk_branch_ops,
@@ -473,8 +491,8 @@ static struct clk_rcg csi2_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "csi2_src",
-                       .parent_names = mmcc_pxo_pll8_pll2,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_pll8_pll2,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
                        .ops = &clk_rcg_ops,
                },
        },
@@ -487,7 +505,9 @@ static struct clk_branch csi2_clk = {
                .enable_reg = 0x022c,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .parent_names = (const char *[]){ "csi2_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi2_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .name = "csi2_clk",
                        .ops = &clk_branch_ops,
@@ -503,7 +523,9 @@ static struct clk_branch csi2_phy_clk = {
                .enable_reg = 0x022c,
                .enable_mask = BIT(8),
                .hw.init = &(struct clk_init_data){
-                       .parent_names = (const char *[]){ "csi2_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi2_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .name = "csi2_phy_clk",
                        .ops = &clk_branch_ops,
@@ -602,10 +624,10 @@ static const struct clk_ops clk_ops_pix_rdi = {
        .determine_rate = __clk_mux_determine_rate,
 };
 
-static const char * const pix_rdi_parents[] = {
-       "csi0_clk",
-       "csi1_clk",
-       "csi2_clk",
+static const struct clk_hw *pix_rdi_parents[] = {
+       &csi0_clk.clkr.hw,
+       &csi1_clk.clkr.hw,
+       &csi2_clk.clkr.hw,
 };
 
 static struct clk_pix_rdi csi_pix_clk = {
@@ -618,8 +640,8 @@ static struct clk_pix_rdi csi_pix_clk = {
                .enable_mask = BIT(26),
                .hw.init = &(struct clk_init_data){
                        .name = "csi_pix_clk",
-                       .parent_names = pix_rdi_parents,
-                       .num_parents = 3,
+                       .parent_hws = pix_rdi_parents,
+                       .num_parents = ARRAY_SIZE(pix_rdi_parents),
                        .ops = &clk_ops_pix_rdi,
                },
        },
@@ -635,8 +657,8 @@ static struct clk_pix_rdi csi_pix1_clk = {
                .enable_mask = BIT(10),
                .hw.init = &(struct clk_init_data){
                        .name = "csi_pix1_clk",
-                       .parent_names = pix_rdi_parents,
-                       .num_parents = 3,
+                       .parent_hws = pix_rdi_parents,
+                       .num_parents = ARRAY_SIZE(pix_rdi_parents),
                        .ops = &clk_ops_pix_rdi,
                },
        },
@@ -652,8 +674,8 @@ static struct clk_pix_rdi csi_rdi_clk = {
                .enable_mask = BIT(13),
                .hw.init = &(struct clk_init_data){
                        .name = "csi_rdi_clk",
-                       .parent_names = pix_rdi_parents,
-                       .num_parents = 3,
+                       .parent_hws = pix_rdi_parents,
+                       .num_parents = ARRAY_SIZE(pix_rdi_parents),
                        .ops = &clk_ops_pix_rdi,
                },
        },
@@ -669,8 +691,8 @@ static struct clk_pix_rdi csi_rdi1_clk = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "csi_rdi1_clk",
-                       .parent_names = pix_rdi_parents,
-                       .num_parents = 3,
+                       .parent_hws = pix_rdi_parents,
+                       .num_parents = ARRAY_SIZE(pix_rdi_parents),
                        .ops = &clk_ops_pix_rdi,
                },
        },
@@ -686,8 +708,8 @@ static struct clk_pix_rdi csi_rdi2_clk = {
                .enable_mask = BIT(6),
                .hw.init = &(struct clk_init_data){
                        .name = "csi_rdi2_clk",
-                       .parent_names = pix_rdi_parents,
-                       .num_parents = 3,
+                       .parent_hws = pix_rdi_parents,
+                       .num_parents = ARRAY_SIZE(pix_rdi_parents),
                        .ops = &clk_ops_pix_rdi,
                },
        },
@@ -725,15 +747,13 @@ static struct clk_rcg csiphytimer_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "csiphytimer_src",
-                       .parent_names = mmcc_pxo_pll8_pll2,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_pll8_pll2,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
                        .ops = &clk_rcg_ops,
                },
        },
 };
 
-static const char * const csixphy_timer_src[] = { "csiphytimer_src" };
-
 static struct clk_branch csiphy0_timer_clk = {
        .halt_reg = 0x01e8,
        .halt_bit = 17,
@@ -741,7 +761,9 @@ static struct clk_branch csiphy0_timer_clk = {
                .enable_reg = 0x0160,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .parent_names = csixphy_timer_src,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csiphytimer_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .name = "csiphy0_timer_clk",
                        .ops = &clk_branch_ops,
@@ -757,7 +779,9 @@ static struct clk_branch csiphy1_timer_clk = {
                .enable_reg = 0x0160,
                .enable_mask = BIT(9),
                .hw.init = &(struct clk_init_data){
-                       .parent_names = csixphy_timer_src,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csiphytimer_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .name = "csiphy1_timer_clk",
                        .ops = &clk_branch_ops,
@@ -773,7 +797,9 @@ static struct clk_branch csiphy2_timer_clk = {
                .enable_reg = 0x0160,
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
-                       .parent_names = csixphy_timer_src,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csiphytimer_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .name = "csiphy2_timer_clk",
                        .ops = &clk_branch_ops,
@@ -835,8 +861,8 @@ static struct clk_dyn_rcg gfx2d0_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "gfx2d0_src",
-                       .parent_names = mmcc_pxo_pll8_pll2,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_pll8_pll2,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
                        .ops = &clk_dyn_rcg_ops,
                },
        },
@@ -850,7 +876,9 @@ static struct clk_branch gfx2d0_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gfx2d0_clk",
-                       .parent_names = (const char *[]){ "gfx2d0_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gfx2d0_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -895,8 +923,8 @@ static struct clk_dyn_rcg gfx2d1_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "gfx2d1_src",
-                       .parent_names = mmcc_pxo_pll8_pll2,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_pll8_pll2,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
                        .ops = &clk_dyn_rcg_ops,
                },
        },
@@ -910,7 +938,9 @@ static struct clk_branch gfx2d1_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gfx2d1_clk",
-                       .parent_names = (const char *[]){ "gfx2d1_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gfx2d1_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -996,8 +1026,8 @@ static struct clk_dyn_rcg gfx3d_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "gfx3d_src",
-                       .parent_names = mmcc_pxo_pll8_pll2_pll3,
-                       .num_parents = 4,
+                       .parent_data = mmcc_pxo_pll8_pll2_pll3,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2_pll3),
                        .ops = &clk_dyn_rcg_ops,
                },
        },
@@ -1005,8 +1035,8 @@ static struct clk_dyn_rcg gfx3d_src = {
 
 static const struct clk_init_data gfx3d_8064_init = {
        .name = "gfx3d_src",
-       .parent_names = mmcc_pxo_pll8_pll2_pll15,
-       .num_parents = 4,
+       .parent_data = mmcc_pxo_pll8_pll2_pll15,
+       .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2_pll15),
        .ops = &clk_dyn_rcg_ops,
 };
 
@@ -1018,7 +1048,9 @@ static struct clk_branch gfx3d_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gfx3d_clk",
-                       .parent_names = (const char *[]){ "gfx3d_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gfx3d_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1074,8 +1106,8 @@ static struct clk_dyn_rcg vcap_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "vcap_src",
-                       .parent_names = mmcc_pxo_pll8_pll2,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_pll8_pll2,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
                        .ops = &clk_dyn_rcg_ops,
                },
        },
@@ -1089,7 +1121,9 @@ static struct clk_branch vcap_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "vcap_clk",
-                       .parent_names = (const char *[]){ "vcap_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vcap_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1105,7 +1139,9 @@ static struct clk_branch vcap_npl_clk = {
                .enable_mask = BIT(13),
                .hw.init = &(struct clk_init_data){
                        .name = "vcap_npl_clk",
-                       .parent_names = (const char *[]){ "vcap_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vcap_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1153,8 +1189,8 @@ static struct clk_rcg ijpeg_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "ijpeg_src",
-                       .parent_names = mmcc_pxo_pll8_pll2,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_pll8_pll2,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
                        .ops = &clk_rcg_ops,
                },
        },
@@ -1168,7 +1204,9 @@ static struct clk_branch ijpeg_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "ijpeg_clk",
-                       .parent_names = (const char *[]){ "ijpeg_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &ijpeg_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1201,8 +1239,8 @@ static struct clk_rcg jpegd_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "jpegd_src",
-                       .parent_names = mmcc_pxo_pll8_pll2,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_pll8_pll2,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
                        .ops = &clk_rcg_ops,
                },
        },
@@ -1216,7 +1254,9 @@ static struct clk_branch jpegd_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "jpegd_clk",
-                       .parent_names = (const char *[]){ "jpegd_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &jpegd_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1281,8 +1321,8 @@ static struct clk_dyn_rcg mdp_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "mdp_src",
-                       .parent_names = mmcc_pxo_pll8_pll2,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_pll8_pll2,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
                        .ops = &clk_dyn_rcg_ops,
                },
        },
@@ -1296,7 +1336,9 @@ static struct clk_branch mdp_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "mdp_clk",
-                       .parent_names = (const char *[]){ "mdp_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &mdp_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1311,7 +1353,9 @@ static struct clk_branch mdp_lut_clk = {
                .enable_reg = 0x016c,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .parent_names = (const char *[]){ "mdp_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &mdp_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .name = "mdp_lut_clk",
                        .ops = &clk_branch_ops,
@@ -1328,7 +1372,9 @@ static struct clk_branch mdp_vsync_clk = {
                .enable_mask = BIT(6),
                .hw.init = &(struct clk_init_data){
                        .name = "mdp_vsync_clk",
-                       .parent_names = (const char *[]){ "pxo" },
+                       .parent_data = (const struct clk_parent_data[]){
+                               { .fw_name = "pxo", .name = "pxo_board" },
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops
                },
@@ -1380,8 +1426,8 @@ static struct clk_dyn_rcg rot_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "rot_src",
-                       .parent_names = mmcc_pxo_pll8_pll2,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_pll8_pll2,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
                        .ops = &clk_dyn_rcg_ops,
                },
        },
@@ -1395,7 +1441,9 @@ static struct clk_branch rot_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "rot_clk",
-                       .parent_names = (const char *[]){ "rot_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &rot_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1408,9 +1456,9 @@ static const struct parent_map mmcc_pxo_hdmi_map[] = {
        { P_HDMI_PLL, 3 }
 };
 
-static const char * const mmcc_pxo_hdmi[] = {
-       "pxo",
-       "hdmi_pll",
+static const struct clk_parent_data mmcc_pxo_hdmi[] = {
+       { .fw_name = "pxo", .name = "pxo_board" },
+       { .fw_name = "hdmipll", .name = "hdmi_pll" },
 };
 
 static struct freq_tbl clk_tbl_tv[] = {
@@ -1443,16 +1491,14 @@ static struct clk_rcg tv_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "tv_src",
-                       .parent_names = mmcc_pxo_hdmi,
-                       .num_parents = 2,
+                       .parent_data = mmcc_pxo_hdmi,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_hdmi),
                        .ops = &clk_rcg_bypass_ops,
                        .flags = CLK_SET_RATE_PARENT,
                },
        },
 };
 
-static const char * const tv_src_name[] = { "tv_src" };
-
 static struct clk_branch tv_enc_clk = {
        .halt_reg = 0x01d4,
        .halt_bit = 9,
@@ -1460,7 +1506,9 @@ static struct clk_branch tv_enc_clk = {
                .enable_reg = 0x00ec,
                .enable_mask = BIT(8),
                .hw.init = &(struct clk_init_data){
-                       .parent_names = tv_src_name,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &tv_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .name = "tv_enc_clk",
                        .ops = &clk_branch_ops,
@@ -1476,7 +1524,9 @@ static struct clk_branch tv_dac_clk = {
                .enable_reg = 0x00ec,
                .enable_mask = BIT(10),
                .hw.init = &(struct clk_init_data){
-                       .parent_names = tv_src_name,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &tv_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .name = "tv_dac_clk",
                        .ops = &clk_branch_ops,
@@ -1492,7 +1542,9 @@ static struct clk_branch mdp_tv_clk = {
                .enable_reg = 0x00ec,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .parent_names = tv_src_name,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &tv_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .name = "mdp_tv_clk",
                        .ops = &clk_branch_ops,
@@ -1508,7 +1560,9 @@ static struct clk_branch hdmi_tv_clk = {
                .enable_reg = 0x00ec,
                .enable_mask = BIT(12),
                .hw.init = &(struct clk_init_data){
-                       .parent_names = tv_src_name,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &tv_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .name = "hdmi_tv_clk",
                        .ops = &clk_branch_ops,
@@ -1524,7 +1578,9 @@ static struct clk_branch rgb_tv_clk = {
                .enable_reg = 0x0124,
                .enable_mask = BIT(14),
                .hw.init = &(struct clk_init_data){
-                       .parent_names = tv_src_name,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &tv_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .name = "rgb_tv_clk",
                        .ops = &clk_branch_ops,
@@ -1540,7 +1596,9 @@ static struct clk_branch npl_tv_clk = {
                .enable_reg = 0x0124,
                .enable_mask = BIT(16),
                .hw.init = &(struct clk_init_data){
-                       .parent_names = tv_src_name,
+                       .parent_hws = (const struct clk_hw*[]){
+                               &tv_src.clkr.hw,
+                       },
                        .num_parents = 1,
                        .name = "npl_tv_clk",
                        .ops = &clk_branch_ops,
@@ -1556,7 +1614,9 @@ static struct clk_branch hdmi_app_clk = {
                .enable_reg = 0x005c,
                .enable_mask = BIT(11),
                .hw.init = &(struct clk_init_data){
-                       .parent_names = (const char *[]){ "pxo" },
+                       .parent_data = (const struct clk_parent_data[]){
+                               { .fw_name = "pxo", .name = "pxo_board" },
+                       },
                        .num_parents = 1,
                        .name = "hdmi_app_clk",
                        .ops = &clk_branch_ops,
@@ -1614,8 +1674,8 @@ static struct clk_dyn_rcg vcodec_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "vcodec_src",
-                       .parent_names = mmcc_pxo_pll8_pll2,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_pll8_pll2,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
                        .ops = &clk_dyn_rcg_ops,
                },
        },
@@ -1629,7 +1689,9 @@ static struct clk_branch vcodec_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "vcodec_clk",
-                       .parent_names = (const char *[]){ "vcodec_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vcodec_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1665,8 +1727,8 @@ static struct clk_rcg vpe_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "vpe_src",
-                       .parent_names = mmcc_pxo_pll8_pll2,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_pll8_pll2,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
                        .ops = &clk_rcg_ops,
                },
        },
@@ -1680,7 +1742,9 @@ static struct clk_branch vpe_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "vpe_clk",
-                       .parent_names = (const char *[]){ "vpe_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vpe_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1733,8 +1797,8 @@ static struct clk_rcg vfe_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "vfe_src",
-                       .parent_names = mmcc_pxo_pll8_pll2,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_pll8_pll2,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
                        .ops = &clk_rcg_ops,
                },
        },
@@ -1748,7 +1812,9 @@ static struct clk_branch vfe_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "vfe_clk",
-                       .parent_names = (const char *[]){ "vfe_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vfe_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -1763,7 +1829,9 @@ static struct clk_branch vfe_csi_clk = {
                .enable_reg = 0x0104,
                .enable_mask = BIT(12),
                .hw.init = &(struct clk_init_data){
-                       .parent_names = (const char *[]){ "vfe_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vfe_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .name = "vfe_csi_clk",
                        .ops = &clk_branch_ops,
@@ -2067,8 +2135,8 @@ static struct clk_rcg dsi1_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "dsi1_src",
-                       .parent_names = mmcc_pxo_dsi2_dsi1,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_dsi2_dsi1,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_dsi2_dsi1),
                        .ops = &clk_rcg_bypass2_ops,
                        .flags = CLK_SET_RATE_PARENT,
                },
@@ -2083,7 +2151,9 @@ static struct clk_branch dsi1_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "dsi1_clk",
-                       .parent_names = (const char *[]){ "dsi1_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &dsi1_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2115,8 +2185,8 @@ static struct clk_rcg dsi2_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "dsi2_src",
-                       .parent_names = mmcc_pxo_dsi2_dsi1,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_dsi2_dsi1,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_dsi2_dsi1),
                        .ops = &clk_rcg_bypass2_ops,
                        .flags = CLK_SET_RATE_PARENT,
                },
@@ -2131,7 +2201,9 @@ static struct clk_branch dsi2_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "dsi2_clk",
-                       .parent_names = (const char *[]){ "dsi2_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &dsi2_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2154,8 +2226,8 @@ static struct clk_rcg dsi1_byte_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "dsi1_byte_src",
-                       .parent_names = mmcc_pxo_dsi1_dsi2_byte,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_dsi1_dsi2_byte,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_dsi1_dsi2_byte),
                        .ops = &clk_rcg_bypass2_ops,
                        .flags = CLK_SET_RATE_PARENT,
                },
@@ -2170,7 +2242,9 @@ static struct clk_branch dsi1_byte_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "dsi1_byte_clk",
-                       .parent_names = (const char *[]){ "dsi1_byte_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &dsi1_byte_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2193,8 +2267,8 @@ static struct clk_rcg dsi2_byte_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "dsi2_byte_src",
-                       .parent_names = mmcc_pxo_dsi1_dsi2_byte,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_dsi1_dsi2_byte,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_dsi1_dsi2_byte),
                        .ops = &clk_rcg_bypass2_ops,
                        .flags = CLK_SET_RATE_PARENT,
                },
@@ -2209,7 +2283,9 @@ static struct clk_branch dsi2_byte_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "dsi2_byte_clk",
-                       .parent_names = (const char *[]){ "dsi2_byte_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &dsi2_byte_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2232,8 +2308,8 @@ static struct clk_rcg dsi1_esc_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "dsi1_esc_src",
-                       .parent_names = mmcc_pxo_dsi1_dsi2_byte,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_dsi1_dsi2_byte,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_dsi1_dsi2_byte),
                        .ops = &clk_rcg_esc_ops,
                },
        },
@@ -2247,7 +2323,9 @@ static struct clk_branch dsi1_esc_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "dsi1_esc_clk",
-                       .parent_names = (const char *[]){ "dsi1_esc_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &dsi1_esc_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2270,8 +2348,8 @@ static struct clk_rcg dsi2_esc_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "dsi2_esc_src",
-                       .parent_names = mmcc_pxo_dsi1_dsi2_byte,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_dsi1_dsi2_byte,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_dsi1_dsi2_byte),
                        .ops = &clk_rcg_esc_ops,
                },
        },
@@ -2285,7 +2363,9 @@ static struct clk_branch dsi2_esc_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "dsi2_esc_clk",
-                       .parent_names = (const char *[]){ "dsi2_esc_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &dsi2_esc_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2317,8 +2397,8 @@ static struct clk_rcg dsi1_pixel_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "dsi1_pixel_src",
-                       .parent_names = mmcc_pxo_dsi2_dsi1,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_dsi2_dsi1,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_dsi2_dsi1),
                        .ops = &clk_rcg_pixel_ops,
                },
        },
@@ -2332,7 +2412,9 @@ static struct clk_branch dsi1_pixel_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "mdp_pclk1_clk",
-                       .parent_names = (const char *[]){ "dsi1_pixel_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &dsi1_pixel_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -2364,8 +2446,8 @@ static struct clk_rcg dsi2_pixel_src = {
                .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
                        .name = "dsi2_pixel_src",
-                       .parent_names = mmcc_pxo_dsi2_dsi1,
-                       .num_parents = 3,
+                       .parent_data = mmcc_pxo_dsi2_dsi1,
+                       .num_parents = ARRAY_SIZE(mmcc_pxo_dsi2_dsi1),
                        .ops = &clk_rcg_pixel_ops,
                },
        },
@@ -2379,7 +2461,9 @@ static struct clk_branch dsi2_pixel_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "mdp_pclk2_clk",
-                       .parent_names = (const char *[]){ "dsi2_pixel_src" },
+                       .parent_hws = (const struct clk_hw*[]){
+                               &dsi2_pixel_src.clkr.hw
+                       },
                        .num_parents = 1,
                        .ops = &clk_branch_ops,
                        .flags = CLK_SET_RATE_PARENT,
index 819d194..2a16adb 100644 (file)
 
 static int qcom_reset(struct reset_controller_dev *rcdev, unsigned long id)
 {
+       struct qcom_reset_controller *rst = to_qcom_reset_controller(rcdev);
+
        rcdev->ops->assert(rcdev, id);
-       udelay(1);
+       udelay(rst->reset_map[id].udelay ?: 1); /* use 1 us as default */
        rcdev->ops->deassert(rcdev, id);
        return 0;
 }
index 2a08b5e..b8c1135 100644 (file)
@@ -11,6 +11,7 @@
 struct qcom_reset_map {
        unsigned int reg;
        u8 bit;
+       u8 udelay;
 };
 
 struct regmap;
index e6d6cbf..273f77d 100644 (file)
@@ -81,19 +81,17 @@ MODULE_DEVICE_TABLE(of, exynos_clkout_ids);
 static int exynos_clkout_match_parent_dev(struct device *dev, u32 *mux_mask)
 {
        const struct exynos_clkout_variant *variant;
-       const struct of_device_id *match;
 
        if (!dev->parent) {
                dev_err(dev, "not instantiated from MFD\n");
                return -EINVAL;
        }
 
-       match = of_match_device(exynos_clkout_ids, dev->parent);
-       if (!match) {
+       variant = of_device_get_match_data(dev->parent);
+       if (!variant) {
                dev_err(dev, "cannot match parent device\n");
                return -EINVAL;
        }
-       variant = match->data;
 
        *mux_mask = variant->mux_mask;
 
index a7b1063..62ce681 100644 (file)
 #define CLK_CON_MUX_MUX_CLKCMU_CORE_BUS                0x1014
 #define CLK_CON_MUX_MUX_CLKCMU_CORE_CCI                0x1018
 #define CLK_CON_MUX_MUX_CLKCMU_CORE_G3D                0x101c
+#define CLK_CON_MUX_MUX_CLKCMU_FSYS_BUS                0x1028
+#define CLK_CON_MUX_MUX_CLKCMU_FSYS_MMC_CARD   0x102c
+#define CLK_CON_MUX_MUX_CLKCMU_FSYS_MMC_EMBD   0x1030
+#define CLK_CON_MUX_MUX_CLKCMU_FSYS_MMC_SDIO   0x1034
+#define CLK_CON_MUX_MUX_CLKCMU_FSYS_USB30DRD   0x1038
 #define CLK_CON_MUX_MUX_CLKCMU_PERI_BUS                0x1058
 #define CLK_CON_MUX_MUX_CLKCMU_PERI_SPI0       0x105c
 #define CLK_CON_MUX_MUX_CLKCMU_PERI_SPI1       0x1060
 #define CLK_CON_DIV_CLKCMU_CORE_BUS            0x181c
 #define CLK_CON_DIV_CLKCMU_CORE_CCI            0x1820
 #define CLK_CON_DIV_CLKCMU_CORE_G3D            0x1824
+#define CLK_CON_DIV_CLKCMU_FSYS_BUS            0x1844
+#define CLK_CON_DIV_CLKCMU_FSYS_MMC_CARD       0x1848
+#define CLK_CON_DIV_CLKCMU_FSYS_MMC_EMBD       0x184c
+#define CLK_CON_DIV_CLKCMU_FSYS_MMC_SDIO       0x1850
+#define CLK_CON_DIV_CLKCMU_FSYS_USB30DRD       0x1854
 #define CLK_CON_DIV_CLKCMU_PERI_BUS            0x1874
 #define CLK_CON_DIV_CLKCMU_PERI_SPI0           0x1878
 #define CLK_CON_DIV_CLKCMU_PERI_SPI1           0x187c
 #define CLK_CON_GAT_GATE_CLKCMU_CORE_BUS       0x201c
 #define CLK_CON_GAT_GATE_CLKCMU_CORE_CCI       0x2020
 #define CLK_CON_GAT_GATE_CLKCMU_CORE_G3D       0x2024
+#define CLK_CON_GAT_GATE_CLKCMU_FSYS_BUS       0x2044
+#define CLK_CON_GAT_GATE_CLKCMU_FSYS_MMC_CARD  0x2048
+#define CLK_CON_GAT_GATE_CLKCMU_FSYS_MMC_EMBD  0x204c
+#define CLK_CON_GAT_GATE_CLKCMU_FSYS_MMC_SDIO  0x2050
+#define CLK_CON_GAT_GATE_CLKCMU_FSYS_USB30DRD  0x2054
 #define CLK_CON_GAT_GATE_CLKCMU_PERI_BUS       0x207c
 #define CLK_CON_GAT_GATE_CLKCMU_PERI_SPI0      0x2080
 #define CLK_CON_GAT_GATE_CLKCMU_PERI_SPI1      0x2084
@@ -76,6 +91,11 @@ static const unsigned long top_clk_regs[] __initconst = {
        CLK_CON_MUX_MUX_CLKCMU_CORE_BUS,
        CLK_CON_MUX_MUX_CLKCMU_CORE_CCI,
        CLK_CON_MUX_MUX_CLKCMU_CORE_G3D,
+       CLK_CON_MUX_MUX_CLKCMU_FSYS_BUS,
+       CLK_CON_MUX_MUX_CLKCMU_FSYS_MMC_CARD,
+       CLK_CON_MUX_MUX_CLKCMU_FSYS_MMC_EMBD,
+       CLK_CON_MUX_MUX_CLKCMU_FSYS_MMC_SDIO,
+       CLK_CON_MUX_MUX_CLKCMU_FSYS_USB30DRD,
        CLK_CON_MUX_MUX_CLKCMU_PERI_BUS,
        CLK_CON_MUX_MUX_CLKCMU_PERI_SPI0,
        CLK_CON_MUX_MUX_CLKCMU_PERI_SPI1,
@@ -88,6 +108,11 @@ static const unsigned long top_clk_regs[] __initconst = {
        CLK_CON_DIV_CLKCMU_CORE_BUS,
        CLK_CON_DIV_CLKCMU_CORE_CCI,
        CLK_CON_DIV_CLKCMU_CORE_G3D,
+       CLK_CON_DIV_CLKCMU_FSYS_BUS,
+       CLK_CON_DIV_CLKCMU_FSYS_MMC_CARD,
+       CLK_CON_DIV_CLKCMU_FSYS_MMC_EMBD,
+       CLK_CON_DIV_CLKCMU_FSYS_MMC_SDIO,
+       CLK_CON_DIV_CLKCMU_FSYS_USB30DRD,
        CLK_CON_DIV_CLKCMU_PERI_BUS,
        CLK_CON_DIV_CLKCMU_PERI_SPI0,
        CLK_CON_DIV_CLKCMU_PERI_SPI1,
@@ -108,6 +133,11 @@ static const unsigned long top_clk_regs[] __initconst = {
        CLK_CON_GAT_GATE_CLKCMU_CORE_BUS,
        CLK_CON_GAT_GATE_CLKCMU_CORE_CCI,
        CLK_CON_GAT_GATE_CLKCMU_CORE_G3D,
+       CLK_CON_GAT_GATE_CLKCMU_FSYS_BUS,
+       CLK_CON_GAT_GATE_CLKCMU_FSYS_MMC_CARD,
+       CLK_CON_GAT_GATE_CLKCMU_FSYS_MMC_EMBD,
+       CLK_CON_GAT_GATE_CLKCMU_FSYS_MMC_SDIO,
+       CLK_CON_GAT_GATE_CLKCMU_FSYS_USB30DRD,
        CLK_CON_GAT_GATE_CLKCMU_PERI_BUS,
        CLK_CON_GAT_GATE_CLKCMU_PERI_SPI0,
        CLK_CON_GAT_GATE_CLKCMU_PERI_SPI1,
@@ -146,6 +176,13 @@ PNAME(mout_peri_usi0_p)            = { "oscclk", "dout_shared0_div4" };
 PNAME(mout_peri_usi1_p)                = { "oscclk", "dout_shared0_div4" };
 PNAME(mout_peri_usi2_p)                = { "oscclk", "dout_shared0_div4" };
 
+/* List of parent clocks for Muxes in CMU_TOP: for CMU_FSYS */
+PNAME(mout_fsys_bus_p)         = { "dout_shared0_div2", "dout_shared1_div2" };
+PNAME(mout_fsys_mmc_card_p)    = { "dout_shared0_div2", "dout_shared1_div2" };
+PNAME(mout_fsys_mmc_embd_p)    = { "dout_shared0_div2", "dout_shared1_div2" };
+PNAME(mout_fsys_mmc_sdio_p)    = { "dout_shared0_div2", "dout_shared1_div2" };
+PNAME(mout_fsys_usb30drd_p)    = { "dout_shared0_div4", "dout_shared1_div4" };
+
 static const struct samsung_mux_clock top_mux_clks[] __initconst = {
        /* CORE */
        MUX(CLK_MOUT_CORE_BUS, "mout_core_bus", mout_core_bus_p,
@@ -174,6 +211,18 @@ static const struct samsung_mux_clock top_mux_clks[] __initconst = {
            CLK_CON_MUX_MUX_CLKCMU_PERI_USI1, 0, 1),
        MUX(CLK_MOUT_PERI_USI2, "mout_peri_usi2", mout_peri_usi2_p,
            CLK_CON_MUX_MUX_CLKCMU_PERI_USI2, 0, 1),
+
+       /* FSYS */
+       MUX(CLK_MOUT_FSYS_BUS, "mout_fsys_bus", mout_fsys_bus_p,
+           CLK_CON_MUX_MUX_CLKCMU_FSYS_BUS, 0, 1),
+       MUX(CLK_MOUT_FSYS_MMC_CARD, "mout_fsys_mmc_card", mout_fsys_mmc_card_p,
+           CLK_CON_MUX_MUX_CLKCMU_FSYS_MMC_CARD, 0, 1),
+       MUX(CLK_MOUT_FSYS_MMC_EMBD, "mout_fsys_mmc_embd", mout_fsys_mmc_embd_p,
+           CLK_CON_MUX_MUX_CLKCMU_FSYS_MMC_EMBD, 0, 1),
+       MUX(CLK_MOUT_FSYS_MMC_SDIO, "mout_fsys_mmc_sdio", mout_fsys_mmc_sdio_p,
+           CLK_CON_MUX_MUX_CLKCMU_FSYS_MMC_SDIO, 0, 1),
+       MUX(CLK_MOUT_FSYS_USB30DRD, "mout_fsys_usb30drd", mout_fsys_usb30drd_p,
+           CLK_CON_MUX_MUX_CLKCMU_FSYS_USB30DRD, 0, 1),
 };
 
 static const struct samsung_div_clock top_div_clks[] __initconst = {
@@ -220,6 +269,18 @@ static const struct samsung_div_clock top_div_clks[] __initconst = {
            CLK_CON_DIV_CLKCMU_PERI_USI1, 0, 4),
        DIV(CLK_DOUT_PERI_USI2, "dout_peri_usi2", "gout_peri_usi2",
            CLK_CON_DIV_CLKCMU_PERI_USI2, 0, 4),
+
+       /* FSYS */
+       DIV(CLK_DOUT_FSYS_BUS, "dout_fsys_bus", "gout_fsys_bus",
+           CLK_CON_DIV_CLKCMU_FSYS_BUS, 0, 4),
+       DIV(CLK_DOUT_FSYS_MMC_CARD, "dout_fsys_mmc_card", "gout_fsys_mmc_card",
+           CLK_CON_DIV_CLKCMU_FSYS_MMC_CARD, 0, 9),
+       DIV(CLK_DOUT_FSYS_MMC_EMBD, "dout_fsys_mmc_embd", "gout_fsys_mmc_embd",
+           CLK_CON_DIV_CLKCMU_FSYS_MMC_EMBD, 0, 9),
+       DIV(CLK_DOUT_FSYS_MMC_SDIO, "dout_fsys_mmc_sdio", "gout_fsys_mmc_sdio",
+           CLK_CON_DIV_CLKCMU_FSYS_MMC_SDIO, 0, 9),
+       DIV(CLK_DOUT_FSYS_USB30DRD, "dout_fsys_usb30drd", "gout_fsys_usb30drd",
+           CLK_CON_DIV_CLKCMU_FSYS_USB30DRD, 0, 4),
 };
 
 static const struct samsung_gate_clock top_gate_clks[] __initconst = {
@@ -250,6 +311,18 @@ static const struct samsung_gate_clock top_gate_clks[] __initconst = {
             CLK_CON_GAT_GATE_CLKCMU_PERI_USI1, 21, 0, 0),
        GATE(CLK_GOUT_PERI_USI2, "gout_peri_usi2", "mout_peri_usi2",
             CLK_CON_GAT_GATE_CLKCMU_PERI_USI2, 21, 0, 0),
+
+       /* FSYS */
+       GATE(CLK_GOUT_FSYS_BUS, "gout_fsys_bus", "mout_fsys_bus",
+            CLK_CON_GAT_GATE_CLKCMU_FSYS_BUS, 21, 0, 0),
+       GATE(CLK_GOUT_FSYS_MMC_CARD, "gout_fsys_mmc_card", "mout_fsys_mmc_card",
+            CLK_CON_GAT_GATE_CLKCMU_FSYS_MMC_CARD, 21, 0, 0),
+       GATE(CLK_GOUT_FSYS_MMC_EMBD, "gout_fsys_mmc_embd", "mout_fsys_mmc_embd",
+            CLK_CON_GAT_GATE_CLKCMU_FSYS_MMC_EMBD, 21, 0, 0),
+       GATE(CLK_GOUT_FSYS_MMC_SDIO, "gout_fsys_mmc_sdio", "mout_fsys_mmc_sdio",
+            CLK_CON_GAT_GATE_CLKCMU_FSYS_MMC_SDIO, 21, 0, 0),
+       GATE(CLK_GOUT_FSYS_USB30DRD, "gout_fsys_usb30drd", "mout_fsys_usb30drd",
+            CLK_CON_GAT_GATE_CLKCMU_FSYS_USB30DRD, 21, 0, 0),
 };
 
 static const struct samsung_cmu_info top_cmu_info __initconst = {
@@ -498,13 +571,20 @@ CLK_OF_DECLARE(exynos7885_cmu_peri, "samsung,exynos7885-cmu-peri",
 /* ---- CMU_CORE ------------------------------------------------------------ */
 
 /* Register Offset definitions for CMU_CORE (0x12000000) */
-#define PLL_CON0_MUX_CLKCMU_CORE_BUS_USER      0x0100
-#define PLL_CON0_MUX_CLKCMU_CORE_CCI_USER      0x0120
-#define PLL_CON0_MUX_CLKCMU_CORE_G3D_USER      0x0140
-#define CLK_CON_MUX_MUX_CLK_CORE_GIC           0x1000
-#define CLK_CON_DIV_DIV_CLK_CORE_BUSP          0x1800
-#define CLK_CON_GAT_GOUT_CORE_CCI_550_ACLK     0x2054
-#define CLK_CON_GAT_GOUT_CORE_GIC400_CLK       0x2058
+#define PLL_CON0_MUX_CLKCMU_CORE_BUS_USER              0x0100
+#define PLL_CON0_MUX_CLKCMU_CORE_CCI_USER              0x0120
+#define PLL_CON0_MUX_CLKCMU_CORE_G3D_USER              0x0140
+#define CLK_CON_MUX_MUX_CLK_CORE_GIC                   0x1000
+#define CLK_CON_DIV_DIV_CLK_CORE_BUSP                  0x1800
+#define CLK_CON_GAT_GOUT_CORE_CCI_550_ACLK             0x2054
+#define CLK_CON_GAT_GOUT_CORE_GIC400_CLK               0x2058
+#define CLK_CON_GAT_GOUT_CORE_TREX_D_CORE_ACLK         0x215c
+#define CLK_CON_GAT_GOUT_CORE_TREX_D_CORE_GCLK         0x2160
+#define CLK_CON_GAT_GOUT_CORE_TREX_D_CORE_PCLK         0x2164
+#define CLK_CON_GAT_GOUT_CORE_TREX_P_CORE_ACLK_P_CORE  0x2168
+#define CLK_CON_GAT_GOUT_CORE_TREX_P_CORE_CCLK_P_CORE  0x216c
+#define CLK_CON_GAT_GOUT_CORE_TREX_P_CORE_PCLK         0x2170
+#define CLK_CON_GAT_GOUT_CORE_TREX_P_CORE_PCLK_P_CORE  0x2174
 
 static const unsigned long core_clk_regs[] __initconst = {
        PLL_CON0_MUX_CLKCMU_CORE_BUS_USER,
@@ -514,6 +594,13 @@ static const unsigned long core_clk_regs[] __initconst = {
        CLK_CON_DIV_DIV_CLK_CORE_BUSP,
        CLK_CON_GAT_GOUT_CORE_CCI_550_ACLK,
        CLK_CON_GAT_GOUT_CORE_GIC400_CLK,
+       CLK_CON_GAT_GOUT_CORE_TREX_D_CORE_ACLK,
+       CLK_CON_GAT_GOUT_CORE_TREX_D_CORE_GCLK,
+       CLK_CON_GAT_GOUT_CORE_TREX_D_CORE_PCLK,
+       CLK_CON_GAT_GOUT_CORE_TREX_P_CORE_ACLK_P_CORE,
+       CLK_CON_GAT_GOUT_CORE_TREX_P_CORE_CCLK_P_CORE,
+       CLK_CON_GAT_GOUT_CORE_TREX_P_CORE_PCLK,
+       CLK_CON_GAT_GOUT_CORE_TREX_P_CORE_PCLK_P_CORE,
 };
 
 /* List of parent clocks for Muxes in CMU_CORE */
@@ -545,6 +632,27 @@ static const struct samsung_gate_clock core_gate_clks[] __initconst = {
        /* GIC (interrupt controller) clock must be always running */
        GATE(CLK_GOUT_GIC400_CLK, "gout_gic400_clk", "mout_core_gic",
             CLK_CON_GAT_GOUT_CORE_GIC400_CLK, 21, CLK_IS_CRITICAL, 0),
+       /*
+        * TREX D and P Core (seems to be related to "bus traffic shaper")
+        * clocks must always be running
+        */
+       GATE(CLK_GOUT_TREX_D_CORE_ACLK, "gout_trex_d_core_aclk", "mout_core_bus_user",
+            CLK_CON_GAT_GOUT_CORE_TREX_D_CORE_ACLK, 21, CLK_IS_CRITICAL, 0),
+       GATE(CLK_GOUT_TREX_D_CORE_GCLK, "gout_trex_d_core_gclk", "mout_core_g3d_user",
+            CLK_CON_GAT_GOUT_CORE_TREX_D_CORE_GCLK, 21, CLK_IS_CRITICAL, 0),
+       GATE(CLK_GOUT_TREX_D_CORE_PCLK, "gout_trex_d_core_pclk", "dout_core_busp",
+            CLK_CON_GAT_GOUT_CORE_TREX_D_CORE_PCLK, 21, CLK_IS_CRITICAL, 0),
+       GATE(CLK_GOUT_TREX_P_CORE_ACLK_P_CORE, "gout_trex_p_core_aclk_p_core",
+            "mout_core_bus_user", CLK_CON_GAT_GOUT_CORE_TREX_P_CORE_ACLK_P_CORE, 21,
+            CLK_IS_CRITICAL, 0),
+       GATE(CLK_GOUT_TREX_P_CORE_CCLK_P_CORE, "gout_trex_p_core_cclk_p_core",
+            "mout_core_cci_user", CLK_CON_GAT_GOUT_CORE_TREX_P_CORE_CCLK_P_CORE, 21,
+            CLK_IS_CRITICAL, 0),
+       GATE(CLK_GOUT_TREX_P_CORE_PCLK, "gout_trex_p_core_pclk", "dout_core_busp",
+            CLK_CON_GAT_GOUT_CORE_TREX_P_CORE_PCLK, 21, CLK_IS_CRITICAL, 0),
+       GATE(CLK_GOUT_TREX_P_CORE_PCLK_P_CORE, "gout_trex_p_core_pclk_p_core",
+            "dout_core_busp", CLK_CON_GAT_GOUT_CORE_TREX_P_CORE_PCLK_P_CORE, 21,
+            CLK_IS_CRITICAL, 0),
 };
 
 static const struct samsung_cmu_info core_cmu_info __initconst = {
@@ -560,6 +668,88 @@ static const struct samsung_cmu_info core_cmu_info __initconst = {
        .clk_name               = "dout_core_bus",
 };
 
+/* ---- CMU_FSYS ------------------------------------------------------------ */
+
+/* Register Offset definitions for CMU_FSYS (0x13400000) */
+#define PLL_CON0_MUX_CLKCMU_FSYS_BUS_USER      0x0100
+#define PLL_CON0_MUX_CLKCMU_FSYS_MMC_CARD_USER 0x0120
+#define PLL_CON0_MUX_CLKCMU_FSYS_MMC_EMBD_USER 0x0140
+#define PLL_CON0_MUX_CLKCMU_FSYS_MMC_SDIO_USER 0x0160
+#define PLL_CON0_MUX_CLKCMU_FSYS_USB30DRD_USER 0x0180
+#define CLK_CON_GAT_GOUT_FSYS_MMC_CARD_I_ACLK  0x2030
+#define CLK_CON_GAT_GOUT_FSYS_MMC_CARD_SDCLKIN 0x2034
+#define CLK_CON_GAT_GOUT_FSYS_MMC_EMBD_I_ACLK  0x2038
+#define CLK_CON_GAT_GOUT_FSYS_MMC_EMBD_SDCLKIN 0x203c
+#define CLK_CON_GAT_GOUT_FSYS_MMC_SDIO_I_ACLK  0x2040
+#define CLK_CON_GAT_GOUT_FSYS_MMC_SDIO_SDCLKIN 0x2044
+
+static const unsigned long fsys_clk_regs[] __initconst = {
+       PLL_CON0_MUX_CLKCMU_FSYS_BUS_USER,
+       PLL_CON0_MUX_CLKCMU_FSYS_MMC_CARD_USER,
+       PLL_CON0_MUX_CLKCMU_FSYS_MMC_EMBD_USER,
+       PLL_CON0_MUX_CLKCMU_FSYS_MMC_SDIO_USER,
+       PLL_CON0_MUX_CLKCMU_FSYS_USB30DRD_USER,
+       CLK_CON_GAT_GOUT_FSYS_MMC_CARD_I_ACLK,
+       CLK_CON_GAT_GOUT_FSYS_MMC_CARD_SDCLKIN,
+       CLK_CON_GAT_GOUT_FSYS_MMC_EMBD_I_ACLK,
+       CLK_CON_GAT_GOUT_FSYS_MMC_EMBD_SDCLKIN,
+       CLK_CON_GAT_GOUT_FSYS_MMC_SDIO_I_ACLK,
+       CLK_CON_GAT_GOUT_FSYS_MMC_SDIO_SDCLKIN,
+};
+
+/* List of parent clocks for Muxes in CMU_FSYS */
+PNAME(mout_fsys_bus_user_p)            = { "oscclk", "dout_fsys_bus" };
+PNAME(mout_fsys_mmc_card_user_p)       = { "oscclk", "dout_fsys_mmc_card" };
+PNAME(mout_fsys_mmc_embd_user_p)       = { "oscclk", "dout_fsys_mmc_embd" };
+PNAME(mout_fsys_mmc_sdio_user_p)       = { "oscclk", "dout_fsys_mmc_sdio" };
+PNAME(mout_fsys_usb30drd_user_p)       = { "oscclk", "dout_fsys_usb30drd" };
+
+static const struct samsung_mux_clock fsys_mux_clks[] __initconst = {
+       MUX(CLK_MOUT_FSYS_BUS_USER, "mout_fsys_bus_user", mout_fsys_bus_user_p,
+           PLL_CON0_MUX_CLKCMU_FSYS_BUS_USER, 4, 1),
+       MUX_F(CLK_MOUT_FSYS_MMC_CARD_USER, "mout_fsys_mmc_card_user",
+             mout_fsys_mmc_card_user_p, PLL_CON0_MUX_CLKCMU_FSYS_MMC_CARD_USER,
+             4, 1, CLK_SET_RATE_PARENT, 0),
+       MUX_F(CLK_MOUT_FSYS_MMC_EMBD_USER, "mout_fsys_mmc_embd_user",
+             mout_fsys_mmc_embd_user_p, PLL_CON0_MUX_CLKCMU_FSYS_MMC_EMBD_USER,
+             4, 1, CLK_SET_RATE_PARENT, 0),
+       MUX_F(CLK_MOUT_FSYS_MMC_SDIO_USER, "mout_fsys_mmc_sdio_user",
+             mout_fsys_mmc_sdio_user_p, PLL_CON0_MUX_CLKCMU_FSYS_MMC_SDIO_USER,
+             4, 1, CLK_SET_RATE_PARENT, 0),
+       MUX_F(CLK_MOUT_FSYS_USB30DRD_USER, "mout_fsys_usb30drd_user",
+             mout_fsys_usb30drd_user_p, PLL_CON0_MUX_CLKCMU_FSYS_USB30DRD_USER,
+             4, 1, CLK_SET_RATE_PARENT, 0),
+};
+
+static const struct samsung_gate_clock fsys_gate_clks[] __initconst = {
+       GATE(CLK_GOUT_MMC_CARD_ACLK, "gout_mmc_card_aclk", "mout_fsys_bus_user",
+            CLK_CON_GAT_GOUT_FSYS_MMC_CARD_I_ACLK, 21, 0, 0),
+       GATE(CLK_GOUT_MMC_CARD_SDCLKIN, "gout_mmc_card_sdclkin",
+            "mout_fsys_mmc_card_user", CLK_CON_GAT_GOUT_FSYS_MMC_CARD_SDCLKIN,
+            21, CLK_SET_RATE_PARENT, 0),
+       GATE(CLK_GOUT_MMC_EMBD_ACLK, "gout_mmc_embd_aclk", "mout_fsys_bus_user",
+            CLK_CON_GAT_GOUT_FSYS_MMC_EMBD_I_ACLK, 21, 0, 0),
+       GATE(CLK_GOUT_MMC_EMBD_SDCLKIN, "gout_mmc_embd_sdclkin",
+            "mout_fsys_mmc_embd_user", CLK_CON_GAT_GOUT_FSYS_MMC_EMBD_SDCLKIN,
+            21, CLK_SET_RATE_PARENT, 0),
+       GATE(CLK_GOUT_MMC_SDIO_ACLK, "gout_mmc_sdio_aclk", "mout_fsys_bus_user",
+            CLK_CON_GAT_GOUT_FSYS_MMC_SDIO_I_ACLK, 21, 0, 0),
+       GATE(CLK_GOUT_MMC_SDIO_SDCLKIN, "gout_mmc_sdio_sdclkin",
+            "mout_fsys_mmc_sdio_user", CLK_CON_GAT_GOUT_FSYS_MMC_SDIO_SDCLKIN,
+            21, CLK_SET_RATE_PARENT, 0),
+};
+
+static const struct samsung_cmu_info fsys_cmu_info __initconst = {
+       .mux_clks               = fsys_mux_clks,
+       .nr_mux_clks            = ARRAY_SIZE(fsys_mux_clks),
+       .gate_clks              = fsys_gate_clks,
+       .nr_gate_clks           = ARRAY_SIZE(fsys_gate_clks),
+       .nr_clk_ids             = FSYS_NR_CLK,
+       .clk_regs               = fsys_clk_regs,
+       .nr_clk_regs            = ARRAY_SIZE(fsys_clk_regs),
+       .clk_name               = "dout_fsys_bus",
+};
+
 /* ---- platform_driver ----------------------------------------------------- */
 
 static int __init exynos7885_cmu_probe(struct platform_device *pdev)
@@ -578,6 +768,9 @@ static const struct of_device_id exynos7885_cmu_of_match[] = {
                .compatible = "samsung,exynos7885-cmu-core",
                .data = &core_cmu_info,
        }, {
+               .compatible = "samsung,exynos7885-cmu-fsys",
+               .data = &fsys_cmu_info,
+       }, {
        },
 };
 
index cd9725f..541761e 100644 (file)
@@ -30,6 +30,7 @@
 #define PLL_CON0_PLL_SHARED1                   0x0180
 #define PLL_CON3_PLL_SHARED1                   0x018c
 #define CLK_CON_MUX_MUX_CLKCMU_APM_BUS         0x1000
+#define CLK_CON_MUX_MUX_CLKCMU_AUD             0x1004
 #define CLK_CON_MUX_MUX_CLKCMU_CORE_BUS                0x1014
 #define CLK_CON_MUX_MUX_CLKCMU_CORE_CCI                0x1018
 #define CLK_CON_MUX_MUX_CLKCMU_CORE_MMC_EMBD   0x101c
 #define CLK_CON_MUX_MUX_CLKCMU_HSI_BUS         0x103c
 #define CLK_CON_MUX_MUX_CLKCMU_HSI_MMC_CARD    0x1040
 #define CLK_CON_MUX_MUX_CLKCMU_HSI_USB20DRD    0x1044
+#define CLK_CON_MUX_MUX_CLKCMU_IS_BUS          0x1048
+#define CLK_CON_MUX_MUX_CLKCMU_IS_GDC          0x104c
+#define CLK_CON_MUX_MUX_CLKCMU_IS_ITP          0x1050
+#define CLK_CON_MUX_MUX_CLKCMU_IS_VRA          0x1054
+#define CLK_CON_MUX_MUX_CLKCMU_MFCMSCL_JPEG    0x1058
+#define CLK_CON_MUX_MUX_CLKCMU_MFCMSCL_M2M     0x105c
+#define CLK_CON_MUX_MUX_CLKCMU_MFCMSCL_MCSC    0x1060
+#define CLK_CON_MUX_MUX_CLKCMU_MFCMSCL_MFC     0x1064
 #define CLK_CON_MUX_MUX_CLKCMU_PERI_BUS                0x1070
 #define CLK_CON_MUX_MUX_CLKCMU_PERI_IP         0x1074
 #define CLK_CON_MUX_MUX_CLKCMU_PERI_UART       0x1078
 #define CLK_CON_DIV_CLKCMU_APM_BUS             0x180c
+#define CLK_CON_DIV_CLKCMU_AUD                 0x1810
 #define CLK_CON_DIV_CLKCMU_CORE_BUS            0x1820
 #define CLK_CON_DIV_CLKCMU_CORE_CCI            0x1824
 #define CLK_CON_DIV_CLKCMU_CORE_MMC_EMBD       0x1828
 #define CLK_CON_DIV_CLKCMU_HSI_BUS             0x1848
 #define CLK_CON_DIV_CLKCMU_HSI_MMC_CARD                0x184c
 #define CLK_CON_DIV_CLKCMU_HSI_USB20DRD                0x1850
+#define CLK_CON_DIV_CLKCMU_IS_BUS              0x1854
+#define CLK_CON_DIV_CLKCMU_IS_GDC              0x1858
+#define CLK_CON_DIV_CLKCMU_IS_ITP              0x185c
+#define CLK_CON_DIV_CLKCMU_IS_VRA              0x1860
+#define CLK_CON_DIV_CLKCMU_MFCMSCL_JPEG                0x1864
+#define CLK_CON_DIV_CLKCMU_MFCMSCL_M2M         0x1868
+#define CLK_CON_DIV_CLKCMU_MFCMSCL_MCSC                0x186c
+#define CLK_CON_DIV_CLKCMU_MFCMSCL_MFC         0x1870
 #define CLK_CON_DIV_CLKCMU_PERI_BUS            0x187c
 #define CLK_CON_DIV_CLKCMU_PERI_IP             0x1880
 #define CLK_CON_DIV_CLKCMU_PERI_UART           0x1884
@@ -60,6 +78,7 @@
 #define CLK_CON_DIV_PLL_SHARED1_DIV3           0x189c
 #define CLK_CON_DIV_PLL_SHARED1_DIV4           0x18a0
 #define CLK_CON_GAT_GATE_CLKCMU_APM_BUS                0x2008
+#define CLK_CON_GAT_GATE_CLKCMU_AUD            0x200c
 #define CLK_CON_GAT_GATE_CLKCMU_CORE_BUS       0x201c
 #define CLK_CON_GAT_GATE_CLKCMU_CORE_CCI       0x2020
 #define CLK_CON_GAT_GATE_CLKCMU_CORE_MMC_EMBD  0x2024
 #define CLK_CON_GAT_GATE_CLKCMU_HSI_BUS                0x2044
 #define CLK_CON_GAT_GATE_CLKCMU_HSI_MMC_CARD   0x2048
 #define CLK_CON_GAT_GATE_CLKCMU_HSI_USB20DRD   0x204c
+#define CLK_CON_GAT_GATE_CLKCMU_IS_BUS         0x2050
+#define CLK_CON_GAT_GATE_CLKCMU_IS_GDC         0x2054
+#define CLK_CON_GAT_GATE_CLKCMU_IS_ITP         0x2058
+#define CLK_CON_GAT_GATE_CLKCMU_IS_VRA         0x205c
+#define CLK_CON_GAT_GATE_CLKCMU_MFCMSCL_JPEG   0x2060
+#define CLK_CON_GAT_GATE_CLKCMU_MFCMSCL_M2M    0x2064
+#define CLK_CON_GAT_GATE_CLKCMU_MFCMSCL_MCSC   0x2068
+#define CLK_CON_GAT_GATE_CLKCMU_MFCMSCL_MFC    0x206c
 #define CLK_CON_GAT_GATE_CLKCMU_PERI_BUS       0x2080
 #define CLK_CON_GAT_GATE_CLKCMU_PERI_IP                0x2084
 #define CLK_CON_GAT_GATE_CLKCMU_PERI_UART      0x2088
@@ -83,6 +110,7 @@ static const unsigned long top_clk_regs[] __initconst = {
        PLL_CON0_PLL_SHARED1,
        PLL_CON3_PLL_SHARED1,
        CLK_CON_MUX_MUX_CLKCMU_APM_BUS,
+       CLK_CON_MUX_MUX_CLKCMU_AUD,
        CLK_CON_MUX_MUX_CLKCMU_CORE_BUS,
        CLK_CON_MUX_MUX_CLKCMU_CORE_CCI,
        CLK_CON_MUX_MUX_CLKCMU_CORE_MMC_EMBD,
@@ -91,10 +119,19 @@ static const unsigned long top_clk_regs[] __initconst = {
        CLK_CON_MUX_MUX_CLKCMU_HSI_BUS,
        CLK_CON_MUX_MUX_CLKCMU_HSI_MMC_CARD,
        CLK_CON_MUX_MUX_CLKCMU_HSI_USB20DRD,
+       CLK_CON_MUX_MUX_CLKCMU_IS_BUS,
+       CLK_CON_MUX_MUX_CLKCMU_IS_GDC,
+       CLK_CON_MUX_MUX_CLKCMU_IS_ITP,
+       CLK_CON_MUX_MUX_CLKCMU_IS_VRA,
+       CLK_CON_MUX_MUX_CLKCMU_MFCMSCL_JPEG,
+       CLK_CON_MUX_MUX_CLKCMU_MFCMSCL_M2M,
+       CLK_CON_MUX_MUX_CLKCMU_MFCMSCL_MCSC,
+       CLK_CON_MUX_MUX_CLKCMU_MFCMSCL_MFC,
        CLK_CON_MUX_MUX_CLKCMU_PERI_BUS,
        CLK_CON_MUX_MUX_CLKCMU_PERI_IP,
        CLK_CON_MUX_MUX_CLKCMU_PERI_UART,
        CLK_CON_DIV_CLKCMU_APM_BUS,
+       CLK_CON_DIV_CLKCMU_AUD,
        CLK_CON_DIV_CLKCMU_CORE_BUS,
        CLK_CON_DIV_CLKCMU_CORE_CCI,
        CLK_CON_DIV_CLKCMU_CORE_MMC_EMBD,
@@ -103,6 +140,14 @@ static const unsigned long top_clk_regs[] __initconst = {
        CLK_CON_DIV_CLKCMU_HSI_BUS,
        CLK_CON_DIV_CLKCMU_HSI_MMC_CARD,
        CLK_CON_DIV_CLKCMU_HSI_USB20DRD,
+       CLK_CON_DIV_CLKCMU_IS_BUS,
+       CLK_CON_DIV_CLKCMU_IS_GDC,
+       CLK_CON_DIV_CLKCMU_IS_ITP,
+       CLK_CON_DIV_CLKCMU_IS_VRA,
+       CLK_CON_DIV_CLKCMU_MFCMSCL_JPEG,
+       CLK_CON_DIV_CLKCMU_MFCMSCL_M2M,
+       CLK_CON_DIV_CLKCMU_MFCMSCL_MCSC,
+       CLK_CON_DIV_CLKCMU_MFCMSCL_MFC,
        CLK_CON_DIV_CLKCMU_PERI_BUS,
        CLK_CON_DIV_CLKCMU_PERI_IP,
        CLK_CON_DIV_CLKCMU_PERI_UART,
@@ -113,6 +158,7 @@ static const unsigned long top_clk_regs[] __initconst = {
        CLK_CON_DIV_PLL_SHARED1_DIV3,
        CLK_CON_DIV_PLL_SHARED1_DIV4,
        CLK_CON_GAT_GATE_CLKCMU_APM_BUS,
+       CLK_CON_GAT_GATE_CLKCMU_AUD,
        CLK_CON_GAT_GATE_CLKCMU_CORE_BUS,
        CLK_CON_GAT_GATE_CLKCMU_CORE_CCI,
        CLK_CON_GAT_GATE_CLKCMU_CORE_MMC_EMBD,
@@ -121,6 +167,14 @@ static const unsigned long top_clk_regs[] __initconst = {
        CLK_CON_GAT_GATE_CLKCMU_HSI_BUS,
        CLK_CON_GAT_GATE_CLKCMU_HSI_MMC_CARD,
        CLK_CON_GAT_GATE_CLKCMU_HSI_USB20DRD,
+       CLK_CON_GAT_GATE_CLKCMU_IS_BUS,
+       CLK_CON_GAT_GATE_CLKCMU_IS_GDC,
+       CLK_CON_GAT_GATE_CLKCMU_IS_ITP,
+       CLK_CON_GAT_GATE_CLKCMU_IS_VRA,
+       CLK_CON_GAT_GATE_CLKCMU_MFCMSCL_JPEG,
+       CLK_CON_GAT_GATE_CLKCMU_MFCMSCL_M2M,
+       CLK_CON_GAT_GATE_CLKCMU_MFCMSCL_MCSC,
+       CLK_CON_GAT_GATE_CLKCMU_MFCMSCL_MFC,
        CLK_CON_GAT_GATE_CLKCMU_PERI_BUS,
        CLK_CON_GAT_GATE_CLKCMU_PERI_IP,
        CLK_CON_GAT_GATE_CLKCMU_PERI_UART,
@@ -148,6 +202,9 @@ PNAME(mout_shared1_pll_p)   = { "oscclk", "fout_shared1_pll" };
 PNAME(mout_mmc_pll_p)          = { "oscclk", "fout_mmc_pll" };
 /* List of parent clocks for Muxes in CMU_TOP: for CMU_APM */
 PNAME(mout_clkcmu_apm_bus_p)   = { "dout_shared0_div4", "pll_shared1_div4" };
+/* List of parent clocks for Muxes in CMU_TOP: for CMU_AUD */
+PNAME(mout_aud_p)              = { "fout_shared1_pll", "dout_shared0_div2",
+                                   "dout_shared1_div2", "dout_shared0_div3" };
 /* List of parent clocks for Muxes in CMU_TOP: for CMU_CORE */
 PNAME(mout_core_bus_p)         = { "dout_shared1_div2", "dout_shared0_div3",
                                    "dout_shared1_div3", "dout_shared0_div4" };
@@ -167,13 +224,30 @@ PNAME(mout_hsi_mmc_card_p)        = { "oscclk", "dout_shared0_div2",
                                    "oscclk", "oscclk" };
 PNAME(mout_hsi_usb20drd_p)     = { "oscclk", "dout_shared0_div4",
                                    "dout_shared1_div4", "oscclk" };
+/* List of parent clocks for Muxes in CMU_TOP: for CMU_IS */
+PNAME(mout_is_bus_p)           = { "dout_shared0_div2", "dout_shared1_div2",
+                                   "dout_shared0_div3", "dout_shared1_div3" };
+PNAME(mout_is_itp_p)           = { "dout_shared0_div2", "dout_shared1_div2",
+                                   "dout_shared0_div3", "dout_shared1_div3" };
+PNAME(mout_is_vra_p)           = { "dout_shared0_div2", "dout_shared1_div2",
+                                   "dout_shared0_div3", "dout_shared1_div3" };
+PNAME(mout_is_gdc_p)           = { "dout_shared0_div2", "dout_shared1_div2",
+                                   "dout_shared0_div3", "dout_shared1_div3" };
+/* List of parent clocks for Muxes in CMU_TOP: for CMU_MFCMSCL */
+PNAME(mout_mfcmscl_mfc_p)      = { "dout_shared1_div2", "dout_shared0_div3",
+                                   "dout_shared1_div3", "dout_shared0_div4" };
+PNAME(mout_mfcmscl_m2m_p)      = { "dout_shared1_div2", "dout_shared0_div3",
+                                   "dout_shared1_div3", "dout_shared0_div4" };
+PNAME(mout_mfcmscl_mcsc_p)     = { "dout_shared1_div2", "dout_shared0_div3",
+                                   "dout_shared1_div3", "dout_shared0_div4" };
+PNAME(mout_mfcmscl_jpeg_p)     = { "dout_shared0_div3", "dout_shared1_div3",
+                                   "dout_shared0_div4", "dout_shared1_div4" };
 /* List of parent clocks for Muxes in CMU_TOP: for CMU_PERI */
 PNAME(mout_peri_bus_p)         = { "dout_shared0_div4", "dout_shared1_div4" };
 PNAME(mout_peri_uart_p)                = { "oscclk", "dout_shared0_div4",
                                    "dout_shared1_div4", "oscclk" };
 PNAME(mout_peri_ip_p)          = { "oscclk", "dout_shared0_div4",
                                    "dout_shared1_div4", "oscclk" };
-
 /* List of parent clocks for Muxes in CMU_TOP: for CMU_DPU */
 PNAME(mout_dpu_p)              = { "dout_shared0_div3", "dout_shared1_div3",
                                    "dout_shared0_div4", "dout_shared1_div4" };
@@ -191,6 +265,10 @@ static const struct samsung_mux_clock top_mux_clks[] __initconst = {
        MUX(CLK_MOUT_CLKCMU_APM_BUS, "mout_clkcmu_apm_bus",
            mout_clkcmu_apm_bus_p, CLK_CON_MUX_MUX_CLKCMU_APM_BUS, 0, 1),
 
+       /* AUD */
+       MUX(CLK_MOUT_AUD, "mout_aud", mout_aud_p,
+           CLK_CON_MUX_MUX_CLKCMU_AUD, 0, 2),
+
        /* CORE */
        MUX(CLK_MOUT_CORE_BUS, "mout_core_bus", mout_core_bus_p,
            CLK_CON_MUX_MUX_CLKCMU_CORE_BUS, 0, 2),
@@ -213,6 +291,26 @@ static const struct samsung_mux_clock top_mux_clks[] __initconst = {
        MUX(CLK_MOUT_HSI_USB20DRD, "mout_hsi_usb20drd", mout_hsi_usb20drd_p,
            CLK_CON_MUX_MUX_CLKCMU_HSI_USB20DRD, 0, 2),
 
+       /* IS */
+       MUX(CLK_MOUT_IS_BUS, "mout_is_bus", mout_is_bus_p,
+           CLK_CON_MUX_MUX_CLKCMU_IS_BUS, 0, 2),
+       MUX(CLK_MOUT_IS_ITP, "mout_is_itp", mout_is_itp_p,
+           CLK_CON_MUX_MUX_CLKCMU_IS_ITP, 0, 2),
+       MUX(CLK_MOUT_IS_VRA, "mout_is_vra", mout_is_vra_p,
+           CLK_CON_MUX_MUX_CLKCMU_IS_VRA, 0, 2),
+       MUX(CLK_MOUT_IS_GDC, "mout_is_gdc", mout_is_gdc_p,
+           CLK_CON_MUX_MUX_CLKCMU_IS_GDC, 0, 2),
+
+       /* MFCMSCL */
+       MUX(CLK_MOUT_MFCMSCL_MFC, "mout_mfcmscl_mfc", mout_mfcmscl_mfc_p,
+           CLK_CON_MUX_MUX_CLKCMU_MFCMSCL_MFC, 0, 2),
+       MUX(CLK_MOUT_MFCMSCL_M2M, "mout_mfcmscl_m2m", mout_mfcmscl_m2m_p,
+           CLK_CON_MUX_MUX_CLKCMU_MFCMSCL_M2M, 0, 2),
+       MUX(CLK_MOUT_MFCMSCL_MCSC, "mout_mfcmscl_mcsc", mout_mfcmscl_mcsc_p,
+           CLK_CON_MUX_MUX_CLKCMU_MFCMSCL_MCSC, 0, 2),
+       MUX(CLK_MOUT_MFCMSCL_JPEG, "mout_mfcmscl_jpeg", mout_mfcmscl_jpeg_p,
+           CLK_CON_MUX_MUX_CLKCMU_MFCMSCL_JPEG, 0, 2),
+
        /* PERI */
        MUX(CLK_MOUT_PERI_BUS, "mout_peri_bus", mout_peri_bus_p,
            CLK_CON_MUX_MUX_CLKCMU_PERI_BUS, 0, 1),
@@ -241,6 +339,10 @@ static const struct samsung_div_clock top_div_clks[] __initconst = {
        DIV(CLK_DOUT_CLKCMU_APM_BUS, "dout_clkcmu_apm_bus",
            "gout_clkcmu_apm_bus", CLK_CON_DIV_CLKCMU_APM_BUS, 0, 3),
 
+       /* AUD */
+       DIV(CLK_DOUT_AUD, "dout_aud", "gout_aud",
+           CLK_CON_DIV_CLKCMU_AUD, 0, 4),
+
        /* CORE */
        DIV(CLK_DOUT_CORE_BUS, "dout_core_bus", "gout_core_bus",
            CLK_CON_DIV_CLKCMU_CORE_BUS, 0, 4),
@@ -263,6 +365,26 @@ static const struct samsung_div_clock top_div_clks[] __initconst = {
        DIV(CLK_DOUT_HSI_USB20DRD, "dout_hsi_usb20drd", "gout_hsi_usb20drd",
            CLK_CON_DIV_CLKCMU_HSI_USB20DRD, 0, 4),
 
+       /* IS */
+       DIV(CLK_DOUT_IS_BUS, "dout_is_bus", "gout_is_bus",
+           CLK_CON_DIV_CLKCMU_IS_BUS, 0, 4),
+       DIV(CLK_DOUT_IS_ITP, "dout_is_itp", "gout_is_itp",
+           CLK_CON_DIV_CLKCMU_IS_ITP, 0, 4),
+       DIV(CLK_DOUT_IS_VRA, "dout_is_vra", "gout_is_vra",
+           CLK_CON_DIV_CLKCMU_IS_VRA, 0, 4),
+       DIV(CLK_DOUT_IS_GDC, "dout_is_gdc", "gout_is_gdc",
+           CLK_CON_DIV_CLKCMU_IS_GDC, 0, 4),
+
+       /* MFCMSCL */
+       DIV(CLK_DOUT_MFCMSCL_MFC, "dout_mfcmscl_mfc", "gout_mfcmscl_mfc",
+           CLK_CON_DIV_CLKCMU_MFCMSCL_MFC, 0, 4),
+       DIV(CLK_DOUT_MFCMSCL_M2M, "dout_mfcmscl_m2m", "gout_mfcmscl_m2m",
+           CLK_CON_DIV_CLKCMU_MFCMSCL_M2M, 0, 4),
+       DIV(CLK_DOUT_MFCMSCL_MCSC, "dout_mfcmscl_mcsc", "gout_mfcmscl_mcsc",
+           CLK_CON_DIV_CLKCMU_MFCMSCL_MCSC, 0, 4),
+       DIV(CLK_DOUT_MFCMSCL_JPEG, "dout_mfcmscl_jpeg", "gout_mfcmscl_jpeg",
+           CLK_CON_DIV_CLKCMU_MFCMSCL_JPEG, 0, 4),
+
        /* PERI */
        DIV(CLK_DOUT_PERI_BUS, "dout_peri_bus", "gout_peri_bus",
            CLK_CON_DIV_CLKCMU_PERI_BUS, 0, 4),
@@ -287,6 +409,10 @@ static const struct samsung_gate_clock top_gate_clks[] __initconst = {
        GATE(CLK_GOUT_CLKCMU_APM_BUS, "gout_clkcmu_apm_bus",
             "mout_clkcmu_apm_bus", CLK_CON_GAT_GATE_CLKCMU_APM_BUS, 21, 0, 0),
 
+       /* AUD */
+       GATE(CLK_GOUT_AUD, "gout_aud", "mout_aud",
+            CLK_CON_GAT_GATE_CLKCMU_AUD, 21, 0, 0),
+
        /* DPU */
        GATE(CLK_GOUT_DPU, "gout_dpu", "mout_dpu",
             CLK_CON_GAT_GATE_CLKCMU_DPU, 21, 0, 0),
@@ -299,6 +425,28 @@ static const struct samsung_gate_clock top_gate_clks[] __initconst = {
        GATE(CLK_GOUT_HSI_USB20DRD, "gout_hsi_usb20drd", "mout_hsi_usb20drd",
             CLK_CON_GAT_GATE_CLKCMU_HSI_USB20DRD, 21, 0, 0),
 
+       /* IS */
+       /* TODO: These clocks have to be always enabled to access CMU_IS regs */
+       GATE(CLK_GOUT_IS_BUS, "gout_is_bus", "mout_is_bus",
+            CLK_CON_GAT_GATE_CLKCMU_IS_BUS, 21, CLK_IS_CRITICAL, 0),
+       GATE(CLK_GOUT_IS_ITP, "gout_is_itp", "mout_is_itp",
+            CLK_CON_GAT_GATE_CLKCMU_IS_ITP, 21, CLK_IS_CRITICAL, 0),
+       GATE(CLK_GOUT_IS_VRA, "gout_is_vra", "mout_is_vra",
+            CLK_CON_GAT_GATE_CLKCMU_IS_VRA, 21, CLK_IS_CRITICAL, 0),
+       GATE(CLK_GOUT_IS_GDC, "gout_is_gdc", "mout_is_gdc",
+            CLK_CON_GAT_GATE_CLKCMU_IS_GDC, 21, CLK_IS_CRITICAL, 0),
+
+       /* MFCMSCL */
+       /* TODO: These have to be always enabled to access CMU_MFCMSCL regs */
+       GATE(CLK_GOUT_MFCMSCL_MFC, "gout_mfcmscl_mfc", "mout_mfcmscl_mfc",
+            CLK_CON_GAT_GATE_CLKCMU_MFCMSCL_MFC, 21, CLK_IS_CRITICAL, 0),
+       GATE(CLK_GOUT_MFCMSCL_M2M, "gout_mfcmscl_m2m", "mout_mfcmscl_m2m",
+            CLK_CON_GAT_GATE_CLKCMU_MFCMSCL_M2M, 21, CLK_IS_CRITICAL, 0),
+       GATE(CLK_GOUT_MFCMSCL_MCSC, "gout_mfcmscl_mcsc", "mout_mfcmscl_mcsc",
+            CLK_CON_GAT_GATE_CLKCMU_MFCMSCL_MCSC, 21, CLK_IS_CRITICAL, 0),
+       GATE(CLK_GOUT_MFCMSCL_JPEG, "gout_mfcmscl_jpeg", "mout_mfcmscl_jpeg",
+            CLK_CON_GAT_GATE_CLKCMU_MFCMSCL_JPEG, 21, CLK_IS_CRITICAL, 0),
+
        /* PERI */
        GATE(CLK_GOUT_PERI_BUS, "gout_peri_bus", "mout_peri_bus",
             CLK_CON_GAT_GATE_CLKCMU_PERI_BUS, 21, 0, 0),
@@ -463,6 +611,284 @@ static const struct samsung_cmu_info apm_cmu_info __initconst = {
        .clk_name               = "dout_clkcmu_apm_bus",
 };
 
+/* ---- CMU_AUD ------------------------------------------------------------- */
+
+#define PLL_LOCKTIME_PLL_AUD                   0x0000
+#define PLL_CON0_PLL_AUD                       0x0100
+#define PLL_CON3_PLL_AUD                       0x010c
+#define PLL_CON0_MUX_CLKCMU_AUD_CPU_USER       0x0600
+#define PLL_CON0_MUX_TICK_USB_USER             0x0610
+#define CLK_CON_MUX_MUX_CLK_AUD_CPU            0x1000
+#define CLK_CON_MUX_MUX_CLK_AUD_CPU_HCH                0x1004
+#define CLK_CON_MUX_MUX_CLK_AUD_FM             0x1008
+#define CLK_CON_MUX_MUX_CLK_AUD_UAIF0          0x100c
+#define CLK_CON_MUX_MUX_CLK_AUD_UAIF1          0x1010
+#define CLK_CON_MUX_MUX_CLK_AUD_UAIF2          0x1014
+#define CLK_CON_MUX_MUX_CLK_AUD_UAIF3          0x1018
+#define CLK_CON_MUX_MUX_CLK_AUD_UAIF4          0x101c
+#define CLK_CON_MUX_MUX_CLK_AUD_UAIF5          0x1020
+#define CLK_CON_MUX_MUX_CLK_AUD_UAIF6          0x1024
+#define CLK_CON_DIV_DIV_CLK_AUD_MCLK           0x1800
+#define CLK_CON_DIV_DIV_CLK_AUD_AUDIF          0x1804
+#define CLK_CON_DIV_DIV_CLK_AUD_BUSD           0x1808
+#define CLK_CON_DIV_DIV_CLK_AUD_BUSP           0x180c
+#define CLK_CON_DIV_DIV_CLK_AUD_CNT            0x1810
+#define CLK_CON_DIV_DIV_CLK_AUD_CPU            0x1814
+#define CLK_CON_DIV_DIV_CLK_AUD_CPU_ACLK       0x1818
+#define CLK_CON_DIV_DIV_CLK_AUD_CPU_PCLKDBG    0x181c
+#define CLK_CON_DIV_DIV_CLK_AUD_FM             0x1820
+#define CLK_CON_DIV_DIV_CLK_AUD_FM_SPDY                0x1824
+#define CLK_CON_DIV_DIV_CLK_AUD_UAIF0          0x1828
+#define CLK_CON_DIV_DIV_CLK_AUD_UAIF1          0x182c
+#define CLK_CON_DIV_DIV_CLK_AUD_UAIF2          0x1830
+#define CLK_CON_DIV_DIV_CLK_AUD_UAIF3          0x1834
+#define CLK_CON_DIV_DIV_CLK_AUD_UAIF4          0x1838
+#define CLK_CON_DIV_DIV_CLK_AUD_UAIF5          0x183c
+#define CLK_CON_DIV_DIV_CLK_AUD_UAIF6          0x1840
+#define CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_CNT     0x2000
+#define CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_UAIF0   0x2004
+#define CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_UAIF1   0x2008
+#define CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_UAIF2   0x200c
+#define CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_UAIF3   0x2010
+#define CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_UAIF4   0x2014
+#define CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_UAIF5   0x2018
+#define CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_UAIF6   0x201c
+#define CLK_CON_GAT_GOUT_AUD_ABOX_ACLK         0x2048
+#define CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_SPDY    0x204c
+#define CLK_CON_GAT_GOUT_AUD_ABOX_CCLK_ASB     0x2050
+#define CLK_CON_GAT_GOUT_AUD_ABOX_CCLK_CA32    0x2054
+#define CLK_CON_GAT_GOUT_AUD_ABOX_CCLK_DAP     0x2058
+#define CLK_CON_GAT_GOUT_AUD_CODEC_MCLK                0x206c
+#define CLK_CON_GAT_GOUT_AUD_TZPC_PCLK         0x2070
+#define CLK_CON_GAT_GOUT_AUD_GPIO_PCLK         0x2074
+#define CLK_CON_GAT_GOUT_AUD_PPMU_ACLK         0x2088
+#define CLK_CON_GAT_GOUT_AUD_PPMU_PCLK         0x208c
+#define CLK_CON_GAT_GOUT_AUD_SYSMMU_CLK_S1     0x20b4
+#define CLK_CON_GAT_GOUT_AUD_SYSREG_PCLK       0x20b8
+#define CLK_CON_GAT_GOUT_AUD_WDT_PCLK          0x20bc
+
+static const unsigned long aud_clk_regs[] __initconst = {
+       PLL_LOCKTIME_PLL_AUD,
+       PLL_CON0_PLL_AUD,
+       PLL_CON3_PLL_AUD,
+       PLL_CON0_MUX_CLKCMU_AUD_CPU_USER,
+       PLL_CON0_MUX_TICK_USB_USER,
+       CLK_CON_MUX_MUX_CLK_AUD_CPU,
+       CLK_CON_MUX_MUX_CLK_AUD_CPU_HCH,
+       CLK_CON_MUX_MUX_CLK_AUD_FM,
+       CLK_CON_MUX_MUX_CLK_AUD_UAIF0,
+       CLK_CON_MUX_MUX_CLK_AUD_UAIF1,
+       CLK_CON_MUX_MUX_CLK_AUD_UAIF2,
+       CLK_CON_MUX_MUX_CLK_AUD_UAIF3,
+       CLK_CON_MUX_MUX_CLK_AUD_UAIF4,
+       CLK_CON_MUX_MUX_CLK_AUD_UAIF5,
+       CLK_CON_MUX_MUX_CLK_AUD_UAIF6,
+       CLK_CON_DIV_DIV_CLK_AUD_MCLK,
+       CLK_CON_DIV_DIV_CLK_AUD_AUDIF,
+       CLK_CON_DIV_DIV_CLK_AUD_BUSD,
+       CLK_CON_DIV_DIV_CLK_AUD_BUSP,
+       CLK_CON_DIV_DIV_CLK_AUD_CNT,
+       CLK_CON_DIV_DIV_CLK_AUD_CPU,
+       CLK_CON_DIV_DIV_CLK_AUD_CPU_ACLK,
+       CLK_CON_DIV_DIV_CLK_AUD_CPU_PCLKDBG,
+       CLK_CON_DIV_DIV_CLK_AUD_FM,
+       CLK_CON_DIV_DIV_CLK_AUD_FM_SPDY,
+       CLK_CON_DIV_DIV_CLK_AUD_UAIF0,
+       CLK_CON_DIV_DIV_CLK_AUD_UAIF1,
+       CLK_CON_DIV_DIV_CLK_AUD_UAIF2,
+       CLK_CON_DIV_DIV_CLK_AUD_UAIF3,
+       CLK_CON_DIV_DIV_CLK_AUD_UAIF4,
+       CLK_CON_DIV_DIV_CLK_AUD_UAIF5,
+       CLK_CON_DIV_DIV_CLK_AUD_UAIF6,
+       CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_CNT,
+       CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_UAIF0,
+       CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_UAIF1,
+       CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_UAIF2,
+       CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_UAIF3,
+       CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_UAIF4,
+       CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_UAIF5,
+       CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_UAIF6,
+       CLK_CON_GAT_GOUT_AUD_ABOX_ACLK,
+       CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_SPDY,
+       CLK_CON_GAT_GOUT_AUD_ABOX_CCLK_ASB,
+       CLK_CON_GAT_GOUT_AUD_ABOX_CCLK_CA32,
+       CLK_CON_GAT_GOUT_AUD_ABOX_CCLK_DAP,
+       CLK_CON_GAT_GOUT_AUD_CODEC_MCLK,
+       CLK_CON_GAT_GOUT_AUD_TZPC_PCLK,
+       CLK_CON_GAT_GOUT_AUD_GPIO_PCLK,
+       CLK_CON_GAT_GOUT_AUD_PPMU_ACLK,
+       CLK_CON_GAT_GOUT_AUD_PPMU_PCLK,
+       CLK_CON_GAT_GOUT_AUD_SYSMMU_CLK_S1,
+       CLK_CON_GAT_GOUT_AUD_SYSREG_PCLK,
+       CLK_CON_GAT_GOUT_AUD_WDT_PCLK,
+};
+
+/* List of parent clocks for Muxes in CMU_AUD */
+PNAME(mout_aud_pll_p)          = { "oscclk", "fout_aud_pll" };
+PNAME(mout_aud_cpu_user_p)     = { "oscclk", "dout_aud" };
+PNAME(mout_aud_cpu_p)          = { "dout_aud_cpu", "mout_aud_cpu_user" };
+PNAME(mout_aud_cpu_hch_p)      = { "mout_aud_cpu", "oscclk" };
+PNAME(mout_aud_uaif0_p)                = { "dout_aud_uaif0", "ioclk_audiocdclk0" };
+PNAME(mout_aud_uaif1_p)                = { "dout_aud_uaif1", "ioclk_audiocdclk1" };
+PNAME(mout_aud_uaif2_p)                = { "dout_aud_uaif2", "ioclk_audiocdclk2" };
+PNAME(mout_aud_uaif3_p)                = { "dout_aud_uaif3", "ioclk_audiocdclk3" };
+PNAME(mout_aud_uaif4_p)                = { "dout_aud_uaif4", "ioclk_audiocdclk4" };
+PNAME(mout_aud_uaif5_p)                = { "dout_aud_uaif5", "ioclk_audiocdclk5" };
+PNAME(mout_aud_uaif6_p)                = { "dout_aud_uaif6", "ioclk_audiocdclk6" };
+PNAME(mout_aud_tick_usb_user_p)        = { "oscclk", "tick_usb" };
+PNAME(mout_aud_fm_p)           = { "oscclk", "dout_aud_fm_spdy" };
+
+/*
+ * Do not provide PLL table to PLL_AUD, as MANUAL_PLL_CTRL bit is not set
+ * for that PLL by default, so set_rate operation would fail.
+ */
+static const struct samsung_pll_clock aud_pll_clks[] __initconst = {
+       PLL(pll_0831x, CLK_FOUT_AUD_PLL, "fout_aud_pll", "oscclk",
+           PLL_LOCKTIME_PLL_AUD, PLL_CON3_PLL_AUD, NULL),
+};
+
+static const struct samsung_fixed_rate_clock aud_fixed_clks[] __initconst = {
+       FRATE(IOCLK_AUDIOCDCLK0, "ioclk_audiocdclk0", NULL, 0, 25000000),
+       FRATE(IOCLK_AUDIOCDCLK1, "ioclk_audiocdclk1", NULL, 0, 25000000),
+       FRATE(IOCLK_AUDIOCDCLK2, "ioclk_audiocdclk2", NULL, 0, 25000000),
+       FRATE(IOCLK_AUDIOCDCLK3, "ioclk_audiocdclk3", NULL, 0, 25000000),
+       FRATE(IOCLK_AUDIOCDCLK4, "ioclk_audiocdclk4", NULL, 0, 25000000),
+       FRATE(IOCLK_AUDIOCDCLK5, "ioclk_audiocdclk5", NULL, 0, 25000000),
+       FRATE(IOCLK_AUDIOCDCLK6, "ioclk_audiocdclk6", NULL, 0, 25000000),
+       FRATE(TICK_USB, "tick_usb", NULL, 0, 60000000),
+};
+
+static const struct samsung_mux_clock aud_mux_clks[] __initconst = {
+       MUX(CLK_MOUT_AUD_PLL, "mout_aud_pll", mout_aud_pll_p,
+           PLL_CON0_PLL_AUD, 4, 1),
+       MUX(CLK_MOUT_AUD_CPU_USER, "mout_aud_cpu_user", mout_aud_cpu_user_p,
+           PLL_CON0_MUX_CLKCMU_AUD_CPU_USER, 4, 1),
+       MUX(CLK_MOUT_AUD_TICK_USB_USER, "mout_aud_tick_usb_user",
+           mout_aud_tick_usb_user_p,
+           PLL_CON0_MUX_TICK_USB_USER, 4, 1),
+       MUX(CLK_MOUT_AUD_CPU, "mout_aud_cpu", mout_aud_cpu_p,
+           CLK_CON_MUX_MUX_CLK_AUD_CPU, 0, 1),
+       MUX(CLK_MOUT_AUD_CPU_HCH, "mout_aud_cpu_hch", mout_aud_cpu_hch_p,
+           CLK_CON_MUX_MUX_CLK_AUD_CPU_HCH, 0, 1),
+       MUX(CLK_MOUT_AUD_UAIF0, "mout_aud_uaif0", mout_aud_uaif0_p,
+           CLK_CON_MUX_MUX_CLK_AUD_UAIF0, 0, 1),
+       MUX(CLK_MOUT_AUD_UAIF1, "mout_aud_uaif1", mout_aud_uaif1_p,
+           CLK_CON_MUX_MUX_CLK_AUD_UAIF1, 0, 1),
+       MUX(CLK_MOUT_AUD_UAIF2, "mout_aud_uaif2", mout_aud_uaif2_p,
+           CLK_CON_MUX_MUX_CLK_AUD_UAIF2, 0, 1),
+       MUX(CLK_MOUT_AUD_UAIF3, "mout_aud_uaif3", mout_aud_uaif3_p,
+           CLK_CON_MUX_MUX_CLK_AUD_UAIF3, 0, 1),
+       MUX(CLK_MOUT_AUD_UAIF4, "mout_aud_uaif4", mout_aud_uaif4_p,
+           CLK_CON_MUX_MUX_CLK_AUD_UAIF4, 0, 1),
+       MUX(CLK_MOUT_AUD_UAIF5, "mout_aud_uaif5", mout_aud_uaif5_p,
+           CLK_CON_MUX_MUX_CLK_AUD_UAIF5, 0, 1),
+       MUX(CLK_MOUT_AUD_UAIF6, "mout_aud_uaif6", mout_aud_uaif6_p,
+           CLK_CON_MUX_MUX_CLK_AUD_UAIF6, 0, 1),
+       MUX(CLK_MOUT_AUD_FM, "mout_aud_fm", mout_aud_fm_p,
+           CLK_CON_MUX_MUX_CLK_AUD_FM, 0, 1),
+};
+
+static const struct samsung_div_clock aud_div_clks[] __initconst = {
+       DIV(CLK_DOUT_AUD_CPU, "dout_aud_cpu", "mout_aud_pll",
+           CLK_CON_DIV_DIV_CLK_AUD_CPU, 0, 4),
+       DIV(CLK_DOUT_AUD_BUSD, "dout_aud_busd", "mout_aud_pll",
+           CLK_CON_DIV_DIV_CLK_AUD_BUSD, 0, 4),
+       DIV(CLK_DOUT_AUD_BUSP, "dout_aud_busp", "mout_aud_pll",
+           CLK_CON_DIV_DIV_CLK_AUD_BUSP, 0, 4),
+       DIV(CLK_DOUT_AUD_AUDIF, "dout_aud_audif", "mout_aud_pll",
+           CLK_CON_DIV_DIV_CLK_AUD_AUDIF, 0, 9),
+       DIV(CLK_DOUT_AUD_CPU_ACLK, "dout_aud_cpu_aclk", "mout_aud_cpu_hch",
+           CLK_CON_DIV_DIV_CLK_AUD_CPU_ACLK, 0, 3),
+       DIV(CLK_DOUT_AUD_CPU_PCLKDBG, "dout_aud_cpu_pclkdbg",
+           "mout_aud_cpu_hch",
+           CLK_CON_DIV_DIV_CLK_AUD_CPU_PCLKDBG, 0, 3),
+       DIV(CLK_DOUT_AUD_MCLK, "dout_aud_mclk", "dout_aud_audif",
+           CLK_CON_DIV_DIV_CLK_AUD_MCLK, 0, 2),
+       DIV(CLK_DOUT_AUD_CNT, "dout_aud_cnt", "dout_aud_audif",
+           CLK_CON_DIV_DIV_CLK_AUD_CNT, 0, 10),
+       DIV(CLK_DOUT_AUD_UAIF0, "dout_aud_uaif0", "dout_aud_audif",
+           CLK_CON_DIV_DIV_CLK_AUD_UAIF0, 0, 10),
+       DIV(CLK_DOUT_AUD_UAIF1, "dout_aud_uaif1", "dout_aud_audif",
+           CLK_CON_DIV_DIV_CLK_AUD_UAIF1, 0, 10),
+       DIV(CLK_DOUT_AUD_UAIF2, "dout_aud_uaif2", "dout_aud_audif",
+           CLK_CON_DIV_DIV_CLK_AUD_UAIF2, 0, 10),
+       DIV(CLK_DOUT_AUD_UAIF3, "dout_aud_uaif3", "dout_aud_audif",
+           CLK_CON_DIV_DIV_CLK_AUD_UAIF3, 0, 10),
+       DIV(CLK_DOUT_AUD_UAIF4, "dout_aud_uaif4", "dout_aud_audif",
+           CLK_CON_DIV_DIV_CLK_AUD_UAIF4, 0, 10),
+       DIV(CLK_DOUT_AUD_UAIF5, "dout_aud_uaif5", "dout_aud_audif",
+           CLK_CON_DIV_DIV_CLK_AUD_UAIF5, 0, 10),
+       DIV(CLK_DOUT_AUD_UAIF6, "dout_aud_uaif6", "dout_aud_audif",
+           CLK_CON_DIV_DIV_CLK_AUD_UAIF6, 0, 10),
+       DIV(CLK_DOUT_AUD_FM_SPDY, "dout_aud_fm_spdy", "mout_aud_tick_usb_user",
+           CLK_CON_DIV_DIV_CLK_AUD_FM_SPDY, 0, 1),
+       DIV(CLK_DOUT_AUD_FM, "dout_aud_fm", "mout_aud_fm",
+           CLK_CON_DIV_DIV_CLK_AUD_FM, 0, 10),
+};
+
+static const struct samsung_gate_clock aud_gate_clks[] __initconst = {
+       GATE(CLK_GOUT_AUD_CA32_CCLK, "gout_aud_ca32_cclk", "mout_aud_cpu_hch",
+            CLK_CON_GAT_GOUT_AUD_ABOX_CCLK_CA32, 21, 0, 0),
+       GATE(CLK_GOUT_AUD_ASB_CCLK, "gout_aud_asb_cclk", "dout_aud_cpu_aclk",
+            CLK_CON_GAT_GOUT_AUD_ABOX_CCLK_ASB, 21, 0, 0),
+       GATE(CLK_GOUT_AUD_DAP_CCLK, "gout_aud_dap_cclk", "dout_aud_cpu_pclkdbg",
+            CLK_CON_GAT_GOUT_AUD_ABOX_CCLK_DAP, 21, 0, 0),
+       /* TODO: Should be enabled in ABOX driver (or made CLK_IS_CRITICAL) */
+       GATE(CLK_GOUT_AUD_ABOX_ACLK, "gout_aud_abox_aclk", "dout_aud_busd",
+            CLK_CON_GAT_GOUT_AUD_ABOX_ACLK, 21, CLK_IGNORE_UNUSED, 0),
+       GATE(CLK_GOUT_AUD_GPIO_PCLK, "gout_aud_gpio_pclk", "dout_aud_busd",
+            CLK_CON_GAT_GOUT_AUD_GPIO_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_AUD_PPMU_ACLK, "gout_aud_ppmu_aclk", "dout_aud_busd",
+            CLK_CON_GAT_GOUT_AUD_PPMU_ACLK, 21, 0, 0),
+       GATE(CLK_GOUT_AUD_PPMU_PCLK, "gout_aud_ppmu_pclk", "dout_aud_busd",
+            CLK_CON_GAT_GOUT_AUD_PPMU_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_AUD_SYSMMU_CLK, "gout_aud_sysmmu_clk", "dout_aud_busd",
+            CLK_CON_GAT_GOUT_AUD_SYSMMU_CLK_S1, 21, 0, 0),
+       GATE(CLK_GOUT_AUD_SYSREG_PCLK, "gout_aud_sysreg_pclk", "dout_aud_busd",
+            CLK_CON_GAT_GOUT_AUD_SYSREG_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_AUD_WDT_PCLK, "gout_aud_wdt_pclk", "dout_aud_busd",
+            CLK_CON_GAT_GOUT_AUD_WDT_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_AUD_TZPC_PCLK, "gout_aud_tzpc_pclk", "dout_aud_busp",
+            CLK_CON_GAT_GOUT_AUD_TZPC_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_AUD_CODEC_MCLK, "gout_aud_codec_mclk", "dout_aud_mclk",
+            CLK_CON_GAT_GOUT_AUD_CODEC_MCLK, 21, 0, 0),
+       GATE(CLK_GOUT_AUD_CNT_BCLK, "gout_aud_cnt_bclk", "dout_aud_cnt",
+            CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_CNT, 21, 0, 0),
+       GATE(CLK_GOUT_AUD_UAIF0_BCLK, "gout_aud_uaif0_bclk", "mout_aud_uaif0",
+            CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_UAIF0, 21, 0, 0),
+       GATE(CLK_GOUT_AUD_UAIF1_BCLK, "gout_aud_uaif1_bclk", "mout_aud_uaif1",
+            CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_UAIF1, 21, 0, 0),
+       GATE(CLK_GOUT_AUD_UAIF2_BCLK, "gout_aud_uaif2_bclk", "mout_aud_uaif2",
+            CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_UAIF2, 21, 0, 0),
+       GATE(CLK_GOUT_AUD_UAIF3_BCLK, "gout_aud_uaif3_bclk", "mout_aud_uaif3",
+            CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_UAIF3, 21, 0, 0),
+       GATE(CLK_GOUT_AUD_UAIF4_BCLK, "gout_aud_uaif4_bclk", "mout_aud_uaif4",
+            CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_UAIF4, 21, 0, 0),
+       GATE(CLK_GOUT_AUD_UAIF5_BCLK, "gout_aud_uaif5_bclk", "mout_aud_uaif5",
+            CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_UAIF5, 21, 0, 0),
+       GATE(CLK_GOUT_AUD_UAIF6_BCLK, "gout_aud_uaif6_bclk", "mout_aud_uaif6",
+            CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_UAIF6, 21, 0, 0),
+       GATE(CLK_GOUT_AUD_SPDY_BCLK, "gout_aud_spdy_bclk", "dout_aud_fm",
+            CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_SPDY, 21, 0, 0),
+};
+
+static const struct samsung_cmu_info aud_cmu_info __initconst = {
+       .pll_clks               = aud_pll_clks,
+       .nr_pll_clks            = ARRAY_SIZE(aud_pll_clks),
+       .mux_clks               = aud_mux_clks,
+       .nr_mux_clks            = ARRAY_SIZE(aud_mux_clks),
+       .div_clks               = aud_div_clks,
+       .nr_div_clks            = ARRAY_SIZE(aud_div_clks),
+       .gate_clks              = aud_gate_clks,
+       .nr_gate_clks           = ARRAY_SIZE(aud_gate_clks),
+       .fixed_clks             = aud_fixed_clks,
+       .nr_fixed_clks          = ARRAY_SIZE(aud_fixed_clks),
+       .nr_clk_ids             = AUD_NR_CLK,
+       .clk_regs               = aud_clk_regs,
+       .nr_clk_regs            = ARRAY_SIZE(aud_clk_regs),
+       .clk_name               = "dout_aud",
+};
+
 /* ---- CMU_CMGP ------------------------------------------------------------ */
 
 /* Register Offset definitions for CMU_CMGP (0x11c00000) */
@@ -599,7 +1025,7 @@ static const unsigned long hsi_clk_regs[] __initconst = {
        CLK_CON_GAT_GOUT_HSI_USB20DRD_TOP_BUS_CLK_EARLY,
 };
 
-/* List of parent clocks for Muxes in CMU_PERI */
+/* List of parent clocks for Muxes in CMU_HSI */
 PNAME(mout_hsi_bus_user_p)     = { "oscclk", "dout_hsi_bus" };
 PNAME(mout_hsi_mmc_card_user_p)        = { "oscclk", "dout_hsi_mmc_card" };
 PNAME(mout_hsi_usb20drd_user_p)        = { "oscclk", "dout_hsi_usb20drd" };
@@ -654,6 +1080,247 @@ static const struct samsung_cmu_info hsi_cmu_info __initconst = {
        .clk_name               = "dout_hsi_bus",
 };
 
+/* ---- CMU_IS -------------------------------------------------------------- */
+
+#define PLL_CON0_MUX_CLKCMU_IS_BUS_USER                0x0600
+#define PLL_CON0_MUX_CLKCMU_IS_GDC_USER                0x0610
+#define PLL_CON0_MUX_CLKCMU_IS_ITP_USER                0x0620
+#define PLL_CON0_MUX_CLKCMU_IS_VRA_USER                0x0630
+#define CLK_CON_DIV_DIV_CLK_IS_BUSP            0x1800
+#define CLK_CON_GAT_CLK_IS_CMU_IS_PCLK         0x2000
+#define CLK_CON_GAT_GOUT_IS_CSIS0_ACLK         0x2040
+#define CLK_CON_GAT_GOUT_IS_CSIS1_ACLK         0x2044
+#define CLK_CON_GAT_GOUT_IS_CSIS2_ACLK         0x2048
+#define CLK_CON_GAT_GOUT_IS_TZPC_PCLK          0x204c
+#define CLK_CON_GAT_GOUT_IS_CLK_CSIS_DMA       0x2050
+#define CLK_CON_GAT_GOUT_IS_CLK_GDC            0x2054
+#define CLK_CON_GAT_GOUT_IS_CLK_IPP            0x2058
+#define CLK_CON_GAT_GOUT_IS_CLK_ITP            0x205c
+#define CLK_CON_GAT_GOUT_IS_CLK_MCSC           0x2060
+#define CLK_CON_GAT_GOUT_IS_CLK_VRA            0x2064
+#define CLK_CON_GAT_GOUT_IS_PPMU_IS0_ACLK      0x2074
+#define CLK_CON_GAT_GOUT_IS_PPMU_IS0_PCLK      0x2078
+#define CLK_CON_GAT_GOUT_IS_PPMU_IS1_ACLK      0x207c
+#define CLK_CON_GAT_GOUT_IS_PPMU_IS1_PCLK      0x2080
+#define CLK_CON_GAT_GOUT_IS_SYSMMU_IS0_CLK_S1  0x2098
+#define CLK_CON_GAT_GOUT_IS_SYSMMU_IS1_CLK_S1  0x209c
+#define CLK_CON_GAT_GOUT_IS_SYSREG_PCLK                0x20a0
+
+static const unsigned long is_clk_regs[] __initconst = {
+       PLL_CON0_MUX_CLKCMU_IS_BUS_USER,
+       PLL_CON0_MUX_CLKCMU_IS_GDC_USER,
+       PLL_CON0_MUX_CLKCMU_IS_ITP_USER,
+       PLL_CON0_MUX_CLKCMU_IS_VRA_USER,
+       CLK_CON_DIV_DIV_CLK_IS_BUSP,
+       CLK_CON_GAT_CLK_IS_CMU_IS_PCLK,
+       CLK_CON_GAT_GOUT_IS_CSIS0_ACLK,
+       CLK_CON_GAT_GOUT_IS_CSIS1_ACLK,
+       CLK_CON_GAT_GOUT_IS_CSIS2_ACLK,
+       CLK_CON_GAT_GOUT_IS_TZPC_PCLK,
+       CLK_CON_GAT_GOUT_IS_CLK_CSIS_DMA,
+       CLK_CON_GAT_GOUT_IS_CLK_GDC,
+       CLK_CON_GAT_GOUT_IS_CLK_IPP,
+       CLK_CON_GAT_GOUT_IS_CLK_ITP,
+       CLK_CON_GAT_GOUT_IS_CLK_MCSC,
+       CLK_CON_GAT_GOUT_IS_CLK_VRA,
+       CLK_CON_GAT_GOUT_IS_PPMU_IS0_ACLK,
+       CLK_CON_GAT_GOUT_IS_PPMU_IS0_PCLK,
+       CLK_CON_GAT_GOUT_IS_PPMU_IS1_ACLK,
+       CLK_CON_GAT_GOUT_IS_PPMU_IS1_PCLK,
+       CLK_CON_GAT_GOUT_IS_SYSMMU_IS0_CLK_S1,
+       CLK_CON_GAT_GOUT_IS_SYSMMU_IS1_CLK_S1,
+       CLK_CON_GAT_GOUT_IS_SYSREG_PCLK,
+};
+
+/* List of parent clocks for Muxes in CMU_IS */
+PNAME(mout_is_bus_user_p)      = { "oscclk", "dout_is_bus" };
+PNAME(mout_is_itp_user_p)      = { "oscclk", "dout_is_itp" };
+PNAME(mout_is_vra_user_p)      = { "oscclk", "dout_is_vra" };
+PNAME(mout_is_gdc_user_p)      = { "oscclk", "dout_is_gdc" };
+
+static const struct samsung_mux_clock is_mux_clks[] __initconst = {
+       MUX(CLK_MOUT_IS_BUS_USER, "mout_is_bus_user", mout_is_bus_user_p,
+           PLL_CON0_MUX_CLKCMU_IS_BUS_USER, 4, 1),
+       MUX(CLK_MOUT_IS_ITP_USER, "mout_is_itp_user", mout_is_itp_user_p,
+           PLL_CON0_MUX_CLKCMU_IS_ITP_USER, 4, 1),
+       MUX(CLK_MOUT_IS_VRA_USER, "mout_is_vra_user", mout_is_vra_user_p,
+           PLL_CON0_MUX_CLKCMU_IS_VRA_USER, 4, 1),
+       MUX(CLK_MOUT_IS_GDC_USER, "mout_is_gdc_user", mout_is_gdc_user_p,
+           PLL_CON0_MUX_CLKCMU_IS_GDC_USER, 4, 1),
+};
+
+static const struct samsung_div_clock is_div_clks[] __initconst = {
+       DIV(CLK_DOUT_IS_BUSP, "dout_is_busp", "mout_is_bus_user",
+           CLK_CON_DIV_DIV_CLK_IS_BUSP, 0, 2),
+};
+
+static const struct samsung_gate_clock is_gate_clks[] __initconst = {
+       /* TODO: Should be enabled in IS driver */
+       GATE(CLK_GOUT_IS_CMU_IS_PCLK, "gout_is_cmu_is_pclk", "dout_is_busp",
+            CLK_CON_GAT_CLK_IS_CMU_IS_PCLK, 21, CLK_IGNORE_UNUSED, 0),
+       GATE(CLK_GOUT_IS_CSIS0_ACLK, "gout_is_csis0_aclk", "mout_is_bus_user",
+            CLK_CON_GAT_GOUT_IS_CSIS0_ACLK, 21, 0, 0),
+       GATE(CLK_GOUT_IS_CSIS1_ACLK, "gout_is_csis1_aclk", "mout_is_bus_user",
+            CLK_CON_GAT_GOUT_IS_CSIS1_ACLK, 21, 0, 0),
+       GATE(CLK_GOUT_IS_CSIS2_ACLK, "gout_is_csis2_aclk", "mout_is_bus_user",
+            CLK_CON_GAT_GOUT_IS_CSIS2_ACLK, 21, 0, 0),
+       GATE(CLK_GOUT_IS_TZPC_PCLK, "gout_is_tzpc_pclk", "dout_is_busp",
+            CLK_CON_GAT_GOUT_IS_TZPC_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_IS_CSIS_DMA_CLK, "gout_is_csis_dma_clk",
+            "mout_is_bus_user",
+            CLK_CON_GAT_GOUT_IS_CLK_CSIS_DMA, 21, 0, 0),
+       GATE(CLK_GOUT_IS_GDC_CLK, "gout_is_gdc_clk", "mout_is_gdc_user",
+            CLK_CON_GAT_GOUT_IS_CLK_GDC, 21, 0, 0),
+       GATE(CLK_GOUT_IS_IPP_CLK, "gout_is_ipp_clk", "mout_is_bus_user",
+            CLK_CON_GAT_GOUT_IS_CLK_IPP, 21, 0, 0),
+       GATE(CLK_GOUT_IS_ITP_CLK, "gout_is_itp_clk", "mout_is_itp_user",
+            CLK_CON_GAT_GOUT_IS_CLK_ITP, 21, 0, 0),
+       GATE(CLK_GOUT_IS_MCSC_CLK, "gout_is_mcsc_clk", "mout_is_itp_user",
+            CLK_CON_GAT_GOUT_IS_CLK_MCSC, 21, 0, 0),
+       GATE(CLK_GOUT_IS_VRA_CLK, "gout_is_vra_clk", "mout_is_vra_user",
+            CLK_CON_GAT_GOUT_IS_CLK_VRA, 21, 0, 0),
+       GATE(CLK_GOUT_IS_PPMU_IS0_ACLK, "gout_is_ppmu_is0_aclk",
+            "mout_is_bus_user",
+            CLK_CON_GAT_GOUT_IS_PPMU_IS0_ACLK, 21, 0, 0),
+       GATE(CLK_GOUT_IS_PPMU_IS0_PCLK, "gout_is_ppmu_is0_pclk", "dout_is_busp",
+            CLK_CON_GAT_GOUT_IS_PPMU_IS0_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_IS_PPMU_IS1_ACLK, "gout_is_ppmu_is1_aclk",
+            "mout_is_itp_user",
+            CLK_CON_GAT_GOUT_IS_PPMU_IS1_ACLK, 21, 0, 0),
+       GATE(CLK_GOUT_IS_PPMU_IS1_PCLK, "gout_is_ppmu_is1_pclk", "dout_is_busp",
+            CLK_CON_GAT_GOUT_IS_PPMU_IS1_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_IS_SYSMMU_IS0_CLK, "gout_is_sysmmu_is0_clk",
+            "mout_is_bus_user",
+            CLK_CON_GAT_GOUT_IS_SYSMMU_IS0_CLK_S1, 21, 0, 0),
+       GATE(CLK_GOUT_IS_SYSMMU_IS1_CLK, "gout_is_sysmmu_is1_clk",
+            "mout_is_itp_user",
+            CLK_CON_GAT_GOUT_IS_SYSMMU_IS1_CLK_S1, 21, 0, 0),
+       GATE(CLK_GOUT_IS_SYSREG_PCLK, "gout_is_sysreg_pclk", "dout_is_busp",
+            CLK_CON_GAT_GOUT_IS_SYSREG_PCLK, 21, 0, 0),
+};
+
+static const struct samsung_cmu_info is_cmu_info __initconst = {
+       .mux_clks               = is_mux_clks,
+       .nr_mux_clks            = ARRAY_SIZE(is_mux_clks),
+       .div_clks               = is_div_clks,
+       .nr_div_clks            = ARRAY_SIZE(is_div_clks),
+       .gate_clks              = is_gate_clks,
+       .nr_gate_clks           = ARRAY_SIZE(is_gate_clks),
+       .nr_clk_ids             = IS_NR_CLK,
+       .clk_regs               = is_clk_regs,
+       .nr_clk_regs            = ARRAY_SIZE(is_clk_regs),
+       .clk_name               = "dout_is_bus",
+};
+
+/* ---- CMU_MFCMSCL --------------------------------------------------------- */
+
+#define PLL_CON0_MUX_CLKCMU_MFCMSCL_JPEG_USER          0x0600
+#define PLL_CON0_MUX_CLKCMU_MFCMSCL_M2M_USER           0x0610
+#define PLL_CON0_MUX_CLKCMU_MFCMSCL_MCSC_USER          0x0620
+#define PLL_CON0_MUX_CLKCMU_MFCMSCL_MFC_USER           0x0630
+#define CLK_CON_DIV_DIV_CLK_MFCMSCL_BUSP               0x1800
+#define CLK_CON_GAT_CLK_MFCMSCL_CMU_MFCMSCL_PCLK       0x2000
+#define CLK_CON_GAT_GOUT_MFCMSCL_TZPC_PCLK             0x2038
+#define CLK_CON_GAT_GOUT_MFCMSCL_JPEG_ACLK             0x203c
+#define CLK_CON_GAT_GOUT_MFCMSCL_M2M_ACLK              0x2048
+#define CLK_CON_GAT_GOUT_MFCMSCL_MCSC_I_CLK            0x204c
+#define CLK_CON_GAT_GOUT_MFCMSCL_MFC_ACLK              0x2050
+#define CLK_CON_GAT_GOUT_MFCMSCL_PPMU_ACLK             0x2054
+#define CLK_CON_GAT_GOUT_MFCMSCL_PPMU_PCLK             0x2058
+#define CLK_CON_GAT_GOUT_MFCMSCL_SYSMMU_CLK_S1         0x2074
+#define CLK_CON_GAT_GOUT_MFCMSCL_SYSREG_PCLK           0x2078
+
+static const unsigned long mfcmscl_clk_regs[] __initconst = {
+       PLL_CON0_MUX_CLKCMU_MFCMSCL_JPEG_USER,
+       PLL_CON0_MUX_CLKCMU_MFCMSCL_M2M_USER,
+       PLL_CON0_MUX_CLKCMU_MFCMSCL_MCSC_USER,
+       PLL_CON0_MUX_CLKCMU_MFCMSCL_MFC_USER,
+       CLK_CON_DIV_DIV_CLK_MFCMSCL_BUSP,
+       CLK_CON_GAT_CLK_MFCMSCL_CMU_MFCMSCL_PCLK,
+       CLK_CON_GAT_GOUT_MFCMSCL_TZPC_PCLK,
+       CLK_CON_GAT_GOUT_MFCMSCL_JPEG_ACLK,
+       CLK_CON_GAT_GOUT_MFCMSCL_M2M_ACLK,
+       CLK_CON_GAT_GOUT_MFCMSCL_MCSC_I_CLK,
+       CLK_CON_GAT_GOUT_MFCMSCL_MFC_ACLK,
+       CLK_CON_GAT_GOUT_MFCMSCL_PPMU_ACLK,
+       CLK_CON_GAT_GOUT_MFCMSCL_PPMU_PCLK,
+       CLK_CON_GAT_GOUT_MFCMSCL_SYSMMU_CLK_S1,
+       CLK_CON_GAT_GOUT_MFCMSCL_SYSREG_PCLK,
+};
+
+/* List of parent clocks for Muxes in CMU_MFCMSCL */
+PNAME(mout_mfcmscl_mfc_user_p) = { "oscclk", "dout_mfcmscl_mfc" };
+PNAME(mout_mfcmscl_m2m_user_p) = { "oscclk", "dout_mfcmscl_m2m" };
+PNAME(mout_mfcmscl_mcsc_user_p)        = { "oscclk", "dout_mfcmscl_mcsc" };
+PNAME(mout_mfcmscl_jpeg_user_p)        = { "oscclk", "dout_mfcmscl_jpeg" };
+
+static const struct samsung_mux_clock mfcmscl_mux_clks[] __initconst = {
+       MUX(CLK_MOUT_MFCMSCL_MFC_USER, "mout_mfcmscl_mfc_user",
+           mout_mfcmscl_mfc_user_p,
+           PLL_CON0_MUX_CLKCMU_MFCMSCL_MFC_USER, 4, 1),
+       MUX(CLK_MOUT_MFCMSCL_M2M_USER, "mout_mfcmscl_m2m_user",
+           mout_mfcmscl_m2m_user_p,
+           PLL_CON0_MUX_CLKCMU_MFCMSCL_M2M_USER, 4, 1),
+       MUX(CLK_MOUT_MFCMSCL_MCSC_USER, "mout_mfcmscl_mcsc_user",
+           mout_mfcmscl_mcsc_user_p,
+           PLL_CON0_MUX_CLKCMU_MFCMSCL_MCSC_USER, 4, 1),
+       MUX(CLK_MOUT_MFCMSCL_JPEG_USER, "mout_mfcmscl_jpeg_user",
+           mout_mfcmscl_jpeg_user_p,
+           PLL_CON0_MUX_CLKCMU_MFCMSCL_JPEG_USER, 4, 1),
+};
+
+static const struct samsung_div_clock mfcmscl_div_clks[] __initconst = {
+       DIV(CLK_DOUT_MFCMSCL_BUSP, "dout_mfcmscl_busp", "mout_mfcmscl_mfc_user",
+           CLK_CON_DIV_DIV_CLK_MFCMSCL_BUSP, 0, 3),
+};
+
+static const struct samsung_gate_clock mfcmscl_gate_clks[] __initconst = {
+       /* TODO: Should be enabled in MFC driver */
+       GATE(CLK_GOUT_MFCMSCL_CMU_MFCMSCL_PCLK, "gout_mfcmscl_cmu_mfcmscl_pclk",
+            "dout_mfcmscl_busp", CLK_CON_GAT_CLK_MFCMSCL_CMU_MFCMSCL_PCLK,
+            21, CLK_IGNORE_UNUSED, 0),
+       GATE(CLK_GOUT_MFCMSCL_TZPC_PCLK, "gout_mfcmscl_tzpc_pclk",
+            "dout_mfcmscl_busp", CLK_CON_GAT_GOUT_MFCMSCL_TZPC_PCLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_MFCMSCL_JPEG_ACLK, "gout_mfcmscl_jpeg_aclk",
+            "mout_mfcmscl_jpeg_user", CLK_CON_GAT_GOUT_MFCMSCL_JPEG_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_MFCMSCL_M2M_ACLK, "gout_mfcmscl_m2m_aclk",
+            "mout_mfcmscl_m2m_user", CLK_CON_GAT_GOUT_MFCMSCL_M2M_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_MFCMSCL_MCSC_CLK, "gout_mfcmscl_mcsc_clk",
+            "mout_mfcmscl_mcsc_user", CLK_CON_GAT_GOUT_MFCMSCL_MCSC_I_CLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_MFCMSCL_MFC_ACLK, "gout_mfcmscl_mfc_aclk",
+            "mout_mfcmscl_mfc_user", CLK_CON_GAT_GOUT_MFCMSCL_MFC_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_MFCMSCL_PPMU_ACLK, "gout_mfcmscl_ppmu_aclk",
+            "mout_mfcmscl_mfc_user", CLK_CON_GAT_GOUT_MFCMSCL_PPMU_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_MFCMSCL_PPMU_PCLK, "gout_mfcmscl_ppmu_pclk",
+            "dout_mfcmscl_busp", CLK_CON_GAT_GOUT_MFCMSCL_PPMU_PCLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_MFCMSCL_SYSMMU_CLK, "gout_mfcmscl_sysmmu_clk",
+            "mout_mfcmscl_mfc_user", CLK_CON_GAT_GOUT_MFCMSCL_SYSMMU_CLK_S1,
+            21, 0, 0),
+       GATE(CLK_GOUT_MFCMSCL_SYSREG_PCLK, "gout_mfcmscl_sysreg_pclk",
+            "dout_mfcmscl_busp", CLK_CON_GAT_GOUT_MFCMSCL_SYSREG_PCLK,
+            21, 0, 0),
+};
+
+static const struct samsung_cmu_info mfcmscl_cmu_info __initconst = {
+       .mux_clks               = mfcmscl_mux_clks,
+       .nr_mux_clks            = ARRAY_SIZE(mfcmscl_mux_clks),
+       .div_clks               = mfcmscl_div_clks,
+       .nr_div_clks            = ARRAY_SIZE(mfcmscl_div_clks),
+       .gate_clks              = mfcmscl_gate_clks,
+       .nr_gate_clks           = ARRAY_SIZE(mfcmscl_gate_clks),
+       .nr_clk_ids             = MFCMSCL_NR_CLK,
+       .clk_regs               = mfcmscl_clk_regs,
+       .nr_clk_regs            = ARRAY_SIZE(mfcmscl_clk_regs),
+       .clk_name               = "dout_mfcmscl_mfc",
+};
+
 /* ---- CMU_PERI ------------------------------------------------------------ */
 
 /* Register Offset definitions for CMU_PERI (0x10030000) */
@@ -963,7 +1630,7 @@ static const unsigned long dpu_clk_regs[] __initconst = {
        CLK_CON_GAT_GOUT_DPU_SYSREG_PCLK,
 };
 
-/* List of parent clocks for Muxes in CMU_CORE */
+/* List of parent clocks for Muxes in CMU_DPU */
 PNAME(mout_dpu_user_p)         = { "oscclk", "dout_dpu" };
 
 static const struct samsung_mux_clock dpu_mux_clks[] __initconst = {
@@ -1028,12 +1695,21 @@ static const struct of_device_id exynos850_cmu_of_match[] = {
                .compatible = "samsung,exynos850-cmu-apm",
                .data = &apm_cmu_info,
        }, {
+               .compatible = "samsung,exynos850-cmu-aud",
+               .data = &aud_cmu_info,
+       }, {
                .compatible = "samsung,exynos850-cmu-cmgp",
                .data = &cmgp_cmu_info,
        }, {
                .compatible = "samsung,exynos850-cmu-hsi",
                .data = &hsi_cmu_info,
        }, {
+               .compatible = "samsung,exynos850-cmu-is",
+               .data = &is_cmu_info,
+       }, {
+               .compatible = "samsung,exynos850-cmu-mfcmscl",
+               .data = &mfcmscl_cmu_info,
+       }, {
                .compatible = "samsung,exynos850-cmu-core",
                .data = &core_cmu_info,
        }, {
index d9e1f8e..7b16320 100644 (file)
@@ -1067,6 +1067,373 @@ static const struct samsung_cmu_info core_cmu_info __initconst = {
        .clk_name               = "dout_clkcmu_core_bus",
 };
 
+/* ---- CMU_FSYS0 ---------------------------------------------------------- */
+
+/* Register Offset definitions for CMU_FSYS2 (0x17700000) */
+#define PLL_CON0_MUX_CLKCMU_FSYS0_BUS_USER     0x0600
+#define PLL_CON0_MUX_CLKCMU_FSYS0_PCIE_USER    0x0610
+#define CLK_CON_GAT_CLK_BLK_FSYS0_UID_FSYS0_CMU_FSYS0_IPCLKPORT_PCLK   0x2000
+
+#define CLK_CON_GAT_CLK_BLK_FSYS0_UID_PCIE_GEN3_2L0_X1_PHY_REFCLK_IN   0x2004
+#define CLK_CON_GAT_CLK_BLK_FSYS0_UID_PCIE_GEN3_2L0_X2_PHY_REFCLK_IN   0x2008
+#define CLK_CON_GAT_CLK_BLK_FSYS0_UID_PCIE_GEN3_2L1_X1_PHY_REFCLK_IN   0x200c
+#define CLK_CON_GAT_CLK_BLK_FSYS0_UID_PCIE_GEN3_2L1_X2_PHY_REFCLK_IN   0x2010
+#define CLK_CON_GAT_CLK_BLK_FSYS0_UID_PCIE_GEN3_4L_X2_PHY_REFCLK_IN    0x2014
+#define CLK_CON_GAT_CLK_BLK_FSYS0_UID_PCIE_GEN3_4L_X4_PHY_REFCLK_IN    0x2018
+
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L0_X1_DBI_ACLK       0x205c
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L0_X1_MSTR_ACLK      0x2060
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L0_X1_SLV_ACLK       0x2064
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L0_X2_DBI_ACLK       0x206c
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L0_X2_MSTR_ACLK      0x2070
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L0_X2_SLV_ACLK       0x2074
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L0_X2_PIPE_CLK       0x207c
+
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L1_X1_DBI_ACLK       0x2084
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L1_X1_MSTR_ACLK      0x2088
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L1_X1_SLV_ACLK       0x208c
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L1_X2_DBI_ACLK       0x2094
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L1_X2_MSTR_ACLK      0x2098
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L1_X2_SLV_ACLK       0x209c
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L1_X2_PIPE_CLK       0x20a4
+
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_4L_X2_DBI_ACLK                0x20ac
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_4L_X2_MSTR_ACLK       0x20b0
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_4L_X2_SLV_ACLK                0x20b4
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_4L_X4_DBI_ACLK                0x20bc
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_4L_X4_MSTR_ACLK       0x20c0
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_4L_X4_SLV_ACLK                0x20c4
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_4L_X4_PIPE_CLK                0x20cc
+
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3A_2L0_CLK              0x20d4
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3A_2L1_CLK              0x20d8
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3A_4L_CLK               0x20dc
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3B_2L0_CLK              0x20e0
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3B_2L1_CLK              0x20e4
+#define CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3B_4L_CLK               0x20e8
+
+
+static const unsigned long fsys0_clk_regs[] __initconst = {
+       PLL_CON0_MUX_CLKCMU_FSYS0_BUS_USER,
+       PLL_CON0_MUX_CLKCMU_FSYS0_PCIE_USER,
+       CLK_CON_GAT_CLK_BLK_FSYS0_UID_FSYS0_CMU_FSYS0_IPCLKPORT_PCLK,
+       CLK_CON_GAT_CLK_BLK_FSYS0_UID_PCIE_GEN3_2L0_X1_PHY_REFCLK_IN,
+       CLK_CON_GAT_CLK_BLK_FSYS0_UID_PCIE_GEN3_2L0_X2_PHY_REFCLK_IN,
+       CLK_CON_GAT_CLK_BLK_FSYS0_UID_PCIE_GEN3_2L1_X1_PHY_REFCLK_IN,
+       CLK_CON_GAT_CLK_BLK_FSYS0_UID_PCIE_GEN3_2L1_X2_PHY_REFCLK_IN,
+       CLK_CON_GAT_CLK_BLK_FSYS0_UID_PCIE_GEN3_4L_X2_PHY_REFCLK_IN,
+       CLK_CON_GAT_CLK_BLK_FSYS0_UID_PCIE_GEN3_4L_X4_PHY_REFCLK_IN,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L0_X1_DBI_ACLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L0_X1_MSTR_ACLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L0_X1_SLV_ACLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L0_X2_DBI_ACLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L0_X2_MSTR_ACLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L0_X2_SLV_ACLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L0_X2_PIPE_CLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L1_X1_DBI_ACLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L1_X1_MSTR_ACLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L1_X1_SLV_ACLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L1_X2_DBI_ACLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L1_X2_MSTR_ACLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L1_X2_SLV_ACLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L1_X2_PIPE_CLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_4L_X2_DBI_ACLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_4L_X2_MSTR_ACLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_4L_X2_SLV_ACLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_4L_X4_DBI_ACLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_4L_X4_MSTR_ACLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_4L_X4_SLV_ACLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_4L_X4_PIPE_CLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3A_2L0_CLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3A_2L1_CLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3A_4L_CLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3B_2L0_CLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3B_2L1_CLK,
+       CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3B_4L_CLK,
+};
+
+/* List of parent clocks for Muxes in CMU_FSYS0 */
+PNAME(mout_fsys0_bus_user_p) = { "oscclk", "dout_clkcmu_fsys0_bus" };
+PNAME(mout_fsys0_pcie_user_p) = { "oscclk", "dout_clkcmu_fsys0_pcie" };
+
+static const struct samsung_mux_clock fsys0_mux_clks[] __initconst = {
+       MUX(CLK_MOUT_FSYS0_BUS_USER, "mout_fsys0_bus_user",
+           mout_fsys0_bus_user_p, PLL_CON0_MUX_CLKCMU_FSYS0_BUS_USER, 4, 1),
+       MUX(CLK_MOUT_FSYS0_PCIE_USER, "mout_fsys0_pcie_user",
+           mout_fsys0_pcie_user_p, PLL_CON0_MUX_CLKCMU_FSYS0_PCIE_USER, 4, 1),
+};
+
+static const struct samsung_gate_clock fsys0_gate_clks[] __initconst = {
+       GATE(CLK_GOUT_FSYS0_BUS_PCLK, "gout_fsys0_bus_pclk",
+            "mout_fsys0_bus_user",
+            CLK_CON_GAT_CLK_BLK_FSYS0_UID_FSYS0_CMU_FSYS0_IPCLKPORT_PCLK,
+            21, CLK_IGNORE_UNUSED, 0),
+
+       /* Gen3 2L0 */
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3_2L0_X1_REFCLK,
+            "gout_fsys0_pcie_gen3_2l0_x1_refclk", "mout_fsys0_pcie_user",
+            CLK_CON_GAT_CLK_BLK_FSYS0_UID_PCIE_GEN3_2L0_X1_PHY_REFCLK_IN,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3_2L0_X2_REFCLK,
+            "gout_fsys0_pcie_gen3_2l0_x2_refclk", "mout_fsys0_pcie_user",
+            CLK_CON_GAT_CLK_BLK_FSYS0_UID_PCIE_GEN3_2L0_X2_PHY_REFCLK_IN,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3_2L0_X1_DBI_ACLK,
+            "gout_fsys0_pcie_gen3_2l0_x1_dbi_aclk", "mout_fsys0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L0_X1_DBI_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3_2L0_X1_MSTR_ACLK,
+            "gout_fsys0_pcie_gen3_2l0_x1_mstr_aclk", "mout_fsys0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L0_X1_MSTR_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3_2L0_X1_SLV_ACLK,
+            "gout_fsys0_pcie_gen3_2l0_x1_slv_aclk", "mout_fsys0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L0_X1_SLV_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3_2L0_X2_DBI_ACLK,
+            "gout_fsys0_pcie_gen3_2l0_x2_dbi_aclk", "mout_fsys0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L0_X2_DBI_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3_2L0_X2_MSTR_ACLK,
+            "gout_fsys0_pcie_gen3_2l0_x2_mstr_aclk", "mout_fsys0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L0_X2_MSTR_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3_2L0_X2_SLV_ACLK,
+            "gout_fsys0_pcie_gen3_2l0_x2_slv_aclk", "mout_fsys0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L0_X2_SLV_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3A_2L0_CLK,
+            "gout_fsys0_pcie_gen3a_2l0_clk", "mout_fsys0_pcie_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3A_2L0_CLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3B_2L0_CLK,
+            "gout_fsys0_pcie_gen3b_2l0_clk", "mout_fsys0_pcie_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3B_2L0_CLK,
+            21, 0, 0),
+
+       /* Gen3 2L1 */
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3_2L1_X1_REFCLK,
+            "gout_fsys0_pcie_gen3_2l1_x1_refclk", "mout_fsys0_pcie_user",
+            CLK_CON_GAT_CLK_BLK_FSYS0_UID_PCIE_GEN3_2L1_X1_PHY_REFCLK_IN,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3_2L1_X2_REFCLK,
+            "gout_fsys0_pcie_gen3_2l1_x2_refclk", "mout_fsys0_pcie_user",
+            CLK_CON_GAT_CLK_BLK_FSYS0_UID_PCIE_GEN3_2L1_X2_PHY_REFCLK_IN,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3_2L1_X1_DBI_ACLK,
+            "gout_fsys0_pcie_gen3_2l1_x1_dbi_aclk", "mout_fsys0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L1_X1_DBI_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3_2L1_X1_MSTR_ACLK,
+            "gout_fsys0_pcie_gen3_2l1_x1_mstr_aclk", "mout_fsys0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L1_X1_MSTR_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3_2L1_X1_SLV_ACLK,
+            "gout_fsys0_pcie_gen3_2l1_x1_slv_aclk", "mout_fsys0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L1_X1_SLV_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3_2L1_X2_DBI_ACLK,
+            "gout_fsys0_pcie_gen3_2l1_x2_dbi_aclk", "mout_fsys0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L1_X2_DBI_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3_2L1_X2_MSTR_ACLK,
+            "gout_fsys0_pcie_gen3_2l1_x2_mstr_aclk", "mout_fsys0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L1_X2_MSTR_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3_2L1_X2_SLV_ACLK,
+            "gout_fsys0_pcie_gen3_2l1_x2_slv_aclk", "mout_fsys0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_2L1_X2_SLV_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3A_2L1_CLK,
+            "gout_fsys0_pcie_gen3a_2l1_clk", "mout_fsys0_pcie_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3A_2L1_CLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3B_2L1_CLK,
+            "gout_fsys0_pcie_gen3b_2l1_clk", "mout_fsys0_pcie_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3B_2L1_CLK,
+            21, 0, 0),
+
+       /* Gen3 4L */
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3_4L_X2_REFCLK,
+            "gout_fsys0_pcie_gen3_4l_x2_refclk", "mout_fsys0_pcie_user",
+            CLK_CON_GAT_CLK_BLK_FSYS0_UID_PCIE_GEN3_4L_X2_PHY_REFCLK_IN,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3_4L_X4_REFCLK,
+            "gout_fsys0_pcie_gen3_4l_x4_refclk", "mout_fsys0_pcie_user",
+            CLK_CON_GAT_CLK_BLK_FSYS0_UID_PCIE_GEN3_4L_X4_PHY_REFCLK_IN,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3_4L_X2_DBI_ACLK,
+            "gout_fsys0_pcie_gen3_4l_x2_dbi_aclk", "mout_fsys0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_4L_X2_DBI_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3_4L_X2_MSTR_ACLK,
+            "gout_fsys0_pcie_gen3_4l_x2_mstr_aclk", "mout_fsys0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_4L_X2_MSTR_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3_4L_X2_SLV_ACLK,
+            "gout_fsys0_pcie_gen3_4l_x2_slv_aclk", "mout_fsys0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_4L_X2_SLV_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3_4L_X4_DBI_ACLK,
+            "gout_fsys0_pcie_gen3_4l_x4_dbi_aclk", "mout_fsys0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_4L_X4_DBI_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3_4L_X4_MSTR_ACLK,
+            "gout_fsys0_pcie_gen3_4l_x4_mstr_aclk", "mout_fsys0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_4L_X4_MSTR_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3_4L_X4_SLV_ACLK,
+            "gout_fsys0_pcie_gen3_4l_x4_slv_aclk", "mout_fsys0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3_4L_X4_SLV_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3A_4L_CLK,
+            "gout_fsys0_pcie_gen3a_4l_clk", "mout_fsys0_pcie_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3A_4L_CLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS0_PCIE_GEN3B_4L_CLK,
+            "gout_fsys0_pcie_gen3b_4l_clk", "mout_fsys0_pcie_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS0_UID_PCIE_GEN3B_4L_CLK,
+            21, 0, 0),
+};
+
+static const struct samsung_cmu_info fsys0_cmu_info __initconst = {
+       .mux_clks               = fsys0_mux_clks,
+       .nr_mux_clks            = ARRAY_SIZE(fsys0_mux_clks),
+       .gate_clks              = fsys0_gate_clks,
+       .nr_gate_clks           = ARRAY_SIZE(fsys0_gate_clks),
+       .nr_clk_ids             = FSYS0_NR_CLK,
+       .clk_regs               = fsys0_clk_regs,
+       .nr_clk_regs            = ARRAY_SIZE(fsys0_clk_regs),
+       .clk_name               = "dout_clkcmu_fsys0_bus",
+};
+
+/* ---- CMU_FSYS1 ---------------------------------------------------------- */
+
+/* Register Offset definitions for CMU_FSYS1 (0x17040000) */
+#define PLL_LOCKTIME_PLL_MMC                   0x0000
+#define PLL_CON0_PLL_MMC                       0x0100
+#define PLL_CON3_PLL_MMC                       0x010c
+#define PLL_CON0_MUX_CLKCMU_FSYS1_BUS_USER     0x0600
+#define PLL_CON0_MUX_CLKCMU_FSYS1_MMC_CARD_USER        0x0610
+#define PLL_CON0_MUX_CLKCMU_FSYS1_USBDRD_USER  0x0620
+
+#define CLK_CON_MUX_MUX_CLK_FSYS1_MMC_CARD     0x1000
+#define CLK_CON_DIV_DIV_CLK_FSYS1_MMC_CARD     0x1800
+
+#define CLK_CON_GAT_GOUT_BLK_FSYS1_UID_FSYS1_CMU_FSYS1_IPCLKPORT_PCLK  0x2018
+#define CLK_CON_GAT_GOUT_BLK_FSYS1_UID_MMC_CARD_IPCLKPORT_SDCLKIN      0x202c
+#define CLK_CON_GAT_GOUT_BLK_FSYS1_UID_MMC_CARD_IPCLKPORT_I_ACLK       0x2028
+
+#define CLK_CON_GAT_GOUT_BLK_FSYS1_UID_USB20DRD_0_REF_CLK_40           0x204c
+#define CLK_CON_GAT_GOUT_BLK_FSYS1_UID_USB20DRD_1_REF_CLK_40           0x2058
+#define CLK_CON_GAT_GOUT_BLK_FSYS1_UID_USB30DRD_0_REF_CLK_40           0x2064
+#define CLK_CON_GAT_GOUT_BLK_FSYS1_UID_USB30DRD_1_REF_CLK_40           0x2070
+
+#define CLK_CON_GAT_GOUT_BLK_FSYS1_UID_US_D_USB2_0_IPCLKPORT_ACLK      0x2074
+#define CLK_CON_GAT_GOUT_BLK_FSYS1_UID_US_D_USB2_1_IPCLKPORT_ACLK      0x2078
+#define CLK_CON_GAT_GOUT_BLK_FSYS1_UID_US_D_USB3_0_IPCLKPORT_ACLK      0x207c
+#define CLK_CON_GAT_GOUT_BLK_FSYS1_UID_US_D_USB3_1_IPCLKPORT_ACLK      0x2080
+
+static const unsigned long fsys1_clk_regs[] __initconst = {
+       PLL_CON0_MUX_CLKCMU_FSYS1_BUS_USER,
+};
+
+static const struct samsung_pll_clock fsys1_pll_clks[] __initconst = {
+       PLL(pll_0831x, FOUT_MMC_PLL, "fout_mmc_pll", "oscclk",
+           PLL_LOCKTIME_PLL_MMC, PLL_CON3_PLL_MMC, NULL),
+};
+
+/* List of parent clocks for Muxes in CMU_FSYS1 */
+PNAME(mout_fsys1_bus_user_p) = { "oscclk", "dout_clkcmu_fsys1_bus" };
+PNAME(mout_fsys1_mmc_pll_p) = { "oscclk", "fout_mmc_pll" };
+PNAME(mout_fsys1_mmc_card_user_p) = { "oscclk", "gout_clkcmu_fsys1_mmc_card" };
+PNAME(mout_fsys1_usbdrd_user_p) = { "oscclk", "dout_clkcmu_fsys1_usbdrd" };
+PNAME(mout_fsys1_mmc_card_p) = { "mout_fsys1_mmc_card_user",
+                                "mout_fsys1_mmc_pll" };
+
+static const struct samsung_mux_clock fsys1_mux_clks[] __initconst = {
+       MUX(CLK_MOUT_FSYS1_BUS_USER, "mout_fsys1_bus_user",
+           mout_fsys1_bus_user_p, PLL_CON0_MUX_CLKCMU_FSYS1_BUS_USER, 4, 1),
+       MUX(CLK_MOUT_FSYS1_MMC_PLL, "mout_fsys1_mmc_pll", mout_fsys1_mmc_pll_p,
+           PLL_CON0_PLL_MMC, 4, 1),
+       MUX(CLK_MOUT_FSYS1_MMC_CARD_USER, "mout_fsys1_mmc_card_user",
+           mout_fsys1_mmc_card_user_p, PLL_CON0_MUX_CLKCMU_FSYS1_MMC_CARD_USER,
+           4, 1),
+       MUX(CLK_MOUT_FSYS1_USBDRD_USER, "mout_fsys1_usbdrd_user",
+           mout_fsys1_usbdrd_user_p, PLL_CON0_MUX_CLKCMU_FSYS1_USBDRD_USER,
+           4, 1),
+       MUX(CLK_MOUT_FSYS1_MMC_CARD, "mout_fsys1_mmc_card",
+           mout_fsys1_mmc_card_p, CLK_CON_MUX_MUX_CLK_FSYS1_MMC_CARD,
+           0, 1),
+};
+
+static const struct samsung_div_clock fsys1_div_clks[] __initconst = {
+       DIV(CLK_DOUT_FSYS1_MMC_CARD, "dout_fsys1_mmc_card",
+           "mout_fsys1_mmc_card",
+           CLK_CON_DIV_DIV_CLK_FSYS1_MMC_CARD, 0, 9),
+};
+
+static const struct samsung_gate_clock fsys1_gate_clks[] __initconst = {
+       GATE(CLK_GOUT_FSYS1_PCLK, "gout_fsys1_pclk", "mout_fsys1_bus_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS1_UID_FSYS1_CMU_FSYS1_IPCLKPORT_PCLK,
+            21, CLK_IGNORE_UNUSED, 0),
+       GATE(CLK_GOUT_FSYS1_MMC_CARD_SDCLKIN, "gout_fsys1_mmc_card_sdclkin",
+            "dout_fsys1_mmc_card",
+            CLK_CON_GAT_GOUT_BLK_FSYS1_UID_MMC_CARD_IPCLKPORT_SDCLKIN,
+            21, CLK_SET_RATE_PARENT, 0),
+       GATE(CLK_GOUT_FSYS1_MMC_CARD_ACLK, "gout_fsys1_mmc_card_aclk",
+            "dout_fsys1_mmc_card",
+            CLK_CON_GAT_GOUT_BLK_FSYS1_UID_MMC_CARD_IPCLKPORT_I_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS1_USB20DRD_0_REFCLK, "gout_fsys1_usb20drd_0_refclk",
+            "mout_fsys1_usbdrd_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS1_UID_USB20DRD_0_REF_CLK_40,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS1_USB20DRD_1_REFCLK, "gout_fsys1_usb20drd_1_refclk",
+            "mout_fsys1_usbdrd_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS1_UID_USB20DRD_1_REF_CLK_40,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS1_USB30DRD_0_REFCLK, "gout_fsys1_usb30drd_0_refclk",
+            "mout_fsys1_usbdrd_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS1_UID_USB30DRD_0_REF_CLK_40,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS1_USB30DRD_1_REFCLK, "gout_fsys1_usb30drd_1_refclk",
+            "mout_fsys1_usbdrd_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS1_UID_USB30DRD_1_REF_CLK_40,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS1_USB20_0_ACLK, "gout_fsys1_usb20_0_aclk",
+            "mout_fsys1_usbdrd_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS1_UID_US_D_USB2_0_IPCLKPORT_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS1_USB20_1_ACLK, "gout_fsys1_usb20_1_aclk",
+            "mout_fsys1_usbdrd_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS1_UID_US_D_USB2_1_IPCLKPORT_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS1_USB30_0_ACLK, "gout_fsys1_usb30_0_aclk",
+            "mout_fsys1_usbdrd_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS1_UID_US_D_USB3_0_IPCLKPORT_ACLK,
+            21, 0, 0),
+       GATE(CLK_GOUT_FSYS1_USB30_1_ACLK, "gout_fsys1_usb30_1_aclk",
+            "mout_fsys1_usbdrd_user",
+            CLK_CON_GAT_GOUT_BLK_FSYS1_UID_US_D_USB3_1_IPCLKPORT_ACLK,
+            21, 0, 0),
+};
+
+static const struct samsung_cmu_info fsys1_cmu_info __initconst = {
+       .pll_clks               = fsys1_pll_clks,
+       .nr_pll_clks            = ARRAY_SIZE(fsys1_pll_clks),
+       .mux_clks               = fsys1_mux_clks,
+       .nr_mux_clks            = ARRAY_SIZE(fsys1_mux_clks),
+       .div_clks               = fsys1_div_clks,
+       .nr_div_clks            = ARRAY_SIZE(fsys1_div_clks),
+       .gate_clks              = fsys1_gate_clks,
+       .nr_gate_clks           = ARRAY_SIZE(fsys1_gate_clks),
+       .nr_clk_ids             = FSYS1_NR_CLK,
+       .clk_regs               = fsys1_clk_regs,
+       .nr_clk_regs            = ARRAY_SIZE(fsys1_clk_regs),
+       .clk_name               = "dout_clkcmu_fsys1_bus",
+};
+
 /* ---- CMU_FSYS2 ---------------------------------------------------------- */
 
 /* Register Offset definitions for CMU_FSYS2 (0x17c00000) */
@@ -1170,9 +1537,9 @@ static const struct samsung_cmu_info fsys2_cmu_info __initconst = {
 #define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_2   0x2058
 #define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_3   0x205c
 #define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_4   0x2060
-#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_7   0x206c
 #define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_5   0x2064
 #define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_6   0x2068
+#define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_7   0x206c
 #define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_8   0x2070
 #define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_9   0x2074
 #define CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_10  0x204c
@@ -1330,6 +1697,10 @@ static const struct samsung_gate_clock peric0_gate_clks[] __initconst = {
             "mout_peric0_bus_user",
             CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_0,
             21, 0, 0),
+       GATE(CLK_GOUT_PERIC0_PCLK_1, "gout_peric0_pclk_1",
+            "mout_peric0_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_1,
+            21, 0, 0),
        GATE(CLK_GOUT_PERIC0_PCLK_2, "gout_peric0_pclk_2",
             "mout_peric0_bus_user",
             CLK_CON_GAT_GOUT_BLK_PERIC0_UID_PERIC0_TOP0_IPCLKPORT_PCLK_2,
@@ -1418,14 +1789,14 @@ static const struct samsung_cmu_info peric0_cmu_info __initconst = {
 #define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_IPCLK_11 0x2020
 #define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_0   0x2044
 #define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_1   0x2048
-#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_2   0x2058
-#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_3   0x205c
-#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_4   0x2060
-#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_7   0x206c
-#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_5   0x2064
-#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_6   0x2068
-#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_8   0x2070
-#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_9   0x2074
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_2   0x2054
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_3   0x2058
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_4   0x205c
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_5   0x2060
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_6   0x2064
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_7   0x2068
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_8   0x206c
+#define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_9   0x2070
 #define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_10  0x204c
 #define CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_11  0x2050
 
@@ -1463,9 +1834,9 @@ static const unsigned long peric1_clk_regs[] __initconst = {
        CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_2,
        CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_3,
        CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_4,
-       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_7,
        CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_5,
        CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_6,
+       CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_7,
        CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_8,
        CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_9,
        CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_10,
@@ -1581,6 +1952,10 @@ static const struct samsung_gate_clock peric1_gate_clks[] __initconst = {
             "mout_peric1_bus_user",
             CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_0,
             21, 0, 0),
+       GATE(CLK_GOUT_PERIC1_PCLK_1, "gout_peric1_pclk_1",
+            "mout_peric1_bus_user",
+            CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_1,
+            21, 0, 0),
        GATE(CLK_GOUT_PERIC1_PCLK_2, "gout_peric1_pclk_2",
             "mout_peric1_bus_user",
             CLK_CON_GAT_GOUT_BLK_PERIC1_UID_PERIC1_TOP0_IPCLKPORT_PCLK_2,
@@ -1702,6 +2077,12 @@ static const struct of_device_id exynosautov9_cmu_of_match[] = {
                .compatible = "samsung,exynosautov9-cmu-core",
                .data = &core_cmu_info,
        }, {
+               .compatible = "samsung,exynosautov9-cmu-fsys0",
+               .data = &fsys0_cmu_info,
+       }, {
+               .compatible = "samsung,exynosautov9-cmu-fsys1",
+               .data = &fsys1_cmu_info,
+       }, {
                .compatible = "samsung,exynosautov9-cmu-fsys2",
                .data = &fsys2_cmu_info,
        }, {
index 0b6a3c6..88d5289 100644 (file)
 #define CLK_MOUT_CLKCMU_APM_BUS                46
 #define CLK_DOUT_CLKCMU_APM_BUS                47
 #define CLK_GOUT_CLKCMU_APM_BUS                48
-#define TOP_NR_CLK                     49
+#define CLK_MOUT_AUD                   49
+#define CLK_GOUT_AUD                   50
+#define CLK_DOUT_AUD                   51
+#define CLK_MOUT_IS_BUS                        52
+#define CLK_MOUT_IS_ITP                        53
+#define CLK_MOUT_IS_VRA                        54
+#define CLK_MOUT_IS_GDC                        55
+#define CLK_GOUT_IS_BUS                        56
+#define CLK_GOUT_IS_ITP                        57
+#define CLK_GOUT_IS_VRA                        58
+#define CLK_GOUT_IS_GDC                        59
+#define CLK_DOUT_IS_BUS                        60
+#define CLK_DOUT_IS_ITP                        61
+#define CLK_DOUT_IS_VRA                        62
+#define CLK_DOUT_IS_GDC                        63
+#define CLK_MOUT_MFCMSCL_MFC           64
+#define CLK_MOUT_MFCMSCL_M2M           65
+#define CLK_MOUT_MFCMSCL_MCSC          66
+#define CLK_MOUT_MFCMSCL_JPEG          67
+#define CLK_GOUT_MFCMSCL_MFC           68
+#define CLK_GOUT_MFCMSCL_M2M           69
+#define CLK_GOUT_MFCMSCL_MCSC          70
+#define CLK_GOUT_MFCMSCL_JPEG          71
+#define CLK_DOUT_MFCMSCL_MFC           72
+#define CLK_DOUT_MFCMSCL_M2M           73
+#define CLK_DOUT_MFCMSCL_MCSC          74
+#define CLK_DOUT_MFCMSCL_JPEG          75
+#define TOP_NR_CLK                     76
 
 /* CMU_APM */
 #define CLK_RCO_I3C_PMIC               1
 #define CLK_GOUT_SYSREG_APM_PCLK       24
 #define APM_NR_CLK                     25
 
+/* CMU_AUD */
+#define CLK_DOUT_AUD_AUDIF             1
+#define CLK_DOUT_AUD_BUSD              2
+#define CLK_DOUT_AUD_BUSP              3
+#define CLK_DOUT_AUD_CNT               4
+#define CLK_DOUT_AUD_CPU               5
+#define CLK_DOUT_AUD_CPU_ACLK          6
+#define CLK_DOUT_AUD_CPU_PCLKDBG       7
+#define CLK_DOUT_AUD_FM                        8
+#define CLK_DOUT_AUD_FM_SPDY           9
+#define CLK_DOUT_AUD_MCLK              10
+#define CLK_DOUT_AUD_UAIF0             11
+#define CLK_DOUT_AUD_UAIF1             12
+#define CLK_DOUT_AUD_UAIF2             13
+#define CLK_DOUT_AUD_UAIF3             14
+#define CLK_DOUT_AUD_UAIF4             15
+#define CLK_DOUT_AUD_UAIF5             16
+#define CLK_DOUT_AUD_UAIF6             17
+#define CLK_FOUT_AUD_PLL               18
+#define CLK_GOUT_AUD_ABOX_ACLK         19
+#define CLK_GOUT_AUD_ASB_CCLK          20
+#define CLK_GOUT_AUD_CA32_CCLK         21
+#define CLK_GOUT_AUD_CNT_BCLK          22
+#define CLK_GOUT_AUD_CODEC_MCLK                23
+#define CLK_GOUT_AUD_DAP_CCLK          24
+#define CLK_GOUT_AUD_GPIO_PCLK         25
+#define CLK_GOUT_AUD_PPMU_ACLK         26
+#define CLK_GOUT_AUD_PPMU_PCLK         27
+#define CLK_GOUT_AUD_SPDY_BCLK         28
+#define CLK_GOUT_AUD_SYSMMU_CLK                29
+#define CLK_GOUT_AUD_SYSREG_PCLK       30
+#define CLK_GOUT_AUD_TZPC_PCLK         31
+#define CLK_GOUT_AUD_UAIF0_BCLK                32
+#define CLK_GOUT_AUD_UAIF1_BCLK                33
+#define CLK_GOUT_AUD_UAIF2_BCLK                34
+#define CLK_GOUT_AUD_UAIF3_BCLK                35
+#define CLK_GOUT_AUD_UAIF4_BCLK                36
+#define CLK_GOUT_AUD_UAIF5_BCLK                37
+#define CLK_GOUT_AUD_UAIF6_BCLK                38
+#define CLK_GOUT_AUD_WDT_PCLK          39
+#define CLK_MOUT_AUD_CPU               40
+#define CLK_MOUT_AUD_CPU_HCH           41
+#define CLK_MOUT_AUD_CPU_USER          42
+#define CLK_MOUT_AUD_FM                        43
+#define CLK_MOUT_AUD_PLL               44
+#define CLK_MOUT_AUD_TICK_USB_USER     45
+#define CLK_MOUT_AUD_UAIF0             46
+#define CLK_MOUT_AUD_UAIF1             47
+#define CLK_MOUT_AUD_UAIF2             48
+#define CLK_MOUT_AUD_UAIF3             49
+#define CLK_MOUT_AUD_UAIF4             50
+#define CLK_MOUT_AUD_UAIF5             51
+#define CLK_MOUT_AUD_UAIF6             52
+#define IOCLK_AUDIOCDCLK0              53
+#define IOCLK_AUDIOCDCLK1              54
+#define IOCLK_AUDIOCDCLK2              55
+#define IOCLK_AUDIOCDCLK3              56
+#define IOCLK_AUDIOCDCLK4              57
+#define IOCLK_AUDIOCDCLK5              58
+#define IOCLK_AUDIOCDCLK6              59
+#define TICK_USB                       60
+#define AUD_NR_CLK                     61
+
 /* CMU_CMGP */
 #define CLK_RCO_CMGP                   1
 #define CLK_MOUT_CMGP_ADC              2
 #define CLK_GOUT_SYSREG_HSI_PCLK       13
 #define HSI_NR_CLK                     14
 
+/* CMU_IS */
+#define CLK_MOUT_IS_BUS_USER           1
+#define CLK_MOUT_IS_ITP_USER           2
+#define CLK_MOUT_IS_VRA_USER           3
+#define CLK_MOUT_IS_GDC_USER           4
+#define CLK_DOUT_IS_BUSP               5
+#define CLK_GOUT_IS_CMU_IS_PCLK                6
+#define CLK_GOUT_IS_CSIS0_ACLK         7
+#define CLK_GOUT_IS_CSIS1_ACLK         8
+#define CLK_GOUT_IS_CSIS2_ACLK         9
+#define CLK_GOUT_IS_TZPC_PCLK          10
+#define CLK_GOUT_IS_CSIS_DMA_CLK       11
+#define CLK_GOUT_IS_GDC_CLK            12
+#define CLK_GOUT_IS_IPP_CLK            13
+#define CLK_GOUT_IS_ITP_CLK            14
+#define CLK_GOUT_IS_MCSC_CLK           15
+#define CLK_GOUT_IS_VRA_CLK            16
+#define CLK_GOUT_IS_PPMU_IS0_ACLK      17
+#define CLK_GOUT_IS_PPMU_IS0_PCLK      18
+#define CLK_GOUT_IS_PPMU_IS1_ACLK      19
+#define CLK_GOUT_IS_PPMU_IS1_PCLK      20
+#define CLK_GOUT_IS_SYSMMU_IS0_CLK     21
+#define CLK_GOUT_IS_SYSMMU_IS1_CLK     22
+#define CLK_GOUT_IS_SYSREG_PCLK                23
+#define IS_NR_CLK                      24
+
+/* CMU_MFCMSCL */
+#define CLK_MOUT_MFCMSCL_MFC_USER              1
+#define CLK_MOUT_MFCMSCL_M2M_USER              2
+#define CLK_MOUT_MFCMSCL_MCSC_USER             3
+#define CLK_MOUT_MFCMSCL_JPEG_USER             4
+#define CLK_DOUT_MFCMSCL_BUSP                  5
+#define CLK_GOUT_MFCMSCL_CMU_MFCMSCL_PCLK      6
+#define CLK_GOUT_MFCMSCL_TZPC_PCLK             7
+#define CLK_GOUT_MFCMSCL_JPEG_ACLK             8
+#define CLK_GOUT_MFCMSCL_M2M_ACLK              9
+#define CLK_GOUT_MFCMSCL_MCSC_CLK              10
+#define CLK_GOUT_MFCMSCL_MFC_ACLK              11
+#define CLK_GOUT_MFCMSCL_PPMU_ACLK             12
+#define CLK_GOUT_MFCMSCL_PPMU_PCLK             13
+#define CLK_GOUT_MFCMSCL_SYSMMU_CLK            14
+#define CLK_GOUT_MFCMSCL_SYSREG_PCLK           15
+#define MFCMSCL_NR_CLK                         16
+
 /* CMU_PERI */
 #define CLK_MOUT_PERI_BUS_USER         1
 #define CLK_MOUT_PERI_UART_USER                2
diff --git a/include/dt-bindings/clock/mediatek,mt6795-clk.h b/include/dt-bindings/clock/mediatek,mt6795-clk.h
new file mode 100644 (file)
index 0000000..9902906
--- /dev/null
@@ -0,0 +1,275 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-2-Clause) */
+/*
+ * Copyright (c) 2022 Collabora Ltd.
+ * Author: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+ */
+
+#ifndef _DT_BINDINGS_CLK_MT6795_H
+#define _DT_BINDINGS_CLK_MT6795_H
+
+/* TOPCKGEN */
+#define CLK_TOP_ADSYS_26M              0
+#define CLK_TOP_CLKPH_MCK_O            1
+#define CLK_TOP_USB_SYSPLL_125M                2
+#define CLK_TOP_DSI0_DIG               3
+#define CLK_TOP_DSI1_DIG               4
+#define CLK_TOP_ARMCA53PLL_754M                5
+#define CLK_TOP_ARMCA53PLL_502M                6
+#define CLK_TOP_MAIN_H546M             7
+#define CLK_TOP_MAIN_H364M             8
+#define CLK_TOP_MAIN_H218P4M           9
+#define CLK_TOP_MAIN_H156M             10
+#define CLK_TOP_TVDPLL_445P5M          11
+#define CLK_TOP_TVDPLL_594M            12
+#define CLK_TOP_UNIV_624M              13
+#define CLK_TOP_UNIV_416M              14
+#define CLK_TOP_UNIV_249P6M            15
+#define CLK_TOP_UNIV_178P3M            16
+#define CLK_TOP_UNIV_48M               17
+#define CLK_TOP_CLKRTC_EXT             18
+#define CLK_TOP_CLKRTC_INT             19
+#define CLK_TOP_FPC                    20
+#define CLK_TOP_HDMITXPLL_D2           21
+#define CLK_TOP_HDMITXPLL_D3           22
+#define CLK_TOP_ARMCA53PLL_D2          23
+#define CLK_TOP_ARMCA53PLL_D3          24
+#define CLK_TOP_APLL1                  25
+#define CLK_TOP_APLL2                  26
+#define CLK_TOP_DMPLL                  27
+#define CLK_TOP_DMPLL_D2               28
+#define CLK_TOP_DMPLL_D4               29
+#define CLK_TOP_DMPLL_D8               30
+#define CLK_TOP_DMPLL_D16              31
+#define CLK_TOP_MMPLL                  32
+#define CLK_TOP_MMPLL_D2               33
+#define CLK_TOP_MSDCPLL                        34
+#define CLK_TOP_MSDCPLL_D2             35
+#define CLK_TOP_MSDCPLL_D4             36
+#define CLK_TOP_MSDCPLL2               37
+#define CLK_TOP_MSDCPLL2_D2            38
+#define CLK_TOP_MSDCPLL2_D4            39
+#define CLK_TOP_SYSPLL_D2              40
+#define CLK_TOP_SYSPLL1_D2             41
+#define CLK_TOP_SYSPLL1_D4             42
+#define CLK_TOP_SYSPLL1_D8             43
+#define CLK_TOP_SYSPLL1_D16            44
+#define CLK_TOP_SYSPLL_D3              45
+#define CLK_TOP_SYSPLL2_D2             46
+#define CLK_TOP_SYSPLL2_D4             47
+#define CLK_TOP_SYSPLL_D5              48
+#define CLK_TOP_SYSPLL3_D2             49
+#define CLK_TOP_SYSPLL3_D4             50
+#define CLK_TOP_SYSPLL_D7              51
+#define CLK_TOP_SYSPLL4_D2             52
+#define CLK_TOP_SYSPLL4_D4             53
+#define CLK_TOP_TVDPLL                 54
+#define CLK_TOP_TVDPLL_D2              55
+#define CLK_TOP_TVDPLL_D4              56
+#define CLK_TOP_TVDPLL_D8              57
+#define CLK_TOP_TVDPLL_D16             58
+#define CLK_TOP_UNIVPLL_D2             59
+#define CLK_TOP_UNIVPLL1_D2            60
+#define CLK_TOP_UNIVPLL1_D4            61
+#define CLK_TOP_UNIVPLL1_D8            62
+#define CLK_TOP_UNIVPLL_D3             63
+#define CLK_TOP_UNIVPLL2_D2            64
+#define CLK_TOP_UNIVPLL2_D4            65
+#define CLK_TOP_UNIVPLL2_D8            66
+#define CLK_TOP_UNIVPLL_D5             67
+#define CLK_TOP_UNIVPLL3_D2            68
+#define CLK_TOP_UNIVPLL3_D4            69
+#define CLK_TOP_UNIVPLL3_D8            70
+#define CLK_TOP_UNIVPLL_D7             71
+#define CLK_TOP_UNIVPLL_D26            72
+#define CLK_TOP_UNIVPLL_D52            73
+#define CLK_TOP_VCODECPLL              74
+#define CLK_TOP_VCODECPLL_370P5                75
+#define CLK_TOP_VENCPLL                        76
+#define CLK_TOP_VENCPLL_D2             77
+#define CLK_TOP_VENCPLL_D4             78
+#define CLK_TOP_AXI_SEL                        79
+#define CLK_TOP_MEM_SEL                        80
+#define CLK_TOP_DDRPHYCFG_SEL          81
+#define CLK_TOP_MM_SEL                 82
+#define CLK_TOP_PWM_SEL                        83
+#define CLK_TOP_VDEC_SEL               84
+#define CLK_TOP_VENC_SEL               85
+#define CLK_TOP_MFG_SEL                        86
+#define CLK_TOP_CAMTG_SEL              87
+#define CLK_TOP_UART_SEL               88
+#define CLK_TOP_SPI_SEL                        89
+#define CLK_TOP_USB20_SEL              90
+#define CLK_TOP_USB30_SEL              91
+#define CLK_TOP_MSDC50_0_H_SEL         92
+#define CLK_TOP_MSDC50_0_SEL           93
+#define CLK_TOP_MSDC30_1_SEL           94
+#define CLK_TOP_MSDC30_2_SEL           95
+#define CLK_TOP_MSDC30_3_SEL           96
+#define CLK_TOP_AUDIO_SEL              97
+#define CLK_TOP_AUD_INTBUS_SEL         98
+#define CLK_TOP_PMICSPI_SEL            99
+#define CLK_TOP_SCP_SEL                        100
+#define CLK_TOP_MJC_SEL                        101
+#define CLK_TOP_DPI0_SEL               102
+#define CLK_TOP_IRDA_SEL               103
+#define CLK_TOP_CCI400_SEL             104
+#define CLK_TOP_AUD_1_SEL              105
+#define CLK_TOP_AUD_2_SEL              106
+#define CLK_TOP_MEM_MFG_IN_SEL         107
+#define CLK_TOP_AXI_MFG_IN_SEL         108
+#define CLK_TOP_SCAM_SEL               109
+#define CLK_TOP_I2S0_M_SEL             110
+#define CLK_TOP_I2S1_M_SEL             111
+#define CLK_TOP_I2S2_M_SEL             112
+#define CLK_TOP_I2S3_M_SEL             113
+#define CLK_TOP_I2S3_B_SEL             114
+#define CLK_TOP_APLL1_DIV0             115
+#define CLK_TOP_APLL1_DIV1             116
+#define CLK_TOP_APLL1_DIV2             117
+#define CLK_TOP_APLL1_DIV3             118
+#define CLK_TOP_APLL1_DIV4             119
+#define CLK_TOP_APLL1_DIV5             120
+#define CLK_TOP_APLL2_DIV0             121
+#define CLK_TOP_APLL2_DIV1             122
+#define CLK_TOP_APLL2_DIV2             123
+#define CLK_TOP_APLL2_DIV3             124
+#define CLK_TOP_APLL2_DIV4             125
+#define CLK_TOP_APLL2_DIV5             126
+#define CLK_TOP_NR_CLK                 127
+
+/* APMIXED_SYS */
+#define CLK_APMIXED_ARMCA53PLL         0
+#define CLK_APMIXED_MAINPLL            1
+#define CLK_APMIXED_UNIVPLL            2
+#define CLK_APMIXED_MMPLL              3
+#define CLK_APMIXED_MSDCPLL            4
+#define CLK_APMIXED_VENCPLL            5
+#define CLK_APMIXED_TVDPLL             6
+#define CLK_APMIXED_MPLL               7
+#define CLK_APMIXED_VCODECPLL          8
+#define CLK_APMIXED_APLL1              9
+#define CLK_APMIXED_APLL2              10
+#define CLK_APMIXED_REF2USB_TX         11
+#define CLK_APMIXED_NR_CLK             12
+
+/* INFRA_SYS */
+#define CLK_INFRA_DBGCLK               0
+#define CLK_INFRA_SMI                  1
+#define CLK_INFRA_AUDIO                        2
+#define CLK_INFRA_GCE                  3
+#define CLK_INFRA_L2C_SRAM             4
+#define CLK_INFRA_M4U                  5
+#define CLK_INFRA_MD1MCU               6
+#define CLK_INFRA_MD1BUS               7
+#define CLK_INFRA_MD1DBB               8
+#define CLK_INFRA_DEVICE_APC           9
+#define CLK_INFRA_TRNG                 10
+#define CLK_INFRA_MD1LTE               11
+#define CLK_INFRA_CPUM                 12
+#define CLK_INFRA_KP                   13
+#define CLK_INFRA_CA53_C0_SEL          14
+#define CLK_INFRA_CA53_C1_SEL          15
+#define CLK_INFRA_NR_CLK               16
+
+/* PERI_SYS */
+#define CLK_PERI_NFI                   0
+#define CLK_PERI_THERM                 1
+#define CLK_PERI_PWM1                  2
+#define CLK_PERI_PWM2                  3
+#define CLK_PERI_PWM3                  4
+#define CLK_PERI_PWM4                  5
+#define CLK_PERI_PWM5                  6
+#define CLK_PERI_PWM6                  7
+#define CLK_PERI_PWM7                  8
+#define CLK_PERI_PWM                   9
+#define CLK_PERI_USB0                  10
+#define CLK_PERI_USB1                  11
+#define CLK_PERI_AP_DMA                        12
+#define CLK_PERI_MSDC30_0              13
+#define CLK_PERI_MSDC30_1              14
+#define CLK_PERI_MSDC30_2              15
+#define CLK_PERI_MSDC30_3              16
+#define CLK_PERI_NLI_ARB               17
+#define CLK_PERI_IRDA                  18
+#define CLK_PERI_UART0                 19
+#define CLK_PERI_UART1                 20
+#define CLK_PERI_UART2                 21
+#define CLK_PERI_UART3                 22
+#define CLK_PERI_I2C0                  23
+#define CLK_PERI_I2C1                  24
+#define CLK_PERI_I2C2                  25
+#define CLK_PERI_I2C3                  26
+#define CLK_PERI_I2C4                  27
+#define CLK_PERI_AUXADC                        28
+#define CLK_PERI_SPI0                  29
+#define CLK_PERI_UART0_SEL             30
+#define CLK_PERI_UART1_SEL             31
+#define CLK_PERI_UART2_SEL             32
+#define CLK_PERI_UART3_SEL             33
+#define CLK_PERI_NR_CLK                        34
+
+/* MFG */
+#define CLK_MFG_BAXI                   0
+#define CLK_MFG_BMEM                   1
+#define CLK_MFG_BG3D                   2
+#define CLK_MFG_B26M                   3
+#define CLK_MFG_NR_CLK                 4
+
+/* MM_SYS */
+#define CLK_MM_SMI_COMMON              0
+#define CLK_MM_SMI_LARB0               1
+#define CLK_MM_CAM_MDP                 2
+#define CLK_MM_MDP_RDMA0               3
+#define CLK_MM_MDP_RDMA1               4
+#define CLK_MM_MDP_RSZ0                        5
+#define CLK_MM_MDP_RSZ1                        6
+#define CLK_MM_MDP_RSZ2                        7
+#define CLK_MM_MDP_TDSHP0              8
+#define CLK_MM_MDP_TDSHP1              9
+#define CLK_MM_MDP_CROP                        10
+#define CLK_MM_MDP_WDMA                        11
+#define CLK_MM_MDP_WROT0               12
+#define CLK_MM_MDP_WROT1               13
+#define CLK_MM_FAKE_ENG                        14
+#define CLK_MM_MUTEX_32K               15
+#define CLK_MM_DISP_OVL0               16
+#define CLK_MM_DISP_OVL1               17
+#define CLK_MM_DISP_RDMA0              18
+#define CLK_MM_DISP_RDMA1              19
+#define CLK_MM_DISP_RDMA2              20
+#define CLK_MM_DISP_WDMA0              21
+#define CLK_MM_DISP_WDMA1              22
+#define CLK_MM_DISP_COLOR0             23
+#define CLK_MM_DISP_COLOR1             24
+#define CLK_MM_DISP_AAL                        25
+#define CLK_MM_DISP_GAMMA              26
+#define CLK_MM_DISP_UFOE               27
+#define CLK_MM_DISP_SPLIT0             28
+#define CLK_MM_DISP_SPLIT1             29
+#define CLK_MM_DISP_MERGE              30
+#define CLK_MM_DISP_OD                 31
+#define CLK_MM_DISP_PWM0MM             32
+#define CLK_MM_DISP_PWM026M            33
+#define CLK_MM_DISP_PWM1MM             34
+#define CLK_MM_DISP_PWM126M            35
+#define CLK_MM_DSI0_ENGINE             36
+#define CLK_MM_DSI0_DIGITAL            37
+#define CLK_MM_DSI1_ENGINE             38
+#define CLK_MM_DSI1_DIGITAL            39
+#define CLK_MM_DPI_PIXEL               40
+#define CLK_MM_DPI_ENGINE              41
+#define CLK_MM_NR_CLK                  42
+
+/* VDEC_SYS */
+#define CLK_VDEC_CKEN                  0
+#define CLK_VDEC_LARB_CKEN             1
+#define CLK_VDEC_NR_CLK                        2
+
+/* VENC_SYS */
+#define CLK_VENC_LARB                  0
+#define CLK_VENC_VENC                  1
+#define CLK_VENC_JPGENC                        2
+#define CLK_VENC_JPGDEC                        3
+#define CLK_VENC_NR_CLK                        4
+
+#endif /* _DT_BINDINGS_CLK_MT6795_H */
diff --git a/include/dt-bindings/clock/mediatek,mt8365-clk.h b/include/dt-bindings/clock/mediatek,mt8365-clk.h
new file mode 100644 (file)
index 0000000..f9aff17
--- /dev/null
@@ -0,0 +1,373 @@
+/* SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+ *
+ * Copyright (c) 2022 MediaTek Inc.
+ */
+
+#ifndef _DT_BINDINGS_CLK_MT8365_H
+#define _DT_BINDINGS_CLK_MT8365_H
+
+/* TOPCKGEN */
+#define CLK_TOP_CLK_NULL               0
+#define CLK_TOP_I2S0_BCK               1
+#define CLK_TOP_DSI0_LNTC_DSICK                2
+#define CLK_TOP_VPLL_DPIX              3
+#define CLK_TOP_LVDSTX_CLKDIG_CTS      4
+#define CLK_TOP_MFGPLL                 5
+#define CLK_TOP_SYSPLL_D2              6
+#define CLK_TOP_SYSPLL1_D2             7
+#define CLK_TOP_SYSPLL1_D4             8
+#define CLK_TOP_SYSPLL1_D8             9
+#define CLK_TOP_SYSPLL1_D16            10
+#define CLK_TOP_SYSPLL_D3              11
+#define CLK_TOP_SYSPLL2_D2             12
+#define CLK_TOP_SYSPLL2_D4             13
+#define CLK_TOP_SYSPLL2_D8             14
+#define CLK_TOP_SYSPLL_D5              15
+#define CLK_TOP_SYSPLL3_D2             16
+#define CLK_TOP_SYSPLL3_D4             17
+#define CLK_TOP_SYSPLL_D7              18
+#define CLK_TOP_SYSPLL4_D2             19
+#define CLK_TOP_SYSPLL4_D4             20
+#define CLK_TOP_UNIVPLL                        21
+#define CLK_TOP_UNIVPLL_D2             22
+#define CLK_TOP_UNIVPLL1_D2            23
+#define CLK_TOP_UNIVPLL1_D4            24
+#define CLK_TOP_UNIVPLL_D3             25
+#define CLK_TOP_UNIVPLL2_D2            26
+#define CLK_TOP_UNIVPLL2_D4            27
+#define CLK_TOP_UNIVPLL2_D8            28
+#define CLK_TOP_UNIVPLL2_D32           29
+#define CLK_TOP_UNIVPLL_D5             30
+#define CLK_TOP_UNIVPLL3_D2            31
+#define CLK_TOP_UNIVPLL3_D4            32
+#define CLK_TOP_MMPLL                  33
+#define CLK_TOP_MMPLL_D2               34
+#define CLK_TOP_LVDSPLL_D2             35
+#define CLK_TOP_LVDSPLL_D4             36
+#define CLK_TOP_LVDSPLL_D8             37
+#define CLK_TOP_LVDSPLL_D16            38
+#define CLK_TOP_USB20_192M             39
+#define CLK_TOP_USB20_192M_D4          40
+#define CLK_TOP_USB20_192M_D8          41
+#define CLK_TOP_USB20_192M_D16         42
+#define CLK_TOP_USB20_192M_D32         43
+#define CLK_TOP_APLL1                  44
+#define CLK_TOP_APLL1_D2               45
+#define CLK_TOP_APLL1_D4               46
+#define CLK_TOP_APLL1_D8               47
+#define CLK_TOP_APLL2                  48
+#define CLK_TOP_APLL2_D2               49
+#define CLK_TOP_APLL2_D4               50
+#define CLK_TOP_APLL2_D8               51
+#define CLK_TOP_SYS_26M_D2             52
+#define CLK_TOP_MSDCPLL                        53
+#define CLK_TOP_MSDCPLL_D2             54
+#define CLK_TOP_DSPPLL                 55
+#define CLK_TOP_DSPPLL_D2              56
+#define CLK_TOP_DSPPLL_D4              57
+#define CLK_TOP_DSPPLL_D8              58
+#define CLK_TOP_APUPLL                 59
+#define CLK_TOP_CLK26M_D52             60
+#define CLK_TOP_AXI_SEL                        61
+#define CLK_TOP_MEM_SEL                        62
+#define CLK_TOP_MM_SEL                 63
+#define CLK_TOP_SCP_SEL                        64
+#define CLK_TOP_MFG_SEL                        65
+#define CLK_TOP_ATB_SEL                        66
+#define CLK_TOP_CAMTG_SEL              67
+#define CLK_TOP_CAMTG1_SEL             68
+#define CLK_TOP_UART_SEL               69
+#define CLK_TOP_SPI_SEL                        70
+#define CLK_TOP_MSDC50_0_HC_SEL                71
+#define CLK_TOP_MSDC2_2_HC_SEL         72
+#define CLK_TOP_MSDC50_0_SEL           73
+#define CLK_TOP_MSDC50_2_SEL           74
+#define CLK_TOP_MSDC30_1_SEL           75
+#define CLK_TOP_AUDIO_SEL              76
+#define CLK_TOP_AUD_INTBUS_SEL         77
+#define CLK_TOP_AUD_1_SEL              78
+#define CLK_TOP_AUD_2_SEL              79
+#define CLK_TOP_AUD_ENGEN1_SEL         80
+#define CLK_TOP_AUD_ENGEN2_SEL         81
+#define CLK_TOP_AUD_SPDIF_SEL          82
+#define CLK_TOP_DISP_PWM_SEL           83
+#define CLK_TOP_DXCC_SEL               84
+#define CLK_TOP_SSUSB_SYS_SEL          85
+#define CLK_TOP_SSUSB_XHCI_SEL         86
+#define CLK_TOP_SPM_SEL                        87
+#define CLK_TOP_I2C_SEL                        88
+#define CLK_TOP_PWM_SEL                        89
+#define CLK_TOP_SENIF_SEL              90
+#define CLK_TOP_AES_FDE_SEL            91
+#define CLK_TOP_CAMTM_SEL              92
+#define CLK_TOP_DPI0_SEL               93
+#define CLK_TOP_DPI1_SEL               94
+#define CLK_TOP_DSP_SEL                        95
+#define CLK_TOP_NFI2X_SEL              96
+#define CLK_TOP_NFIECC_SEL             97
+#define CLK_TOP_ECC_SEL                        98
+#define CLK_TOP_ETH_SEL                        99
+#define CLK_TOP_GCPU_SEL               100
+#define CLK_TOP_GCPU_CPM_SEL           101
+#define CLK_TOP_APU_SEL                        102
+#define CLK_TOP_APU_IF_SEL             103
+#define CLK_TOP_MBIST_DIAG_SEL         104
+#define CLK_TOP_APLL_I2S0_SEL          105
+#define CLK_TOP_APLL_I2S1_SEL          106
+#define CLK_TOP_APLL_I2S2_SEL          107
+#define CLK_TOP_APLL_I2S3_SEL          108
+#define CLK_TOP_APLL_TDMOUT_SEL                109
+#define CLK_TOP_APLL_TDMIN_SEL         110
+#define CLK_TOP_APLL_SPDIF_SEL         111
+#define CLK_TOP_APLL12_CK_DIV0         112
+#define CLK_TOP_APLL12_CK_DIV1         113
+#define CLK_TOP_APLL12_CK_DIV2         114
+#define CLK_TOP_APLL12_CK_DIV3         115
+#define CLK_TOP_APLL12_CK_DIV4         116
+#define CLK_TOP_APLL12_CK_DIV4B                117
+#define CLK_TOP_APLL12_CK_DIV5         118
+#define CLK_TOP_APLL12_CK_DIV5B                119
+#define CLK_TOP_APLL12_CK_DIV6         120
+#define CLK_TOP_AUD_I2S0_M             121
+#define CLK_TOP_AUD_I2S1_M             122
+#define CLK_TOP_AUD_I2S2_M             123
+#define CLK_TOP_AUD_I2S3_M             124
+#define CLK_TOP_AUD_TDMOUT_M           125
+#define CLK_TOP_AUD_TDMOUT_B           126
+#define CLK_TOP_AUD_TDMIN_M            127
+#define CLK_TOP_AUD_TDMIN_B            128
+#define CLK_TOP_AUD_SPDIF_M            129
+#define CLK_TOP_USB20_48M_EN           130
+#define CLK_TOP_UNIVPLL_48M_EN         131
+#define CLK_TOP_LVDSTX_CLKDIG_EN       132
+#define CLK_TOP_VPLL_DPIX_EN           133
+#define CLK_TOP_SSUSB_TOP_CK_EN                134
+#define CLK_TOP_SSUSB_PHY_CK_EN                135
+#define CLK_TOP_CONN_32K               136
+#define CLK_TOP_CONN_26M               137
+#define CLK_TOP_DSP_32K                        138
+#define CLK_TOP_DSP_26M                        139
+#define CLK_TOP_NR_CLK                 140
+
+/* INFRACFG */
+#define CLK_IFR_PMIC_TMR               0
+#define CLK_IFR_PMIC_AP                        1
+#define CLK_IFR_PMIC_MD                        2
+#define CLK_IFR_PMIC_CONN              3
+#define CLK_IFR_ICUSB                  4
+#define CLK_IFR_GCE                    5
+#define CLK_IFR_THERM                  6
+#define CLK_IFR_PWM_HCLK               7
+#define CLK_IFR_PWM1                   8
+#define CLK_IFR_PWM2                   9
+#define CLK_IFR_PWM3                   10
+#define CLK_IFR_PWM4                   11
+#define CLK_IFR_PWM5                   12
+#define CLK_IFR_PWM                    13
+#define CLK_IFR_UART0                  14
+#define CLK_IFR_UART1                  15
+#define CLK_IFR_UART2                  16
+#define CLK_IFR_DSP_UART               17
+#define CLK_IFR_GCE_26M                        18
+#define CLK_IFR_CQ_DMA_FPC             19
+#define CLK_IFR_BTIF                   20
+#define CLK_IFR_SPI0                   21
+#define CLK_IFR_MSDC0_HCLK             22
+#define CLK_IFR_MSDC2_HCLK             23
+#define CLK_IFR_MSDC1_HCLK             24
+#define CLK_IFR_DVFSRC                 25
+#define CLK_IFR_GCPU                   26
+#define CLK_IFR_TRNG                   27
+#define CLK_IFR_AUXADC                 28
+#define CLK_IFR_CPUM                   29
+#define CLK_IFR_AUXADC_MD              30
+#define CLK_IFR_AP_DMA                 31
+#define CLK_IFR_DEBUGSYS               32
+#define CLK_IFR_AUDIO                  33
+#define CLK_IFR_PWM_FBCLK6             34
+#define CLK_IFR_DISP_PWM               35
+#define CLK_IFR_AUD_26M_BK             36
+#define CLK_IFR_CQ_DMA                 37
+#define CLK_IFR_MSDC0_SF               38
+#define CLK_IFR_MSDC1_SF               39
+#define CLK_IFR_MSDC2_SF               40
+#define CLK_IFR_AP_MSDC0               41
+#define CLK_IFR_MD_MSDC0               42
+#define CLK_IFR_MSDC0_SRC              43
+#define CLK_IFR_MSDC1_SRC              44
+#define CLK_IFR_MSDC2_SRC              45
+#define CLK_IFR_PWRAP_TMR              46
+#define CLK_IFR_PWRAP_SPI              47
+#define CLK_IFR_PWRAP_SYS              48
+#define CLK_IFR_MCU_PM_BK              49
+#define CLK_IFR_IRRX_26M               50
+#define CLK_IFR_IRRX_32K               51
+#define CLK_IFR_I2C0_AXI               52
+#define CLK_IFR_I2C1_AXI               53
+#define CLK_IFR_I2C2_AXI               54
+#define CLK_IFR_I2C3_AXI               55
+#define CLK_IFR_NIC_AXI                        56
+#define CLK_IFR_NIC_SLV_AXI            57
+#define CLK_IFR_APU_AXI                        58
+#define CLK_IFR_NFIECC                 59
+#define CLK_IFR_NFIECC_BK              60
+#define CLK_IFR_NFI1X_BK               61
+#define CLK_IFR_NFI_BK                 62
+#define CLK_IFR_MSDC2_AP_BK            63
+#define CLK_IFR_MSDC2_MD_BK            64
+#define CLK_IFR_MSDC2_BK               65
+#define CLK_IFR_SUSB_133_BK            66
+#define CLK_IFR_SUSB_66_BK             67
+#define CLK_IFR_SSUSB_SYS              68
+#define CLK_IFR_SSUSB_REF              69
+#define CLK_IFR_SSUSB_XHCI             70
+#define CLK_IFR_NR_CLK                 71
+
+/* PERICFG */
+#define CLK_PERIAXI                    0
+#define CLK_PERI_NR_CLK                        1
+
+/* APMIXEDSYS */
+#define CLK_APMIXED_ARMPLL             0
+#define CLK_APMIXED_MAINPLL            1
+#define CLK_APMIXED_UNIVPLL            2
+#define CLK_APMIXED_MFGPLL             3
+#define CLK_APMIXED_MSDCPLL            4
+#define CLK_APMIXED_MMPLL              5
+#define CLK_APMIXED_APLL1              6
+#define CLK_APMIXED_APLL2              7
+#define CLK_APMIXED_LVDSPLL            8
+#define CLK_APMIXED_DSPPLL             9
+#define CLK_APMIXED_APUPLL             10
+#define CLK_APMIXED_UNIV_EN            11
+#define CLK_APMIXED_USB20_EN           12
+#define CLK_APMIXED_NR_CLK             13
+
+/* GCE */
+#define CLK_GCE_FAXI                   0
+#define CLK_GCE_NR_CLK                 1
+
+/* AUDIOTOP */
+#define CLK_AUD_AFE                    0
+#define CLK_AUD_I2S                    1
+#define CLK_AUD_22M                    2
+#define CLK_AUD_24M                    3
+#define CLK_AUD_INTDIR                 4
+#define CLK_AUD_APLL2_TUNER            5
+#define CLK_AUD_APLL_TUNER             6
+#define CLK_AUD_SPDF                   7
+#define CLK_AUD_HDMI                   8
+#define CLK_AUD_HDMI_IN                        9
+#define CLK_AUD_ADC                    10
+#define CLK_AUD_DAC                    11
+#define CLK_AUD_DAC_PREDIS             12
+#define CLK_AUD_TML                    13
+#define CLK_AUD_I2S1_BK                        14
+#define CLK_AUD_I2S2_BK                        15
+#define CLK_AUD_I2S3_BK                        16
+#define CLK_AUD_I2S4_BK                        17
+#define CLK_AUD_NR_CLK                 18
+
+/* MIPI_CSI0A */
+#define CLK_MIPI0A_CSR_CSI_EN_0A       0
+#define CLK_MIPI_RX_ANA_CSI0A_NR_CLK   1
+
+/* MIPI_CSI0B */
+#define CLK_MIPI0B_CSR_CSI_EN_0B       0
+#define CLK_MIPI_RX_ANA_CSI0B_NR_CLK   1
+
+/* MIPI_CSI1A */
+#define CLK_MIPI1A_CSR_CSI_EN_1A       0
+#define CLK_MIPI_RX_ANA_CSI1A_NR_CLK   1
+
+/* MIPI_CSI1B */
+#define CLK_MIPI1B_CSR_CSI_EN_1B       0
+#define CLK_MIPI_RX_ANA_CSI1B_NR_CLK   1
+
+/* MIPI_CSI2A */
+#define CLK_MIPI2A_CSR_CSI_EN_2A       0
+#define CLK_MIPI_RX_ANA_CSI2A_NR_CLK   1
+
+/* MIPI_CSI2B */
+#define CLK_MIPI2B_CSR_CSI_EN_2B       0
+#define CLK_MIPI_RX_ANA_CSI2B_NR_CLK   1
+
+/* MCUCFG */
+#define CLK_MCU_BUS_SEL                        0
+#define CLK_MCU_NR_CLK                 1
+
+/* MFGCFG */
+#define CLK_MFG_BG3D                   0
+#define CLK_MFG_MBIST_DIAG             1
+#define CLK_MFG_NR_CLK                 2
+
+/* MMSYS */
+#define CLK_MM_MM_MDP_RDMA0            0
+#define CLK_MM_MM_MDP_CCORR0           1
+#define CLK_MM_MM_MDP_RSZ0             2
+#define CLK_MM_MM_MDP_RSZ1             3
+#define CLK_MM_MM_MDP_TDSHP0           4
+#define CLK_MM_MM_MDP_WROT0            5
+#define CLK_MM_MM_MDP_WDMA0            6
+#define CLK_MM_MM_DISP_OVL0            7
+#define CLK_MM_MM_DISP_OVL0_2L         8
+#define CLK_MM_MM_DISP_RSZ0            9
+#define CLK_MM_MM_DISP_RDMA0           10
+#define CLK_MM_MM_DISP_WDMA0           11
+#define CLK_MM_MM_DISP_COLOR0          12
+#define CLK_MM_MM_DISP_CCORR0          13
+#define CLK_MM_MM_DISP_AAL0            14
+#define CLK_MM_MM_DISP_GAMMA0          15
+#define CLK_MM_MM_DISP_DITHER0         16
+#define CLK_MM_MM_DSI0                 17
+#define CLK_MM_MM_DISP_RDMA1           18
+#define CLK_MM_MM_MDP_RDMA1            19
+#define CLK_MM_DPI0_DPI0               20
+#define CLK_MM_MM_FAKE                 21
+#define CLK_MM_MM_SMI_COMMON           22
+#define CLK_MM_MM_SMI_LARB0            23
+#define CLK_MM_MM_SMI_COMM0            24
+#define CLK_MM_MM_SMI_COMM1            25
+#define CLK_MM_MM_CAM_MDP              26
+#define CLK_MM_MM_SMI_IMG              27
+#define CLK_MM_MM_SMI_CAM              28
+#define CLK_MM_IMG_IMG_DL_RELAY                29
+#define CLK_MM_IMG_IMG_DL_ASYNC_TOP    30
+#define CLK_MM_DSI0_DIG_DSI            31
+#define CLK_MM_26M_HRTWT               32
+#define CLK_MM_MM_DPI0                 33
+#define CLK_MM_LVDSTX_PXL              34
+#define CLK_MM_LVDSTX_CTS              35
+#define CLK_MM_NR_CLK                  36
+
+/* IMGSYS */
+#define CLK_CAM_LARB2                  0
+#define CLK_CAM                                1
+#define CLK_CAMTG                      2
+#define CLK_CAM_SENIF                  3
+#define CLK_CAMSV0                     4
+#define CLK_CAMSV1                     5
+#define CLK_CAM_FDVT                   6
+#define CLK_CAM_WPE                    7
+#define CLK_CAM_NR_CLK                 8
+
+/* VDECSYS */
+#define CLK_VDEC_VDEC                  0
+#define CLK_VDEC_LARB1                 1
+#define CLK_VDEC_NR_CLK                        2
+
+/* VENCSYS */
+#define CLK_VENC                       0
+#define CLK_VENC_JPGENC                        1
+#define CLK_VENC_NR_CLK                        2
+
+/* APUSYS */
+#define CLK_APU_IPU_CK                 0
+#define CLK_APU_AXI                    1
+#define CLK_APU_JTAG                   2
+#define CLK_APU_IF_CK                  3
+#define CLK_APU_EDMA                   4
+#define CLK_APU_AHB                    5
+#define CLK_APU_NR_CLK                 6
+
+#endif /* _DT_BINDINGS_CLK_MT8365_H */
index 95cf812..d70d017 100644 (file)
 #define CLK_VDO1_DPINTF                                47
 #define CLK_VDO1_DISP_MONITOR_DPINTF           48
 #define CLK_VDO1_26M_SLOW                      49
-#define CLK_VDO1_NR_CLK                                50
+#define CLK_VDO1_DPI1_HDMI                     50
+#define CLK_VDO1_NR_CLK                                51
+
 
 #endif /* _DT_BINDINGS_CLK_MT8195_H */
diff --git a/include/dt-bindings/clock/qcom,gcc-msm8909.h b/include/dt-bindings/clock/qcom,gcc-msm8909.h
new file mode 100644 (file)
index 0000000..4394ba0
--- /dev/null
@@ -0,0 +1,218 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (C) 2022 Kernkonzept GmbH.
+ */
+
+#ifndef _DT_BINDINGS_CLK_QCOM_GCC_8909_H
+#define _DT_BINDINGS_CLK_QCOM_GCC_8909_H
+
+/* PLLs */
+#define GPLL0_EARLY                            0
+#define GPLL0                                  1
+#define GPLL1                                  2
+#define GPLL1_VOTE                             3
+#define GPLL2_EARLY                            4
+#define GPLL2                                  5
+#define BIMC_PLL_EARLY                         6
+#define BIMC_PLL                               7
+
+/* RCGs */
+#define APSS_AHB_CLK_SRC                       8
+#define BIMC_DDR_CLK_SRC                       9
+#define BIMC_GPU_CLK_SRC                       10
+#define BLSP1_QUP1_I2C_APPS_CLK_SRC            11
+#define BLSP1_QUP1_SPI_APPS_CLK_SRC            12
+#define BLSP1_QUP2_I2C_APPS_CLK_SRC            13
+#define BLSP1_QUP2_SPI_APPS_CLK_SRC            14
+#define BLSP1_QUP3_I2C_APPS_CLK_SRC            15
+#define BLSP1_QUP3_SPI_APPS_CLK_SRC            16
+#define BLSP1_QUP4_I2C_APPS_CLK_SRC            17
+#define BLSP1_QUP4_SPI_APPS_CLK_SRC            18
+#define BLSP1_QUP5_I2C_APPS_CLK_SRC            19
+#define BLSP1_QUP5_SPI_APPS_CLK_SRC            20
+#define BLSP1_QUP6_I2C_APPS_CLK_SRC            21
+#define BLSP1_QUP6_SPI_APPS_CLK_SRC            22
+#define BLSP1_UART1_APPS_CLK_SRC               23
+#define BLSP1_UART2_APPS_CLK_SRC               24
+#define BYTE0_CLK_SRC                          25
+#define CAMSS_GP0_CLK_SRC                      26
+#define CAMSS_GP1_CLK_SRC                      27
+#define CAMSS_TOP_AHB_CLK_SRC                  28
+#define CODEC_DIGCODEC_CLK_SRC                 29
+#define CRYPTO_CLK_SRC                         30
+#define CSI0_CLK_SRC                           31
+#define CSI0PHYTIMER_CLK_SRC                   32
+#define CSI1_CLK_SRC                           33
+#define ESC0_CLK_SRC                           34
+#define GFX3D_CLK_SRC                          35
+#define GP1_CLK_SRC                            36
+#define GP2_CLK_SRC                            37
+#define GP3_CLK_SRC                            38
+#define MCLK0_CLK_SRC                          39
+#define MCLK1_CLK_SRC                          40
+#define MDP_CLK_SRC                            41
+#define PCLK0_CLK_SRC                          42
+#define PCNOC_BFDCD_CLK_SRC                    43
+#define PDM2_CLK_SRC                           44
+#define SDCC1_APPS_CLK_SRC                     45
+#define SDCC2_APPS_CLK_SRC                     46
+#define SYSTEM_NOC_BFDCD_CLK_SRC               47
+#define ULTAUDIO_AHBFABRIC_CLK_SRC             48
+#define ULTAUDIO_LPAIF_AUX_I2S_CLK_SRC         49
+#define ULTAUDIO_LPAIF_PRI_I2S_CLK_SRC         50
+#define ULTAUDIO_LPAIF_SEC_I2S_CLK_SRC         51
+#define ULTAUDIO_XO_CLK_SRC                    52
+#define USB_HS_SYSTEM_CLK_SRC                  53
+#define VCODEC0_CLK_SRC                                54
+#define VFE0_CLK_SRC                           55
+#define VSYNC_CLK_SRC                          56
+
+/* Voteable Clocks */
+#define GCC_APSS_TCU_CLK                       57
+#define GCC_BLSP1_AHB_CLK                      58
+#define GCC_BLSP1_SLEEP_CLK                    59
+#define GCC_BOOT_ROM_AHB_CLK                   60
+#define GCC_CRYPTO_CLK                         61
+#define GCC_CRYPTO_AHB_CLK                     62
+#define GCC_CRYPTO_AXI_CLK                     63
+#define GCC_GFX_TBU_CLK                                64
+#define GCC_GFX_TCU_CLK                                65
+#define GCC_GTCU_AHB_CLK                       66
+#define GCC_MDP_TBU_CLK                                67
+#define GCC_PRNG_AHB_CLK                       68
+#define GCC_SMMU_CFG_CLK                       69
+#define GCC_VENUS_TBU_CLK                      70
+#define GCC_VFE_TBU_CLK                                71
+
+/* Branches */
+#define GCC_BIMC_GFX_CLK                       72
+#define GCC_BIMC_GPU_CLK                       73
+#define GCC_BLSP1_QUP1_I2C_APPS_CLK            74
+#define GCC_BLSP1_QUP1_SPI_APPS_CLK            75
+#define GCC_BLSP1_QUP2_I2C_APPS_CLK            76
+#define GCC_BLSP1_QUP2_SPI_APPS_CLK            77
+#define GCC_BLSP1_QUP3_I2C_APPS_CLK            78
+#define GCC_BLSP1_QUP3_SPI_APPS_CLK            79
+#define GCC_BLSP1_QUP4_I2C_APPS_CLK            80
+#define GCC_BLSP1_QUP4_SPI_APPS_CLK            81
+#define GCC_BLSP1_QUP5_I2C_APPS_CLK            82
+#define GCC_BLSP1_QUP5_SPI_APPS_CLK            83
+#define GCC_BLSP1_QUP6_I2C_APPS_CLK            84
+#define GCC_BLSP1_QUP6_SPI_APPS_CLK            85
+#define GCC_BLSP1_UART1_APPS_CLK               86
+#define GCC_BLSP1_UART2_APPS_CLK               87
+#define GCC_CAMSS_AHB_CLK                      88
+#define GCC_CAMSS_CSI0_CLK                     89
+#define GCC_CAMSS_CSI0_AHB_CLK                 90
+#define GCC_CAMSS_CSI0PHY_CLK                  91
+#define GCC_CAMSS_CSI0PHYTIMER_CLK             92
+#define GCC_CAMSS_CSI0PIX_CLK                  93
+#define GCC_CAMSS_CSI0RDI_CLK                  94
+#define GCC_CAMSS_CSI1_CLK                     95
+#define GCC_CAMSS_CSI1_AHB_CLK                 96
+#define GCC_CAMSS_CSI1PHY_CLK                  97
+#define GCC_CAMSS_CSI1PIX_CLK                  98
+#define GCC_CAMSS_CSI1RDI_CLK                  99
+#define GCC_CAMSS_CSI_VFE0_CLK                 100
+#define GCC_CAMSS_GP0_CLK                      101
+#define GCC_CAMSS_GP1_CLK                      102
+#define GCC_CAMSS_ISPIF_AHB_CLK                        103
+#define GCC_CAMSS_MCLK0_CLK                    104
+#define GCC_CAMSS_MCLK1_CLK                    105
+#define GCC_CAMSS_TOP_AHB_CLK                  106
+#define GCC_CAMSS_VFE0_CLK                     107
+#define GCC_CAMSS_VFE_AHB_CLK                  108
+#define GCC_CAMSS_VFE_AXI_CLK                  109
+#define GCC_CODEC_DIGCODEC_CLK                 110
+#define GCC_GP1_CLK                            111
+#define GCC_GP2_CLK                            112
+#define GCC_GP3_CLK                            113
+#define GCC_MDSS_AHB_CLK                       114
+#define GCC_MDSS_AXI_CLK                       115
+#define GCC_MDSS_BYTE0_CLK                     116
+#define GCC_MDSS_ESC0_CLK                      117
+#define GCC_MDSS_MDP_CLK                       118
+#define GCC_MDSS_PCLK0_CLK                     119
+#define GCC_MDSS_VSYNC_CLK                     120
+#define GCC_MSS_CFG_AHB_CLK                    121
+#define GCC_MSS_Q6_BIMC_AXI_CLK                        122
+#define GCC_OXILI_AHB_CLK                      123
+#define GCC_OXILI_GFX3D_CLK                    124
+#define GCC_PDM2_CLK                           125
+#define GCC_PDM_AHB_CLK                                126
+#define GCC_SDCC1_AHB_CLK                      127
+#define GCC_SDCC1_APPS_CLK                     128
+#define GCC_SDCC2_AHB_CLK                      129
+#define GCC_SDCC2_APPS_CLK                     130
+#define GCC_ULTAUDIO_AHBFABRIC_IXFABRIC_CLK    131
+#define GCC_ULTAUDIO_AHBFABRIC_IXFABRIC_LPM_CLK        132
+#define GCC_ULTAUDIO_AVSYNC_XO_CLK             133
+#define GCC_ULTAUDIO_LPAIF_AUX_I2S_CLK         134
+#define GCC_ULTAUDIO_LPAIF_PRI_I2S_CLK         135
+#define GCC_ULTAUDIO_LPAIF_SEC_I2S_CLK         136
+#define GCC_ULTAUDIO_PCNOC_MPORT_CLK           137
+#define GCC_ULTAUDIO_PCNOC_SWAY_CLK            138
+#define GCC_ULTAUDIO_STC_XO_CLK                        139
+#define GCC_USB2A_PHY_SLEEP_CLK                        140
+#define GCC_USB_HS_AHB_CLK                     141
+#define GCC_USB_HS_PHY_CFG_AHB_CLK             142
+#define GCC_USB_HS_SYSTEM_CLK                  143
+#define GCC_VENUS0_AHB_CLK                     144
+#define GCC_VENUS0_AXI_CLK                     145
+#define GCC_VENUS0_CORE0_VCODEC0_CLK           146
+#define GCC_VENUS0_VCODEC0_CLK                 147
+
+/* Resets */
+#define GCC_AUDIO_CORE_BCR                     0
+#define GCC_BLSP1_BCR                          1
+#define GCC_BLSP1_QUP1_BCR                     2
+#define GCC_BLSP1_QUP2_BCR                     3
+#define GCC_BLSP1_QUP3_BCR                     4
+#define GCC_BLSP1_QUP4_BCR                     5
+#define GCC_BLSP1_QUP5_BCR                     6
+#define GCC_BLSP1_QUP6_BCR                     7
+#define GCC_BLSP1_UART1_BCR                    8
+#define GCC_BLSP1_UART2_BCR                    9
+#define GCC_CAMSS_CSI0_BCR                     10
+#define GCC_CAMSS_CSI0PHY_BCR                  11
+#define GCC_CAMSS_CSI0PIX_BCR                  12
+#define GCC_CAMSS_CSI0RDI_BCR                  13
+#define GCC_CAMSS_CSI1_BCR                     14
+#define GCC_CAMSS_CSI1PHY_BCR                  15
+#define GCC_CAMSS_CSI1PIX_BCR                  16
+#define GCC_CAMSS_CSI1RDI_BCR                  17
+#define GCC_CAMSS_CSI_VFE0_BCR                 18
+#define GCC_CAMSS_GP0_BCR                      19
+#define GCC_CAMSS_GP1_BCR                      20
+#define GCC_CAMSS_ISPIF_BCR                    21
+#define GCC_CAMSS_MCLK0_BCR                    22
+#define GCC_CAMSS_MCLK1_BCR                    23
+#define GCC_CAMSS_PHY0_BCR                     24
+#define GCC_CAMSS_TOP_BCR                      25
+#define GCC_CAMSS_TOP_AHB_BCR                  26
+#define GCC_CAMSS_VFE_BCR                      27
+#define GCC_CRYPTO_BCR                         28
+#define GCC_MDSS_BCR                           29
+#define GCC_OXILI_BCR                          30
+#define GCC_PDM_BCR                            31
+#define GCC_PRNG_BCR                           32
+#define GCC_QUSB2_PHY_BCR                      33
+#define GCC_SDCC1_BCR                          34
+#define GCC_SDCC2_BCR                          35
+#define GCC_ULT_AUDIO_BCR                      36
+#define GCC_USB2A_PHY_BCR                      37
+#define GCC_USB2_HS_PHY_ONLY_BCR               38
+#define GCC_USB_HS_BCR                         39
+#define GCC_VENUS0_BCR                         40
+
+/* Subsystem Restart */
+#define GCC_MSS_RESTART                                41
+
+/* Power Domains */
+#define MDSS_GDSC                              0
+#define OXILI_GDSC                             1
+#define VENUS_GDSC                             2
+#define VENUS_CORE0_GDSC                       3
+#define VFE_GDSC                               4
+
+#endif
index 968fa65..d78b899 100644 (file)
 #define GCC_QSPI_CNOC_PERIPH_AHB_CLK                           189
 #define GCC_LPASS_Q6_AXI_CLK                                   190
 #define GCC_LPASS_SWAY_CLK                                     191
+#define GPLL6                                                  192
 
 /* GCC Resets */
 #define GCC_MMSS_BCR                                           0
diff --git a/include/dt-bindings/clock/qcom,gpucc-sc8280xp.h b/include/dt-bindings/clock/qcom,gpucc-sc8280xp.h
new file mode 100644 (file)
index 0000000..bb7da46
--- /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_SC8280XP_H
+#define _DT_BINDINGS_CLK_QCOM_GPU_CC_SC8280XP_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_FREQ_MEASURE_CLK                                        9
+#define GPU_CC_GMU_CLK_SRC                                     10
+#define GPU_CC_GX_GMU_CLK                                      11
+#define GPU_CC_GX_VSENSE_CLK                                   12
+#define GPU_CC_HUB_AHB_DIV_CLK_SRC                             13
+#define GPU_CC_HUB_AON_CLK                                     14
+#define GPU_CC_HUB_CLK_SRC                                     15
+#define GPU_CC_HUB_CX_INT_CLK                                  16
+#define GPU_CC_HUB_CX_INT_DIV_CLK_SRC                          17
+#define GPU_CC_SLEEP_CLK                                       18
+#define GPU_CC_HLOS1_VOTE_GPU_SMMU_CLK                         19
+
+/* GPU_CC power domains */
+#define GPU_CC_CX_GDSC                         0
+#define GPU_CC_GX_GDSC                         1
+
+#endif
index 25b92bb..e0fb4ac 100644 (file)
@@ -19,4 +19,6 @@
 #define SPDIF_CLK                      10
 #define AHBIX_CLK                      11
 
+#define LCC_PCM_RESET                  0
+
 #endif
index 20ef2ea..22dcd47 100644 (file)
 #define LPASS_AUDIO_CC_RX_MCLK_CLK                     14
 #define LPASS_AUDIO_CC_RX_MCLK_CLK_SRC                 15
 
+/* LPASS AUDIO CC CSR */
+#define LPASS_AUDIO_SWR_RX_CGCR                                0
+#define LPASS_AUDIO_SWR_TX_CGCR                                1
+#define LPASS_AUDIO_SWR_WSA_CGCR                       2
+
 /* LPASS_AON_CC clocks */
 #define LPASS_AON_CC_PLL                               0
 #define LPASS_AON_CC_PLL_OUT_EVEN                      1
index 28ed2a0..0324c69 100644 (file)
@@ -19,6 +19,8 @@
 #define LPASS_CORE_CC_LPM_CORE_CLK                     9
 #define LPASS_CORE_CC_LPM_MEM0_CORE_CLK                        10
 #define LPASS_CORE_CC_SYSNOC_MPORT_CORE_CLK            11
+#define LPASS_CORE_CC_EXT_MCLK0_CLK                    12
+#define LPASS_CORE_CC_EXT_MCLK0_CLK_SRC                        13
 
 /* LPASS_CORE_CC power domains */
 #define LPASS_CORE_CC_LPASS_CORE_HM_GDSC               0
index 015db95..c0ad624 100644 (file)
 #define RPM_SMD_CPUSS_GNOC_A_CLK               121
 #define RPM_SMD_MSS_CFG_AHB_CLK                122
 #define RPM_SMD_MSS_CFG_AHB_A_CLK              123
+#define RPM_SMD_BIMC_FREQ_LOG                  124
 
 #endif
diff --git a/include/dt-bindings/clock/qcom,sm6115-dispcc.h b/include/dt-bindings/clock/qcom,sm6115-dispcc.h
new file mode 100644 (file)
index 0000000..d1a6c45
--- /dev/null
@@ -0,0 +1,36 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (c) 2022, The Linux Foundation. All rights reserved.
+ */
+
+#ifndef _DT_BINDINGS_CLK_QCOM_DISP_CC_SM6115_H
+#define _DT_BINDINGS_CLK_QCOM_DISP_CC_SM6115_H
+
+/* DISP_CC clocks */
+#define DISP_CC_PLL0                   0
+#define DISP_CC_PLL0_OUT_MAIN          1
+#define DISP_CC_MDSS_AHB_CLK           2
+#define DISP_CC_MDSS_AHB_CLK_SRC       3
+#define DISP_CC_MDSS_BYTE0_CLK         4
+#define DISP_CC_MDSS_BYTE0_CLK_SRC     5
+#define DISP_CC_MDSS_BYTE0_DIV_CLK_SRC 6
+#define DISP_CC_MDSS_BYTE0_INTF_CLK    7
+#define DISP_CC_MDSS_ESC0_CLK          8
+#define DISP_CC_MDSS_ESC0_CLK_SRC      9
+#define DISP_CC_MDSS_MDP_CLK           10
+#define DISP_CC_MDSS_MDP_CLK_SRC       11
+#define DISP_CC_MDSS_MDP_LUT_CLK       12
+#define DISP_CC_MDSS_NON_GDSC_AHB_CLK  13
+#define DISP_CC_MDSS_PCLK0_CLK         14
+#define DISP_CC_MDSS_PCLK0_CLK_SRC     15
+#define DISP_CC_MDSS_ROT_CLK           16
+#define DISP_CC_MDSS_ROT_CLK_SRC       17
+#define DISP_CC_MDSS_VSYNC_CLK         18
+#define DISP_CC_MDSS_VSYNC_CLK_SRC     19
+#define DISP_CC_SLEEP_CLK              20
+#define DISP_CC_SLEEP_CLK_SRC          21
+
+/* DISP_CC GDSCR */
+#define MDSS_GDSC                      0
+
+#endif
diff --git a/include/dt-bindings/clock/qcom,sm6375-gcc.h b/include/dt-bindings/clock/qcom,sm6375-gcc.h
new file mode 100644 (file)
index 0000000..1e9801e
--- /dev/null
@@ -0,0 +1,234 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022, Konrad Dybcio <konrad.dybcio@somainline.org>
+ */
+
+#ifndef _DT_BINDINGS_CLK_QCOM_GCC_SM6375_H
+#define _DT_BINDINGS_CLK_QCOM_GCC_SM6375_H
+
+/* Clocks */
+#define GPLL0                                          0
+#define GPLL0_OUT_EVEN                                 1
+#define GPLL0_OUT_ODD                                  2
+#define GPLL1                                          3
+#define GPLL10                                         4
+#define GPLL11                                         5
+#define GPLL3                                          6
+#define GPLL3_OUT_EVEN                                 7
+#define GPLL4                                          8
+#define GPLL5                                          9
+#define GPLL6                                          10
+#define GPLL6_OUT_EVEN                                 11
+#define GPLL7                                          12
+#define GPLL8                                          13
+#define GPLL8_OUT_EVEN                                 14
+#define GPLL9                                          15
+#define GPLL9_OUT_MAIN                                 16
+#define GCC_AHB2PHY_CSI_CLK                            17
+#define GCC_AHB2PHY_USB_CLK                            18
+#define GCC_BIMC_GPU_AXI_CLK                           19
+#define GCC_BOOT_ROM_AHB_CLK                           20
+#define GCC_CAM_THROTTLE_NRT_CLK                       21
+#define GCC_CAM_THROTTLE_RT_CLK                                22
+#define GCC_CAMERA_AHB_CLK                             23
+#define GCC_CAMERA_XO_CLK                              24
+#define GCC_CAMSS_AXI_CLK                              25
+#define GCC_CAMSS_AXI_CLK_SRC                          26
+#define GCC_CAMSS_CAMNOC_ATB_CLK                       27
+#define GCC_CAMSS_CAMNOC_NTS_XO_CLK                    28
+#define GCC_CAMSS_CCI_0_CLK                            29
+#define GCC_CAMSS_CCI_0_CLK_SRC                                30
+#define GCC_CAMSS_CCI_1_CLK                            31
+#define GCC_CAMSS_CCI_1_CLK_SRC                                32
+#define GCC_CAMSS_CPHY_0_CLK                           33
+#define GCC_CAMSS_CPHY_1_CLK                           34
+#define GCC_CAMSS_CPHY_2_CLK                           35
+#define GCC_CAMSS_CPHY_3_CLK                           36
+#define GCC_CAMSS_CSI0PHYTIMER_CLK                     37
+#define GCC_CAMSS_CSI0PHYTIMER_CLK_SRC                 38
+#define GCC_CAMSS_CSI1PHYTIMER_CLK                     39
+#define GCC_CAMSS_CSI1PHYTIMER_CLK_SRC                 40
+#define GCC_CAMSS_CSI2PHYTIMER_CLK                     41
+#define GCC_CAMSS_CSI2PHYTIMER_CLK_SRC                 42
+#define GCC_CAMSS_CSI3PHYTIMER_CLK                     43
+#define GCC_CAMSS_CSI3PHYTIMER_CLK_SRC                 44
+#define GCC_CAMSS_MCLK0_CLK                            45
+#define GCC_CAMSS_MCLK0_CLK_SRC                                46
+#define GCC_CAMSS_MCLK1_CLK                            47
+#define GCC_CAMSS_MCLK1_CLK_SRC                                48
+#define GCC_CAMSS_MCLK2_CLK                            49
+#define GCC_CAMSS_MCLK2_CLK_SRC                                50
+#define GCC_CAMSS_MCLK3_CLK                            51
+#define GCC_CAMSS_MCLK3_CLK_SRC                                52
+#define GCC_CAMSS_MCLK4_CLK                            53
+#define GCC_CAMSS_MCLK4_CLK_SRC                                54
+#define GCC_CAMSS_NRT_AXI_CLK                          55
+#define GCC_CAMSS_OPE_AHB_CLK                          56
+#define GCC_CAMSS_OPE_AHB_CLK_SRC                      57
+#define GCC_CAMSS_OPE_CLK                              58
+#define GCC_CAMSS_OPE_CLK_SRC                          59
+#define GCC_CAMSS_RT_AXI_CLK                           60
+#define GCC_CAMSS_TFE_0_CLK                            61
+#define GCC_CAMSS_TFE_0_CLK_SRC                                62
+#define GCC_CAMSS_TFE_0_CPHY_RX_CLK                    63
+#define GCC_CAMSS_TFE_0_CSID_CLK                       64
+#define GCC_CAMSS_TFE_0_CSID_CLK_SRC                   65
+#define GCC_CAMSS_TFE_1_CLK                            66
+#define GCC_CAMSS_TFE_1_CLK_SRC                                67
+#define GCC_CAMSS_TFE_1_CPHY_RX_CLK                    68
+#define GCC_CAMSS_TFE_1_CSID_CLK                       69
+#define GCC_CAMSS_TFE_1_CSID_CLK_SRC                   70
+#define GCC_CAMSS_TFE_2_CLK                            71
+#define GCC_CAMSS_TFE_2_CLK_SRC                                72
+#define GCC_CAMSS_TFE_2_CPHY_RX_CLK                    73
+#define GCC_CAMSS_TFE_2_CSID_CLK                       74
+#define GCC_CAMSS_TFE_2_CSID_CLK_SRC                   75
+#define GCC_CAMSS_TFE_CPHY_RX_CLK_SRC                  76
+#define GCC_CAMSS_TOP_AHB_CLK                          77
+#define GCC_CAMSS_TOP_AHB_CLK_SRC                      78
+#define GCC_CFG_NOC_USB3_PRIM_AXI_CLK                  79
+#define GCC_CPUSS_AHB_CLK_SRC                          80
+#define GCC_CPUSS_AHB_POSTDIV_CLK_SRC                  81
+#define GCC_CPUSS_GNOC_CLK                             82
+#define GCC_DISP_AHB_CLK                               83
+#define GCC_DISP_GPLL0_CLK_SRC                         84
+#define GCC_DISP_GPLL0_DIV_CLK_SRC                     85
+#define GCC_DISP_HF_AXI_CLK                            86
+#define GCC_DISP_SLEEP_CLK                             87
+#define GCC_DISP_THROTTLE_CORE_CLK                     88
+#define GCC_DISP_XO_CLK                                        89
+#define GCC_GP1_CLK                                    90
+#define GCC_GP1_CLK_SRC                                        91
+#define GCC_GP2_CLK                                    92
+#define GCC_GP2_CLK_SRC                                        93
+#define GCC_GP3_CLK                                    94
+#define GCC_GP3_CLK_SRC                                        95
+#define GCC_GPU_CFG_AHB_CLK                            96
+#define GCC_GPU_GPLL0_CLK_SRC                          97
+#define GCC_GPU_GPLL0_DIV_CLK_SRC                      98
+#define GCC_GPU_MEMNOC_GFX_CLK                         99
+#define GCC_GPU_SNOC_DVM_GFX_CLK                       100
+#define GCC_GPU_THROTTLE_CORE_CLK                      101
+#define GCC_PDM2_CLK                                   102
+#define GCC_PDM2_CLK_SRC                               103
+#define GCC_PDM_AHB_CLK                                        104
+#define GCC_PDM_XO4_CLK                                        105
+#define GCC_PRNG_AHB_CLK                               106
+#define GCC_QMIP_CAMERA_NRT_AHB_CLK                    107
+#define GCC_QMIP_CAMERA_RT_AHB_CLK                     108
+#define GCC_QMIP_DISP_AHB_CLK                          109
+#define GCC_QMIP_GPU_CFG_AHB_CLK                       110
+#define GCC_QMIP_VIDEO_VCODEC_AHB_CLK                  111
+#define GCC_QUPV3_WRAP0_CORE_2X_CLK                    112
+#define GCC_QUPV3_WRAP0_CORE_CLK                       113
+#define GCC_QUPV3_WRAP0_S0_CLK                         114
+#define GCC_QUPV3_WRAP0_S0_CLK_SRC                     115
+#define GCC_QUPV3_WRAP0_S1_CLK                         116
+#define GCC_QUPV3_WRAP0_S1_CLK_SRC                     117
+#define GCC_QUPV3_WRAP0_S2_CLK                         118
+#define GCC_QUPV3_WRAP0_S2_CLK_SRC                     119
+#define GCC_QUPV3_WRAP0_S3_CLK                         120
+#define GCC_QUPV3_WRAP0_S3_CLK_SRC                     121
+#define GCC_QUPV3_WRAP0_S4_CLK                         122
+#define GCC_QUPV3_WRAP0_S4_CLK_SRC                     123
+#define GCC_QUPV3_WRAP0_S5_CLK                         124
+#define GCC_QUPV3_WRAP0_S5_CLK_SRC                     125
+#define GCC_QUPV3_WRAP1_CORE_2X_CLK                    126
+#define GCC_QUPV3_WRAP1_CORE_CLK                       127
+#define GCC_QUPV3_WRAP1_S0_CLK                         128
+#define GCC_QUPV3_WRAP1_S0_CLK_SRC                     129
+#define GCC_QUPV3_WRAP1_S1_CLK                         130
+#define GCC_QUPV3_WRAP1_S1_CLK_SRC                     131
+#define GCC_QUPV3_WRAP1_S2_CLK                         132
+#define GCC_QUPV3_WRAP1_S2_CLK_SRC                     133
+#define GCC_QUPV3_WRAP1_S3_CLK                         134
+#define GCC_QUPV3_WRAP1_S3_CLK_SRC                     135
+#define GCC_QUPV3_WRAP1_S4_CLK                         136
+#define GCC_QUPV3_WRAP1_S4_CLK_SRC                     137
+#define GCC_QUPV3_WRAP1_S5_CLK                         138
+#define GCC_QUPV3_WRAP1_S5_CLK_SRC                     139
+#define GCC_QUPV3_WRAP_0_M_AHB_CLK                     140
+#define GCC_QUPV3_WRAP_0_S_AHB_CLK                     141
+#define GCC_QUPV3_WRAP_1_M_AHB_CLK                     142
+#define GCC_QUPV3_WRAP_1_S_AHB_CLK                     143
+#define GCC_RX5_PCIE_CLKREF_EN_CLK                     144
+#define GCC_SDCC1_AHB_CLK                              145
+#define GCC_SDCC1_APPS_CLK                             146
+#define GCC_SDCC1_APPS_CLK_SRC                         147
+#define GCC_SDCC1_ICE_CORE_CLK                         148
+#define GCC_SDCC1_ICE_CORE_CLK_SRC                     149
+#define GCC_SDCC2_AHB_CLK                              150
+#define GCC_SDCC2_APPS_CLK                             151
+#define GCC_SDCC2_APPS_CLK_SRC                         152
+#define GCC_SYS_NOC_CPUSS_AHB_CLK                      153
+#define GCC_SYS_NOC_UFS_PHY_AXI_CLK                    154
+#define GCC_SYS_NOC_USB3_PRIM_AXI_CLK                  155
+#define GCC_UFS_MEM_CLKREF_CLK                         156
+#define GCC_UFS_PHY_AHB_CLK                            157
+#define GCC_UFS_PHY_AXI_CLK                            158
+#define GCC_UFS_PHY_AXI_CLK_SRC                                159
+#define GCC_UFS_PHY_ICE_CORE_CLK                       160
+#define GCC_UFS_PHY_ICE_CORE_CLK_SRC                   161
+#define GCC_UFS_PHY_PHY_AUX_CLK                                162
+#define GCC_UFS_PHY_PHY_AUX_CLK_SRC                    163
+#define GCC_UFS_PHY_RX_SYMBOL_0_CLK                    164
+#define GCC_UFS_PHY_TX_SYMBOL_0_CLK                    165
+#define GCC_UFS_PHY_UNIPRO_CORE_CLK                    166
+#define GCC_UFS_PHY_UNIPRO_CORE_CLK_SRC                        167
+#define GCC_USB30_PRIM_MASTER_CLK                      168
+#define GCC_USB30_PRIM_MASTER_CLK_SRC                  169
+#define GCC_USB30_PRIM_MOCK_UTMI_CLK                   170
+#define GCC_USB30_PRIM_MOCK_UTMI_CLK_SRC               171
+#define GCC_USB30_PRIM_MOCK_UTMI_POSTDIV_CLK_SRC       172
+#define GCC_USB30_PRIM_SLEEP_CLK                       173
+#define GCC_USB3_PRIM_CLKREF_CLK                       174
+#define GCC_USB3_PRIM_PHY_AUX_CLK_SRC                  175
+#define GCC_USB3_PRIM_PHY_COM_AUX_CLK                  176
+#define GCC_USB3_PRIM_PHY_PIPE_CLK                     177
+#define GCC_VCODEC0_AXI_CLK                            178
+#define GCC_VENUS_AHB_CLK                              179
+#define GCC_VENUS_CTL_AXI_CLK                          180
+#define GCC_VIDEO_AHB_CLK                              181
+#define GCC_VIDEO_AXI0_CLK                             182
+#define GCC_VIDEO_THROTTLE_CORE_CLK                    183
+#define GCC_VIDEO_VCODEC0_SYS_CLK                      184
+#define GCC_VIDEO_VENUS_CLK_SRC                                185
+#define GCC_VIDEO_VENUS_CTL_CLK                                186
+#define GCC_VIDEO_XO_CLK                               187
+
+/* Resets */
+#define GCC_CAMSS_OPE_BCR                              0
+#define GCC_CAMSS_TFE_BCR                              1
+#define GCC_CAMSS_TOP_BCR                              2
+#define GCC_GPU_BCR                                    3
+#define GCC_MMSS_BCR                                   4
+#define GCC_PDM_BCR                                    5
+#define GCC_PRNG_BCR                                   6
+#define GCC_QUPV3_WRAPPER_0_BCR                                7
+#define GCC_QUPV3_WRAPPER_1_BCR                                8
+#define GCC_QUSB2PHY_PRIM_BCR                          9
+#define GCC_QUSB2PHY_SEC_BCR                           10
+#define GCC_SDCC1_BCR                                  11
+#define GCC_SDCC2_BCR                                  12
+#define GCC_UFS_PHY_BCR                                        13
+#define GCC_USB30_PRIM_BCR                             14
+#define GCC_USB_PHY_CFG_AHB2PHY_BCR                    15
+#define GCC_VCODEC0_BCR                                        16
+#define GCC_VENUS_BCR                                  17
+#define GCC_VIDEO_INTERFACE_BCR                                18
+#define GCC_USB3_DP_PHY_PRIM_BCR                       19
+#define GCC_USB3_PHY_PRIM_SP0_BCR                      20
+
+/* GDSCs */
+#define USB30_PRIM_GDSC                                        0
+#define UFS_PHY_GDSC                                   1
+#define CAMSS_TOP_GDSC                                 2
+#define VENUS_GDSC                                     3
+#define VCODEC0_GDSC                                   4
+#define HLOS1_VOTE_MM_SNOC_MMU_TBU_NRT_GDSC            5
+#define HLOS1_VOTE_MM_SNOC_MMU_TBU_RT_GDSC             6
+#define HLOS1_VOTE_TURING_MMU_TBU0_GDSC                        7
+#define HLOS1_VOTE_TURING_MMU_TBU1_GDSC                        8
+
+#endif
diff --git a/include/dt-bindings/clock/qcom,sm8450-dispcc.h b/include/dt-bindings/clock/qcom,sm8450-dispcc.h
new file mode 100644 (file)
index 0000000..fd16ca8
--- /dev/null
@@ -0,0 +1,103 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (c) 2022, The Linux Foundation. All rights reserved.
+ */
+
+#ifndef _DT_BINDINGS_CLK_QCOM_DISP_CC_SM8450_H
+#define _DT_BINDINGS_CLK_QCOM_DISP_CC_SM8450_H
+
+/* DISP_CC clocks */
+#define DISP_CC_MDSS_AHB1_CLK                                  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_BYTE1_CLK                                 7
+#define DISP_CC_MDSS_BYTE1_CLK_SRC                             8
+#define DISP_CC_MDSS_BYTE1_DIV_CLK_SRC                         9
+#define DISP_CC_MDSS_BYTE1_INTF_CLK                            10
+#define DISP_CC_MDSS_DPTX0_AUX_CLK                             11
+#define DISP_CC_MDSS_DPTX0_AUX_CLK_SRC                         12
+#define DISP_CC_MDSS_DPTX0_CRYPTO_CLK                          13
+#define DISP_CC_MDSS_DPTX0_LINK_CLK                            14
+#define DISP_CC_MDSS_DPTX0_LINK_CLK_SRC                                15
+#define DISP_CC_MDSS_DPTX0_LINK_DIV_CLK_SRC                    16
+#define DISP_CC_MDSS_DPTX0_LINK_INTF_CLK                       17
+#define DISP_CC_MDSS_DPTX0_PIXEL0_CLK                          18
+#define DISP_CC_MDSS_DPTX0_PIXEL0_CLK_SRC                      19
+#define DISP_CC_MDSS_DPTX0_PIXEL1_CLK                          20
+#define DISP_CC_MDSS_DPTX0_PIXEL1_CLK_SRC                      21
+#define DISP_CC_MDSS_DPTX0_USB_ROUTER_LINK_INTF_CLK            22
+#define DISP_CC_MDSS_DPTX1_AUX_CLK                             23
+#define DISP_CC_MDSS_DPTX1_AUX_CLK_SRC                         24
+#define DISP_CC_MDSS_DPTX1_CRYPTO_CLK                          25
+#define DISP_CC_MDSS_DPTX1_LINK_CLK                            26
+#define DISP_CC_MDSS_DPTX1_LINK_CLK_SRC                                27
+#define DISP_CC_MDSS_DPTX1_LINK_DIV_CLK_SRC                    28
+#define DISP_CC_MDSS_DPTX1_LINK_INTF_CLK                       29
+#define DISP_CC_MDSS_DPTX1_PIXEL0_CLK                          30
+#define DISP_CC_MDSS_DPTX1_PIXEL0_CLK_SRC                      31
+#define DISP_CC_MDSS_DPTX1_PIXEL1_CLK                          32
+#define DISP_CC_MDSS_DPTX1_PIXEL1_CLK_SRC                      33
+#define DISP_CC_MDSS_DPTX1_USB_ROUTER_LINK_INTF_CLK            34
+#define DISP_CC_MDSS_DPTX2_AUX_CLK                             35
+#define DISP_CC_MDSS_DPTX2_AUX_CLK_SRC                         36
+#define DISP_CC_MDSS_DPTX2_CRYPTO_CLK                          37
+#define DISP_CC_MDSS_DPTX2_LINK_CLK                            38
+#define DISP_CC_MDSS_DPTX2_LINK_CLK_SRC                                39
+#define DISP_CC_MDSS_DPTX2_LINK_DIV_CLK_SRC                    40
+#define DISP_CC_MDSS_DPTX2_LINK_INTF_CLK                       41
+#define DISP_CC_MDSS_DPTX2_PIXEL0_CLK                          42
+#define DISP_CC_MDSS_DPTX2_PIXEL0_CLK_SRC                      43
+#define DISP_CC_MDSS_DPTX2_PIXEL1_CLK                          44
+#define DISP_CC_MDSS_DPTX2_PIXEL1_CLK_SRC                      45
+#define DISP_CC_MDSS_DPTX3_AUX_CLK                             46
+#define DISP_CC_MDSS_DPTX3_AUX_CLK_SRC                         47
+#define DISP_CC_MDSS_DPTX3_CRYPTO_CLK                          48
+#define DISP_CC_MDSS_DPTX3_LINK_CLK                            49
+#define DISP_CC_MDSS_DPTX3_LINK_CLK_SRC                                50
+#define DISP_CC_MDSS_DPTX3_LINK_DIV_CLK_SRC                    51
+#define DISP_CC_MDSS_DPTX3_LINK_INTF_CLK                       52
+#define DISP_CC_MDSS_DPTX3_PIXEL0_CLK                          53
+#define DISP_CC_MDSS_DPTX3_PIXEL0_CLK_SRC                      54
+#define DISP_CC_MDSS_ESC0_CLK                                  55
+#define DISP_CC_MDSS_ESC0_CLK_SRC                              56
+#define DISP_CC_MDSS_ESC1_CLK                                  57
+#define DISP_CC_MDSS_ESC1_CLK_SRC                              58
+#define DISP_CC_MDSS_MDP1_CLK                                  59
+#define DISP_CC_MDSS_MDP_CLK                                   60
+#define DISP_CC_MDSS_MDP_CLK_SRC                               61
+#define DISP_CC_MDSS_MDP_LUT1_CLK                              62
+#define DISP_CC_MDSS_MDP_LUT_CLK                               63
+#define DISP_CC_MDSS_NON_GDSC_AHB_CLK                          64
+#define DISP_CC_MDSS_PCLK0_CLK                                 65
+#define DISP_CC_MDSS_PCLK0_CLK_SRC                             66
+#define DISP_CC_MDSS_PCLK1_CLK                                 67
+#define DISP_CC_MDSS_PCLK1_CLK_SRC                             68
+#define DISP_CC_MDSS_ROT1_CLK                                  69
+#define DISP_CC_MDSS_ROT_CLK                                   70
+#define DISP_CC_MDSS_ROT_CLK_SRC                               71
+#define DISP_CC_MDSS_RSCC_AHB_CLK                              72
+#define DISP_CC_MDSS_RSCC_VSYNC_CLK                            73
+#define DISP_CC_MDSS_VSYNC1_CLK                                        74
+#define DISP_CC_MDSS_VSYNC_CLK                                 75
+#define DISP_CC_MDSS_VSYNC_CLK_SRC                             76
+#define DISP_CC_PLL0                                           77
+#define DISP_CC_PLL1                                           78
+#define DISP_CC_SLEEP_CLK                                      79
+#define DISP_CC_SLEEP_CLK_SRC                                  80
+#define DISP_CC_XO_CLK                                         81
+#define DISP_CC_XO_CLK_SRC                                     82
+
+/* DISP_CC resets */
+#define DISP_CC_MDSS_CORE_BCR                                  0
+#define DISP_CC_MDSS_CORE_INT2_BCR                             1
+#define DISP_CC_MDSS_RSCC_BCR                                  2
+
+/* DISP_CC GDSCR */
+#define MDSS_GDSC                              0
+#define MDSS_INT2_GDSC                         1
+
+#endif
index ea9f91b..42133af 100644 (file)
 
 #define CORE_NR_CLK                    6
 
+/* CMU_FSYS0 */
+#define CLK_MOUT_FSYS0_BUS_USER                1
+#define CLK_MOUT_FSYS0_PCIE_USER       2
+#define CLK_GOUT_FSYS0_BUS_PCLK                3
+
+#define CLK_GOUT_FSYS0_PCIE_GEN3_2L0_X1_REFCLK         4
+#define CLK_GOUT_FSYS0_PCIE_GEN3_2L0_X2_REFCLK         5
+#define CLK_GOUT_FSYS0_PCIE_GEN3_2L0_X1_DBI_ACLK       6
+#define CLK_GOUT_FSYS0_PCIE_GEN3_2L0_X1_MSTR_ACLK      7
+#define CLK_GOUT_FSYS0_PCIE_GEN3_2L0_X1_SLV_ACLK       8
+#define CLK_GOUT_FSYS0_PCIE_GEN3_2L0_X2_DBI_ACLK       9
+#define CLK_GOUT_FSYS0_PCIE_GEN3_2L0_X2_MSTR_ACLK      10
+#define CLK_GOUT_FSYS0_PCIE_GEN3_2L0_X2_SLV_ACLK       11
+#define CLK_GOUT_FSYS0_PCIE_GEN3_2L0_X2_PIPE_CLK       12
+#define CLK_GOUT_FSYS0_PCIE_GEN3A_2L0_CLK              13
+#define CLK_GOUT_FSYS0_PCIE_GEN3B_2L0_CLK              14
+
+#define CLK_GOUT_FSYS0_PCIE_GEN3_2L1_X1_REFCLK         15
+#define CLK_GOUT_FSYS0_PCIE_GEN3_2L1_X2_REFCLK         16
+#define CLK_GOUT_FSYS0_PCIE_GEN3_2L1_X1_DBI_ACLK       17
+#define CLK_GOUT_FSYS0_PCIE_GEN3_2L1_X1_MSTR_ACLK      18
+#define CLK_GOUT_FSYS0_PCIE_GEN3_2L1_X1_SLV_ACLK       19
+#define CLK_GOUT_FSYS0_PCIE_GEN3_2L1_X2_DBI_ACLK       20
+#define CLK_GOUT_FSYS0_PCIE_GEN3_2L1_X2_MSTR_ACLK      21
+#define CLK_GOUT_FSYS0_PCIE_GEN3_2L1_X2_SLV_ACLK       22
+#define CLK_GOUT_FSYS0_PCIE_GEN3_2L1_X2_PIPE_CLK       23
+#define CLK_GOUT_FSYS0_PCIE_GEN3A_2L1_CLK              24
+#define CLK_GOUT_FSYS0_PCIE_GEN3B_2L1_CLK              25
+
+#define CLK_GOUT_FSYS0_PCIE_GEN3_4L_X2_REFCLK          26
+#define CLK_GOUT_FSYS0_PCIE_GEN3_4L_X4_REFCLK          27
+#define CLK_GOUT_FSYS0_PCIE_GEN3_4L_X2_DBI_ACLK                28
+#define CLK_GOUT_FSYS0_PCIE_GEN3_4L_X2_MSTR_ACLK       29
+#define CLK_GOUT_FSYS0_PCIE_GEN3_4L_X2_SLV_ACLK                30
+#define CLK_GOUT_FSYS0_PCIE_GEN3_4L_X4_DBI_ACLK                31
+#define CLK_GOUT_FSYS0_PCIE_GEN3_4L_X4_MSTR_ACLK       32
+#define CLK_GOUT_FSYS0_PCIE_GEN3_4L_X4_SLV_ACLK                33
+#define CLK_GOUT_FSYS0_PCIE_GEN3_4L_X4_PIPE_CLK                34
+#define CLK_GOUT_FSYS0_PCIE_GEN3A_4L_CLK               35
+#define CLK_GOUT_FSYS0_PCIE_GEN3B_4L_CLK               36
+
+#define FSYS0_NR_CLK                   37
+
+/* CMU_FSYS1 */
+#define FOUT_MMC_PLL                           1
+
+#define CLK_MOUT_FSYS1_BUS_USER                        2
+#define CLK_MOUT_FSYS1_MMC_PLL                 3
+#define CLK_MOUT_FSYS1_MMC_CARD_USER           4
+#define CLK_MOUT_FSYS1_USBDRD_USER             5
+#define CLK_MOUT_FSYS1_MMC_CARD                        6
+
+#define CLK_DOUT_FSYS1_MMC_CARD                        7
+
+#define CLK_GOUT_FSYS1_PCLK                    8
+#define CLK_GOUT_FSYS1_MMC_CARD_SDCLKIN                9
+#define CLK_GOUT_FSYS1_MMC_CARD_ACLK           10
+#define CLK_GOUT_FSYS1_USB20DRD_0_REFCLK       11
+#define CLK_GOUT_FSYS1_USB20DRD_1_REFCLK       12
+#define CLK_GOUT_FSYS1_USB30DRD_0_REFCLK       13
+#define CLK_GOUT_FSYS1_USB30DRD_1_REFCLK       14
+#define CLK_GOUT_FSYS1_USB20_0_ACLK            15
+#define CLK_GOUT_FSYS1_USB20_1_ACLK            16
+#define CLK_GOUT_FSYS1_USB30_0_ACLK            17
+#define CLK_GOUT_FSYS1_USB30_1_ACLK            18
+
+#define FSYS1_NR_CLK                           19
+
 /* CMU_FSYS2 */
 #define CLK_MOUT_FSYS2_BUS_USER                1
 #define CLK_MOUT_FSYS2_UFS_EMBD_USER   2
 #define CLK_GOUT_PERIC0_IPCLK_8                28
 #define CLK_GOUT_PERIC0_IPCLK_9                29
 #define CLK_GOUT_PERIC0_IPCLK_10       30
-#define CLK_GOUT_PERIC0_IPCLK_11       30
-#define CLK_GOUT_PERIC0_PCLK_0         31
-#define CLK_GOUT_PERIC0_PCLK_1         32
-#define CLK_GOUT_PERIC0_PCLK_2         33
-#define CLK_GOUT_PERIC0_PCLK_3         34
-#define CLK_GOUT_PERIC0_PCLK_4         35
-#define CLK_GOUT_PERIC0_PCLK_5         36
-#define CLK_GOUT_PERIC0_PCLK_6         37
-#define CLK_GOUT_PERIC0_PCLK_7         38
-#define CLK_GOUT_PERIC0_PCLK_8         39
-#define CLK_GOUT_PERIC0_PCLK_9         40
-#define CLK_GOUT_PERIC0_PCLK_10                41
-#define CLK_GOUT_PERIC0_PCLK_11                42
-
-#define PERIC0_NR_CLK                  43
+#define CLK_GOUT_PERIC0_IPCLK_11       31
+#define CLK_GOUT_PERIC0_PCLK_0         32
+#define CLK_GOUT_PERIC0_PCLK_1         33
+#define CLK_GOUT_PERIC0_PCLK_2         34
+#define CLK_GOUT_PERIC0_PCLK_3         35
+#define CLK_GOUT_PERIC0_PCLK_4         36
+#define CLK_GOUT_PERIC0_PCLK_5         37
+#define CLK_GOUT_PERIC0_PCLK_6         38
+#define CLK_GOUT_PERIC0_PCLK_7         39
+#define CLK_GOUT_PERIC0_PCLK_8         40
+#define CLK_GOUT_PERIC0_PCLK_9         41
+#define CLK_GOUT_PERIC0_PCLK_10                42
+#define CLK_GOUT_PERIC0_PCLK_11                43
+
+#define PERIC0_NR_CLK                  44
 
 /* CMU_PERIC1 */
 #define CLK_MOUT_PERIC1_BUS_USER       1
 #define CLK_GOUT_PERIC1_IPCLK_8                28
 #define CLK_GOUT_PERIC1_IPCLK_9                29
 #define CLK_GOUT_PERIC1_IPCLK_10       30
-#define CLK_GOUT_PERIC1_IPCLK_11       30
-#define CLK_GOUT_PERIC1_PCLK_0         31
-#define CLK_GOUT_PERIC1_PCLK_1         32
-#define CLK_GOUT_PERIC1_PCLK_2         33
-#define CLK_GOUT_PERIC1_PCLK_3         34
-#define CLK_GOUT_PERIC1_PCLK_4         35
-#define CLK_GOUT_PERIC1_PCLK_5         36
-#define CLK_GOUT_PERIC1_PCLK_6         37
-#define CLK_GOUT_PERIC1_PCLK_7         38
-#define CLK_GOUT_PERIC1_PCLK_8         39
-#define CLK_GOUT_PERIC1_PCLK_9         40
-#define CLK_GOUT_PERIC1_PCLK_10                41
-#define CLK_GOUT_PERIC1_PCLK_11                42
-
-#define PERIC1_NR_CLK                  43
+#define CLK_GOUT_PERIC1_IPCLK_11       31
+#define CLK_GOUT_PERIC1_PCLK_0         32
+#define CLK_GOUT_PERIC1_PCLK_1         33
+#define CLK_GOUT_PERIC1_PCLK_2         34
+#define CLK_GOUT_PERIC1_PCLK_3         35
+#define CLK_GOUT_PERIC1_PCLK_4         36
+#define CLK_GOUT_PERIC1_PCLK_5         37
+#define CLK_GOUT_PERIC1_PCLK_6         38
+#define CLK_GOUT_PERIC1_PCLK_7         39
+#define CLK_GOUT_PERIC1_PCLK_8         40
+#define CLK_GOUT_PERIC1_PCLK_9         41
+#define CLK_GOUT_PERIC1_PCLK_10                42
+#define CLK_GOUT_PERIC1_PCLK_11                43
+
+#define PERIC1_NR_CLK                  44
 
 /* CMU_PERIS */
 #define CLK_MOUT_PERIS_BUS_USER                1
diff --git a/include/dt-bindings/reset/mediatek,mt6795-resets.h b/include/dt-bindings/reset/mediatek,mt6795-resets.h
new file mode 100644 (file)
index 0000000..5464a4a
--- /dev/null
@@ -0,0 +1,53 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-2-Clause) */
+/*
+ * Copyright (c) 2022 Collabora Ltd.
+ * Author: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+ */
+
+#ifndef _DT_BINDINGS_RESET_CONTROLLER_MT6795
+#define _DT_BINDINGS_RESET_CONTROLLER_MT6795
+
+/* INFRACFG resets */
+#define MT6795_INFRA_RST0_SCPSYS_RST           0
+#define MT6795_INFRA_RST0_PMIC_WRAP_RST                1
+#define MT6795_INFRA_RST1_MIPI_DSI_RST         2
+#define MT6795_INFRA_RST1_MIPI_CSI_RST         3
+#define MT6795_INFRA_RST1_MM_IOMMU_RST         4
+
+/* MMSYS resets */
+#define MT6795_MMSYS_SW0_RST_B_SMI_COMMON      0
+#define MT6795_MMSYS_SW0_RST_B_SMI_LARB                1
+#define MT6795_MMSYS_SW0_RST_B_CAM_MDP         2
+#define MT6795_MMSYS_SW0_RST_B_MDP_RDMA0       3
+#define MT6795_MMSYS_SW0_RST_B_MDP_RDMA1       4
+#define MT6795_MMSYS_SW0_RST_B_MDP_RSZ0                5
+#define MT6795_MMSYS_SW0_RST_B_MDP_RSZ1                6
+#define MT6795_MMSYS_SW0_RST_B_MDP_RSZ2                7
+#define MT6795_MMSYS_SW0_RST_B_MDP_TDSHP0      8
+#define MT6795_MMSYS_SW0_RST_B_MDP_TDSHP1      9
+#define MT6795_MMSYS_SW0_RST_B_MDP_WDMA                10
+#define MT6795_MMSYS_SW0_RST_B_MDP_WROT0       11
+#define MT6795_MMSYS_SW0_RST_B_MDP_WROT1       12
+#define MT6795_MMSYS_SW0_RST_B_MDP_CROP                13
+
+/*  PERICFG resets */
+#define MT6795_PERI_NFI_SW_RST                 0
+#define MT6795_PERI_THERM_SW_RST               1
+#define MT6795_PERI_MSDC1_SW_RST               2
+
+/* TOPRGU resets */
+#define MT6795_TOPRGU_INFRA_SW_RST             0
+#define MT6795_TOPRGU_MM_SW_RST                        1
+#define MT6795_TOPRGU_MFG_SW_RST               2
+#define MT6795_TOPRGU_VENC_SW_RST              3
+#define MT6795_TOPRGU_VDEC_SW_RST              4
+#define MT6795_TOPRGU_IMG_SW_RST               5
+#define MT6795_TOPRGU_DDRPHY_SW_RST            6
+#define MT6795_TOPRGU_MD_SW_RST                        7
+#define MT6795_TOPRGU_INFRA_AO_SW_RST          8
+#define MT6795_TOPRGU_MD_LITE_SW_RST           9
+#define MT6795_TOPRGU_APMIXED_SW_RST           10
+#define MT6795_TOPRGU_PWRAP_SPI_CTL_RST                11
+#define MT6795_TOPRGU_SW_RST_NUM               12
+
+#endif  /* _DT_BINDINGS_RESET_CONTROLLER_MT6795 */
index 0b1937f..24ab363 100644 (file)
@@ -31,5 +31,8 @@
 #define MT8195_INFRA_RST0_THERM_CTRL_SWRST     0
 #define MT8195_INFRA_RST3_THERM_CTRL_PTP_SWRST 1
 #define MT8195_INFRA_RST4_THERM_CTRL_MCU_SWRST 2
+#define MT8195_INFRA_RST2_PCIE_P0_SWRST        3
+#define MT8195_INFRA_RST2_PCIE_P1_SWRST        4
+#define MT8195_INFRA_RST2_USBSIF_P1_SWRST      5
 
 #endif  /* _DT_BINDINGS_RESET_CONTROLLER_MT8195 */
index 305e18e..a854fa1 100644 (file)
@@ -974,6 +974,13 @@ struct clk *clk_register_mux_table(struct device *dev, const char *name,
        __clk_hw_register_mux((dev), NULL, (name), (num_parents), NULL, NULL, \
                              (parent_data), (flags), (reg), (shift),         \
                              BIT((width)) - 1, (clk_mux_flags), NULL, (lock))
+#define clk_hw_register_mux_parent_data_table(dev, name, parent_data,        \
+                                             num_parents, flags, reg, shift, \
+                                             width, clk_mux_flags, table,    \
+                                             lock)                           \
+       __clk_hw_register_mux((dev), NULL, (name), (num_parents), NULL, NULL, \
+                             (parent_data), (flags), (reg), (shift),         \
+                             BIT((width)) - 1, (clk_mux_flags), table, (lock))
 #define devm_clk_hw_register_mux(dev, name, parent_names, num_parents, flags, reg, \
                            shift, width, clk_mux_flags, lock)                \
        __devm_clk_hw_register_mux((dev), NULL, (name), (num_parents),        \
@@ -987,6 +994,13 @@ struct clk *clk_register_mux_table(struct device *dev, const char *name,
                                   (parent_hws), NULL, (flags), (reg),        \
                                   (shift), BIT((width)) - 1,                 \
                                   (clk_mux_flags), NULL, (lock))
+#define devm_clk_hw_register_mux_parent_data_table(dev, name, parent_data,    \
+                                             num_parents, flags, reg, shift, \
+                                             width, clk_mux_flags, table,    \
+                                             lock)                           \
+       __devm_clk_hw_register_mux((dev), NULL, (name), (num_parents), NULL,  \
+                             NULL, (parent_data), (flags), (reg), (shift),   \
+                             BIT((width)) - 1, (clk_mux_flags), table, (lock))
 
 int clk_mux_val_to_index(struct clk_hw *hw, const u32 *table, unsigned int flags,
                         unsigned int val);
index 8a7b5cd..f6ebab6 100644 (file)
@@ -28,13 +28,5 @@ int dm365_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgch
 int dm365_pll2_init(struct device *dev, void __iomem *base, struct regmap *cfgchip);
 int dm365_psc_init(struct device *dev, void __iomem *base);
 #endif
-#ifdef CONFIG_ARCH_DAVINCI_DM644x
-int dm644x_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip);
-int dm644x_psc_init(struct device *dev, void __iomem *base);
-#endif
-#ifdef CONFIG_ARCH_DAVINCI_DM646x
-int dm646x_pll1_init(struct device *dev, void __iomem *base, struct regmap *cfgchip);
-int dm646x_psc_init(struct device *dev, void __iomem *base);
-#endif
 
 #endif /* __LINUX_CLK_DAVINCI_PLL_H___ */
index 82c9d48..3ab8c07 100644 (file)
@@ -41,6 +41,7 @@ struct qcom_smd_rpm;
 #define QCOM_SMD_RPM_HWKM_CLK  0x6d6b7768
 #define QCOM_SMD_RPM_PKA_CLK   0x616b70
 #define QCOM_SMD_RPM_MCFG_CLK  0x6766636d
+#define QCOM_SMD_RPM_MMXI_CLK  0x69786d6d
 
 int qcom_rpm_smd_write(struct qcom_smd_rpm *rpm,
                       int state,