Merge branches 'clk-of', 'clk-samsung', 'clk-rockchip' and 'clk-qcom' into clk-next
authorStephen Boyd <sboyd@kernel.org>
Tue, 25 Apr 2023 18:52:25 +0000 (11:52 -0700)
committerStephen Boyd <sboyd@kernel.org>
Tue, 25 Apr 2023 18:52:25 +0000 (11:52 -0700)
* clk-of:
  clk: add missing of_node_put() in "assigned-clocks" property parsing

* clk-samsung:
  clk: samsung: exynos850: Make PMU_ALIVE_PCLK critical
  clk: samsung: Convert to platform remove callback returning void
  clk: samsung: exynos5433: Extract PM support to common ARM64 layer
  clk: samsung: Extract parent clock enabling to common function
  clk: samsung: Extract clocks registration to common function
  clk: samsung: exynos850: Add AUD and HSI main gate clocks
  clk: samsung: exynos850: Implement CMU_G3D domain
  clk: samsung: clk-pll: Implement pll0818x PLL type
  clk: samsung: Set dev in samsung_clk_init()
  clk: samsung: Don't pass reg_base to samsung_clk_register_pll()
  clk: samsung: Remove np argument from samsung_clk_init()
  dt-bindings: clock: exynos850: Add AUD and HSI main gate clocks
  dt-bindings: clock: exynos850: Add Exynos850 CMU_G3D

* clk-rockchip:
  clk: rockchip: rk3588: make gate linked clocks critical
  clk: rockchip: rk3399: allow clk_cifout to force clk_cifout_src to reparent

* clk-qcom: (57 commits)
  clk: qcom: gcc-sc8280xp: Add EMAC GDSCs
  clk: qcom: dispcc-qcm2290: Remove inexistent DSI1PHY clk
  clk: qcom: add the GPUCC driver for sa8775p
  dt-bindings: clock: qcom: describe the GPUCC clock for SA8775P
  clk: qcom: gcc-sm8350: fix PCIe PIPE clocks handling
  clk: qcom: lpassaudiocc-sc7280: Add required gdsc power domain clks in lpass_cc_sc7280_desc
  clk: qcom: lpasscc-sc7280: Skip qdsp6ss clock registration
  dt-bindings: clock: qcom,sc7280-lpasscc: Add qcom,adsp-pil-mode property
  clk: qcom: rpm: Use managed `of_clk_add_hw_provider()`
  clk: qcom: Add Global Clock Controller driver for IPQ9574
  dt-bindings: clock: Add ipq9574 clock and reset definitions
  clk: qcom: gpucc-sm6375: Configure CX_GDSC disable wait value
  clk: qcom: gcc-sm6115: Mark RCGs shared where applicable
  clk: qcom: dispcc-qcm2290: Add MDSS_CORE reset
  dt-bindings: clock: dispcc-qcm2290: Add MDSS_CORE reset
  clk: qcom: apss-ipq-pll: add support for IPQ5332
  dt-bindings: clock: qcom,a53pll: add IPQ5332 compatible
  clk: qcom: apss-ipq-pll: refactor the driver to accommodate different PLL types
  dt-bindings: mailbox: qcom,apcs-kpss-global: fix SDX55 'if' match
  dt-bindings: mailbox: qcom,apcs-kpss-global: correct SDX55 clocks
  ...

84 files changed:
Documentation/devicetree/bindings/arm/msm/qcom,kpss-acc.txt [deleted file]
Documentation/devicetree/bindings/arm/msm/qcom,kpss-gcc.txt [deleted file]
Documentation/devicetree/bindings/clock/qcom,a53pll.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-ipq4019.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/qcom,gcc-msm8909.yaml
Documentation/devicetree/bindings/clock/qcom,gcc-other.yaml
Documentation/devicetree/bindings/clock/qcom,gpucc.yaml
Documentation/devicetree/bindings/clock/qcom,ipq5332-gcc.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/qcom,ipq9574-gcc.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/qcom,kpss-acc-v1.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/qcom,kpss-gcc.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/qcom,rpmcc.yaml
Documentation/devicetree/bindings/clock/qcom,sc7280-lpasscc.yaml
Documentation/devicetree/bindings/clock/qcom,sm6115-gpucc.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/qcom,sm6125-gpucc.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/qcom,sm6375-gpucc.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/qcom,sm7150-gcc.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/samsung,exynos850-clock.yaml
Documentation/devicetree/bindings/mailbox/qcom,apcs-kpss-global.yaml
Documentation/devicetree/bindings/power/qcom,kpss-acc-v2.yaml [new file with mode: 0644]
drivers/clk/clk-conf.c
drivers/clk/qcom/Kconfig
drivers/clk/qcom/Makefile
drivers/clk/qcom/apcs-msm8916.c
drivers/clk/qcom/apcs-sdx55.c
drivers/clk/qcom/apss-ipq-pll.c
drivers/clk/qcom/clk-alpha-pll.c
drivers/clk/qcom/clk-alpha-pll.h
drivers/clk/qcom/clk-branch.c
drivers/clk/qcom/clk-branch.h
drivers/clk/qcom/clk-hfpll.c
drivers/clk/qcom/clk-krait.c
drivers/clk/qcom/clk-rpm.c
drivers/clk/qcom/clk-smd-rpm.c
drivers/clk/qcom/dispcc-qcm2290.c
drivers/clk/qcom/gcc-ipq4019.c
drivers/clk/qcom/gcc-ipq5332.c [new file with mode: 0644]
drivers/clk/qcom/gcc-ipq9574.c [new file with mode: 0644]
drivers/clk/qcom/gcc-msm8917.c [new file with mode: 0644]
drivers/clk/qcom/gcc-msm8960.c
drivers/clk/qcom/gcc-msm8996.c
drivers/clk/qcom/gcc-msm8998.c
drivers/clk/qcom/gcc-qcm2290.c
drivers/clk/qcom/gcc-sc8280xp.c
drivers/clk/qcom/gcc-sm6115.c
drivers/clk/qcom/gcc-sm6375.c
drivers/clk/qcom/gcc-sm7150.c [new file with mode: 0644]
drivers/clk/qcom/gcc-sm8350.c
drivers/clk/qcom/gpucc-sa8775p.c [new file with mode: 0644]
drivers/clk/qcom/gpucc-sm6115.c [new file with mode: 0644]
drivers/clk/qcom/gpucc-sm6125.c [new file with mode: 0644]
drivers/clk/qcom/gpucc-sm6375.c [new file with mode: 0644]
drivers/clk/qcom/lpassaudiocc-sc7280.c
drivers/clk/qcom/lpasscc-sc7280.c
drivers/clk/rockchip/clk-rk3399.c
drivers/clk/rockchip/clk-rk3588.c
drivers/clk/samsung/clk-exynos-arm64.c
drivers/clk/samsung/clk-exynos-arm64.h
drivers/clk/samsung/clk-exynos-audss.c
drivers/clk/samsung/clk-exynos-clkout.c
drivers/clk/samsung/clk-exynos4.c
drivers/clk/samsung/clk-exynos4412-isp.c
drivers/clk/samsung/clk-exynos5250.c
drivers/clk/samsung/clk-exynos5420.c
drivers/clk/samsung/clk-exynos5433.c
drivers/clk/samsung/clk-exynos850.c
drivers/clk/samsung/clk-pll.c
drivers/clk/samsung/clk-pll.h
drivers/clk/samsung/clk-s3c64xx.c
drivers/clk/samsung/clk-s5pv210.c
drivers/clk/samsung/clk.c
drivers/clk/samsung/clk.h
include/dt-bindings/clock/exynos850.h
include/dt-bindings/clock/qcom,dispcc-qcm2290.h
include/dt-bindings/clock/qcom,gcc-msm8917.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,gcc-sc8280xp.h
include/dt-bindings/clock/qcom,ipq5332-gcc.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,ipq9574-gcc.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,sa8775p-gpucc.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,sm6115-gpucc.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,sm6125-gpucc.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,sm6375-gpucc.h [new file with mode: 0644]
include/dt-bindings/clock/qcom,sm7150-gcc.h [new file with mode: 0644]
include/dt-bindings/reset/qcom,ipq9574-gcc.h [new file with mode: 0644]

diff --git a/Documentation/devicetree/bindings/arm/msm/qcom,kpss-acc.txt b/Documentation/devicetree/bindings/arm/msm/qcom,kpss-acc.txt
deleted file mode 100644 (file)
index 7f69636..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-Krait Processor Sub-system (KPSS) Application Clock Controller (ACC)
-
-The KPSS ACC provides clock, power domain, and reset control to a Krait CPU.
-There is one ACC register region per CPU within the KPSS remapped region as
-well as an alias register region that remaps accesses to the ACC associated
-with the CPU accessing the region.
-
-PROPERTIES
-
-- compatible:
-       Usage: required
-       Value type: <string>
-       Definition: should be one of:
-                       "qcom,kpss-acc-v1"
-                       "qcom,kpss-acc-v2"
-
-- reg:
-       Usage: required
-       Value type: <prop-encoded-array>
-       Definition: the first element specifies the base address and size of
-                   the register region. An optional second element specifies
-                   the base address and size of the alias register region.
-
-- clocks:
-        Usage: required
-        Value type: <prop-encoded-array>
-        Definition: reference to the pll parents.
-
-- clock-names:
-        Usage: required
-        Value type: <stringlist>
-        Definition: must be "pll8_vote", "pxo".
-
-- clock-output-names:
-       Usage: optional
-       Value type: <string>
-       Definition: Name of the output clock. Typically acpuX_aux where X is a
-                   CPU number starting at 0.
-
-Example:
-
-       clock-controller@2088000 {
-               compatible = "qcom,kpss-acc-v2";
-               reg = <0x02088000 0x1000>,
-                     <0x02008000 0x1000>;
-               clocks = <&gcc PLL8_VOTE>, <&gcc PXO_SRC>;
-               clock-names = "pll8_vote", "pxo";
-               clock-output-names = "acpu0_aux";
-       };
diff --git a/Documentation/devicetree/bindings/arm/msm/qcom,kpss-gcc.txt b/Documentation/devicetree/bindings/arm/msm/qcom,kpss-gcc.txt
deleted file mode 100644 (file)
index e628758..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-Krait Processor Sub-system (KPSS) Global Clock Controller (GCC)
-
-PROPERTIES
-
-- compatible:
-       Usage: required
-       Value type: <string>
-       Definition: should be one of the following. The generic compatible
-                       "qcom,kpss-gcc" should also be included.
-                       "qcom,kpss-gcc-ipq8064", "qcom,kpss-gcc"
-                       "qcom,kpss-gcc-apq8064", "qcom,kpss-gcc"
-                       "qcom,kpss-gcc-msm8974", "qcom,kpss-gcc"
-                       "qcom,kpss-gcc-msm8960", "qcom,kpss-gcc"
-
-- reg:
-       Usage: required
-       Value type: <prop-encoded-array>
-       Definition: base address and size of the register region
-
-- clocks:
-       Usage: required
-       Value type: <prop-encoded-array>
-       Definition: reference to the pll parents.
-
-- clock-names:
-       Usage: required
-       Value type: <stringlist>
-       Definition: must be "pll8_vote", "pxo".
-
-- clock-output-names:
-       Usage: required
-       Value type: <string>
-       Definition: Name of the output clock. Typically acpu_l2_aux indicating
-                   an L2 cache auxiliary clock.
-
-Example:
-
-       l2cc: clock-controller@2011000 {
-               compatible = "qcom,kpss-gcc-ipq8064", "qcom,kpss-gcc";
-               reg = <0x2011000 0x1000>;
-               clocks = <&gcc PLL8_VOTE>, <&gcc PXO_SRC>;
-               clock-names = "pll8_vote", "pxo";
-               clock-output-names = "acpu_l2_aux";
-       };
index 525ebaa93c8572aa3731c1528f1cbadf41a90139..3b6169f3015408d71fabab597f7d8f6a618cec3f 100644 (file)
@@ -16,6 +16,7 @@ description:
 properties:
   compatible:
     enum:
+      - qcom,ipq5332-a53pll
       - qcom,ipq6018-a53pll
       - qcom,ipq8074-a53pll
       - qcom,msm8916-a53pll
diff --git a/Documentation/devicetree/bindings/clock/qcom,gcc-ipq4019.yaml b/Documentation/devicetree/bindings/clock/qcom,gcc-ipq4019.yaml
new file mode 100644 (file)
index 0000000..6ebaef2
--- /dev/null
@@ -0,0 +1,53 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/qcom,gcc-ipq4019.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm Global Clock & Reset Controller on IPQ4019
+
+maintainers:
+  - Stephen Boyd <sboyd@kernel.org>
+  - Taniya Das <tdas@codeaurora.org>
+  - Robert Marko <robert.markoo@sartura.hr>
+
+description: |
+  Qualcomm global clock control module provides the clocks, resets and power
+  domains on IPQ4019.
+
+  See also:: include/dt-bindings/clock/qcom,gcc-ipq4019.h
+
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+properties:
+  compatible:
+    const: qcom,gcc-ipq4019
+
+  clocks:
+    items:
+      - description: board XO clock
+      - description: sleep clock
+
+  clock-names:
+    items:
+      - const: xo
+      - const: sleep_clk
+
+required:
+  - compatible
+
+unevaluatedProperties: false
+
+examples:
+  - |
+    clock-controller@1800000 {
+      compatible = "qcom,gcc-ipq4019";
+      reg = <0x1800000 0x60000>;
+      #clock-cells = <1>;
+      #power-domain-cells = <1>;
+      #reset-cells = <1>;
+      clocks = <&xo>, <&sleep_clk>;
+      clock-names = "xo", "sleep_clk";
+    };
+...
index 6279a59c2e20bea5203a9071b44de3c28548593a..b91462587df50ee1e8d53c35319ecaf29dacc3e3 100644 (file)
@@ -4,20 +4,25 @@
 $id: http://devicetree.org/schemas/clock/qcom,gcc-msm8909.yaml#
 $schema: http://devicetree.org/meta-schemas/core.yaml#
 
-title: Qualcomm Global Clock & Reset Controller on MSM8909
+title: Qualcomm Global Clock & Reset Controller on MSM8909, MSM8917 and QM215
 
 maintainers:
   - Stephan Gerhold <stephan@gerhold.net>
 
 description: |
   Qualcomm global clock control module provides the clocks, resets and power
-  domains on MSM8909.
+  domains on MSM8909, MSM8917 or QM215.
 
-  See also:: include/dt-bindings/clock/qcom,gcc-msm8909.h
+  See also::
+    include/dt-bindings/clock/qcom,gcc-msm8909.h
+    include/dt-bindings/clock/qcom,gcc-msm8917.h
 
 properties:
   compatible:
-    const: qcom,gcc-msm8909
+    enum:
+      - qcom,gcc-msm8909
+      - qcom,gcc-msm8917
+      - qcom,gcc-qm215
 
   clocks:
     items:
index 2e8acca64af1c1213e8504f9b4f8ff07796a2103..ae01e7749534244ac4d8a8fed8c92371a0b56f4d 100644 (file)
@@ -15,7 +15,6 @@ description: |
   domains.
 
   See also::
-    include/dt-bindings/clock/qcom,gcc-ipq4019.h
     include/dt-bindings/clock/qcom,gcc-ipq6018.h
     include/dt-bindings/reset/qcom,gcc-ipq6018.h
     include/dt-bindings/clock/qcom,gcc-msm8953.h
@@ -29,7 +28,6 @@ allOf:
 properties:
   compatible:
     enum:
-      - qcom,gcc-ipq4019
       - qcom,gcc-ipq6018
       - qcom,gcc-mdm9607
       - qcom,gcc-msm8953
index db53eb288995395dd2bb87a2bc0741555a8de287..1e3dc9deded96a8c328782deea0c4d075af9611f 100644 (file)
@@ -15,6 +15,7 @@ description: |
 
   See also::
     include/dt-bindings/clock/qcom,gpucc-sdm845.h
+    include/dt-bindings/clock/qcom,gpucc-sa8775p.h
     include/dt-bindings/clock/qcom,gpucc-sc7180.h
     include/dt-bindings/clock/qcom,gpucc-sc7280.h
     include/dt-bindings/clock/qcom,gpucc-sc8280xp.h
@@ -27,6 +28,7 @@ properties:
   compatible:
     enum:
       - qcom,sdm845-gpucc
+      - qcom,sa8775p-gpucc
       - qcom,sc7180-gpucc
       - qcom,sc7280-gpucc
       - qcom,sc8180x-gpucc
diff --git a/Documentation/devicetree/bindings/clock/qcom,ipq5332-gcc.yaml b/Documentation/devicetree/bindings/clock/qcom,ipq5332-gcc.yaml
new file mode 100644 (file)
index 0000000..718fe06
--- /dev/null
@@ -0,0 +1,53 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/qcom,ipq5332-gcc.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm Global Clock & Reset Controller on IPQ5332
+
+maintainers:
+  - Bjorn Andersson <andersson@kernel.org>
+
+description: |
+  Qualcomm global clock control module provides the clocks, resets and power
+  domains on IPQ5332.
+
+  See also:: include/dt-bindings/clock/qcom,gcc-ipq5332.h
+
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+properties:
+  compatible:
+    const: qcom,ipq5332-gcc
+
+  clocks:
+    items:
+      - description: Board XO clock source
+      - description: Sleep clock source
+      - description: PCIE 2lane PHY pipe clock source
+      - description: PCIE 2lane x1 PHY pipe clock source (For second lane)
+      - description: USB PCIE wrapper pipe clock source
+
+required:
+  - compatible
+  - clocks
+
+unevaluatedProperties: false
+
+examples:
+  - |
+    clock-controller@1800000 {
+      compatible = "qcom,ipq5332-gcc";
+      reg = <0x01800000 0x80000>;
+      clocks = <&xo_board>,
+               <&sleep_clk>,
+               <&pcie_2lane_phy_pipe_clk>,
+               <&pcie_2lane_phy_pipe_clk_x1>,
+               <&usb_pcie_wrapper_pipe_clk>;
+      #clock-cells = <1>;
+      #power-domain-cells = <1>;
+      #reset-cells = <1>;
+    };
+...
diff --git a/Documentation/devicetree/bindings/clock/qcom,ipq9574-gcc.yaml b/Documentation/devicetree/bindings/clock/qcom,ipq9574-gcc.yaml
new file mode 100644 (file)
index 0000000..afc68eb
--- /dev/null
@@ -0,0 +1,61 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/qcom,ipq9574-gcc.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm Global Clock & Reset Controller on IPQ9574
+
+maintainers:
+  - Anusha Rao <quic_anusha@quicinc.com>
+
+description: |
+  Qualcomm global clock control module provides the clocks, resets and power
+  domains on IPQ9574
+
+  See also::
+    include/dt-bindings/clock/qcom,ipq9574-gcc.h
+    include/dt-bindings/reset/qcom,ipq9574-gcc.h
+
+properties:
+  compatible:
+    const: qcom,ipq9574-gcc
+
+  clocks:
+    items:
+      - description: Board XO source
+      - description: Sleep clock source
+      - description: Bias PLL ubi clock source
+      - description: PCIE30 PHY0 pipe clock source
+      - description: PCIE30 PHY1 pipe clock source
+      - description: PCIE30 PHY2 pipe clock source
+      - description: PCIE30 PHY3 pipe clock source
+      - description: USB3 PHY pipe clock source
+
+required:
+  - compatible
+  - clocks
+
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
+
+examples:
+  - |
+    clock-controller@1800000 {
+      compatible = "qcom,ipq9574-gcc";
+      reg = <0x01800000 0x80000>;
+      clocks = <&xo_board_clk>,
+               <&sleep_clk>,
+               <&bias_pll_ubi_nc_clk>,
+               <&pcie30_phy0_pipe_clk>,
+               <&pcie30_phy1_pipe_clk>,
+               <&pcie30_phy2_pipe_clk>,
+               <&pcie30_phy3_pipe_clk>,
+               <&usb3phy_0_cc_pipe_clk>;
+      #clock-cells = <1>;
+      #reset-cells = <1>;
+      #power-domain-cells = <1>;
+    };
+...
diff --git a/Documentation/devicetree/bindings/clock/qcom,kpss-acc-v1.yaml b/Documentation/devicetree/bindings/clock/qcom,kpss-acc-v1.yaml
new file mode 100644 (file)
index 0000000..a466e4e
--- /dev/null
@@ -0,0 +1,72 @@
+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/qcom,kpss-acc-v1.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Krait Processor Sub-system (KPSS) Application Clock Controller (ACC) v1
+
+maintainers:
+  - Christian Marangi <ansuelsmth@gmail.com>
+
+description:
+  The KPSS ACC provides clock, power domain, and reset control to a Krait CPU.
+  There is one ACC register region per CPU within the KPSS remapped region as
+  well as an alias register region that remaps accesses to the ACC associated
+  with the CPU accessing the region. ACC v1 is currently used as a
+  clock-controller for enabling the cpu and hanling the aux clocks.
+
+properties:
+  compatible:
+    const: qcom,kpss-acc-v1
+
+  reg:
+    items:
+      - description: Base address and size of the register region
+      - description: Optional base address and size of the alias register region
+    minItems: 1
+
+  clocks:
+    minItems: 2
+    maxItems: 2
+
+  clock-names:
+    items:
+      - const: pll8_vote
+      - const: pxo
+
+  clock-output-names:
+    description: Name of the aux clock. Krait can have at most 4 cpu.
+    enum:
+      - acpu0_aux
+      - acpu1_aux
+      - acpu2_aux
+      - acpu3_aux
+
+  '#clock-cells':
+    const: 0
+
+required:
+  - compatible
+  - reg
+  - clocks
+  - clock-names
+  - clock-output-names
+  - '#clock-cells'
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/qcom,gcc-ipq806x.h>
+
+    clock-controller@2088000 {
+      compatible = "qcom,kpss-acc-v1";
+      reg = <0x02088000 0x1000>, <0x02008000 0x1000>;
+      clocks = <&gcc PLL8_VOTE>, <&pxo_board>;
+      clock-names = "pll8_vote", "pxo";
+      clock-output-names = "acpu0_aux";
+      #clock-cells = <0>;
+    };
+
+...
diff --git a/Documentation/devicetree/bindings/clock/qcom,kpss-gcc.yaml b/Documentation/devicetree/bindings/clock/qcom,kpss-gcc.yaml
new file mode 100644 (file)
index 0000000..88b7672
--- /dev/null
@@ -0,0 +1,88 @@
+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/qcom,kpss-gcc.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Krait Processor Sub-system (KPSS) Global Clock Controller (GCC)
+
+maintainers:
+  - Christian Marangi <ansuelsmth@gmail.com>
+
+description:
+  Krait Processor Sub-system (KPSS) Global Clock Controller (GCC). Used
+  to control L2 mux (in the current implementation) and provide access
+  to the kpss-gcc registers.
+
+properties:
+  compatible:
+    items:
+      - enum:
+          - qcom,kpss-gcc-ipq8064
+          - qcom,kpss-gcc-apq8064
+          - qcom,kpss-gcc-msm8974
+          - qcom,kpss-gcc-msm8960
+          - qcom,kpss-gcc-msm8660
+          - qcom,kpss-gcc-mdm9615
+      - const: qcom,kpss-gcc
+      - const: syscon
+
+  reg:
+    maxItems: 1
+
+  clocks:
+    minItems: 2
+    maxItems: 2
+
+  clock-names:
+    items:
+      - const: pll8_vote
+      - const: pxo
+
+  '#clock-cells':
+    const: 0
+
+required:
+  - compatible
+  - reg
+
+if:
+  properties:
+    compatible:
+      contains:
+        enum:
+          - qcom,kpss-gcc-ipq8064
+          - qcom,kpss-gcc-apq8064
+          - qcom,kpss-gcc-msm8974
+          - qcom,kpss-gcc-msm8960
+then:
+  required:
+    - clocks
+    - clock-names
+    - '#clock-cells'
+else:
+  properties:
+    clock: false
+    clock-names: false
+    '#clock-cells': false
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/qcom,gcc-ipq806x.h>
+
+    clock-controller@2011000 {
+      compatible = "qcom,kpss-gcc-ipq8064", "qcom,kpss-gcc", "syscon";
+      reg = <0x2011000 0x1000>;
+      clocks = <&gcc PLL8_VOTE>, <&pxo_board>;
+      clock-names = "pll8_vote", "pxo";
+      #clock-cells = <0>;
+    };
+
+  - |
+    clock-controller@2011000 {
+      compatible = "qcom,kpss-gcc-mdm9615", "qcom,kpss-gcc", "syscon";
+      reg = <0x02011000 0x1000>;
+    };
+...
index 2a95bf8664f9fa8c6dd661ae94590aa11a86948c..3665dd30604a2fe3efadace76aa0a3bd4b0828c1 100644 (file)
@@ -31,6 +31,7 @@ properties:
           - qcom,rpmcc-msm8660
           - qcom,rpmcc-msm8909
           - qcom,rpmcc-msm8916
+          - qcom,rpmcc-msm8917
           - qcom,rpmcc-msm8936
           - qcom,rpmcc-msm8953
           - qcom,rpmcc-msm8974
@@ -107,6 +108,7 @@ allOf:
               - qcom,rpmcc-mdm9607
               - qcom,rpmcc-msm8226
               - qcom,rpmcc-msm8916
+              - qcom,rpmcc-msm8917
               - qcom,rpmcc-msm8936
               - qcom,rpmcc-msm8953
               - qcom,rpmcc-msm8974
index 6151fdebbff8d43e7fce1e7b9bf5f278810d49a7..97c6bd96e0cb8fa98cd02ff48151ec15b2fd24a2 100644 (file)
@@ -41,6 +41,12 @@ properties:
       - const: qdsp6ss
       - const: top_cc
 
+  qcom,adsp-pil-mode:
+    description:
+      Indicates if the LPASS would be brought out of reset using
+      remoteproc peripheral loader.
+    type: boolean
+
 required:
   - compatible
   - reg
@@ -60,6 +66,7 @@ examples:
       reg-names = "qdsp6ss", "top_cc";
       clocks = <&gcc GCC_CFG_NOC_LPASS_CLK>;
       clock-names = "iface";
+      qcom,adsp-pil-mode;
       #clock-cells = <1>;
     };
 ...
diff --git a/Documentation/devicetree/bindings/clock/qcom,sm6115-gpucc.yaml b/Documentation/devicetree/bindings/clock/qcom,sm6115-gpucc.yaml
new file mode 100644 (file)
index 0000000..cf19f44
--- /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,sm6115-gpucc.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm Graphics Clock & Reset Controller on SM6115
+
+maintainers:
+  - Konrad Dybcio <konrad.dybcio@linaro.org>
+
+description: |
+  Qualcomm graphics clock control module provides clocks, resets and power
+  domains on Qualcomm SoCs.
+
+  See also:: include/dt-bindings/clock/qcom,sm6115-gpucc.h
+
+properties:
+  compatible:
+    enum:
+      - qcom,sm6115-gpucc
+
+  clocks:
+    items:
+      - description: Board XO source
+      - description: GPLL0 main branch source
+      - description: GPLL0 main div source
+
+required:
+  - compatible
+  - clocks
+
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/qcom,gcc-sm6115.h>
+    #include <dt-bindings/clock/qcom,rpmcc.h>
+
+    soc {
+        #address-cells = <1>;
+        #size-cells = <1>;
+
+        clock-controller@5990000 {
+            compatible = "qcom,sm6115-gpucc";
+            reg = <0x05990000 0x9000>;
+            clocks = <&rpmcc RPM_SMD_XO_CLK_SRC>,
+                     <&gcc GCC_GPU_GPLL0_CLK_SRC>,
+                     <&gcc GCC_GPU_GPLL0_DIV_CLK_SRC>;
+            #clock-cells = <1>;
+            #reset-cells = <1>;
+            #power-domain-cells = <1>;
+        };
+    };
+...
diff --git a/Documentation/devicetree/bindings/clock/qcom,sm6125-gpucc.yaml b/Documentation/devicetree/bindings/clock/qcom,sm6125-gpucc.yaml
new file mode 100644 (file)
index 0000000..374a184
--- /dev/null
@@ -0,0 +1,64 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/qcom,sm6125-gpucc.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm Graphics Clock & Reset Controller on SM6125
+
+maintainers:
+  - Konrad Dybcio <konrad.dybcio@linaro.org>
+
+description: |
+  Qualcomm graphics clock control module provides clocks and power domains on
+  Qualcomm SoCs.
+
+  See also:: include/dt-bindings/clock/qcom,sm6125-gpucc.h
+
+properties:
+  compatible:
+    enum:
+      - qcom,sm6125-gpucc
+
+  clocks:
+    items:
+      - description: Board XO source
+      - description: GPLL0 main branch source
+
+  '#clock-cells':
+    const: 1
+
+  '#power-domain-cells':
+    const: 1
+
+  reg:
+    maxItems: 1
+
+required:
+  - compatible
+  - reg
+  - clocks
+  - '#clock-cells'
+  - '#power-domain-cells'
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/qcom,gcc-sm6125.h>
+    #include <dt-bindings/clock/qcom,rpmcc.h>
+
+    soc {
+        #address-cells = <1>;
+        #size-cells = <1>;
+
+        clock-controller@5990000 {
+            compatible = "qcom,sm6125-gpucc";
+            reg = <0x05990000 0x9000>;
+            clocks = <&rpmcc RPM_SMD_XO_CLK_SRC>,
+                     <&gcc GCC_GPU_GPLL0_CLK_SRC>;
+            #clock-cells = <1>;
+            #power-domain-cells = <1>;
+        };
+    };
+...
diff --git a/Documentation/devicetree/bindings/clock/qcom,sm6375-gpucc.yaml b/Documentation/devicetree/bindings/clock/qcom,sm6375-gpucc.yaml
new file mode 100644 (file)
index 0000000..b480ead
--- /dev/null
@@ -0,0 +1,60 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/qcom,sm6375-gpucc.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm Graphics Clock & Reset Controller on SM6375
+
+maintainers:
+  - Konrad Dybcio <konrad.dybcio@linaro.org>
+
+description: |
+  Qualcomm graphics clock control module provides clocks, resets and power
+  domains on Qualcomm SoCs.
+
+  See also:: include/dt-bindings/clock/qcom,sm6375-gpucc.h
+
+properties:
+  compatible:
+    enum:
+      - qcom,sm6375-gpucc
+
+  clocks:
+    items:
+      - description: Board XO source
+      - description: GPLL0 main branch source
+      - description: GPLL0 div branch source
+      - description: SNoC DVM GFX source
+
+required:
+  - compatible
+  - clocks
+
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/qcom,sm6375-gcc.h>
+    #include <dt-bindings/clock/qcom,rpmcc.h>
+
+    soc {
+        #address-cells = <2>;
+        #size-cells = <2>;
+
+        clock-controller@5990000 {
+            compatible = "qcom,sm6375-gpucc";
+            reg = <0 0x05990000 0 0x9000>;
+            clocks = <&rpmcc RPM_SMD_XO_CLK_SRC>,
+                     <&gcc GCC_GPU_GPLL0_CLK_SRC>,
+                     <&gcc GCC_GPU_GPLL0_DIV_CLK_SRC>,
+                     <&gcc GCC_GPU_SNOC_DVM_GFX_CLK>;
+            #clock-cells = <1>;
+            #reset-cells = <1>;
+            #power-domain-cells = <1>;
+        };
+    };
+...
diff --git a/Documentation/devicetree/bindings/clock/qcom,sm7150-gcc.yaml b/Documentation/devicetree/bindings/clock/qcom,sm7150-gcc.yaml
new file mode 100644 (file)
index 0000000..0eb76d9
--- /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,sm7150-gcc.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm Global Clock & Reset Controller on SM7150
+
+maintainers:
+  - Bjorn Andersson <andersson@kernel.org>
+  - Danila Tikhonov <danila@jiaxyga.com>
+  - David Wronek <davidwronek@gmail.com>
+
+description: |
+  Qualcomm global clock control module provides the clocks, resets and power
+  domains on SM7150
+
+  See also:: include/dt-bindings/clock/qcom,sm7150-gcc.h
+
+properties:
+  compatible:
+    const: qcom,sm7150-gcc
+
+  clocks:
+    items:
+      - description: Board XO source
+      - description: Board XO Active-Only source
+      - description: Sleep clock source
+
+required:
+  - compatible
+  - clocks
+
+allOf:
+  - $ref: qcom,gcc.yaml#
+
+unevaluatedProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/qcom,rpmh.h>
+    clock-controller@100000 {
+      compatible = "qcom,sm7150-gcc";
+      reg = <0x00100000 0x001f0000>;
+      clocks = <&rpmhcc RPMH_CXO_CLK>,
+               <&rpmhcc RPMH_CXO_CLK_A>,
+               <&sleep_clk>;
+      #clock-cells = <1>;
+      #reset-cells = <1>;
+      #power-domain-cells = <1>;
+    };
+...
index 141cf173f87d48f4ee9bcc7d42ef468ce14402f2..8aa87b8c1b33018f3f2b9d228688852fb4b2b3ec 100644 (file)
@@ -37,6 +37,7 @@ properties:
       - samsung,exynos850-cmu-cmgp
       - samsung,exynos850-cmu-core
       - samsung,exynos850-cmu-dpu
+      - samsung,exynos850-cmu-g3d
       - samsung,exynos850-cmu-hsi
       - samsung,exynos850-cmu-is
       - samsung,exynos850-cmu-mfcmscl
@@ -169,6 +170,24 @@ allOf:
             - const: oscclk
             - const: dout_dpu
 
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: samsung,exynos850-cmu-g3d
+
+    then:
+      properties:
+        clocks:
+          items:
+            - description: External reference clock (26 MHz)
+            - description: G3D clock (from CMU_TOP)
+
+        clock-names:
+          items:
+            - const: oscclk
+            - const: dout_g3d_switch
+
   - if:
       properties:
         compatible:
index d888ead092825084a9b764a95804c8da94f42ece..4d2f408a5efb0fee32306ba94e1b455568881840 100644 (file)
@@ -91,20 +91,21 @@ allOf:
   - if:
       properties:
         compatible:
-          enum:
-            - qcom,sdx55-apcs-gcc
+          contains:
+            enum:
+              - qcom,sdx55-apcs-gcc
     then:
       properties:
         clocks:
           items:
+            - description: reference clock
             - description: primary pll parent of the clock driver
             - description: auxiliary parent
-            - description: reference clock
         clock-names:
           items:
+            - const: ref
             - const: pll
             - const: aux
-            - const: ref
   - if:
       properties:
         compatible:
diff --git a/Documentation/devicetree/bindings/power/qcom,kpss-acc-v2.yaml b/Documentation/devicetree/bindings/power/qcom,kpss-acc-v2.yaml
new file mode 100644 (file)
index 0000000..202a5d5
--- /dev/null
@@ -0,0 +1,42 @@
+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/power/qcom,kpss-acc-v2.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Krait Processor Sub-system (KPSS) Application Clock Controller (ACC) v2
+
+maintainers:
+  - Christian Marangi <ansuelsmth@gmail.com>
+
+description:
+  The KPSS ACC provides clock, power manager, and reset control to a Krait CPU.
+  There is one ACC register region per CPU within the KPSS remapped region as
+  well as an alias register region that remaps accesses to the ACC associated
+  with the CPU accessing the region. ACC v2 is currently used as a
+  power-manager for enabling the cpu.
+
+properties:
+  compatible:
+    const: qcom,kpss-acc-v2
+
+  reg:
+    items:
+      - description: Base address and size of the register region
+      - description: Optional base address and size of the alias register region
+    minItems: 1
+
+required:
+  - compatible
+  - reg
+
+additionalProperties: false
+
+examples:
+  - |
+    power-manager@f9088000 {
+      compatible = "qcom,kpss-acc-v2";
+      reg = <0xf9088000 0x1000>,
+            <0xf9008000 0x1000>;
+    };
+...
index 2ef819606c4170caed8fd8d059ad97e3719599bd..1a4e6340f95ce4c276bc7df61c7c2590e0ad1d99 100644 (file)
@@ -33,9 +33,12 @@ static int __set_clk_parents(struct device_node *node, bool clk_supplier)
                        else
                                return rc;
                }
-               if (clkspec.np == node && !clk_supplier)
+               if (clkspec.np == node && !clk_supplier) {
+                       of_node_put(clkspec.np);
                        return 0;
+               }
                pclk = of_clk_get_from_provider(&clkspec);
+               of_node_put(clkspec.np);
                if (IS_ERR(pclk)) {
                        if (PTR_ERR(pclk) != -EPROBE_DEFER)
                                pr_warn("clk: couldn't get parent clock %d for %pOF\n",
@@ -48,10 +51,12 @@ static int __set_clk_parents(struct device_node *node, bool clk_supplier)
                if (rc < 0)
                        goto err;
                if (clkspec.np == node && !clk_supplier) {
+                       of_node_put(clkspec.np);
                        rc = 0;
                        goto err;
                }
                clk = of_clk_get_from_provider(&clkspec);
+               of_node_put(clkspec.np);
                if (IS_ERR(clk)) {
                        if (PTR_ERR(clk) != -EPROBE_DEFER)
                                pr_warn("clk: couldn't get assigned clock %d for %pOF\n",
@@ -93,10 +98,13 @@ static int __set_clk_rates(struct device_node *node, bool clk_supplier)
                                else
                                        return rc;
                        }
-                       if (clkspec.np == node && !clk_supplier)
+                       if (clkspec.np == node && !clk_supplier) {
+                               of_node_put(clkspec.np);
                                return 0;
+                       }
 
                        clk = of_clk_get_from_provider(&clkspec);
+                       of_node_put(clkspec.np);
                        if (IS_ERR(clk)) {
                                if (PTR_ERR(clk) != -EPROBE_DEFER)
                                        pr_warn("clk: couldn't get clock %d for %pOF\n",
index 5ab4b7dfe3c20abf7cc53af9f755b1a54c057de7..12be3e2371b3062579454ec360c1e6d1a688938d 100644 (file)
@@ -141,6 +141,14 @@ config IPQ_GCC_4019
          Say Y if you want to use peripheral devices such as UART, SPI,
          i2c, USB, SD/eMMC, etc.
 
+config IPQ_GCC_5332
+       tristate "IPQ5332 Global Clock Controller"
+       depends on ARM64 || COMPILE_TEST
+       help
+         Support for the global clock controller on ipq5332 devices.
+         Say Y if you want to use peripheral devices such as UART, SPI,
+         i2c, USB, SD/eMMC, etc.
+
 config IPQ_GCC_6018
        tristate "IPQ6018 Global Clock Controller"
        help
@@ -173,6 +181,14 @@ config IPQ_GCC_8074
          i2c, USB, SD/eMMC, etc. Select this for the root clock
          of ipq8074.
 
+config IPQ_GCC_9574
+       tristate "IPQ9574 Global Clock Controller"
+       help
+         Support for global clock controller on ipq9574 devices.
+         Say Y if you want to use peripheral devices such as UART, SPI,
+         i2c, USB, SD/eMMC, etc. Select this for the root clock
+         of ipq9574.
+
 config MSM_GCC_8660
        tristate "MSM8660 Global Clock Controller"
        help
@@ -196,6 +212,16 @@ config MSM_GCC_8916
          Say Y if you want to use devices such as UART, SPI i2c, USB,
          SD/eMMC, display, graphics, camera etc.
 
+config MSM_GCC_8917
+       tristate "MSM8917/QM215 Global Clock Controller"
+       depends on ARM64 || COMPILE_TEST
+       select QCOM_GDSC
+       help
+         Support for the global clock controller on msm8917 and qm215
+         devices.
+         Say Y if you want to use devices such as UART, SPI i2c, USB,
+         SD/eMMC, display, graphics, camera etc.
+
 config MSM_GCC_8939
        tristate "MSM8939 Global Clock Controller"
        select QCOM_GDSC
@@ -419,6 +445,15 @@ config SA_GCC_8775P
          Say Y if you want to use peripheral devices such as UART, SPI,
          I2C, USB, UFS, SDCC, etc.
 
+config SA_GPUCC_8775P
+       tristate "SA8775P Graphics clock controller"
+       select QCOM_GDSC
+       select SA_GCC_8775P
+       help
+         Support for the graphics clock controller on SA8775P devices.
+         Say Y if you want to support graphics controller devices and
+         functionality such as 3D graphics.
+
 config SC_GCC_7180
        tristate "SC7180 Global Clock Controller"
        select QCOM_GDSC
@@ -759,6 +794,14 @@ config SM_GCC_6375
          Say Y if you want to use peripheral devices such as UART,
          SPI, I2C, USB, SD/UFS etc.
 
+config SM_GCC_7150
+       tristate "SM7150 Global Clock Controller"
+       select QCOM_GDSC
+       help
+         Support for the global clock controller on SM7150 devices.
+         Say Y if you want to use peripheral devices such as UART,
+         SPI, I2C, USB, SD/UFS, PCIe etc.
+
 config SM_GCC_8150
        tristate "SM8150 Global Clock Controller"
        help
@@ -798,6 +841,33 @@ config SM_GCC_8550
          Say Y if you want to use peripheral devices such as UART,
          SPI, I2C, USB, SD/UFS, PCIe etc.
 
+config SM_GPUCC_6115
+       tristate "SM6115 Graphics Clock Controller"
+       select SM_GCC_6115
+       depends on ARM64 || COMPILE_TEST
+       help
+         Support for the graphics clock controller on SM6115 devices.
+         Say Y if you want to support graphics controller devices and
+         functionality such as 3D graphics.
+
+config SM_GPUCC_6125
+       tristate "SM6125 Graphics Clock Controller"
+       select SM_GCC_6125
+       depends on ARM64 || COMPILE_TEST
+       help
+         Support for the graphics clock controller on SM6125 devices.
+         Say Y if you want to support graphics controller devices and
+         functionality such as 3D graphics.
+
+config SM_GPUCC_6375
+       tristate "SM6375 Graphics Clock Controller"
+       select SM_GCC_6375
+       depends on ARM64 || COMPILE_TEST
+       help
+         Support for the graphics clock controller on SM6375 devices.
+         Say Y if you want to support graphics controller devices and
+         functionality such as 3D graphics.
+
 config SM_GPUCC_6350
        tristate "SM6350 Graphics Clock Controller"
        select SM_GCC_6350
index c743805a9cbb8f6fb314689286c4124e3c4cf323..9ff4c373ad95aca083b64540509a5027043a66f4 100644 (file)
@@ -24,9 +24,11 @@ obj-$(CONFIG_CLK_GFM_LPASS_SM8250) += lpass-gfm-sm8250.o
 obj-$(CONFIG_IPQ_APSS_PLL) += apss-ipq-pll.o
 obj-$(CONFIG_IPQ_APSS_6018) += apss-ipq6018.o
 obj-$(CONFIG_IPQ_GCC_4019) += gcc-ipq4019.o
+obj-$(CONFIG_IPQ_GCC_5332) += gcc-ipq5332.o
 obj-$(CONFIG_IPQ_GCC_6018) += gcc-ipq6018.o
 obj-$(CONFIG_IPQ_GCC_806X) += gcc-ipq806x.o
 obj-$(CONFIG_IPQ_GCC_8074) += gcc-ipq8074.o
+obj-$(CONFIG_IPQ_GCC_9574) += gcc-ipq9574.o
 obj-$(CONFIG_IPQ_LCC_806X) += lcc-ipq806x.o
 obj-$(CONFIG_MDM_GCC_9607) += gcc-mdm9607.o
 obj-$(CONFIG_MDM_GCC_9615) += gcc-mdm9615.o
@@ -34,6 +36,7 @@ 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_8917) += gcc-msm8917.o
 obj-$(CONFIG_MSM_GCC_8939) += gcc-msm8939.o
 obj-$(CONFIG_MSM_GCC_8953) += gcc-msm8953.o
 obj-$(CONFIG_MSM_GCC_8960) += gcc-msm8960.o
@@ -69,6 +72,7 @@ obj-$(CONFIG_SC_DISPCC_7180) += dispcc-sc7180.o
 obj-$(CONFIG_SC_DISPCC_7280) += dispcc-sc7280.o
 obj-$(CONFIG_SC_DISPCC_8280XP) += dispcc-sc8280xp.o
 obj-$(CONFIG_SA_GCC_8775P) += gcc-sa8775p.o
+obj-$(CONFIG_SA_GPUCC_8775P) += gpucc-sa8775p.o
 obj-$(CONFIG_SC_GCC_7180) += gcc-sc7180.o
 obj-$(CONFIG_SC_GCC_7280) += gcc-sc7280.o
 obj-$(CONFIG_SC_GCC_8180X) += gcc-sc8180x.o
@@ -107,12 +111,16 @@ 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_7150) += gcc-sm7150.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
 obj-$(CONFIG_SM_GCC_8450) += gcc-sm8450.o
 obj-$(CONFIG_SM_GCC_8550) += gcc-sm8550.o
+obj-$(CONFIG_SM_GPUCC_6115) += gpucc-sm6115.o
+obj-$(CONFIG_SM_GPUCC_6125) += gpucc-sm6125.o
 obj-$(CONFIG_SM_GPUCC_6350) += gpucc-sm6350.o
+obj-$(CONFIG_SM_GPUCC_6375) += gpucc-sm6375.o
 obj-$(CONFIG_SM_GPUCC_8150) += gpucc-sm8150.o
 obj-$(CONFIG_SM_GPUCC_8250) += gpucc-sm8250.o
 obj-$(CONFIG_SM_GPUCC_8350) += gpucc-sm8350.o
index 89e0730810ac72a6ea9f24aa1e154f9fc080c122..ce57b333ec99e61ceee96aecc1306bb576df6811 100644 (file)
@@ -119,18 +119,16 @@ err:
        return ret;
 }
 
-static int qcom_apcs_msm8916_clk_remove(struct platform_device *pdev)
+static void qcom_apcs_msm8916_clk_remove(struct platform_device *pdev)
 {
        struct clk_regmap_mux_div *a53cc = platform_get_drvdata(pdev);
 
        clk_notifier_unregister(a53cc->pclk, &a53cc->clk_nb);
-
-       return 0;
 }
 
 static struct platform_driver qcom_apcs_msm8916_clk_driver = {
        .probe = qcom_apcs_msm8916_clk_probe,
-       .remove = qcom_apcs_msm8916_clk_remove,
+       .remove_new = qcom_apcs_msm8916_clk_remove,
        .driver = {
                .name = "qcom-apcs-msm8916-clk",
        },
index e599f862ec44432c9463479b8e8d8bb511956969..d644e6e1f8b71583d9bd22531742941ff7850e83 100644 (file)
@@ -120,20 +120,18 @@ err:
        return ret;
 }
 
-static int qcom_apcs_sdx55_clk_remove(struct platform_device *pdev)
+static void qcom_apcs_sdx55_clk_remove(struct platform_device *pdev)
 {
        struct device *cpu_dev = get_cpu_device(0);
        struct clk_regmap_mux_div *a7cc = platform_get_drvdata(pdev);
 
        clk_notifier_unregister(a7cc->pclk, &a7cc->clk_nb);
        dev_pm_domain_detach(cpu_dev, true);
-
-       return 0;
 }
 
 static struct platform_driver qcom_apcs_sdx55_clk_driver = {
        .probe = qcom_apcs_sdx55_clk_probe,
-       .remove = qcom_apcs_sdx55_clk_remove,
+       .remove_new = qcom_apcs_sdx55_clk_remove,
        .driver = {
                .name = "qcom-sdx55-acps-clk",
        },
index a5aea27eb867bb2e695eafb93ff4693c76425de8..cf4f0d340cbf75384d80df54ffbebe1edd5c6630 100644 (file)
@@ -8,20 +8,38 @@
 
 #include "clk-alpha-pll.h"
 
-static const u8 ipq_pll_offsets[] = {
-       [PLL_OFF_L_VAL] = 0x08,
-       [PLL_OFF_ALPHA_VAL] = 0x10,
-       [PLL_OFF_USER_CTL] = 0x18,
-       [PLL_OFF_CONFIG_CTL] = 0x20,
-       [PLL_OFF_CONFIG_CTL_U] = 0x24,
-       [PLL_OFF_STATUS] = 0x28,
-       [PLL_OFF_TEST_CTL] = 0x30,
-       [PLL_OFF_TEST_CTL_U] = 0x34,
+/*
+ * Even though APSS PLL type is of existing one (like Huayra), its offsets
+ * are different from the one mentioned in the clk-alpha-pll.c, since the
+ * PLL is specific to APSS, so lets the define the same.
+ */
+static const u8 ipq_pll_offsets[][PLL_OFF_MAX_REGS] = {
+       [CLK_ALPHA_PLL_TYPE_HUAYRA] =  {
+               [PLL_OFF_L_VAL] = 0x08,
+               [PLL_OFF_ALPHA_VAL] = 0x10,
+               [PLL_OFF_USER_CTL] = 0x18,
+               [PLL_OFF_CONFIG_CTL] = 0x20,
+               [PLL_OFF_CONFIG_CTL_U] = 0x24,
+               [PLL_OFF_STATUS] = 0x28,
+               [PLL_OFF_TEST_CTL] = 0x30,
+               [PLL_OFF_TEST_CTL_U] = 0x34,
+       },
+       [CLK_ALPHA_PLL_TYPE_STROMER_PLUS] = {
+               [PLL_OFF_L_VAL] = 0x08,
+               [PLL_OFF_ALPHA_VAL] = 0x10,
+               [PLL_OFF_ALPHA_VAL_U] = 0x14,
+               [PLL_OFF_USER_CTL] = 0x18,
+               [PLL_OFF_USER_CTL_U] = 0x1c,
+               [PLL_OFF_CONFIG_CTL] = 0x20,
+               [PLL_OFF_STATUS] = 0x28,
+               [PLL_OFF_TEST_CTL] = 0x30,
+               [PLL_OFF_TEST_CTL_U] = 0x34,
+       },
 };
 
-static struct clk_alpha_pll ipq_pll = {
+static struct clk_alpha_pll ipq_pll_huayra = {
        .offset = 0x0,
-       .regs = ipq_pll_offsets,
+       .regs = ipq_pll_offsets[CLK_ALPHA_PLL_TYPE_HUAYRA],
        .flags = SUPPORTS_DYNAMIC_UPDATE,
        .clkr = {
                .enable_reg = 0x0,
@@ -37,6 +55,38 @@ static struct clk_alpha_pll ipq_pll = {
        },
 };
 
+static struct clk_alpha_pll ipq_pll_stromer_plus = {
+       .offset = 0x0,
+       .regs = ipq_pll_offsets[CLK_ALPHA_PLL_TYPE_STROMER_PLUS],
+       .flags = SUPPORTS_DYNAMIC_UPDATE,
+       .clkr = {
+               .enable_reg = 0x0,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "a53pll",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .fw_name = "xo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_stromer_ops,
+               },
+       },
+};
+
+static const struct alpha_pll_config ipq5332_pll_config = {
+       .l = 0x3e,
+       .config_ctl_val = 0x4001075b,
+       .config_ctl_hi_val = 0x304,
+       .main_output_mask = BIT(0),
+       .aux_output_mask = BIT(1),
+       .early_output_mask = BIT(3),
+       .alpha_en_mask = BIT(24),
+       .status_val = 0x3,
+       .status_mask = GENMASK(10, 8),
+       .lock_det = BIT(2),
+       .test_ctl_hi_val = 0x00400003,
+};
+
 static const struct alpha_pll_config ipq6018_pll_config = {
        .l = 0x37,
        .config_ctl_val = 0x240d4828,
@@ -61,6 +111,30 @@ static const struct alpha_pll_config ipq8074_pll_config = {
        .test_ctl_hi_val = 0x4000,
 };
 
+struct apss_pll_data {
+       int pll_type;
+       struct clk_alpha_pll *pll;
+       const struct alpha_pll_config *pll_config;
+};
+
+static struct apss_pll_data ipq5332_pll_data = {
+       .pll_type = CLK_ALPHA_PLL_TYPE_STROMER_PLUS,
+       .pll = &ipq_pll_stromer_plus,
+       .pll_config = &ipq5332_pll_config,
+};
+
+static struct apss_pll_data ipq8074_pll_data = {
+       .pll_type = CLK_ALPHA_PLL_TYPE_HUAYRA,
+       .pll = &ipq_pll_huayra,
+       .pll_config = &ipq8074_pll_config,
+};
+
+static struct apss_pll_data ipq6018_pll_data = {
+       .pll_type = CLK_ALPHA_PLL_TYPE_HUAYRA,
+       .pll = &ipq_pll_huayra,
+       .pll_config = &ipq6018_pll_config,
+};
+
 static const struct regmap_config ipq_pll_regmap_config = {
        .reg_bits               = 32,
        .reg_stride             = 4,
@@ -71,7 +145,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;
+       const struct apss_pll_data *data;
        struct device *dev = &pdev->dev;
        struct regmap *regmap;
        void __iomem *base;
@@ -85,23 +159,27 @@ static int apss_ipq_pll_probe(struct platform_device *pdev)
        if (IS_ERR(regmap))
                return PTR_ERR(regmap);
 
-       ipq_pll_config = of_device_get_match_data(&pdev->dev);
-       if (!ipq_pll_config)
+       data = of_device_get_match_data(&pdev->dev);
+       if (!data)
                return -ENODEV;
 
-       clk_alpha_pll_configure(&ipq_pll, regmap, ipq_pll_config);
+       if (data->pll_type == CLK_ALPHA_PLL_TYPE_HUAYRA)
+               clk_alpha_pll_configure(data->pll, regmap, data->pll_config);
+       else if (data->pll_type == CLK_ALPHA_PLL_TYPE_STROMER_PLUS)
+               clk_stromer_pll_configure(data->pll, regmap, data->pll_config);
 
-       ret = devm_clk_register_regmap(dev, &ipq_pll.clkr);
+       ret = devm_clk_register_regmap(dev, &data->pll->clkr);
        if (ret)
                return ret;
 
        return devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get,
-                                          &ipq_pll.clkr.hw);
+                                          &data->pll->clkr.hw);
 }
 
 static const struct of_device_id apss_ipq_pll_match_table[] = {
-       { .compatible = "qcom,ipq6018-a53pll", .data = &ipq6018_pll_config },
-       { .compatible = "qcom,ipq8074-a53pll", .data = &ipq8074_pll_config },
+       { .compatible = "qcom,ipq5332-a53pll", .data = &ipq5332_pll_data },
+       { .compatible = "qcom,ipq6018-a53pll", .data = &ipq6018_pll_data },
+       { .compatible = "qcom,ipq8074-a53pll", .data = &ipq8074_pll_data },
        { }
 };
 MODULE_DEVICE_TABLE(of, apss_ipq_pll_match_table);
index e266379427f2bc07278eea10e00ddd9c25da9d04..b9f6535a7ba7caa5c526d2af69dec5bba5868b7b 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
  * Copyright (c) 2015, 2018, The Linux Foundation. All rights reserved.
- * Copyright (c) 2021, Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021, 2023, Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #include <linux/kernel.h>
@@ -204,6 +204,29 @@ const u8 clk_alpha_pll_regs[][PLL_OFF_MAX_REGS] = {
                [PLL_OFF_CONFIG_CTL] = 0x1C,
                [PLL_OFF_STATUS] = 0x20,
        },
+       [CLK_ALPHA_PLL_TYPE_STROMER] = {
+               [PLL_OFF_L_VAL] = 0x08,
+               [PLL_OFF_ALPHA_VAL] = 0x10,
+               [PLL_OFF_ALPHA_VAL_U] = 0x14,
+               [PLL_OFF_USER_CTL] = 0x18,
+               [PLL_OFF_USER_CTL_U] = 0x1c,
+               [PLL_OFF_CONFIG_CTL] = 0x20,
+               [PLL_OFF_CONFIG_CTL_U] = 0xff,
+               [PLL_OFF_TEST_CTL] = 0x30,
+               [PLL_OFF_TEST_CTL_U] = 0x34,
+               [PLL_OFF_STATUS] = 0x28,
+       },
+       [CLK_ALPHA_PLL_TYPE_STROMER_PLUS] =  {
+               [PLL_OFF_L_VAL] = 0x04,
+               [PLL_OFF_USER_CTL] = 0x08,
+               [PLL_OFF_USER_CTL_U] = 0x0c,
+               [PLL_OFF_CONFIG_CTL] = 0x10,
+               [PLL_OFF_TEST_CTL] = 0x14,
+               [PLL_OFF_TEST_CTL_U] = 0x18,
+               [PLL_OFF_STATUS] = 0x1c,
+               [PLL_OFF_ALPHA_VAL] = 0x24,
+               [PLL_OFF_ALPHA_VAL_U] = 0x28,
+       },
 };
 EXPORT_SYMBOL_GPL(clk_alpha_pll_regs);
 
@@ -215,6 +238,8 @@ EXPORT_SYMBOL_GPL(clk_alpha_pll_regs);
 #define ALPHA_BITWIDTH         32U
 #define ALPHA_SHIFT(w)         min(w, ALPHA_BITWIDTH)
 
+#define        ALPHA_PLL_STATUS_REG_SHIFT      8
+
 #define PLL_HUAYRA_M_WIDTH             8
 #define PLL_HUAYRA_M_SHIFT             8
 #define PLL_HUAYRA_M_MASK              0xff
@@ -2329,3 +2354,115 @@ const struct clk_ops clk_alpha_pll_rivian_evo_ops = {
        .round_rate = clk_rivian_evo_pll_round_rate,
 };
 EXPORT_SYMBOL_GPL(clk_alpha_pll_rivian_evo_ops);
+
+void clk_stromer_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
+                              const struct alpha_pll_config *config)
+{
+       u32 val, val_u, mask, mask_u;
+
+       regmap_write(regmap, PLL_L_VAL(pll), config->l);
+       regmap_write(regmap, PLL_ALPHA_VAL(pll), config->alpha);
+       regmap_write(regmap, PLL_CONFIG_CTL(pll), config->config_ctl_val);
+
+       if (pll_has_64bit_config(pll))
+               regmap_write(regmap, PLL_CONFIG_CTL_U(pll),
+                            config->config_ctl_hi_val);
+
+       if (pll_alpha_width(pll) > 32)
+               regmap_write(regmap, PLL_ALPHA_VAL_U(pll), config->alpha_hi);
+
+       val = config->main_output_mask;
+       val |= config->aux_output_mask;
+       val |= config->aux2_output_mask;
+       val |= config->early_output_mask;
+       val |= config->pre_div_val;
+       val |= config->post_div_val;
+       val |= config->vco_val;
+       val |= config->alpha_en_mask;
+       val |= config->alpha_mode_mask;
+
+       mask = config->main_output_mask;
+       mask |= config->aux_output_mask;
+       mask |= config->aux2_output_mask;
+       mask |= config->early_output_mask;
+       mask |= config->pre_div_mask;
+       mask |= config->post_div_mask;
+       mask |= config->vco_mask;
+       mask |= config->alpha_en_mask;
+       mask |= config->alpha_mode_mask;
+
+       regmap_update_bits(regmap, PLL_USER_CTL(pll), mask, val);
+
+       /* Stromer APSS PLL does not enable LOCK_DET by default, so enable it */
+       val_u = config->status_val << ALPHA_PLL_STATUS_REG_SHIFT;
+       val_u |= config->lock_det;
+
+       mask_u = config->status_mask;
+       mask_u |= config->lock_det;
+
+       regmap_update_bits(regmap, PLL_USER_CTL_U(pll), mask_u, val_u);
+       regmap_write(regmap, PLL_TEST_CTL(pll), config->test_ctl_val);
+       regmap_write(regmap, PLL_TEST_CTL_U(pll), config->test_ctl_hi_val);
+
+       if (pll->flags & SUPPORTS_FSM_MODE)
+               qcom_pll_set_fsm_mode(regmap, PLL_MODE(pll), 6, 0);
+}
+EXPORT_SYMBOL_GPL(clk_stromer_pll_configure);
+
+static int clk_alpha_pll_stromer_determine_rate(struct clk_hw *hw,
+                                               struct clk_rate_request *req)
+{
+       u32 l;
+       u64 a;
+
+       req->rate = alpha_pll_round_rate(req->rate, req->best_parent_rate,
+                                        &l, &a, ALPHA_REG_BITWIDTH);
+
+       return 0;
+}
+
+static int clk_alpha_pll_stromer_set_rate(struct clk_hw *hw, unsigned long rate,
+                                         unsigned long prate)
+{
+       struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
+       int ret;
+       u32 l;
+       u64 a;
+
+       rate = alpha_pll_round_rate(rate, prate, &l, &a, ALPHA_REG_BITWIDTH);
+
+       regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l);
+       regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a);
+       regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL_U(pll),
+                    a >> ALPHA_BITWIDTH);
+
+       regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
+                          PLL_ALPHA_EN, PLL_ALPHA_EN);
+
+       if (!clk_hw_is_enabled(hw))
+               return 0;
+
+       /*
+        * Stromer PLL supports Dynamic programming.
+        * It allows the PLL frequency to be changed on-the-fly without first
+        * execution of a shutdown procedure followed by a bring up procedure.
+        */
+       regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_UPDATE,
+                          PLL_UPDATE);
+
+       ret = wait_for_pll_update(pll);
+       if (ret)
+               return ret;
+
+       return wait_for_pll_enable_lock(pll);
+}
+
+const struct clk_ops clk_alpha_pll_stromer_ops = {
+       .enable = clk_alpha_pll_enable,
+       .disable = clk_alpha_pll_disable,
+       .is_enabled = clk_alpha_pll_is_enabled,
+       .recalc_rate = clk_alpha_pll_recalc_rate,
+       .determine_rate = clk_alpha_pll_stromer_determine_rate,
+       .set_rate = clk_alpha_pll_stromer_set_rate,
+};
+EXPORT_SYMBOL_GPL(clk_alpha_pll_stromer_ops);
index c67cfda27ecb5ea2f8753227a7f8de3247a86c5b..d07b17186b901cb251c766c5b94aac42aa2195fc 100644 (file)
@@ -1,5 +1,9 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (c) 2015, 2018, The Linux Foundation. All rights reserved. */
+/*
+ * Copyright (c) 2015, 2018, 2021 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ */
+
 
 #ifndef __QCOM_CLK_ALPHA_PLL_H__
 #define __QCOM_CLK_ALPHA_PLL_H__
@@ -22,6 +26,8 @@ enum {
        CLK_ALPHA_PLL_TYPE_RIVIAN_EVO,
        CLK_ALPHA_PLL_TYPE_DEFAULT_EVO,
        CLK_ALPHA_PLL_TYPE_BRAMMO_EVO,
+       CLK_ALPHA_PLL_TYPE_STROMER,
+       CLK_ALPHA_PLL_TYPE_STROMER_PLUS,
        CLK_ALPHA_PLL_TYPE_MAX,
 };
 
@@ -131,6 +137,9 @@ struct alpha_pll_config {
        u32 post_div_mask;
        u32 vco_val;
        u32 vco_mask;
+       u32 status_val;
+       u32 status_mask;
+       u32 lock_det;
 };
 
 extern const struct clk_ops clk_alpha_pll_ops;
@@ -139,6 +148,7 @@ extern const struct clk_ops clk_alpha_pll_hwfsm_ops;
 extern const struct clk_ops clk_alpha_pll_postdiv_ops;
 extern const struct clk_ops clk_alpha_pll_huayra_ops;
 extern const struct clk_ops clk_alpha_pll_postdiv_ro_ops;
+extern const struct clk_ops clk_alpha_pll_stromer_ops;
 
 extern const struct clk_ops clk_alpha_pll_fabia_ops;
 extern const struct clk_ops clk_alpha_pll_fixed_fabia_ops;
@@ -188,5 +198,7 @@ void clk_lucid_evo_pll_configure(struct clk_alpha_pll *pll, struct regmap *regma
                                 const struct alpha_pll_config *config);
 void clk_rivian_evo_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
                                  const struct alpha_pll_config *config);
+void clk_stromer_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
+                              const struct alpha_pll_config *config);
 
 #endif
index f869fc6aaed64e79e6bd8af7a7d13d18de5a44f2..ca896ebf7e1ba959e1cb12e1a40e99ff4508b687 100644 (file)
@@ -39,27 +39,22 @@ static bool clk_branch_check_halt(const struct clk_branch *br, bool enabling)
        return !!val == !enabling;
 }
 
-#define BRANCH_CLK_OFF                 BIT(31)
-#define BRANCH_NOC_FSM_STATUS_SHIFT    28
-#define BRANCH_NOC_FSM_STATUS_MASK     0x7
-#define BRANCH_NOC_FSM_STATUS_ON       (0x2 << BRANCH_NOC_FSM_STATUS_SHIFT)
-
 static bool clk_branch2_check_halt(const struct clk_branch *br, bool enabling)
 {
        u32 val;
        u32 mask;
 
-       mask = BRANCH_NOC_FSM_STATUS_MASK << BRANCH_NOC_FSM_STATUS_SHIFT;
-       mask |= BRANCH_CLK_OFF;
+       mask = CBCR_NOC_FSM_STATUS;
+       mask |= CBCR_CLK_OFF;
 
        regmap_read(br->clkr.regmap, br->halt_reg, &val);
 
        if (enabling) {
                val &= mask;
-               return (val & BRANCH_CLK_OFF) == 0 ||
-                       val == BRANCH_NOC_FSM_STATUS_ON;
+               return (val & CBCR_CLK_OFF) == 0 ||
+                       FIELD_GET(CBCR_NOC_FSM_STATUS, val) == FSM_STATUS_ON;
        } else {
-               return val & BRANCH_CLK_OFF;
+               return val & CBCR_CLK_OFF;
        }
 }
 
index 17a58119165e89018c248a20ddf61da626185120..0cf800b9d08d160b233c5b4a4fbdbda879c52ff7 100644 (file)
@@ -4,6 +4,7 @@
 #ifndef __QCOM_CLK_BRANCH_H__
 #define __QCOM_CLK_BRANCH_H__
 
+#include <linux/bitfield.h>
 #include <linux/clk-provider.h>
 
 #include "clk-regmap.h"
@@ -37,6 +38,49 @@ struct clk_branch {
        struct clk_regmap clkr;
 };
 
+/* Branch clock common bits for HLOS-owned clocks */
+#define CBCR_CLK_OFF                   BIT(31)
+#define CBCR_NOC_FSM_STATUS            GENMASK(30, 28)
+ #define FSM_STATUS_ON                 BIT(1)
+#define CBCR_FORCE_MEM_CORE_ON         BIT(14)
+#define CBCR_FORCE_MEM_PERIPH_ON       BIT(13)
+#define CBCR_FORCE_MEM_PERIPH_OFF      BIT(12)
+#define CBCR_WAKEUP                    GENMASK(11, 8)
+#define CBCR_SLEEP                     GENMASK(7, 4)
+
+static inline void qcom_branch_set_force_mem_core(struct regmap *regmap,
+                                                 struct clk_branch clk, bool on)
+{
+       regmap_update_bits(regmap, clk.halt_reg, CBCR_FORCE_MEM_CORE_ON,
+                          on ? CBCR_FORCE_MEM_CORE_ON : 0);
+}
+
+static inline void qcom_branch_set_force_periph_on(struct regmap *regmap,
+                                                  struct clk_branch clk, bool on)
+{
+       regmap_update_bits(regmap, clk.halt_reg, CBCR_FORCE_MEM_PERIPH_ON,
+                          on ? CBCR_FORCE_MEM_PERIPH_ON : 0);
+}
+
+static inline void qcom_branch_set_force_periph_off(struct regmap *regmap,
+                                                   struct clk_branch clk, bool on)
+{
+       regmap_update_bits(regmap, clk.halt_reg, CBCR_FORCE_MEM_PERIPH_OFF,
+                          on ? CBCR_FORCE_MEM_PERIPH_OFF : 0);
+}
+
+static inline void qcom_branch_set_wakeup(struct regmap *regmap, struct clk_branch clk, u32 val)
+{
+       regmap_update_bits(regmap, clk.halt_reg, CBCR_WAKEUP,
+                          FIELD_PREP(CBCR_WAKEUP, val));
+}
+
+static inline void qcom_branch_set_sleep(struct regmap *regmap, struct clk_branch clk, u32 val)
+{
+       regmap_update_bits(regmap, clk.halt_reg, CBCR_SLEEP,
+                          FIELD_PREP(CBCR_SLEEP, val));
+}
+
 extern const struct clk_ops clk_branch_ops;
 extern const struct clk_ops clk_branch2_ops;
 extern const struct clk_ops clk_branch_simple_ops;
index 7dd17c184b690749610579f1d672c99aa939ca7b..86f728dc69e554848eb3485f99d5750c90d860ae 100644 (file)
@@ -128,20 +128,20 @@ static void clk_hfpll_disable(struct clk_hw *hw)
        spin_unlock_irqrestore(&h->lock, flags);
 }
 
-static long clk_hfpll_round_rate(struct clk_hw *hw, unsigned long rate,
-                                unsigned long *parent_rate)
+static int clk_hfpll_determine_rate(struct clk_hw *hw, struct clk_rate_request *req)
 {
        struct clk_hfpll *h = to_clk_hfpll(hw);
        struct hfpll_data const *hd = h->d;
        unsigned long rrate;
 
-       rate = clamp(rate, hd->min_rate, hd->max_rate);
+       req->rate = clamp(req->rate, hd->min_rate, hd->max_rate);
 
-       rrate = DIV_ROUND_UP(rate, *parent_rate) * *parent_rate;
+       rrate = DIV_ROUND_UP(req->rate, req->best_parent_rate) * req->best_parent_rate;
        if (rrate > hd->max_rate)
-               rrate -= *parent_rate;
+               rrate -= req->best_parent_rate;
 
-       return rrate;
+       req->rate = rrate;
+       return 0;
 }
 
 /*
@@ -241,7 +241,7 @@ const struct clk_ops clk_ops_hfpll = {
        .enable = clk_hfpll_enable,
        .disable = clk_hfpll_disable,
        .is_enabled = hfpll_is_enabled,
-       .round_rate = clk_hfpll_round_rate,
+       .determine_rate = clk_hfpll_determine_rate,
        .set_rate = clk_hfpll_set_rate,
        .recalc_rate = clk_hfpll_recalc_rate,
        .init = clk_hfpll_init,
index 293a9dfa7151aabd484f2a0d1791a7b9404d6259..f5ce403e1e276630f66b9c5da3ecd4fe8437bdd2 100644 (file)
@@ -97,11 +97,11 @@ const struct clk_ops krait_mux_clk_ops = {
 EXPORT_SYMBOL_GPL(krait_mux_clk_ops);
 
 /* The divider can divide by 2, 4, 6 and 8. But we only really need div-2. */
-static long krait_div2_round_rate(struct clk_hw *hw, unsigned long rate,
-                                 unsigned long *parent_rate)
+static int krait_div2_determine_rate(struct clk_hw *hw, struct clk_rate_request *req)
 {
-       *parent_rate = clk_hw_round_rate(clk_hw_get_parent(hw), rate * 2);
-       return DIV_ROUND_UP(*parent_rate, 2);
+       req->best_parent_rate = clk_hw_round_rate(clk_hw_get_parent(hw), req->rate * 2);
+       req->rate = DIV_ROUND_UP(req->best_parent_rate, 2);
+       return 0;
 }
 
 static int krait_div2_set_rate(struct clk_hw *hw, unsigned long rate,
@@ -142,7 +142,7 @@ krait_div2_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
 }
 
 const struct clk_ops krait_div2_clk_ops = {
-       .round_rate = krait_div2_round_rate,
+       .determine_rate = krait_div2_determine_rate,
        .set_rate = krait_div2_set_rate,
        .recalc_rate = krait_div2_recalc_rate,
 };
index b1be5b664bf35a351ae385824cc2d3b9593f31ac..cac623e27b0ebf7370a01e7d76928903701361e2 100644 (file)
@@ -580,8 +580,8 @@ static int rpm_clk_probe(struct platform_device *pdev)
                        goto err;
        }
 
-       ret = of_clk_add_hw_provider(pdev->dev.of_node, qcom_rpm_clk_hw_get,
-                                    rcc);
+       ret = devm_of_clk_add_hw_provider(&pdev->dev, qcom_rpm_clk_hw_get,
+                                         rcc);
        if (ret)
                goto err;
 
@@ -591,19 +591,12 @@ err:
        return ret;
 }
 
-static int rpm_clk_remove(struct platform_device *pdev)
-{
-       of_clk_del_provider(pdev->dev.of_node);
-       return 0;
-}
-
 static struct platform_driver rpm_clk_driver = {
        .driver = {
                .name = "qcom-clk-rpm",
                .of_match_table = rpm_clk_match_table,
        },
        .probe = rpm_clk_probe,
-       .remove = rpm_clk_remove,
 };
 
 static int __init rpm_clk_init(void)
index 198886c1b6c852e14a82bb922b60de9e6528856a..887b945a6fb7bb87fc47436d1ab23c66c3920b74 100644 (file)
@@ -573,6 +573,40 @@ static const struct rpm_smd_clk_desc rpm_clk_msm8916 = {
        .num_clks = ARRAY_SIZE(msm8916_clks),
 };
 
+static struct clk_smd_rpm *msm8917_clks[] = {
+       [RPM_SMD_XO_CLK_SRC]            = &clk_smd_rpm_branch_bi_tcxo,
+       [RPM_SMD_XO_A_CLK_SRC]          = &clk_smd_rpm_branch_bi_tcxo_a,
+       [RPM_SMD_PNOC_CLK]              = &clk_smd_rpm_bus_0_pcnoc_clk,
+       [RPM_SMD_PNOC_A_CLK]            = &clk_smd_rpm_bus_0_pcnoc_a_clk,
+       [RPM_SMD_SNOC_CLK]              = &clk_smd_rpm_bus_1_snoc_clk,
+       [RPM_SMD_SNOC_A_CLK]            = &clk_smd_rpm_bus_1_snoc_a_clk,
+       [RPM_SMD_BIMC_CLK]              = &clk_smd_rpm_bimc_clk,
+       [RPM_SMD_BIMC_A_CLK]            = &clk_smd_rpm_bimc_a_clk,
+       [RPM_SMD_BIMC_GPU_CLK]          = &clk_smd_rpm_bimc_gpu_clk,
+       [RPM_SMD_BIMC_GPU_A_CLK]        = &clk_smd_rpm_bimc_gpu_a_clk,
+       [RPM_SMD_SYSMMNOC_CLK]          = &clk_smd_rpm_bus_2_sysmmnoc_clk,
+       [RPM_SMD_SYSMMNOC_A_CLK]        = &clk_smd_rpm_bus_2_sysmmnoc_a_clk,
+       [RPM_SMD_QDSS_CLK]              = &clk_smd_rpm_qdss_clk,
+       [RPM_SMD_QDSS_A_CLK]            = &clk_smd_rpm_qdss_a_clk,
+       [RPM_SMD_BB_CLK1]               = &clk_smd_rpm_bb_clk1,
+       [RPM_SMD_BB_CLK1_A]             = &clk_smd_rpm_bb_clk1_a,
+       [RPM_SMD_BB_CLK2]               = &clk_smd_rpm_bb_clk2,
+       [RPM_SMD_BB_CLK2_A]             = &clk_smd_rpm_bb_clk2_a,
+       [RPM_SMD_RF_CLK2]               = &clk_smd_rpm_rf_clk2,
+       [RPM_SMD_RF_CLK2_A]             = &clk_smd_rpm_rf_clk2_a,
+       [RPM_SMD_DIV_CLK2]              = &clk_smd_rpm_div_clk2,
+       [RPM_SMD_DIV_A_CLK2]            = &clk_smd_rpm_div_clk2_a,
+       [RPM_SMD_BB_CLK1_PIN]           = &clk_smd_rpm_bb_clk1_pin,
+       [RPM_SMD_BB_CLK1_A_PIN]         = &clk_smd_rpm_bb_clk1_a_pin,
+       [RPM_SMD_BB_CLK2_PIN]           = &clk_smd_rpm_bb_clk2_pin,
+       [RPM_SMD_BB_CLK2_A_PIN]         = &clk_smd_rpm_bb_clk2_a_pin,
+};
+
+static const struct rpm_smd_clk_desc rpm_clk_msm8917 = {
+       .clks = msm8917_clks,
+       .num_clks = ARRAY_SIZE(msm8917_clks),
+};
+
 static struct clk_smd_rpm *msm8936_clks[] = {
        [RPM_SMD_XO_CLK_SRC]            = &clk_smd_rpm_branch_bi_tcxo,
        [RPM_SMD_XO_A_CLK_SRC]          = &clk_smd_rpm_branch_bi_tcxo_a,
@@ -610,6 +644,8 @@ static const struct rpm_smd_clk_desc rpm_clk_msm8936 = {
 };
 
 static struct clk_smd_rpm *msm8974_clks[] = {
+       [RPM_SMD_XO_CLK_SRC]            = &clk_smd_rpm_branch_bi_tcxo,
+       [RPM_SMD_XO_A_CLK_SRC]          = &clk_smd_rpm_branch_bi_tcxo_a,
        [RPM_SMD_PNOC_CLK]              = &clk_smd_rpm_bus_0_pcnoc_clk,
        [RPM_SMD_PNOC_A_CLK]            = &clk_smd_rpm_bus_0_pcnoc_a_clk,
        [RPM_SMD_SNOC_CLK]              = &clk_smd_rpm_bus_1_snoc_clk,
@@ -1228,6 +1264,7 @@ static const struct of_device_id rpm_smd_clk_match_table[] = {
        { .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-msm8917", .data = &rpm_clk_msm8917 },
        { .compatible = "qcom,rpmcc-msm8936", .data = &rpm_clk_msm8936 },
        { .compatible = "qcom,rpmcc-msm8953", .data = &rpm_clk_msm8953 },
        { .compatible = "qcom,rpmcc-msm8974", .data = &rpm_clk_msm8974 },
index 2ebd9a02b8950545386de4e5fab4fb6f729f4944..e9cfe41c04426760bacd43cbc81cc472dee6e17c 100644 (file)
 #include "clk-regmap-divider.h"
 #include "common.h"
 #include "gdsc.h"
+#include "reset.h"
 
 enum {
        P_BI_TCXO,
        P_DISP_CC_PLL0_OUT_MAIN,
        P_DSI0_PHY_PLL_OUT_BYTECLK,
        P_DSI0_PHY_PLL_OUT_DSICLK,
-       P_DSI1_PHY_PLL_OUT_DSICLK,
        P_GPLL0_OUT_MAIN,
        P_SLEEP_CLK,
 };
@@ -106,13 +106,11 @@ static const struct clk_parent_data disp_cc_parent_data_3[] = {
 static const struct parent_map disp_cc_parent_map_4[] = {
        { P_BI_TCXO, 0 },
        { P_DSI0_PHY_PLL_OUT_DSICLK, 1 },
-       { P_DSI1_PHY_PLL_OUT_DSICLK, 2 },
 };
 
 static const struct clk_parent_data disp_cc_parent_data_4[] = {
        { .fw_name = "bi_tcxo" },
        { .fw_name = "dsi0_phy_pll_out_dsiclk" },
-       { .fw_name = "dsi1_phy_pll_out_dsiclk" },
 };
 
 static const struct parent_map disp_cc_parent_map_5[] = {
@@ -445,6 +443,10 @@ static struct clk_branch disp_cc_sleep_clk = {
        },
 };
 
+static const struct qcom_reset_map disp_cc_qcm2290_resets[] = {
+       [DISP_CC_MDSS_CORE_BCR] = { 0x2000 },
+};
+
 static struct gdsc mdss_gdsc = {
        .gdscr = 0x3000,
        .pd = {
@@ -494,6 +496,8 @@ static const struct qcom_cc_desc disp_cc_qcm2290_desc = {
        .num_clks = ARRAY_SIZE(disp_cc_qcm2290_clocks),
        .gdscs = disp_cc_qcm2290_gdscs,
        .num_gdscs = ARRAY_SIZE(disp_cc_qcm2290_gdscs),
+       .resets = disp_cc_qcm2290_resets,
+       .num_resets = ARRAY_SIZE(disp_cc_qcm2290_resets),
 };
 
 static const struct of_device_id disp_cc_qcm2290_match_table[] = {
index 5675c60525a78d38b57c37922b327b5a7ebb93b3..5657e29464ad326816a80403c558f15f48db5ca8 100644 (file)
@@ -77,98 +77,397 @@ struct clk_fepll {
        const struct freq_tbl *freq_tbl;
 };
 
-static struct parent_map gcc_xo_200_500_map[] = {
-       { P_XO, 0 },
-       { P_FEPLL200, 1 },
-       { P_FEPLL500, 2 },
+/*
+ * Contains index for safe clock during APSS freq change.
+ * fepll500 is being used as safe clock so initialize it
+ * with its index in parents list gcc_xo_ddr_500_200.
+ */
+static const int gcc_ipq4019_cpu_safe_parent = 2;
+
+/* Calculates the VCO rate for FEPLL. */
+static u64 clk_fepll_vco_calc_rate(struct clk_fepll *pll_div,
+                                  unsigned long parent_rate)
+{
+       const struct clk_fepll_vco *pll_vco = pll_div->pll_vco;
+       u32 fdbkdiv, refclkdiv, cdiv;
+       u64 vco;
+
+       regmap_read(pll_div->cdiv.clkr.regmap, pll_vco->reg, &cdiv);
+       refclkdiv = (cdiv >> pll_vco->refclkdiv_shift) &
+                   (BIT(pll_vco->refclkdiv_width) - 1);
+       fdbkdiv = (cdiv >> pll_vco->fdbkdiv_shift) &
+                 (BIT(pll_vco->fdbkdiv_width) - 1);
+
+       vco = parent_rate / refclkdiv;
+       vco *= 2;
+       vco *= fdbkdiv;
+
+       return vco;
+}
+
+static const struct clk_fepll_vco gcc_apss_ddrpll_vco = {
+       .fdbkdiv_shift = 16,
+       .fdbkdiv_width = 8,
+       .refclkdiv_shift = 24,
+       .refclkdiv_width = 5,
+       .reg = 0x2e020,
 };
 
-static const char * const gcc_xo_200_500[] = {
-       "xo",
-       "fepll200",
-       "fepll500",
+static const struct clk_fepll_vco gcc_fepll_vco = {
+       .fdbkdiv_shift = 16,
+       .fdbkdiv_width = 8,
+       .refclkdiv_shift = 24,
+       .refclkdiv_width = 5,
+       .reg = 0x2f020,
 };
 
-static struct parent_map gcc_xo_200_map[] = {
-       {  P_XO, 0 },
-       {  P_FEPLL200, 1 },
+/*
+ * Round rate function for APSS CPU PLL Clock divider.
+ * It looks up the frequency table and returns the next higher frequency
+ * supported in hardware.
+ */
+static long clk_cpu_div_round_rate(struct clk_hw *hw, unsigned long rate,
+                                  unsigned long *p_rate)
+{
+       struct clk_fepll *pll = to_clk_fepll(hw);
+       struct clk_hw *p_hw;
+       const struct freq_tbl *f;
+
+       f = qcom_find_freq(pll->freq_tbl, rate);
+       if (!f)
+               return -EINVAL;
+
+       p_hw = clk_hw_get_parent_by_index(hw, f->src);
+       *p_rate = clk_hw_get_rate(p_hw);
+
+       return f->freq;
 };
 
-static const char * const gcc_xo_200[] = {
-       "xo",
-       "fepll200",
+/*
+ * Clock set rate function for APSS CPU PLL Clock divider.
+ * It looks up the frequency table and updates the PLL divider to corresponding
+ * divider value.
+ */
+static int clk_cpu_div_set_rate(struct clk_hw *hw, unsigned long rate,
+                               unsigned long parent_rate)
+{
+       struct clk_fepll *pll = to_clk_fepll(hw);
+       const struct freq_tbl *f;
+       u32 mask;
+
+       f = qcom_find_freq(pll->freq_tbl, rate);
+       if (!f)
+               return -EINVAL;
+
+       mask = (BIT(pll->cdiv.width) - 1) << pll->cdiv.shift;
+       regmap_update_bits(pll->cdiv.clkr.regmap,
+                          pll->cdiv.reg, mask,
+                          f->pre_div << pll->cdiv.shift);
+       /*
+        * There is no status bit which can be checked for successful CPU
+        * divider update operation so using delay for the same.
+        */
+       udelay(1);
+
+       return 0;
 };
 
-static struct parent_map gcc_xo_200_spi_map[] = {
-       {  P_XO, 0 },
-       {  P_FEPLL200, 2 },
+/*
+ * Clock frequency calculation function for APSS CPU PLL Clock divider.
+ * This clock divider is nonlinear so this function calculates the actual
+ * divider and returns the output frequency by dividing VCO Frequency
+ * with this actual divider value.
+ */
+static unsigned long
+clk_cpu_div_recalc_rate(struct clk_hw *hw,
+                       unsigned long parent_rate)
+{
+       struct clk_fepll *pll = to_clk_fepll(hw);
+       u32 cdiv, pre_div;
+       u64 rate;
+
+       regmap_read(pll->cdiv.clkr.regmap, pll->cdiv.reg, &cdiv);
+       cdiv = (cdiv >> pll->cdiv.shift) & (BIT(pll->cdiv.width) - 1);
+
+       /*
+        * Some dividers have value in 0.5 fraction so multiply both VCO
+        * frequency(parent_rate) and pre_div with 2 to make integer
+        * calculation.
+        */
+       if (cdiv > 10)
+               pre_div = (cdiv + 1) * 2;
+       else
+               pre_div = cdiv + 12;
+
+       rate = clk_fepll_vco_calc_rate(pll, parent_rate) * 2;
+       do_div(rate, pre_div);
+
+       return rate;
 };
 
-static const char * const gcc_xo_200_spi[] = {
-       "xo",
-       "fepll200",
+static const struct clk_ops clk_regmap_cpu_div_ops = {
+       .round_rate = clk_cpu_div_round_rate,
+       .set_rate = clk_cpu_div_set_rate,
+       .recalc_rate = clk_cpu_div_recalc_rate,
 };
 
-static struct parent_map gcc_xo_sdcc1_500_map[] = {
-       {  P_XO, 0 },
-       {  P_DDRPLL, 1 },
-       {  P_FEPLL500, 2 },
+static const struct freq_tbl ftbl_apss_ddr_pll[] = {
+       { 384000000, P_XO, 0xd, 0, 0 },
+       { 413000000, P_XO, 0xc, 0, 0 },
+       { 448000000, P_XO, 0xb, 0, 0 },
+       { 488000000, P_XO, 0xa, 0, 0 },
+       { 512000000, P_XO, 0x9, 0, 0 },
+       { 537000000, P_XO, 0x8, 0, 0 },
+       { 565000000, P_XO, 0x7, 0, 0 },
+       { 597000000, P_XO, 0x6, 0, 0 },
+       { 632000000, P_XO, 0x5, 0, 0 },
+       { 672000000, P_XO, 0x4, 0, 0 },
+       { 716000000, P_XO, 0x3, 0, 0 },
+       { 768000000, P_XO, 0x2, 0, 0 },
+       { 823000000, P_XO, 0x1, 0, 0 },
+       { 896000000, P_XO, 0x0, 0, 0 },
+       { }
 };
 
-static const char * const gcc_xo_sdcc1_500[] = {
-       "xo",
-       "ddrpllsdcc",
-       "fepll500",
+static struct clk_fepll gcc_apss_cpu_plldiv_clk = {
+       .cdiv.reg = 0x2e020,
+       .cdiv.shift = 4,
+       .cdiv.width = 4,
+       .cdiv.clkr = {
+               .enable_reg = 0x2e000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "ddrpllapss",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+                               .name = "xo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_regmap_cpu_div_ops,
+               },
+       },
+       .freq_tbl = ftbl_apss_ddr_pll,
+       .pll_vco = &gcc_apss_ddrpll_vco,
 };
 
-static struct parent_map gcc_xo_wcss2g_map[] = {
-       {  P_XO, 0 },
-       {  P_FEPLLWCSS2G, 1 },
+/* Calculates the rate for PLL divider.
+ * If the divider value is not fixed then it gets the actual divider value
+ * from divider table. Then, it calculate the clock rate by dividing the
+ * parent rate with actual divider value.
+ */
+static unsigned long
+clk_regmap_clk_div_recalc_rate(struct clk_hw *hw,
+                              unsigned long parent_rate)
+{
+       struct clk_fepll *pll = to_clk_fepll(hw);
+       u32 cdiv, pre_div = 1;
+       u64 rate;
+       const struct clk_div_table *clkt;
+
+       if (pll->fixed_div) {
+               pre_div = pll->fixed_div;
+       } else {
+               regmap_read(pll->cdiv.clkr.regmap, pll->cdiv.reg, &cdiv);
+               cdiv = (cdiv >> pll->cdiv.shift) & (BIT(pll->cdiv.width) - 1);
+
+               for (clkt = pll->div_table; clkt->div; clkt++) {
+                       if (clkt->val == cdiv)
+                               pre_div = clkt->div;
+               }
+       }
+
+       rate = clk_fepll_vco_calc_rate(pll, parent_rate);
+       do_div(rate, pre_div);
+
+       return rate;
+};
+
+static const struct clk_ops clk_fepll_div_ops = {
+       .recalc_rate = clk_regmap_clk_div_recalc_rate,
+};
+
+static struct clk_fepll gcc_apss_sdcc_clk = {
+       .fixed_div = 28,
+       .cdiv.clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "ddrpllsdcc",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+                               .name = "xo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_fepll_div_ops,
+               },
+       },
+       .pll_vco = &gcc_apss_ddrpll_vco,
+};
+
+static struct clk_fepll gcc_fepll125_clk = {
+       .fixed_div = 32,
+       .cdiv.clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "fepll125",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+                               .name = "xo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_fepll_div_ops,
+               },
+       },
+       .pll_vco = &gcc_fepll_vco,
+};
+
+static struct clk_fepll gcc_fepll125dly_clk = {
+       .fixed_div = 32,
+       .cdiv.clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "fepll125dly",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+                               .name = "xo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_fepll_div_ops,
+               },
+       },
+       .pll_vco = &gcc_fepll_vco,
+};
+
+static struct clk_fepll gcc_fepll200_clk = {
+       .fixed_div = 20,
+       .cdiv.clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "fepll200",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+                               .name = "xo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_fepll_div_ops,
+               },
+       },
+       .pll_vco = &gcc_fepll_vco,
+};
+
+static struct clk_fepll gcc_fepll500_clk = {
+       .fixed_div = 8,
+       .cdiv.clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "fepll500",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+                               .name = "xo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_fepll_div_ops,
+               },
+       },
+       .pll_vco = &gcc_fepll_vco,
+};
+
+static const struct clk_div_table fepllwcss_clk_div_table[] = {
+       { 0, 15 },
+       { 1, 16 },
+       { 2, 18 },
+       { 3, 20 },
+       { },
+};
+
+static struct clk_fepll gcc_fepllwcss2g_clk = {
+       .cdiv.reg = 0x2f020,
+       .cdiv.shift = 8,
+       .cdiv.width = 2,
+       .cdiv.clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "fepllwcss2g",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+                               .name = "xo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_fepll_div_ops,
+               },
+       },
+       .div_table = fepllwcss_clk_div_table,
+       .pll_vco = &gcc_fepll_vco,
 };
 
-static const char * const gcc_xo_wcss2g[] = {
-       "xo",
-       "fepllwcss2g",
+static struct clk_fepll gcc_fepllwcss5g_clk = {
+       .cdiv.reg = 0x2f020,
+       .cdiv.shift = 12,
+       .cdiv.width = 2,
+       .cdiv.clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "fepllwcss5g",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+                               .name = "xo",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_fepll_div_ops,
+               },
+       },
+       .div_table = fepllwcss_clk_div_table,
+       .pll_vco = &gcc_fepll_vco,
 };
 
-static struct parent_map gcc_xo_wcss5g_map[] = {
-       {  P_XO, 0 },
-       {  P_FEPLLWCSS5G, 1 },
+static struct parent_map gcc_xo_200_500_map[] = {
+       { P_XO, 0 },
+       { P_FEPLL200, 1 },
+       { P_FEPLL500, 2 },
 };
 
-static const char * const gcc_xo_wcss5g[] = {
-       "xo",
-       "fepllwcss5g",
+static const struct clk_parent_data gcc_xo_200_500[] = {
+       { .fw_name = "xo", .name = "xo" },
+       { .hw = &gcc_fepll200_clk.cdiv.clkr.hw },
+       { .hw = &gcc_fepll500_clk.cdiv.clkr.hw },
 };
 
-static struct parent_map gcc_xo_125_dly_map[] = {
-       {  P_XO, 0 },
-       {  P_FEPLL125DLY, 1 },
+static const struct freq_tbl ftbl_gcc_pcnoc_ahb_clk[] = {
+       F(48000000,  P_XO,       1, 0, 0),
+       F(100000000, P_FEPLL200, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_pcnoc_ahb_clk_src = {
+       .cmd_rcgr = 0x21024,
+       .hid_width = 5,
+       .parent_map = gcc_xo_200_500_map,
+       .freq_tbl = ftbl_gcc_pcnoc_ahb_clk,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_pcnoc_ahb_clk_src",
+               .parent_data = gcc_xo_200_500,
+               .num_parents = ARRAY_SIZE(gcc_xo_200_500),
+               .ops = &clk_rcg2_ops,
+       },
 };
 
-static const char * const gcc_xo_125_dly[] = {
-       "xo",
-       "fepll125dly",
+static struct clk_branch pcnoc_clk_src = {
+       .halt_reg = 0x21030,
+       .clkr = {
+               .enable_reg = 0x21030,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "pcnoc_clk_src",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &gcc_pcnoc_ahb_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT |
+                               CLK_IS_CRITICAL,
+               },
+       },
 };
 
-static struct parent_map gcc_xo_ddr_500_200_map[] = {
+static struct parent_map gcc_xo_200_map[] = {
        {  P_XO, 0 },
-       {  P_FEPLL200, 3 },
-       {  P_FEPLL500, 2 },
-       {  P_DDRPLLAPSS, 1 },
+       {  P_FEPLL200, 1 },
 };
 
-/*
- * Contains index for safe clock during APSS freq change.
- * fepll500 is being used as safe clock so initialize it
- * with its index in parents list gcc_xo_ddr_500_200.
- */
-static const int gcc_ipq4019_cpu_safe_parent = 2;
-static const char * const gcc_xo_ddr_500_200[] = {
-       "xo",
-       "fepll200",
-       "fepll500",
-       "ddrpllapss",
+static const struct clk_parent_data gcc_xo_200[] = {
+       { .fw_name = "xo", .name = "xo" },
+       { .hw = &gcc_fepll200_clk.cdiv.clkr.hw },
 };
 
 static const struct freq_tbl ftbl_gcc_audio_pwm_clk[] = {
@@ -184,8 +483,8 @@ static struct clk_rcg2 audio_clk_src = {
        .freq_tbl = ftbl_gcc_audio_pwm_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "audio_clk_src",
-               .parent_names = gcc_xo_200,
-               .num_parents = 2,
+               .parent_data = gcc_xo_200,
+               .num_parents = ARRAY_SIZE(gcc_xo_200),
                .ops = &clk_rcg2_ops,
 
        },
@@ -198,9 +497,8 @@ static struct clk_branch gcc_audio_ahb_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_audio_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){
+                               &pcnoc_clk_src.clkr.hw },
                        .flags = CLK_SET_RATE_PARENT,
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -215,9 +513,8 @@ static struct clk_branch gcc_audio_pwm_clk = {
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_audio_pwm_clk",
-                       .parent_names = (const char *[]){
-                               "audio_clk_src",
-                       },
+                       .parent_hws = (const struct clk_hw *[]){
+                               &audio_clk_src.clkr.hw },
                        .flags = CLK_SET_RATE_PARENT,
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -237,8 +534,8 @@ static struct clk_rcg2 blsp1_qup1_i2c_apps_clk_src = {
        .freq_tbl = ftbl_gcc_blsp1_qup1_2_i2c_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup1_i2c_apps_clk_src",
-               .parent_names = gcc_xo_200,
-               .num_parents = 2,
+               .parent_data = gcc_xo_200,
+               .num_parents = ARRAY_SIZE(gcc_xo_200),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -250,9 +547,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,
                        .ops = &clk_branch2_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -267,8 +563,8 @@ static struct clk_rcg2 blsp1_qup2_i2c_apps_clk_src = {
        .freq_tbl = ftbl_gcc_blsp1_qup1_2_i2c_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup2_i2c_apps_clk_src",
-               .parent_names = gcc_xo_200,
-               .num_parents = 2,
+               .parent_data = gcc_xo_200,
+               .num_parents = ARRAY_SIZE(gcc_xo_200),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -280,9 +576,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,
                        .ops = &clk_branch2_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -290,6 +585,16 @@ static struct clk_branch gcc_blsp1_qup2_i2c_apps_clk = {
        },
 };
 
+static struct parent_map gcc_xo_200_spi_map[] = {
+       {  P_XO, 0 },
+       {  P_FEPLL200, 2 },
+};
+
+static const struct clk_parent_data gcc_xo_200_spi[] = {
+       { .fw_name = "xo", .name = "xo" },
+       { .hw = &gcc_fepll200_clk.cdiv.clkr.hw },
+};
+
 static const struct freq_tbl ftbl_gcc_blsp1_qup1_2_spi_apps_clk[] = {
        F(960000, P_XO, 12, 1, 4),
        F(4800000, P_XO, 1, 1, 10),
@@ -309,8 +614,8 @@ static struct clk_rcg2 blsp1_qup1_spi_apps_clk_src = {
        .freq_tbl = ftbl_gcc_blsp1_qup1_2_spi_apps_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup1_spi_apps_clk_src",
-               .parent_names = gcc_xo_200_spi,
-               .num_parents = 2,
+               .parent_data = gcc_xo_200_spi,
+               .num_parents = ARRAY_SIZE(gcc_xo_200_spi),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -322,9 +627,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,
                        .ops = &clk_branch2_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -340,8 +644,8 @@ static struct clk_rcg2 blsp1_qup2_spi_apps_clk_src = {
        .parent_map = gcc_xo_200_spi_map,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_qup2_spi_apps_clk_src",
-               .parent_names = gcc_xo_200_spi,
-               .num_parents = 2,
+               .parent_data = gcc_xo_200_spi,
+               .num_parents = ARRAY_SIZE(gcc_xo_200_spi),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -353,9 +657,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,
                        .ops = &clk_branch2_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -385,8 +688,8 @@ static struct clk_rcg2 blsp1_uart1_apps_clk_src = {
        .parent_map = gcc_xo_200_spi_map,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_uart1_apps_clk_src",
-               .parent_names = gcc_xo_200_spi,
-               .num_parents = 2,
+               .parent_data = gcc_xo_200_spi,
+               .num_parents = ARRAY_SIZE(gcc_xo_200_spi),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -398,9 +701,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 },
                        .flags = CLK_SET_RATE_PARENT,
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -416,8 +718,8 @@ static struct clk_rcg2 blsp1_uart2_apps_clk_src = {
        .parent_map = gcc_xo_200_spi_map,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "blsp1_uart2_apps_clk_src",
-               .parent_names = gcc_xo_200_spi,
-               .num_parents = 2,
+               .parent_data = gcc_xo_200_spi,
+               .num_parents = ARRAY_SIZE(gcc_xo_200_spi),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -429,9 +731,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,
                        .ops = &clk_branch2_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -454,8 +755,8 @@ static struct clk_rcg2 gp1_clk_src = {
        .parent_map = gcc_xo_200_map,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gp1_clk_src",
-               .parent_names = gcc_xo_200,
-               .num_parents = 2,
+               .parent_data = gcc_xo_200,
+               .num_parents = ARRAY_SIZE(gcc_xo_200),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -467,9 +768,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,
                        .ops = &clk_branch2_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -485,8 +785,8 @@ static struct clk_rcg2 gp2_clk_src = {
        .parent_map = gcc_xo_200_map,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gp2_clk_src",
-               .parent_names = gcc_xo_200,
-               .num_parents = 2,
+               .parent_data = gcc_xo_200,
+               .num_parents = ARRAY_SIZE(gcc_xo_200),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -498,9 +798,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,
                        .ops = &clk_branch2_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -516,8 +815,8 @@ static struct clk_rcg2 gp3_clk_src = {
        .parent_map = gcc_xo_200_map,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "gp3_clk_src",
-               .parent_names = gcc_xo_200,
-               .num_parents = 2,
+               .parent_data = gcc_xo_200,
+               .num_parents = ARRAY_SIZE(gcc_xo_200),
                .ops = &clk_rcg2_ops,
        },
 };
@@ -529,9 +828,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,
                        .ops = &clk_branch2_ops,
                        .flags = CLK_SET_RATE_PARENT,
@@ -539,6 +837,18 @@ static struct clk_branch gcc_gp3_clk = {
        },
 };
 
+static struct parent_map gcc_xo_sdcc1_500_map[] = {
+       {  P_XO, 0 },
+       {  P_DDRPLL, 1 },
+       {  P_FEPLL500, 2 },
+};
+
+static const struct clk_parent_data gcc_xo_sdcc1_500[] = {
+       { .fw_name = "xo", .name = "xo" },
+       { .hw = &gcc_apss_sdcc_clk.cdiv.clkr.hw },
+       { .hw = &gcc_fepll500_clk.cdiv.clkr.hw },
+};
+
 static const struct freq_tbl ftbl_gcc_sdcc1_apps_clk[] = {
        F(144000,    P_XO,                      1,  3, 240),
        F(400000,    P_XO,                      1,  1, 0),
@@ -557,8 +867,8 @@ static struct clk_rcg2  sdcc1_apps_clk_src = {
        .parent_map = gcc_xo_sdcc1_500_map,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "sdcc1_apps_clk_src",
-               .parent_names = gcc_xo_sdcc1_500,
-               .num_parents = 3,
+               .parent_data = gcc_xo_sdcc1_500,
+               .num_parents = ARRAY_SIZE(gcc_xo_sdcc1_500),
                .ops = &clk_rcg2_ops,
                .flags = CLK_SET_RATE_PARENT,
        },
@@ -582,298 +892,96 @@ static const struct freq_tbl ftbl_gcc_apps_clk[] = {
        { }
 };
 
-static struct clk_rcg2 apps_clk_src = {
-       .cmd_rcgr = 0x1900c,
-       .hid_width = 5,
-       .freq_tbl = ftbl_gcc_apps_clk,
-       .parent_map = gcc_xo_ddr_500_200_map,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "apps_clk_src",
-               .parent_names = gcc_xo_ddr_500_200,
-               .num_parents = 4,
-               .ops = &clk_rcg2_ops,
-               .flags = CLK_SET_RATE_PARENT,
-       },
-};
-
-static const struct freq_tbl ftbl_gcc_apps_ahb_clk[] = {
-       F(48000000, P_XO,          1, 0, 0),
-       F(100000000, P_FEPLL200,   2, 0, 0),
-       { }
-};
-
-static struct clk_rcg2 apps_ahb_clk_src = {
-       .cmd_rcgr = 0x19014,
-       .hid_width = 5,
-       .parent_map = gcc_xo_200_500_map,
-       .freq_tbl = ftbl_gcc_apps_ahb_clk,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "apps_ahb_clk_src",
-               .parent_names = gcc_xo_200_500,
-               .num_parents = 3,
-               .ops = &clk_rcg2_ops,
-       },
-};
-
-static struct clk_branch gcc_apss_ahb_clk = {
-       .halt_reg = 0x19004,
-       .halt_check = BRANCH_HALT_VOTED,
-       .clkr = {
-               .enable_reg = 0x6000,
-               .enable_mask = BIT(14),
-               .hw.init = &(struct clk_init_data){
-                       .name = "gcc_apss_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "apps_ahb_clk_src",
-                       },
-                       .num_parents = 1,
-                       .ops = &clk_branch2_ops,
-                       .flags = CLK_SET_RATE_PARENT,
-               },
-       },
-};
-
-static struct clk_branch gcc_blsp1_ahb_clk = {
-       .halt_reg = 0x1008,
-       .halt_check = BRANCH_HALT_VOTED,
-       .clkr = {
-               .enable_reg = 0x6000,
-               .enable_mask = BIT(10),
-               .hw.init = &(struct clk_init_data){
-                       .name = "gcc_blsp1_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_clk_src",
-                       },
-                       .num_parents = 1,
-                       .ops = &clk_branch2_ops,
-               },
-       },
-};
-
-static struct clk_branch gcc_dcd_xo_clk = {
-       .halt_reg = 0x2103c,
-       .clkr = {
-               .enable_reg = 0x2103c,
-               .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data){
-                       .name = "gcc_dcd_xo_clk",
-                       .parent_names = (const char *[]){
-                               "xo",
-                       },
-                       .num_parents = 1,
-                       .ops = &clk_branch2_ops,
-               },
-       },
-};
-
-static struct clk_branch gcc_boot_rom_ahb_clk = {
-       .halt_reg = 0x1300c,
-       .clkr = {
-               .enable_reg = 0x1300c,
-               .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data){
-                       .name = "gcc_boot_rom_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_clk_src",
-                       },
-                       .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 = 0x6000,
-               .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data){
-                       .name = "gcc_crypto_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_clk_src",
-                       },
-                       .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 = 0x6000,
-               .enable_mask = BIT(1),
-               .hw.init = &(struct clk_init_data){
-                       .name = "gcc_crypto_axi_clk",
-                       .parent_names = (const char *[]){
-                               "fepll125",
-                       },
-                       .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 = 0x6000,
-               .enable_mask = BIT(2),
-               .hw.init = &(struct clk_init_data){
-                       .name = "gcc_crypto_clk",
-                       .parent_names = (const char *[]){
-                               "fepll125",
-                       },
-                       .num_parents = 1,
-                       .ops = &clk_branch2_ops,
-               },
-       },
-};
-
-static struct clk_branch gcc_ess_clk = {
-       .halt_reg = 0x12010,
-       .clkr = {
-               .enable_reg = 0x12010,
-               .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data){
-                       .name = "gcc_ess_clk",
-                       .parent_names = (const char *[]){
-                               "fephy_125m_dly_clk_src",
-                       },
-                       .num_parents = 1,
-                       .ops = &clk_branch2_ops,
-                       .flags = CLK_SET_RATE_PARENT,
-               },
-       },
-};
-
-static struct clk_branch gcc_imem_axi_clk = {
-       .halt_reg = 0xe004,
-       .halt_check = BRANCH_HALT_VOTED,
-       .clkr = {
-               .enable_reg = 0x6000,
-               .enable_mask = BIT(17),
-               .hw.init = &(struct clk_init_data){
-                       .name = "gcc_imem_axi_clk",
-                       .parent_names = (const char *[]){
-                               "fepll200",
-                       },
-                       .num_parents = 1,
-                       .ops = &clk_branch2_ops,
-               },
-       },
+static struct parent_map gcc_xo_ddr_500_200_map[] = {
+       {  P_XO, 0 },
+       {  P_FEPLL200, 3 },
+       {  P_FEPLL500, 2 },
+       {  P_DDRPLLAPSS, 1 },
 };
 
-static struct clk_branch gcc_imem_cfg_ahb_clk = {
-       .halt_reg = 0xe008,
-       .clkr = {
-               .enable_reg = 0xe008,
-               .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data){
-                       .name = "gcc_imem_cfg_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_clk_src",
-                       },
-                       .num_parents = 1,
-                       .ops = &clk_branch2_ops,
-               },
-       },
+static const struct clk_parent_data gcc_xo_ddr_500_200[] = {
+       { .fw_name = "xo", .name = "xo" },
+       { .hw = &gcc_fepll200_clk.cdiv.clkr.hw },
+       { .hw = &gcc_fepll500_clk.cdiv.clkr.hw },
+       { .hw = &gcc_apss_cpu_plldiv_clk.cdiv.clkr.hw },
 };
 
-static struct clk_branch gcc_pcie_ahb_clk = {
-       .halt_reg = 0x1d00c,
-       .clkr = {
-               .enable_reg = 0x1d00c,
-               .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data){
-                       .name = "gcc_pcie_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_clk_src",
-                       },
-                       .num_parents = 1,
-                       .ops = &clk_branch2_ops,
-               },
+static struct clk_rcg2 apps_clk_src = {
+       .cmd_rcgr = 0x1900c,
+       .hid_width = 5,
+       .freq_tbl = ftbl_gcc_apps_clk,
+       .parent_map = gcc_xo_ddr_500_200_map,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "apps_clk_src",
+               .parent_data = gcc_xo_ddr_500_200,
+               .num_parents = ARRAY_SIZE(gcc_xo_ddr_500_200),
+               .ops = &clk_rcg2_ops,
+               .flags = CLK_SET_RATE_PARENT,
        },
 };
 
-static struct clk_branch gcc_pcie_axi_m_clk = {
-       .halt_reg = 0x1d004,
-       .clkr = {
-               .enable_reg = 0x1d004,
-               .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data){
-                       .name = "gcc_pcie_axi_m_clk",
-                       .parent_names = (const char *[]){
-                               "fepll200",
-                       },
-                       .num_parents = 1,
-                       .ops = &clk_branch2_ops,
-               },
-       },
+static const struct freq_tbl ftbl_gcc_apps_ahb_clk[] = {
+       F(48000000, P_XO,          1, 0, 0),
+       F(100000000, P_FEPLL200,   2, 0, 0),
+       { }
 };
 
-static struct clk_branch gcc_pcie_axi_s_clk = {
-       .halt_reg = 0x1d008,
-       .clkr = {
-               .enable_reg = 0x1d008,
-               .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data){
-                       .name = "gcc_pcie_axi_s_clk",
-                       .parent_names = (const char *[]){
-                               "fepll200",
-                       },
-                       .num_parents = 1,
-                       .ops = &clk_branch2_ops,
-               },
+static struct clk_rcg2 apps_ahb_clk_src = {
+       .cmd_rcgr = 0x19014,
+       .hid_width = 5,
+       .parent_map = gcc_xo_200_500_map,
+       .freq_tbl = ftbl_gcc_apps_ahb_clk,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "apps_ahb_clk_src",
+               .parent_data = gcc_xo_200_500,
+               .num_parents = ARRAY_SIZE(gcc_xo_200_500),
+               .ops = &clk_rcg2_ops,
        },
 };
 
-static struct clk_branch gcc_prng_ahb_clk = {
-       .halt_reg = 0x13004,
+static struct clk_branch gcc_apss_ahb_clk = {
+       .halt_reg = 0x19004,
        .halt_check = BRANCH_HALT_VOTED,
        .clkr = {
                .enable_reg = 0x6000,
-               .enable_mask = BIT(8),
+               .enable_mask = BIT(14),
                .hw.init = &(struct clk_init_data){
-                       .name = "gcc_prng_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_clk_src",
-                       },
+                       .name = "gcc_apss_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &apps_ahb_clk_src.clkr.hw },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
                },
        },
 };
 
-static struct clk_branch gcc_qpic_ahb_clk = {
-       .halt_reg = 0x1c008,
+static struct clk_branch gcc_blsp1_ahb_clk = {
+       .halt_reg = 0x1008,
+       .halt_check = BRANCH_HALT_VOTED,
        .clkr = {
-               .enable_reg = 0x1c008,
-               .enable_mask = BIT(0),
+               .enable_reg = 0x6000,
+               .enable_mask = BIT(10),
                .hw.init = &(struct clk_init_data){
-                       .name = "gcc_qpic_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_clk_src",
-                       },
+                       .name = "gcc_blsp1_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &pcnoc_clk_src.clkr.hw },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
        },
 };
 
-static struct clk_branch gcc_qpic_clk = {
-       .halt_reg = 0x1c004,
+static struct clk_branch gcc_dcd_xo_clk = {
+       .halt_reg = 0x2103c,
        .clkr = {
-               .enable_reg = 0x1c004,
+               .enable_reg = 0x2103c,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .name = "gcc_qpic_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_clk_src",
+                       .name = "gcc_dcd_xo_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+                               .name = "xo",
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
@@ -881,324 +989,260 @@ static struct clk_branch gcc_qpic_clk = {
        },
 };
 
-static struct clk_branch gcc_sdcc1_ahb_clk = {
-       .halt_reg = 0x18010,
+static struct clk_branch gcc_boot_rom_ahb_clk = {
+       .halt_reg = 0x1300c,
        .clkr = {
-               .enable_reg = 0x18010,
+               .enable_reg = 0x1300c,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .name = "gcc_sdcc1_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_clk_src",
-                       },
+                       .name = "gcc_boot_rom_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &pcnoc_clk_src.clkr.hw },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
                },
        },
 };
 
-static struct clk_branch gcc_sdcc1_apps_clk = {
-       .halt_reg = 0x1800c,
+static struct clk_branch gcc_crypto_ahb_clk = {
+       .halt_reg = 0x16024,
+       .halt_check = BRANCH_HALT_VOTED,
        .clkr = {
-               .enable_reg = 0x1800c,
+               .enable_reg = 0x6000,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .name = "gcc_sdcc1_apps_clk",
-                       .parent_names = (const char *[]){
-                               "sdcc1_apps_clk_src",
-                       },
+                       .name = "gcc_crypto_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &pcnoc_clk_src.clkr.hw },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
-                       .flags = CLK_SET_RATE_PARENT,
                },
        },
 };
 
-static struct clk_branch gcc_tlmm_ahb_clk = {
-       .halt_reg = 0x5004,
+static struct clk_branch gcc_crypto_axi_clk = {
+       .halt_reg = 0x16020,
        .halt_check = BRANCH_HALT_VOTED,
        .clkr = {
                .enable_reg = 0x6000,
-               .enable_mask = BIT(5),
+               .enable_mask = BIT(1),
                .hw.init = &(struct clk_init_data){
-                       .name = "gcc_tlmm_ahb_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_clk_src",
-                       },
+                       .name = "gcc_crypto_axi_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &gcc_fepll125_clk.cdiv.clkr.hw },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
        },
 };
 
-static struct clk_branch gcc_usb2_master_clk = {
-       .halt_reg = 0x1e00c,
+static struct clk_branch gcc_crypto_clk = {
+       .halt_reg = 0x1601c,
+       .halt_check = BRANCH_HALT_VOTED,
        .clkr = {
-               .enable_reg = 0x1e00c,
-               .enable_mask = BIT(0),
+               .enable_reg = 0x6000,
+               .enable_mask = BIT(2),
                .hw.init = &(struct clk_init_data){
-                       .name = "gcc_usb2_master_clk",
-                       .parent_names = (const char *[]){
-                               "pcnoc_clk_src",
-                       },
+                       .name = "gcc_crypto_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &gcc_fepll125_clk.cdiv.clkr.hw },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
        },
 };
 
-static struct clk_branch gcc_usb2_sleep_clk = {
-       .halt_reg = 0x1e010,
-       .clkr = {
-               .enable_reg = 0x1e010,
-               .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data){
-                       .name = "gcc_usb2_sleep_clk",
-                       .parent_names = (const char *[]){
-                               "gcc_sleep_clk_src",
-                       },
-                       .num_parents = 1,
-                       .ops = &clk_branch2_ops,
-               },
-       },
+static struct parent_map gcc_xo_125_dly_map[] = {
+       {  P_XO, 0 },
+       {  P_FEPLL125DLY, 1 },
 };
 
-static struct clk_branch gcc_usb2_mock_utmi_clk = {
-       .halt_reg = 0x1e014,
-       .clkr = {
-               .enable_reg = 0x1e014,
-               .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data){
-                       .name = "gcc_usb2_mock_utmi_clk",
-                       .parent_names = (const char *[]){
-                               "usb30_mock_utmi_clk_src",
-                       },
-                       .num_parents = 1,
-                       .ops = &clk_branch2_ops,
-                       .flags = CLK_SET_RATE_PARENT,
-               },
-       },
+static const struct clk_parent_data gcc_xo_125_dly[] = {
+       { .fw_name = "xo", .name = "xo" },
+       { .hw = &gcc_fepll125dly_clk.cdiv.clkr.hw },
 };
 
-static const struct freq_tbl ftbl_gcc_usb30_mock_utmi_clk[] = {
-       F(2000000, P_FEPLL200, 10, 0, 0),
+static const struct freq_tbl ftbl_gcc_fephy_dly_clk[] = {
+       F(125000000, P_FEPLL125DLY, 1, 0, 0),
        { }
 };
 
-static struct clk_rcg2 usb30_mock_utmi_clk_src = {
-       .cmd_rcgr = 0x1e000,
+static struct clk_rcg2 fephy_125m_dly_clk_src = {
+       .cmd_rcgr = 0x12000,
        .hid_width = 5,
-       .parent_map = gcc_xo_200_map,
-       .freq_tbl = ftbl_gcc_usb30_mock_utmi_clk,
+       .parent_map = gcc_xo_125_dly_map,
+       .freq_tbl = ftbl_gcc_fephy_dly_clk,
        .clkr.hw.init = &(struct clk_init_data){
-               .name = "usb30_mock_utmi_clk_src",
-               .parent_names = gcc_xo_200,
-               .num_parents = 2,
+               .name = "fephy_125m_dly_clk_src",
+               .parent_data = gcc_xo_125_dly,
+               .num_parents = ARRAY_SIZE(gcc_xo_125_dly),
                .ops = &clk_rcg2_ops,
        },
 };
 
-static struct clk_branch gcc_usb3_master_clk = {
-       .halt_reg = 0x1e028,
+static struct clk_branch gcc_ess_clk = {
+       .halt_reg = 0x12010,
        .clkr = {
-               .enable_reg = 0x1e028,
+               .enable_reg = 0x12010,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .name = "gcc_usb3_master_clk",
-                       .parent_names = (const char *[]){
-                               "fepll125",
-                       },
+                       .name = "gcc_ess_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &fephy_125m_dly_clk_src.clkr.hw },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
                },
        },
 };
 
-static struct clk_branch gcc_usb3_sleep_clk = {
-       .halt_reg = 0x1e02C,
+static struct clk_branch gcc_imem_axi_clk = {
+       .halt_reg = 0xe004,
+       .halt_check = BRANCH_HALT_VOTED,
        .clkr = {
-               .enable_reg = 0x1e02C,
-               .enable_mask = BIT(0),
+               .enable_reg = 0x6000,
+               .enable_mask = BIT(17),
                .hw.init = &(struct clk_init_data){
-                       .name = "gcc_usb3_sleep_clk",
-                       .parent_names = (const char *[]){
-                               "gcc_sleep_clk_src",
-                       },
+                       .name = "gcc_imem_axi_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &gcc_fepll200_clk.cdiv.clkr.hw },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
        },
 };
 
-static struct clk_branch gcc_usb3_mock_utmi_clk = {
-       .halt_reg = 0x1e030,
+static struct clk_branch gcc_imem_cfg_ahb_clk = {
+       .halt_reg = 0xe008,
        .clkr = {
-               .enable_reg = 0x1e030,
+               .enable_reg = 0xe008,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .name = "gcc_usb3_mock_utmi_clk",
-                       .parent_names = (const char *[]){
-                               "usb30_mock_utmi_clk_src",
-                       },
+                       .name = "gcc_imem_cfg_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &pcnoc_clk_src.clkr.hw },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
-                       .flags = CLK_SET_RATE_PARENT,
                },
        },
 };
 
-static const struct freq_tbl ftbl_gcc_fephy_dly_clk[] = {
-       F(125000000, P_FEPLL125DLY, 1, 0, 0),
-       { }
-};
-
-static struct clk_rcg2 fephy_125m_dly_clk_src = {
-       .cmd_rcgr = 0x12000,
-       .hid_width = 5,
-       .parent_map = gcc_xo_125_dly_map,
-       .freq_tbl = ftbl_gcc_fephy_dly_clk,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "fephy_125m_dly_clk_src",
-               .parent_names = gcc_xo_125_dly,
-               .num_parents = 2,
-               .ops = &clk_rcg2_ops,
-       },
-};
-
-
-static const struct freq_tbl ftbl_gcc_wcss2g_clk[] = {
-       F(48000000, P_XO, 1, 0, 0),
-       F(250000000, P_FEPLLWCSS2G, 1, 0, 0),
-       { }
-};
-
-static struct clk_rcg2 wcss2g_clk_src = {
-       .cmd_rcgr = 0x1f000,
-       .hid_width = 5,
-       .freq_tbl = ftbl_gcc_wcss2g_clk,
-       .parent_map = gcc_xo_wcss2g_map,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "wcss2g_clk_src",
-               .parent_names = gcc_xo_wcss2g,
-               .num_parents = 2,
-               .ops = &clk_rcg2_ops,
-               .flags = CLK_SET_RATE_PARENT,
+static struct clk_branch gcc_pcie_ahb_clk = {
+       .halt_reg = 0x1d00c,
+       .clkr = {
+               .enable_reg = 0x1d00c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pcie_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &pcnoc_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
        },
 };
 
-static struct clk_branch gcc_wcss2g_clk = {
-       .halt_reg = 0x1f00C,
+static struct clk_branch gcc_pcie_axi_m_clk = {
+       .halt_reg = 0x1d004,
        .clkr = {
-               .enable_reg = 0x1f00C,
+               .enable_reg = 0x1d004,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .name = "gcc_wcss2g_clk",
-                       .parent_names = (const char *[]){
-                               "wcss2g_clk_src",
-                       },
+                       .name = "gcc_pcie_axi_m_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &gcc_fepll200_clk.cdiv.clkr.hw },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
-                       .flags = CLK_SET_RATE_PARENT,
                },
        },
 };
 
-static struct clk_branch gcc_wcss2g_ref_clk = {
-       .halt_reg = 0x1f00C,
+static struct clk_branch gcc_pcie_axi_s_clk = {
+       .halt_reg = 0x1d008,
        .clkr = {
-               .enable_reg = 0x1f00C,
+               .enable_reg = 0x1d008,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .name = "gcc_wcss2g_ref_clk",
-                       .parent_names = (const char *[]){
-                               "xo",
-                       },
+                       .name = "gcc_pcie_axi_s_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &gcc_fepll200_clk.cdiv.clkr.hw },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
-                       .flags = CLK_SET_RATE_PARENT,
                },
        },
 };
 
-static struct clk_branch gcc_wcss2g_rtc_clk = {
-       .halt_reg = 0x1f010,
+static struct clk_branch gcc_prng_ahb_clk = {
+       .halt_reg = 0x13004,
+       .halt_check = BRANCH_HALT_VOTED,
        .clkr = {
-               .enable_reg = 0x1f010,
-               .enable_mask = BIT(0),
+               .enable_reg = 0x6000,
+               .enable_mask = BIT(8),
                .hw.init = &(struct clk_init_data){
-                       .name = "gcc_wcss2g_rtc_clk",
-                       .parent_names = (const char *[]){
-                               "gcc_sleep_clk_src",
-                       },
+                       .name = "gcc_prng_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &pcnoc_clk_src.clkr.hw },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
                },
        },
 };
 
-static const struct freq_tbl ftbl_gcc_wcss5g_clk[] = {
-       F(48000000, P_XO, 1, 0, 0),
-       F(250000000, P_FEPLLWCSS5G, 1, 0, 0),
-       { }
-};
-
-static struct clk_rcg2 wcss5g_clk_src = {
-       .cmd_rcgr = 0x20000,
-       .hid_width = 5,
-       .parent_map = gcc_xo_wcss5g_map,
-       .freq_tbl = ftbl_gcc_wcss5g_clk,
-       .clkr.hw.init = &(struct clk_init_data){
-               .name = "wcss5g_clk_src",
-               .parent_names = gcc_xo_wcss5g,
-               .num_parents = 2,
-               .ops = &clk_rcg2_ops,
+static struct clk_branch gcc_qpic_ahb_clk = {
+       .halt_reg = 0x1c008,
+       .clkr = {
+               .enable_reg = 0x1c008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qpic_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &pcnoc_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
        },
 };
 
-static struct clk_branch gcc_wcss5g_clk = {
-       .halt_reg = 0x2000c,
+static struct clk_branch gcc_qpic_clk = {
+       .halt_reg = 0x1c004,
        .clkr = {
-               .enable_reg = 0x2000c,
+               .enable_reg = 0x1c004,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .name = "gcc_wcss5g_clk",
-                       .parent_names = (const char *[]){
-                               "wcss5g_clk_src",
-                       },
+                       .name = "gcc_qpic_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &pcnoc_clk_src.clkr.hw },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
-                       .flags = CLK_SET_RATE_PARENT,
                },
        },
 };
 
-static struct clk_branch gcc_wcss5g_ref_clk = {
-       .halt_reg = 0x2000c,
+static struct clk_branch gcc_sdcc1_ahb_clk = {
+       .halt_reg = 0x18010,
        .clkr = {
-               .enable_reg = 0x2000c,
+               .enable_reg = 0x18010,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .name = "gcc_wcss5g_ref_clk",
-                       .parent_names = (const char *[]){
-                               "xo",
-                       },
+                       .name = "gcc_sdcc1_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &pcnoc_clk_src.clkr.hw },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
-                       .flags = CLK_SET_RATE_PARENT,
                },
        },
 };
 
-static struct clk_branch gcc_wcss5g_rtc_clk = {
-       .halt_reg = 0x20010,
+static struct clk_branch gcc_sdcc1_apps_clk = {
+       .halt_reg = 0x1800c,
        .clkr = {
-               .enable_reg = 0x20010,
+               .enable_reg = 0x1800c,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .name = "gcc_wcss5g_rtc_clk",
-                       .parent_names = (const char *[]){
-                               "gcc_sleep_clk_src",
-                       },
+                       .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,
@@ -1206,359 +1250,294 @@ static struct clk_branch gcc_wcss5g_rtc_clk = {
        },
 };
 
-/* Calculates the VCO rate for FEPLL. */
-static u64 clk_fepll_vco_calc_rate(struct clk_fepll *pll_div,
-                                  unsigned long parent_rate)
-{
-       const struct clk_fepll_vco *pll_vco = pll_div->pll_vco;
-       u32 fdbkdiv, refclkdiv, cdiv;
-       u64 vco;
-
-       regmap_read(pll_div->cdiv.clkr.regmap, pll_vco->reg, &cdiv);
-       refclkdiv = (cdiv >> pll_vco->refclkdiv_shift) &
-                   (BIT(pll_vco->refclkdiv_width) - 1);
-       fdbkdiv = (cdiv >> pll_vco->fdbkdiv_shift) &
-                 (BIT(pll_vco->fdbkdiv_width) - 1);
-
-       vco = parent_rate / refclkdiv;
-       vco *= 2;
-       vco *= fdbkdiv;
-
-       return vco;
-}
-
-static const struct clk_fepll_vco gcc_apss_ddrpll_vco = {
-       .fdbkdiv_shift = 16,
-       .fdbkdiv_width = 8,
-       .refclkdiv_shift = 24,
-       .refclkdiv_width = 5,
-       .reg = 0x2e020,
-};
-
-static const struct clk_fepll_vco gcc_fepll_vco = {
-       .fdbkdiv_shift = 16,
-       .fdbkdiv_width = 8,
-       .refclkdiv_shift = 24,
-       .refclkdiv_width = 5,
-       .reg = 0x2f020,
-};
-
-/*
- * Round rate function for APSS CPU PLL Clock divider.
- * It looks up the frequency table and returns the next higher frequency
- * supported in hardware.
- */
-static long clk_cpu_div_round_rate(struct clk_hw *hw, unsigned long rate,
-                                  unsigned long *p_rate)
-{
-       struct clk_fepll *pll = to_clk_fepll(hw);
-       struct clk_hw *p_hw;
-       const struct freq_tbl *f;
-
-       f = qcom_find_freq(pll->freq_tbl, rate);
-       if (!f)
-               return -EINVAL;
-
-       p_hw = clk_hw_get_parent_by_index(hw, f->src);
-       *p_rate = clk_hw_get_rate(p_hw);
-
-       return f->freq;
-};
-
-/*
- * Clock set rate function for APSS CPU PLL Clock divider.
- * It looks up the frequency table and updates the PLL divider to corresponding
- * divider value.
- */
-static int clk_cpu_div_set_rate(struct clk_hw *hw, unsigned long rate,
-                               unsigned long parent_rate)
-{
-       struct clk_fepll *pll = to_clk_fepll(hw);
-       const struct freq_tbl *f;
-       u32 mask;
-
-       f = qcom_find_freq(pll->freq_tbl, rate);
-       if (!f)
-               return -EINVAL;
-
-       mask = (BIT(pll->cdiv.width) - 1) << pll->cdiv.shift;
-       regmap_update_bits(pll->cdiv.clkr.regmap,
-                          pll->cdiv.reg, mask,
-                          f->pre_div << pll->cdiv.shift);
-       /*
-        * There is no status bit which can be checked for successful CPU
-        * divider update operation so using delay for the same.
-        */
-       udelay(1);
-
-       return 0;
-};
-
-/*
- * Clock frequency calculation function for APSS CPU PLL Clock divider.
- * This clock divider is nonlinear so this function calculates the actual
- * divider and returns the output frequency by dividing VCO Frequency
- * with this actual divider value.
- */
-static unsigned long
-clk_cpu_div_recalc_rate(struct clk_hw *hw,
-                       unsigned long parent_rate)
-{
-       struct clk_fepll *pll = to_clk_fepll(hw);
-       u32 cdiv, pre_div;
-       u64 rate;
-
-       regmap_read(pll->cdiv.clkr.regmap, pll->cdiv.reg, &cdiv);
-       cdiv = (cdiv >> pll->cdiv.shift) & (BIT(pll->cdiv.width) - 1);
-
-       /*
-        * Some dividers have value in 0.5 fraction so multiply both VCO
-        * frequency(parent_rate) and pre_div with 2 to make integer
-        * calculation.
-        */
-       if (cdiv > 10)
-               pre_div = (cdiv + 1) * 2;
-       else
-               pre_div = cdiv + 12;
-
-       rate = clk_fepll_vco_calc_rate(pll, parent_rate) * 2;
-       do_div(rate, pre_div);
-
-       return rate;
-};
-
-static const struct clk_ops clk_regmap_cpu_div_ops = {
-       .round_rate = clk_cpu_div_round_rate,
-       .set_rate = clk_cpu_div_set_rate,
-       .recalc_rate = clk_cpu_div_recalc_rate,
+static struct clk_branch gcc_tlmm_ahb_clk = {
+       .halt_reg = 0x5004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x6000,
+               .enable_mask = BIT(5),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_tlmm_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &pcnoc_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
 };
 
-static const struct freq_tbl ftbl_apss_ddr_pll[] = {
-       { 384000000, P_XO, 0xd, 0, 0 },
-       { 413000000, P_XO, 0xc, 0, 0 },
-       { 448000000, P_XO, 0xb, 0, 0 },
-       { 488000000, P_XO, 0xa, 0, 0 },
-       { 512000000, P_XO, 0x9, 0, 0 },
-       { 537000000, P_XO, 0x8, 0, 0 },
-       { 565000000, P_XO, 0x7, 0, 0 },
-       { 597000000, P_XO, 0x6, 0, 0 },
-       { 632000000, P_XO, 0x5, 0, 0 },
-       { 672000000, P_XO, 0x4, 0, 0 },
-       { 716000000, P_XO, 0x3, 0, 0 },
-       { 768000000, P_XO, 0x2, 0, 0 },
-       { 823000000, P_XO, 0x1, 0, 0 },
-       { 896000000, P_XO, 0x0, 0, 0 },
-       { }
+static struct clk_branch gcc_usb2_master_clk = {
+       .halt_reg = 0x1e00c,
+       .clkr = {
+               .enable_reg = 0x1e00c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb2_master_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &pcnoc_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
 };
-
-static struct clk_fepll gcc_apss_cpu_plldiv_clk = {
-       .cdiv.reg = 0x2e020,
-       .cdiv.shift = 4,
-       .cdiv.width = 4,
-       .cdiv.clkr = {
-               .enable_reg = 0x2e000,
+
+static struct clk_branch gcc_usb2_sleep_clk = {
+       .halt_reg = 0x1e010,
+       .clkr = {
+               .enable_reg = 0x1e010,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .name = "ddrpllapss",
-                       .parent_names = (const char *[]){
-                               "xo",
+                       .name = "gcc_usb2_sleep_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "sleep_clk",
+                               .name = "gcc_sleep_clk_src",
                        },
                        .num_parents = 1,
-                       .ops = &clk_regmap_cpu_div_ops,
+                       .ops = &clk_branch2_ops,
                },
        },
-       .freq_tbl = ftbl_apss_ddr_pll,
-       .pll_vco = &gcc_apss_ddrpll_vco,
 };
 
-/* Calculates the rate for PLL divider.
- * If the divider value is not fixed then it gets the actual divider value
- * from divider table. Then, it calculate the clock rate by dividing the
- * parent rate with actual divider value.
- */
-static unsigned long
-clk_regmap_clk_div_recalc_rate(struct clk_hw *hw,
-                              unsigned long parent_rate)
-{
-       struct clk_fepll *pll = to_clk_fepll(hw);
-       u32 cdiv, pre_div = 1;
-       u64 rate;
-       const struct clk_div_table *clkt;
-
-       if (pll->fixed_div) {
-               pre_div = pll->fixed_div;
-       } else {
-               regmap_read(pll->cdiv.clkr.regmap, pll->cdiv.reg, &cdiv);
-               cdiv = (cdiv >> pll->cdiv.shift) & (BIT(pll->cdiv.width) - 1);
-
-               for (clkt = pll->div_table; clkt->div; clkt++) {
-                       if (clkt->val == cdiv)
-                               pre_div = clkt->div;
-               }
-       }
-
-       rate = clk_fepll_vco_calc_rate(pll, parent_rate);
-       do_div(rate, pre_div);
-
-       return rate;
+static const struct freq_tbl ftbl_gcc_usb30_mock_utmi_clk[] = {
+       F(2000000, P_FEPLL200, 10, 0, 0),
+       { }
 };
 
-static const struct clk_ops clk_fepll_div_ops = {
-       .recalc_rate = clk_regmap_clk_div_recalc_rate,
+static struct clk_rcg2 usb30_mock_utmi_clk_src = {
+       .cmd_rcgr = 0x1e000,
+       .hid_width = 5,
+       .parent_map = gcc_xo_200_map,
+       .freq_tbl = ftbl_gcc_usb30_mock_utmi_clk,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "usb30_mock_utmi_clk_src",
+               .parent_data = gcc_xo_200,
+               .num_parents = ARRAY_SIZE(gcc_xo_200),
+               .ops = &clk_rcg2_ops,
+       },
 };
 
-static struct clk_fepll gcc_apss_sdcc_clk = {
-       .fixed_div = 28,
-       .cdiv.clkr = {
+static struct clk_branch gcc_usb2_mock_utmi_clk = {
+       .halt_reg = 0x1e014,
+       .clkr = {
+               .enable_reg = 0x1e014,
+               .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .name = "ddrpllsdcc",
-                       .parent_names = (const char *[]){
-                               "xo",
-                       },
+                       .name = "gcc_usb2_mock_utmi_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &usb30_mock_utmi_clk_src.clkr.hw },
                        .num_parents = 1,
-                       .ops = &clk_fepll_div_ops,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
                },
        },
-       .pll_vco = &gcc_apss_ddrpll_vco,
 };
 
-static struct clk_fepll gcc_fepll125_clk = {
-       .fixed_div = 32,
-       .cdiv.clkr = {
+static struct clk_branch gcc_usb3_master_clk = {
+       .halt_reg = 0x1e028,
+       .clkr = {
+               .enable_reg = 0x1e028,
+               .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .name = "fepll125",
-                       .parent_names = (const char *[]){
-                               "xo",
-                       },
+                       .name = "gcc_usb3_master_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &gcc_fepll125_clk.cdiv.clkr.hw },
                        .num_parents = 1,
-                       .ops = &clk_fepll_div_ops,
+                       .ops = &clk_branch2_ops,
                },
        },
-       .pll_vco = &gcc_fepll_vco,
 };
 
-static struct clk_fepll gcc_fepll125dly_clk = {
-       .fixed_div = 32,
-       .cdiv.clkr = {
+static struct clk_branch gcc_usb3_sleep_clk = {
+       .halt_reg = 0x1e02C,
+       .clkr = {
+               .enable_reg = 0x1e02C,
+               .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .name = "fepll125dly",
-                       .parent_names = (const char *[]){
-                               "xo",
+                       .name = "gcc_usb3_sleep_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "sleep_clk",
+                               .name = "gcc_sleep_clk_src",
                        },
                        .num_parents = 1,
-                       .ops = &clk_fepll_div_ops,
+                       .ops = &clk_branch2_ops,
                },
        },
-       .pll_vco = &gcc_fepll_vco,
 };
 
-static struct clk_fepll gcc_fepll200_clk = {
-       .fixed_div = 20,
-       .cdiv.clkr = {
+static struct clk_branch gcc_usb3_mock_utmi_clk = {
+       .halt_reg = 0x1e030,
+       .clkr = {
+               .enable_reg = 0x1e030,
+               .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .name = "fepll200",
-                       .parent_names = (const char *[]){
-                               "xo",
-                       },
+                       .name = "gcc_usb3_mock_utmi_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &usb30_mock_utmi_clk_src.clkr.hw },
                        .num_parents = 1,
-                       .ops = &clk_fepll_div_ops,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
                },
        },
-       .pll_vco = &gcc_fepll_vco,
 };
 
-static struct clk_fepll gcc_fepll500_clk = {
-       .fixed_div = 8,
-       .cdiv.clkr = {
+static struct parent_map gcc_xo_wcss2g_map[] = {
+       {  P_XO, 0 },
+       {  P_FEPLLWCSS2G, 1 },
+};
+
+static const struct clk_parent_data gcc_xo_wcss2g[] = {
+       { .fw_name = "xo", .name = "xo" },
+       { .hw = &gcc_fepllwcss2g_clk.cdiv.clkr.hw },
+};
+
+static const struct freq_tbl ftbl_gcc_wcss2g_clk[] = {
+       F(48000000, P_XO, 1, 0, 0),
+       F(250000000, P_FEPLLWCSS2G, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 wcss2g_clk_src = {
+       .cmd_rcgr = 0x1f000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_gcc_wcss2g_clk,
+       .parent_map = gcc_xo_wcss2g_map,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "wcss2g_clk_src",
+               .parent_data = gcc_xo_wcss2g,
+               .num_parents = ARRAY_SIZE(gcc_xo_wcss2g),
+               .ops = &clk_rcg2_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
+static struct clk_branch gcc_wcss2g_clk = {
+       .halt_reg = 0x1f00C,
+       .clkr = {
+               .enable_reg = 0x1f00C,
+               .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .name = "fepll500",
-                       .parent_names = (const char *[]){
-                               "xo",
-                       },
+                       .name = "gcc_wcss2g_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &wcss2g_clk_src.clkr.hw },
                        .num_parents = 1,
-                       .ops = &clk_fepll_div_ops,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
                },
        },
-       .pll_vco = &gcc_fepll_vco,
-};
-
-static const struct clk_div_table fepllwcss_clk_div_table[] = {
-       { 0, 15 },
-       { 1, 16 },
-       { 2, 18 },
-       { 3, 20 },
-       { },
 };
 
-static struct clk_fepll gcc_fepllwcss2g_clk = {
-       .cdiv.reg = 0x2f020,
-       .cdiv.shift = 8,
-       .cdiv.width = 2,
-       .cdiv.clkr = {
+static struct clk_branch gcc_wcss2g_ref_clk = {
+       .halt_reg = 0x1f00C,
+       .clkr = {
+               .enable_reg = 0x1f00C,
+               .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .name = "fepllwcss2g",
-                       .parent_names = (const char *[]){
-                               "xo",
+                       .name = "gcc_wcss2g_ref_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+                               .name = "xo",
                        },
                        .num_parents = 1,
-                       .ops = &clk_fepll_div_ops,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
                },
        },
-       .div_table = fepllwcss_clk_div_table,
-       .pll_vco = &gcc_fepll_vco,
 };
 
-static struct clk_fepll gcc_fepllwcss5g_clk = {
-       .cdiv.reg = 0x2f020,
-       .cdiv.shift = 12,
-       .cdiv.width = 2,
-       .cdiv.clkr = {
+static struct clk_branch gcc_wcss2g_rtc_clk = {
+       .halt_reg = 0x1f010,
+       .clkr = {
+               .enable_reg = 0x1f010,
+               .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .name = "fepllwcss5g",
-                       .parent_names = (const char *[]){
-                               "xo",
+                       .name = "gcc_wcss2g_rtc_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "sleep_clk",
+                               .name = "gcc_sleep_clk_src",
                        },
                        .num_parents = 1,
-                       .ops = &clk_fepll_div_ops,
+                       .ops = &clk_branch2_ops,
                },
        },
-       .div_table = fepllwcss_clk_div_table,
-       .pll_vco = &gcc_fepll_vco,
 };
 
-static const struct freq_tbl ftbl_gcc_pcnoc_ahb_clk[] = {
-       F(48000000,  P_XO,       1, 0, 0),
-       F(100000000, P_FEPLL200, 2, 0, 0),
+static struct parent_map gcc_xo_wcss5g_map[] = {
+       {  P_XO, 0 },
+       {  P_FEPLLWCSS5G, 1 },
+};
+
+static const struct clk_parent_data gcc_xo_wcss5g[] = {
+       { .fw_name = "xo", .name = "xo" },
+       { .hw = &gcc_fepllwcss5g_clk.cdiv.clkr.hw },
+};
+
+static const struct freq_tbl ftbl_gcc_wcss5g_clk[] = {
+       F(48000000, P_XO, 1, 0, 0),
+       F(250000000, P_FEPLLWCSS5G, 1, 0, 0),
        { }
 };
 
-static struct clk_rcg2 gcc_pcnoc_ahb_clk_src = {
-       .cmd_rcgr = 0x21024,
+static struct clk_rcg2 wcss5g_clk_src = {
+       .cmd_rcgr = 0x20000,
        .hid_width = 5,
-       .parent_map = gcc_xo_200_500_map,
-       .freq_tbl = ftbl_gcc_pcnoc_ahb_clk,
+       .parent_map = gcc_xo_wcss5g_map,
+       .freq_tbl = ftbl_gcc_wcss5g_clk,
        .clkr.hw.init = &(struct clk_init_data){
-               .name = "gcc_pcnoc_ahb_clk_src",
-               .parent_names = gcc_xo_200_500,
-               .num_parents = 3,
+               .name = "wcss5g_clk_src",
+               .parent_data = gcc_xo_wcss5g,
+               .num_parents = ARRAY_SIZE(gcc_xo_wcss5g),
                .ops = &clk_rcg2_ops,
        },
 };
 
-static struct clk_branch pcnoc_clk_src = {
-       .halt_reg = 0x21030,
+static struct clk_branch gcc_wcss5g_clk = {
+       .halt_reg = 0x2000c,
        .clkr = {
-               .enable_reg = 0x21030,
+               .enable_reg = 0x2000c,
                .enable_mask = BIT(0),
                .hw.init = &(struct clk_init_data){
-                       .name = "pcnoc_clk_src",
-                       .parent_names = (const char *[]){
-                               "gcc_pcnoc_ahb_clk_src",
+                       .name = "gcc_wcss5g_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &wcss5g_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               },
+       },
+};
+
+static struct clk_branch gcc_wcss5g_ref_clk = {
+       .halt_reg = 0x2000c,
+       .clkr = {
+               .enable_reg = 0x2000c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_wcss5g_ref_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "xo",
+                               .name = "xo",
                        },
                        .num_parents = 1,
                        .ops = &clk_branch2_ops,
-                       .flags = CLK_SET_RATE_PARENT |
-                               CLK_IS_CRITICAL,
+                       .flags = CLK_SET_RATE_PARENT,
+               },
+       },
+};
+
+static struct clk_branch gcc_wcss5g_rtc_clk = {
+       .halt_reg = 0x20010,
+       .clkr = {
+               .enable_reg = 0x20010,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_wcss5g_rtc_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "sleep_clk",
+                               .name = "gcc_sleep_clk_src",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
                },
        },
 };
diff --git a/drivers/clk/qcom/gcc-ipq5332.c b/drivers/clk/qcom/gcc-ipq5332.c
new file mode 100644 (file)
index 0000000..bdb4a0a
--- /dev/null
@@ -0,0 +1,3824 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/regmap.h>
+
+#include <dt-bindings/clock/qcom,ipq5332-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 "reset.h"
+
+enum {
+       DT_SLEEP_CLK,
+       DT_XO,
+       DT_PCIE_2LANE_PHY_PIPE_CLK,
+       DT_PCIE_2LANE_PHY_PIPE_CLK_X1,
+       DT_USB_PCIE_WRAPPER_PIPE_CLK,
+};
+
+enum {
+       P_PCIE3X2_PIPE,
+       P_PCIE3X1_0_PIPE,
+       P_PCIE3X1_1_PIPE,
+       P_USB3PHY_0_PIPE,
+       P_CORE_BI_PLL_TEST_SE,
+       P_GCC_GPLL0_OUT_MAIN_DIV_CLK_SRC,
+       P_GPLL0_OUT_AUX,
+       P_GPLL0_OUT_MAIN,
+       P_GPLL2_OUT_AUX,
+       P_GPLL2_OUT_MAIN,
+       P_GPLL4_OUT_AUX,
+       P_GPLL4_OUT_MAIN,
+       P_SLEEP_CLK,
+       P_XO,
+};
+
+static const struct clk_parent_data gcc_parent_data_xo = { .index = DT_XO };
+
+static struct clk_alpha_pll gpll0_main = {
+       .offset = 0x20000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_STROMER_PLUS],
+       .clkr = {
+               .enable_reg = 0xb000,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gpll0_main",
+                       .parent_data = &gcc_parent_data_xo,
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_stromer_ops,
+               },
+       },
+};
+
+static struct clk_fixed_factor gpll0_div2 = {
+       .mult = 1,
+       .div = 2,
+       .hw.init = &(struct clk_init_data) {
+               .name = "gpll0_div2",
+               .parent_hws = (const struct clk_hw *[]) {
+                               &gpll0_main.clkr.hw },
+               .num_parents = 1,
+               .ops = &clk_fixed_factor_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
+static struct clk_alpha_pll_postdiv gpll0 = {
+       .offset = 0x20000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_STROMER_PLUS],
+       .width = 4,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gpll0",
+               .parent_hws = (const struct clk_hw *[]) {
+                               &gpll0_main.clkr.hw },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_ro_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
+static struct clk_alpha_pll gpll2_main = {
+       .offset = 0x21000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_STROMER_PLUS],
+       .clkr = {
+               .enable_reg = 0xb000,
+               .enable_mask = BIT(1),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gpll2",
+                       .parent_data = &gcc_parent_data_xo,
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_stromer_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll_postdiv gpll2 = {
+       .offset = 0x21000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_STROMER_PLUS],
+       .width = 4,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gpll2_main",
+               .parent_hws = (const struct clk_hw *[]) {
+                               &gpll2_main.clkr.hw },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_ro_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
+static struct clk_alpha_pll gpll4_main = {
+       .offset = 0x22000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_STROMER_PLUS],
+       .clkr = {
+               .enable_reg = 0xb000,
+               .enable_mask = BIT(2),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gpll4_main",
+                       .parent_data = &gcc_parent_data_xo,
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_stromer_ops,
+                       /*
+                        * There are no consumers for this GPLL in kernel yet,
+                        * (will be added soon), so the clock framework
+                        * disables this source. But some of the clocks
+                        * initialized by boot loaders uses this source. So we
+                        * need to keep this clock ON. Add the
+                        * CLK_IGNORE_UNUSED flag so the clock will not be
+                        * disabled. Once the consumer in kernel is added, we
+                        * can get rid of this flag.
+                        */
+                       .flags = CLK_IGNORE_UNUSED,
+               },
+       },
+};
+
+static struct clk_alpha_pll_postdiv gpll4 = {
+       .offset = 0x22000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_STROMER_PLUS],
+       .width = 4,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gpll4",
+               .parent_hws = (const struct clk_hw *[]) {
+                               &gpll4_main.clkr.hw },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_ro_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
+static const struct parent_map gcc_parent_map_xo[] = {
+       { P_XO, 0 },
+};
+
+static const struct parent_map gcc_parent_map_0[] = {
+       { P_XO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GCC_GPLL0_OUT_MAIN_DIV_CLK_SRC, 4 },
+};
+
+static const struct clk_parent_data gcc_parent_data_0[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_div2.hw },
+};
+
+static const struct parent_map gcc_parent_map_1[] = {
+       { P_XO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+};
+
+static const struct clk_parent_data gcc_parent_data_1[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_2[] = {
+       { P_XO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL4_OUT_MAIN, 2 },
+};
+
+static const struct clk_parent_data gcc_parent_data_2[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll4.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_3[] = {
+       { P_XO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GCC_GPLL0_OUT_MAIN_DIV_CLK_SRC, 4 },
+       { P_SLEEP_CLK, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_3[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_div2.hw },
+       { .index = DT_SLEEP_CLK },
+};
+
+static const struct parent_map gcc_parent_map_4[] = {
+       { P_XO, 0 },
+       { P_GPLL4_OUT_MAIN, 1 },
+       { P_GPLL0_OUT_AUX, 2 },
+       { P_GCC_GPLL0_OUT_MAIN_DIV_CLK_SRC, 4 },
+};
+
+static const struct clk_parent_data gcc_parent_data_4[] = {
+       { .index = DT_XO },
+       { .hw = &gpll4.clkr.hw },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_div2.hw },
+};
+
+static const struct parent_map gcc_parent_map_5[] = {
+       { P_XO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL2_OUT_AUX, 2 },
+       { P_GPLL4_OUT_AUX, 3 },
+       { P_GCC_GPLL0_OUT_MAIN_DIV_CLK_SRC, 4 },
+       { P_GPLL0_OUT_AUX, 5 },
+};
+
+static const struct clk_parent_data gcc_parent_data_5[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll2.clkr.hw },
+       { .hw = &gpll4.clkr.hw },
+       { .hw = &gpll0_div2.hw },
+       { .hw = &gpll0.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_6[] = {
+       { P_XO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL0_OUT_AUX, 2 },
+       { P_SLEEP_CLK, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_6[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0.clkr.hw },
+       { .index = DT_SLEEP_CLK },
+};
+
+static const struct parent_map gcc_parent_map_7[] = {
+       { P_XO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL2_OUT_AUX, 2 },
+       { P_GPLL4_OUT_AUX, 3 },
+       { P_SLEEP_CLK, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_7[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll2.clkr.hw },
+       { .hw = &gpll4.clkr.hw },
+       { .index = DT_SLEEP_CLK },
+};
+
+static const struct parent_map gcc_parent_map_8[] = {
+       { P_XO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL2_OUT_AUX, 2 },
+};
+
+static const struct clk_parent_data gcc_parent_data_8[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll2.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_9[] = {
+       { P_XO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL2_OUT_MAIN, 2 },
+       { P_GCC_GPLL0_OUT_MAIN_DIV_CLK_SRC, 4 },
+};
+
+static const struct clk_parent_data gcc_parent_data_9[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll2.clkr.hw },
+       { .hw = &gpll0_div2.hw },
+};
+
+static const struct parent_map gcc_parent_map_10[] = {
+       { P_SLEEP_CLK, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_10[] = {
+       { .index = DT_SLEEP_CLK },
+};
+
+static const struct parent_map gcc_parent_map_11[] = {
+       { P_XO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL4_OUT_MAIN, 2 },
+       { P_GCC_GPLL0_OUT_MAIN_DIV_CLK_SRC, 3 },
+};
+
+static const struct clk_parent_data gcc_parent_data_11[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll4.clkr.hw },
+       { .hw = &gpll0_div2.hw },
+};
+
+static const struct parent_map gcc_parent_map_12[] = {
+       { P_XO, 0 },
+       { P_GPLL0_OUT_AUX, 2 },
+       { P_SLEEP_CLK, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_12[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .index = DT_SLEEP_CLK },
+};
+
+static const struct parent_map gcc_parent_map_13[] = {
+       { P_XO, 0 },
+       { P_GPLL4_OUT_AUX, 1 },
+       { P_GPLL0_OUT_MAIN, 3 },
+       { P_GCC_GPLL0_OUT_MAIN_DIV_CLK_SRC, 4 },
+};
+
+static const struct clk_parent_data gcc_parent_data_13[] = {
+       { .index = DT_XO },
+       { .hw = &gpll4.clkr.hw },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_div2.hw },
+};
+
+static const struct freq_tbl ftbl_gcc_adss_pwm_clk_src[] = {
+       F(24000000, P_XO, 1, 0, 0),
+       F(100000000, P_GPLL0_OUT_MAIN, 8, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_adss_pwm_clk_src = {
+       .cmd_rcgr = 0x1c004,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_1,
+       .freq_tbl = ftbl_gcc_adss_pwm_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_adss_pwm_clk_src",
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_apss_axi_clk_src[] = {
+       F(480000000, P_GPLL4_OUT_MAIN, 2.5, 0, 0),
+       F(533333333, P_GPLL0_OUT_MAIN, 1.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_apss_axi_clk_src = {
+       .cmd_rcgr = 0x24004,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_5,
+       .freq_tbl = ftbl_gcc_apss_axi_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_apss_axi_clk_src",
+               .parent_data = gcc_parent_data_5,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_5),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_blsp1_qup1_spi_apps_clk_src[] = {
+       F(960000, P_XO, 1, 1, 25),
+       F(4800000, P_XO, 5, 0, 0),
+       F(9600000, P_XO, 2.5, 0, 0),
+       F(16000000, P_GPLL0_OUT_MAIN, 10, 1, 5),
+       F(24000000, P_XO, 1, 0, 0),
+       F(25000000, P_GPLL0_OUT_MAIN, 16, 1, 2),
+       F(50000000, P_GPLL0_OUT_MAIN, 16, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_blsp1_qup1_spi_apps_clk_src = {
+       .cmd_rcgr = 0x2004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_blsp1_qup1_spi_apps_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_blsp1_qup1_spi_apps_clk_src",
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_blsp1_qup2_spi_apps_clk_src = {
+       .cmd_rcgr = 0x3004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_blsp1_qup1_spi_apps_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_blsp1_qup2_spi_apps_clk_src",
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_blsp1_qup3_spi_apps_clk_src = {
+       .cmd_rcgr = 0x4004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_blsp1_qup1_spi_apps_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_blsp1_qup3_spi_apps_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_blsp1_uart1_apps_clk_src[] = {
+       F(3686400, P_GCC_GPLL0_OUT_MAIN_DIV_CLK_SRC, 1, 144, 15625),
+       F(7372800, P_GCC_GPLL0_OUT_MAIN_DIV_CLK_SRC, 1, 288, 15625),
+       F(14745600, P_GCC_GPLL0_OUT_MAIN_DIV_CLK_SRC, 1, 576, 15625),
+       F(24000000, P_XO, 1, 0, 0),
+       F(25000000, P_GPLL0_OUT_MAIN, 16, 1, 2),
+       F(32000000, P_GPLL0_OUT_MAIN, 1, 1, 25),
+       F(40000000, P_GPLL0_OUT_MAIN, 1, 1, 20),
+       F(46400000, P_GPLL0_OUT_MAIN, 1, 29, 500),
+       F(48000000, P_GPLL0_OUT_MAIN, 1, 3, 50),
+       F(51200000, P_GPLL0_OUT_MAIN, 1, 8, 125),
+       F(56000000, P_GPLL0_OUT_MAIN, 1, 7, 100),
+       F(58982400, P_GPLL0_OUT_MAIN, 1, 1152, 15625),
+       F(60000000, P_GPLL0_OUT_MAIN, 1, 3, 40),
+       F(64000000, P_GPLL0_OUT_MAIN, 12.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_blsp1_uart1_apps_clk_src = {
+       .cmd_rcgr = 0x202c,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_blsp1_uart1_apps_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_blsp1_uart1_apps_clk_src",
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_blsp1_uart2_apps_clk_src = {
+       .cmd_rcgr = 0x302c,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_blsp1_uart1_apps_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_blsp1_uart2_apps_clk_src",
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_blsp1_uart3_apps_clk_src = {
+       .cmd_rcgr = 0x402c,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_blsp1_uart1_apps_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_blsp1_uart3_apps_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_gp1_clk_src[] = {
+       F(24000000, P_XO, 1, 0, 0),
+       F(200000000, P_GPLL0_OUT_MAIN, 4, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_gp1_clk_src = {
+       .cmd_rcgr = 0x8004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_3,
+       .freq_tbl = ftbl_gcc_gp1_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_gp1_clk_src",
+               .parent_data = gcc_parent_data_3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_3),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_gp2_clk_src = {
+       .cmd_rcgr = 0x9004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_3,
+       .freq_tbl = ftbl_gcc_gp1_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_gp2_clk_src",
+               .parent_data = gcc_parent_data_3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_3),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_lpass_sway_clk_src[] = {
+       F(133333333, P_GPLL0_OUT_MAIN, 6, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_lpass_sway_clk_src = {
+       .cmd_rcgr = 0x27004,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_1,
+       .freq_tbl = ftbl_gcc_lpass_sway_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_lpass_sway_clk_src",
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_nss_ts_clk_src[] = {
+       F(24000000, P_XO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_nss_ts_clk_src = {
+       .cmd_rcgr = 0x17088,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo,
+       .freq_tbl = ftbl_gcc_nss_ts_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_nss_ts_clk_src",
+               .parent_data = &gcc_parent_data_xo,
+               .num_parents = 1,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_pcie3x1_0_axi_clk_src[] = {
+       F(240000000, P_GPLL4_OUT_MAIN, 5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_pcie3x1_0_axi_clk_src = {
+       .cmd_rcgr = 0x29018,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_2,
+       .freq_tbl = ftbl_gcc_pcie3x1_0_axi_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_pcie3x1_0_axi_clk_src",
+               .parent_data = gcc_parent_data_2,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_pcie3x1_0_rchg_clk_src = {
+       .cmd_rcgr = 0x2907c,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_adss_pwm_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_pcie3x1_0_rchg_clk_src",
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_pcie3x1_0_rchg_clk = {
+       .halt_reg = 0x2907c,
+       .clkr = {
+               .enable_reg = 0x2907c,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie3x1_0_rchg_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                                       &gcc_pcie3x1_0_rchg_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_rcg2 gcc_pcie3x1_1_axi_clk_src = {
+       .cmd_rcgr = 0x2a004,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_2,
+       .freq_tbl = ftbl_gcc_pcie3x1_0_axi_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_pcie3x1_1_axi_clk_src",
+               .parent_data = gcc_parent_data_2,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_pcie3x1_1_rchg_clk_src = {
+       .cmd_rcgr = 0x2a078,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_adss_pwm_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_pcie3x1_1_rchg_clk_src",
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_pcie3x1_1_rchg_clk = {
+       .halt_reg = 0x2a078,
+       .clkr = {
+               .enable_reg = 0x2a078,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie3x1_1_rchg_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                                       &gcc_pcie3x1_1_rchg_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_pcie3x2_axi_m_clk_src[] = {
+       F(266666667, P_GPLL4_OUT_MAIN, 4.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_pcie3x2_axi_m_clk_src = {
+       .cmd_rcgr = 0x28018,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_2,
+       .freq_tbl = ftbl_gcc_pcie3x2_axi_m_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_pcie3x2_axi_m_clk_src",
+               .parent_data = gcc_parent_data_2,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_pcie3x2_axi_s_clk_src = {
+       .cmd_rcgr = 0x28084,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_2,
+       .freq_tbl = ftbl_gcc_pcie3x1_0_axi_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_pcie3x2_axi_s_clk_src",
+               .parent_data = gcc_parent_data_2,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_pcie3x2_rchg_clk_src = {
+       .cmd_rcgr = 0x28078,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_adss_pwm_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_pcie3x2_rchg_clk_src",
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_pcie3x2_rchg_clk = {
+       .halt_reg = 0x28078,
+       .clkr = {
+               .enable_reg = 0x28078,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie3x2_rchg_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                                       &gcc_pcie3x2_rchg_clk_src.clkr.hw },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_pcie_aux_clk_src[] = {
+       F(2000000, P_XO, 12, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_pcie_aux_clk_src = {
+       .cmd_rcgr = 0x28004,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_6,
+       .freq_tbl = ftbl_gcc_pcie_aux_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_pcie_aux_clk_src",
+               .parent_data = gcc_parent_data_6,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_6),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_regmap_phy_mux gcc_pcie3x2_pipe_clk_src = {
+       .reg = 0x28064,
+       .clkr = {
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie3x2_pipe_clk_src",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .index = DT_PCIE_2LANE_PHY_PIPE_CLK,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_regmap_phy_mux_ops,
+               },
+       },
+};
+
+static struct clk_regmap_phy_mux gcc_pcie3x1_0_pipe_clk_src = {
+       .reg = 0x29064,
+       .clkr = {
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie3x1_0_pipe_clk_src",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .index = DT_USB_PCIE_WRAPPER_PIPE_CLK,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_regmap_phy_mux_ops,
+               },
+       },
+};
+
+static struct clk_regmap_phy_mux gcc_pcie3x1_1_pipe_clk_src = {
+       .reg = 0x2a064,
+       .clkr = {
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie3x1_1_pipe_clk_src",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .index = DT_PCIE_2LANE_PHY_PIPE_CLK_X1,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_regmap_phy_mux_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_pcnoc_bfdcd_clk_src[] = {
+       F(24000000, P_XO, 1, 0, 0),
+       F(50000000, P_GPLL0_OUT_MAIN, 16, 0, 0),
+       F(100000000, P_GPLL0_OUT_MAIN, 8, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_pcnoc_bfdcd_clk_src = {
+       .cmd_rcgr = 0x31004,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_pcnoc_bfdcd_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_pcnoc_bfdcd_clk_src",
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_q6_axim_clk_src = {
+       .cmd_rcgr = 0x25004,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_7,
+       .freq_tbl = ftbl_gcc_apss_axi_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_q6_axim_clk_src",
+               .parent_data = gcc_parent_data_7,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_7),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_qdss_at_clk_src[] = {
+       F(240000000, P_GPLL4_OUT_MAIN, 5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_qdss_at_clk_src = {
+       .cmd_rcgr = 0x2d004,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_4,
+       .freq_tbl = ftbl_gcc_qdss_at_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_qdss_at_clk_src",
+               .parent_data = gcc_parent_data_4,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_4),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_qdss_tsctr_clk_src[] = {
+       F(600000000, P_GPLL4_OUT_MAIN, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_qdss_tsctr_clk_src = {
+       .cmd_rcgr = 0x2d01c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_4,
+       .freq_tbl = ftbl_gcc_qdss_tsctr_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_qdss_tsctr_clk_src",
+               .parent_data = gcc_parent_data_4,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_4),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_fixed_factor gcc_qdss_tsctr_div2_clk_src = {
+       .mult = 1,
+       .div = 2,
+       .hw.init = &(struct clk_init_data) {
+               .name = "gcc_qdss_tsctr_div2_clk_src",
+               .parent_hws = (const struct clk_hw *[]) {
+                               &gcc_qdss_tsctr_clk_src.clkr.hw },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_fixed_factor_ops,
+       },
+};
+
+static struct clk_fixed_factor gcc_qdss_tsctr_div3_clk_src = {
+       .mult = 1,
+       .div = 3,
+       .hw.init = &(struct clk_init_data) {
+               .name = "gcc_qdss_tsctr_div3_clk_src",
+               .parent_hws = (const struct clk_hw *[]) {
+                               &gcc_qdss_tsctr_clk_src.clkr.hw },
+               .num_parents = 1,
+               .ops = &clk_fixed_factor_ops,
+       },
+};
+
+static struct clk_fixed_factor gcc_qdss_tsctr_div4_clk_src = {
+       .mult = 1,
+       .div = 4,
+       .hw.init = &(struct clk_init_data) {
+               .name = "gcc_qdss_tsctr_div4_clk_src",
+               .parent_hws = (const struct clk_hw *[]) {
+                               &gcc_qdss_tsctr_clk_src.clkr.hw },
+               .num_parents = 1,
+               .ops = &clk_fixed_factor_ops,
+       },
+};
+
+static struct clk_fixed_factor gcc_qdss_tsctr_div8_clk_src = {
+       .mult = 1,
+       .div = 8,
+       .hw.init = &(struct clk_init_data) {
+               .name = "gcc_qdss_tsctr_div8_clk_src",
+               .parent_hws = (const struct clk_hw *[]) {
+                               &gcc_qdss_tsctr_clk_src.clkr.hw },
+               .num_parents = 1,
+               .ops = &clk_fixed_factor_ops,
+       },
+};
+
+static struct clk_fixed_factor gcc_qdss_tsctr_div16_clk_src = {
+       .mult = 1,
+       .div = 16,
+       .hw.init = &(struct clk_init_data) {
+               .name = "gcc_qdss_tsctr_div16_clk_src",
+               .parent_hws = (const struct clk_hw *[]) {
+                               &gcc_qdss_tsctr_clk_src.clkr.hw },
+               .num_parents = 1,
+               .ops = &clk_fixed_factor_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_qpic_io_macro_clk_src[] = {
+       F(24000000, P_XO, 1, 0, 0),
+       F(100000000, P_GPLL0_OUT_MAIN, 8, 0, 0),
+       F(200000000, P_GPLL0_OUT_MAIN, 4, 0, 0),
+       F(320000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_qpic_io_macro_clk_src = {
+       .cmd_rcgr = 0x32004,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_8,
+       .freq_tbl = ftbl_gcc_qpic_io_macro_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_qpic_io_macro_clk_src",
+               .parent_data = gcc_parent_data_8,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_8),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_sdcc1_apps_clk_src[] = {
+       F(143713, P_XO, 1, 1, 167),
+       F(400000, P_XO, 1, 1, 60),
+       F(24000000, P_XO, 1, 0, 0),
+       F(48000000, P_GPLL2_OUT_MAIN, 12, 1, 2),
+       F(96000000, P_GPLL2_OUT_MAIN, 12, 0, 0),
+       F(177777778, P_GPLL0_OUT_MAIN, 4.5, 0, 0),
+       F(192000000, P_GPLL2_OUT_MAIN, 6, 0, 0),
+       F(200000000, P_GPLL0_OUT_MAIN, 4, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_sdcc1_apps_clk_src = {
+       .cmd_rcgr = 0x33004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_9,
+       .freq_tbl = ftbl_gcc_sdcc1_apps_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_sdcc1_apps_clk_src",
+               .parent_data = gcc_parent_data_9,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_9),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_sleep_clk_src[] = {
+       F(32000, P_SLEEP_CLK, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_sleep_clk_src = {
+       .cmd_rcgr = 0x3400c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_10,
+       .freq_tbl = ftbl_gcc_sleep_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_sleep_clk_src",
+               .parent_data = gcc_parent_data_10,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_10),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_system_noc_bfdcd_clk_src[] = {
+       F(24000000, P_XO, 1, 0, 0),
+       F(133333333, P_GPLL0_OUT_MAIN, 6, 0, 0),
+       F(200000000, P_GPLL0_OUT_MAIN, 4, 0, 0),
+       F(266666667, P_GPLL4_OUT_MAIN, 4.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_system_noc_bfdcd_clk_src = {
+       .cmd_rcgr = 0x2e004,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_11,
+       .freq_tbl = ftbl_gcc_system_noc_bfdcd_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_system_noc_bfdcd_clk_src",
+               .parent_data = gcc_parent_data_11,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_11),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_fixed_factor gcc_system_noc_bfdcd_div2_clk_src = {
+       .mult = 1,
+       .div = 2,
+       .hw.init = &(struct clk_init_data) {
+               .name = "gcc_system_noc_bfdcd_div2_clk_src",
+               .parent_hws = (const struct clk_hw *[]) {
+                               &gcc_system_noc_bfdcd_clk_src.clkr.hw },
+               .num_parents = 1,
+               .ops = &clk_fixed_factor_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
+static struct clk_rcg2 gcc_uniphy_sys_clk_src = {
+       .cmd_rcgr = 0x16004,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo,
+       .freq_tbl = ftbl_gcc_nss_ts_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_uniphy_sys_clk_src",
+               .parent_data = &gcc_parent_data_xo,
+               .num_parents = 1,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_usb0_aux_clk_src = {
+       .cmd_rcgr = 0x2c018,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_12,
+       .freq_tbl = ftbl_gcc_pcie_aux_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_usb0_aux_clk_src",
+               .parent_data = gcc_parent_data_12,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_12),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_usb0_lfps_clk_src[] = {
+       F(25000000, P_GPLL0_OUT_MAIN, 16, 1, 2),
+       { }
+};
+
+static struct clk_rcg2 gcc_usb0_lfps_clk_src = {
+       .cmd_rcgr = 0x2c07c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_1,
+       .freq_tbl = ftbl_gcc_usb0_lfps_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_usb0_lfps_clk_src",
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_usb0_master_clk_src = {
+       .cmd_rcgr = 0x2c004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_gp1_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_usb0_master_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_usb0_mock_utmi_clk_src[] = {
+       F(60000000, P_GPLL4_OUT_AUX, 10, 1, 2),
+       { }
+};
+
+static struct clk_rcg2 gcc_usb0_mock_utmi_clk_src = {
+       .cmd_rcgr = 0x2c02c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_13,
+       .freq_tbl = ftbl_gcc_usb0_mock_utmi_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_usb0_mock_utmi_clk_src",
+               .parent_data = gcc_parent_data_13,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_13),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_regmap_phy_mux gcc_usb0_pipe_clk_src = {
+       .reg = 0x2c074,
+       .clkr = {
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_usb0_pipe_clk_src",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .index = DT_USB_PCIE_WRAPPER_PIPE_CLK,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_regmap_phy_mux_ops,
+               },
+       },
+};
+
+static struct clk_rcg2 gcc_wcss_ahb_clk_src = {
+       .cmd_rcgr = 0x25030,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_1,
+       .freq_tbl = ftbl_gcc_lpass_sway_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_wcss_ahb_clk_src",
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_xo_clk_src = {
+       .cmd_rcgr = 0x34004,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_xo,
+       .freq_tbl = ftbl_gcc_nss_ts_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_xo_clk_src",
+               .parent_data = &gcc_parent_data_xo,
+               .num_parents = 1,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_fixed_factor gcc_xo_div4_clk_src = {
+       .mult = 1,
+       .div = 4,
+       .hw.init = &(struct clk_init_data) {
+               .name = "gcc_xo_div4_clk_src",
+               .parent_hws = (const struct clk_hw *[]) {
+                               &gcc_xo_clk_src.clkr.hw },
+               .num_parents = 1,
+               .ops = &clk_fixed_factor_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
+static struct clk_regmap_div gcc_qdss_dap_div_clk_src = {
+       .reg = 0x2d028,
+       .shift = 0,
+       .width = 4,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_qdss_dap_div_clk_src",
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gcc_qdss_tsctr_clk_src.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_regmap_div_ro_ops,
+       },
+};
+
+static struct clk_regmap_div gcc_usb0_mock_utmi_div_clk_src = {
+       .reg = 0x2c040,
+       .shift = 0,
+       .width = 2,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_usb0_mock_utmi_div_clk_src",
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gcc_usb0_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_adss_pwm_clk = {
+       .halt_reg = 0x1c00c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1c00c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_adss_pwm_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_adss_pwm_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ahb_clk = {
+       .halt_reg = 0x34024,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x34024,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_ahb_clk = {
+       .halt_reg = 0x1008,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0xb004,
+               .enable_mask = BIT(4),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_blsp1_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup1_i2c_apps_clk = {
+       .halt_reg = 0x2024,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2024,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_blsp1_qup1_i2c_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_blsp1_qup1_spi_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup1_spi_apps_clk = {
+       .halt_reg = 0x2020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2020,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_blsp1_qup1_spi_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_blsp1_qup1_spi_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup2_i2c_apps_clk = {
+       .halt_reg = 0x3024,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3024,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_blsp1_qup2_i2c_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_blsp1_qup2_spi_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup2_spi_apps_clk = {
+       .halt_reg = 0x3020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3020,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_blsp1_qup2_spi_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_blsp1_qup2_spi_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup3_i2c_apps_clk = {
+       .halt_reg = 0x4024,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4024,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_blsp1_qup3_i2c_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_blsp1_qup3_spi_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup3_spi_apps_clk = {
+       .halt_reg = 0x4020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4020,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_blsp1_qup3_spi_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_blsp1_qup3_spi_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_sleep_clk = {
+       .halt_reg = 0x1010,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0xb004,
+               .enable_mask = BIT(5),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_blsp1_sleep_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_sleep_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_uart1_apps_clk = {
+       .halt_reg = 0x2040,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2040,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_blsp1_uart1_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_blsp1_uart1_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_uart2_apps_clk = {
+       .halt_reg = 0x3040,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3040,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_blsp1_uart2_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_blsp1_uart2_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_uart3_apps_clk = {
+       .halt_reg = 0x4054,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4054,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_blsp1_uart3_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_blsp1_uart3_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ce_ahb_clk = {
+       .halt_reg = 0x25074,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x25074,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_ce_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_system_noc_bfdcd_div2_clk_src.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ce_axi_clk = {
+       .halt_reg = 0x25068,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x25068,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_ce_axi_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_system_noc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ce_pcnoc_ahb_clk = {
+       .halt_reg = 0x25070,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x25070,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_ce_pcnoc_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_cmn_12gpll_ahb_clk = {
+       .halt_reg = 0x3a004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3a004,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_cmn_12gpll_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_cmn_12gpll_apu_clk = {
+       .halt_reg = 0x3a00c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3a00c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_cmn_12gpll_apu_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_cmn_12gpll_sys_clk = {
+       .halt_reg = 0x3a008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3a008,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_cmn_12gpll_sys_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_uniphy_sys_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gp1_clk = {
+       .halt_reg = 0x8018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8018,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_gp1_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_gp1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gp2_clk = {
+       .halt_reg = 0x9018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x9018,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_gp2_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_gp2_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_lpass_core_axim_clk = {
+       .halt_reg = 0x27018,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x27018,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_lpass_core_axim_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_lpass_sway_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_lpass_sway_clk = {
+       .halt_reg = 0x27014,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x27014,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_lpass_sway_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_lpass_sway_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mdio_ahb_clk = {
+       .halt_reg = 0x12004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x12004,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_mdio_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mdio_slave_ahb_clk = {
+       .halt_reg = 0x1200c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1200c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_mdio_slave_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mem_noc_q6_axi_clk = {
+       .halt_reg = 0x19010,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x19010,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_mem_noc_q6_axi_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_q6_axim_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mem_noc_ts_clk = {
+       .halt_reg = 0x19028,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x19028,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_mem_noc_ts_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_qdss_tsctr_div8_clk_src.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_nss_ts_clk = {
+       .halt_reg = 0x17018,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x17018,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_nss_ts_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_nss_ts_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_nsscc_clk = {
+       .halt_reg = 0x17034,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x17034,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_nsscc_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_nsscfg_clk = {
+       .halt_reg = 0x1702c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1702c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_nsscfg_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_nssnoc_atb_clk = {
+       .halt_reg = 0x17014,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x17014,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_nssnoc_atb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_qdss_at_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_nssnoc_nsscc_clk = {
+       .halt_reg = 0x17030,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x17030,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_nssnoc_nsscc_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_nssnoc_qosgen_ref_clk = {
+       .halt_reg = 0x1701c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1701c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_nssnoc_qosgen_ref_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_xo_div4_clk_src.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_nssnoc_snoc_1_clk = {
+       .halt_reg = 0x1707c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1707c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_nssnoc_snoc_1_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_system_noc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_nssnoc_snoc_clk = {
+       .halt_reg = 0x17028,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x17028,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_nssnoc_snoc_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_system_noc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_nssnoc_timeout_ref_clk = {
+       .halt_reg = 0x17020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x17020,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_nssnoc_timeout_ref_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_xo_div4_clk_src.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_nssnoc_xo_dcd_clk = {
+       .halt_reg = 0x17074,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x17074,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_nssnoc_xo_dcd_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_xo_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie3x1_0_ahb_clk = {
+       .halt_reg = 0x29030,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x29030,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_pcie3x1_0_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie3x1_0_aux_clk = {
+       .halt_reg = 0x29070,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x29070,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_pcie3x1_0_aux_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcie_aux_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie3x1_0_axi_m_clk = {
+       .halt_reg = 0x29038,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x29038,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_pcie3x1_0_axi_m_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcie3x1_0_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie3x1_0_axi_s_bridge_clk = {
+       .halt_reg = 0x29048,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x29048,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_pcie3x1_0_axi_s_bridge_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcie3x1_0_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie3x1_0_axi_s_clk = {
+       .halt_reg = 0x29040,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x29040,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_pcie3x1_0_axi_s_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcie3x1_0_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie3x1_0_pipe_clk = {
+       .halt_reg = 0x29068,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x29068,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_pcie3x1_0_pipe_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcie3x1_0_pipe_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie3x1_1_ahb_clk = {
+       .halt_reg = 0x2a00c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2a00c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_pcie3x1_1_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie3x1_1_aux_clk = {
+       .halt_reg = 0x2a070,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2a070,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_pcie3x1_1_aux_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcie_aux_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie3x1_1_axi_m_clk = {
+       .halt_reg = 0x2a014,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2a014,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_pcie3x1_1_axi_m_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcie3x1_1_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie3x1_1_axi_s_bridge_clk = {
+       .halt_reg = 0x2a024,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2a024,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_pcie3x1_1_axi_s_bridge_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcie3x1_1_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie3x1_1_axi_s_clk = {
+       .halt_reg = 0x2a01c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2a01c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_pcie3x1_1_axi_s_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcie3x1_1_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie3x1_1_pipe_clk = {
+       .halt_reg = 0x2a068,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x2a068,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_pcie3x1_1_pipe_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcie3x1_1_pipe_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie3x1_phy_ahb_clk = {
+       .halt_reg = 0x29078,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x29078,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_pcie3x1_phy_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie3x2_ahb_clk = {
+       .halt_reg = 0x28030,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x28030,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_pcie3x2_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie3x2_aux_clk = {
+       .halt_reg = 0x28070,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x28070,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_pcie3x2_aux_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcie_aux_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie3x2_axi_m_clk = {
+       .halt_reg = 0x28038,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x28038,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_pcie3x2_axi_m_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcie3x2_axi_m_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie3x2_axi_s_bridge_clk = {
+       .halt_reg = 0x28048,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x28048,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_pcie3x2_axi_s_bridge_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcie3x2_axi_s_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie3x2_axi_s_clk = {
+       .halt_reg = 0x28040,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x28040,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_pcie3x2_axi_s_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcie3x2_axi_s_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie3x2_phy_ahb_clk = {
+       .halt_reg = 0x28080,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x28080,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_pcie3x2_phy_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie3x2_pipe_clk = {
+       .halt_reg = 0x28068,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x28068,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_pcie3x2_pipe_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcie3x2_pipe_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcnoc_at_clk = {
+       .halt_reg = 0x31024,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x31024,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_pcnoc_at_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_qdss_at_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcnoc_lpass_clk = {
+       .halt_reg = 0x31020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x31020,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_pcnoc_lpass_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_lpass_sway_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_prng_ahb_clk = {
+       .halt_reg = 0x13024,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0xb004,
+               .enable_mask = BIT(10),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_prng_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_q6_ahb_clk = {
+       .halt_reg = 0x25014,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x25014,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_q6_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_wcss_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_q6_ahb_s_clk = {
+       .halt_reg = 0x25018,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x25018,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_q6_ahb_s_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_wcss_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_q6_axim_clk = {
+       .halt_reg = 0x2500c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x2500c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_q6_axim_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_q6_axim_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_q6_axis_clk = {
+       .halt_reg = 0x25010,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x25010,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_q6_axis_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_system_noc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_q6_tsctr_1to2_clk = {
+       .halt_reg = 0x25020,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x25020,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_q6_tsctr_1to2_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_qdss_tsctr_div2_clk_src.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_q6ss_atbm_clk = {
+       .halt_reg = 0x2501c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x2501c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_q6ss_atbm_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_qdss_at_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_q6ss_pclkdbg_clk = {
+       .halt_reg = 0x25024,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x25024,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_q6ss_pclkdbg_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_qdss_dap_div_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_q6ss_trig_clk = {
+       .halt_reg = 0x250a0,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x250a0,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_q6ss_trig_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_qdss_dap_div_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qdss_at_clk = {
+       .halt_reg = 0x2d038,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x2d038,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_qdss_at_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_qdss_at_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qdss_cfg_ahb_clk = {
+       .halt_reg = 0x2d06c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x2d06c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_qdss_cfg_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qdss_dap_ahb_clk = {
+       .halt_reg = 0x2d068,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x2d068,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_qdss_dap_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qdss_dap_clk = {
+       .halt_reg = 0x2d05c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0xb004,
+               .enable_mask = BIT(2),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_qdss_dap_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_qdss_dap_div_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qdss_etr_usb_clk = {
+       .halt_reg = 0x2d064,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x2d064,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_qdss_etr_usb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_system_noc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_fixed_factor gcc_eud_at_div_clk_src = {
+       .mult = 1,
+       .div = 6,
+       .hw.init = &(struct clk_init_data) {
+               .name = "gcc_eud_at_div_clk_src",
+               .parent_hws = (const struct clk_hw *[]) {
+                               &gcc_qdss_at_clk_src.clkr.hw },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_fixed_factor_ops,
+       },
+};
+
+static struct clk_branch gcc_qdss_eud_at_clk = {
+       .halt_reg = 0x2d070,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x2d070,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_qdss_eud_at_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_eud_at_div_clk_src.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qpic_ahb_clk = {
+       .halt_reg = 0x32010,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x32010,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_qpic_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qpic_clk = {
+       .halt_reg = 0x32014,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x32014,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_qpic_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qpic_io_macro_clk = {
+       .halt_reg = 0x3200c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3200c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_qpic_io_macro_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_qpic_io_macro_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qpic_sleep_clk = {
+       .halt_reg = 0x3201c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3201c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_qpic_sleep_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_sleep_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sdcc1_ahb_clk = {
+       .halt_reg = 0x33034,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x33034,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_sdcc1_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sdcc1_apps_clk = {
+       .halt_reg = 0x3302c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3302c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const 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_snoc_lpass_cfg_clk = {
+       .halt_reg = 0x2e028,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2e028,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_snoc_lpass_cfg_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_lpass_sway_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_snoc_nssnoc_1_clk = {
+       .halt_reg = 0x17090,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x17090,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_snoc_nssnoc_1_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_system_noc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_snoc_nssnoc_clk = {
+       .halt_reg = 0x17084,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x17084,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_snoc_nssnoc_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_system_noc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_snoc_pcie3_1lane_1_m_clk = {
+       .halt_reg = 0x2e050,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2e050,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_snoc_pcie3_1lane_1_m_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcie3x1_1_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_snoc_pcie3_1lane_1_s_clk = {
+       .halt_reg = 0x2e0ac,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2e0ac,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_snoc_pcie3_1lane_1_s_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcie3x1_1_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_snoc_pcie3_1lane_m_clk = {
+       .halt_reg = 0x2e080,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2e080,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_snoc_pcie3_1lane_m_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcie3x1_0_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_snoc_pcie3_1lane_s_clk = {
+       .halt_reg = 0x2e04c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2e04c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_snoc_pcie3_1lane_s_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcie3x1_0_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_snoc_pcie3_2lane_m_clk = {
+       .halt_reg = 0x2e07c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2e07c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_snoc_pcie3_2lane_m_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcie3x2_axi_m_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_snoc_pcie3_2lane_s_clk = {
+       .halt_reg = 0x2e048,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2e048,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_snoc_pcie3_2lane_s_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcie3x2_axi_s_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_snoc_usb_clk = {
+       .halt_reg = 0x2e058,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x2e058,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_snoc_usb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_usb0_master_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sys_noc_at_clk = {
+       .halt_reg = 0x2e038,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x2e038,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_sys_noc_at_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_qdss_at_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sys_noc_wcss_ahb_clk = {
+       .halt_reg = 0x2e030,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2e030,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_sys_noc_wcss_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_wcss_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_uniphy0_ahb_clk = {
+       .halt_reg = 0x16010,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x16010,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_uniphy0_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_uniphy0_sys_clk = {
+       .halt_reg = 0x1600c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1600c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_uniphy0_sys_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_uniphy_sys_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_uniphy1_ahb_clk = {
+       .halt_reg = 0x1601c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1601c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_uniphy1_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_uniphy1_sys_clk = {
+       .halt_reg = 0x16018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x16018,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_uniphy1_sys_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_uniphy_sys_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb0_aux_clk = {
+       .halt_reg = 0x2c050,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x2c050,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_usb0_aux_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_usb0_aux_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb0_eud_at_clk = {
+       .halt_reg = 0x30004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x30004,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_usb0_eud_at_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_eud_at_div_clk_src.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb0_lfps_clk = {
+       .halt_reg = 0x2c090,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x2c090,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_usb0_lfps_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_usb0_lfps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb0_master_clk = {
+       .halt_reg = 0x2c048,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x2c048,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_usb0_master_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_usb0_master_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb0_mock_utmi_clk = {
+       .halt_reg = 0x2c054,
+       .clkr = {
+               .enable_reg = 0x2c054,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_usb0_mock_utmi_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_usb0_mock_utmi_div_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb0_phy_cfg_ahb_clk = {
+       .halt_reg = 0x2c05c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x2c05c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_usb0_phy_cfg_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb0_pipe_clk = {
+       .halt_reg = 0x2c078,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x2c078,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_usb0_pipe_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_usb0_pipe_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb0_sleep_clk = {
+       .halt_reg = 0x2c058,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x2c058,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_usb0_sleep_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_sleep_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_wcss_axim_clk = {
+       .halt_reg = 0x2505c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2505c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_wcss_axim_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_system_noc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_wcss_axis_clk = {
+       .halt_reg = 0x25060,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x25060,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_wcss_axis_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_system_noc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_wcss_dbg_ifc_apb_bdg_clk = {
+       .halt_reg = 0x25048,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x25048,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_wcss_dbg_ifc_apb_bdg_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_qdss_dap_div_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_wcss_dbg_ifc_apb_clk = {
+       .halt_reg = 0x25038,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x25038,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_wcss_dbg_ifc_apb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_qdss_dap_div_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_wcss_dbg_ifc_atb_bdg_clk = {
+       .halt_reg = 0x2504c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2504c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_wcss_dbg_ifc_atb_bdg_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_qdss_at_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_wcss_dbg_ifc_atb_clk = {
+       .halt_reg = 0x2503c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2503c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_wcss_dbg_ifc_atb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_qdss_at_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_wcss_dbg_ifc_nts_bdg_clk = {
+       .halt_reg = 0x25050,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x25050,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_wcss_dbg_ifc_nts_bdg_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_qdss_tsctr_div2_clk_src.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_wcss_dbg_ifc_nts_clk = {
+       .halt_reg = 0x25040,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x25040,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_wcss_dbg_ifc_nts_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_qdss_tsctr_div2_clk_src.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_wcss_ecahb_clk = {
+       .halt_reg = 0x25058,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x25058,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_wcss_ecahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_wcss_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_wcss_mst_async_bdg_clk = {
+       .halt_reg = 0x2e0b0,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2e0b0,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_wcss_mst_async_bdg_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_system_noc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_wcss_slv_async_bdg_clk = {
+       .halt_reg = 0x2e0b4,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2e0b4,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_wcss_slv_async_bdg_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_system_noc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_xo_clk = {
+       .halt_reg = 0x34018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x34018,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_xo_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_xo_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_xo_div4_clk = {
+       .halt_reg = 0x3401c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3401c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_xo_div4_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_xo_div4_clk_src.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_im_sleep_clk = {
+       .halt_reg = 0x34020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x34020,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_im_sleep_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_sleep_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_nssnoc_pcnoc_1_clk = {
+       .halt_reg = 0x17080,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x17080,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_nssnoc_pcnoc_1_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mem_noc_ahb_clk = {
+       .halt_reg = 0x1900c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1900c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_mem_noc_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_pcnoc_bfdcd_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mem_noc_apss_axi_clk = {
+       .halt_reg = 0x1901c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0xb004,
+               .enable_mask = BIT(6),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_mem_noc_apss_axi_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_apss_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_regmap_div gcc_snoc_qosgen_extref_div_clk_src = {
+       .reg = 0x2e010,
+       .shift = 0,
+       .width = 2,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gcc_snoc_qosgen_extref_div_clk_src",
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gcc_xo_clk_src.clkr.hw,
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_regmap_div_ro_ops,
+       },
+};
+
+static struct clk_branch gcc_mem_noc_qosgen_extref_clk = {
+       .halt_reg = 0x19024,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x19024,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data) {
+                       .name = "gcc_mem_noc_qosgen_extref_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gcc_snoc_qosgen_extref_div_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_regmap *gcc_ipq5332_clocks[] = {
+       [GPLL0_MAIN] = &gpll0_main.clkr,
+       [GPLL0] = &gpll0.clkr,
+       [GPLL2_MAIN] = &gpll2_main.clkr,
+       [GPLL2] = &gpll2.clkr,
+       [GPLL4_MAIN] = &gpll4_main.clkr,
+       [GPLL4] = &gpll4.clkr,
+       [GCC_ADSS_PWM_CLK] = &gcc_adss_pwm_clk.clkr,
+       [GCC_ADSS_PWM_CLK_SRC] = &gcc_adss_pwm_clk_src.clkr,
+       [GCC_AHB_CLK] = &gcc_ahb_clk.clkr,
+       [GCC_APSS_AXI_CLK_SRC] = &gcc_apss_axi_clk_src.clkr,
+       [GCC_BLSP1_AHB_CLK] = &gcc_blsp1_ahb_clk.clkr,
+       [GCC_BLSP1_QUP1_I2C_APPS_CLK] = &gcc_blsp1_qup1_i2c_apps_clk.clkr,
+       [GCC_BLSP1_QUP1_SPI_APPS_CLK] = &gcc_blsp1_qup1_spi_apps_clk.clkr,
+       [GCC_BLSP1_QUP1_SPI_APPS_CLK_SRC] = &gcc_blsp1_qup1_spi_apps_clk_src.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_QUP2_SPI_APPS_CLK_SRC] = &gcc_blsp1_qup2_spi_apps_clk_src.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_QUP3_SPI_APPS_CLK_SRC] = &gcc_blsp1_qup3_spi_apps_clk_src.clkr,
+       [GCC_BLSP1_SLEEP_CLK] = &gcc_blsp1_sleep_clk.clkr,
+       [GCC_BLSP1_UART1_APPS_CLK] = &gcc_blsp1_uart1_apps_clk.clkr,
+       [GCC_BLSP1_UART1_APPS_CLK_SRC] = &gcc_blsp1_uart1_apps_clk_src.clkr,
+       [GCC_BLSP1_UART2_APPS_CLK] = &gcc_blsp1_uart2_apps_clk.clkr,
+       [GCC_BLSP1_UART2_APPS_CLK_SRC] = &gcc_blsp1_uart2_apps_clk_src.clkr,
+       [GCC_BLSP1_UART3_APPS_CLK] = &gcc_blsp1_uart3_apps_clk.clkr,
+       [GCC_BLSP1_UART3_APPS_CLK_SRC] = &gcc_blsp1_uart3_apps_clk_src.clkr,
+       [GCC_CE_AHB_CLK] = &gcc_ce_ahb_clk.clkr,
+       [GCC_CE_AXI_CLK] = &gcc_ce_axi_clk.clkr,
+       [GCC_CE_PCNOC_AHB_CLK] = &gcc_ce_pcnoc_ahb_clk.clkr,
+       [GCC_CMN_12GPLL_AHB_CLK] = &gcc_cmn_12gpll_ahb_clk.clkr,
+       [GCC_CMN_12GPLL_APU_CLK] = &gcc_cmn_12gpll_apu_clk.clkr,
+       [GCC_CMN_12GPLL_SYS_CLK] = &gcc_cmn_12gpll_sys_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_LPASS_CORE_AXIM_CLK] = &gcc_lpass_core_axim_clk.clkr,
+       [GCC_LPASS_SWAY_CLK] = &gcc_lpass_sway_clk.clkr,
+       [GCC_LPASS_SWAY_CLK_SRC] = &gcc_lpass_sway_clk_src.clkr,
+       [GCC_MDIO_AHB_CLK] = &gcc_mdio_ahb_clk.clkr,
+       [GCC_MDIO_SLAVE_AHB_CLK] = &gcc_mdio_slave_ahb_clk.clkr,
+       [GCC_MEM_NOC_Q6_AXI_CLK] = &gcc_mem_noc_q6_axi_clk.clkr,
+       [GCC_MEM_NOC_TS_CLK] = &gcc_mem_noc_ts_clk.clkr,
+       [GCC_NSS_TS_CLK] = &gcc_nss_ts_clk.clkr,
+       [GCC_NSS_TS_CLK_SRC] = &gcc_nss_ts_clk_src.clkr,
+       [GCC_NSSCC_CLK] = &gcc_nsscc_clk.clkr,
+       [GCC_NSSCFG_CLK] = &gcc_nsscfg_clk.clkr,
+       [GCC_NSSNOC_ATB_CLK] = &gcc_nssnoc_atb_clk.clkr,
+       [GCC_NSSNOC_NSSCC_CLK] = &gcc_nssnoc_nsscc_clk.clkr,
+       [GCC_NSSNOC_QOSGEN_REF_CLK] = &gcc_nssnoc_qosgen_ref_clk.clkr,
+       [GCC_NSSNOC_SNOC_1_CLK] = &gcc_nssnoc_snoc_1_clk.clkr,
+       [GCC_NSSNOC_SNOC_CLK] = &gcc_nssnoc_snoc_clk.clkr,
+       [GCC_NSSNOC_TIMEOUT_REF_CLK] = &gcc_nssnoc_timeout_ref_clk.clkr,
+       [GCC_NSSNOC_XO_DCD_CLK] = &gcc_nssnoc_xo_dcd_clk.clkr,
+       [GCC_PCIE3X1_0_AHB_CLK] = &gcc_pcie3x1_0_ahb_clk.clkr,
+       [GCC_PCIE3X1_0_AUX_CLK] = &gcc_pcie3x1_0_aux_clk.clkr,
+       [GCC_PCIE3X1_0_AXI_CLK_SRC] = &gcc_pcie3x1_0_axi_clk_src.clkr,
+       [GCC_PCIE3X1_0_AXI_M_CLK] = &gcc_pcie3x1_0_axi_m_clk.clkr,
+       [GCC_PCIE3X1_0_AXI_S_BRIDGE_CLK] = &gcc_pcie3x1_0_axi_s_bridge_clk.clkr,
+       [GCC_PCIE3X1_0_AXI_S_CLK] = &gcc_pcie3x1_0_axi_s_clk.clkr,
+       [GCC_PCIE3X1_0_PIPE_CLK] = &gcc_pcie3x1_0_pipe_clk.clkr,
+       [GCC_PCIE3X1_0_RCHG_CLK] = &gcc_pcie3x1_0_rchg_clk.clkr,
+       [GCC_PCIE3X1_0_RCHG_CLK_SRC] = &gcc_pcie3x1_0_rchg_clk_src.clkr,
+       [GCC_PCIE3X1_1_AHB_CLK] = &gcc_pcie3x1_1_ahb_clk.clkr,
+       [GCC_PCIE3X1_1_AUX_CLK] = &gcc_pcie3x1_1_aux_clk.clkr,
+       [GCC_PCIE3X1_1_AXI_CLK_SRC] = &gcc_pcie3x1_1_axi_clk_src.clkr,
+       [GCC_PCIE3X1_1_AXI_M_CLK] = &gcc_pcie3x1_1_axi_m_clk.clkr,
+       [GCC_PCIE3X1_1_AXI_S_BRIDGE_CLK] = &gcc_pcie3x1_1_axi_s_bridge_clk.clkr,
+       [GCC_PCIE3X1_1_AXI_S_CLK] = &gcc_pcie3x1_1_axi_s_clk.clkr,
+       [GCC_PCIE3X1_1_PIPE_CLK] = &gcc_pcie3x1_1_pipe_clk.clkr,
+       [GCC_PCIE3X1_1_RCHG_CLK] = &gcc_pcie3x1_1_rchg_clk.clkr,
+       [GCC_PCIE3X1_1_RCHG_CLK_SRC] = &gcc_pcie3x1_1_rchg_clk_src.clkr,
+       [GCC_PCIE3X1_PHY_AHB_CLK] = &gcc_pcie3x1_phy_ahb_clk.clkr,
+       [GCC_PCIE3X2_AHB_CLK] = &gcc_pcie3x2_ahb_clk.clkr,
+       [GCC_PCIE3X2_AUX_CLK] = &gcc_pcie3x2_aux_clk.clkr,
+       [GCC_PCIE3X2_AXI_M_CLK] = &gcc_pcie3x2_axi_m_clk.clkr,
+       [GCC_PCIE3X2_AXI_M_CLK_SRC] = &gcc_pcie3x2_axi_m_clk_src.clkr,
+       [GCC_PCIE3X2_AXI_S_BRIDGE_CLK] = &gcc_pcie3x2_axi_s_bridge_clk.clkr,
+       [GCC_PCIE3X2_AXI_S_CLK] = &gcc_pcie3x2_axi_s_clk.clkr,
+       [GCC_PCIE3X2_AXI_S_CLK_SRC] = &gcc_pcie3x2_axi_s_clk_src.clkr,
+       [GCC_PCIE3X2_PHY_AHB_CLK] = &gcc_pcie3x2_phy_ahb_clk.clkr,
+       [GCC_PCIE3X2_PIPE_CLK] = &gcc_pcie3x2_pipe_clk.clkr,
+       [GCC_PCIE3X2_RCHG_CLK] = &gcc_pcie3x2_rchg_clk.clkr,
+       [GCC_PCIE3X2_RCHG_CLK_SRC] = &gcc_pcie3x2_rchg_clk_src.clkr,
+       [GCC_PCIE_AUX_CLK_SRC] = &gcc_pcie_aux_clk_src.clkr,
+       [GCC_PCNOC_AT_CLK] = &gcc_pcnoc_at_clk.clkr,
+       [GCC_PCNOC_BFDCD_CLK_SRC] = &gcc_pcnoc_bfdcd_clk_src.clkr,
+       [GCC_PCNOC_LPASS_CLK] = &gcc_pcnoc_lpass_clk.clkr,
+       [GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr,
+       [GCC_Q6_AHB_CLK] = &gcc_q6_ahb_clk.clkr,
+       [GCC_Q6_AHB_S_CLK] = &gcc_q6_ahb_s_clk.clkr,
+       [GCC_Q6_AXIM_CLK] = &gcc_q6_axim_clk.clkr,
+       [GCC_Q6_AXIM_CLK_SRC] = &gcc_q6_axim_clk_src.clkr,
+       [GCC_Q6_AXIS_CLK] = &gcc_q6_axis_clk.clkr,
+       [GCC_Q6_TSCTR_1TO2_CLK] = &gcc_q6_tsctr_1to2_clk.clkr,
+       [GCC_Q6SS_ATBM_CLK] = &gcc_q6ss_atbm_clk.clkr,
+       [GCC_Q6SS_PCLKDBG_CLK] = &gcc_q6ss_pclkdbg_clk.clkr,
+       [GCC_Q6SS_TRIG_CLK] = &gcc_q6ss_trig_clk.clkr,
+       [GCC_QDSS_AT_CLK] = &gcc_qdss_at_clk.clkr,
+       [GCC_QDSS_AT_CLK_SRC] = &gcc_qdss_at_clk_src.clkr,
+       [GCC_QDSS_CFG_AHB_CLK] = &gcc_qdss_cfg_ahb_clk.clkr,
+       [GCC_QDSS_DAP_AHB_CLK] = &gcc_qdss_dap_ahb_clk.clkr,
+       [GCC_QDSS_DAP_CLK] = &gcc_qdss_dap_clk.clkr,
+       [GCC_QDSS_DAP_DIV_CLK_SRC] = &gcc_qdss_dap_div_clk_src.clkr,
+       [GCC_QDSS_ETR_USB_CLK] = &gcc_qdss_etr_usb_clk.clkr,
+       [GCC_QDSS_EUD_AT_CLK] = &gcc_qdss_eud_at_clk.clkr,
+       [GCC_QPIC_AHB_CLK] = &gcc_qpic_ahb_clk.clkr,
+       [GCC_QPIC_CLK] = &gcc_qpic_clk.clkr,
+       [GCC_QPIC_IO_MACRO_CLK] = &gcc_qpic_io_macro_clk.clkr,
+       [GCC_QPIC_IO_MACRO_CLK_SRC] = &gcc_qpic_io_macro_clk_src.clkr,
+       [GCC_QPIC_SLEEP_CLK] = &gcc_qpic_sleep_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_SLEEP_CLK_SRC] = &gcc_sleep_clk_src.clkr,
+       [GCC_SNOC_LPASS_CFG_CLK] = &gcc_snoc_lpass_cfg_clk.clkr,
+       [GCC_SNOC_NSSNOC_1_CLK] = &gcc_snoc_nssnoc_1_clk.clkr,
+       [GCC_SNOC_NSSNOC_CLK] = &gcc_snoc_nssnoc_clk.clkr,
+       [GCC_SNOC_PCIE3_1LANE_1_M_CLK] = &gcc_snoc_pcie3_1lane_1_m_clk.clkr,
+       [GCC_SNOC_PCIE3_1LANE_1_S_CLK] = &gcc_snoc_pcie3_1lane_1_s_clk.clkr,
+       [GCC_SNOC_PCIE3_1LANE_M_CLK] = &gcc_snoc_pcie3_1lane_m_clk.clkr,
+       [GCC_SNOC_PCIE3_1LANE_S_CLK] = &gcc_snoc_pcie3_1lane_s_clk.clkr,
+       [GCC_SNOC_PCIE3_2LANE_M_CLK] = &gcc_snoc_pcie3_2lane_m_clk.clkr,
+       [GCC_SNOC_PCIE3_2LANE_S_CLK] = &gcc_snoc_pcie3_2lane_s_clk.clkr,
+       [GCC_SNOC_USB_CLK] = &gcc_snoc_usb_clk.clkr,
+       [GCC_SYS_NOC_AT_CLK] = &gcc_sys_noc_at_clk.clkr,
+       [GCC_SYS_NOC_WCSS_AHB_CLK] = &gcc_sys_noc_wcss_ahb_clk.clkr,
+       [GCC_SYSTEM_NOC_BFDCD_CLK_SRC] = &gcc_system_noc_bfdcd_clk_src.clkr,
+       [GCC_UNIPHY0_AHB_CLK] = &gcc_uniphy0_ahb_clk.clkr,
+       [GCC_UNIPHY0_SYS_CLK] = &gcc_uniphy0_sys_clk.clkr,
+       [GCC_UNIPHY1_AHB_CLK] = &gcc_uniphy1_ahb_clk.clkr,
+       [GCC_UNIPHY1_SYS_CLK] = &gcc_uniphy1_sys_clk.clkr,
+       [GCC_UNIPHY_SYS_CLK_SRC] = &gcc_uniphy_sys_clk_src.clkr,
+       [GCC_USB0_AUX_CLK] = &gcc_usb0_aux_clk.clkr,
+       [GCC_USB0_AUX_CLK_SRC] = &gcc_usb0_aux_clk_src.clkr,
+       [GCC_USB0_EUD_AT_CLK] = &gcc_usb0_eud_at_clk.clkr,
+       [GCC_USB0_LFPS_CLK] = &gcc_usb0_lfps_clk.clkr,
+       [GCC_USB0_LFPS_CLK_SRC] = &gcc_usb0_lfps_clk_src.clkr,
+       [GCC_USB0_MASTER_CLK] = &gcc_usb0_master_clk.clkr,
+       [GCC_USB0_MASTER_CLK_SRC] = &gcc_usb0_master_clk_src.clkr,
+       [GCC_USB0_MOCK_UTMI_CLK] = &gcc_usb0_mock_utmi_clk.clkr,
+       [GCC_USB0_MOCK_UTMI_CLK_SRC] = &gcc_usb0_mock_utmi_clk_src.clkr,
+       [GCC_USB0_MOCK_UTMI_DIV_CLK_SRC] = &gcc_usb0_mock_utmi_div_clk_src.clkr,
+       [GCC_USB0_PHY_CFG_AHB_CLK] = &gcc_usb0_phy_cfg_ahb_clk.clkr,
+       [GCC_USB0_PIPE_CLK] = &gcc_usb0_pipe_clk.clkr,
+       [GCC_USB0_SLEEP_CLK] = &gcc_usb0_sleep_clk.clkr,
+       [GCC_WCSS_AHB_CLK_SRC] = &gcc_wcss_ahb_clk_src.clkr,
+       [GCC_WCSS_AXIM_CLK] = &gcc_wcss_axim_clk.clkr,
+       [GCC_WCSS_AXIS_CLK] = &gcc_wcss_axis_clk.clkr,
+       [GCC_WCSS_DBG_IFC_APB_BDG_CLK] = &gcc_wcss_dbg_ifc_apb_bdg_clk.clkr,
+       [GCC_WCSS_DBG_IFC_APB_CLK] = &gcc_wcss_dbg_ifc_apb_clk.clkr,
+       [GCC_WCSS_DBG_IFC_ATB_BDG_CLK] = &gcc_wcss_dbg_ifc_atb_bdg_clk.clkr,
+       [GCC_WCSS_DBG_IFC_ATB_CLK] = &gcc_wcss_dbg_ifc_atb_clk.clkr,
+       [GCC_WCSS_DBG_IFC_NTS_BDG_CLK] = &gcc_wcss_dbg_ifc_nts_bdg_clk.clkr,
+       [GCC_WCSS_DBG_IFC_NTS_CLK] = &gcc_wcss_dbg_ifc_nts_clk.clkr,
+       [GCC_WCSS_ECAHB_CLK] = &gcc_wcss_ecahb_clk.clkr,
+       [GCC_WCSS_MST_ASYNC_BDG_CLK] = &gcc_wcss_mst_async_bdg_clk.clkr,
+       [GCC_WCSS_SLV_ASYNC_BDG_CLK] = &gcc_wcss_slv_async_bdg_clk.clkr,
+       [GCC_XO_CLK] = &gcc_xo_clk.clkr,
+       [GCC_XO_CLK_SRC] = &gcc_xo_clk_src.clkr,
+       [GCC_XO_DIV4_CLK] = &gcc_xo_div4_clk.clkr,
+       [GCC_IM_SLEEP_CLK] = &gcc_im_sleep_clk.clkr,
+       [GCC_NSSNOC_PCNOC_1_CLK] = &gcc_nssnoc_pcnoc_1_clk.clkr,
+       [GCC_MEM_NOC_AHB_CLK] = &gcc_mem_noc_ahb_clk.clkr,
+       [GCC_MEM_NOC_APSS_AXI_CLK] = &gcc_mem_noc_apss_axi_clk.clkr,
+       [GCC_SNOC_QOSGEN_EXTREF_DIV_CLK_SRC] = &gcc_snoc_qosgen_extref_div_clk_src.clkr,
+       [GCC_MEM_NOC_QOSGEN_EXTREF_CLK] = &gcc_mem_noc_qosgen_extref_clk.clkr,
+       [GCC_PCIE3X2_PIPE_CLK_SRC] = &gcc_pcie3x2_pipe_clk_src.clkr,
+       [GCC_PCIE3X1_0_PIPE_CLK_SRC] = &gcc_pcie3x1_0_pipe_clk_src.clkr,
+       [GCC_PCIE3X1_1_PIPE_CLK_SRC] = &gcc_pcie3x1_1_pipe_clk_src.clkr,
+       [GCC_USB0_PIPE_CLK_SRC] = &gcc_usb0_pipe_clk_src.clkr,
+};
+
+static const struct qcom_reset_map gcc_ipq5332_resets[] = {
+       [GCC_ADSS_BCR] = { 0x1c000 },
+       [GCC_ADSS_PWM_CLK_ARES] = { 0x1c00c, 2 },
+       [GCC_AHB_CLK_ARES] = { 0x34024, 2 },
+       [GCC_APC0_VOLTAGE_DROOP_DETECTOR_BCR] = { 0x38000 },
+       [GCC_APC0_VOLTAGE_DROOP_DETECTOR_GPLL0_CLK_ARES] = { 0x3800c, 2 },
+       [GCC_APSS_AHB_CLK_ARES] = { 0x24018, 2 },
+       [GCC_APSS_AXI_CLK_ARES] = { 0x2401c, 2 },
+       [GCC_BLSP1_AHB_CLK_ARES] = { 0x1008, 2 },
+       [GCC_BLSP1_BCR] = { 0x1000 },
+       [GCC_BLSP1_QUP1_BCR] = { 0x2000 },
+       [GCC_BLSP1_QUP1_I2C_APPS_CLK_ARES] = { 0x2024, 2 },
+       [GCC_BLSP1_QUP1_SPI_APPS_CLK_ARES] = { 0x2020, 2 },
+       [GCC_BLSP1_QUP2_BCR] = { 0x3000 },
+       [GCC_BLSP1_QUP2_I2C_APPS_CLK_ARES] = { 0x3024, 2 },
+       [GCC_BLSP1_QUP2_SPI_APPS_CLK_ARES] = { 0x3020, 2 },
+       [GCC_BLSP1_QUP3_BCR] = { 0x4000 },
+       [GCC_BLSP1_QUP3_I2C_APPS_CLK_ARES] = { 0x4024, 2 },
+       [GCC_BLSP1_QUP3_SPI_APPS_CLK_ARES] = { 0x4020, 2 },
+       [GCC_BLSP1_SLEEP_CLK_ARES] = { 0x1010, 2 },
+       [GCC_BLSP1_UART1_APPS_CLK_ARES] = { 0x2040, 2 },
+       [GCC_BLSP1_UART1_BCR] = { 0x2028 },
+       [GCC_BLSP1_UART2_APPS_CLK_ARES] = { 0x3040, 2 },
+       [GCC_BLSP1_UART2_BCR] = { 0x3028 },
+       [GCC_BLSP1_UART3_APPS_CLK_ARES] = { 0x4054, 2 },
+       [GCC_BLSP1_UART3_BCR] = { 0x4028 },
+       [GCC_CE_BCR] = { 0x18008 },
+       [GCC_CMN_BLK_BCR] = { 0x3a000 },
+       [GCC_CMN_LDO0_BCR] = { 0x1d000 },
+       [GCC_CMN_LDO1_BCR] = { 0x1d008 },
+       [GCC_DCC_BCR] = { 0x35000 },
+       [GCC_GP1_CLK_ARES] = { 0x8018, 2 },
+       [GCC_GP2_CLK_ARES] = { 0x9018, 2 },
+       [GCC_LPASS_BCR] = { 0x27000 },
+       [GCC_LPASS_CORE_AXIM_CLK_ARES] = { 0x27018, 2 },
+       [GCC_LPASS_SWAY_CLK_ARES] = { 0x27014, 2 },
+       [GCC_MDIOM_BCR] = { 0x12000 },
+       [GCC_MDIOS_BCR] = { 0x12008 },
+       [GCC_NSS_BCR] = { 0x17000 },
+       [GCC_NSS_TS_CLK_ARES] = { 0x17018, 2 },
+       [GCC_NSSCC_CLK_ARES] = { 0x17034, 2 },
+       [GCC_NSSCFG_CLK_ARES] = { 0x1702c, 2 },
+       [GCC_NSSNOC_ATB_CLK_ARES] = { 0x17014, 2 },
+       [GCC_NSSNOC_NSSCC_CLK_ARES] = { 0x17030, 2 },
+       [GCC_NSSNOC_QOSGEN_REF_CLK_ARES] = { 0x1701c, 2 },
+       [GCC_NSSNOC_SNOC_1_CLK_ARES] = { 0x1707c, 2 },
+       [GCC_NSSNOC_SNOC_CLK_ARES] = { 0x17028, 2 },
+       [GCC_NSSNOC_TIMEOUT_REF_CLK_ARES] = { 0x17020, 2 },
+       [GCC_NSSNOC_XO_DCD_CLK_ARES] = { 0x17074, 2 },
+       [GCC_PCIE3X1_0_AHB_CLK_ARES] = { 0x29030, 2 },
+       [GCC_PCIE3X1_0_AUX_CLK_ARES] = { 0x29070, 2 },
+       [GCC_PCIE3X1_0_AXI_M_CLK_ARES] = { 0x29038, 2 },
+       [GCC_PCIE3X1_0_AXI_S_BRIDGE_CLK_ARES] = { 0x29048, 2 },
+       [GCC_PCIE3X1_0_AXI_S_CLK_ARES] = { 0x29040, 2 },
+       [GCC_PCIE3X1_0_BCR] = { 0x29000 },
+       [GCC_PCIE3X1_0_LINK_DOWN_BCR] = { 0x29054 },
+       [GCC_PCIE3X1_0_PHY_BCR] = { 0x29060 },
+       [GCC_PCIE3X1_0_PHY_PHY_BCR] = { 0x2905c },
+       [GCC_PCIE3X1_1_AHB_CLK_ARES] = { 0x2a00c, 2 },
+       [GCC_PCIE3X1_1_AUX_CLK_ARES] = { 0x2a070, 2 },
+       [GCC_PCIE3X1_1_AXI_M_CLK_ARES] = { 0x2a014, 2 },
+       [GCC_PCIE3X1_1_AXI_S_BRIDGE_CLK_ARES] = { 0x2a024, 2 },
+       [GCC_PCIE3X1_1_AXI_S_CLK_ARES] = { 0x2a01c, 2 },
+       [GCC_PCIE3X1_1_BCR] = { 0x2a000 },
+       [GCC_PCIE3X1_1_LINK_DOWN_BCR] = { 0x2a028 },
+       [GCC_PCIE3X1_1_PHY_BCR] = { 0x2a030 },
+       [GCC_PCIE3X1_1_PHY_PHY_BCR] = { 0x2a02c },
+       [GCC_PCIE3X1_PHY_AHB_CLK_ARES] = { 0x29078, 2 },
+       [GCC_PCIE3X2_AHB_CLK_ARES] = { 0x28030, 2 },
+       [GCC_PCIE3X2_AUX_CLK_ARES] = { 0x28070, 2 },
+       [GCC_PCIE3X2_AXI_M_CLK_ARES] = { 0x28038, 2 },
+       [GCC_PCIE3X2_AXI_S_BRIDGE_CLK_ARES] = { 0x28048, 2 },
+       [GCC_PCIE3X2_AXI_S_CLK_ARES] = { 0x28040, 2 },
+       [GCC_PCIE3X2_BCR] = { 0x28000 },
+       [GCC_PCIE3X2_LINK_DOWN_BCR] = { 0x28054 },
+       [GCC_PCIE3X2_PHY_AHB_CLK_ARES] = { 0x28080, 2 },
+       [GCC_PCIE3X2_PHY_BCR] = { 0x28060 },
+       [GCC_PCIE3X2PHY_PHY_BCR] = { 0x2805c },
+       [GCC_PCNOC_BCR] = { 0x31000 },
+       [GCC_PCNOC_LPASS_CLK_ARES] = { 0x31020, 2 },
+       [GCC_PRNG_AHB_CLK_ARES] = { 0x13024, 2 },
+       [GCC_PRNG_BCR] = { 0x13020 },
+       [GCC_Q6_AHB_CLK_ARES] = { 0x25014, 2 },
+       [GCC_Q6_AHB_S_CLK_ARES] = { 0x25018, 2 },
+       [GCC_Q6_AXIM_CLK_ARES] = { 0x2500c, 2 },
+       [GCC_Q6_AXIS_CLK_ARES] = { 0x25010, 2 },
+       [GCC_Q6_TSCTR_1TO2_CLK_ARES] = { 0x25020, 2 },
+       [GCC_Q6SS_ATBM_CLK_ARES] = { 0x2501c, 2 },
+       [GCC_Q6SS_PCLKDBG_CLK_ARES] = { 0x25024, 2 },
+       [GCC_Q6SS_TRIG_CLK_ARES] = { 0x250a0, 2 },
+       [GCC_QDSS_APB2JTAG_CLK_ARES] = { 0x2d060, 2 },
+       [GCC_QDSS_AT_CLK_ARES] = { 0x2d038, 2 },
+       [GCC_QDSS_BCR] = { 0x2d000 },
+       [GCC_QDSS_CFG_AHB_CLK_ARES] = { 0x2d06c, 2 },
+       [GCC_QDSS_DAP_AHB_CLK_ARES] = { 0x2d068, 2 },
+       [GCC_QDSS_DAP_CLK_ARES] = { 0x2d05c, 2 },
+       [GCC_QDSS_ETR_USB_CLK_ARES] = { 0x2d064, 2 },
+       [GCC_QDSS_EUD_AT_CLK_ARES] = { 0x2d070, 2 },
+       [GCC_QDSS_STM_CLK_ARES] = { 0x2d040, 2 },
+       [GCC_QDSS_TRACECLKIN_CLK_ARES] = { 0x2d044, 2 },
+       [GCC_QDSS_TS_CLK_ARES] = { 0x2d078, 2 },
+       [GCC_QDSS_TSCTR_DIV16_CLK_ARES] = { 0x2d058, 2 },
+       [GCC_QDSS_TSCTR_DIV2_CLK_ARES] = { 0x2d048, 2 },
+       [GCC_QDSS_TSCTR_DIV3_CLK_ARES] = { 0x2d04c, 2 },
+       [GCC_QDSS_TSCTR_DIV4_CLK_ARES] = { 0x2d050, 2 },
+       [GCC_QDSS_TSCTR_DIV8_CLK_ARES] = { 0x2d054, 2 },
+       [GCC_QPIC_AHB_CLK_ARES] = { 0x32010, 2 },
+       [GCC_QPIC_CLK_ARES] = { 0x32014, 2 },
+       [GCC_QPIC_BCR] = { 0x32000 },
+       [GCC_QPIC_IO_MACRO_CLK_ARES] = { 0x3200c, 2 },
+       [GCC_QPIC_SLEEP_CLK_ARES] = { 0x3201c, 2 },
+       [GCC_QUSB2_0_PHY_BCR] = { 0x2c068 },
+       [GCC_SDCC1_AHB_CLK_ARES] = { 0x33034, 2 },
+       [GCC_SDCC1_APPS_CLK_ARES] = { 0x3302c, 2 },
+       [GCC_SDCC_BCR] = { 0x33000 },
+       [GCC_SNOC_BCR] = { 0x2e000 },
+       [GCC_SNOC_LPASS_CFG_CLK_ARES] = { 0x2e028, 2 },
+       [GCC_SNOC_NSSNOC_1_CLK_ARES] = { 0x17090, 2 },
+       [GCC_SNOC_NSSNOC_CLK_ARES] = { 0x17084, 2 },
+       [GCC_SYS_NOC_QDSS_STM_AXI_CLK_ARES] = { 0x2e034, 2 },
+       [GCC_SYS_NOC_WCSS_AHB_CLK_ARES] = { 0x2e030, 2 },
+       [GCC_UNIPHY0_AHB_CLK_ARES] = { 0x16010, 2 },
+       [GCC_UNIPHY0_BCR] = { 0x16000 },
+       [GCC_UNIPHY0_SYS_CLK_ARES] = { 0x1600c, 2 },
+       [GCC_UNIPHY1_AHB_CLK_ARES] = { 0x1601c, 2 },
+       [GCC_UNIPHY1_BCR] = { 0x16014 },
+       [GCC_UNIPHY1_SYS_CLK_ARES] = { 0x16018, 2 },
+       [GCC_USB0_AUX_CLK_ARES] = { 0x2c050, 2 },
+       [GCC_USB0_EUD_AT_CLK_ARES] = { 0x30004, 2 },
+       [GCC_USB0_LFPS_CLK_ARES] = { 0x2c090, 2 },
+       [GCC_USB0_MASTER_CLK_ARES] = { 0x2c048, 2 },
+       [GCC_USB0_MOCK_UTMI_CLK_ARES] = { 0x2c054, 2 },
+       [GCC_USB0_PHY_BCR] = { 0x2c06c },
+       [GCC_USB0_PHY_CFG_AHB_CLK_ARES] = { 0x2c05c, 2 },
+       [GCC_USB0_SLEEP_CLK_ARES] = { 0x2c058, 2 },
+       [GCC_USB3PHY_0_PHY_BCR] = { 0x2c070 },
+       [GCC_USB_BCR] = { 0x2c000 },
+       [GCC_WCSS_AXIM_CLK_ARES] = { 0x2505c, 2 },
+       [GCC_WCSS_AXIS_CLK_ARES] = { 0x25060, 2 },
+       [GCC_WCSS_BCR] = { 0x18004 },
+       [GCC_WCSS_DBG_IFC_APB_BDG_CLK_ARES] = { 0x25048, 2 },
+       [GCC_WCSS_DBG_IFC_APB_CLK_ARES] = { 0x25038, 2 },
+       [GCC_WCSS_DBG_IFC_ATB_BDG_CLK_ARES] = { 0x2504c, 2 },
+       [GCC_WCSS_DBG_IFC_ATB_CLK_ARES] = { 0x2503c, 2 },
+       [GCC_WCSS_DBG_IFC_NTS_BDG_CLK_ARES] = { 0x25050, 2 },
+       [GCC_WCSS_DBG_IFC_NTS_CLK_ARES] = { 0x25040, 2 },
+       [GCC_WCSS_ECAHB_CLK_ARES] = { 0x25058, 2 },
+       [GCC_WCSS_MST_ASYNC_BDG_CLK_ARES] = { 0x2e0b0, 2 },
+       [GCC_WCSS_Q6_BCR] = { 0x18000 },
+       [GCC_WCSS_SLV_ASYNC_BDG_CLK_ARES] = { 0x2e0b4, 2 },
+       [GCC_XO_CLK_ARES] = { 0x34018, 2 },
+       [GCC_XO_DIV4_CLK_ARES] = { 0x3401c, 2 },
+       [GCC_Q6SS_DBG_ARES] = { 0x25094 },
+       [GCC_WCSS_DBG_BDG_ARES] = { 0x25098, 0 },
+       [GCC_WCSS_DBG_ARES] = { 0x25098, 1 },
+       [GCC_WCSS_AXI_S_ARES] = { 0x25098, 2 },
+       [GCC_WCSS_AXI_M_ARES] = { 0x25098, 3 },
+       [GCC_WCSSAON_ARES] = { 0x2509C },
+       [GCC_PCIE3X2_PIPE_ARES] = { 0x28058, 0 },
+       [GCC_PCIE3X2_CORE_STICKY_ARES] = { 0x28058, 1 },
+       [GCC_PCIE3X2_AXI_S_STICKY_ARES] = { 0x28058, 2 },
+       [GCC_PCIE3X2_AXI_M_STICKY_ARES] = { 0x28058, 3 },
+       [GCC_PCIE3X1_0_PIPE_ARES] = { 0x29058, 0 },
+       [GCC_PCIE3X1_0_CORE_STICKY_ARES] = { 0x29058, 1 },
+       [GCC_PCIE3X1_0_AXI_S_STICKY_ARES] = { 0x29058, 2 },
+       [GCC_PCIE3X1_0_AXI_M_STICKY_ARES] = { 0x29058, 3 },
+       [GCC_PCIE3X1_1_PIPE_ARES] = { 0x2a058, 0 },
+       [GCC_PCIE3X1_1_CORE_STICKY_ARES] = { 0x2a058, 1 },
+       [GCC_PCIE3X1_1_AXI_S_STICKY_ARES] = { 0x2a058, 2 },
+       [GCC_PCIE3X1_1_AXI_M_STICKY_ARES] = { 0x2a058, 3 },
+       [GCC_IM_SLEEP_CLK_ARES] = { 0x34020, 2 },
+       [GCC_NSSNOC_PCNOC_1_CLK_ARES] = { 0x17080, 2 },
+       [GCC_UNIPHY0_XPCS_ARES] = { 0x16050 },
+       [GCC_UNIPHY1_XPCS_ARES] = { 0x16060 },
+};
+
+static const struct regmap_config gcc_ipq5332_regmap_config = {
+       .reg_bits = 32,
+       .reg_stride = 4,
+       .val_bits = 32,
+       .max_register = 0x3f024,
+       .fast_io = true,
+};
+
+static struct clk_hw *gcc_ipq5332_hws[] = {
+       &gpll0_div2.hw,
+       &gcc_xo_div4_clk_src.hw,
+       &gcc_system_noc_bfdcd_div2_clk_src.hw,
+       &gcc_qdss_tsctr_div2_clk_src.hw,
+       &gcc_qdss_tsctr_div3_clk_src.hw,
+       &gcc_qdss_tsctr_div4_clk_src.hw,
+       &gcc_qdss_tsctr_div8_clk_src.hw,
+       &gcc_qdss_tsctr_div16_clk_src.hw,
+       &gcc_eud_at_div_clk_src.hw,
+};
+
+static const struct qcom_cc_desc gcc_ipq5332_desc = {
+       .config = &gcc_ipq5332_regmap_config,
+       .clks = gcc_ipq5332_clocks,
+       .num_clks = ARRAY_SIZE(gcc_ipq5332_clocks),
+       .resets = gcc_ipq5332_resets,
+       .num_resets = ARRAY_SIZE(gcc_ipq5332_resets),
+       .clk_hws = gcc_ipq5332_hws,
+       .num_clk_hws = ARRAY_SIZE(gcc_ipq5332_hws),
+};
+
+static int gcc_ipq5332_probe(struct platform_device *pdev)
+{
+       return qcom_cc_probe(pdev, &gcc_ipq5332_desc);
+}
+
+static const struct of_device_id gcc_ipq5332_match_table[] = {
+       { .compatible = "qcom,ipq5332-gcc" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, gcc_ipq5332_match_table);
+
+static struct platform_driver gcc_ipq5332_driver = {
+       .probe = gcc_ipq5332_probe,
+       .driver = {
+               .name = "gcc-ipq5332",
+               .of_match_table = gcc_ipq5332_match_table,
+       },
+};
+
+static int __init gcc_ipq5332_init(void)
+{
+       return platform_driver_register(&gcc_ipq5332_driver);
+}
+core_initcall(gcc_ipq5332_init);
+
+static void __exit gcc_ipq5332_exit(void)
+{
+       platform_driver_unregister(&gcc_ipq5332_driver);
+}
+module_exit(gcc_ipq5332_exit);
+
+MODULE_DESCRIPTION("QTI GCC IPQ5332 Driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/clk/qcom/gcc-ipq9574.c b/drivers/clk/qcom/gcc-ipq9574.c
new file mode 100644 (file)
index 0000000..b2a2d61
--- /dev/null
@@ -0,0 +1,4248 @@
+// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+/*
+ * Copyright (c) 2023 The Linux Foundation. All rights reserved.
+ */
+
+#include <linux/kernel.h>
+#include <linux/err.h>
+#include <linux/platform_device.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/regmap.h>
+
+#include <linux/reset-controller.h>
+#include <dt-bindings/clock/qcom,ipq9574-gcc.h>
+#include <dt-bindings/reset/qcom,ipq9574-gcc.h>
+
+#include "clk-rcg.h"
+#include "clk-branch.h"
+#include "clk-alpha-pll.h"
+#include "clk-regmap-divider.h"
+#include "clk-regmap-mux.h"
+#include "clk-regmap-phy-mux.h"
+#include "reset.h"
+
+/* Need to match the order of clocks in DT binding */
+enum {
+       DT_XO,
+       DT_SLEEP_CLK,
+       DT_BIAS_PLL_UBI_NC_CLK,
+       DT_PCIE30_PHY0_PIPE_CLK,
+       DT_PCIE30_PHY1_PIPE_CLK,
+       DT_PCIE30_PHY2_PIPE_CLK,
+       DT_PCIE30_PHY3_PIPE_CLK,
+       DT_USB3PHY_0_CC_PIPE_CLK,
+};
+
+enum {
+       P_XO,
+       P_PCIE30_PHY0_PIPE,
+       P_PCIE30_PHY1_PIPE,
+       P_PCIE30_PHY2_PIPE,
+       P_PCIE30_PHY3_PIPE,
+       P_USB3PHY_0_PIPE,
+       P_GPLL0,
+       P_GPLL0_DIV2,
+       P_GPLL0_OUT_AUX,
+       P_GPLL2,
+       P_GPLL4,
+       P_PI_SLEEP,
+       P_BIAS_PLL_UBI_NC_CLK,
+};
+
+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_main = {
+       .offset = 0x20000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .enable_reg = 0x0b000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gpll0_main",
+                       .parent_data = gcc_xo_data,
+                       .num_parents = ARRAY_SIZE(gcc_xo_data),
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static struct clk_fixed_factor gpll0_out_main_div2 = {
+       .mult = 1,
+       .div = 2,
+       .hw.init = &(struct clk_init_data) {
+               .name = "gpll0_out_main_div2",
+               .parent_hws = (const struct clk_hw *[]) {
+                       &gpll0_main.clkr.hw
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_fixed_factor_ops,
+       },
+};
+
+static struct clk_alpha_pll_postdiv gpll0 = {
+       .offset = 0x20000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .width = 4,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gpll0",
+               .parent_hws = (const struct clk_hw *[]) {
+                       &gpll0_main.clkr.hw
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_alpha_pll_postdiv_ro_ops,
+       },
+};
+
+static struct clk_alpha_pll gpll4_main = {
+       .offset = 0x22000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .enable_reg = 0x0b000,
+               .enable_mask = BIT(2),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gpll4_main",
+                       .parent_data = gcc_xo_data,
+                       .num_parents = ARRAY_SIZE(gcc_xo_data),
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll_postdiv gpll4 = {
+       .offset = 0x22000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .width = 4,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gpll4",
+               .parent_hws = (const struct clk_hw *[]) {
+                       &gpll4_main.clkr.hw
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_alpha_pll_postdiv_ro_ops,
+       },
+};
+
+static struct clk_alpha_pll gpll2_main = {
+       .offset = 0x21000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .enable_reg = 0x0b000,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gpll2_main",
+                       .parent_data = gcc_xo_data,
+                       .num_parents = ARRAY_SIZE(gcc_xo_data),
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll_postdiv gpll2 = {
+       .offset = 0x21000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .width = 4,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gpll2",
+               .parent_hws = (const struct clk_hw *[]) {
+                       &gpll2_main.clkr.hw
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_alpha_pll_postdiv_ro_ops,
+       },
+};
+
+static struct clk_branch gcc_sleep_clk_src = {
+       .halt_reg = 0x3400c,
+       .clkr = {
+               .enable_reg = 0x3400c,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_sleep_clk_src",
+                       .parent_data = gcc_sleep_clk_data,
+                       .num_parents = ARRAY_SIZE(gcc_sleep_clk_data),
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct clk_parent_data gcc_xo_gpll0_gpll0_out_main_div2[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_main_div2.hw },
+};
+
+static const struct parent_map gcc_xo_gpll0_gpll0_out_main_div2_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL0_DIV2, 4 },
+};
+
+static const struct clk_parent_data gcc_xo_gpll0[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+};
+
+static const struct parent_map gcc_xo_gpll0_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+};
+
+static const struct clk_parent_data gcc_xo_gpll0_gpll4[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll4.clkr.hw },
+};
+
+static const struct parent_map gcc_xo_gpll0_gpll4_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL4, 2 },
+};
+
+static const struct clk_parent_data gcc_xo_gpll0_gpll0_div2_gpll0[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_main_div2.hw },
+       { .hw = &gpll0.clkr.hw },
+};
+
+static const struct parent_map gcc_xo_gpll0_gpll0_div2_gpll0_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL0_DIV2, 4 },
+       { P_GPLL0, 5 },
+};
+
+static const struct clk_parent_data gcc_xo_gpll0_gpll0_sleep_clk[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_main_div2.hw },
+       { .index = DT_SLEEP_CLK },
+};
+
+static const struct parent_map gcc_xo_gpll0_gpll0_sleep_clk_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL0_DIV2, 4 },
+       { P_PI_SLEEP, 6 },
+};
+
+static const struct clk_parent_data gcc_xo_gpll0_core_pi_sleep_clk[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .index = DT_SLEEP_CLK },
+};
+
+static const struct parent_map gcc_xo_gpll0_core_pi_sleep_clk_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 2 },
+       { P_PI_SLEEP, 6 },
+};
+
+static const struct clk_parent_data gcc_xo_gpll0_gpll4_bias_pll_ubi_nc_clk[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll4.clkr.hw },
+       { .index = DT_BIAS_PLL_UBI_NC_CLK },
+};
+
+static const struct parent_map gcc_xo_gpll0_gpll4_bias_pll_ubi_nc_clk_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL4, 2 },
+       { P_BIAS_PLL_UBI_NC_CLK, 3 },
+};
+
+static const struct clk_parent_data
+                       gcc_xo_gpll0_gpll0_aux_core_pi_sleep_clk[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0.clkr.hw },
+       { .index = DT_SLEEP_CLK },
+};
+
+static const struct parent_map
+                       gcc_xo_gpll0_gpll0_aux_core_pi_sleep_clk_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL0_OUT_AUX, 2 },
+       { P_PI_SLEEP, 6 },
+};
+
+static const struct clk_parent_data gcc_xo_gpll0_out_main_div2_gpll0[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_main_div2.hw },
+};
+
+static const struct parent_map gcc_xo_gpll0_out_main_div2_gpll0_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL0_DIV2, 4 },
+};
+
+static const struct clk_parent_data
+                       gcc_xo_gpll4_gpll0_gpll0_out_main_div2[] = {
+       { .index = DT_XO },
+       { .hw = &gpll4.clkr.hw },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_main_div2.hw },
+};
+
+static const struct parent_map gcc_xo_gpll4_gpll0_gpll0_out_main_div2_map[] = {
+       { P_XO, 0 },
+       { P_GPLL4, 1 },
+       { P_GPLL0, 3 },
+       { P_GPLL0_DIV2, 4 },
+};
+
+static const struct clk_parent_data gcc_usb3phy_0_cc_pipe_clk_xo[] = {
+       { .index = DT_USB3PHY_0_CC_PIPE_CLK },
+       { .index = DT_XO },
+};
+
+static const struct parent_map gcc_usb3phy_0_cc_pipe_clk_xo_map[] = {
+       { P_USB3PHY_0_PIPE, 0 },
+       { P_XO, 2 },
+};
+
+static const struct clk_parent_data
+                       gcc_xo_gpll0_gpll2_gpll0_out_main_div2[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll2.clkr.hw },
+       { .hw = &gpll0_out_main_div2.hw },
+};
+
+static const struct parent_map gcc_xo_gpll0_gpll2_gpll0_out_main_div2_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL2, 2 },
+       { P_GPLL0_DIV2, 4 },
+};
+
+static const struct clk_parent_data gcc_xo_gpll0_gpll4_gpll0_div2[] = {
+       { .index = DT_XO},
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll4.clkr.hw },
+       { .hw = &gpll0_out_main_div2.hw },
+};
+
+static const struct parent_map gcc_xo_gpll0_gpll4_gpll0_div2_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL4, 2 },
+       { P_GPLL0_DIV2, 4 },
+};
+
+static const struct clk_parent_data gcc_xo_gpll4_gpll0_gpll0_div2[] = {
+       { .index = DT_XO },
+       { .hw = &gpll4.clkr.hw },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_main_div2.hw },
+};
+
+static const struct parent_map gcc_xo_gpll4_gpll0_gpll0_div2_map[] = {
+       { P_XO, 0 },
+       { P_GPLL4, 1 },
+       { P_GPLL0, 2 },
+       { P_GPLL0_DIV2, 4 },
+};
+
+static const struct clk_parent_data gcc_xo_gpll0_gpll2[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll2.clkr.hw },
+};
+
+static const struct parent_map gcc_xo_gpll0_gpll2_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL2, 2 },
+};
+
+static const struct clk_parent_data gcc_xo_gpll0_gpll2_gpll4_pi_sleep[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll2.clkr.hw },
+       { .hw = &gpll4.clkr.hw },
+       { .index = DT_SLEEP_CLK },
+};
+
+static const struct parent_map gcc_xo_gpll0_gpll2_gpll4_pi_sleep_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL2, 2 },
+       { P_GPLL4, 3 },
+       { P_PI_SLEEP, 6 },
+};
+
+static const struct clk_parent_data gcc_xo_gpll0_gpll0_aux_gpll2[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll2.clkr.hw },
+};
+
+static const struct parent_map gcc_xo_gpll0_gpll0_aux_gpll2_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL0_OUT_AUX, 2 },
+       { P_GPLL2, 3 },
+};
+
+static const struct freq_tbl ftbl_apss_ahb_clk_src[] = {
+       F(24000000, 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 = 0x2400c,
+       .freq_tbl = ftbl_apss_ahb_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "apss_ahb_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_out_main_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_apss_axi_clk_src[] = {
+       F(533000000, P_GPLL0, 1.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 apss_axi_clk_src = {
+       .cmd_rcgr = 0x24004,
+       .freq_tbl = ftbl_apss_axi_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_div2_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "apss_axi_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_div2_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_div2_gpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_blsp1_qup_i2c_apps_clk_src[] = {
+       F(9600000, P_XO, 2.5, 0, 0),
+       F(24000000, P_XO, 1, 0, 0),
+       F(50000000, P_GPLL0, 16, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 blsp1_qup1_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x02018,
+       .freq_tbl = ftbl_blsp1_qup_i2c_apps_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup1_i2c_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_out_main_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_blsp1_qup_spi_apps_clk_src[] = {
+       F(960000, P_XO, 10, 2, 5),
+       F(4800000, P_XO, 5, 0, 0),
+       F(9600000, P_XO, 2, 4, 5),
+       F(16000000, P_GPLL0, 10, 1, 5),
+       F(24000000, 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 = 0x02004,
+       .freq_tbl = ftbl_blsp1_qup_spi_apps_clk_src,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup1_spi_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_out_main_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_qup2_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x03018,
+       .freq_tbl = ftbl_blsp1_qup_i2c_apps_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup2_i2c_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_out_main_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_qup2_spi_apps_clk_src = {
+       .cmd_rcgr = 0x03004,
+       .freq_tbl = ftbl_blsp1_qup_spi_apps_clk_src,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup2_spi_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_out_main_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_qup3_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x04018,
+       .freq_tbl = ftbl_blsp1_qup_i2c_apps_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup3_i2c_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_out_main_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_qup3_spi_apps_clk_src = {
+       .cmd_rcgr = 0x04004,
+       .freq_tbl = ftbl_blsp1_qup_spi_apps_clk_src,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup3_spi_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_out_main_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_qup4_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x05018,
+       .freq_tbl = ftbl_blsp1_qup_i2c_apps_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup4_i2c_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_out_main_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_qup4_spi_apps_clk_src = {
+       .cmd_rcgr = 0x05004,
+       .freq_tbl = ftbl_blsp1_qup_spi_apps_clk_src,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup4_spi_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_out_main_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_qup5_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x06018,
+       .freq_tbl = ftbl_blsp1_qup_i2c_apps_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup5_i2c_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_out_main_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_qup5_spi_apps_clk_src = {
+       .cmd_rcgr = 0x06004,
+       .freq_tbl = ftbl_blsp1_qup_spi_apps_clk_src,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup5_spi_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_out_main_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_qup6_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x07018,
+       .freq_tbl = ftbl_blsp1_qup_i2c_apps_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup6_i2c_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_out_main_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_qup6_spi_apps_clk_src = {
+       .cmd_rcgr = 0x07004,
+       .freq_tbl = ftbl_blsp1_qup_spi_apps_clk_src,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_qup6_spi_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_out_main_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_blsp1_uart_apps_clk_src[] = {
+       F(3686400, P_GPLL0_DIV2, 1, 144, 15625),
+       F(7372800, P_GPLL0_DIV2, 1, 288, 15625),
+       F(14745600, P_GPLL0_DIV2, 1, 576, 15625),
+       F(24000000, P_XO, 1, 0, 0),
+       F(25000000, P_GPLL0, 16, 1, 2),
+       F(32000000, P_GPLL0, 1, 1, 25),
+       F(40000000, P_GPLL0, 1, 1, 20),
+       F(46400000, P_GPLL0, 1, 29, 500),
+       F(48000000, P_GPLL0, 1, 3, 50),
+       F(51200000, P_GPLL0, 1, 8, 125),
+       F(56000000, P_GPLL0, 1, 7, 100),
+       F(58982400, P_GPLL0, 1, 1152, 15625),
+       F(60000000, P_GPLL0, 1, 3, 40),
+       F(64000000, P_GPLL0, 12.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 blsp1_uart1_apps_clk_src = {
+       .cmd_rcgr = 0x0202c,
+       .freq_tbl = ftbl_blsp1_uart_apps_clk_src,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_uart1_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_out_main_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_uart2_apps_clk_src = {
+       .cmd_rcgr = 0x0302c,
+       .freq_tbl = ftbl_blsp1_uart_apps_clk_src,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_uart2_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_out_main_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_uart3_apps_clk_src = {
+       .cmd_rcgr = 0x0402c,
+       .freq_tbl = ftbl_blsp1_uart_apps_clk_src,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_uart3_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_out_main_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_uart4_apps_clk_src = {
+       .cmd_rcgr = 0x0502c,
+       .freq_tbl = ftbl_blsp1_uart_apps_clk_src,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_uart4_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_out_main_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_uart5_apps_clk_src = {
+       .cmd_rcgr = 0x0602c,
+       .freq_tbl = ftbl_blsp1_uart_apps_clk_src,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_uart5_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_out_main_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 blsp1_uart6_apps_clk_src = {
+       .cmd_rcgr = 0x0702c,
+       .freq_tbl = ftbl_blsp1_uart_apps_clk_src,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp1_uart6_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_out_main_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_apss_ahb_clk = {
+       .halt_reg = 0x24018,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x0b004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_apss_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &apss_ahb_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_apss_axi_clk = {
+       .halt_reg = 0x2401c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x0b004,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_apss_axi_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &apss_axi_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup1_i2c_apps_clk = {
+       .halt_reg = 0x2024,
+       .clkr = {
+               .enable_reg = 0x2024,
+               .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,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup1_spi_apps_clk = {
+       .halt_reg = 0x02020,
+       .clkr = {
+               .enable_reg = 0x02020,
+               .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,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup2_i2c_apps_clk = {
+       .halt_reg = 0x03024,
+       .clkr = {
+               .enable_reg = 0x03024,
+               .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,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup2_spi_apps_clk = {
+       .halt_reg = 0x03020,
+       .clkr = {
+               .enable_reg = 0x03020,
+               .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,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup3_i2c_apps_clk = {
+       .halt_reg = 0x04024,
+       .clkr = {
+               .enable_reg = 0x04024,
+               .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,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup3_spi_apps_clk = {
+       .halt_reg = 0x04020,
+       .clkr = {
+               .enable_reg = 0x04020,
+               .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,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup4_i2c_apps_clk = {
+       .halt_reg = 0x05024,
+       .clkr = {
+               .enable_reg = 0x05024,
+               .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,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup4_spi_apps_clk = {
+       .halt_reg = 0x05020,
+       .clkr = {
+               .enable_reg = 0x05020,
+               .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,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup5_i2c_apps_clk = {
+       .halt_reg = 0x06024,
+       .clkr = {
+               .enable_reg = 0x06024,
+               .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,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup5_spi_apps_clk = {
+       .halt_reg = 0x06020,
+       .clkr = {
+               .enable_reg = 0x06020,
+               .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,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup6_i2c_apps_clk = {
+       .halt_reg = 0x07024,
+       .clkr = {
+               .enable_reg = 0x07024,
+               .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,
+                       .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_qup6_spi_apps_clk = {
+       .halt_reg = 0x07020,
+       .clkr = {
+               .enable_reg = 0x07020,
+               .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,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_uart1_apps_clk = {
+       .halt_reg = 0x02040,
+       .clkr = {
+               .enable_reg = 0x02040,
+               .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,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_uart2_apps_clk = {
+       .halt_reg = 0x03040,
+       .clkr = {
+               .enable_reg = 0x03040,
+               .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,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_uart3_apps_clk = {
+       .halt_reg = 0x04054,
+       .clkr = {
+               .enable_reg = 0x04054,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_uart3_apps_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp1_uart3_apps_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_uart4_apps_clk = {
+       .halt_reg = 0x05040,
+       .clkr = {
+               .enable_reg = 0x05040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_uart4_apps_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp1_uart4_apps_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_uart5_apps_clk = {
+       .halt_reg = 0x06040,
+       .clkr = {
+               .enable_reg = 0x06040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_uart5_apps_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp1_uart5_apps_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_uart6_apps_clk = {
+       .halt_reg = 0x07040,
+       .clkr = {
+               .enable_reg = 0x07040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_uart6_apps_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &blsp1_uart6_apps_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_pcie0_axi_m_clk_src[] = {
+       F(240000000, P_GPLL4, 5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 pcie0_axi_m_clk_src = {
+       .cmd_rcgr = 0x28018,
+       .freq_tbl = ftbl_pcie0_axi_m_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll4_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "pcie0_axi_m_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll4,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll4),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_pcie0_axi_m_clk = {
+       .halt_reg = 0x28038,
+       .clkr = {
+               .enable_reg = 0x28038,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie0_axi_m_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie0_axi_m_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_anoc_pcie0_1lane_m_clk = {
+       .halt_reg = 0x2e07c,
+       .clkr = {
+               .enable_reg = 0x2e07c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_anoc_pcie0_1lane_m_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie0_axi_m_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_rcg2 pcie1_axi_m_clk_src = {
+       .cmd_rcgr = 0x29018,
+       .freq_tbl = ftbl_pcie0_axi_m_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll4_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "pcie1_axi_m_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll4,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll4),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_pcie1_axi_m_clk = {
+       .halt_reg = 0x29038,
+       .clkr = {
+               .enable_reg = 0x29038,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie1_axi_m_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie1_axi_m_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_anoc_pcie1_1lane_m_clk = {
+       .halt_reg = 0x2e08c,
+       .clkr = {
+               .enable_reg = 0x2e08c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_anoc_pcie1_1lane_m_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie1_axi_m_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_pcie2_axi_m_clk_src[] = {
+       F(342857143, P_GPLL4, 3.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 pcie2_axi_m_clk_src = {
+       .cmd_rcgr = 0x2a018,
+       .freq_tbl = ftbl_pcie2_axi_m_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll4_bias_pll_ubi_nc_clk_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "pcie2_axi_m_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll4_bias_pll_ubi_nc_clk,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll4_bias_pll_ubi_nc_clk),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_pcie2_axi_m_clk = {
+       .halt_reg = 0x2a038,
+       .clkr = {
+               .enable_reg = 0x2a038,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie2_axi_m_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie2_axi_m_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_anoc_pcie2_2lane_m_clk = {
+       .halt_reg = 0x2e080,
+       .clkr = {
+               .enable_reg = 0x2e080,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_anoc_pcie2_2lane_m_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie2_axi_m_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_rcg2 pcie3_axi_m_clk_src = {
+       .cmd_rcgr = 0x2b018,
+       .freq_tbl = ftbl_pcie2_axi_m_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll4_bias_pll_ubi_nc_clk_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "pcie3_axi_m_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll4_bias_pll_ubi_nc_clk,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll4_bias_pll_ubi_nc_clk),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_pcie3_axi_m_clk = {
+       .halt_reg = 0x2b038,
+       .clkr = {
+               .enable_reg = 0x2b038,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie3_axi_m_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie3_axi_m_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_anoc_pcie3_2lane_m_clk = {
+       .halt_reg = 0x2e090,
+       .clkr = {
+               .enable_reg = 0x2e090,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_anoc_pcie3_2lane_m_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie3_axi_m_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_rcg2 pcie0_axi_s_clk_src = {
+       .cmd_rcgr = 0x28020,
+       .freq_tbl = ftbl_pcie0_axi_m_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll4_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "pcie0_axi_s_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll4,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll4),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_pcie0_axi_s_clk = {
+       .halt_reg = 0x2803c,
+       .clkr = {
+               .enable_reg = 0x2803c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie0_axi_s_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie0_axi_s_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie0_axi_s_bridge_clk = {
+       .halt_reg = 0x28040,
+       .clkr = {
+               .enable_reg = 0x28040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie0_axi_s_bridge_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie0_axi_s_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_snoc_pcie0_1lane_s_clk = {
+       .halt_reg = 0x2e048,
+       .clkr = {
+               .enable_reg = 0x2e048,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_snoc_pcie0_1lane_s_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie0_axi_s_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_rcg2 pcie1_axi_s_clk_src = {
+       .cmd_rcgr = 0x29020,
+       .freq_tbl = ftbl_pcie0_axi_m_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll4_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "pcie1_axi_s_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll4,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll4),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_pcie1_axi_s_clk = {
+       .halt_reg = 0x2903c,
+       .clkr = {
+               .enable_reg = 0x2903c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie1_axi_s_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie1_axi_s_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie1_axi_s_bridge_clk = {
+       .halt_reg = 0x29040,
+       .clkr = {
+               .enable_reg = 0x29040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie1_axi_s_bridge_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie1_axi_s_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_snoc_pcie1_1lane_s_clk = {
+       .halt_reg = 0x2e04c,
+       .clkr = {
+               .enable_reg = 0x2e04c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_snoc_pcie1_1lane_s_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie1_axi_s_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_rcg2 pcie2_axi_s_clk_src = {
+       .cmd_rcgr = 0x2a020,
+       .freq_tbl = ftbl_pcie0_axi_m_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll4_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "pcie2_axi_s_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll4,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll4),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_pcie2_axi_s_clk = {
+       .halt_reg = 0x2a03c,
+       .clkr = {
+               .enable_reg = 0x2a03c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie2_axi_s_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie2_axi_s_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie2_axi_s_bridge_clk = {
+       .halt_reg = 0x2a040,
+       .clkr = {
+               .enable_reg = 0x2a040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie2_axi_s_bridge_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie2_axi_s_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_snoc_pcie2_2lane_s_clk = {
+       .halt_reg = 0x2e050,
+       .clkr = {
+               .enable_reg = 0x2e050,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_snoc_pcie2_2lane_s_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie2_axi_s_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_rcg2 pcie3_axi_s_clk_src = {
+       .cmd_rcgr = 0x2b020,
+       .freq_tbl = ftbl_pcie0_axi_m_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll4_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "pcie3_axi_s_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll4,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll4),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_pcie3_axi_s_clk = {
+       .halt_reg = 0x2b03c,
+       .clkr = {
+               .enable_reg = 0x2b03c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie3_axi_s_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie3_axi_s_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie3_axi_s_bridge_clk = {
+       .halt_reg = 0x2b040,
+       .clkr = {
+               .enable_reg = 0x2b040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie3_axi_s_bridge_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie3_axi_s_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_snoc_pcie3_2lane_s_clk = {
+       .halt_reg = 0x2e054,
+       .clkr = {
+               .enable_reg = 0x2e054,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_snoc_pcie3_2lane_s_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie3_axi_s_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_regmap_phy_mux pcie0_pipe_clk_src = {
+       .reg = 0x28064,
+       .clkr = {
+               .hw.init = &(struct clk_init_data) {
+                       .name = "pcie0_pipe_clk_src",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .index = DT_PCIE30_PHY0_PIPE_CLK,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_regmap_phy_mux_ops,
+               },
+       },
+};
+
+static struct clk_regmap_phy_mux pcie1_pipe_clk_src = {
+       .reg = 0x29064,
+       .clkr = {
+               .hw.init = &(struct clk_init_data) {
+                       .name = "pcie1_pipe_clk_src",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .index = DT_PCIE30_PHY1_PIPE_CLK,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_regmap_phy_mux_ops,
+               },
+       },
+};
+
+static struct clk_regmap_phy_mux pcie2_pipe_clk_src = {
+       .reg = 0x2a064,
+       .clkr = {
+               .hw.init = &(struct clk_init_data) {
+                       .name = "pcie2_pipe_clk_src",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .index = DT_PCIE30_PHY2_PIPE_CLK,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_regmap_phy_mux_ops,
+               },
+       },
+};
+
+static struct clk_regmap_phy_mux pcie3_pipe_clk_src = {
+       .reg = 0x2b064,
+       .clkr = {
+               .hw.init = &(struct clk_init_data) {
+                       .name = "pcie3_pipe_clk_src",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .index = DT_PCIE30_PHY3_PIPE_CLK,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_regmap_phy_mux_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_pcie_rchng_clk_src[] = {
+       F(24000000, P_XO, 1, 0, 0),
+       F(100000000, P_GPLL0, 8, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 pcie0_rchng_clk_src = {
+       .cmd_rcgr = 0x28028,
+       .freq_tbl = ftbl_pcie_rchng_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "pcie0_rchng_clk_src",
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_pcie0_rchng_clk = {
+       .halt_reg = 0x28028,
+       .clkr = {
+               .enable_reg = 0x28028,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie0_rchng_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie0_rchng_clk_src.clkr.hw
+
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_rcg2 pcie1_rchng_clk_src = {
+       .cmd_rcgr = 0x29028,
+       .freq_tbl = ftbl_pcie_rchng_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "pcie1_rchng_clk_src",
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_pcie1_rchng_clk = {
+       .halt_reg = 0x29028,
+       .clkr = {
+               .enable_reg = 0x29028,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie1_rchng_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie1_rchng_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_rcg2 pcie2_rchng_clk_src = {
+       .cmd_rcgr = 0x2a028,
+       .freq_tbl = ftbl_pcie_rchng_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "pcie2_rchng_clk_src",
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_pcie2_rchng_clk = {
+       .halt_reg = 0x2a028,
+       .clkr = {
+               .enable_reg = 0x2a028,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie2_rchng_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie2_rchng_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_rcg2 pcie3_rchng_clk_src = {
+       .cmd_rcgr = 0x2b028,
+       .freq_tbl = ftbl_pcie_rchng_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "pcie3_rchng_clk_src",
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_pcie3_rchng_clk = {
+       .halt_reg = 0x2b028,
+       .clkr = {
+               .enable_reg = 0x2b028,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie3_rchng_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie3_rchng_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_pcie_aux_clk_src[] = {
+       F(20000000, P_GPLL0, 10, 1, 4),
+       { }
+};
+
+static struct clk_rcg2 pcie_aux_clk_src = {
+       .cmd_rcgr = 0x28004,
+       .freq_tbl = ftbl_pcie_aux_clk_src,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_aux_core_pi_sleep_clk_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "pcie_aux_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_aux_core_pi_sleep_clk,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_aux_core_pi_sleep_clk),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_pcie0_aux_clk = {
+       .halt_reg = 0x28034,
+       .clkr = {
+               .enable_reg = 0x28034,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie0_aux_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie_aux_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie1_aux_clk = {
+       .halt_reg = 0x29034,
+       .clkr = {
+               .enable_reg = 0x29034,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie1_aux_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie_aux_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie2_aux_clk = {
+       .halt_reg = 0x2a034,
+       .clkr = {
+               .enable_reg = 0x2a034,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie2_aux_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie_aux_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie3_aux_clk = {
+       .halt_reg = 0x2b034,
+       .clkr = {
+               .enable_reg = 0x2b034,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie3_aux_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcie_aux_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_usb_aux_clk_src[] = {
+       F(24000000, P_XO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 usb0_aux_clk_src = {
+       .cmd_rcgr = 0x2c018,
+       .freq_tbl = ftbl_usb_aux_clk_src,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_core_pi_sleep_clk_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "usb0_aux_clk_src",
+               .parent_data = gcc_xo_gpll0_core_pi_sleep_clk,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_core_pi_sleep_clk),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_usb0_aux_clk = {
+       .halt_reg = 0x2c048,
+       .clkr = {
+               .enable_reg = 0x2c048,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_usb0_aux_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &usb0_aux_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_usb0_master_clk_src[] = {
+       F(100000000, P_GPLL0, 8, 0, 0),
+       F(200000000, P_GPLL0, 4, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 usb0_master_clk_src = {
+       .cmd_rcgr = 0x2c004,
+       .freq_tbl = ftbl_usb0_master_clk_src,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_out_main_div2_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "usb0_master_clk_src",
+               .parent_data = gcc_xo_gpll0_out_main_div2_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_out_main_div2_gpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_usb0_master_clk = {
+       .halt_reg = 0x2c044,
+       .clkr = {
+               .enable_reg = 0x2c044,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_usb0_master_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &usb0_master_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_snoc_usb_clk = {
+       .halt_reg = 0x2e058,
+       .clkr = {
+               .enable_reg = 0x2e058,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_snoc_usb_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &usb0_master_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_anoc_usb_axi_clk = {
+       .halt_reg = 0x2e084,
+       .clkr = {
+               .enable_reg = 0x2e084,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_anoc_usb_axi_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &usb0_master_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_usb0_mock_utmi_clk_src[] = {
+       F(24000000, P_XO, 1, 0, 0),
+       F(60000000, P_GPLL4, 10, 1, 2),
+       { }
+};
+
+static struct clk_rcg2 usb0_mock_utmi_clk_src = {
+       .cmd_rcgr = 0x2c02c,
+       .freq_tbl = ftbl_usb0_mock_utmi_clk_src,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll4_gpll0_gpll0_out_main_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "usb0_mock_utmi_clk_src",
+               .parent_data = gcc_xo_gpll4_gpll0_gpll0_out_main_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll4_gpll0_gpll0_out_main_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_regmap_div usb0_mock_utmi_div_clk_src = {
+       .reg = 0x2c040,
+       .shift = 0,
+       .width = 2,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "usb0_mock_utmi_div_clk_src",
+               .parent_data = &(const struct clk_parent_data) {
+                       .hw = &usb0_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_usb0_mock_utmi_clk = {
+       .halt_reg = 0x2c04c,
+       .clkr = {
+               .enable_reg = 0x2c04c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_usb0_mock_utmi_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &usb0_mock_utmi_div_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_regmap_mux usb0_pipe_clk_src = {
+       .reg = 0x2C074,
+       .shift = 8,
+       .width = 2,
+       .parent_map = gcc_usb3phy_0_cc_pipe_clk_xo_map,
+       .clkr = {
+               .hw.init = &(struct clk_init_data) {
+                       .name = "usb0_pipe_clk_src",
+                       .parent_data = gcc_usb3phy_0_cc_pipe_clk_xo,
+                       .num_parents = ARRAY_SIZE(gcc_usb3phy_0_cc_pipe_clk_xo),
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_regmap_mux_closest_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_sdcc_apps_clk_src[] = {
+       F(144000, P_XO, 16, 12, 125),
+       F(400000, P_XO, 12, 1, 5),
+       F(24000000, P_GPLL2, 12, 1, 4),
+       F(48000000, P_GPLL2, 12, 1, 2),
+       F(96000000, P_GPLL2, 12, 0, 0),
+       F(177777778, P_GPLL0, 4.5, 0, 0),
+       F(192000000, P_GPLL2, 6, 0, 0),
+       F(384000000, P_GPLL2, 3, 0, 0),
+       F(400000000, P_GPLL0, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 sdcc1_apps_clk_src = {
+       .cmd_rcgr = 0x33004,
+       .freq_tbl = ftbl_sdcc_apps_clk_src,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll2_gpll0_out_main_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "sdcc1_apps_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll2_gpll0_out_main_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll2_gpll0_out_main_div2),
+               .ops = &clk_rcg2_floor_ops,
+       },
+};
+
+static struct clk_branch gcc_sdcc1_apps_clk = {
+       .halt_reg = 0x3302c,
+       .clkr = {
+               .enable_reg = 0x3302c,
+               .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,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_sdcc_ice_core_clk_src[] = {
+       F(150000000, P_GPLL4, 8, 0, 0),
+       F(300000000, P_GPLL4, 4, 0, 0),
+};
+
+static struct clk_rcg2 sdcc1_ice_core_clk_src = {
+       .cmd_rcgr = 0x33018,
+       .freq_tbl = ftbl_sdcc_ice_core_clk_src,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll4_gpll0_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "sdcc1_ice_core_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll4_gpll0_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll4_gpll0_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_sdcc1_ice_core_clk = {
+       .halt_reg = 0x33030,
+       .clkr = {
+               .enable_reg = 0x33030,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_sdcc1_ice_core_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &sdcc1_ice_core_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_pcnoc_bfdcd_clk_src[] = {
+       F(24000000, 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),
+       { }
+};
+
+static struct clk_rcg2 pcnoc_bfdcd_clk_src = {
+       .cmd_rcgr = 0x31004,
+       .freq_tbl = ftbl_pcnoc_bfdcd_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "pcnoc_bfdcd_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_out_main_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2),
+               .flags = CLK_IS_CRITICAL,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_nsscfg_clk = {
+       .halt_reg = 0x1702c,
+       .clkr = {
+               .enable_reg = 0x1702c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_nsscfg_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_nssnoc_nsscc_clk = {
+       .halt_reg = 0x17030,
+       .clkr = {
+               .enable_reg = 0x17030,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_nssnoc_nsscc_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_nsscc_clk = {
+       .halt_reg = 0x17034,
+       .clkr = {
+               .enable_reg = 0x17034,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_nsscc_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_nssnoc_pcnoc_1_clk = {
+       .halt_reg = 0x17080,
+       .clkr = {
+               .enable_reg = 0x17080,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_nssnoc_pcnoc_1_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qdss_dap_ahb_clk = {
+       .halt_reg = 0x2d064,
+       .clkr = {
+               .enable_reg = 0x2d064,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_qdss_dap_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qdss_cfg_ahb_clk = {
+       .halt_reg = 0x2d068,
+       .clkr = {
+               .enable_reg = 0x2d068,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_qdss_cfg_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qpic_ahb_clk = {
+       .halt_reg = 0x32010,
+       .clkr = {
+               .enable_reg = 0x32010,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_qpic_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qpic_clk = {
+       .halt_reg = 0x32014,
+       .clkr = {
+               .enable_reg = 0x32014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_qpic_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_blsp1_ahb_clk = {
+       .halt_reg = 0x01004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x0b004,
+               .enable_mask = BIT(4),
+               .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,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mdio_ahb_clk = {
+       .halt_reg = 0x17040,
+       .clkr = {
+               .enable_reg = 0x17040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_mdio_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_prng_ahb_clk = {
+       .halt_reg = 0x13024,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x0b004,
+               .enable_mask = BIT(10),
+               .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,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_uniphy0_ahb_clk = {
+       .halt_reg = 0x1704c,
+       .clkr = {
+               .enable_reg = 0x1704c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_uniphy0_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_uniphy1_ahb_clk = {
+       .halt_reg = 0x1705c,
+       .clkr = {
+               .enable_reg = 0x1705c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_uniphy1_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_uniphy2_ahb_clk = {
+       .halt_reg = 0x1706c,
+       .clkr = {
+               .enable_reg = 0x1706c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_uniphy2_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_cmn_12gpll_ahb_clk = {
+       .halt_reg = 0x3a004,
+       .clkr = {
+               .enable_reg = 0x3a004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_cmn_12gpll_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_cmn_12gpll_apu_clk = {
+       .halt_reg = 0x3a00c,
+       .clkr = {
+               .enable_reg = 0x3a00c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_cmn_12gpll_apu_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie0_ahb_clk = {
+       .halt_reg = 0x28030,
+       .clkr = {
+               .enable_reg = 0x28030,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie0_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie1_ahb_clk = {
+       .halt_reg = 0x29030,
+       .clkr = {
+               .enable_reg = 0x29030,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie1_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie2_ahb_clk = {
+       .halt_reg = 0x2a030,
+       .clkr = {
+               .enable_reg = 0x2a030,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie2_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie3_ahb_clk = {
+       .halt_reg = 0x2b030,
+       .clkr = {
+               .enable_reg = 0x2b030,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcie3_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb0_phy_cfg_ahb_clk = {
+       .halt_reg = 0x2c05c,
+       .clkr = {
+               .enable_reg = 0x2c05c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_usb0_phy_cfg_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &pcnoc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sdcc1_ahb_clk = {
+       .halt_reg = 0x33034,
+       .clkr = {
+               .enable_reg = 0x33034,
+               .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,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_system_noc_bfdcd_clk_src[] = {
+       F(24000000, P_XO, 1, 0, 0),
+       F(133333333, P_GPLL0, 6, 0, 0),
+       F(200000000, P_GPLL0, 4, 0, 0),
+       F(342850000, P_GPLL4, 3.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 system_noc_bfdcd_clk_src = {
+       .cmd_rcgr = 0x2e004,
+       .freq_tbl = ftbl_system_noc_bfdcd_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll4_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "system_noc_bfdcd_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll4,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll4),
+               .flags = CLK_IS_CRITICAL,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_q6ss_boot_clk = {
+       .halt_reg = 0x25080,
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x25080,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_q6ss_boot_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &system_noc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_nssnoc_snoc_clk = {
+       .halt_reg = 0x17028,
+       .clkr = {
+               .enable_reg = 0x17028,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_nssnoc_snoc_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &system_noc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_nssnoc_snoc_1_clk = {
+       .halt_reg = 0x1707c,
+       .clkr = {
+               .enable_reg = 0x1707c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_nssnoc_snoc_1_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &system_noc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qdss_etr_usb_clk = {
+       .halt_reg = 0x2d060,
+       .clkr = {
+               .enable_reg = 0x2d060,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_qdss_etr_usb_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &system_noc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_wcss_ahb_clk_src[] = {
+       F(24000000, P_XO, 1, 0, 0),
+       F(133333333, P_GPLL0, 6, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 wcss_ahb_clk_src = {
+       .cmd_rcgr = 0x25030,
+       .freq_tbl = ftbl_wcss_ahb_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "wcss_ahb_clk_src",
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_q6_ahb_clk = {
+       .halt_reg = 0x25014,
+       .clkr = {
+               .enable_reg = 0x25014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_q6_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &wcss_ahb_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_q6_ahb_s_clk = {
+       .halt_reg = 0x25018,
+       .clkr = {
+               .enable_reg = 0x25018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_q6_ahb_s_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &wcss_ahb_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_wcss_ecahb_clk = {
+       .halt_reg = 0x25058,
+       .clkr = {
+               .enable_reg = 0x25058,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_wcss_ecahb_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &wcss_ahb_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_wcss_acmt_clk = {
+       .halt_reg = 0x2505c,
+       .clkr = {
+               .enable_reg = 0x2505c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_wcss_acmt_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &wcss_ahb_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sys_noc_wcss_ahb_clk = {
+       .halt_reg = 0x2e030,
+       .clkr = {
+               .enable_reg = 0x2e030,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_sys_noc_wcss_ahb_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &wcss_ahb_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_wcss_axi_m_clk_src[] = {
+       F(24000000, P_XO, 1, 0, 0),
+       F(133333333, P_GPLL0, 6, 0, 0),
+       F(266666667, P_GPLL0, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 wcss_axi_m_clk_src = {
+       .cmd_rcgr = 0x25078,
+       .freq_tbl = ftbl_wcss_axi_m_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "wcss_axi_m_clk_src",
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_anoc_wcss_axi_m_clk = {
+       .halt_reg = 0x2e0a8,
+       .clkr = {
+               .enable_reg = 0x2e0a8,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_anoc_wcss_axi_m_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &wcss_axi_m_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_qdss_at_clk_src[] = {
+       F(240000000, P_GPLL4, 5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 qdss_at_clk_src = {
+       .cmd_rcgr = 0x2d004,
+       .freq_tbl = ftbl_qdss_at_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll4_gpll0_gpll0_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "qdss_at_clk_src",
+               .parent_data = gcc_xo_gpll4_gpll0_gpll0_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll4_gpll0_gpll0_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_q6ss_atbm_clk = {
+       .halt_reg = 0x2501c,
+       .clkr = {
+               .enable_reg = 0x2501c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_q6ss_atbm_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &qdss_at_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_wcss_dbg_ifc_atb_clk = {
+       .halt_reg = 0x2503c,
+       .clkr = {
+               .enable_reg = 0x2503c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_wcss_dbg_ifc_atb_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &qdss_at_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_nssnoc_atb_clk = {
+       .halt_reg = 0x17014,
+       .clkr = {
+               .enable_reg = 0x17014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_nssnoc_atb_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &qdss_at_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qdss_at_clk = {
+       .halt_reg = 0x2d038,
+       .clkr = {
+               .enable_reg = 0x2d038,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_qdss_at_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &qdss_at_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sys_noc_at_clk = {
+       .halt_reg = 0x2e038,
+       .clkr = {
+               .enable_reg = 0x2e038,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_sys_noc_at_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &qdss_at_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcnoc_at_clk = {
+       .halt_reg = 0x31024,
+       .clkr = {
+               .enable_reg = 0x31024,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_pcnoc_at_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &qdss_at_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_fixed_factor gcc_eud_at_div_clk_src = {
+       .mult = 1,
+       .div = 6,
+       .hw.init = &(struct clk_init_data) {
+               .name = "gcc_eud_at_div_clk_src",
+               .parent_hws = (const struct clk_hw *[]) {
+                       &qdss_at_clk_src.clkr.hw
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_fixed_factor_ops,
+       },
+};
+
+static struct clk_branch gcc_usb0_eud_at_clk = {
+       .halt_reg = 0x30004,
+       .clkr = {
+               .enable_reg = 0x30004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_usb0_eud_at_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &gcc_eud_at_div_clk_src.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qdss_eud_at_clk = {
+       .halt_reg = 0x2d06c,
+       .clkr = {
+               .enable_reg = 0x2d06c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_qdss_eud_at_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &gcc_eud_at_div_clk_src.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_qdss_stm_clk_src[] = {
+       F(24000000, P_XO, 1, 0, 0),
+       F(200000000, P_GPLL0, 4, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 qdss_stm_clk_src = {
+       .cmd_rcgr = 0x2d00c,
+       .freq_tbl = ftbl_qdss_stm_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "qdss_stm_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_out_main_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_qdss_stm_clk = {
+       .halt_reg = 0x2d03c,
+       .clkr = {
+               .enable_reg = 0x2d03c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_qdss_stm_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &qdss_stm_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sys_noc_qdss_stm_axi_clk = {
+       .halt_reg = 0x2e034,
+       .clkr = {
+               .enable_reg = 0x2e034,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_sys_noc_qdss_stm_axi_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &qdss_stm_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_qdss_traceclkin_clk_src[] = {
+       F(300000000, P_GPLL4, 4, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 qdss_traceclkin_clk_src = {
+       .cmd_rcgr = 0x2d014,
+       .freq_tbl = ftbl_qdss_traceclkin_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll4_gpll0_gpll0_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "qdss_traceclkin_clk_src",
+               .parent_data = gcc_xo_gpll4_gpll0_gpll0_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll4_gpll0_gpll0_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_qdss_traceclkin_clk = {
+       .halt_reg = 0x2d040,
+       .clkr = {
+               .enable_reg = 0x2d040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_qdss_traceclkin_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &qdss_traceclkin_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_qdss_tsctr_clk_src[] = {
+       F(600000000, P_GPLL4, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 qdss_tsctr_clk_src = {
+       .cmd_rcgr = 0x2d01c,
+       .freq_tbl = ftbl_qdss_tsctr_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll4_gpll0_gpll0_div2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "qdss_tsctr_clk_src",
+               .parent_data = gcc_xo_gpll4_gpll0_gpll0_div2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll4_gpll0_gpll0_div2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_fixed_factor qdss_tsctr_div2_clk_src = {
+       .mult = 1,
+       .div = 2,
+       .hw.init = &(struct clk_init_data) {
+               .name = "qdss_tsctr_div2_clk_src",
+               .parent_hws = (const struct clk_hw *[]) {
+                       &qdss_tsctr_clk_src.clkr.hw
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_fixed_factor_ops,
+       },
+};
+
+static struct clk_branch gcc_q6_tsctr_1to2_clk = {
+       .halt_reg = 0x25020,
+       .clkr = {
+               .enable_reg = 0x25020,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_q6_tsctr_1to2_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &qdss_tsctr_div2_clk_src.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_wcss_dbg_ifc_nts_clk = {
+       .halt_reg = 0x25040,
+       .clkr = {
+               .enable_reg = 0x25040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_wcss_dbg_ifc_nts_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &qdss_tsctr_div2_clk_src.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qdss_tsctr_div2_clk = {
+       .halt_reg = 0x2d044,
+       .clkr = {
+               .enable_reg = 0x2d044,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_qdss_tsctr_div2_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &qdss_tsctr_div2_clk_src.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_uniphy_sys_clk_src[] = {
+       F(24000000, P_XO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 uniphy_sys_clk_src = {
+       .cmd_rcgr = 0x17090,
+       .freq_tbl = ftbl_uniphy_sys_clk_src,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_xo_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "uniphy_sys_clk_src",
+               .parent_data = gcc_xo_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_data),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 nss_ts_clk_src = {
+       .cmd_rcgr = 0x17088,
+       .freq_tbl = ftbl_uniphy_sys_clk_src,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_xo_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "nss_ts_clk_src",
+               .parent_data = gcc_xo_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_data),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_qdss_ts_clk = {
+       .halt_reg = 0x2d078,
+       .clkr = {
+               .enable_reg = 0x2d078,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_qdss_ts_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &nss_ts_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_fixed_factor qdss_dap_sync_clk_src = {
+       .mult = 1,
+       .div = 4,
+       .hw.init = &(struct clk_init_data) {
+               .name = "qdss_dap_sync_clk_src",
+               .parent_hws = (const struct clk_hw *[]) {
+                       &qdss_tsctr_clk_src.clkr.hw
+               },
+               .num_parents = 1,
+               .ops = &clk_fixed_factor_ops,
+       },
+};
+
+static struct clk_branch gcc_qdss_tsctr_div4_clk = {
+       .halt_reg = 0x2d04c,
+       .clkr = {
+               .enable_reg = 0x2d04c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_qdss_tsctr_div4_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &qdss_dap_sync_clk_src.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_fixed_factor qdss_tsctr_div8_clk_src = {
+       .mult = 1,
+       .div = 8,
+       .hw.init = &(struct clk_init_data) {
+               .name = "qdss_tsctr_div8_clk_src",
+               .parent_hws = (const struct clk_hw *[]) {
+                       &qdss_tsctr_clk_src.clkr.hw
+               },
+               .num_parents = 1,
+               .ops = &clk_fixed_factor_ops,
+       },
+};
+
+static struct clk_branch gcc_nss_ts_clk = {
+       .halt_reg = 0x17018,
+       .clkr = {
+               .enable_reg = 0x17018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_nss_ts_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &nss_ts_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qdss_tsctr_div8_clk = {
+       .halt_reg = 0x2d050,
+       .clkr = {
+               .enable_reg = 0x2d050,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_qdss_tsctr_div8_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &qdss_tsctr_div8_clk_src.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_fixed_factor qdss_tsctr_div16_clk_src = {
+       .mult = 1,
+       .div = 16,
+       .hw.init = &(struct clk_init_data) {
+               .name = "qdss_tsctr_div16_clk_src",
+               .parent_hws = (const struct clk_hw *[]) {
+                       &qdss_tsctr_clk_src.clkr.hw
+               },
+               .num_parents = 1,
+               .ops = &clk_fixed_factor_ops,
+       },
+};
+
+static struct clk_branch gcc_qdss_tsctr_div16_clk = {
+       .halt_reg = 0x2d054,
+       .clkr = {
+               .enable_reg = 0x2d054,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_qdss_tsctr_div16_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &qdss_tsctr_div16_clk_src.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_q6ss_pclkdbg_clk = {
+       .halt_reg = 0x25024,
+       .clkr = {
+               .enable_reg = 0x25024,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_q6ss_pclkdbg_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &qdss_dap_sync_clk_src.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_q6ss_trig_clk = {
+       .halt_reg = 0x25068,
+       .clkr = {
+               .enable_reg = 0x25068,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_q6ss_trig_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &qdss_dap_sync_clk_src.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_wcss_dbg_ifc_apb_clk = {
+       .halt_reg = 0x25038,
+       .clkr = {
+               .enable_reg = 0x25038,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_wcss_dbg_ifc_apb_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &qdss_dap_sync_clk_src.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_wcss_dbg_ifc_dapbus_clk = {
+       .halt_reg = 0x25044,
+       .clkr = {
+               .enable_reg = 0x25044,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_wcss_dbg_ifc_dapbus_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &qdss_dap_sync_clk_src.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qdss_dap_clk = {
+       .halt_reg = 0x2d058,
+       .clkr = {
+               .enable_reg = 0x2d058,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_qdss_dap_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &qdss_dap_sync_clk_src.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qdss_apb2jtag_clk = {
+       .halt_reg = 0x2d05c,
+       .clkr = {
+               .enable_reg = 0x2d05c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_qdss_apb2jtag_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &qdss_dap_sync_clk_src.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_fixed_factor qdss_tsctr_div3_clk_src = {
+       .mult = 1,
+       .div = 3,
+       .hw.init = &(struct clk_init_data) {
+               .name = "qdss_tsctr_div3_clk_src",
+               .parent_hws = (const struct clk_hw *[]) {
+                       &qdss_tsctr_clk_src.clkr.hw
+               },
+               .num_parents = 1,
+               .ops = &clk_fixed_factor_ops,
+       },
+};
+
+static struct clk_branch gcc_qdss_tsctr_div3_clk = {
+       .halt_reg = 0x2d048,
+       .clkr = {
+               .enable_reg = 0x2d048,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_qdss_tsctr_div3_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &qdss_tsctr_div3_clk_src.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_qpic_io_macro_clk_src[] = {
+       F(24000000, P_XO, 1, 0, 0),
+       F(100000000, P_GPLL0, 8, 0, 0),
+       F(200000000, P_GPLL0, 4, 0, 0),
+       F(320000000, P_GPLL0, 2.5, 0, 0),
+       F(400000000, P_GPLL0, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 qpic_io_macro_clk_src = {
+       .cmd_rcgr = 0x32004,
+       .freq_tbl = ftbl_qpic_io_macro_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "qpic_io_macro_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_qpic_io_macro_clk = {
+       .halt_reg = 0x3200c,
+       .clkr = {
+               .enable_reg = 0x3200c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qpic_io_macro_clk",
+                       .parent_hws = (const struct clk_hw *[]){
+                               &qpic_io_macro_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_q6_axi_clk_src[] = {
+       F(533333333, P_GPLL0, 1.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 q6_axi_clk_src = {
+       .cmd_rcgr = 0x25004,
+       .freq_tbl = ftbl_q6_axi_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll2_gpll4_pi_sleep_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "q6_axi_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll2_gpll4_pi_sleep,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll2_gpll4_pi_sleep),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_q6_axim_clk = {
+       .halt_reg = 0x2500c,
+       .clkr = {
+               .enable_reg = 0x2500c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_q6_axim_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &q6_axi_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_wcss_q6_tbu_clk = {
+       .halt_reg = 0x12050,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0xb00c,
+               .enable_mask = BIT(6),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_wcss_q6_tbu_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &q6_axi_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mem_noc_q6_axi_clk = {
+       .halt_reg = 0x19010,
+       .clkr = {
+               .enable_reg = 0x19010,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_mem_noc_q6_axi_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &q6_axi_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_q6_axim2_clk_src[] = {
+       F(342857143, P_GPLL4, 3.5, 0, 0),
+       { }
+};
+
+static const struct parent_map gcc_xo_gpll0_gpll4_bias_pll_ubinc_clk_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL4, 2 },
+       { P_BIAS_PLL_UBI_NC_CLK, 4 },
+};
+
+static struct clk_rcg2 q6_axim2_clk_src = {
+       .cmd_rcgr = 0x25028,
+       .freq_tbl = ftbl_q6_axim2_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll4_bias_pll_ubinc_clk_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "q6_axim2_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll4_bias_pll_ubi_nc_clk,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll4_bias_pll_ubi_nc_clk),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_nssnoc_memnoc_bfdcd_clk_src[] = {
+       F(533333333, P_GPLL0, 1.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 nssnoc_memnoc_bfdcd_clk_src = {
+       .cmd_rcgr = 0x17004,
+       .freq_tbl = ftbl_nssnoc_memnoc_bfdcd_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_aux_gpll2_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "nssnoc_memnoc_bfdcd_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_aux_gpll2,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_aux_gpll2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_nssnoc_memnoc_clk = {
+       .halt_reg = 0x17024,
+       .clkr = {
+               .enable_reg = 0x17024,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_nssnoc_memnoc_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &nssnoc_memnoc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_nssnoc_mem_noc_1_clk = {
+       .halt_reg = 0x17084,
+       .clkr = {
+               .enable_reg = 0x17084,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_nssnoc_mem_noc_1_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &nssnoc_memnoc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_nss_tbu_clk = {
+       .halt_reg = 0x12040,
+       .clkr = {
+               .enable_reg = 0xb00c,
+               .enable_mask = BIT(4),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_nss_tbu_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &nssnoc_memnoc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_mem_noc_nssnoc_clk = {
+       .halt_reg = 0x19014,
+       .clkr = {
+               .enable_reg = 0x19014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_mem_noc_nssnoc_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &nssnoc_memnoc_bfdcd_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_lpass_axim_clk_src[] = {
+       F(133333333, P_GPLL0, 6, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 lpass_axim_clk_src = {
+       .cmd_rcgr = 0x2700c,
+       .freq_tbl = ftbl_lpass_axim_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "lpass_axim_clk_src",
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 lpass_sway_clk_src = {
+       .cmd_rcgr = 0x27004,
+       .freq_tbl = ftbl_lpass_axim_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "lpass_sway_clk_src",
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_adss_pwm_clk_src[] = {
+       F(24000000, P_XO, 1, 0, 0),
+       F(100000000, P_GPLL0, 8, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 adss_pwm_clk_src = {
+       .cmd_rcgr = 0x1c004,
+       .freq_tbl = ftbl_adss_pwm_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "adss_pwm_clk_src",
+               .parent_data = gcc_xo_gpll0,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_adss_pwm_clk = {
+       .halt_reg = 0x1c00c,
+       .clkr = {
+               .enable_reg = 0x1c00c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_adss_pwm_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &adss_pwm_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_gp1_clk_src[] = {
+       F(24000000, P_XO, 1, 0, 0),
+       F(200000000, P_GPLL0, 4, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gp1_clk_src = {
+       .cmd_rcgr = 0x8004,
+       .freq_tbl = ftbl_gp1_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_sleep_clk_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gp1_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_sleep_clk,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_sleep_clk),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gp2_clk_src = {
+       .cmd_rcgr = 0x9004,
+       .freq_tbl = ftbl_gp1_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_sleep_clk_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gp2_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_sleep_clk,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_sleep_clk),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gp3_clk_src = {
+       .cmd_rcgr = 0xa004,
+       .freq_tbl = ftbl_gp1_clk_src,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_gpll0_sleep_clk_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gp3_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll0_sleep_clk,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_sleep_clk),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_xo_clk_src = {
+       .halt_reg = 0x34004,
+       .clkr = {
+               .enable_reg = 0x34004,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_xo_clk_src",
+                       .parent_data = gcc_xo_data,
+                       .num_parents = ARRAY_SIZE(gcc_xo_data),
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_nssnoc_xo_dcd_clk = {
+       .halt_reg = 0x17074,
+       .clkr = {
+               .enable_reg = 0x17074,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_nssnoc_xo_dcd_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &gcc_xo_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_xo_clk = {
+       .halt_reg = 0x34018,
+       .clkr = {
+               .enable_reg = 0x34018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_xo_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &gcc_xo_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_uniphy0_sys_clk = {
+       .halt_reg = 0x17048,
+       .clkr = {
+               .enable_reg = 0x17048,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_uniphy0_sys_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &uniphy_sys_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_uniphy1_sys_clk = {
+       .halt_reg = 0x17058,
+       .clkr = {
+               .enable_reg = 0x17058,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_uniphy1_sys_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &uniphy_sys_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_uniphy2_sys_clk = {
+       .halt_reg = 0x17068,
+       .clkr = {
+               .enable_reg = 0x17068,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_uniphy2_sys_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &uniphy_sys_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_cmn_12gpll_sys_clk = {
+       .halt_reg = 0x3a008,
+       .clkr = {
+               .enable_reg = 0x3a008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_cmn_12gpll_sys_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &uniphy_sys_clk_src.clkr.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_fixed_factor gcc_xo_div4_clk_src = {
+       .mult = 1,
+       .div = 4,
+       .hw.init = &(struct clk_init_data) {
+               .name = "gcc_xo_div4_clk_src",
+               .parent_hws = (const struct clk_hw *[]) {
+                       &gcc_xo_clk_src.clkr.hw
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_fixed_factor_ops,
+       },
+};
+
+static struct clk_branch gcc_nssnoc_qosgen_ref_clk = {
+       .halt_reg = 0x1701c,
+       .clkr = {
+               .enable_reg = 0x1701c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_nssnoc_qosgen_ref_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &gcc_xo_div4_clk_src.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_nssnoc_timeout_ref_clk = {
+       .halt_reg = 0x17020,
+       .clkr = {
+               .enable_reg = 0x17020,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_nssnoc_timeout_ref_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &gcc_xo_div4_clk_src.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_xo_div4_clk = {
+       .halt_reg = 0x3401c,
+       .clkr = {
+               .enable_reg = 0x3401c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_xo_div4_clk",
+                       .parent_hws = (const struct clk_hw *[]) {
+                               &gcc_xo_div4_clk_src.hw
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_hw *gcc_ipq9574_hws[] = {
+       &gpll0_out_main_div2.hw,
+       &gcc_xo_div4_clk_src.hw,
+       &qdss_dap_sync_clk_src.hw,
+       &qdss_tsctr_div2_clk_src.hw,
+       &qdss_tsctr_div8_clk_src.hw,
+       &qdss_tsctr_div16_clk_src.hw,
+       &qdss_tsctr_div3_clk_src.hw,
+       &gcc_eud_at_div_clk_src.hw,
+};
+
+static struct clk_regmap *gcc_ipq9574_clks[] = {
+       [GPLL0_MAIN] = &gpll0_main.clkr,
+       [GPLL0] = &gpll0.clkr,
+       [GPLL4_MAIN] = &gpll4_main.clkr,
+       [GPLL4] = &gpll4.clkr,
+       [GPLL2_MAIN] = &gpll2_main.clkr,
+       [GPLL2] = &gpll2.clkr,
+       [GCC_SLEEP_CLK_SRC] = &gcc_sleep_clk_src.clkr,
+       [APSS_AHB_CLK_SRC] = &apss_ahb_clk_src.clkr,
+       [APSS_AXI_CLK_SRC] = &apss_axi_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,
+       [BLSP1_UART3_APPS_CLK_SRC] = &blsp1_uart3_apps_clk_src.clkr,
+       [BLSP1_UART4_APPS_CLK_SRC] = &blsp1_uart4_apps_clk_src.clkr,
+       [BLSP1_UART5_APPS_CLK_SRC] = &blsp1_uart5_apps_clk_src.clkr,
+       [BLSP1_UART6_APPS_CLK_SRC] = &blsp1_uart6_apps_clk_src.clkr,
+       [GCC_APSS_AHB_CLK] = &gcc_apss_ahb_clk.clkr,
+       [GCC_APSS_AXI_CLK] = &gcc_apss_axi_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_BLSP1_UART3_APPS_CLK] = &gcc_blsp1_uart3_apps_clk.clkr,
+       [GCC_BLSP1_UART4_APPS_CLK] = &gcc_blsp1_uart4_apps_clk.clkr,
+       [GCC_BLSP1_UART5_APPS_CLK] = &gcc_blsp1_uart5_apps_clk.clkr,
+       [GCC_BLSP1_UART6_APPS_CLK] = &gcc_blsp1_uart6_apps_clk.clkr,
+       [PCIE0_AXI_M_CLK_SRC] = &pcie0_axi_m_clk_src.clkr,
+       [GCC_PCIE0_AXI_M_CLK] = &gcc_pcie0_axi_m_clk.clkr,
+       [PCIE1_AXI_M_CLK_SRC] = &pcie1_axi_m_clk_src.clkr,
+       [GCC_PCIE1_AXI_M_CLK] = &gcc_pcie1_axi_m_clk.clkr,
+       [PCIE2_AXI_M_CLK_SRC] = &pcie2_axi_m_clk_src.clkr,
+       [GCC_PCIE2_AXI_M_CLK] = &gcc_pcie2_axi_m_clk.clkr,
+       [PCIE3_AXI_M_CLK_SRC] = &pcie3_axi_m_clk_src.clkr,
+       [GCC_PCIE3_AXI_M_CLK] = &gcc_pcie3_axi_m_clk.clkr,
+       [PCIE0_AXI_S_CLK_SRC] = &pcie0_axi_s_clk_src.clkr,
+       [GCC_PCIE0_AXI_S_BRIDGE_CLK] = &gcc_pcie0_axi_s_bridge_clk.clkr,
+       [GCC_PCIE0_AXI_S_CLK] = &gcc_pcie0_axi_s_clk.clkr,
+       [PCIE1_AXI_S_CLK_SRC] = &pcie1_axi_s_clk_src.clkr,
+       [GCC_PCIE1_AXI_S_BRIDGE_CLK] = &gcc_pcie1_axi_s_bridge_clk.clkr,
+       [GCC_PCIE1_AXI_S_CLK] = &gcc_pcie1_axi_s_clk.clkr,
+       [PCIE2_AXI_S_CLK_SRC] = &pcie2_axi_s_clk_src.clkr,
+       [GCC_PCIE2_AXI_S_BRIDGE_CLK] = &gcc_pcie2_axi_s_bridge_clk.clkr,
+       [GCC_PCIE2_AXI_S_CLK] = &gcc_pcie2_axi_s_clk.clkr,
+       [PCIE3_AXI_S_CLK_SRC] = &pcie3_axi_s_clk_src.clkr,
+       [GCC_PCIE3_AXI_S_BRIDGE_CLK] = &gcc_pcie3_axi_s_bridge_clk.clkr,
+       [GCC_PCIE3_AXI_S_CLK] = &gcc_pcie3_axi_s_clk.clkr,
+       [PCIE0_PIPE_CLK_SRC] = &pcie0_pipe_clk_src.clkr,
+       [PCIE1_PIPE_CLK_SRC] = &pcie1_pipe_clk_src.clkr,
+       [PCIE2_PIPE_CLK_SRC] = &pcie2_pipe_clk_src.clkr,
+       [PCIE3_PIPE_CLK_SRC] = &pcie3_pipe_clk_src.clkr,
+       [PCIE_AUX_CLK_SRC] = &pcie_aux_clk_src.clkr,
+       [GCC_PCIE0_AUX_CLK] = &gcc_pcie0_aux_clk.clkr,
+       [GCC_PCIE1_AUX_CLK] = &gcc_pcie1_aux_clk.clkr,
+       [GCC_PCIE2_AUX_CLK] = &gcc_pcie2_aux_clk.clkr,
+       [GCC_PCIE3_AUX_CLK] = &gcc_pcie3_aux_clk.clkr,
+       [PCIE0_RCHNG_CLK_SRC] = &pcie0_rchng_clk_src.clkr,
+       [GCC_PCIE0_RCHNG_CLK] = &gcc_pcie0_rchng_clk.clkr,
+       [PCIE1_RCHNG_CLK_SRC] = &pcie1_rchng_clk_src.clkr,
+       [GCC_PCIE1_RCHNG_CLK] = &gcc_pcie1_rchng_clk.clkr,
+       [PCIE2_RCHNG_CLK_SRC] = &pcie2_rchng_clk_src.clkr,
+       [GCC_PCIE2_RCHNG_CLK] = &gcc_pcie2_rchng_clk.clkr,
+       [PCIE3_RCHNG_CLK_SRC] = &pcie3_rchng_clk_src.clkr,
+       [GCC_PCIE3_RCHNG_CLK] = &gcc_pcie3_rchng_clk.clkr,
+       [GCC_PCIE0_AHB_CLK] = &gcc_pcie0_ahb_clk.clkr,
+       [GCC_PCIE1_AHB_CLK] = &gcc_pcie1_ahb_clk.clkr,
+       [GCC_PCIE2_AHB_CLK] = &gcc_pcie2_ahb_clk.clkr,
+       [GCC_PCIE3_AHB_CLK] = &gcc_pcie3_ahb_clk.clkr,
+       [USB0_AUX_CLK_SRC] = &usb0_aux_clk_src.clkr,
+       [GCC_USB0_AUX_CLK] = &gcc_usb0_aux_clk.clkr,
+       [USB0_MASTER_CLK_SRC] = &usb0_master_clk_src.clkr,
+       [GCC_USB0_MASTER_CLK] = &gcc_usb0_master_clk.clkr,
+       [GCC_SNOC_USB_CLK] = &gcc_snoc_usb_clk.clkr,
+       [GCC_ANOC_USB_AXI_CLK] = &gcc_anoc_usb_axi_clk.clkr,
+       [USB0_MOCK_UTMI_CLK_SRC] = &usb0_mock_utmi_clk_src.clkr,
+       [USB0_MOCK_UTMI_DIV_CLK_SRC] = &usb0_mock_utmi_div_clk_src.clkr,
+       [GCC_USB0_MOCK_UTMI_CLK] = &gcc_usb0_mock_utmi_clk.clkr,
+       [USB0_PIPE_CLK_SRC] = &usb0_pipe_clk_src.clkr,
+       [GCC_USB0_PHY_CFG_AHB_CLK] = &gcc_usb0_phy_cfg_ahb_clk.clkr,
+       [SDCC1_APPS_CLK_SRC] = &sdcc1_apps_clk_src.clkr,
+       [GCC_SDCC1_APPS_CLK] = &gcc_sdcc1_apps_clk.clkr,
+       [SDCC1_ICE_CORE_CLK_SRC] = &sdcc1_ice_core_clk_src.clkr,
+       [GCC_SDCC1_ICE_CORE_CLK] = &gcc_sdcc1_ice_core_clk.clkr,
+       [GCC_SDCC1_AHB_CLK] = &gcc_sdcc1_ahb_clk.clkr,
+       [PCNOC_BFDCD_CLK_SRC] = &pcnoc_bfdcd_clk_src.clkr,
+       [GCC_NSSCFG_CLK] = &gcc_nsscfg_clk.clkr,
+       [GCC_NSSNOC_NSSCC_CLK] = &gcc_nssnoc_nsscc_clk.clkr,
+       [GCC_NSSCC_CLK] = &gcc_nsscc_clk.clkr,
+       [GCC_NSSNOC_PCNOC_1_CLK] = &gcc_nssnoc_pcnoc_1_clk.clkr,
+       [GCC_QDSS_DAP_AHB_CLK] = &gcc_qdss_dap_ahb_clk.clkr,
+       [GCC_QDSS_CFG_AHB_CLK] = &gcc_qdss_cfg_ahb_clk.clkr,
+       [GCC_QPIC_AHB_CLK] = &gcc_qpic_ahb_clk.clkr,
+       [GCC_QPIC_CLK] = &gcc_qpic_clk.clkr,
+       [GCC_BLSP1_AHB_CLK] = &gcc_blsp1_ahb_clk.clkr,
+       [GCC_MDIO_AHB_CLK] = &gcc_mdio_ahb_clk.clkr,
+       [GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr,
+       [GCC_UNIPHY0_AHB_CLK] = &gcc_uniphy0_ahb_clk.clkr,
+       [GCC_UNIPHY1_AHB_CLK] = &gcc_uniphy1_ahb_clk.clkr,
+       [GCC_UNIPHY2_AHB_CLK] = &gcc_uniphy2_ahb_clk.clkr,
+       [GCC_CMN_12GPLL_AHB_CLK] = &gcc_cmn_12gpll_ahb_clk.clkr,
+       [GCC_CMN_12GPLL_APU_CLK] = &gcc_cmn_12gpll_apu_clk.clkr,
+       [SYSTEM_NOC_BFDCD_CLK_SRC] = &system_noc_bfdcd_clk_src.clkr,
+       [GCC_NSSNOC_SNOC_CLK] = &gcc_nssnoc_snoc_clk.clkr,
+       [GCC_NSSNOC_SNOC_1_CLK] = &gcc_nssnoc_snoc_1_clk.clkr,
+       [GCC_QDSS_ETR_USB_CLK] = &gcc_qdss_etr_usb_clk.clkr,
+       [WCSS_AHB_CLK_SRC] = &wcss_ahb_clk_src.clkr,
+       [GCC_Q6_AHB_CLK] = &gcc_q6_ahb_clk.clkr,
+       [GCC_Q6_AHB_S_CLK] = &gcc_q6_ahb_s_clk.clkr,
+       [GCC_WCSS_ECAHB_CLK] = &gcc_wcss_ecahb_clk.clkr,
+       [GCC_WCSS_ACMT_CLK] = &gcc_wcss_acmt_clk.clkr,
+       [GCC_SYS_NOC_WCSS_AHB_CLK] = &gcc_sys_noc_wcss_ahb_clk.clkr,
+       [WCSS_AXI_M_CLK_SRC] = &wcss_axi_m_clk_src.clkr,
+       [GCC_ANOC_WCSS_AXI_M_CLK] = &gcc_anoc_wcss_axi_m_clk.clkr,
+       [QDSS_AT_CLK_SRC] = &qdss_at_clk_src.clkr,
+       [GCC_Q6SS_ATBM_CLK] = &gcc_q6ss_atbm_clk.clkr,
+       [GCC_WCSS_DBG_IFC_ATB_CLK] = &gcc_wcss_dbg_ifc_atb_clk.clkr,
+       [GCC_NSSNOC_ATB_CLK] = &gcc_nssnoc_atb_clk.clkr,
+       [GCC_QDSS_AT_CLK] = &gcc_qdss_at_clk.clkr,
+       [GCC_SYS_NOC_AT_CLK] = &gcc_sys_noc_at_clk.clkr,
+       [GCC_PCNOC_AT_CLK] = &gcc_pcnoc_at_clk.clkr,
+       [GCC_USB0_EUD_AT_CLK] = &gcc_usb0_eud_at_clk.clkr,
+       [GCC_QDSS_EUD_AT_CLK] = &gcc_qdss_eud_at_clk.clkr,
+       [QDSS_STM_CLK_SRC] = &qdss_stm_clk_src.clkr,
+       [GCC_QDSS_STM_CLK] = &gcc_qdss_stm_clk.clkr,
+       [GCC_SYS_NOC_QDSS_STM_AXI_CLK] = &gcc_sys_noc_qdss_stm_axi_clk.clkr,
+       [QDSS_TRACECLKIN_CLK_SRC] = &qdss_traceclkin_clk_src.clkr,
+       [GCC_QDSS_TRACECLKIN_CLK] = &gcc_qdss_traceclkin_clk.clkr,
+       [QDSS_TSCTR_CLK_SRC] = &qdss_tsctr_clk_src.clkr,
+       [GCC_Q6_TSCTR_1TO2_CLK] = &gcc_q6_tsctr_1to2_clk.clkr,
+       [GCC_WCSS_DBG_IFC_NTS_CLK] = &gcc_wcss_dbg_ifc_nts_clk.clkr,
+       [GCC_QDSS_TSCTR_DIV2_CLK] = &gcc_qdss_tsctr_div2_clk.clkr,
+       [GCC_QDSS_TS_CLK] = &gcc_qdss_ts_clk.clkr,
+       [GCC_QDSS_TSCTR_DIV4_CLK] = &gcc_qdss_tsctr_div4_clk.clkr,
+       [GCC_NSS_TS_CLK] = &gcc_nss_ts_clk.clkr,
+       [GCC_QDSS_TSCTR_DIV8_CLK] = &gcc_qdss_tsctr_div8_clk.clkr,
+       [GCC_QDSS_TSCTR_DIV16_CLK] = &gcc_qdss_tsctr_div16_clk.clkr,
+       [GCC_Q6SS_PCLKDBG_CLK] = &gcc_q6ss_pclkdbg_clk.clkr,
+       [GCC_Q6SS_TRIG_CLK] = &gcc_q6ss_trig_clk.clkr,
+       [GCC_WCSS_DBG_IFC_APB_CLK] = &gcc_wcss_dbg_ifc_apb_clk.clkr,
+       [GCC_WCSS_DBG_IFC_DAPBUS_CLK] = &gcc_wcss_dbg_ifc_dapbus_clk.clkr,
+       [GCC_QDSS_DAP_CLK] = &gcc_qdss_dap_clk.clkr,
+       [GCC_QDSS_APB2JTAG_CLK] = &gcc_qdss_apb2jtag_clk.clkr,
+       [GCC_QDSS_TSCTR_DIV3_CLK] = &gcc_qdss_tsctr_div3_clk.clkr,
+       [QPIC_IO_MACRO_CLK_SRC] = &qpic_io_macro_clk_src.clkr,
+       [GCC_QPIC_IO_MACRO_CLK] = &gcc_qpic_io_macro_clk.clkr,
+       [Q6_AXI_CLK_SRC] = &q6_axi_clk_src.clkr,
+       [GCC_Q6_AXIM_CLK] = &gcc_q6_axim_clk.clkr,
+       [GCC_WCSS_Q6_TBU_CLK] = &gcc_wcss_q6_tbu_clk.clkr,
+       [GCC_MEM_NOC_Q6_AXI_CLK] = &gcc_mem_noc_q6_axi_clk.clkr,
+       [Q6_AXIM2_CLK_SRC] = &q6_axim2_clk_src.clkr,
+       [NSSNOC_MEMNOC_BFDCD_CLK_SRC] = &nssnoc_memnoc_bfdcd_clk_src.clkr,
+       [GCC_NSSNOC_MEMNOC_CLK] = &gcc_nssnoc_memnoc_clk.clkr,
+       [GCC_NSSNOC_MEM_NOC_1_CLK] = &gcc_nssnoc_mem_noc_1_clk.clkr,
+       [GCC_NSS_TBU_CLK] = &gcc_nss_tbu_clk.clkr,
+       [GCC_MEM_NOC_NSSNOC_CLK] = &gcc_mem_noc_nssnoc_clk.clkr,
+       [LPASS_AXIM_CLK_SRC] = &lpass_axim_clk_src.clkr,
+       [LPASS_SWAY_CLK_SRC] = &lpass_sway_clk_src.clkr,
+       [ADSS_PWM_CLK_SRC] = &adss_pwm_clk_src.clkr,
+       [GCC_ADSS_PWM_CLK] = &gcc_adss_pwm_clk.clkr,
+       [GP1_CLK_SRC] = &gp1_clk_src.clkr,
+       [GP2_CLK_SRC] = &gp2_clk_src.clkr,
+       [GP3_CLK_SRC] = &gp3_clk_src.clkr,
+       [GCC_XO_CLK_SRC] = &gcc_xo_clk_src.clkr,
+       [GCC_NSSNOC_XO_DCD_CLK] = &gcc_nssnoc_xo_dcd_clk.clkr,
+       [GCC_XO_CLK] = &gcc_xo_clk.clkr,
+       [GCC_NSSNOC_QOSGEN_REF_CLK] = &gcc_nssnoc_qosgen_ref_clk.clkr,
+       [GCC_NSSNOC_TIMEOUT_REF_CLK] = &gcc_nssnoc_timeout_ref_clk.clkr,
+       [GCC_XO_DIV4_CLK] = &gcc_xo_div4_clk.clkr,
+       [GCC_UNIPHY0_SYS_CLK] = &gcc_uniphy0_sys_clk.clkr,
+       [GCC_UNIPHY1_SYS_CLK] = &gcc_uniphy1_sys_clk.clkr,
+       [GCC_UNIPHY2_SYS_CLK] = &gcc_uniphy2_sys_clk.clkr,
+       [GCC_CMN_12GPLL_SYS_CLK] = &gcc_cmn_12gpll_sys_clk.clkr,
+       [GCC_Q6SS_BOOT_CLK] = &gcc_q6ss_boot_clk.clkr,
+       [UNIPHY_SYS_CLK_SRC] = &uniphy_sys_clk_src.clkr,
+       [NSS_TS_CLK_SRC] = &nss_ts_clk_src.clkr,
+       [GCC_ANOC_PCIE0_1LANE_M_CLK] = &gcc_anoc_pcie0_1lane_m_clk.clkr,
+       [GCC_ANOC_PCIE1_1LANE_M_CLK] = &gcc_anoc_pcie1_1lane_m_clk.clkr,
+       [GCC_ANOC_PCIE2_2LANE_M_CLK] = &gcc_anoc_pcie2_2lane_m_clk.clkr,
+       [GCC_ANOC_PCIE3_2LANE_M_CLK] = &gcc_anoc_pcie3_2lane_m_clk.clkr,
+       [GCC_SNOC_PCIE0_1LANE_S_CLK] = &gcc_snoc_pcie0_1lane_s_clk.clkr,
+       [GCC_SNOC_PCIE1_1LANE_S_CLK] = &gcc_snoc_pcie1_1lane_s_clk.clkr,
+       [GCC_SNOC_PCIE2_2LANE_S_CLK] = &gcc_snoc_pcie2_2lane_s_clk.clkr,
+       [GCC_SNOC_PCIE3_2LANE_S_CLK] = &gcc_snoc_pcie3_2lane_s_clk.clkr,
+};
+
+static const struct qcom_reset_map gcc_ipq9574_resets[] = {
+       [GCC_ADSS_BCR] = { 0x1c000, 0 },
+       [GCC_ANOC0_TBU_BCR] = { 0x1203c, 0 },
+       [GCC_ANOC1_TBU_BCR] = { 0x1204c, 0 },
+       [GCC_ANOC_BCR] = { 0x2e074, 0 },
+       [GCC_APC0_VOLTAGE_DROOP_DETECTOR_BCR] = { 0x38000, 0 },
+       [GCC_APSS_TCU_BCR] = { 0x12014, 0 },
+       [GCC_BLSP1_BCR] = { 0x01000, 0 },
+       [GCC_BLSP1_QUP1_BCR] = { 0x02000, 0 },
+       [GCC_BLSP1_QUP2_BCR] = { 0x03000, 0 },
+       [GCC_BLSP1_QUP3_BCR] = { 0x04000, 0 },
+       [GCC_BLSP1_QUP4_BCR] = { 0x05000, 0 },
+       [GCC_BLSP1_QUP5_BCR] = { 0x06000, 0 },
+       [GCC_BLSP1_QUP6_BCR] = { 0x07000, 0 },
+       [GCC_BLSP1_UART1_BCR] = { 0x02028, 0 },
+       [GCC_BLSP1_UART2_BCR] = { 0x03028, 0 },
+       [GCC_BLSP1_UART3_BCR] = { 0x04028, 0 },
+       [GCC_BLSP1_UART4_BCR] = { 0x05028, 0 },
+       [GCC_BLSP1_UART5_BCR] = { 0x06028, 0 },
+       [GCC_BLSP1_UART6_BCR] = { 0x07028, 0 },
+       [GCC_BOOT_ROM_BCR] = { 0x13028, 0 },
+       [GCC_CMN_BLK_BCR] = { 0x3a000, 0 },
+       [GCC_CMN_BLK_AHB_ARES] = { 0x3a010, 0 },
+       [GCC_CMN_BLK_SYS_ARES] = { 0x3a010, 1 },
+       [GCC_CMN_BLK_APU_ARES] = { 0x3a010, 2 },
+       [GCC_DCC_BCR] = { 0x35000, 0 },
+       [GCC_DDRSS_BCR] = { 0x11000, 0 },
+       [GCC_IMEM_BCR] = { 0x0e000, 0 },
+       [GCC_LPASS_BCR] = { 0x27000, 0 },
+       [GCC_MDIO_BCR] = { 0x1703c, 0 },
+       [GCC_MPM_BCR] = { 0x37000, 0 },
+       [GCC_MSG_RAM_BCR] = { 0x26000, 0 },
+       [GCC_NSS_BCR] = { 0x17000, 0 },
+       [GCC_NSS_TBU_BCR] = { 0x12044, 0 },
+       [GCC_NSSNOC_MEMNOC_1_ARES] = { 0x17038, 13 },
+       [GCC_NSSNOC_PCNOC_1_ARES] = { 0x17038, 12 },
+       [GCC_NSSNOC_SNOC_1_ARES] = { 0x17038,  11 },
+       [GCC_NSSNOC_XO_DCD_ARES] = { 0x17038,  10 },
+       [GCC_NSSNOC_TS_ARES] = { 0x17038, 9 },
+       [GCC_NSSCC_ARES] = { 0x17038, 8 },
+       [GCC_NSSNOC_NSSCC_ARES] = { 0x17038, 7 },
+       [GCC_NSSNOC_ATB_ARES] = { 0x17038, 6 },
+       [GCC_NSSNOC_MEMNOC_ARES] = { 0x17038, 5 },
+       [GCC_NSSNOC_QOSGEN_REF_ARES] = { 0x17038, 4 },
+       [GCC_NSSNOC_SNOC_ARES] = { 0x17038, 3 },
+       [GCC_NSSNOC_TIMEOUT_REF_ARES] = { 0x17038, 2 },
+       [GCC_NSS_CFG_ARES] = { 0x17038, 1 },
+       [GCC_UBI0_DBG_ARES] = { 0x17038, 0 },
+       [GCC_PCIE0PHY_PHY_BCR] = { 0x2805c, 0 },
+       [GCC_PCIE0_AHB_ARES] = { 0x28058, 7 },
+       [GCC_PCIE0_AUX_ARES] = { 0x28058, 6 },
+       [GCC_PCIE0_AXI_M_ARES] = { 0x28058, 5 },
+       [GCC_PCIE0_AXI_M_STICKY_ARES] = { 0x28058, 4 },
+       [GCC_PCIE0_AXI_S_ARES] = { 0x28058, 3 },
+       [GCC_PCIE0_AXI_S_STICKY_ARES] = { 0x28058, 2 },
+       [GCC_PCIE0_CORE_STICKY_ARES] = { 0x28058, 1 },
+       [GCC_PCIE0_PIPE_ARES] = { 0x28058, 0 },
+       [GCC_PCIE1_AHB_ARES] = { 0x29058, 7 },
+       [GCC_PCIE1_AUX_ARES] = { 0x29058, 6 },
+       [GCC_PCIE1_AXI_M_ARES] = { 0x29058, 5 },
+       [GCC_PCIE1_AXI_M_STICKY_ARES] = { 0x29058, 4 },
+       [GCC_PCIE1_AXI_S_ARES] = { 0x29058, 3 },
+       [GCC_PCIE1_AXI_S_STICKY_ARES] = { 0x29058, 2 },
+       [GCC_PCIE1_CORE_STICKY_ARES] = { 0x29058, 1 },
+       [GCC_PCIE1_PIPE_ARES] = { 0x29058, 0 },
+       [GCC_PCIE2_AHB_ARES] = { 0x2a058, 7 },
+       [GCC_PCIE2_AUX_ARES] = { 0x2a058, 6 },
+       [GCC_PCIE2_AXI_M_ARES] = { 0x2a058, 5 },
+       [GCC_PCIE2_AXI_M_STICKY_ARES] = { 0x2a058, 4 },
+       [GCC_PCIE2_AXI_S_ARES] = { 0x2a058, 3 },
+       [GCC_PCIE2_AXI_S_STICKY_ARES] = { 0x2a058, 2 },
+       [GCC_PCIE2_CORE_STICKY_ARES] = { 0x2a058, 1 },
+       [GCC_PCIE2_PIPE_ARES] = { 0x2a058, 0 },
+       [GCC_PCIE3_AHB_ARES] = { 0x2b058, 7 },
+       [GCC_PCIE3_AUX_ARES] = { 0x2b058, 6 },
+       [GCC_PCIE3_AXI_M_ARES] = { 0x2b058, 5 },
+       [GCC_PCIE3_AXI_M_STICKY_ARES] = { 0x2b058, 4 },
+       [GCC_PCIE3_AXI_S_ARES] = { 0x2b058, 3 },
+       [GCC_PCIE3_AXI_S_STICKY_ARES] = { 0x2b058, 2 },
+       [GCC_PCIE3_CORE_STICKY_ARES] = { 0x2b058, 1 },
+       [GCC_PCIE3_PIPE_ARES] = { 0x2b058, 0 },
+       [GCC_PCIE0_BCR] = { 0x28000, 0 },
+       [GCC_PCIE0_LINK_DOWN_BCR] = { 0x28054, 0 },
+       [GCC_PCIE0_PHY_BCR] = { 0x28060, 0 },
+       [GCC_PCIE1_BCR] = { 0x29000, 0 },
+       [GCC_PCIE1_LINK_DOWN_BCR] = { 0x29054, 0 },
+       [GCC_PCIE1_PHY_BCR] = { 0x29060, 0 },
+       [GCC_PCIE1PHY_PHY_BCR] = { 0x2905c, 0 },
+       [GCC_PCIE2_BCR] = { 0x2a000, 0 },
+       [GCC_PCIE2_LINK_DOWN_BCR] = { 0x2a054, 0 },
+       [GCC_PCIE2_PHY_BCR] = { 0x2a060, 0 },
+       [GCC_PCIE2PHY_PHY_BCR] = { 0x2a05c, 0 },
+       [GCC_PCIE3_BCR] = { 0x2b000, 0 },
+       [GCC_PCIE3_LINK_DOWN_BCR] = { 0x2b054, 0 },
+       [GCC_PCIE3PHY_PHY_BCR] = { 0x2b05c, 0 },
+       [GCC_PCIE3_PHY_BCR] = { 0x2b060, 0 },
+       [GCC_PCNOC_BCR] = { 0x31000, 0 },
+       [GCC_PCNOC_BUS_TIMEOUT0_BCR] = { 0x31030, 0 },
+       [GCC_PCNOC_BUS_TIMEOUT1_BCR] = { 0x31038, 0 },
+       [GCC_PCNOC_BUS_TIMEOUT2_BCR] = { 0x31040, 0 },
+       [GCC_PCNOC_BUS_TIMEOUT3_BCR] = { 0x31048, 0 },
+       [GCC_PCNOC_BUS_TIMEOUT4_BCR] = { 0x31050, 0 },
+       [GCC_PCNOC_BUS_TIMEOUT5_BCR] = { 0x31058, 0 },
+       [GCC_PCNOC_BUS_TIMEOUT6_BCR] = { 0x31060, 0 },
+       [GCC_PCNOC_BUS_TIMEOUT7_BCR] = { 0x31068, 0 },
+       [GCC_PCNOC_BUS_TIMEOUT8_BCR] = { 0x31070, 0 },
+       [GCC_PCNOC_BUS_TIMEOUT9_BCR] = { 0x31078, 0 },
+       [GCC_PCNOC_TBU_BCR] = { 0x12034, 0 },
+       [GCC_PRNG_BCR] = { 0x13020, 0 },
+       [GCC_Q6SS_DBG_ARES] = { 0x2506c, 4 },
+       [GCC_Q6_AHB_ARES] = { 0x2506c, 3 },
+       [GCC_Q6_AHB_S_ARES] = { 0x2506c, 2 },
+       [GCC_Q6_AXIM2_ARES] = { 0x2506c, 1 },
+       [GCC_Q6_AXIM_ARES] = { 0x2506c, 0 },
+       [GCC_QDSS_BCR] = { 0x2d000, 0 },
+       [GCC_QPIC_BCR] = { 0x32000, 0 },
+       [GCC_QPIC_AHB_ARES] = { 0x3201c, 1 },
+       [GCC_QPIC_ARES] = { 0x3201c, 0 },
+       [GCC_QUSB2_0_PHY_BCR] = { 0x2c068, 0 },
+       [GCC_RBCPR_BCR] = { 0x39000, 0 },
+       [GCC_RBCPR_MX_BCR] = { 0x39014, 0 },
+       [GCC_SDCC_BCR] = { 0x33000, 0 },
+       [GCC_SEC_CTRL_BCR] = { 0x1a000, 0 },
+       [GCC_SMMU_CFG_BCR] = { 0x1202c, 0 },
+       [GCC_SNOC_BCR] = { 0x2e000, 0 },
+       [GCC_SPDM_BCR] = { 0x36000, 0 },
+       [GCC_TCSR_BCR] = { 0x3d000, 0 },
+       [GCC_TLMM_BCR] = { 0x3e000, 0 },
+       [GCC_TME_BCR] = { 0x10000, 0 },
+       [GCC_UNIPHY0_BCR] = { 0x17044, 0 },
+       [GCC_UNIPHY0_SYS_RESET] = { 0x17050, 0 },
+       [GCC_UNIPHY0_AHB_RESET] = { 0x17050, 1 },
+       [GCC_UNIPHY0_XPCS_RESET] = { 0x17050, 2 },
+       [GCC_UNIPHY1_SYS_RESET] = { 0x17060, 0 },
+       [GCC_UNIPHY1_AHB_RESET] = { 0x17060, 1 },
+       [GCC_UNIPHY1_XPCS_RESET] = { 0x17060, 2 },
+       [GCC_UNIPHY2_SYS_RESET] = { 0x17070, 0 },
+       [GCC_UNIPHY2_AHB_RESET] = { 0x17070, 1 },
+       [GCC_UNIPHY2_XPCS_RESET] = { 0x17070, 2 },
+       [GCC_UNIPHY1_BCR] = { 0x17054, 0 },
+       [GCC_UNIPHY2_BCR] = { 0x17064, 0 },
+       [GCC_USB0_PHY_BCR] = { 0x2c06c, 0 },
+       [GCC_USB3PHY_0_PHY_BCR] = { 0x2c070, 0 },
+       [GCC_USB_BCR] = { 0x2c000, 0 },
+       [GCC_USB_MISC_RESET] = { 0x2c064, 0 },
+       [GCC_WCSSAON_RESET] = { 0x25074, 0 },
+       [GCC_WCSS_ACMT_ARES] = { 0x25070, 5 },
+       [GCC_WCSS_AHB_S_ARES] = { 0x25070, 4 },
+       [GCC_WCSS_AXI_M_ARES] = { 0x25070, 3 },
+       [GCC_WCSS_BCR] = { 0x18004, 0 },
+       [GCC_WCSS_DBG_ARES] = { 0x25070, 2 },
+       [GCC_WCSS_DBG_BDG_ARES] = { 0x25070, 1 },
+       [GCC_WCSS_ECAHB_ARES] = { 0x25070, 0 },
+       [GCC_WCSS_Q6_BCR] = { 0x18000, 0 },
+       [GCC_WCSS_Q6_TBU_BCR] = { 0x12054, 0 },
+};
+
+static const struct of_device_id gcc_ipq9574_match_table[] = {
+       { .compatible = "qcom,ipq9574-gcc" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, gcc_ipq9574_match_table);
+
+static const struct regmap_config gcc_ipq9574_regmap_config = {
+       .reg_bits       = 32,
+       .reg_stride     = 4,
+       .val_bits       = 32,
+       .max_register   = 0x7fffc,
+       .fast_io        = true,
+};
+
+static const struct qcom_cc_desc gcc_ipq9574_desc = {
+       .config = &gcc_ipq9574_regmap_config,
+       .clks = gcc_ipq9574_clks,
+       .num_clks = ARRAY_SIZE(gcc_ipq9574_clks),
+       .resets = gcc_ipq9574_resets,
+       .num_resets = ARRAY_SIZE(gcc_ipq9574_resets),
+       .clk_hws = gcc_ipq9574_hws,
+       .num_clk_hws = ARRAY_SIZE(gcc_ipq9574_hws),
+};
+
+static int gcc_ipq9574_probe(struct platform_device *pdev)
+{
+       return qcom_cc_probe(pdev, &gcc_ipq9574_desc);
+}
+
+static struct platform_driver gcc_ipq9574_driver = {
+       .probe = gcc_ipq9574_probe,
+       .driver = {
+               .name   = "qcom,gcc-ipq9574",
+               .of_match_table = gcc_ipq9574_match_table,
+       },
+};
+
+static int __init gcc_ipq9574_init(void)
+{
+       return platform_driver_register(&gcc_ipq9574_driver);
+}
+core_initcall(gcc_ipq9574_init);
+
+static void __exit gcc_ipq9574_exit(void)
+{
+       platform_driver_unregister(&gcc_ipq9574_driver);
+}
+module_exit(gcc_ipq9574_exit);
+
+MODULE_DESCRIPTION("Qualcomm Technologies, Inc. GCC IPQ9574 Driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/clk/qcom/gcc-msm8917.c b/drivers/clk/qcom/gcc-msm8917.c
new file mode 100644 (file)
index 0000000..a4c33a2
--- /dev/null
@@ -0,0 +1,3303 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (C) 2023 Otto Pflüger
+ *
+ * Based on gcc-msm8953.c:
+ *   Copyright 2021, The Linux Foundation. All rights reserved.
+ * with parts taken from gcc-qcs404.c:
+ *   Copyright 2018, The Linux Foundation. All rights reserved.
+ * and gcc-msm8939.c:
+ *   Copyright 2020 Linaro Limited
+ * adapted with data from clock-gcc-8952.c in Qualcomm's msm-4.9 release:
+ *   Copyright (c) 2014-2020, 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-msm8917.h>
+
+#include "clk-alpha-pll.h"
+#include "clk-branch.h"
+#include "clk-pll.h"
+#include "clk-rcg.h"
+#include "common.h"
+#include "gdsc.h"
+#include "reset.h"
+
+enum {
+       DT_XO,
+       DT_SLEEP_CLK,
+       DT_DSI0PLL,
+       DT_DSI0PLL_BYTE,
+};
+
+enum {
+       P_XO,
+       P_SLEEP_CLK,
+       P_GPLL0,
+       P_GPLL3,
+       P_GPLL4,
+       P_GPLL6,
+       P_DSI0PLL,
+       P_DSI0PLL_BYTE,
+};
+
+static struct clk_alpha_pll gpll0_sleep_clk_src = {
+       .offset = 0x21000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .enable_reg = 0x45008,
+               .enable_mask = BIT(23),
+               .enable_is_inverted = true,
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll0_sleep_clk_src",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .index = DT_XO,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+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_hws = (const struct clk_hw*[]){
+                               &gpll0_sleep_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .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,
+               .ops = &clk_alpha_pll_postdiv_ro_ops,
+       },
+};
+
+static const struct pll_vco gpll3_p_vco[] = {
+       { 700000000, 1400000000, 0 },
+};
+
+static const struct alpha_pll_config gpll3_early_config = {
+       .l = 63,
+       .config_ctl_val = 0x4001055b,
+       .early_output_mask = 0,
+       .post_div_mask = GENMASK(11, 8),
+       .post_div_val = BIT(8),
+};
+
+static struct clk_alpha_pll gpll3_early = {
+       .offset = 0x22000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .vco_table = gpll3_p_vco,
+       .num_vco = ARRAY_SIZE(gpll3_p_vco),
+       .flags = SUPPORTS_DYNAMIC_UPDATE,
+       .clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll3_early",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .index = DT_XO,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll_postdiv gpll3 = {
+       .offset = 0x22000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll3",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll3_early.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_ops,
+               .flags = CLK_SET_RATE_PARENT,
+       },
+};
+
+static struct clk_alpha_pll gpll4_early = {
+       .offset = 0x24000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .enable_reg = 0x45000,
+               .enable_mask = BIT(5),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpll4_early",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .index = DT_XO,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_fixed_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll_postdiv gpll4 = {
+       .offset = 0x24000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll4",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll4_early.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_ro_ops,
+       },
+};
+
+static struct clk_pll gpll6_early = {
+       .l_reg = 0x37004,
+       .m_reg = 0x37008,
+       .n_reg = 0x3700c,
+       .config_reg = 0x37014,
+       .mode_reg = 0x37000,
+       .status_reg = 0x3701c,
+       .status_bit = 17,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll6_early",
+               .parent_data = &(const struct clk_parent_data) {
+                       .index = DT_XO,
+               },
+               .num_parents = 1,
+               .ops = &clk_pll_ops,
+       },
+};
+
+static struct clk_regmap gpll6 = {
+       .enable_reg = 0x45000,
+       .enable_mask = BIT(7),
+       .hw.init = &(struct clk_init_data){
+               .name = "gpll6",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll6_early.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 struct parent_map gcc_xo_gpll0_out_aux_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 2 },
+};
+
+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_gpll6_sleep_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL6, 2 },
+       { P_SLEEP_CLK, 6 },
+};
+
+static const struct clk_parent_data gcc_xo_gpll0_gpll6_sleep_data[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll6.hw },
+       { .index = DT_SLEEP_CLK },
+};
+
+static const struct parent_map gcc_xo_gpll0_gpll6_gpll4_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL6, 2 },
+       { P_GPLL4, 3 },
+};
+
+static const struct clk_parent_data gcc_xo_gpll0_gpll6_gpll4_data[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll6.hw },
+       { .hw = &gpll4.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),
+       F(133330000, P_GPLL0, 6, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 apss_ahb_clk_src = {
+       .cmd_rcgr = 0x46000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_apss_ahb_clk_src,
+       .parent_map = gcc_xo_gpll0_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 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_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 blsp2_qup1_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x0c00c,
+       .hid_width = 5,
+       .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp2_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 blsp2_qup2_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x0d000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp2_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 blsp2_qup3_i2c_apps_clk_src = {
+       .cmd_rcgr = 0x0f000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_blsp_i2c_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp2_qup3_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_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 blsp2_qup1_spi_apps_clk_src = {
+       .cmd_rcgr = 0x0c024,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_blsp_spi_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp2_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 blsp2_qup2_spi_apps_clk_src = {
+       .cmd_rcgr = 0x0d014,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_blsp_spi_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp2_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 blsp2_qup3_spi_apps_clk_src = {
+       .cmd_rcgr = 0x0f024,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_blsp_spi_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp2_qup3_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),
+       F(64000000, P_GPLL0, 1, 2, 25),
+       { }
+};
+
+static struct clk_rcg2 blsp1_uart1_apps_clk_src = {
+       .cmd_rcgr = 0x02044,
+       .hid_width = 5,
+       .mnd_width = 16,
+       .freq_tbl = ftbl_blsp_uart_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_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 struct clk_rcg2 blsp2_uart1_apps_clk_src = {
+       .cmd_rcgr = 0x0c044,
+       .hid_width = 5,
+       .mnd_width = 16,
+       .freq_tbl = ftbl_blsp_uart_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp2_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 blsp2_uart2_apps_clk_src = {
+       .cmd_rcgr = 0x0d034,
+       .hid_width = 5,
+       .mnd_width = 16,
+       .freq_tbl = ftbl_blsp_uart_apps_clk_src,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "blsp2_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(160000000, P_GPLL0, 5, 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_gpll6_sleep_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "camss_gp0_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll6_sleep_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll6_sleep_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_gpll6_sleep_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "camss_gp1_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll6_sleep_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll6_sleep_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct freq_tbl ftbl_camss_top_ahb_clk_src[] = {
+       F(40000000, P_GPLL0, 10, 1, 2),
+       F(61540000, P_GPLL0, 13, 0, 0),
+       F(80000000, P_GPLL0, 10, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 camss_top_ahb_clk_src = {
+       .cmd_rcgr = 0x5a000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_camss_top_ahb_clk_src,
+       .parent_map = gcc_xo_gpll0_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_cci_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(37500000, P_GPLL0, 1, 3, 64),
+       { }
+};
+
+static struct clk_rcg2 cci_clk_src = {
+       .cmd_rcgr = 0x51000,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_cci_clk_src,
+       .parent_map = gcc_xo_gpll0_out_aux_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "cci_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_cpp_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL6, 3 },
+};
+
+static const struct clk_parent_data gcc_cpp_data[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll6.hw },
+};
+
+static const struct freq_tbl ftbl_cpp_clk_src[] = {
+       F(133330000, P_GPLL0, 6, 0, 0),
+       F(160000000, P_GPLL0, 5, 0, 0),
+       F(266670000, P_GPLL0, 3, 0, 0),
+       F(308570000, P_GPLL0, 3.5, 0, 0),
+       F(320000000, P_GPLL0, 2.5, 0, 0),
+       F(360000000, P_GPLL6, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 cpp_clk_src = {
+       .cmd_rcgr = 0x58018,
+       .hid_width = 5,
+       .freq_tbl = ftbl_cpp_clk_src,
+       .parent_map = gcc_cpp_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "cpp_clk_src",
+               .parent_data = gcc_cpp_data,
+               .num_parents = ARRAY_SIZE(gcc_cpp_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct freq_tbl ftbl_crypto_clk_src[] = {
+       F(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(160000000, P_GPLL0, 5, 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_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 csi1_clk_src = {
+       .cmd_rcgr = 0x4f020,
+       .hid_width = 5,
+       .freq_tbl = ftbl_csi_clk_src,
+       .parent_map = gcc_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 struct clk_rcg2 csi2_clk_src = {
+       .cmd_rcgr = 0x3c020,
+       .hid_width = 5,
+       .freq_tbl = ftbl_csi_clk_src,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "csi2_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(160000000, P_GPLL0, 5, 0, 0),
+       F(200000000, P_GPLL0, 4, 0, 0),
+       F(266670000, P_GPLL0, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 csi0phytimer_clk_src = {
+       .cmd_rcgr = 0x4e000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_csi_phytimer_clk_src,
+       .parent_map = gcc_xo_gpll0_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 struct clk_rcg2 csi1phytimer_clk_src = {
+       .cmd_rcgr = 0x4f000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_csi_phytimer_clk_src,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "csi1phytimer_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_1_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 esc0_clk_src = {
+       .cmd_rcgr = 0x4d05c,
+       .hid_width = 5,
+       .freq_tbl = ftbl_esc0_1_clk_src,
+       .parent_map = gcc_xo_gpll0_out_aux_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "esc0_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_gfx3d_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL3, 2 },
+       { P_GPLL6, 3 },
+};
+
+static const struct parent_map gcc_gfx3d_map_qm215[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 5 },
+       { P_GPLL3, 2 },
+       { P_GPLL6, 6 },
+};
+
+static const struct clk_parent_data gcc_gfx3d_data[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll3.clkr.hw },
+       { .hw = &gpll6.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(200000000, P_GPLL0, 4, 0, 0),
+       F(228570000, P_GPLL0, 3.5, 0, 0),
+       F(240000000, P_GPLL6, 4.5, 0, 0),
+       F(266670000, P_GPLL0, 3, 0, 0),
+       F(270000000, P_GPLL6, 4, 0, 0),
+       F(320000000, P_GPLL0, 2.5, 0, 0),
+       F(400000000, P_GPLL0, 2, 0, 0),
+       F(465000000, P_GPLL3, 1, 0, 0),
+       F(484800000, P_GPLL3, 1, 0, 0),
+       F(500000000, P_GPLL3, 1, 0, 0),
+       F(523200000, P_GPLL3, 1, 0, 0),
+       F(550000000, P_GPLL3, 1, 0, 0),
+       F(598000000, P_GPLL3, 1, 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,
+               .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
+       }
+};
+
+static const struct freq_tbl ftbl_gp_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gp1_clk_src = {
+       .cmd_rcgr = 0x08004,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_gp_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll6_sleep_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gp1_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll6_sleep_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll6_sleep_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_gpll0_gpll6_sleep_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gp2_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll6_sleep_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll6_sleep_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_gpll0_gpll6_sleep_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "gp3_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll6_sleep_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll6_sleep_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct freq_tbl ftbl_jpeg0_clk_src[] = {
+       F(133330000, P_GPLL0, 6, 0, 0),
+       F(266670000, P_GPLL0, 3, 0, 0),
+       F(320000000, P_GPLL0, 2.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 jpeg0_clk_src = {
+       .cmd_rcgr = 0x57000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_jpeg0_clk_src,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "jpeg0_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_mclk_clk_src[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(24000000, P_GPLL6, 1, 1, 45),
+       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_xo_gpll0_gpll6_sleep_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "mclk0_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll6_sleep_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll6_sleep_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_xo_gpll0_gpll6_sleep_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "mclk1_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll6_sleep_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll6_sleep_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 mclk2_clk_src = {
+       .cmd_rcgr = 0x5c000,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_mclk_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll6_sleep_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "mclk2_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll6_sleep_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll6_sleep_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+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(145450000, P_GPLL0, 5.5, 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 mdp_clk_src = {
+       .cmd_rcgr = 0x4d014,
+       .hid_width = 5,
+       .freq_tbl = ftbl_mdp_clk_src,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "mdp_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_pclk_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_pclk_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 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_sdcc1_ice_core_clk_src[] = {
+       F(100000000, P_GPLL0, 8, 0, 0),
+       F(200000000, P_GPLL0, 4, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 sdcc1_ice_core_clk_src = {
+       .cmd_rcgr = 0x5d000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_sdcc1_ice_core_clk_src,
+       .parent_map = gcc_xo_gpll0_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "sdcc1_ice_core_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_sdcc1_apps_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL4, 2 },
+};
+
+static const struct clk_parent_data gcc_sdcc1_apss_data[] = {
+       { .index = DT_XO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll4.clkr.hw },
+};
+
+static const struct freq_tbl ftbl_sdcc1_apps_clk_src[] = {
+       F(144000, P_XO, 16, 3, 25),
+       F(400000, P_XO, 12, 1, 4),
+       F(20000000, P_GPLL0, 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(192000000, P_GPLL4, 6, 0, 0),
+       F(200000000, P_GPLL0, 4, 0, 0),
+       F(384000000, P_GPLL4, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 sdcc1_apps_clk_src = {
+       .cmd_rcgr = 0x42004,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_sdcc1_apps_clk_src,
+       .parent_map = gcc_sdcc1_apps_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "sdcc1_apps_clk_src",
+               .parent_data = gcc_sdcc1_apss_data,
+               .num_parents = ARRAY_SIZE(gcc_sdcc1_apss_data),
+               .ops = &clk_rcg2_floor_ops,
+       }
+};
+
+static const struct freq_tbl ftbl_sdcc2_apps_clk_src[] = {
+       F(144000, P_XO, 16, 3, 25),
+       F(400000, P_XO, 12, 1, 4),
+       F(20000000, P_GPLL0, 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 sdcc2_apps_clk_src = {
+       .cmd_rcgr = 0x43004,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .freq_tbl = ftbl_sdcc2_apps_clk_src,
+       .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 const struct freq_tbl ftbl_usb_hs_system_clk_src[] = {
+       F(80000000, P_GPLL0, 10, 0, 0),
+       F(100000000, P_GPLL0, 8, 0, 0),
+       F(133330000, P_GPLL0, 6, 0, 0),
+       F(177780000, P_GPLL0, 4.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 usb_hs_system_clk_src = {
+       .cmd_rcgr = 0x41010,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_map,
+       .freq_tbl = ftbl_usb_hs_system_clk_src,
+       .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 freq_tbl ftbl_vcodec0_clk_src[] = {
+       F(133330000, P_GPLL0, 6, 0, 0),
+       F(180000000, P_GPLL6, 6, 0, 0),
+       F(228570000, P_GPLL0, 3.5, 0, 0),
+       F(266670000, P_GPLL0, 3, 0, 0),
+       F(308570000, P_GPLL6, 3.5, 0, 0),
+       F(329140000, P_GPLL4, 3.5, 0, 0),
+       F(360000000, P_GPLL6, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 vcodec0_clk_src = {
+       .cmd_rcgr = 0x4c000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_vcodec0_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll6_gpll4_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "vcodec0_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll6_gpll4_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll6_gpll4_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static const struct freq_tbl ftbl_vfe_clk_src[] = {
+       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(200000000, P_GPLL0, 4, 0, 0),
+       F(266670000, P_GPLL0, 3, 0, 0),
+       F(308570000, P_GPLL6, 3.5, 0, 0),
+       F(320000000, P_GPLL0, 2.5, 0, 0),
+       F(329140000, P_GPLL4, 3.5, 0, 0),
+       F(360000000, P_GPLL6, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 vfe0_clk_src = {
+       .cmd_rcgr = 0x58000,
+       .hid_width = 5,
+       .freq_tbl = ftbl_vfe_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll6_gpll4_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "vfe0_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll6_gpll4_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll6_gpll4_data),
+               .ops = &clk_rcg2_ops,
+       }
+};
+
+static struct clk_rcg2 vfe1_clk_src = {
+       .cmd_rcgr = 0x58054,
+       .hid_width = 5,
+       .freq_tbl = ftbl_vfe_clk_src,
+       .parent_map = gcc_xo_gpll0_gpll6_gpll4_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "vfe1_clk_src",
+               .parent_data = gcc_xo_gpll0_gpll6_gpll4_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll6_gpll4_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_gpll0_out_aux_map,
+       .clkr.hw.init = &(struct clk_init_data) {
+               .name = "vsync_clk_src",
+               .parent_data = gcc_xo_gpll0_data,
+               .num_parents = ARRAY_SIZE(gcc_xo_gpll0_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",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_bimc_gfx_clk = {
+       .halt_reg = 0x59034,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x59034,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_bimc_gfx_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_bimc_gpu_clk = {
+       .halt_reg = 0x59030,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x59030,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_bimc_gpu_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp1_ahb_clk = {
+       .halt_reg = 0x01008,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(10),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp2_ahb_clk = {
+       .halt_reg = 0x0b008,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(20),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp2_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp1_qup2_i2c_apps_clk = {
+       .halt_reg = 0x03010,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x03010,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_qup2_i2c_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup2_i2c_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp1_qup3_i2c_apps_clk = {
+       .halt_reg = 0x04020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x04020,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_qup3_i2c_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup3_i2c_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp1_qup4_i2c_apps_clk = {
+       .halt_reg = 0x05020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x05020,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_qup4_i2c_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup4_i2c_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp2_qup1_i2c_apps_clk = {
+       .halt_reg = 0x0c008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0c008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp2_qup1_i2c_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup1_i2c_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp2_qup2_i2c_apps_clk = {
+       .halt_reg = 0x0d010,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0d010,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp2_qup2_i2c_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup2_i2c_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp2_qup3_i2c_apps_clk = {
+       .halt_reg = 0x0f020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0f020,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp2_qup3_i2c_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup3_i2c_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp1_qup2_spi_apps_clk = {
+       .halt_reg = 0x0300c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0300c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_qup2_spi_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup2_spi_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp1_qup3_spi_apps_clk = {
+       .halt_reg = 0x0401c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0401c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_qup3_spi_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup3_spi_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp1_qup4_spi_apps_clk = {
+       .halt_reg = 0x0501c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0501c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_qup4_spi_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_qup4_spi_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp2_qup1_spi_apps_clk = {
+       .halt_reg = 0x0c004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0c004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp2_qup1_spi_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup1_spi_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp2_qup2_spi_apps_clk = {
+       .halt_reg = 0x0d00c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0d00c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp2_qup2_spi_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup2_spi_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp2_qup3_spi_apps_clk = {
+       .halt_reg = 0x0f01c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0f01c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp2_qup3_spi_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_qup3_spi_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp1_uart1_apps_clk = {
+       .halt_reg = 0x0203c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0203c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_uart1_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_uart1_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp1_uart2_apps_clk = {
+       .halt_reg = 0x0302c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0302c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp1_uart2_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp1_uart2_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp2_uart1_apps_clk = {
+       .halt_reg = 0x0c03c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0c03c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp2_uart1_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_uart1_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_blsp2_uart2_apps_clk = {
+       .halt_reg = 0x0d02c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0d02c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_blsp2_uart2_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &blsp2_uart2_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_boot_rom_ahb_clk = {
+       .halt_reg = 0x1300c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(7),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_boot_rom_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_ahb_clk = {
+       .halt_reg = 0x56004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x56004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_cci_ahb_clk = {
+       .halt_reg = 0x5101c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5101c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_cci_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_top_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_cci_clk = {
+       .halt_reg = 0x51018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x51018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_cci_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &cci_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_cpp_ahb_clk = {
+       .halt_reg = 0x58040,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x58040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_cpp_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_top_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_cpp_clk = {
+       .halt_reg = 0x5803c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5803c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_cpp_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &cpp_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi0_ahb_clk = {
+       .halt_reg = 0x4e040,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4e040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi0_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_top_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi1_ahb_clk = {
+       .halt_reg = 0x4f040,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4f040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi1_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_top_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi2_ahb_clk = {
+       .halt_reg = 0x3c040,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3c040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi2_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_top_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi0_clk = {
+       .halt_reg = 0x4e03c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4e03c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi1_clk = {
+       .halt_reg = 0x4f03c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4f03c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi1_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi2_clk = {
+       .halt_reg = 0x3c03c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3c03c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi2_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi2_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi0phy_clk = {
+       .halt_reg = 0x4e048,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4e048,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi0phy_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi1phy_clk = {
+       .halt_reg = 0x4f048,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4f048,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi1phy_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi2phy_clk = {
+       .halt_reg = 0x3c048,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3c048,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi2phy_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi2_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi0phytimer_clk = {
+       .halt_reg = 0x4e01c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4e01c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi0phytimer_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi0phytimer_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi1phytimer_clk = {
+       .halt_reg = 0x4f01c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4f01c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi1phytimer_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi1phytimer_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi0pix_clk = {
+       .halt_reg = 0x4e058,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4e058,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi0pix_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi1pix_clk = {
+       .halt_reg = 0x4f058,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4f058,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi1pix_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi2pix_clk = {
+       .halt_reg = 0x3c058,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3c058,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi2pix_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi2_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi0rdi_clk = {
+       .halt_reg = 0x4e050,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4e050,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi0rdi_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi1rdi_clk = {
+       .halt_reg = 0x4f050,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4f050,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi1rdi_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi2rdi_clk = {
+       .halt_reg = 0x3c050,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3c050,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi2rdi_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &csi2_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi_vfe0_clk = {
+       .halt_reg = 0x58050,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x58050,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi_vfe0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vfe0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_csi_vfe1_clk = {
+       .halt_reg = 0x58074,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x58074,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_csi_vfe1_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vfe1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_gp0_clk = {
+       .halt_reg = 0x54018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x54018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_gp0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_gp0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_gp1_clk = {
+       .halt_reg = 0x55018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x55018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_gp1_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_gp1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_ispif_ahb_clk = {
+       .halt_reg = 0x50004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x50004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_ispif_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_top_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_jpeg0_clk = {
+       .halt_reg = 0x57020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x57020,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_jpeg0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &jpeg0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_jpeg_ahb_clk = {
+       .halt_reg = 0x57024,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x57024,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_jpeg_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_top_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_jpeg_axi_clk = {
+       .halt_reg = 0x57028,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x57028,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_jpeg_axi_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_mclk0_clk = {
+       .halt_reg = 0x52018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x52018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_mclk0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &mclk0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_mclk1_clk = {
+       .halt_reg = 0x53018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x53018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_mclk1_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &mclk1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_mclk2_clk = {
+       .halt_reg = 0x5c018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5c018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_mclk2_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &mclk2_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_micro_ahb_clk = {
+       .halt_reg = 0x5600c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5600c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_micro_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_top_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_top_ahb_clk = {
+       .halt_reg = 0x5a014,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5a014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_top_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_top_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_vfe0_ahb_clk = {
+       .halt_reg = 0x58044,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x58044,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_vfe0_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_top_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_vfe0_axi_clk = {
+       .halt_reg = 0x58048,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x58048,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_vfe0_axi_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_vfe0_clk = {
+       .halt_reg = 0x58038,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x58038,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_vfe0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vfe0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_vfe1_ahb_clk = {
+       .halt_reg = 0x58060,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x58060,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_vfe1_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &camss_top_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_vfe1_axi_clk = {
+       .halt_reg = 0x58068,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x58068,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_vfe1_axi_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_camss_vfe1_clk = {
+       .halt_reg = 0x5805c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5805c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_camss_vfe1_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vfe1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_cpp_tbu_clk = {
+       .halt_reg = 0x12040,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x4500c,
+               .enable_mask = BIT(14),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_cpp_tbu_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_crypto_ahb_clk = {
+       .halt_reg = 0x16024,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_crypto_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_crypto_axi_clk = {
+       .halt_reg = 0x16020,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_crypto_axi_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_crypto_clk = {
+       .halt_reg = 0x1601c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(2),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_crypto_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &crypto_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_dcc_clk = {
+       .halt_reg = 0x77004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x77004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_dcc_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_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",
+                       .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",
+                       .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",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gp1_clk = {
+       .halt_reg = 0x08000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x08000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_gp1_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gp1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_gp2_clk = {
+       .halt_reg = 0x09000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x09000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_gp2_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gp2_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_gp3_clk = {
+       .halt_reg = 0x0a000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x0a000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_gp3_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gp3_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_jpeg_tbu_clk = {
+       .halt_reg = 0x12034,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x4500c,
+               .enable_mask = BIT(10),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_jpeg_tbu_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_mdp_tbu_clk = {
+       .halt_reg = 0x1201c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x4500c,
+               .enable_mask = BIT(4),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_mdp_tbu_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_mdss_ahb_clk = {
+       .halt_reg = 0x4d07c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d07c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_mdss_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_mdss_axi_clk = {
+       .halt_reg = 0x4d080,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d080,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_mdss_axi_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_mdss_byte0_clk = {
+       .halt_reg = 0x4d094,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d094,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_mdss_byte0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &byte0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_mdss_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",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_mss_q6_bimc_axi_clk = {
+       .halt_reg = 0x49004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x49004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_mss_q6_bimc_axi_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_oxili_ahb_clk = {
+       .halt_reg = 0x59028,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x59028,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_oxili_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_oxili_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",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_prng_ahb_clk = {
+       .halt_reg = 0x13004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(8),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_prng_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_qdss_dap_clk = {
+       .halt_reg = 0x29084,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x45004,
+               .enable_mask = BIT(11),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_qdss_dap_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_sdcc1_ice_core_clk = {
+       .halt_reg = 0x5d014,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x5d014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_sdcc1_ice_core_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &sdcc1_ice_core_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_sdcc1_ahb_clk = {
+       .halt_reg = 0x4201c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4201c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_sdcc1_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_sdcc2_ahb_clk = {
+       .halt_reg = 0x4301c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4301c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_sdcc2_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_sdcc1_apps_clk = {
+       .halt_reg = 0x42018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x42018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_sdcc1_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &sdcc1_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_sdcc2_apps_clk = {
+       .halt_reg = 0x43018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x43018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_sdcc2_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &sdcc2_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_smmu_cfg_clk = {
+       .halt_reg = 0x12038,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x4500c,
+               .enable_mask = BIT(12),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_smmu_cfg_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_usb2a_phy_sleep_clk = {
+       .halt_reg = 0x4102c,
+       .clkr = {
+               .enable_reg = 0x4102c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb2a_phy_sleep_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb_hs_ahb_clk = {
+       .halt_reg = 0x41008,
+       .clkr = {
+               .enable_reg = 0x41008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb_hs_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb_hs_phy_cfg_ahb_clk = {
+       .halt_reg = 0x41030,
+       .clkr = {
+               .enable_reg = 0x41030,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb_hs_phy_cfg_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb_hs_system_clk = {
+       .halt_reg = 0x41004,
+       .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,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_venus0_ahb_clk = {
+       .halt_reg = 0x4c020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4c020,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_venus0_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_venus0_axi_clk = {
+       .halt_reg = 0x4c024,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4c024,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_venus0_axi_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_venus0_core0_vcodec0_clk = {
+       .halt_reg = 0x4c02c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4c02c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_venus0_core0_vcodec0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vcodec0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_venus0_vcodec0_clk = {
+       .halt_reg = 0x4c01c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4c01c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_venus0_vcodec0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &vcodec0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+                       .flags = CLK_SET_RATE_PARENT,
+               }
+       }
+};
+
+static struct clk_branch gcc_venus_tbu_clk = {
+       .halt_reg = 0x12014,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x4500c,
+               .enable_mask = BIT(5),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_venus_tbu_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_vfe1_tbu_clk = {
+       .halt_reg = 0x12090,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x4500c,
+               .enable_mask = BIT(17),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_vfe1_tbu_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct clk_branch gcc_vfe_tbu_clk = {
+       .halt_reg = 0x1203c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x4500c,
+               .enable_mask = BIT(9),
+               .hw.init = &(struct clk_init_data) {
+                       .name = "gcc_vfe_tbu_clk",
+                       .ops = &clk_branch2_ops,
+               }
+       }
+};
+
+static struct gdsc venus_gdsc = {
+       .gdscr = 0x4c018,
+       .cxcs = (unsigned int []){ 0x4c024, 0x4c01c },
+       .cxc_count = 2,
+       .pd = {
+               .name = "venus_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc venus_core0_gdsc = {
+       .gdscr = 0x4c028,
+       .cxcs = (unsigned int []){ 0x4c02c },
+       .cxc_count = 1,
+       .pd = {
+               .name = "venus_core0",
+       },
+       .flags = HW_CTRL,
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc mdss_gdsc = {
+       .gdscr = 0x4d078,
+       .cxcs = (unsigned int []){ 0x4d080, 0x4d088 },
+       .cxc_count = 2,
+       .pd = {
+               .name = "mdss_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc jpeg_gdsc = {
+       .gdscr = 0x5701c,
+       .cxcs = (unsigned int []){ 0x57020, 0x57028 },
+       .cxc_count = 2,
+       .pd = {
+               .name = "jpeg_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc vfe0_gdsc = {
+       .gdscr = 0x58034,
+       .cxcs = (unsigned int []){ 0x58038, 0x58048, 0x5600c, 0x58050 },
+       .cxc_count = 4,
+       .pd = {
+               .name = "vfe0_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc vfe1_gdsc = {
+       .gdscr = 0x5806c,
+       .cxcs = (unsigned int []){ 0x5805c, 0x58068, 0x5600c, 0x58074 },
+       .cxc_count = 4,
+       .pd = {
+               .name = "vfe1_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc oxili_gx_gdsc = {
+       .gdscr = 0x5901c,
+       .clamp_io_ctrl = 0x5b00c,
+       .cxcs = (unsigned int []){ 0x59000, 0x59020 },
+       .cxc_count = 2,
+       .pd = {
+               .name = "oxili_gx_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = CLAMP_IO,
+};
+
+static struct gdsc cpp_gdsc = {
+       .gdscr = 0x58078,
+       .cxcs = (unsigned int []){ 0x5803c, 0x58064 },
+       .cxc_count = 2,
+       .pd = {
+               .name = "cpp_gdsc",
+       },
+       .flags = ALWAYS_ON,
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct clk_regmap *gcc_msm8917_clocks[] = {
+       [GPLL0] = &gpll0.clkr,
+       [GPLL0_EARLY] = &gpll0_early.clkr,
+       [GPLL3] = &gpll3.clkr,
+       [GPLL3_EARLY] = &gpll3_early.clkr,
+       [GPLL4] = &gpll4.clkr,
+       [GPLL4_EARLY] = &gpll4_early.clkr,
+       [GPLL6] = &gpll6,
+       [GPLL6_EARLY] = &gpll6_early.clkr,
+       [APSS_AHB_CLK_SRC] = &apss_ahb_clk_src.clkr,
+       [BLSP1_QUP2_I2C_APPS_CLK_SRC] = &blsp1_qup2_i2c_apps_clk_src.clkr,
+       [BLSP1_QUP2_SPI_APPS_CLK_SRC] = &blsp1_qup2_spi_apps_clk_src.clkr,
+       [BLSP1_QUP3_I2C_APPS_CLK_SRC] = &blsp1_qup3_i2c_apps_clk_src.clkr,
+       [BLSP1_QUP3_SPI_APPS_CLK_SRC] = &blsp1_qup3_spi_apps_clk_src.clkr,
+       [BLSP1_QUP4_I2C_APPS_CLK_SRC] = &blsp1_qup4_i2c_apps_clk_src.clkr,
+       [BLSP1_QUP4_SPI_APPS_CLK_SRC] = &blsp1_qup4_spi_apps_clk_src.clkr,
+       [BLSP1_UART1_APPS_CLK_SRC] = &blsp1_uart1_apps_clk_src.clkr,
+       [BLSP1_UART2_APPS_CLK_SRC] = &blsp1_uart2_apps_clk_src.clkr,
+       [BLSP2_QUP1_I2C_APPS_CLK_SRC] = &blsp2_qup1_i2c_apps_clk_src.clkr,
+       [BLSP2_QUP1_SPI_APPS_CLK_SRC] = &blsp2_qup1_spi_apps_clk_src.clkr,
+       [BLSP2_QUP2_I2C_APPS_CLK_SRC] = &blsp2_qup2_i2c_apps_clk_src.clkr,
+       [BLSP2_QUP2_SPI_APPS_CLK_SRC] = &blsp2_qup2_spi_apps_clk_src.clkr,
+       [BLSP2_QUP3_I2C_APPS_CLK_SRC] = &blsp2_qup3_i2c_apps_clk_src.clkr,
+       [BLSP2_QUP3_SPI_APPS_CLK_SRC] = &blsp2_qup3_spi_apps_clk_src.clkr,
+       [BLSP2_UART1_APPS_CLK_SRC] = &blsp2_uart1_apps_clk_src.clkr,
+       [BLSP2_UART2_APPS_CLK_SRC] = &blsp2_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,
+       [CCI_CLK_SRC] = &cci_clk_src.clkr,
+       [CPP_CLK_SRC] = &cpp_clk_src.clkr,
+       [CRYPTO_CLK_SRC] = &crypto_clk_src.clkr,
+       [CSI0PHYTIMER_CLK_SRC] = &csi0phytimer_clk_src.clkr,
+       [CSI0_CLK_SRC] = &csi0_clk_src.clkr,
+       [CSI1PHYTIMER_CLK_SRC] = &csi1phytimer_clk_src.clkr,
+       [CSI1_CLK_SRC] = &csi1_clk_src.clkr,
+       [CSI2_CLK_SRC] = &csi2_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,
+       [JPEG0_CLK_SRC] = &jpeg0_clk_src.clkr,
+       [MCLK0_CLK_SRC] = &mclk0_clk_src.clkr,
+       [MCLK1_CLK_SRC] = &mclk1_clk_src.clkr,
+       [MCLK2_CLK_SRC] = &mclk2_clk_src.clkr,
+       [MDP_CLK_SRC] = &mdp_clk_src.clkr,
+       [PCLK0_CLK_SRC] = &pclk0_clk_src.clkr,
+       [PDM2_CLK_SRC] = &pdm2_clk_src.clkr,
+       [SDCC1_APPS_CLK_SRC] = &sdcc1_apps_clk_src.clkr,
+       [SDCC1_ICE_CORE_CLK_SRC] = &sdcc1_ice_core_clk_src.clkr,
+       [SDCC2_APPS_CLK_SRC] = &sdcc2_apps_clk_src.clkr,
+       [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,
+       [VFE1_CLK_SRC] = &vfe1_clk_src.clkr,
+       [VSYNC_CLK_SRC] = &vsync_clk_src.clkr,
+       [GCC_APSS_TCU_CLK] = &gcc_apss_tcu_clk.clkr,
+       [GCC_BIMC_GFX_CLK] = &gcc_bimc_gfx_clk.clkr,
+       [GCC_BIMC_GPU_CLK] = &gcc_bimc_gpu_clk.clkr,
+       [GCC_BLSP1_AHB_CLK] = &gcc_blsp1_ahb_clk.clkr,
+       [GCC_BLSP1_QUP2_I2C_APPS_CLK] = &gcc_blsp1_qup2_i2c_apps_clk.clkr,
+       [GCC_BLSP1_QUP2_SPI_APPS_CLK] = &gcc_blsp1_qup2_spi_apps_clk.clkr,
+       [GCC_BLSP1_QUP3_I2C_APPS_CLK] = &gcc_blsp1_qup3_i2c_apps_clk.clkr,
+       [GCC_BLSP1_QUP3_SPI_APPS_CLK] = &gcc_blsp1_qup3_spi_apps_clk.clkr,
+       [GCC_BLSP1_QUP4_I2C_APPS_CLK] = &gcc_blsp1_qup4_i2c_apps_clk.clkr,
+       [GCC_BLSP1_QUP4_SPI_APPS_CLK] = &gcc_blsp1_qup4_spi_apps_clk.clkr,
+       [GCC_BLSP1_UART1_APPS_CLK] = &gcc_blsp1_uart1_apps_clk.clkr,
+       [GCC_BLSP1_UART2_APPS_CLK] = &gcc_blsp1_uart2_apps_clk.clkr,
+       [GCC_BLSP2_AHB_CLK] = &gcc_blsp2_ahb_clk.clkr,
+       [GCC_BLSP2_QUP1_I2C_APPS_CLK] = &gcc_blsp2_qup1_i2c_apps_clk.clkr,
+       [GCC_BLSP2_QUP1_SPI_APPS_CLK] = &gcc_blsp2_qup1_spi_apps_clk.clkr,
+       [GCC_BLSP2_QUP2_I2C_APPS_CLK] = &gcc_blsp2_qup2_i2c_apps_clk.clkr,
+       [GCC_BLSP2_QUP2_SPI_APPS_CLK] = &gcc_blsp2_qup2_spi_apps_clk.clkr,
+       [GCC_BLSP2_QUP3_I2C_APPS_CLK] = &gcc_blsp2_qup3_i2c_apps_clk.clkr,
+       [GCC_BLSP2_QUP3_SPI_APPS_CLK] = &gcc_blsp2_qup3_spi_apps_clk.clkr,
+       [GCC_BLSP2_UART1_APPS_CLK] = &gcc_blsp2_uart1_apps_clk.clkr,
+       [GCC_BLSP2_UART2_APPS_CLK] = &gcc_blsp2_uart2_apps_clk.clkr,
+       [GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr,
+       [GCC_CAMSS_AHB_CLK] = &gcc_camss_ahb_clk.clkr,
+       [GCC_CAMSS_CCI_AHB_CLK] = &gcc_camss_cci_ahb_clk.clkr,
+       [GCC_CAMSS_CCI_CLK] = &gcc_camss_cci_clk.clkr,
+       [GCC_CAMSS_CPP_AHB_CLK] = &gcc_camss_cpp_ahb_clk.clkr,
+       [GCC_CAMSS_CPP_CLK] = &gcc_camss_cpp_clk.clkr,
+       [GCC_CAMSS_CSI0PHYTIMER_CLK] = &gcc_camss_csi0phytimer_clk.clkr,
+       [GCC_CAMSS_CSI0PHY_CLK] = &gcc_camss_csi0phy_clk.clkr,
+       [GCC_CAMSS_CSI0PIX_CLK] = &gcc_camss_csi0pix_clk.clkr,
+       [GCC_CAMSS_CSI0RDI_CLK] = &gcc_camss_csi0rdi_clk.clkr,
+       [GCC_CAMSS_CSI0_AHB_CLK] = &gcc_camss_csi0_ahb_clk.clkr,
+       [GCC_CAMSS_CSI0_CLK] = &gcc_camss_csi0_clk.clkr,
+       [GCC_CAMSS_CSI1PHYTIMER_CLK] = &gcc_camss_csi1phytimer_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_CSI1_AHB_CLK] = &gcc_camss_csi1_ahb_clk.clkr,
+       [GCC_CAMSS_CSI1_CLK] = &gcc_camss_csi1_clk.clkr,
+       [GCC_CAMSS_CSI2PHY_CLK] = &gcc_camss_csi2phy_clk.clkr,
+       [GCC_CAMSS_CSI2PIX_CLK] = &gcc_camss_csi2pix_clk.clkr,
+       [GCC_CAMSS_CSI2RDI_CLK] = &gcc_camss_csi2rdi_clk.clkr,
+       [GCC_CAMSS_CSI2_AHB_CLK] = &gcc_camss_csi2_ahb_clk.clkr,
+       [GCC_CAMSS_CSI2_CLK] = &gcc_camss_csi2_clk.clkr,
+       [GCC_CAMSS_CSI_VFE0_CLK] = &gcc_camss_csi_vfe0_clk.clkr,
+       [GCC_CAMSS_CSI_VFE1_CLK] = &gcc_camss_csi_vfe1_clk.clkr,
+       [GCC_CAMSS_GP0_CLK] = &gcc_camss_gp0_clk.clkr,
+       [GCC_CAMSS_GP1_CLK] = &gcc_camss_gp1_clk.clkr,
+       [GCC_CAMSS_ISPIF_AHB_CLK] = &gcc_camss_ispif_ahb_clk.clkr,
+       [GCC_CAMSS_JPEG0_CLK] = &gcc_camss_jpeg0_clk.clkr,
+       [GCC_CAMSS_JPEG_AHB_CLK] = &gcc_camss_jpeg_ahb_clk.clkr,
+       [GCC_CAMSS_JPEG_AXI_CLK] = &gcc_camss_jpeg_axi_clk.clkr,
+       [GCC_CAMSS_MCLK0_CLK] = &gcc_camss_mclk0_clk.clkr,
+       [GCC_CAMSS_MCLK1_CLK] = &gcc_camss_mclk1_clk.clkr,
+       [GCC_CAMSS_MCLK2_CLK] = &gcc_camss_mclk2_clk.clkr,
+       [GCC_CAMSS_MICRO_AHB_CLK] = &gcc_camss_micro_ahb_clk.clkr,
+       [GCC_CAMSS_TOP_AHB_CLK] = &gcc_camss_top_ahb_clk.clkr,
+       [GCC_CAMSS_VFE0_AHB_CLK] = &gcc_camss_vfe0_ahb_clk.clkr,
+       [GCC_CAMSS_VFE0_AXI_CLK] = &gcc_camss_vfe0_axi_clk.clkr,
+       [GCC_CAMSS_VFE0_CLK] = &gcc_camss_vfe0_clk.clkr,
+       [GCC_CAMSS_VFE1_AHB_CLK] = &gcc_camss_vfe1_ahb_clk.clkr,
+       [GCC_CAMSS_VFE1_AXI_CLK] = &gcc_camss_vfe1_axi_clk.clkr,
+       [GCC_CAMSS_VFE1_CLK] = &gcc_camss_vfe1_clk.clkr,
+       [GCC_CPP_TBU_CLK] = &gcc_cpp_tbu_clk.clkr,
+       [GCC_CRYPTO_AHB_CLK] = &gcc_crypto_ahb_clk.clkr,
+       [GCC_CRYPTO_AXI_CLK] = &gcc_crypto_axi_clk.clkr,
+       [GCC_CRYPTO_CLK] = &gcc_crypto_clk.clkr,
+       [GCC_DCC_CLK] = &gcc_dcc_clk.clkr,
+       [GCC_GFX_TBU_CLK] = &gcc_gfx_tbu_clk.clkr,
+       [GCC_GFX_TCU_CLK] = &gcc_gfx_tcu_clk.clkr,
+       [GCC_GP1_CLK] = &gcc_gp1_clk.clkr,
+       [GCC_GP2_CLK] = &gcc_gp2_clk.clkr,
+       [GCC_GP3_CLK] = &gcc_gp3_clk.clkr,
+       [GCC_GTCU_AHB_CLK] = &gcc_gtcu_ahb_clk.clkr,
+       [GCC_JPEG_TBU_CLK] = &gcc_jpeg_tbu_clk.clkr,
+       [GCC_MDP_TBU_CLK] = &gcc_mdp_tbu_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_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr,
+       [GCC_QDSS_DAP_CLK] = &gcc_qdss_dap_clk.clkr,
+       [GCC_SDCC1_AHB_CLK] = &gcc_sdcc1_ahb_clk.clkr,
+       [GCC_SDCC1_APPS_CLK] = &gcc_sdcc1_apps_clk.clkr,
+       [GCC_SDCC1_ICE_CORE_CLK] = &gcc_sdcc1_ice_core_clk.clkr,
+       [GCC_SDCC2_AHB_CLK] = &gcc_sdcc2_ahb_clk.clkr,
+       [GCC_SDCC2_APPS_CLK] = &gcc_sdcc2_apps_clk.clkr,
+       [GCC_SMMU_CFG_CLK] = &gcc_smmu_cfg_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,
+       [GCC_VENUS_TBU_CLK] = &gcc_venus_tbu_clk.clkr,
+       [GCC_VFE1_TBU_CLK] = &gcc_vfe1_tbu_clk.clkr,
+       [GCC_VFE_TBU_CLK] = &gcc_vfe_tbu_clk.clkr,
+};
+
+static const struct qcom_reset_map gcc_msm8917_resets[] = {
+       [GCC_CAMSS_MICRO_BCR]           = { 0x56008 },
+       [GCC_MSS_BCR]                   = { 0x71000 },
+       [GCC_QUSB2_PHY_BCR]             = { 0x4103c },
+       [GCC_USB_HS_BCR]                = { 0x41000 },
+       [GCC_USB2_HS_PHY_ONLY_BCR]      = { 0x41034 },
+};
+
+static const struct regmap_config gcc_msm8917_regmap_config = {
+       .reg_bits       = 32,
+       .reg_stride     = 4,
+       .val_bits       = 32,
+       .max_register   = 0x80000,
+       .fast_io        = true,
+};
+
+static struct gdsc *gcc_msm8917_gdscs[] = {
+       [CPP_GDSC] = &cpp_gdsc,
+       [JPEG_GDSC] = &jpeg_gdsc,
+       [MDSS_GDSC] = &mdss_gdsc,
+       [OXILI_GX_GDSC] = &oxili_gx_gdsc,
+       [VENUS_CORE0_GDSC] = &venus_core0_gdsc,
+       [VENUS_GDSC] = &venus_gdsc,
+       [VFE0_GDSC] = &vfe0_gdsc,
+       [VFE1_GDSC] = &vfe1_gdsc,
+};
+
+static const struct qcom_cc_desc gcc_msm8917_desc = {
+       .config = &gcc_msm8917_regmap_config,
+       .clks = gcc_msm8917_clocks,
+       .num_clks = ARRAY_SIZE(gcc_msm8917_clocks),
+       .resets = gcc_msm8917_resets,
+       .num_resets = ARRAY_SIZE(gcc_msm8917_resets),
+       .gdscs = gcc_msm8917_gdscs,
+       .num_gdscs = ARRAY_SIZE(gcc_msm8917_gdscs),
+};
+
+static const struct qcom_cc_desc gcc_qm215_desc = {
+       .config = &gcc_msm8917_regmap_config,
+       .clks = gcc_msm8917_clocks,
+       .num_clks = ARRAY_SIZE(gcc_msm8917_clocks),
+       .resets = gcc_msm8917_resets,
+       .num_resets = ARRAY_SIZE(gcc_msm8917_resets),
+       .gdscs = gcc_msm8917_gdscs,
+       .num_gdscs = ARRAY_SIZE(gcc_msm8917_gdscs),
+};
+
+static int gcc_msm8917_probe(struct platform_device *pdev)
+{
+       struct regmap *regmap;
+       const struct qcom_cc_desc *gcc_desc;
+
+       gcc_desc = of_device_get_match_data(&pdev->dev);
+
+       if (gcc_desc == &gcc_qm215_desc)
+               gfx3d_clk_src.parent_map = gcc_gfx3d_map_qm215;
+
+       regmap = qcom_cc_map(pdev, gcc_desc);
+       if (IS_ERR(regmap))
+               return PTR_ERR(regmap);
+
+       clk_alpha_pll_configure(&gpll3_early, regmap, &gpll3_early_config);
+
+       return qcom_cc_really_probe(pdev, gcc_desc, regmap);
+}
+
+static const struct of_device_id gcc_msm8917_match_table[] = {
+       { .compatible = "qcom,gcc-msm8917", .data = &gcc_msm8917_desc },
+       { .compatible = "qcom,gcc-qm215", .data = &gcc_qm215_desc },
+       {},
+};
+
+static struct platform_driver gcc_msm8917_driver = {
+       .probe = gcc_msm8917_probe,
+       .driver = {
+               .name = "gcc-msm8917",
+               .of_match_table = gcc_msm8917_match_table,
+       },
+};
+
+static int __init gcc_msm8917_init(void)
+{
+       return platform_driver_register(&gcc_msm8917_driver);
+}
+core_initcall(gcc_msm8917_init);
+
+static void __exit gcc_msm8917_exit(void)
+{
+       platform_driver_unregister(&gcc_msm8917_driver);
+}
+module_exit(gcc_msm8917_exit);
+
+MODULE_DESCRIPTION("Qualcomm GCC MSM8917 Driver");
+MODULE_LICENSE("GPL");
index 9dd4e7ffa1f8f8217f5c6e18d69e7af55a5ece1b..dbc7093ab9cc45c603ab3d138b53140efaf9dfc3 100644 (file)
@@ -3754,19 +3754,17 @@ static int gcc_msm8960_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int gcc_msm8960_remove(struct platform_device *pdev)
+static void gcc_msm8960_remove(struct platform_device *pdev)
 {
        struct platform_device *tsens = platform_get_drvdata(pdev);
 
        if (tsens)
                platform_device_unregister(tsens);
-
-       return 0;
 }
 
 static struct platform_driver gcc_msm8960_driver = {
        .probe          = gcc_msm8960_probe,
-       .remove         = gcc_msm8960_remove,
+       .remove_new     = gcc_msm8960_remove,
        .driver         = {
                .name   = "gcc-msm8960",
                .of_match_table = gcc_msm8960_match_table,
index e161637067351c505432999c7c7e6de64d997481..5e44d1bcca9e2633242f42b98f188ee77c2969d3 100644 (file)
@@ -3455,7 +3455,8 @@ static struct gdsc usb30_gdsc = {
        .pd = {
                .name = "usb30",
        },
-       .pwrsts = PWRSTS_OFF_ON,
+       /* TODO: Change to OFF_ON when USB drivers get proper suspend support */
+       .pwrsts = PWRSTS_RET_ON,
 };
 
 static struct gdsc pcie0_gdsc = {
index 908e996841c235f0716998a90b4d6875df6fd118..be024f8093c512114fb5b1b5237b8c7b83887dea 100644 (file)
@@ -2898,7 +2898,8 @@ static struct gdsc usb_30_gdsc = {
        .pd = {
                .name = "usb_30_gdsc",
        },
-       .pwrsts = PWRSTS_OFF_ON,
+       /* TODO: Change to OFF_ON when USB drivers get proper suspend support */
+       .pwrsts = PWRSTS_RET_ON,
        .flags = VOTABLE,
 };
 
index 7792b8f237047bedb4fbdd53d025ab3251c310ff..096deff2ba257d1d3025b83fc0335938b6bc3315 100644 (file)
@@ -1243,7 +1243,8 @@ static struct clk_rcg2 gcc_sdcc2_apps_clk_src = {
                .name = "gcc_sdcc2_apps_clk_src",
                .parent_data = gcc_parents_12,
                .num_parents = ARRAY_SIZE(gcc_parents_12),
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_floor_ops,
+               .flags = CLK_OPS_PARENT_ENABLE,
        },
 };
 
index b3198784e1c3df19eb9c2a1018345a1766f26205..04a99dbaa57e0beaf2226f36c218e93beb00e903 100644 (file)
@@ -6873,6 +6873,22 @@ static struct gdsc usb30_sec_gdsc = {
        .pwrsts = PWRSTS_RET_ON,
 };
 
+static struct gdsc emac_0_gdsc = {
+       .gdscr = 0xaa004,
+       .pd = {
+               .name = "emac_0_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc emac_1_gdsc = {
+       .gdscr = 0xba004,
+       .pd = {
+               .name = "emac_1_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
 static struct clk_regmap *gcc_sc8280xp_clocks[] = {
        [GCC_AGGRE_NOC_PCIE0_TUNNEL_AXI_CLK] = &gcc_aggre_noc_pcie0_tunnel_axi_clk.clkr,
        [GCC_AGGRE_NOC_PCIE1_TUNNEL_AXI_CLK] = &gcc_aggre_noc_pcie1_tunnel_axi_clk.clkr,
@@ -7351,6 +7367,8 @@ static struct gdsc *gcc_sc8280xp_gdscs[] = {
        [USB30_MP_GDSC] = &usb30_mp_gdsc,
        [USB30_PRIM_GDSC] = &usb30_prim_gdsc,
        [USB30_SEC_GDSC] = &usb30_sec_gdsc,
+       [EMAC_0_GDSC] = &emac_0_gdsc,
+       [EMAC_1_GDSC] = &emac_1_gdsc,
 };
 
 static const struct clk_rcg_dfs_data gcc_dfs_clocks[] = {
index 5b8222fea2f71fda13766d2aebb3e249ecec5ad9..5f09aefa7fb927c856f97f2916b1320816358334 100644 (file)
@@ -694,7 +694,7 @@ static struct clk_rcg2 gcc_camss_axi_clk_src = {
                .parent_data = gcc_parents_7,
                .num_parents = ARRAY_SIZE(gcc_parents_7),
                .flags = CLK_SET_RATE_PARENT,
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -715,7 +715,7 @@ static struct clk_rcg2 gcc_camss_cci_clk_src = {
                .parent_data = gcc_parents_9,
                .num_parents = ARRAY_SIZE(gcc_parents_9),
                .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -738,7 +738,7 @@ static struct clk_rcg2 gcc_camss_csi0phytimer_clk_src = {
                .parent_data = gcc_parents_4,
                .num_parents = ARRAY_SIZE(gcc_parents_4),
                .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -753,7 +753,7 @@ static struct clk_rcg2 gcc_camss_csi1phytimer_clk_src = {
                .parent_data = gcc_parents_4,
                .num_parents = ARRAY_SIZE(gcc_parents_4),
                .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -768,7 +768,7 @@ static struct clk_rcg2 gcc_camss_csi2phytimer_clk_src = {
                .parent_data = gcc_parents_4,
                .num_parents = ARRAY_SIZE(gcc_parents_4),
                .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -790,7 +790,7 @@ static struct clk_rcg2 gcc_camss_mclk0_clk_src = {
                .parent_data = gcc_parents_3,
                .num_parents = ARRAY_SIZE(gcc_parents_3),
                .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -805,7 +805,7 @@ static struct clk_rcg2 gcc_camss_mclk1_clk_src = {
                .parent_data = gcc_parents_3,
                .num_parents = ARRAY_SIZE(gcc_parents_3),
                .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -820,7 +820,7 @@ static struct clk_rcg2 gcc_camss_mclk2_clk_src = {
                .parent_data = gcc_parents_3,
                .num_parents = ARRAY_SIZE(gcc_parents_3),
                .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -835,7 +835,7 @@ static struct clk_rcg2 gcc_camss_mclk3_clk_src = {
                .parent_data = gcc_parents_3,
                .num_parents = ARRAY_SIZE(gcc_parents_3),
                .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -857,7 +857,7 @@ static struct clk_rcg2 gcc_camss_ope_ahb_clk_src = {
                .parent_data = gcc_parents_8,
                .num_parents = ARRAY_SIZE(gcc_parents_8),
                .flags = CLK_SET_RATE_PARENT,
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -881,7 +881,7 @@ static struct clk_rcg2 gcc_camss_ope_clk_src = {
                .parent_data = gcc_parents_8,
                .num_parents = ARRAY_SIZE(gcc_parents_8),
                .flags = CLK_SET_RATE_PARENT,
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -916,7 +916,7 @@ static struct clk_rcg2 gcc_camss_tfe_0_clk_src = {
                .parent_data = gcc_parents_5,
                .num_parents = ARRAY_SIZE(gcc_parents_5),
                .flags = CLK_SET_RATE_PARENT,
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -941,7 +941,7 @@ static struct clk_rcg2 gcc_camss_tfe_0_csid_clk_src = {
                .parent_data = gcc_parents_6,
                .num_parents = ARRAY_SIZE(gcc_parents_6),
                .flags = CLK_SET_RATE_PARENT,
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -956,7 +956,7 @@ static struct clk_rcg2 gcc_camss_tfe_1_clk_src = {
                .parent_data = gcc_parents_5,
                .num_parents = ARRAY_SIZE(gcc_parents_5),
                .flags = CLK_SET_RATE_PARENT,
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -971,7 +971,7 @@ static struct clk_rcg2 gcc_camss_tfe_1_csid_clk_src = {
                .parent_data = gcc_parents_6,
                .num_parents = ARRAY_SIZE(gcc_parents_6),
                .flags = CLK_SET_RATE_PARENT,
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -986,7 +986,7 @@ static struct clk_rcg2 gcc_camss_tfe_2_clk_src = {
                .parent_data = gcc_parents_5,
                .num_parents = ARRAY_SIZE(gcc_parents_5),
                .flags = CLK_SET_RATE_PARENT,
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -1001,7 +1001,7 @@ static struct clk_rcg2 gcc_camss_tfe_2_csid_clk_src = {
                .parent_data = gcc_parents_6,
                .num_parents = ARRAY_SIZE(gcc_parents_6),
                .flags = CLK_SET_RATE_PARENT,
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -1024,7 +1024,7 @@ static struct clk_rcg2 gcc_camss_tfe_cphy_rx_clk_src = {
                .parent_data = gcc_parents_10,
                .num_parents = ARRAY_SIZE(gcc_parents_10),
                .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -1046,7 +1046,7 @@ static struct clk_rcg2 gcc_camss_top_ahb_clk_src = {
                .parent_data = gcc_parents_7,
                .num_parents = ARRAY_SIZE(gcc_parents_7),
                .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -1116,7 +1116,7 @@ static struct clk_rcg2 gcc_pdm2_clk_src = {
                .name = "gcc_pdm2_clk_src",
                .parent_data = gcc_parents_0,
                .num_parents = ARRAY_SIZE(gcc_parents_0),
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -1329,7 +1329,7 @@ static struct clk_rcg2 gcc_ufs_phy_axi_clk_src = {
                .name = "gcc_ufs_phy_axi_clk_src",
                .parent_data = gcc_parents_0,
                .num_parents = ARRAY_SIZE(gcc_parents_0),
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -1351,7 +1351,7 @@ static struct clk_rcg2 gcc_ufs_phy_ice_core_clk_src = {
                .name = "gcc_ufs_phy_ice_core_clk_src",
                .parent_data = gcc_parents_0,
                .num_parents = ARRAY_SIZE(gcc_parents_0),
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -1392,7 +1392,7 @@ static struct clk_rcg2 gcc_ufs_phy_unipro_core_clk_src = {
                .name = "gcc_ufs_phy_unipro_core_clk_src",
                .parent_data = gcc_parents_0,
                .num_parents = ARRAY_SIZE(gcc_parents_0),
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -1414,7 +1414,7 @@ static struct clk_rcg2 gcc_usb30_prim_master_clk_src = {
                .name = "gcc_usb30_prim_master_clk_src",
                .parent_data = gcc_parents_0,
                .num_parents = ARRAY_SIZE(gcc_parents_0),
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
@@ -1483,7 +1483,7 @@ static struct clk_rcg2 gcc_video_venus_clk_src = {
                .parent_data = gcc_parents_13,
                .num_parents = ARRAY_SIZE(gcc_parents_13),
                .flags = CLK_SET_RATE_PARENT,
-               .ops = &clk_rcg2_ops,
+               .ops = &clk_rcg2_shared_ops,
        },
 };
 
index ad3c4833990da8e328d4c6d769e59d4f1080f942..417a0fd242ec193f85c1b63f4ae14f71d51de16e 100644 (file)
@@ -3534,7 +3534,8 @@ static struct gdsc usb30_prim_gdsc = {
        .pd = {
                .name = "usb30_prim_gdsc",
        },
-       .pwrsts = PWRSTS_OFF_ON,
+       /* TODO: Change to OFF_ON when USB drivers get proper suspend support */
+       .pwrsts = PWRSTS_RET_ON,
 };
 
 static struct gdsc ufs_phy_gdsc = {
diff --git a/drivers/clk/qcom/gcc-sm7150.c b/drivers/clk/qcom/gcc-sm7150.c
new file mode 100644 (file)
index 0000000..6b62817
--- /dev/null
@@ -0,0 +1,3048 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023, Danila Tikhonov <danila@jiaxyga.com>
+ * Copyright (c) 2023, David Wronek <davidwronek@gmail.com>
+ */
+
+#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/regmap.h>
+
+#include <dt-bindings/clock/qcom,sm7150-gcc.h>
+
+#include "clk-alpha-pll.h"
+#include "clk-branch.h"
+#include "clk-rcg.h"
+#include "clk-regmap.h"
+#include "common.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_GPLL6_OUT_MAIN,
+       P_GPLL7_OUT_MAIN,
+       P_SLEEP_CLK,
+};
+
+static struct clk_alpha_pll gpll0 = {
+       .offset = 0x0,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
+       .clkr = {
+               .enable_reg = 0x52000,
+               .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_fabia_ops,
+               },
+       },
+};
+
+static const struct clk_div_table post_div_table_fabia_even[] = {
+       { 0x0, 1 },
+       { 0x1, 2 },
+       { 0x3, 4 },
+       { 0x7, 8 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv gpll0_out_even = {
+       .offset = 0x0,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_fabia_even,
+       .num_post_div = ARRAY_SIZE(post_div_table_fabia_even),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpll0_out_even",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll0.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_alpha_pll_postdiv_fabia_ops,
+       },
+};
+
+static struct clk_fixed_factor gcc_pll0_main_div_cdiv = {
+       .mult = 1,
+       .div = 2,
+       .hw.init = &(struct clk_init_data){
+               .name = "gcc_pll0_main_div_cdiv",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpll0.clkr.hw,
+               },
+               .num_parents = 1,
+               .ops = &clk_fixed_factor_ops,
+       },
+};
+
+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){
+                               .index = DT_BI_TCXO,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_fixed_fabia_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll gpll7 = {
+       .offset = 0x27000,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
+       .clkr = {
+               .enable_reg = 0x52000,
+               .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_fabia_ops,
+               },
+       },
+};
+
+static const struct parent_map gcc_parent_map_0[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL0_OUT_EVEN, 6 },
+};
+
+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 clk_parent_data gcc_parent_data_0_ao[] = {
+       { .index = DT_BI_TCXO_AO },
+       { .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_SLEEP_CLK, 5 },
+       { P_GPLL0_OUT_EVEN, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_1[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &gpll0.clkr.hw },
+       { .index = DT_SLEEP_CLK },
+       { .hw = &gpll0_out_even.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_2[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+};
+
+static const struct clk_parent_data gcc_parent_data_2[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &gpll0.clkr.hw },
+};
+
+static const struct clk_parent_data gcc_parent_data_2_ao[] = {
+       { .index = DT_BI_TCXO_AO },
+       { .hw = &gpll0.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_3[] = {
+       { P_BI_TCXO, 0 },
+       { P_SLEEP_CLK, 5 },
+};
+
+static const struct clk_parent_data gcc_parent_data_3[] = {
+       { .index = DT_BI_TCXO },
+       { .index = DT_SLEEP_CLK },
+};
+
+static const struct parent_map gcc_parent_map_4[] = {
+       { P_BI_TCXO, 0 },
+};
+
+static const struct clk_parent_data gcc_parent_data_4[] = {
+       { .index = DT_BI_TCXO },
+};
+
+static const struct parent_map gcc_parent_map_5[] = {
+       { 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_5[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll6.clkr.hw },
+       { .hw = &gpll0_out_even.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_6[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL7_OUT_MAIN, 3 },
+       { P_GPLL0_OUT_EVEN, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_6[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll7.clkr.hw },
+       { .hw = &gpll0_out_even.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_7[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+       { P_GPLL0_OUT_EVEN, 6 },
+};
+
+static const struct clk_parent_data gcc_parent_data_7[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &gpll0.clkr.hw },
+       { .hw = &gpll0_out_even.clkr.hw },
+};
+
+static const struct parent_map gcc_parent_map_8[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_MAIN, 1 },
+};
+
+static const struct clk_parent_data gcc_parent_data_8[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &gpll0.clkr.hw },
+};
+
+static const struct freq_tbl ftbl_gcc_cpuss_ahb_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_cpuss_ahb_clk_src = {
+       .cmd_rcgr = 0x48014,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_cpuss_ahb_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_cpuss_ahb_clk_src",
+               .parent_data = gcc_parent_data_0_ao,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0_ao),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_cpuss_rbcpr_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_cpuss_rbcpr_clk_src = {
+       .cmd_rcgr = 0x4815c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_2,
+       .freq_tbl = ftbl_gcc_cpuss_rbcpr_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_cpuss_rbcpr_clk_src",
+               .parent_data = gcc_parent_data_2_ao,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_2_ao),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_gp1_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0),
+       F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0),
+       F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0),
+       F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_gp1_clk_src = {
+       .cmd_rcgr = 0x64004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_1,
+       .freq_tbl = ftbl_gcc_gp1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_gp1_clk_src",
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_gp2_clk_src = {
+       .cmd_rcgr = 0x65004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_1,
+       .freq_tbl = ftbl_gcc_gp1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_gp2_clk_src",
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_gp3_clk_src = {
+       .cmd_rcgr = 0x66004,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_1,
+       .freq_tbl = ftbl_gcc_gp1_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_gp3_clk_src",
+               .parent_data = gcc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_1),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_pcie_0_aux_clk_src[] = {
+       F(9600000, P_BI_TCXO, 2, 0, 0),
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_pcie_0_aux_clk_src = {
+       .cmd_rcgr = 0x6b028,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_3,
+       .freq_tbl = ftbl_gcc_pcie_0_aux_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_pcie_0_aux_clk_src",
+               .parent_data = gcc_parent_data_3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_3),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_pcie_phy_refgen_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_pcie_phy_refgen_clk_src = {
+       .cmd_rcgr = 0x6f014,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_pcie_phy_refgen_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_pcie_phy_refgen_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_pdm2_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(60000000, P_GPLL0_OUT_MAIN, 10, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_pdm2_clk_src = {
+       .cmd_rcgr = 0x33010,
+       .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_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(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_GPLL0_OUT_MAIN, 1, 16, 75),
+       { }
+};
+
+static struct clk_init_data gcc_qupv3_wrap0_s0_clk_src_init = {
+       .name = "gcc_qupv3_wrap0_s0_clk_src",
+       .parent_data = gcc_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap0_s0_clk_src = {
+       .cmd_rcgr = 0x17034,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap0_s0_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap0_s1_clk_src_init = {
+       .name = "gcc_qupv3_wrap0_s1_clk_src",
+       .parent_data = gcc_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap0_s1_clk_src = {
+       .cmd_rcgr = 0x17164,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap0_s1_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap0_s2_clk_src_init = {
+       .name = "gcc_qupv3_wrap0_s2_clk_src",
+       .parent_data = gcc_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap0_s2_clk_src = {
+       .cmd_rcgr = 0x17294,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap0_s2_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap0_s3_clk_src_init = {
+       .name = "gcc_qupv3_wrap0_s3_clk_src",
+       .parent_data = gcc_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap0_s3_clk_src = {
+       .cmd_rcgr = 0x173c4,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap0_s3_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap0_s4_clk_src_init = {
+       .name = "gcc_qupv3_wrap0_s4_clk_src",
+       .parent_data = gcc_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap0_s4_clk_src = {
+       .cmd_rcgr = 0x174f4,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap0_s4_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap0_s5_clk_src_init = {
+       .name = "gcc_qupv3_wrap0_s5_clk_src",
+       .parent_data = gcc_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap0_s5_clk_src = {
+       .cmd_rcgr = 0x17624,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap0_s5_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap0_s6_clk_src_init = {
+       .name = "gcc_qupv3_wrap0_s6_clk_src",
+       .parent_data = gcc_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .flags = CLK_SET_RATE_PARENT,
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap0_s6_clk_src = {
+       .cmd_rcgr = 0x17754,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap0_s6_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap0_s7_clk_src_init = {
+       .name = "gcc_qupv3_wrap0_s7_clk_src",
+       .parent_data = gcc_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .flags = CLK_SET_RATE_PARENT,
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap0_s7_clk_src = {
+       .cmd_rcgr = 0x17884,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap0_s7_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap1_s0_clk_src_init = {
+       .name = "gcc_qupv3_wrap1_s0_clk_src",
+       .parent_data = gcc_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap1_s0_clk_src = {
+       .cmd_rcgr = 0x18018,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap1_s0_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap1_s1_clk_src_init = {
+       .name = "gcc_qupv3_wrap1_s1_clk_src",
+       .parent_data = gcc_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap1_s1_clk_src = {
+       .cmd_rcgr = 0x18148,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap1_s1_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap1_s2_clk_src_init = {
+       .name = "gcc_qupv3_wrap1_s2_clk_src",
+       .parent_data = gcc_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap1_s2_clk_src = {
+       .cmd_rcgr = 0x18278,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap1_s2_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap1_s3_clk_src_init = {
+       .name = "gcc_qupv3_wrap1_s3_clk_src",
+       .parent_data = gcc_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap1_s3_clk_src = {
+       .cmd_rcgr = 0x183a8,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap1_s3_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap1_s4_clk_src_init = {
+       .name = "gcc_qupv3_wrap1_s4_clk_src",
+       .parent_data = gcc_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap1_s4_clk_src = {
+       .cmd_rcgr = 0x184d8,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap1_s4_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap1_s5_clk_src_init = {
+       .name = "gcc_qupv3_wrap1_s5_clk_src",
+       .parent_data = gcc_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap1_s5_clk_src = {
+       .cmd_rcgr = 0x18608,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap1_s5_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap1_s6_clk_src_init = {
+       .name = "gcc_qupv3_wrap1_s6_clk_src",
+       .parent_data = gcc_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap1_s6_clk_src = {
+       .cmd_rcgr = 0x18738,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap1_s6_clk_src_init,
+};
+
+static struct clk_init_data gcc_qupv3_wrap1_s7_clk_src_init = {
+       .name = "gcc_qupv3_wrap1_s7_clk_src",
+       .parent_data = gcc_parent_data_0,
+       .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+       .ops = &clk_rcg2_ops,
+};
+
+static struct clk_rcg2 gcc_qupv3_wrap1_s7_clk_src = {
+       .cmd_rcgr = 0x18868,
+       .mnd_width = 16,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src,
+       .clkr.hw.init = &gcc_qupv3_wrap1_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(19200000, P_BI_TCXO, 1, 0, 0),
+       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_MAIN, 2, 0, 0),
+       F(384000000, P_GPLL6_OUT_MAIN, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_sdcc1_apps_clk_src = {
+       .cmd_rcgr = 0x12028,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_5,
+       .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_5,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_5),
+               .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 = 0x12010,
+       .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_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_sdcc2_apps_clk_src[] = {
+       F(400000, P_BI_TCXO, 12, 1, 4),
+       F(9600000, P_BI_TCXO, 2, 0, 0),
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0),
+       F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0),
+       F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0),
+       F(208000000, P_GPLL7_OUT_MAIN, 4, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_sdcc2_apps_clk_src = {
+       .cmd_rcgr = 0x1400c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_6,
+       .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_6,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_6),
+               .ops = &clk_rcg2_floor_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_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_sdcc4_apps_clk_src = {
+       .cmd_rcgr = 0x1600c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_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),
+       { }
+};
+
+static struct clk_rcg2 gcc_tsif_ref_clk_src = {
+       .cmd_rcgr = 0x36010,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_7,
+       .freq_tbl = ftbl_gcc_tsif_ref_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_tsif_ref_clk_src",
+               .parent_data = gcc_parent_data_7,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_7),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_ufs_phy_axi_clk_src[] = {
+       F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0),
+       F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0),
+       F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0),
+       F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
+       F(240000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_ufs_phy_axi_clk_src = {
+       .cmd_rcgr = 0x77020,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_ufs_phy_axi_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_ufs_phy_axi_clk_src",
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_ufs_phy_ice_core_clk_src[] = {
+       F(37500000, P_GPLL0_OUT_EVEN, 8, 0, 0),
+       F(75000000, P_GPLL0_OUT_EVEN, 4, 0, 0),
+       F(150000000, P_GPLL0_OUT_MAIN, 4, 0, 0),
+       F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_ufs_phy_ice_core_clk_src = {
+       .cmd_rcgr = 0x77048,
+       .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_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_ufs_phy_phy_aux_clk_src = {
+       .cmd_rcgr = 0x77098,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_4,
+       .freq_tbl = ftbl_gcc_pcie_0_aux_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_ufs_phy_phy_aux_clk_src",
+               .parent_data = gcc_parent_data_4,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_4),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_ufs_phy_unipro_core_clk_src[] = {
+       F(37500000, P_GPLL0_OUT_EVEN, 8, 0, 0),
+       F(75000000, P_GPLL0_OUT_MAIN, 8, 0, 0),
+       F(150000000, P_GPLL0_OUT_MAIN, 4, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_ufs_phy_unipro_core_clk_src = {
+       .cmd_rcgr = 0x77060,
+       .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_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_MAIN, 3, 0, 0),
+       F(240000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_usb30_prim_master_clk_src = {
+       .cmd_rcgr = 0xf01c,
+       .mnd_width = 8,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_0,
+       .freq_tbl = ftbl_gcc_usb30_prim_master_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_usb30_prim_master_clk_src",
+               .parent_data = gcc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_usb30_prim_mock_utmi_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(20000000, P_GPLL0_OUT_EVEN, 15, 0, 0),
+       F(40000000, P_GPLL0_OUT_EVEN, 7.5, 0, 0),
+       F(60000000, P_GPLL0_OUT_MAIN, 10, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_usb30_prim_mock_utmi_clk_src = {
+       .cmd_rcgr = 0xf034,
+       .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_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_usb3_prim_phy_aux_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_usb3_prim_phy_aux_clk_src = {
+       .cmd_rcgr = 0xf060,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_3,
+       .freq_tbl = ftbl_gcc_usb3_prim_phy_aux_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_usb3_prim_phy_aux_clk_src",
+               .parent_data = gcc_parent_data_3,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_3),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_rcg2 gcc_vs_ctrl_clk_src = {
+       .cmd_rcgr = 0x7a030,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_2,
+       .freq_tbl = ftbl_gcc_usb3_prim_phy_aux_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_vs_ctrl_clk_src",
+               .parent_data = gcc_parent_data_2,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_vsensor_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0),
+       F(600000000, P_GPLL0_OUT_MAIN, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gcc_vsensor_clk_src = {
+       .cmd_rcgr = 0x7a018,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gcc_parent_map_8,
+       .freq_tbl = ftbl_gcc_vsensor_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gcc_vsensor_clk_src",
+               .parent_data = gcc_parent_data_8,
+               .num_parents = ARRAY_SIZE(gcc_parent_data_8),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_aggre_noc_pcie_tbu_clk = {
+       .halt_reg = 0x2800c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x2800c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_aggre_noc_pcie_tbu_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_aggre_ufs_phy_axi_clk = {
+       .halt_reg = 0x82024,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x82024,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x82024,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_aggre_ufs_phy_axi_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_ufs_phy_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_aggre_ufs_phy_axi_hw_ctl_clk = {
+       .halt_reg = 0x82024,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x82024,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x82024,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_aggre_ufs_phy_axi_hw_ctl_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_aggre_ufs_phy_axi_clk.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch_simple_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_aggre_usb3_prim_axi_clk = {
+       .halt_reg = 0x8201c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8201c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_aggre_usb3_prim_axi_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_usb30_prim_master_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_apc_vs_clk = {
+       .halt_reg = 0x7a050,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x7a050,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_apc_vs_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_vsensor_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_boot_rom_ahb_clk = {
+       .halt_reg = 0x38004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x38004,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x52004,
+               .enable_mask = BIT(10),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_boot_rom_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camera_hf_axi_clk = {
+       .halt_reg = 0xb020,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb020,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camera_hf_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_camera_sf_axi_clk = {
+       .halt_reg = 0xb06c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb06c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_camera_sf_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ce1_ahb_clk = {
+       .halt_reg = 0x4100c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x4100c,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x52004,
+               .enable_mask = BIT(3),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ce1_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ce1_axi_clk = {
+       .halt_reg = 0x41008,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52004,
+               .enable_mask = BIT(4),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ce1_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ce1_clk = {
+       .halt_reg = 0x41004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52004,
+               .enable_mask = BIT(5),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ce1_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_cfg_noc_usb3_prim_axi_clk = {
+       .halt_reg = 0x502c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x502c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_cfg_noc_usb3_prim_axi_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_usb30_prim_master_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_cpuss_ahb_clk = {
+       .halt_reg = 0x48000,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52004,
+               .enable_mask = BIT(21),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_cpuss_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_cpuss_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_cpuss_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_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 = 0x4452c,
+       .halt_check = BRANCH_VOTED,
+       .clkr = {
+               .enable_reg = 0x4452c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ddrss_gpu_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+
+static struct clk_branch gcc_disp_gpll0_clk_src = {
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x52004,
+               .enable_mask = BIT(18),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_disp_gpll0_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gpll0.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_aon_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_disp_gpll0_div_clk_src = {
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x52004,
+               .enable_mask = BIT(19),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_disp_gpll0_div_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_pll0_main_div_cdiv.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_disp_hf_axi_clk = {
+       .halt_reg = 0xb024,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb024,
+               .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_sf_axi_clk = {
+       .halt_reg = 0xb070,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb070,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_disp_sf_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+
+static struct clk_branch gcc_gp1_clk = {
+       .halt_reg = 0x64000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x64000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gp1_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_gp1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gp2_clk = {
+       .halt_reg = 0x65000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x65000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gp2_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_gp2_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gp3_clk = {
+       .halt_reg = 0x66000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x66000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gp3_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_gp3_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gpu_gpll0_clk_src = {
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x52004,
+               .enable_mask = BIT(15),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gpu_gpll0_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gpll0.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gpu_gpll0_div_clk_src = {
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x52004,
+               .enable_mask = BIT(16),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gpu_gpll0_div_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_pll0_main_div_cdiv.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gpu_memnoc_gfx_clk = {
+       .halt_reg = 0x7100c,
+       .halt_check = BRANCH_VOTED,
+       .clkr = {
+               .enable_reg = 0x7100c,
+               .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 = 0x71018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x71018,
+               .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_vs_clk = {
+       .halt_reg = 0x7a04c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x7a04c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gpu_vs_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_vsensor_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_npu_axi_clk = {
+       .halt_reg = 0x4d008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x4d008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_npu_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_npu_cfg_ahb_clk = {
+       .halt_reg = 0x4d004,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x4d004,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x4d004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_npu_cfg_ahb_clk",
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_npu_gpll0_clk_src = {
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x52004,
+               .enable_mask = BIT(25),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_npu_gpll0_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gpll0.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_npu_gpll0_div_clk_src = {
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x52004,
+               .enable_mask = BIT(26),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_npu_gpll0_div_clk_src",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_pll0_main_div_cdiv.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie_0_aux_clk = {
+       .halt_reg = 0x6b01c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(3),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pcie_0_aux_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_pcie_0_aux_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie_0_cfg_ahb_clk = {
+       .halt_reg = 0x6b018,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x6b018,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(2),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pcie_0_cfg_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie_0_clkref_clk = {
+       .halt_reg = 0x8c008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8c008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pcie_0_clkref_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie_0_mstr_axi_clk = {
+       .halt_reg = 0x6b014,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pcie_0_mstr_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie_0_pipe_clk = {
+       .halt_reg = 0x6b020,
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(4),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pcie_0_pipe_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie_0_slv_axi_clk = {
+       .halt_reg = 0x6b010,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x6b010,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pcie_0_slv_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie_0_slv_q2a_axi_clk = {
+       .halt_reg = 0x6b00c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(5),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pcie_0_slv_q2a_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie_phy_aux_clk = {
+       .halt_reg = 0x6f004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x6f004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pcie_phy_aux_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_pcie_0_aux_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pcie_phy_refgen_clk = {
+       .halt_reg = 0x6f02c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x6f02c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pcie_phy_refgen_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_pcie_phy_refgen_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pdm2_clk = {
+       .halt_reg = 0x3300c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3300c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pdm2_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_pdm2_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pdm_ahb_clk = {
+       .halt_reg = 0x33004,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x33004,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x33004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_pdm_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_pdm_xo4_clk = {
+       .halt_reg = 0x33008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x33008,
+               .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 = 0x34004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x34004,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x52004,
+               .enable_mask = BIT(13),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_prng_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap0_core_2x_clk = {
+       .halt_reg = 0x17014,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .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 = 0x1700c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .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 = 0x17030,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(10),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap0_s0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_qupv3_wrap0_s0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap0_s1_clk = {
+       .halt_reg = 0x17160,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(11),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap0_s1_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_qupv3_wrap0_s1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap0_s2_clk = {
+       .halt_reg = 0x17290,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(12),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap0_s2_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_qupv3_wrap0_s2_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap0_s3_clk = {
+       .halt_reg = 0x173c0,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(13),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap0_s3_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_qupv3_wrap0_s3_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap0_s4_clk = {
+       .halt_reg = 0x174f0,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(14),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap0_s4_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_qupv3_wrap0_s4_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap0_s5_clk = {
+       .halt_reg = 0x17620,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(15),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap0_s5_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_qupv3_wrap0_s5_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap0_s6_clk = {
+       .halt_reg = 0x17750,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(16),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap0_s6_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_qupv3_wrap0_s6_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap0_s7_clk = {
+       .halt_reg = 0x17880,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(17),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap0_s7_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_qupv3_wrap0_s7_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 = 0x18004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(18),
+               .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 = 0x18008,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .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 = 0x18014,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(22),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap1_s0_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_qupv3_wrap1_s0_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap1_s1_clk = {
+       .halt_reg = 0x18144,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(23),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap1_s1_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_qupv3_wrap1_s1_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap1_s2_clk = {
+       .halt_reg = 0x18274,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(24),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap1_s2_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_qupv3_wrap1_s2_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap1_s3_clk = {
+       .halt_reg = 0x183a4,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(25),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap1_s3_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_qupv3_wrap1_s3_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap1_s4_clk = {
+       .halt_reg = 0x184d4,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(26),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap1_s4_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_qupv3_wrap1_s4_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap1_s5_clk = {
+       .halt_reg = 0x18604,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(27),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap1_s5_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_qupv3_wrap1_s5_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap1_s6_clk = {
+       .halt_reg = 0x18734,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(28),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap1_s6_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_qupv3_wrap1_s6_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_qupv3_wrap1_s7_clk = {
+       .halt_reg = 0x18864,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(29),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_qupv3_wrap1_s7_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_qupv3_wrap1_s7_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 = 0x17004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .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 = 0x17008,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x17008,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .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 = 0x1800c,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(20),
+               .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 = 0x18010,
+       .halt_check = BRANCH_HALT_VOTED,
+       .hwcg_reg = 0x18010,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x5200c,
+               .enable_mask = BIT(21),
+               .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 = 0x12008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x12008,
+               .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 = 0x1200c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1200c,
+               .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 = 0x12040,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x12040,
+               .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,
+       .clkr = {
+               .enable_reg = 0x14008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_sdcc2_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sdcc2_apps_clk = {
+       .halt_reg = 0x14004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x14004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_sdcc2_apps_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_sdcc2_apps_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_sdcc4_ahb_clk = {
+       .halt_reg = 0x16008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x16008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_sdcc4_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_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_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 = 0x4144,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x52004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_sys_noc_cpuss_ahb_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_cpuss_ahb_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_tsif_ahb_clk = {
+       .halt_reg = 0x36004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x36004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_tsif_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_tsif_inactivity_timers_clk = {
+       .halt_reg = 0x3600c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x3600c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_tsif_inactivity_timers_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_tsif_ref_clk = {
+       .halt_reg = 0x36008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x36008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_tsif_ref_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_tsif_ref_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_mem_clkref_clk = {
+       .halt_reg = 0x8c000,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8c000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_mem_clkref_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_ahb_clk = {
+       .halt_reg = 0x77014,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x77014,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x77014,
+               .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 = 0x77038,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x77038,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x77038,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_axi_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_ufs_phy_axi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_axi_hw_ctl_clk = {
+       .halt_reg = 0x77038,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x77038,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x77038,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_axi_hw_ctl_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_ufs_phy_axi_clk.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch_simple_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_ice_core_clk = {
+       .halt_reg = 0x77090,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x77090,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x77090,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_ice_core_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_ufs_phy_ice_core_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_ice_core_hw_ctl_clk = {
+       .halt_reg = 0x77090,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x77090,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x77090,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_ice_core_hw_ctl_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_ufs_phy_ice_core_clk.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch_simple_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_phy_aux_clk = {
+       .halt_reg = 0x77094,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x77094,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x77094,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_phy_aux_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_ufs_phy_phy_aux_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_phy_aux_hw_ctl_clk = {
+       .halt_reg = 0x77094,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x77094,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x77094,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_phy_aux_hw_ctl_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_ufs_phy_phy_aux_clk.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch_simple_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_rx_symbol_0_clk = {
+       .halt_reg = 0x7701c,
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x7701c,
+               .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 = 0x77018,
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x77018,
+               .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 = 0x7708c,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x7708c,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x7708c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_unipro_core_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_ufs_phy_unipro_core_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ufs_phy_unipro_core_hw_ctl_clk = {
+       .halt_reg = 0x7708c,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x7708c,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x7708c,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ufs_phy_unipro_core_hw_ctl_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_ufs_phy_unipro_core_clk.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch_simple_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb30_prim_master_clk = {
+       .halt_reg = 0xf010,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xf010,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb30_prim_master_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_usb30_prim_master_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb30_prim_mock_utmi_clk = {
+       .halt_reg = 0xf018,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xf018,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb30_prim_mock_utmi_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_usb30_prim_mock_utmi_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb30_prim_sleep_clk = {
+       .halt_reg = 0xf014,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xf014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb30_prim_sleep_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb3_prim_clkref_clk = {
+       .halt_reg = 0x8c010,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x8c010,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb3_prim_clkref_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb3_prim_phy_aux_clk = {
+       .halt_reg = 0xf050,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xf050,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb3_prim_phy_aux_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_usb3_prim_phy_aux_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb3_prim_phy_com_aux_clk = {
+       .halt_reg = 0xf054,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xf054,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb3_prim_phy_com_aux_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_usb3_prim_phy_aux_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_usb3_prim_phy_pipe_clk = {
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0xf058,
+               .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_usb_phy_cfg_ahb2phy_clk = {
+       .halt_reg = 0x6a004,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x6a004,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x6a004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_usb_phy_cfg_ahb2phy_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_vdda_vs_clk = {
+       .halt_reg = 0x7a00c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x7a00c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_vdda_vs_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_vsensor_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_vddcx_vs_clk = {
+       .halt_reg = 0x7a004,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x7a004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_vddcx_vs_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_vsensor_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_vddmx_vs_clk = {
+       .halt_reg = 0x7a008,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x7a008,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_vddmx_vs_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_vsensor_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+
+static struct clk_branch gcc_video_axi_clk = {
+       .halt_reg = 0xb01c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0xb01c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_video_axi_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_vs_ctrl_ahb_clk = {
+       .halt_reg = 0x7a014,
+       .halt_check = BRANCH_HALT,
+       .hwcg_reg = 0x7a014,
+       .hwcg_bit = 1,
+       .clkr = {
+               .enable_reg = 0x7a014,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_vs_ctrl_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_vs_ctrl_clk = {
+       .halt_reg = 0x7a010,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x7a010,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_vs_ctrl_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gcc_vs_ctrl_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct gdsc pcie_0_gdsc = {
+       .gdscr = 0x6b004,
+       .pd = {
+               .name = "pcie_0_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc ufs_phy_gdsc = {
+       .gdscr = 0x77004,
+       .pd = {
+               .name = "ufs_phy_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc usb30_prim_gdsc = {
+       .gdscr = 0xf004,
+       .pd = {
+               .name = "usb30_prim_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc hlos1_vote_aggre_noc_mmu_audio_tbu_gdsc = {
+       .gdscr = 0x7d030,
+       .pd = {
+               .name = "hlos1_vote_aggre_noc_mmu_audio_tbu_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE,
+};
+
+static struct gdsc hlos1_vote_aggre_noc_mmu_pcie_tbu_gdsc = {
+       .gdscr = 0x7d03c,
+       .pd = {
+               .name = "hlos1_vote_aggre_noc_mmu_pcie_tbu_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE,
+};
+
+static struct gdsc hlos1_vote_aggre_noc_mmu_tbu1_gdsc = {
+       .gdscr = 0x7d034,
+       .pd = {
+               .name = "hlos1_vote_aggre_noc_mmu_tbu1_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE,
+};
+
+static struct gdsc hlos1_vote_aggre_noc_mmu_tbu2_gdsc = {
+       .gdscr = 0x7d038,
+       .pd = {
+               .name = "hlos1_vote_aggre_noc_mmu_tbu2_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE,
+};
+
+static struct gdsc hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc = {
+       .gdscr = 0x7d040,
+       .pd = {
+               .name = "hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE,
+};
+
+static struct gdsc hlos1_vote_mmnoc_mmu_tbu_hf1_gdsc = {
+       .gdscr = 0x7d048,
+       .pd = {
+               .name = "hlos1_vote_mmnoc_mmu_tbu_hf1_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE,
+};
+
+static struct gdsc hlos1_vote_mmnoc_mmu_tbu_sf_gdsc = {
+       .gdscr = 0x7d044,
+       .pd = {
+               .name = "hlos1_vote_mmnoc_mmu_tbu_sf_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE,
+};
+
+static struct clk_hw *gcc_sm7150_hws[] = {
+       [GCC_GPLL0_MAIN_DIV_CDIV] = &gcc_pll0_main_div_cdiv.hw,
+};
+
+static struct clk_regmap *gcc_sm7150_clocks[] = {
+       [GCC_AGGRE_NOC_PCIE_TBU_CLK] = &gcc_aggre_noc_pcie_tbu_clk.clkr,
+       [GCC_AGGRE_UFS_PHY_AXI_CLK] = &gcc_aggre_ufs_phy_axi_clk.clkr,
+       [GCC_AGGRE_UFS_PHY_AXI_HW_CTL_CLK] =
+               &gcc_aggre_ufs_phy_axi_hw_ctl_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_HF_AXI_CLK] = &gcc_camera_hf_axi_clk.clkr,
+       [GCC_CAMERA_SF_AXI_CLK] = &gcc_camera_sf_axi_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_cpuss_rbcpr_clk.clkr,
+       [GCC_CPUSS_RBCPR_CLK_SRC] = &gcc_cpuss_rbcpr_clk_src.clkr,
+       [GCC_DDRSS_GPU_AXI_CLK] = &gcc_ddrss_gpu_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_HF_AXI_CLK] = &gcc_disp_hf_axi_clk.clkr,
+       [GCC_DISP_SF_AXI_CLK] = &gcc_disp_sf_axi_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_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_VS_CLK] = &gcc_gpu_vs_clk.clkr,
+       [GCC_NPU_AXI_CLK] = &gcc_npu_axi_clk.clkr,
+       [GCC_NPU_CFG_AHB_CLK] = &gcc_npu_cfg_ahb_clk.clkr,
+       [GCC_NPU_GPLL0_CLK_SRC] = &gcc_npu_gpll0_clk_src.clkr,
+       [GCC_NPU_GPLL0_DIV_CLK_SRC] = &gcc_npu_gpll0_div_clk_src.clkr,
+       [GCC_PCIE_0_AUX_CLK] = &gcc_pcie_0_aux_clk.clkr,
+       [GCC_PCIE_0_AUX_CLK_SRC] = &gcc_pcie_0_aux_clk_src.clkr,
+       [GCC_PCIE_0_CFG_AHB_CLK] = &gcc_pcie_0_cfg_ahb_clk.clkr,
+       [GCC_PCIE_0_CLKREF_CLK] = &gcc_pcie_0_clkref_clk.clkr,
+       [GCC_PCIE_0_MSTR_AXI_CLK] = &gcc_pcie_0_mstr_axi_clk.clkr,
+       [GCC_PCIE_0_PIPE_CLK] = &gcc_pcie_0_pipe_clk.clkr,
+       [GCC_PCIE_0_SLV_AXI_CLK] = &gcc_pcie_0_slv_axi_clk.clkr,
+       [GCC_PCIE_0_SLV_Q2A_AXI_CLK] = &gcc_pcie_0_slv_q2a_axi_clk.clkr,
+       [GCC_PCIE_PHY_AUX_CLK] = &gcc_pcie_phy_aux_clk.clkr,
+       [GCC_PCIE_PHY_REFGEN_CLK] = &gcc_pcie_phy_refgen_clk.clkr,
+       [GCC_PCIE_PHY_REFGEN_CLK_SRC] = &gcc_pcie_phy_refgen_clk_src.clkr,
+       [GCC_PDM2_CLK] = &gcc_pdm2_clk.clkr,
+       [GCC_PDM2_CLK_SRC] = &gcc_pdm2_clk_src.clkr,
+       [GCC_PDM_AHB_CLK] = &gcc_pdm_ahb_clk.clkr,
+       [GCC_PDM_XO4_CLK] = &gcc_pdm_xo4_clk.clkr,
+       [GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr,
+       [GCC_QUPV3_WRAP0_CORE_2X_CLK] = &gcc_qupv3_wrap0_core_2x_clk.clkr,
+       [GCC_QUPV3_WRAP0_CORE_CLK] = &gcc_qupv3_wrap0_core_clk.clkr,
+       [GCC_QUPV3_WRAP0_S0_CLK] = &gcc_qupv3_wrap0_s0_clk.clkr,
+       [GCC_QUPV3_WRAP0_S0_CLK_SRC] = &gcc_qupv3_wrap0_s0_clk_src.clkr,
+       [GCC_QUPV3_WRAP0_S1_CLK] = &gcc_qupv3_wrap0_s1_clk.clkr,
+       [GCC_QUPV3_WRAP0_S1_CLK_SRC] = &gcc_qupv3_wrap0_s1_clk_src.clkr,
+       [GCC_QUPV3_WRAP0_S2_CLK] = &gcc_qupv3_wrap0_s2_clk.clkr,
+       [GCC_QUPV3_WRAP0_S2_CLK_SRC] = &gcc_qupv3_wrap0_s2_clk_src.clkr,
+       [GCC_QUPV3_WRAP0_S3_CLK] = &gcc_qupv3_wrap0_s3_clk.clkr,
+       [GCC_QUPV3_WRAP0_S3_CLK_SRC] = &gcc_qupv3_wrap0_s3_clk_src.clkr,
+       [GCC_QUPV3_WRAP0_S4_CLK] = &gcc_qupv3_wrap0_s4_clk.clkr,
+       [GCC_QUPV3_WRAP0_S4_CLK_SRC] = &gcc_qupv3_wrap0_s4_clk_src.clkr,
+       [GCC_QUPV3_WRAP0_S5_CLK] = &gcc_qupv3_wrap0_s5_clk.clkr,
+       [GCC_QUPV3_WRAP0_S5_CLK_SRC] = &gcc_qupv3_wrap0_s5_clk_src.clkr,
+       [GCC_QUPV3_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_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_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] = &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_SDCC4_AHB_CLK] = &gcc_sdcc4_ahb_clk.clkr,
+       [GCC_SDCC4_APPS_CLK] = &gcc_sdcc4_apps_clk.clkr,
+       [GCC_SDCC4_APPS_CLK_SRC] = &gcc_sdcc4_apps_clk_src.clkr,
+       [GCC_SYS_NOC_CPUSS_AHB_CLK] = &gcc_sys_noc_cpuss_ahb_clk.clkr,
+       [GCC_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_AXI_HW_CTL_CLK] = &gcc_ufs_phy_axi_hw_ctl_clk.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_ICE_CORE_HW_CTL_CLK] =
+               &gcc_ufs_phy_ice_core_hw_ctl_clk.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_PHY_AUX_HW_CTL_CLK] = &gcc_ufs_phy_phy_aux_hw_ctl_clk.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_UFS_PHY_UNIPRO_CORE_HW_CTL_CLK] =
+               &gcc_ufs_phy_unipro_core_hw_ctl_clk.clkr,
+       [GCC_USB30_PRIM_MASTER_CLK] = &gcc_usb30_prim_master_clk.clkr,
+       [GCC_USB30_PRIM_MASTER_CLK_SRC] = &gcc_usb30_prim_master_clk_src.clkr,
+       [GCC_USB30_PRIM_MOCK_UTMI_CLK] = &gcc_usb30_prim_mock_utmi_clk.clkr,
+       [GCC_USB30_PRIM_MOCK_UTMI_CLK_SRC] =
+               &gcc_usb30_prim_mock_utmi_clk_src.clkr,
+       [GCC_USB30_PRIM_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_AXI_CLK] = &gcc_video_axi_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,
+       [GPLL6] = &gpll6.clkr,
+       [GPLL7] = &gpll7.clkr,
+};
+
+static const struct qcom_reset_map gcc_sm7150_resets[] = {
+       [GCC_PCIE_0_BCR] = { 0x6b000 },
+       [GCC_PCIE_PHY_BCR] = { 0x6f000 },
+       [GCC_PCIE_PHY_COM_BCR] = { 0x6f010 },
+       [GCC_UFS_PHY_BCR] = { 0x77000 },
+       [GCC_USB30_PRIM_BCR] = { 0xf000 },
+       [GCC_USB3_DP_PHY_PRIM_BCR] = { 0x50008 },
+       [GCC_USB3_DP_PHY_SEC_BCR] = { 0x50014 },
+       [GCC_USB3_PHY_PRIM_BCR] = { 0x50000 },
+       [GCC_USB3_PHY_SEC_BCR] = { 0x5000c },
+       [GCC_QUSB2PHY_PRIM_BCR] = { 0x26000 },
+       [GCC_VIDEO_AXI_CLK_BCR] = { 0xb01c, 2 },
+};
+
+static const struct clk_rcg_dfs_data gcc_sm7150_dfs_desc[] = {
+       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_wrap0_s6_clk_src),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap0_s7_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),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap1_s6_clk_src),
+       DEFINE_RCG_DFS(gcc_qupv3_wrap1_s7_clk_src),
+};
+
+static struct gdsc *gcc_sm7150_gdscs[] = {
+       [PCIE_0_GDSC] = &pcie_0_gdsc,
+       [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_PCIE_TBU_GDSC] =
+                       &hlos1_vote_aggre_noc_mmu_pcie_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 const struct regmap_config gcc_sm7150_regmap_config = {
+       .reg_bits       = 32,
+       .reg_stride     = 4,
+       .val_bits       = 32,
+       .max_register   = 0x1820b0,
+       .fast_io        = true,
+};
+
+static const struct qcom_cc_desc gcc_sm7150_desc = {
+       .config = &gcc_sm7150_regmap_config,
+       .clk_hws = gcc_sm7150_hws,
+       .num_clk_hws = ARRAY_SIZE(gcc_sm7150_hws),
+       .clks = gcc_sm7150_clocks,
+       .num_clks = ARRAY_SIZE(gcc_sm7150_clocks),
+       .resets = gcc_sm7150_resets,
+       .num_resets = ARRAY_SIZE(gcc_sm7150_resets),
+       .gdscs = gcc_sm7150_gdscs,
+       .num_gdscs = ARRAY_SIZE(gcc_sm7150_gdscs),
+};
+
+static const struct of_device_id gcc_sm7150_match_table[] = {
+       { .compatible = "qcom,sm7150-gcc" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, gcc_sm7150_match_table);
+
+static int gcc_sm7150_probe(struct platform_device *pdev)
+{
+       struct regmap *regmap;
+       int ret;
+
+       regmap = qcom_cc_map(pdev, &gcc_sm7150_desc);
+       if (IS_ERR(regmap))
+               return PTR_ERR(regmap);
+
+       /*
+        * Disable the GPLL0 active input to MM blocks, NPU
+        * and GPU via MISC registers.
+        */
+       regmap_update_bits(regmap, 0x09ffc, 0x3, 0x3);
+       regmap_update_bits(regmap, 0x4d110, 0x3, 0x3);
+       regmap_update_bits(regmap, 0x71028, 0x3, 0x3);
+
+       /*
+        * Keep the critical clocks always-ON
+        * GCC_CPUSS_GNOC_CLK, GCC_VIDEO_AHB_CLK, GCC_CAMERA_AHB_CLK,
+        * GCC_DISP_AHB_CLK, GCC_CAMERA_XO_CLK, GCC_VIDEO_XO_CLK,
+        * GCC_DISP_XO_CLK, GCC_GPU_CFG_AHB_CLK
+        */
+       regmap_update_bits(regmap, 0x48004, BIT(0), BIT(0));
+       regmap_update_bits(regmap, 0x0b004, BIT(0), BIT(0));
+       regmap_update_bits(regmap, 0x0b008, BIT(0), BIT(0));
+       regmap_update_bits(regmap, 0x0b00c, BIT(0), BIT(0));
+       regmap_update_bits(regmap, 0x0b02c, BIT(0), BIT(0));
+       regmap_update_bits(regmap, 0x0b028, BIT(0), BIT(0));
+       regmap_update_bits(regmap, 0x0b030, BIT(0), BIT(0));
+       regmap_update_bits(regmap, 0x71004, BIT(0), BIT(0));
+
+       ret = qcom_cc_register_rcg_dfs(regmap, gcc_sm7150_dfs_desc,
+                                       ARRAY_SIZE(gcc_sm7150_dfs_desc));
+       if (ret)
+               return ret;
+
+       return qcom_cc_really_probe(pdev, &gcc_sm7150_desc, regmap);
+}
+
+static struct platform_driver gcc_sm7150_driver = {
+       .probe = gcc_sm7150_probe,
+       .driver = {
+               .name = "gcc-sm7150",
+               .of_match_table = gcc_sm7150_match_table,
+       },
+};
+
+static int __init gcc_sm7150_init(void)
+{
+       return platform_driver_register(&gcc_sm7150_driver);
+}
+subsys_initcall(gcc_sm7150_init);
+
+static void __exit gcc_sm7150_exit(void)
+{
+       platform_driver_unregister(&gcc_sm7150_driver);
+}
+module_exit(gcc_sm7150_exit);
+
+MODULE_DESCRIPTION("Qualcomm SM7150 Global Clock Controller");
+MODULE_LICENSE("GPL");
index af4a1ea28421521a652e9412d8180662bda0b80a..1385a98eb3bbebf08743a3eab92f2a762d35814b 100644 (file)
@@ -17,6 +17,7 @@
 #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"
 
@@ -158,26 +159,6 @@ static const struct clk_parent_data gcc_parent_data_3[] = {
        { .fw_name = "bi_tcxo" },
 };
 
-static const struct parent_map gcc_parent_map_4[] = {
-       { P_PCIE_0_PIPE_CLK, 0 },
-       { P_BI_TCXO, 2 },
-};
-
-static const struct clk_parent_data gcc_parent_data_4[] = {
-       { .fw_name = "pcie_0_pipe_clk", },
-       { .fw_name = "bi_tcxo" },
-};
-
-static const struct parent_map gcc_parent_map_5[] = {
-       { P_PCIE_1_PIPE_CLK, 0 },
-       { P_BI_TCXO, 2 },
-};
-
-static const struct clk_parent_data gcc_parent_data_5[] = {
-       { .fw_name = "pcie_1_pipe_clk" },
-       { .fw_name = "bi_tcxo" },
-};
-
 static const struct parent_map gcc_parent_map_6[] = {
        { P_BI_TCXO, 0 },
        { P_GCC_GPLL0_OUT_MAIN, 1 },
@@ -274,32 +255,30 @@ static const struct clk_parent_data gcc_parent_data_14[] = {
        { .fw_name = "bi_tcxo" },
 };
 
-static struct clk_regmap_mux gcc_pcie_0_pipe_clk_src = {
+static struct clk_regmap_phy_mux gcc_pcie_0_pipe_clk_src = {
        .reg = 0x6b054,
-       .shift = 0,
-       .width = 2,
-       .parent_map = gcc_parent_map_4,
        .clkr = {
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_pcie_0_pipe_clk_src",
-                       .parent_data = gcc_parent_data_4,
-                       .num_parents = ARRAY_SIZE(gcc_parent_data_4),
-                       .ops = &clk_regmap_mux_closest_ops,
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "pcie_0_pipe_clk",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_regmap_phy_mux_ops,
                },
        },
 };
 
-static struct clk_regmap_mux gcc_pcie_1_pipe_clk_src = {
+static struct clk_regmap_phy_mux gcc_pcie_1_pipe_clk_src = {
        .reg = 0x8d054,
-       .shift = 0,
-       .width = 2,
-       .parent_map = gcc_parent_map_5,
        .clkr = {
                .hw.init = &(struct clk_init_data){
                        .name = "gcc_pcie_1_pipe_clk_src",
-                       .parent_data = gcc_parent_data_5,
-                       .num_parents = ARRAY_SIZE(gcc_parent_data_5),
-                       .ops = &clk_regmap_mux_closest_ops,
+                       .parent_data = &(const struct clk_parent_data){
+                               .fw_name = "pcie_1_pipe_clk",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_regmap_phy_mux_ops,
                },
        },
 };
diff --git a/drivers/clk/qcom/gpucc-sa8775p.c b/drivers/clk/qcom/gpucc-sa8775p.c
new file mode 100644 (file)
index 0000000..18d23be
--- /dev/null
@@ -0,0 +1,625 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2021-2022, Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2023, Linaro Limited
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/err.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/of.h>
+#include <linux/regmap.h>
+
+#include <dt-bindings/clock/qcom,sa8775p-gpucc.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 "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_GPLL0_OUT_MAIN,
+       P_GPLL0_OUT_MAIN_DIV,
+       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_evo_vco[] = {
+       { 249600000, 2020000000, 0 },
+};
+
+/* 810MHz configuration */
+static struct alpha_pll_config gpu_cc_pll0_config = {
+       .l = 0x2a,
+       .alpha = 0x3000,
+       .config_ctl_val = 0x20485699,
+       .config_ctl_hi_val = 0x00182261,
+       .config_ctl_hi1_val = 0x32aa299c,
+       .user_ctl_val = 0x00000001,
+       .user_ctl_hi_val = 0x00400805,
+};
+
+static struct clk_alpha_pll gpu_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 = &(const struct clk_init_data){
+                       .name = "gpu_cc_pll0",
+                       .parent_data = &parent_data_tcxo,
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_lucid_evo_ops,
+               },
+       },
+};
+
+/* 1000MHz configuration */
+static struct alpha_pll_config gpu_cc_pll1_config = {
+       .l = 0x34,
+       .alpha = 0x1555,
+       .config_ctl_val = 0x20485699,
+       .config_ctl_hi_val = 0x00182261,
+       .config_ctl_hi1_val = 0x32aa299c,
+       .user_ctl_val = 0x00000001,
+       .user_ctl_hi_val = 0x00400805,
+};
+
+static struct clk_alpha_pll gpu_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 = &(const struct clk_init_data){
+                       .name = "gpu_cc_pll1",
+                       .parent_data = &parent_data_tcxo,
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_lucid_evo_ops,
+               },
+       },
+};
+
+static const struct parent_map gpu_cc_parent_map_0[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_MAIN, 5 },
+       { P_GPLL0_OUT_MAIN_DIV, 6 },
+};
+
+static const struct clk_parent_data gpu_cc_parent_data_0[] = {
+       { .index = DT_BI_TCXO },
+       { .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_PLL0_OUT_MAIN, 1 },
+       { P_GPU_CC_PLL1_OUT_MAIN, 3 },
+       { P_GPLL0_OUT_MAIN, 5 },
+       { P_GPLL0_OUT_MAIN_DIV, 6 },
+};
+
+static const struct clk_parent_data gpu_cc_parent_data_1[] = {
+       { .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_2[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPU_CC_PLL1_OUT_MAIN, 3 },
+       { P_GPLL0_OUT_MAIN, 5 },
+       { P_GPLL0_OUT_MAIN_DIV, 6 },
+};
+
+static const struct clk_parent_data gpu_cc_parent_data_2[] = {
+       { .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 parent_map gpu_cc_parent_map_3[] = {
+       { P_BI_TCXO, 0 },
+};
+
+static const struct clk_parent_data gpu_cc_parent_data_3[] = {
+       { .index = DT_BI_TCXO },
+};
+
+static const struct freq_tbl ftbl_gpu_cc_ff_clk_src[] = {
+       F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gpu_cc_ff_clk_src = {
+       .cmd_rcgr = 0x9474,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gpu_cc_parent_map_0,
+       .freq_tbl = ftbl_gpu_cc_ff_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data){
+               .name = "gpu_cc_ff_clk_src",
+               .parent_data = gpu_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gpu_cc_parent_data_0),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = {
+       F(500000000, P_GPU_CC_PLL1_OUT_MAIN, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gpu_cc_gmu_clk_src = {
+       .cmd_rcgr = 0x9318,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gpu_cc_parent_map_1,
+       .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_1,
+               .num_parents = ARRAY_SIZE(gpu_cc_parent_data_1),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gpu_cc_hub_clk_src[] = {
+       F(240000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gpu_cc_hub_clk_src = {
+       .cmd_rcgr = 0x93ec,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gpu_cc_parent_map_2,
+       .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_2,
+               .num_parents = ARRAY_SIZE(gpu_cc_parent_data_2),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gpu_cc_xo_clk_src[] = {
+       F(19200000, P_BI_TCXO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gpu_cc_xo_clk_src = {
+       .cmd_rcgr = 0x9010,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gpu_cc_parent_map_3,
+       .freq_tbl = ftbl_gpu_cc_xo_clk_src,
+       .clkr.hw.init = &(const struct clk_init_data){
+               .name = "gpu_cc_xo_clk_src",
+               .parent_data = gpu_cc_parent_data_3,
+               .num_parents = ARRAY_SIZE(gpu_cc_parent_data_3),
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_regmap_div gpu_cc_demet_div_clk_src = {
+       .reg = 0x9054,
+       .shift = 0,
+       .width = 4,
+       .clkr.hw.init = &(const struct clk_init_data) {
+               .name = "gpu_cc_demet_div_clk_src",
+               .parent_hws = (const struct clk_hw*[]){
+                       &gpu_cc_xo_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_ahb_div_clk_src = {
+       .reg = 0x9430,
+       .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 = 0x942c,
+       .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 = 0x911c,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x911c,
+               .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 | CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_cb_clk = {
+       .halt_reg = 0x93a4,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x93a4,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data){
+                       .name = "gpu_cc_cb_clk",
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_crc_ahb_clk = {
+       .halt_reg = 0x9120,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x9120,
+               .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 | CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_cx_ff_clk = {
+       .halt_reg = 0x914c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x914c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data){
+                       .name = "gpu_cc_cx_ff_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gpu_cc_ff_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_cx_gmu_clk = {
+       .halt_reg = 0x913c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x913c,
+               .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 | CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_aon_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_cx_snoc_dvm_clk = {
+       .halt_reg = 0x9130,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x9130,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data){
+                       .name = "gpu_cc_cx_snoc_dvm_clk",
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_cxo_aon_clk = {
+       .halt_reg = 0x9004,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x9004,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data){
+                       .name = "gpu_cc_cxo_aon_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gpu_cc_xo_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_cxo_clk = {
+       .halt_reg = 0x9144,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x9144,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data){
+                       .name = "gpu_cc_cxo_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gpu_cc_xo_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags =  CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_demet_clk = {
+       .halt_reg = 0x900c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x900c,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data){
+                       .name = "gpu_cc_demet_clk",
+                       .parent_hws = (const struct clk_hw*[]){
+                               &gpu_cc_demet_div_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_aon_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_hlos1_vote_gpu_smmu_clk = {
+       .halt_reg = 0x7000,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x7000,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data){
+                       .name = "gpu_cc_hlos1_vote_gpu_smmu_clk",
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_hub_aon_clk = {
+       .halt_reg = 0x93e8,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x93e8,
+               .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 | CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_aon_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_hub_cx_int_clk = {
+       .halt_reg = 0x9148,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x9148,
+               .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 | CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_aon_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_memnoc_gfx_clk = {
+       .halt_reg = 0x9150,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x9150,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data){
+                       .name = "gpu_cc_memnoc_gfx_clk",
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_sleep_clk = {
+       .halt_reg = 0x9134,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x9134,
+               .enable_mask = BIT(0),
+               .hw.init = &(const struct clk_init_data){
+                       .name = "gpu_cc_sleep_clk",
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_regmap *gpu_cc_sa8775p_clocks[] = {
+       [GPU_CC_AHB_CLK] = &gpu_cc_ahb_clk.clkr,
+       [GPU_CC_CB_CLK] = &gpu_cc_cb_clk.clkr,
+       [GPU_CC_CRC_AHB_CLK] = &gpu_cc_crc_ahb_clk.clkr,
+       [GPU_CC_CX_FF_CLK] = &gpu_cc_cx_ff_clk.clkr,
+       [GPU_CC_CX_GMU_CLK] = &gpu_cc_cx_gmu_clk.clkr,
+       [GPU_CC_CX_SNOC_DVM_CLK] = &gpu_cc_cx_snoc_dvm_clk.clkr,
+       [GPU_CC_CXO_AON_CLK] = &gpu_cc_cxo_aon_clk.clkr,
+       [GPU_CC_CXO_CLK] = &gpu_cc_cxo_clk.clkr,
+       [GPU_CC_DEMET_CLK] = &gpu_cc_demet_clk.clkr,
+       [GPU_CC_DEMET_DIV_CLK_SRC] = &gpu_cc_demet_div_clk_src.clkr,
+       [GPU_CC_FF_CLK_SRC] = &gpu_cc_ff_clk_src.clkr,
+       [GPU_CC_GMU_CLK_SRC] = &gpu_cc_gmu_clk_src.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_MEMNOC_GFX_CLK] = &gpu_cc_memnoc_gfx_clk.clkr,
+       [GPU_CC_PLL0] = &gpu_cc_pll0.clkr,
+       [GPU_CC_PLL1] = &gpu_cc_pll1.clkr,
+       [GPU_CC_SLEEP_CLK] = &gpu_cc_sleep_clk.clkr,
+       [GPU_CC_XO_CLK_SRC] = &gpu_cc_xo_clk_src.clkr,
+};
+
+static struct gdsc cx_gdsc = {
+       .gdscr = 0x9108,
+       .gds_hw_ctrl = 0x953c,
+       .pd = {
+               .name = "cx_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE | RETAIN_FF_ENABLE | ALWAYS_ON,
+};
+
+static struct gdsc gx_gdsc = {
+       .gdscr = 0x905c,
+       .pd = {
+               .name = "gx_gdsc",
+               .power_on = gdsc_gx_do_nothing_enable,
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = AON_RESET | RETAIN_FF_ENABLE,
+};
+
+static struct gdsc *gpu_cc_sa8775p_gdscs[] = {
+       [GPU_CC_CX_GDSC] = &cx_gdsc,
+       [GPU_CC_GX_GDSC] = &gx_gdsc,
+};
+
+static const struct qcom_reset_map gpu_cc_sa8775p_resets[] = {
+       [GPUCC_GPU_CC_ACD_BCR] = { 0x9358 },
+       [GPUCC_GPU_CC_CB_BCR] = { 0x93a0 },
+       [GPUCC_GPU_CC_CX_BCR] = { 0x9104 },
+       [GPUCC_GPU_CC_FAST_HUB_BCR] = { 0x93e4 },
+       [GPUCC_GPU_CC_FF_BCR] = { 0x9470 },
+       [GPUCC_GPU_CC_GFX3D_AON_BCR] = { 0x9198 },
+       [GPUCC_GPU_CC_GMU_BCR] = { 0x9314 },
+       [GPUCC_GPU_CC_GX_BCR] = { 0x9058 },
+       [GPUCC_GPU_CC_XO_BCR] = { 0x9000 },
+};
+
+static const struct regmap_config gpu_cc_sa8775p_regmap_config = {
+       .reg_bits = 32,
+       .reg_stride = 4,
+       .val_bits = 32,
+       .max_register = 0x9988,
+       .fast_io = true,
+};
+
+static const struct qcom_cc_desc gpu_cc_sa8775p_desc = {
+       .config = &gpu_cc_sa8775p_regmap_config,
+       .clks = gpu_cc_sa8775p_clocks,
+       .num_clks = ARRAY_SIZE(gpu_cc_sa8775p_clocks),
+       .resets = gpu_cc_sa8775p_resets,
+       .num_resets = ARRAY_SIZE(gpu_cc_sa8775p_resets),
+       .gdscs = gpu_cc_sa8775p_gdscs,
+       .num_gdscs = ARRAY_SIZE(gpu_cc_sa8775p_gdscs),
+};
+
+static const struct of_device_id gpu_cc_sa8775p_match_table[] = {
+       { .compatible = "qcom,sa8775p-gpucc" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, gpu_cc_sa8775p_match_table);
+
+static int gpu_cc_sa8775p_probe(struct platform_device *pdev)
+{
+       struct regmap *regmap;
+
+       regmap = qcom_cc_map(pdev, &gpu_cc_sa8775p_desc);
+       if (IS_ERR(regmap))
+               return PTR_ERR(regmap);
+
+       clk_lucid_evo_pll_configure(&gpu_cc_pll0, regmap, &gpu_cc_pll0_config);
+       clk_lucid_evo_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config);
+
+       return qcom_cc_really_probe(pdev, &gpu_cc_sa8775p_desc, regmap);
+}
+
+static struct platform_driver gpu_cc_sa8775p_driver = {
+       .probe = gpu_cc_sa8775p_probe,
+       .driver = {
+               .name = "gpu_cc-sa8775p",
+               .of_match_table = gpu_cc_sa8775p_match_table,
+       },
+};
+
+static int __init gpu_cc_sa8775p_init(void)
+{
+       return platform_driver_register(&gpu_cc_sa8775p_driver);
+}
+subsys_initcall(gpu_cc_sa8775p_init);
+
+static void __exit gpu_cc_sa8775p_exit(void)
+{
+       platform_driver_unregister(&gpu_cc_sa8775p_driver);
+}
+module_exit(gpu_cc_sa8775p_exit);
+
+MODULE_DESCRIPTION("SA8775P GPUCC driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/clk/qcom/gpucc-sm6115.c b/drivers/clk/qcom/gpucc-sm6115.c
new file mode 100644 (file)
index 0000000..c84727e
--- /dev/null
@@ -0,0 +1,503 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023, Linaro Limited
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/regmap.h>
+
+#include <dt-bindings/clock/qcom,sm6115-gpucc.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_GCC_GPU_GPLL0_CLK_SRC,
+       DT_GCC_GPU_GPLL0_DIV_CLK_SRC,
+};
+
+enum {
+       P_BI_TCXO,
+       P_GPLL0_OUT_MAIN,
+       P_GPLL0_OUT_MAIN_DIV,
+       P_GPU_CC_PLL0_OUT_AUX2,
+       P_GPU_CC_PLL0_OUT_MAIN,
+       P_GPU_CC_PLL1_OUT_AUX,
+       P_GPU_CC_PLL1_OUT_MAIN,
+};
+
+static struct pll_vco default_vco[] = {
+       { 1000000000, 2000000000, 0 },
+};
+
+static struct pll_vco pll1_vco[] = {
+       { 500000000, 1000000000, 2 },
+};
+
+static const struct alpha_pll_config gpu_cc_pll0_config = {
+       .l = 0x3e,
+       .alpha = 0,
+       .alpha_hi = 0x80,
+       .vco_val = 0x0 << 20,
+       .vco_mask = GENMASK(21, 20),
+       .alpha_en_mask = BIT(24),
+       .main_output_mask = BIT(0),
+       .aux_output_mask = BIT(1),
+       .aux2_output_mask = BIT(2),
+       .config_ctl_val = 0x4001055b,
+       .test_ctl_hi1_val = 0x1,
+};
+
+/* 1200MHz configuration */
+static struct clk_alpha_pll gpu_cc_pll0 = {
+       .offset = 0x0,
+       .vco_table = default_vco,
+       .num_vco = ARRAY_SIZE(default_vco),
+       .flags = SUPPORTS_DYNAMIC_UPDATE,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_pll0",
+                       .parent_data = &(const struct clk_parent_data){
+                               .index = DT_BI_TCXO,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static const struct clk_div_table post_div_table_gpu_cc_pll0_out_aux2[] = {
+       { 0x0, 1 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv gpu_cc_pll0_out_aux2 = {
+       .offset = 0x0,
+       .post_div_shift = 8,
+       .post_div_table = post_div_table_gpu_cc_pll0_out_aux2,
+       .num_post_div = ARRAY_SIZE(post_div_table_gpu_cc_pll0_out_aux2),
+       .width = 4,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpu_cc_pll0_out_aux2",
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gpu_cc_pll0.clkr.hw,
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_alpha_pll_postdiv_ops,
+       },
+};
+
+/* 640MHz configuration */
+static const struct alpha_pll_config gpu_cc_pll1_config = {
+       .l = 0x21,
+       .alpha = 0x55555555,
+       .alpha_hi = 0x55,
+       .alpha_en_mask = BIT(24),
+       .vco_val = 0x2 << 20,
+       .vco_mask = GENMASK(21, 20),
+       .main_output_mask = BIT(0),
+       .aux_output_mask = BIT(1),
+       .config_ctl_val = 0x4001055b,
+       .test_ctl_hi1_val = 0x1,
+};
+
+static struct clk_alpha_pll gpu_cc_pll1 = {
+       .offset = 0x100,
+       .vco_table = pll1_vco,
+       .num_vco = ARRAY_SIZE(pll1_vco),
+       .flags = SUPPORTS_DYNAMIC_UPDATE,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_pll1",
+                       .parent_data = &(const struct clk_parent_data){
+                               .index = DT_BI_TCXO,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static const struct clk_div_table post_div_table_gpu_cc_pll1_out_aux[] = {
+       { 0x0, 1 },
+       { }
+};
+
+static struct clk_alpha_pll_postdiv gpu_cc_pll1_out_aux = {
+       .offset = 0x100,
+       .post_div_shift = 15,
+       .post_div_table = post_div_table_gpu_cc_pll1_out_aux,
+       .num_post_div = ARRAY_SIZE(post_div_table_gpu_cc_pll1_out_aux),
+       .width = 3,
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpu_cc_pll1_out_aux",
+               .parent_hws = (const struct clk_hw*[]) {
+                       &gpu_cc_pll1.clkr.hw,
+               },
+               .num_parents = 1,
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_alpha_pll_postdiv_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_GPLL0_OUT_MAIN, 5 },
+       { P_GPLL0_OUT_MAIN_DIV, 6 },
+};
+
+static const struct clk_parent_data gpu_cc_parent_data_0[] = {
+       { .index = P_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_PLL0_OUT_AUX2, 2 },
+       { P_GPU_CC_PLL1_OUT_AUX, 3 },
+       { P_GPLL0_OUT_MAIN, 5 },
+};
+
+static const struct clk_parent_data gpu_cc_parent_data_1[] = {
+       { .index = P_BI_TCXO },
+       { .hw = &gpu_cc_pll0_out_aux2.clkr.hw },
+       { .hw = &gpu_cc_pll1_out_aux.clkr.hw },
+       { .index = DT_GCC_GPU_GPLL0_CLK_SRC },
+};
+
+static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = {
+       F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gpu_cc_gmu_clk_src = {
+       .cmd_rcgr = 0x1120,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gpu_cc_parent_map_0,
+       .freq_tbl = ftbl_gpu_cc_gmu_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpu_cc_gmu_clk_src",
+               .parent_data = gpu_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gpu_cc_parent_data_0),
+               .flags = CLK_SET_RATE_PARENT,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gpu_cc_gx_gfx3d_clk_src[] = {
+       F(320000000, P_GPU_CC_PLL1_OUT_AUX, 2, 0, 0),
+       F(465000000, P_GPU_CC_PLL1_OUT_AUX, 2, 0, 0),
+       F(600000000, P_GPU_CC_PLL0_OUT_AUX2, 2, 0, 0),
+       F(745000000, P_GPU_CC_PLL0_OUT_AUX2, 2, 0, 0),
+       F(820000000, P_GPU_CC_PLL0_OUT_AUX2, 2, 0, 0),
+       F(900000000, P_GPU_CC_PLL0_OUT_AUX2, 2, 0, 0),
+       F(950000000, P_GPU_CC_PLL0_OUT_AUX2, 2, 0, 0),
+       F(980000000, P_GPU_CC_PLL0_OUT_AUX2, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gpu_cc_gx_gfx3d_clk_src = {
+       .cmd_rcgr = 0x101c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gpu_cc_parent_map_1,
+       .freq_tbl = ftbl_gpu_cc_gx_gfx3d_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpu_cc_gx_gfx3d_clk_src",
+               .parent_data = gpu_cc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gpu_cc_parent_data_1),
+               .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gpu_cc_ahb_clk = {
+       .halt_reg = 0x1078,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x1078,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_ahb_clk",
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_crc_ahb_clk = {
+       .halt_reg = 0x107c,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x107c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_crc_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_cx_gfx3d_clk = {
+       .halt_reg = 0x10a4,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x10a4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_cx_gfx3d_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &gpu_cc_gx_gfx3d_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_cx_gmu_clk = {
+       .halt_reg = 0x1098,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1098,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_cx_gmu_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .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_cx_snoc_dvm_clk = {
+       .halt_reg = 0x108c,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x108c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_cx_snoc_dvm_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_cxo_aon_clk = {
+       .halt_reg = 0x1004,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x1004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_cxo_aon_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_cxo_clk = {
+       .halt_reg = 0x109c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x109c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_cxo_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_gx_cxo_clk = {
+       .halt_reg = 0x1060,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x1060,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_gx_cxo_clk",
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_gx_gfx3d_clk = {
+       .halt_reg = 0x1054,
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x1054,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_gx_gfx3d_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .hw = &gpu_cc_gx_gfx3d_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_sleep_clk = {
+       .halt_reg = 0x1090,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x1090,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_sleep_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_hlos1_vote_gpu_smmu_clk = {
+       .halt_reg = 0x5000,
+       .halt_check = BRANCH_VOTED,
+       .clkr = {
+               .enable_reg = 0x5000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                        .name = "gpu_cc_hlos1_vote_gpu_smmu_clk",
+                        .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct gdsc gpu_cx_gdsc = {
+       .gdscr = 0x106c,
+       .gds_hw_ctrl = 0x1540,
+       .pd = {
+               .name = "gpu_cx_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE,
+};
+
+static struct gdsc gpu_gx_gdsc = {
+       .gdscr = 0x100c,
+       .clamp_io_ctrl = 0x1508,
+       .resets = (unsigned int []){ GPU_GX_BCR },
+       .reset_count = 1,
+       .pd = {
+               .name = "gpu_gx_gdsc",
+       },
+       .parent = &gpu_cx_gdsc.pd,
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = CLAMP_IO | SW_RESET | VOTABLE,
+};
+
+static struct clk_regmap *gpu_cc_sm6115_clocks[] = {
+       [GPU_CC_AHB_CLK] = &gpu_cc_ahb_clk.clkr,
+       [GPU_CC_CRC_AHB_CLK] = &gpu_cc_crc_ahb_clk.clkr,
+       [GPU_CC_CX_GFX3D_CLK] = &gpu_cc_cx_gfx3d_clk.clkr,
+       [GPU_CC_CX_GMU_CLK] = &gpu_cc_cx_gmu_clk.clkr,
+       [GPU_CC_CX_SNOC_DVM_CLK] = &gpu_cc_cx_snoc_dvm_clk.clkr,
+       [GPU_CC_CXO_AON_CLK] = &gpu_cc_cxo_aon_clk.clkr,
+       [GPU_CC_CXO_CLK] = &gpu_cc_cxo_clk.clkr,
+       [GPU_CC_GMU_CLK_SRC] = &gpu_cc_gmu_clk_src.clkr,
+       [GPU_CC_GX_CXO_CLK] = &gpu_cc_gx_cxo_clk.clkr,
+       [GPU_CC_GX_GFX3D_CLK] = &gpu_cc_gx_gfx3d_clk.clkr,
+       [GPU_CC_GX_GFX3D_CLK_SRC] = &gpu_cc_gx_gfx3d_clk_src.clkr,
+       [GPU_CC_PLL0] = &gpu_cc_pll0.clkr,
+       [GPU_CC_PLL0_OUT_AUX2] = &gpu_cc_pll0_out_aux2.clkr,
+       [GPU_CC_PLL1] = &gpu_cc_pll1.clkr,
+       [GPU_CC_PLL1_OUT_AUX] = &gpu_cc_pll1_out_aux.clkr,
+       [GPU_CC_SLEEP_CLK] = &gpu_cc_sleep_clk.clkr,
+       [GPU_CC_HLOS1_VOTE_GPU_SMMU_CLK] = &gpu_cc_hlos1_vote_gpu_smmu_clk.clkr,
+};
+
+static const struct qcom_reset_map gpu_cc_sm6115_resets[] = {
+       [GPU_GX_BCR] = { 0x1008 },
+};
+
+static struct gdsc *gpu_cc_sm6115_gdscs[] = {
+       [GPU_CX_GDSC] = &gpu_cx_gdsc,
+       [GPU_GX_GDSC] = &gpu_gx_gdsc,
+};
+
+static const struct regmap_config gpu_cc_sm6115_regmap_config = {
+       .reg_bits = 32,
+       .reg_stride = 4,
+       .val_bits = 32,
+       .max_register = 0x9000,
+       .fast_io = true,
+};
+
+static const struct qcom_cc_desc gpu_cc_sm6115_desc = {
+       .config = &gpu_cc_sm6115_regmap_config,
+       .clks = gpu_cc_sm6115_clocks,
+       .num_clks = ARRAY_SIZE(gpu_cc_sm6115_clocks),
+       .resets = gpu_cc_sm6115_resets,
+       .num_resets = ARRAY_SIZE(gpu_cc_sm6115_resets),
+       .gdscs = gpu_cc_sm6115_gdscs,
+       .num_gdscs = ARRAY_SIZE(gpu_cc_sm6115_gdscs),
+};
+
+static const struct of_device_id gpu_cc_sm6115_match_table[] = {
+       { .compatible = "qcom,sm6115-gpucc" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, gpu_cc_sm6115_match_table);
+
+static int gpu_cc_sm6115_probe(struct platform_device *pdev)
+{
+       struct regmap *regmap;
+
+       regmap = qcom_cc_map(pdev, &gpu_cc_sm6115_desc);
+       if (IS_ERR(regmap))
+               return PTR_ERR(regmap);
+
+       clk_alpha_pll_configure(&gpu_cc_pll0, regmap, &gpu_cc_pll0_config);
+       clk_alpha_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config);
+
+       /* Set recommended WAKEUP/SLEEP settings for the gpu_cc_cx_gmu_clk */
+       qcom_branch_set_wakeup(regmap, gpu_cc_cx_gmu_clk, 0xf);
+       qcom_branch_set_sleep(regmap, gpu_cc_cx_gmu_clk, 0xf);
+
+       qcom_branch_set_force_mem_core(regmap, gpu_cc_gx_gfx3d_clk, true);
+       qcom_branch_set_force_periph_on(regmap, gpu_cc_gx_gfx3d_clk, true);
+
+       return qcom_cc_really_probe(pdev, &gpu_cc_sm6115_desc, regmap);
+}
+
+static struct platform_driver gpu_cc_sm6115_driver = {
+       .probe = gpu_cc_sm6115_probe,
+       .driver = {
+               .name = "sm6115-gpucc",
+               .of_match_table = gpu_cc_sm6115_match_table,
+       },
+};
+module_platform_driver(gpu_cc_sm6115_driver);
+
+MODULE_DESCRIPTION("QTI GPU_CC SM6115 Driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/clk/qcom/gpucc-sm6125.c b/drivers/clk/qcom/gpucc-sm6125.c
new file mode 100644 (file)
index 0000000..d4f1296
--- /dev/null
@@ -0,0 +1,424 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023, Linaro Limited
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/regmap.h>
+
+#include <dt-bindings/clock/qcom,sm6125-gpucc.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_GCC_GPU_GPLL0_CLK_SRC,
+};
+
+enum {
+       P_BI_TCXO,
+       P_GPLL0_OUT_MAIN,
+       P_GPU_CC_PLL0_2X_CLK,
+       P_GPU_CC_PLL0_OUT_AUX2,
+       P_GPU_CC_PLL1_OUT_AUX,
+       P_GPU_CC_PLL1_OUT_AUX2,
+};
+
+static struct pll_vco gpu_cc_pll_vco[] = {
+       { 1000000000, 2000000000, 0 },
+       { 500000000,  1000000000, 2 },
+};
+
+/* 1020MHz configuration */
+static const struct alpha_pll_config gpu_pll0_config = {
+       .l = 0x35,
+       .config_ctl_val = 0x4001055b,
+       .alpha_hi = 0x20,
+       .alpha = 0x00,
+       .alpha_en_mask = BIT(24),
+       .vco_val = 0x0 << 20,
+       .vco_mask = 0x3 << 20,
+       .aux2_output_mask = BIT(2),
+};
+
+/* 930MHz configuration */
+static const struct alpha_pll_config gpu_pll1_config = {
+       .l = 0x30,
+       .config_ctl_val = 0x4001055b,
+       .alpha_hi = 0x70,
+       .alpha = 0x00,
+       .alpha_en_mask = BIT(24),
+       .vco_val = 0x2 << 20,
+       .vco_mask = 0x3 << 20,
+       .aux2_output_mask = BIT(2),
+};
+
+static struct clk_alpha_pll gpu_cc_pll0_out_aux2 = {
+       .offset = 0x0,
+       .vco_table = gpu_cc_pll_vco,
+       .num_vco = ARRAY_SIZE(gpu_cc_pll_vco),
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .flags = SUPPORTS_DYNAMIC_UPDATE,
+       .clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_pll0_out_aux2",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .index = DT_BI_TCXO,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static struct clk_alpha_pll gpu_cc_pll1_out_aux2 = {
+       .offset = 0x100,
+       .vco_table = gpu_cc_pll_vco,
+       .num_vco = ARRAY_SIZE(gpu_cc_pll_vco),
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
+       .flags = SUPPORTS_DYNAMIC_UPDATE,
+       .clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_pll1_out_aux2",
+                       .parent_data = &(const struct clk_parent_data) {
+                               .index = DT_BI_TCXO,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_ops,
+               },
+       },
+};
+
+static const struct parent_map gpu_cc_parent_map_0[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPLL0_OUT_MAIN, 5 },
+};
+
+static const struct clk_parent_data gpu_cc_parent_data_0[] = {
+       { .index = DT_BI_TCXO },
+       { .index = DT_GCC_GPU_GPLL0_CLK_SRC },
+};
+
+static const struct parent_map gpu_cc_parent_map_1[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPU_CC_PLL0_OUT_AUX2, 2 },
+       { P_GPU_CC_PLL1_OUT_AUX2, 4 },
+};
+
+static const struct clk_parent_data gpu_cc_parent_data_1[] = {
+       { .index = DT_BI_TCXO },
+       { .hw = &gpu_cc_pll0_out_aux2.clkr.hw },
+       { .hw = &gpu_cc_pll1_out_aux2.clkr.hw },
+};
+
+static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = {
+       F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gpu_cc_gmu_clk_src = {
+       .cmd_rcgr = 0x1120,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gpu_cc_parent_map_0,
+       .freq_tbl = ftbl_gpu_cc_gmu_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpu_cc_gmu_clk_src",
+               .parent_data = gpu_cc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gpu_cc_parent_data_0),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gpu_cc_gx_gfx3d_clk_src[] = {
+       F(320000000, P_GPU_CC_PLL1_OUT_AUX2, 2, 0, 0),
+       F(465000000, P_GPU_CC_PLL1_OUT_AUX2, 2, 0, 0),
+       F(600000000, P_GPU_CC_PLL0_OUT_AUX2, 2, 0, 0),
+       F(745000000, P_GPU_CC_PLL0_OUT_AUX2, 2, 0, 0),
+       F(820000000, P_GPU_CC_PLL0_OUT_AUX2, 2, 0, 0),
+       F(900000000, P_GPU_CC_PLL0_OUT_AUX2, 2, 0, 0),
+       F(950000000, P_GPU_CC_PLL0_OUT_AUX2, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gpu_cc_gx_gfx3d_clk_src = {
+       .cmd_rcgr = 0x101c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gpu_cc_parent_map_1,
+       .freq_tbl = ftbl_gpu_cc_gx_gfx3d_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpu_cc_gx_gfx3d_clk_src",
+               .parent_data = gpu_cc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gpu_cc_parent_data_1),
+               .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gpu_cc_crc_ahb_clk = {
+       .halt_reg = 0x107c,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x107c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_crc_ahb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_cx_apb_clk = {
+       .halt_reg = 0x1088,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x1088,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_cx_apb_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_gx_gfx3d_clk = {
+       .halt_reg = 0x1054,
+       .halt_check = BRANCH_HALT_SKIP,
+       .clkr = {
+               .enable_reg = 0x1054,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_gx_gfx3d_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gpu_cc_gx_gfx3d_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_cx_gfx3d_clk = {
+       .halt_reg = 0x10a4,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x10a4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_cx_gfx3d_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gpu_cc_gx_gfx3d_clk.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_cx_gmu_clk = {
+       .halt_reg = 0x1098,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1098,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_cx_gmu_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gpu_cc_gmu_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_cx_snoc_dvm_clk = {
+       .halt_reg = 0x108c,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x108c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_cx_snoc_dvm_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_cxo_aon_clk = {
+       .halt_reg = 0x1004,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x1004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_cxo_aon_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_cxo_clk = {
+       .halt_reg = 0x109c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x109c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_cxo_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_sleep_clk = {
+       .halt_reg = 0x1090,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x1090,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_sleep_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_ahb_clk = {
+       .halt_reg = 0x1078,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x1078,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_ahb_clk",
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpu_cc_hlos1_vote_gpu_smmu_clk = {
+       .halt_reg = 0x5000,
+       .halt_check = BRANCH_VOTED,
+       .clkr = {
+               .enable_reg = 0x5000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpu_cc_hlos1_vote_gpu_smmu_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct gdsc gpu_cx_gdsc = {
+       .gdscr = 0x106c,
+       .gds_hw_ctrl = 0x1540,
+       .pd = {
+               .name = "gpu_cx_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE,
+};
+
+static struct gdsc gpu_gx_gdsc = {
+       .gdscr = 0x100c,
+       .pd = {
+               .name = "gpu_gx_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE,
+};
+
+static struct clk_regmap *gpu_cc_sm6125_clocks[] = {
+       [GPU_CC_CRC_AHB_CLK] = &gpu_cc_crc_ahb_clk.clkr,
+       [GPU_CC_CX_APB_CLK] = &gpu_cc_cx_apb_clk.clkr,
+       [GPU_CC_CX_GFX3D_CLK] = &gpu_cc_cx_gfx3d_clk.clkr,
+       [GPU_CC_CX_GMU_CLK] = &gpu_cc_cx_gmu_clk.clkr,
+       [GPU_CC_CX_SNOC_DVM_CLK] = &gpu_cc_cx_snoc_dvm_clk.clkr,
+       [GPU_CC_CXO_AON_CLK] = &gpu_cc_cxo_aon_clk.clkr,
+       [GPU_CC_CXO_CLK] = &gpu_cc_cxo_clk.clkr,
+       [GPU_CC_GMU_CLK_SRC] = &gpu_cc_gmu_clk_src.clkr,
+       [GPU_CC_PLL0_OUT_AUX2] = &gpu_cc_pll0_out_aux2.clkr,
+       [GPU_CC_PLL1_OUT_AUX2] = &gpu_cc_pll1_out_aux2.clkr,
+       [GPU_CC_SLEEP_CLK] = &gpu_cc_sleep_clk.clkr,
+       [GPU_CC_GX_GFX3D_CLK] = &gpu_cc_gx_gfx3d_clk.clkr,
+       [GPU_CC_GX_GFX3D_CLK_SRC] = &gpu_cc_gx_gfx3d_clk_src.clkr,
+       [GPU_CC_AHB_CLK] = &gpu_cc_ahb_clk.clkr,
+       [GPU_CC_HLOS1_VOTE_GPU_SMMU_CLK] = &gpu_cc_hlos1_vote_gpu_smmu_clk.clkr,
+};
+
+static struct gdsc *gpucc_sm6125_gdscs[] = {
+       [GPU_CX_GDSC] = &gpu_cx_gdsc,
+       [GPU_GX_GDSC] = &gpu_gx_gdsc,
+};
+
+static const struct regmap_config gpu_cc_sm6125_regmap_config = {
+       .reg_bits = 32,
+       .reg_stride = 4,
+       .val_bits = 32,
+       .max_register = 0x9000,
+       .fast_io = true,
+};
+
+static const struct qcom_cc_desc gpu_cc_sm6125_desc = {
+       .config = &gpu_cc_sm6125_regmap_config,
+       .clks = gpu_cc_sm6125_clocks,
+       .num_clks = ARRAY_SIZE(gpu_cc_sm6125_clocks),
+       .gdscs = gpucc_sm6125_gdscs,
+       .num_gdscs = ARRAY_SIZE(gpucc_sm6125_gdscs),
+};
+
+static const struct of_device_id gpu_cc_sm6125_match_table[] = {
+       { .compatible = "qcom,sm6125-gpucc" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, gpu_cc_sm6125_match_table);
+
+static int gpu_cc_sm6125_probe(struct platform_device *pdev)
+{
+       struct regmap *regmap;
+
+       regmap = qcom_cc_map(pdev, &gpu_cc_sm6125_desc);
+       if (IS_ERR(regmap))
+               return PTR_ERR(regmap);
+
+       clk_alpha_pll_configure(&gpu_cc_pll0_out_aux2, regmap, &gpu_pll0_config);
+       clk_alpha_pll_configure(&gpu_cc_pll1_out_aux2, regmap, &gpu_pll1_config);
+
+       /* Set recommended WAKEUP/SLEEP settings for the gpu_cc_cx_gmu_clk */
+       qcom_branch_set_wakeup(regmap, gpu_cc_cx_gmu_clk, 0xf);
+       qcom_branch_set_sleep(regmap, gpu_cc_cx_gmu_clk, 0xf);
+
+       qcom_branch_set_force_mem_core(regmap, gpu_cc_gx_gfx3d_clk, true);
+       qcom_branch_set_force_periph_on(regmap, gpu_cc_gx_gfx3d_clk, true);
+
+       return qcom_cc_really_probe(pdev, &gpu_cc_sm6125_desc, regmap);
+}
+
+static struct platform_driver gpu_cc_sm6125_driver = {
+       .probe = gpu_cc_sm6125_probe,
+       .driver = {
+               .name = "gpucc-sm6125",
+               .of_match_table = gpu_cc_sm6125_match_table,
+       },
+};
+module_platform_driver(gpu_cc_sm6125_driver);
+
+MODULE_DESCRIPTION("QTI GPUCC SM6125 Driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/clk/qcom/gpucc-sm6375.c b/drivers/clk/qcom/gpucc-sm6375.c
new file mode 100644 (file)
index 0000000..d362034
--- /dev/null
@@ -0,0 +1,458 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023, Linaro Limited
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/regmap.h>
+
+#include <dt-bindings/clock/qcom,sm6375-gpucc.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_GCC_GPU_GPLL0_CLK_SRC,
+       DT_GCC_GPU_GPLL0_DIV_CLK_SRC,
+       DT_GCC_GPU_SNOC_DVM_GFX_CLK,
+};
+
+enum {
+       P_BI_TCXO,
+       P_GCC_GPU_GPLL0_CLK_SRC,
+       P_GCC_GPU_GPLL0_DIV_CLK_SRC,
+       P_GPU_CC_PLL0_OUT_EVEN,
+       P_GPU_CC_PLL0_OUT_MAIN,
+       P_GPU_CC_PLL0_OUT_ODD,
+       P_GPU_CC_PLL1_OUT_EVEN,
+       P_GPU_CC_PLL1_OUT_MAIN,
+       P_GPU_CC_PLL1_OUT_ODD,
+};
+
+static struct pll_vco lucid_vco[] = {
+       { 249600000, 2000000000, 0 },
+};
+
+/* 532MHz Configuration */
+static const struct alpha_pll_config gpucc_pll0_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 gpucc_pll0 = {
+       .offset = 0x0,
+       .vco_table = lucid_vco,
+       .num_vco = ARRAY_SIZE(lucid_vco),
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpucc_pll0",
+                       .parent_data = &(const struct clk_parent_data){
+                               .index = P_BI_TCXO,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_lucid_ops,
+               },
+       },
+};
+
+/* 514MHz Configuration */
+static const struct alpha_pll_config gpucc_pll1_config = {
+       .l = 0x1a,
+       .alpha = 0xc555,
+       .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 gpucc_pll1 = {
+       .offset = 0x100,
+       .vco_table = lucid_vco,
+       .num_vco = ARRAY_SIZE(lucid_vco),
+       .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID],
+       .clkr = {
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpucc_pll1",
+                       .parent_data = &(const struct clk_parent_data){
+                               .index = P_BI_TCXO,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_alpha_pll_lucid_ops,
+               },
+       },
+};
+
+static const struct parent_map gpucc_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 gpucc_parent_data_0[] = {
+       { .index = P_BI_TCXO },
+       { .hw = &gpucc_pll0.clkr.hw },
+       { .hw = &gpucc_pll1.clkr.hw },
+       { .index = DT_GCC_GPU_GPLL0_CLK_SRC },
+       { .index = DT_GCC_GPU_GPLL0_DIV_CLK_SRC },
+};
+
+static const struct parent_map gpucc_parent_map_1[] = {
+       { P_BI_TCXO, 0 },
+       { P_GPU_CC_PLL0_OUT_EVEN, 1 },
+       { P_GPU_CC_PLL0_OUT_ODD, 2 },
+       { P_GPU_CC_PLL1_OUT_EVEN, 3 },
+       { P_GPU_CC_PLL1_OUT_ODD, 4 },
+       { P_GCC_GPU_GPLL0_CLK_SRC, 5 },
+};
+
+static const struct clk_parent_data gpucc_parent_data_1[] = {
+       { .index = P_BI_TCXO },
+       { .hw = &gpucc_pll0.clkr.hw },
+       { .hw = &gpucc_pll0.clkr.hw },
+       { .hw = &gpucc_pll1.clkr.hw },
+       { .hw = &gpucc_pll1.clkr.hw },
+       { .index = DT_GCC_GPU_GPLL0_CLK_SRC },
+};
+
+static const struct freq_tbl ftbl_gpucc_gmu_clk_src[] = {
+       F(200000000, P_GCC_GPU_GPLL0_DIV_CLK_SRC, 1.5, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gpucc_gmu_clk_src = {
+       .cmd_rcgr = 0x1120,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gpucc_parent_map_0,
+       .freq_tbl = ftbl_gpucc_gmu_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpucc_gmu_clk_src",
+               .parent_data = gpucc_parent_data_0,
+               .num_parents = ARRAY_SIZE(gpucc_parent_data_0),
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
+static const struct freq_tbl ftbl_gpucc_gx_gfx3d_clk_src[] = {
+       F(266000000, P_GPU_CC_PLL0_OUT_EVEN, 2, 0, 0),
+       F(390000000, P_GPU_CC_PLL0_OUT_EVEN, 2, 0, 0),
+       F(490000000, P_GPU_CC_PLL0_OUT_EVEN, 2, 0, 0),
+       F(650000000, P_GPU_CC_PLL0_OUT_EVEN, 2, 0, 0),
+       F(770000000, P_GPU_CC_PLL0_OUT_EVEN, 2, 0, 0),
+       F(840000000, P_GPU_CC_PLL0_OUT_EVEN, 2, 0, 0),
+       F(900000000, P_GPU_CC_PLL0_OUT_EVEN, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 gpucc_gx_gfx3d_clk_src = {
+       .cmd_rcgr = 0x101c,
+       .mnd_width = 0,
+       .hid_width = 5,
+       .parent_map = gpucc_parent_map_1,
+       .freq_tbl = ftbl_gpucc_gx_gfx3d_clk_src,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "gpucc_gx_gfx3d_clk_src",
+               .parent_data = gpucc_parent_data_1,
+               .num_parents = ARRAY_SIZE(gpucc_parent_data_1),
+               .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gpucc_ahb_clk = {
+       .halt_reg = 0x1078,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x1078,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpucc_ahb_clk",
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpucc_cx_gfx3d_clk = {
+       .halt_reg = 0x10a4,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x10a4,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpucc_cx_gfx3d_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gpucc_gx_gfx3d_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpucc_cx_gfx3d_slv_clk = {
+       .halt_reg = 0x10a8,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x10a8,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpucc_cx_gfx3d_slv_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gpucc_gx_gfx3d_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpucc_cx_gmu_clk = {
+       .halt_reg = 0x1098,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1098,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpucc_cx_gmu_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gpucc_gmu_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpucc_cx_snoc_dvm_clk = {
+       .halt_reg = 0x108c,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x108c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpucc_cx_snoc_dvm_clk",
+                       .parent_data = &(const struct clk_parent_data){
+                               .index = DT_GCC_GPU_SNOC_DVM_GFX_CLK,
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpucc_cxo_aon_clk = {
+       .halt_reg = 0x1004,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x1004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpucc_cxo_aon_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpucc_cxo_clk = {
+       .halt_reg = 0x109c,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x109c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpucc_cxo_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpucc_gx_cxo_clk = {
+       .halt_reg = 0x1060,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x1060,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpucc_gx_cxo_clk",
+                       .flags = CLK_IS_CRITICAL,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpucc_gx_gfx3d_clk = {
+       .halt_reg = 0x1054,
+       .halt_check = BRANCH_HALT_DELAY,
+       .clkr = {
+               .enable_reg = 0x1054,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpucc_gx_gfx3d_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gpucc_gx_gfx3d_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpucc_gx_gmu_clk = {
+       .halt_reg = 0x1064,
+       .halt_check = BRANCH_HALT,
+       .clkr = {
+               .enable_reg = 0x1064,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpucc_gx_gmu_clk",
+                       .parent_hws = (const struct clk_hw*[]) {
+                               &gpucc_gmu_clk_src.clkr.hw,
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gpucc_sleep_clk = {
+       .halt_reg = 0x1090,
+       .halt_check = BRANCH_HALT_VOTED,
+       .clkr = {
+               .enable_reg = 0x1090,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gpucc_sleep_clk",
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct gdsc gpu_cx_gdsc = {
+       .gdscr = 0x106c,
+       .gds_hw_ctrl = 0x1540,
+       .clk_dis_wait_val = 8,
+       .pd = {
+               .name = "gpu_cx_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = VOTABLE,
+};
+
+static struct gdsc gpu_gx_gdsc = {
+       .gdscr = 0x100c,
+       .clamp_io_ctrl = 0x1508,
+       .resets = (unsigned int []){ GPU_GX_BCR, GPU_ACD_BCR, GPU_GX_ACD_MISC_BCR },
+       .reset_count = 3,
+       .pd = {
+               .name = "gpu_gx_gdsc",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+       .flags = CLAMP_IO | SW_RESET | AON_RESET,
+};
+
+static struct clk_regmap *gpucc_sm6375_clocks[] = {
+       [GPU_CC_AHB_CLK] = &gpucc_ahb_clk.clkr,
+       [GPU_CC_CX_GFX3D_CLK] = &gpucc_cx_gfx3d_clk.clkr,
+       [GPU_CC_CX_GFX3D_SLV_CLK] = &gpucc_cx_gfx3d_slv_clk.clkr,
+       [GPU_CC_CX_GMU_CLK] = &gpucc_cx_gmu_clk.clkr,
+       [GPU_CC_CX_SNOC_DVM_CLK] = &gpucc_cx_snoc_dvm_clk.clkr,
+       [GPU_CC_CXO_AON_CLK] = &gpucc_cxo_aon_clk.clkr,
+       [GPU_CC_CXO_CLK] = &gpucc_cxo_clk.clkr,
+       [GPU_CC_GMU_CLK_SRC] = &gpucc_gmu_clk_src.clkr,
+       [GPU_CC_GX_CXO_CLK] = &gpucc_gx_cxo_clk.clkr,
+       [GPU_CC_GX_GFX3D_CLK] = &gpucc_gx_gfx3d_clk.clkr,
+       [GPU_CC_GX_GFX3D_CLK_SRC] = &gpucc_gx_gfx3d_clk_src.clkr,
+       [GPU_CC_GX_GMU_CLK] = &gpucc_gx_gmu_clk.clkr,
+       [GPU_CC_PLL0] = &gpucc_pll0.clkr,
+       [GPU_CC_PLL1] = &gpucc_pll1.clkr,
+       [GPU_CC_SLEEP_CLK] = &gpucc_sleep_clk.clkr,
+};
+
+static const struct qcom_reset_map gpucc_sm6375_resets[] = {
+       [GPU_GX_BCR] = { 0x1008 },
+       [GPU_ACD_BCR] = { 0x1160 },
+       [GPU_GX_ACD_MISC_BCR] = { 0x8004 },
+};
+
+static struct gdsc *gpucc_sm6375_gdscs[] = {
+       [GPU_CX_GDSC] = &gpu_cx_gdsc,
+       [GPU_GX_GDSC] = &gpu_gx_gdsc,
+};
+
+static const struct regmap_config gpucc_sm6375_regmap_config = {
+       .reg_bits = 32,
+       .reg_stride = 4,
+       .val_bits = 32,
+       .max_register = 0x9000,
+       .fast_io = true,
+};
+
+static const struct qcom_cc_desc gpucc_sm6375_desc = {
+       .config = &gpucc_sm6375_regmap_config,
+       .clks = gpucc_sm6375_clocks,
+       .num_clks = ARRAY_SIZE(gpucc_sm6375_clocks),
+       .resets = gpucc_sm6375_resets,
+       .num_resets = ARRAY_SIZE(gpucc_sm6375_resets),
+       .gdscs = gpucc_sm6375_gdscs,
+       .num_gdscs = ARRAY_SIZE(gpucc_sm6375_gdscs),
+};
+
+static const struct of_device_id gpucc_sm6375_match_table[] = {
+       { .compatible = "qcom,sm6375-gpucc" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, gpucc_sm6375_match_table);
+
+static int gpucc_sm6375_probe(struct platform_device *pdev)
+{
+       struct regmap *regmap;
+
+       regmap = qcom_cc_map(pdev, &gpucc_sm6375_desc);
+       if (IS_ERR(regmap))
+               return PTR_ERR(regmap);
+
+       clk_lucid_pll_configure(&gpucc_pll0, regmap, &gpucc_pll0_config);
+       clk_lucid_pll_configure(&gpucc_pll1, regmap, &gpucc_pll1_config);
+
+       return qcom_cc_really_probe(pdev, &gpucc_sm6375_desc, regmap);
+}
+
+static struct platform_driver gpucc_sm6375_driver = {
+       .probe = gpucc_sm6375_probe,
+       .driver = {
+               .name = "gpucc-sm6375",
+               .of_match_table = gpucc_sm6375_match_table,
+       },
+};
+module_platform_driver(gpucc_sm6375_driver);
+
+MODULE_DESCRIPTION("QTI GPUCC SM6375 Driver");
+MODULE_LICENSE("GPL");
index 1339f9211a149bb08a896eb037dbb414c5c016c1..134eb1529ede2dc679b2d78ee1a45b7c6cd66e2d 100644 (file)
@@ -696,6 +696,8 @@ 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),
+       .gdscs = lpass_aon_cc_sc7280_gdscs,
+       .num_gdscs = ARRAY_SIZE(lpass_aon_cc_sc7280_gdscs),
 };
 
 static const struct qcom_cc_desc lpass_audio_cc_sc7280_desc = {
index 48432010ce247d1c2e7e2c73258b65b1670045b1..0df2b29e95e3195c4b20b04d245104fa23009e27 100644 (file)
@@ -121,14 +121,18 @@ static int lpass_cc_sc7280_probe(struct platform_device *pdev)
                goto destroy_pm_clk;
        }
 
-       lpass_regmap_config.name = "qdsp6ss";
-       desc = &lpass_qdsp6ss_sc7280_desc;
-
-       ret = qcom_cc_probe_by_index(pdev, 0, desc);
-       if (ret)
-               goto destroy_pm_clk;
+       if (!of_property_read_bool(pdev->dev.of_node, "qcom,adsp-pil-mode")) {
+               lpass_regmap_config.name = "qdsp6ss";
+               lpass_regmap_config.max_register = 0x3f;
+               desc = &lpass_qdsp6ss_sc7280_desc;
+
+               ret = qcom_cc_probe_by_index(pdev, 0, desc);
+               if (ret)
+                       goto destroy_pm_clk;
+       }
 
        lpass_regmap_config.name = "top_cc";
+       lpass_regmap_config.max_register = 0x4;
        desc = &lpass_cc_top_sc7280_desc;
 
        ret = qcom_cc_probe_by_index(pdev, 1, desc);
index 306910a3a0d38451d3bcf9b54063236ec11e1dba..9ebd6c451b3dbf81698627a12310e64cfb6cc445 100644 (file)
@@ -1263,7 +1263,7 @@ static struct rockchip_clk_branch rk3399_clk_branches[] __initdata = {
                        RK3399_CLKSEL_CON(56), 6, 2, MFLAGS,
                        RK3399_CLKGATE_CON(10), 7, GFLAGS),
 
-       COMPOSITE_NOGATE(SCLK_CIF_OUT, "clk_cifout", mux_clk_cif_p, 0,
+       COMPOSITE_NOGATE(SCLK_CIF_OUT, "clk_cifout", mux_clk_cif_p, CLK_SET_RATE_PARENT,
                         RK3399_CLKSEL_CON(56), 5, 1, MFLAGS, 0, 5, DFLAGS),
 
        /* gic */
index b7ce3fbd6fa6a4b331f0345e75e0f595ea9178a7..6994165e03957c89000addbf1479f18ebbbe26fc 100644 (file)
 #include "clk.h"
 
 /*
- * GATE with additional linked clock. Downstream enables the linked clock
- * (via runtime PM) whenever the gate is enabled. The downstream implementation
- * does this via separate clock nodes for each of the linked gate clocks,
- * which leaks parts of the clock tree into DT. It is unclear why this is
- * actually needed and things work without it for simple use cases. Thus
- * the linked clock is ignored for now.
+ * Recent Rockchip SoCs have a new hardware block called Native Interface
+ * Unit (NIU), which gates clocks to devices behind them. These effectively
+ * need two parent clocks.
+ *
+ * Downstream enables the linked clock via runtime PM whenever the gate is
+ * enabled. This implementation uses separate clock nodes for each of the
+ * linked gate clocks, which leaks parts of the clock tree into DT.
+ *
+ * The GATE_LINK macro instead takes the second parent via 'linkname', but
+ * ignores the information. Once the clock framework is ready to handle it, the
+ * information should be passed on here. But since these clocks are required to
+ * access multiple relevant IP blocks, such as PCIe or USB, we mark all linked
+ * clocks critical until a better solution is available. This will waste some
+ * power, but avoids leaking implementation details into DT or hanging the
+ * system.
  */
 #define GATE_LINK(_id, cname, pname, linkname, f, o, b, gf) \
        GATE(_id, cname, pname, f, o, b, gf)
+#define RK3588_LINKED_CLK              CLK_IS_CRITICAL
 
 
 #define RK3588_GRF_SOC_STATUS0         0x600
@@ -1446,7 +1456,7 @@ static struct rockchip_clk_branch rk3588_clk_branches[] __initdata = {
        COMPOSITE_NODIV(HCLK_NVM_ROOT,  "hclk_nvm_root", mux_200m_100m_50m_24m_p, 0,
                        RK3588_CLKSEL_CON(77), 0, 2, MFLAGS,
                        RK3588_CLKGATE_CON(31), 0, GFLAGS),
-       COMPOSITE(ACLK_NVM_ROOT, "aclk_nvm_root", gpll_cpll_p, 0,
+       COMPOSITE(ACLK_NVM_ROOT, "aclk_nvm_root", gpll_cpll_p, RK3588_LINKED_CLK,
                        RK3588_CLKSEL_CON(77), 7, 1, MFLAGS, 2, 5, DFLAGS,
                        RK3588_CLKGATE_CON(31), 1, GFLAGS),
        GATE(ACLK_EMMC, "aclk_emmc", "aclk_nvm_root", 0,
@@ -1675,13 +1685,13 @@ static struct rockchip_clk_branch rk3588_clk_branches[] __initdata = {
                        RK3588_CLKGATE_CON(42), 9, GFLAGS),
 
        /* vdpu */
-       COMPOSITE(ACLK_VDPU_ROOT, "aclk_vdpu_root", gpll_cpll_aupll_p, 0,
+       COMPOSITE(ACLK_VDPU_ROOT, "aclk_vdpu_root", gpll_cpll_aupll_p, RK3588_LINKED_CLK,
                        RK3588_CLKSEL_CON(98), 5, 2, MFLAGS, 0, 5, DFLAGS,
                        RK3588_CLKGATE_CON(44), 0, GFLAGS),
        COMPOSITE_NODIV(ACLK_VDPU_LOW_ROOT, "aclk_vdpu_low_root", mux_400m_200m_100m_24m_p, 0,
                        RK3588_CLKSEL_CON(98), 7, 2, MFLAGS,
                        RK3588_CLKGATE_CON(44), 1, GFLAGS),
-       COMPOSITE_NODIV(HCLK_VDPU_ROOT, "hclk_vdpu_root", mux_200m_100m_50m_24m_p, 0,
+       COMPOSITE_NODIV(HCLK_VDPU_ROOT, "hclk_vdpu_root", mux_200m_100m_50m_24m_p, RK3588_LINKED_CLK,
                        RK3588_CLKSEL_CON(98), 9, 2, MFLAGS,
                        RK3588_CLKGATE_CON(44), 2, GFLAGS),
        COMPOSITE(ACLK_JPEG_DECODER_ROOT, "aclk_jpeg_decoder_root", gpll_cpll_aupll_spll_p, 0,
@@ -1732,9 +1742,9 @@ static struct rockchip_clk_branch rk3588_clk_branches[] __initdata = {
        COMPOSITE(ACLK_RKVENC0_ROOT, "aclk_rkvenc0_root", gpll_cpll_npll_p, 0,
                        RK3588_CLKSEL_CON(102), 7, 2, MFLAGS, 2, 5, DFLAGS,
                        RK3588_CLKGATE_CON(47), 1, GFLAGS),
-       GATE(HCLK_RKVENC0, "hclk_rkvenc0", "hclk_rkvenc0_root", 0,
+       GATE(HCLK_RKVENC0, "hclk_rkvenc0", "hclk_rkvenc0_root", RK3588_LINKED_CLK,
                        RK3588_CLKGATE_CON(47), 4, GFLAGS),
-       GATE(ACLK_RKVENC0, "aclk_rkvenc0", "aclk_rkvenc0_root", 0,
+       GATE(ACLK_RKVENC0, "aclk_rkvenc0", "aclk_rkvenc0_root", RK3588_LINKED_CLK,
                        RK3588_CLKGATE_CON(47), 5, GFLAGS),
        COMPOSITE(CLK_RKVENC0_CORE, "clk_rkvenc0_core", gpll_cpll_aupll_npll_p, 0,
                        RK3588_CLKSEL_CON(102), 14, 2, MFLAGS, 9, 5, DFLAGS,
@@ -1744,10 +1754,10 @@ static struct rockchip_clk_branch rk3588_clk_branches[] __initdata = {
                        RK3588_CLKGATE_CON(48), 6, GFLAGS),
 
        /* vi */
-       COMPOSITE(ACLK_VI_ROOT, "aclk_vi_root", gpll_cpll_npll_aupll_spll_p, 0,
+       COMPOSITE(ACLK_VI_ROOT, "aclk_vi_root", gpll_cpll_npll_aupll_spll_p, RK3588_LINKED_CLK,
                        RK3588_CLKSEL_CON(106), 5, 3, MFLAGS, 0, 5, DFLAGS,
                        RK3588_CLKGATE_CON(49), 0, GFLAGS),
-       COMPOSITE_NODIV(HCLK_VI_ROOT, "hclk_vi_root", mux_200m_100m_50m_24m_p, 0,
+       COMPOSITE_NODIV(HCLK_VI_ROOT, "hclk_vi_root", mux_200m_100m_50m_24m_p, RK3588_LINKED_CLK,
                        RK3588_CLKSEL_CON(106), 8, 2, MFLAGS,
                        RK3588_CLKGATE_CON(49), 1, GFLAGS),
        COMPOSITE_NODIV(PCLK_VI_ROOT, "pclk_vi_root", mux_100m_50m_24m_p, 0,
@@ -1919,10 +1929,10 @@ static struct rockchip_clk_branch rk3588_clk_branches[] __initdata = {
        COMPOSITE(ACLK_VOP_ROOT, "aclk_vop_root", gpll_cpll_dmyaupll_npll_spll_p, 0,
                        RK3588_CLKSEL_CON(110), 5, 3, MFLAGS, 0, 5, DFLAGS,
                        RK3588_CLKGATE_CON(52), 0, GFLAGS),
-       COMPOSITE_NODIV(ACLK_VOP_LOW_ROOT, "aclk_vop_low_root", mux_400m_200m_100m_24m_p, 0,
+       COMPOSITE_NODIV(ACLK_VOP_LOW_ROOT, "aclk_vop_low_root", mux_400m_200m_100m_24m_p, RK3588_LINKED_CLK,
                        RK3588_CLKSEL_CON(110), 8, 2, MFLAGS,
                        RK3588_CLKGATE_CON(52), 1, GFLAGS),
-       COMPOSITE_NODIV(HCLK_VOP_ROOT, "hclk_vop_root", mux_200m_100m_50m_24m_p, 0,
+       COMPOSITE_NODIV(HCLK_VOP_ROOT, "hclk_vop_root", mux_200m_100m_50m_24m_p, RK3588_LINKED_CLK,
                        RK3588_CLKSEL_CON(110), 10, 2, MFLAGS,
                        RK3588_CLKGATE_CON(52), 2, GFLAGS),
        COMPOSITE_NODIV(PCLK_VOP_ROOT, "pclk_vop_root", mux_100m_50m_24m_p, 0,
@@ -2425,7 +2435,7 @@ static struct rockchip_clk_branch rk3588_clk_branches[] __initdata = {
 
        GATE_LINK(ACLK_ISP1_PRE, "aclk_isp1_pre", "aclk_isp1_root", "aclk_vi_root", 0, RK3588_CLKGATE_CON(26), 6, GFLAGS),
        GATE_LINK(HCLK_ISP1_PRE, "hclk_isp1_pre", "hclk_isp1_root", "hclk_vi_root", 0, RK3588_CLKGATE_CON(26), 8, GFLAGS),
-       GATE_LINK(HCLK_NVM, "hclk_nvm", "hclk_nvm_root", "aclk_nvm_root", 0, RK3588_CLKGATE_CON(31), 2, GFLAGS),
+       GATE_LINK(HCLK_NVM, "hclk_nvm", "hclk_nvm_root", "aclk_nvm_root", RK3588_LINKED_CLK, RK3588_CLKGATE_CON(31), 2, GFLAGS),
        GATE_LINK(ACLK_USB, "aclk_usb", "aclk_usb_root", "aclk_vo1usb_top_root", 0, RK3588_CLKGATE_CON(42), 2, GFLAGS),
        GATE_LINK(HCLK_USB, "hclk_usb", "hclk_usb_root", "hclk_vo1usb_top_root", 0, RK3588_CLKGATE_CON(42), 3, GFLAGS),
        GATE_LINK(ACLK_JPEG_DECODER_PRE, "aclk_jpeg_decoder_pre", "aclk_jpeg_decoder_root", "aclk_vdpu_root", 0, RK3588_CLKGATE_CON(44), 7, GFLAGS),
index b921b9a1134aaeda864491a8569d082fca920779..7d8937caf22acc08966e363a086c04f12353785c 100644 (file)
@@ -10,6 +10,9 @@
  */
 #include <linux/clk.h>
 #include <linux/of_address.h>
+#include <linux/of_device.h>
+#include <linux/pm_runtime.h>
+#include <linux/slab.h>
 
 #include "clk-exynos-arm64.h"
 
 #define GATE_OFF_START         0x2000
 #define GATE_OFF_END           0x2fff
 
+struct exynos_arm64_cmu_data {
+       struct samsung_clk_reg_dump *clk_save;
+       unsigned int nr_clk_save;
+       const struct samsung_clk_reg_dump *clk_suspend;
+       unsigned int nr_clk_suspend;
+
+       struct clk *clk;
+       struct clk **pclks;
+       int nr_pclks;
+
+       struct samsung_clk_provider *ctx;
+};
+
 /**
  * exynos_arm64_init_clocks - Set clocks initial configuration
  * @np:                        CMU device tree node with "reg" property (CMU addr)
@@ -56,6 +72,83 @@ static void __init exynos_arm64_init_clocks(struct device_node *np,
        iounmap(reg_base);
 }
 
+/**
+ * exynos_arm64_enable_bus_clk - Enable parent clock of specified CMU
+ *
+ * @dev:       Device object; may be NULL if this function is not being
+ *             called from platform driver probe function
+ * @np:                CMU device tree node
+ * @cmu:       CMU data
+ *
+ * Keep CMU parent clock running (needed for CMU registers access).
+ *
+ * Return: 0 on success or a negative error code on failure.
+ */
+static int __init exynos_arm64_enable_bus_clk(struct device *dev,
+               struct device_node *np, const struct samsung_cmu_info *cmu)
+{
+       struct clk *parent_clk;
+
+       if (!cmu->clk_name)
+               return 0;
+
+       if (dev) {
+               struct exynos_arm64_cmu_data *data;
+
+               parent_clk = clk_get(dev, cmu->clk_name);
+               data = dev_get_drvdata(dev);
+               if (data)
+                       data->clk = parent_clk;
+       } else {
+               parent_clk = of_clk_get_by_name(np, cmu->clk_name);
+       }
+
+       if (IS_ERR(parent_clk))
+               return PTR_ERR(parent_clk);
+
+       return clk_prepare_enable(parent_clk);
+}
+
+static int __init exynos_arm64_cmu_prepare_pm(struct device *dev,
+               const struct samsung_cmu_info *cmu)
+{
+       struct exynos_arm64_cmu_data *data = dev_get_drvdata(dev);
+       int i;
+
+       data->clk_save = samsung_clk_alloc_reg_dump(cmu->clk_regs,
+                                                   cmu->nr_clk_regs);
+       if (!data->clk_save)
+               return -ENOMEM;
+
+       data->nr_clk_save = cmu->nr_clk_regs;
+       data->clk_suspend = cmu->suspend_regs;
+       data->nr_clk_suspend = cmu->nr_suspend_regs;
+       data->nr_pclks = of_clk_get_parent_count(dev->of_node);
+       if (!data->nr_pclks)
+               return 0;
+
+       data->pclks = devm_kcalloc(dev, sizeof(struct clk *), data->nr_pclks,
+                                  GFP_KERNEL);
+       if (!data->pclks) {
+               kfree(data->clk_save);
+               return -ENOMEM;
+       }
+
+       for (i = 0; i < data->nr_pclks; i++) {
+               struct clk *clk = of_clk_get(dev->of_node, i);
+
+               if (IS_ERR(clk)) {
+                       kfree(data->clk_save);
+                       while (--i >= 0)
+                               clk_put(data->pclks[i]);
+                       return PTR_ERR(clk);
+               }
+               data->pclks[i] = clk;
+       }
+
+       return 0;
+}
+
 /**
  * exynos_arm64_register_cmu - Register specified Exynos CMU domain
  * @dev:       Device object; may be NULL if this function is not being
@@ -72,23 +165,127 @@ static void __init exynos_arm64_init_clocks(struct device_node *np,
 void __init exynos_arm64_register_cmu(struct device *dev,
                struct device_node *np, const struct samsung_cmu_info *cmu)
 {
-       /* Keep CMU parent clock running (needed for CMU registers access) */
-       if (cmu->clk_name) {
-               struct clk *parent_clk;
-
-               if (dev)
-                       parent_clk = clk_get(dev, cmu->clk_name);
-               else
-                       parent_clk = of_clk_get_by_name(np, cmu->clk_name);
-
-               if (IS_ERR(parent_clk)) {
-                       pr_err("%s: could not find bus clock %s; err = %ld\n",
-                              __func__, cmu->clk_name, PTR_ERR(parent_clk));
-               } else {
-                       clk_prepare_enable(parent_clk);
-               }
-       }
+       int err;
+
+       /*
+        * Try to boot even if the parent clock enablement fails, as it might be
+        * already enabled by bootloader.
+        */
+       err = exynos_arm64_enable_bus_clk(dev, np, cmu);
+       if (err)
+               pr_err("%s: could not enable bus clock %s; err = %d\n",
+                      __func__, cmu->clk_name, err);
 
        exynos_arm64_init_clocks(np, cmu->clk_regs, cmu->nr_clk_regs);
        samsung_cmu_register_one(np, cmu);
 }
+
+/**
+ * exynos_arm64_register_cmu_pm - Register Exynos CMU domain with PM support
+ *
+ * @pdev:      Platform device object
+ * @set_manual:        If true, set gate clocks to manual mode
+ *
+ * It's a version of exynos_arm64_register_cmu() with PM support. Should be
+ * called from probe function of platform driver.
+ *
+ * Return: 0 on success, or negative error code on error.
+ */
+int __init exynos_arm64_register_cmu_pm(struct platform_device *pdev,
+                                       bool set_manual)
+{
+       const struct samsung_cmu_info *cmu;
+       struct device *dev = &pdev->dev;
+       struct device_node *np = dev->of_node;
+       struct exynos_arm64_cmu_data *data;
+       void __iomem *reg_base;
+       int ret;
+
+       cmu = of_device_get_match_data(dev);
+
+       data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
+       if (!data)
+               return -ENOMEM;
+
+       platform_set_drvdata(pdev, data);
+
+       ret = exynos_arm64_cmu_prepare_pm(dev, cmu);
+       if (ret)
+               return ret;
+
+       /*
+        * Try to boot even if the parent clock enablement fails, as it might be
+        * already enabled by bootloader.
+        */
+       ret = exynos_arm64_enable_bus_clk(dev, NULL, cmu);
+       if (ret)
+               dev_err(dev, "%s: could not enable bus clock %s; err = %d\n",
+                      __func__, cmu->clk_name, ret);
+
+       if (set_manual)
+               exynos_arm64_init_clocks(np, cmu->clk_regs, cmu->nr_clk_regs);
+
+       reg_base = devm_platform_ioremap_resource(pdev, 0);
+       if (IS_ERR(reg_base))
+               return PTR_ERR(reg_base);
+
+       data->ctx = samsung_clk_init(dev, reg_base, cmu->nr_clk_ids);
+
+       /*
+        * Enable runtime PM here to allow the clock core using runtime PM
+        * for the registered clocks. Additionally, we increase the runtime
+        * PM usage count before registering the clocks, to prevent the
+        * clock core from runtime suspending the device.
+        */
+       pm_runtime_get_noresume(dev);
+       pm_runtime_set_active(dev);
+       pm_runtime_enable(dev);
+
+       samsung_cmu_register_clocks(data->ctx, cmu);
+       samsung_clk_of_add_provider(dev->of_node, data->ctx);
+       pm_runtime_put_sync(dev);
+
+       return 0;
+}
+
+int exynos_arm64_cmu_suspend(struct device *dev)
+{
+       struct exynos_arm64_cmu_data *data = dev_get_drvdata(dev);
+       int i;
+
+       samsung_clk_save(data->ctx->reg_base, data->clk_save,
+                        data->nr_clk_save);
+
+       for (i = 0; i < data->nr_pclks; i++)
+               clk_prepare_enable(data->pclks[i]);
+
+       /* For suspend some registers have to be set to certain values */
+       samsung_clk_restore(data->ctx->reg_base, data->clk_suspend,
+                           data->nr_clk_suspend);
+
+       for (i = 0; i < data->nr_pclks; i++)
+               clk_disable_unprepare(data->pclks[i]);
+
+       clk_disable_unprepare(data->clk);
+
+       return 0;
+}
+
+int exynos_arm64_cmu_resume(struct device *dev)
+{
+       struct exynos_arm64_cmu_data *data = dev_get_drvdata(dev);
+       int i;
+
+       clk_prepare_enable(data->clk);
+
+       for (i = 0; i < data->nr_pclks; i++)
+               clk_prepare_enable(data->pclks[i]);
+
+       samsung_clk_restore(data->ctx->reg_base, data->clk_save,
+                           data->nr_clk_save);
+
+       for (i = 0; i < data->nr_pclks; i++)
+               clk_disable_unprepare(data->pclks[i]);
+
+       return 0;
+}
index 0dd174693935dc095f8589c333180e0dccaa12c1..969979e714bc63a5e5e85181d04e52659f3274af 100644 (file)
@@ -16,5 +16,8 @@
 
 void exynos_arm64_register_cmu(struct device *dev,
                struct device_node *np, const struct samsung_cmu_info *cmu);
+int exynos_arm64_register_cmu_pm(struct platform_device *pdev, bool set_manual);
+int exynos_arm64_cmu_suspend(struct device *dev);
+int exynos_arm64_cmu_resume(struct device *dev);
 
 #endif /* __CLK_EXYNOS_ARM64_H */
index 9cc127a162ad6a9330ff21e3756ee8ee20dbb5b8..7626dff41f6faec912146a9b8978564583073fb0 100644 (file)
@@ -268,7 +268,7 @@ unregister:
        return ret;
 }
 
-static int exynos_audss_clk_remove(struct platform_device *pdev)
+static void exynos_audss_clk_remove(struct platform_device *pdev)
 {
        of_clk_del_provider(pdev->dev.of_node);
 
@@ -277,8 +277,6 @@ static int exynos_audss_clk_remove(struct platform_device *pdev)
 
        if (!IS_ERR(epll))
                clk_disable_unprepare(epll);
-
-       return 0;
 }
 
 static const struct dev_pm_ops exynos_audss_clk_pm_ops = {
@@ -295,7 +293,7 @@ static struct platform_driver exynos_audss_clk_driver = {
                .pm = &exynos_audss_clk_pm_ops,
        },
        .probe = exynos_audss_clk_probe,
-       .remove = exynos_audss_clk_remove,
+       .remove_new = exynos_audss_clk_remove,
 };
 
 module_platform_driver(exynos_audss_clk_driver);
index e6d6cbf8c4e61e5d7d1c7edc653d27a0a995ed78..0cff1c94c35e67ae72f329dc24c86e04a6cb9d91 100644 (file)
@@ -196,15 +196,13 @@ clks_put:
        return ret;
 }
 
-static int exynos_clkout_remove(struct platform_device *pdev)
+static void exynos_clkout_remove(struct platform_device *pdev)
 {
        struct exynos_clkout *clkout = platform_get_drvdata(pdev);
 
        of_clk_del_provider(clkout->np);
        clk_hw_unregister(clkout->data.hws[0]);
        iounmap(clkout->reg);
-
-       return 0;
 }
 
 static int __maybe_unused exynos_clkout_suspend(struct device *dev)
@@ -235,7 +233,7 @@ static struct platform_driver exynos_clkout_driver = {
                .pm = &exynos_clkout_pm_ops,
        },
        .probe = exynos_clkout_probe,
-       .remove = exynos_clkout_remove,
+       .remove_new = exynos_clkout_remove,
 };
 module_platform_driver(exynos_clkout_driver);
 
index 22009cb53428a09005456fcbde4fa4ca4ae06943..d7dbb38583471e86d5c1eeb3723196d1356addbf 100644 (file)
@@ -1251,7 +1251,7 @@ static void __init exynos4_clk_init(struct device_node *np,
        if (!reg_base)
                panic("%s: failed to map registers\n", __func__);
 
-       ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS);
+       ctx = samsung_clk_init(NULL, reg_base, CLK_NR_CLKS);
        hws = ctx->clk_data.hws;
 
        samsung_clk_of_register_fixed_ext(ctx, exynos4_fixed_rate_ext_clks,
@@ -1276,7 +1276,7 @@ static void __init exynos4_clk_init(struct device_node *np,
                                                        exynos4210_vpll_rates;
 
                samsung_clk_register_pll(ctx, exynos4210_plls,
-                                       ARRAY_SIZE(exynos4210_plls), reg_base);
+                                       ARRAY_SIZE(exynos4210_plls));
        } else {
                if (clk_hw_get_rate(hws[CLK_FIN_PLL]) == 24000000) {
                        exynos4x12_plls[apll].rate_table =
@@ -1288,7 +1288,7 @@ static void __init exynos4_clk_init(struct device_node *np,
                }
 
                samsung_clk_register_pll(ctx, exynos4x12_plls,
-                                       ARRAY_SIZE(exynos4x12_plls), reg_base);
+                                       ARRAY_SIZE(exynos4x12_plls));
        }
 
        samsung_clk_register_fixed_rate(ctx, exynos4_fixed_rate_clks,
index 471a6fb8267059f8ff88821a51b214618ddab031..1470c15e95da3851c7f8e16272a392d81d053660 100644 (file)
@@ -121,8 +121,7 @@ static int __init exynos4x12_isp_clk_probe(struct platform_device *pdev)
        if (!exynos4x12_save_isp)
                return -ENOMEM;
 
-       ctx = samsung_clk_init(np, reg_base, CLK_NR_ISP_CLKS);
-       ctx->dev = dev;
+       ctx = samsung_clk_init(dev, reg_base, CLK_NR_ISP_CLKS);
 
        platform_set_drvdata(pdev, ctx);
 
index 113df773ee4490db0155e6219c303fba1e947d7c..92fb09922f2800d7e14d2c3d51d242a56e2200ba 100644 (file)
@@ -797,7 +797,7 @@ static void __init exynos5250_clk_init(struct device_node *np)
                panic("%s: unable to determine soc\n", __func__);
        }
 
-       ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS);
+       ctx = samsung_clk_init(NULL, reg_base, CLK_NR_CLKS);
        hws = ctx->clk_data.hws;
 
        samsung_clk_of_register_fixed_ext(ctx, exynos5250_fixed_rate_ext_clks,
@@ -815,8 +815,7 @@ static void __init exynos5250_clk_init(struct device_node *np)
                exynos5250_plls[vpll].rate_table =  vpll_24mhz_tbl;
 
        samsung_clk_register_pll(ctx, exynos5250_plls,
-                       ARRAY_SIZE(exynos5250_plls),
-                       reg_base);
+                       ARRAY_SIZE(exynos5250_plls));
        samsung_clk_register_fixed_rate(ctx, exynos5250_fixed_rate_clks,
                        ARRAY_SIZE(exynos5250_fixed_rate_clks));
        samsung_clk_register_fixed_factor(ctx, exynos5250_fixed_factor_clks,
index caad74dee2971b02bfc98d598f1480f6a20cd557..1e0cbf762408b169e8b79da94c34c7ad792e45cd 100644 (file)
@@ -1587,7 +1587,7 @@ static void __init exynos5x_clk_init(struct device_node *np,
 
        exynos5x_soc = soc;
 
-       ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS);
+       ctx = samsung_clk_init(NULL, reg_base, CLK_NR_CLKS);
        hws = ctx->clk_data.hws;
 
        samsung_clk_of_register_fixed_ext(ctx, exynos5x_fixed_rate_ext_clks,
@@ -1606,8 +1606,7 @@ static void __init exynos5x_clk_init(struct device_node *np,
        else
                exynos5x_plls[bpll].rate_table = exynos5422_bpll_rate_table;
 
-       samsung_clk_register_pll(ctx, exynos5x_plls, ARRAY_SIZE(exynos5x_plls),
-                                       reg_base);
+       samsung_clk_register_pll(ctx, exynos5x_plls, ARRAY_SIZE(exynos5x_plls));
        samsung_clk_register_fixed_rate(ctx, exynos5x_fixed_rate_clks,
                        ARRAY_SIZE(exynos5x_fixed_rate_clks));
        samsung_clk_register_fixed_factor(ctx, exynos5x_fixed_factor_clks,
index f9daae20f393de765fa8e2b30e3891fea530ddbf..ed43233649aeb5e83b6f087de68d656f23882b76 100644 (file)
@@ -10,7 +10,6 @@
 #include <linux/clk-provider.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
-#include <linux/of_device.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/slab.h>
@@ -19,6 +18,7 @@
 
 #include "clk.h"
 #include "clk-cpu.h"
+#include "clk-exynos-arm64.h"
 #include "clk-pll.h"
 
 /*
@@ -5478,160 +5478,9 @@ static const struct samsung_cmu_info imem_cmu_info __initconst = {
        .clk_name               = "aclk_imem_200",
 };
 
-struct exynos5433_cmu_data {
-       struct samsung_clk_reg_dump *clk_save;
-       unsigned int nr_clk_save;
-       const struct samsung_clk_reg_dump *clk_suspend;
-       unsigned int nr_clk_suspend;
-
-       struct clk *clk;
-       struct clk **pclks;
-       int nr_pclks;
-
-       /* must be the last entry */
-       struct samsung_clk_provider ctx;
-};
-
-static int __maybe_unused exynos5433_cmu_suspend(struct device *dev)
-{
-       struct exynos5433_cmu_data *data = dev_get_drvdata(dev);
-       int i;
-
-       samsung_clk_save(data->ctx.reg_base, data->clk_save,
-                        data->nr_clk_save);
-
-       for (i = 0; i < data->nr_pclks; i++)
-               clk_prepare_enable(data->pclks[i]);
-
-       /* for suspend some registers have to be set to certain values */
-       samsung_clk_restore(data->ctx.reg_base, data->clk_suspend,
-                           data->nr_clk_suspend);
-
-       for (i = 0; i < data->nr_pclks; i++)
-               clk_disable_unprepare(data->pclks[i]);
-
-       clk_disable_unprepare(data->clk);
-
-       return 0;
-}
-
-static int __maybe_unused exynos5433_cmu_resume(struct device *dev)
-{
-       struct exynos5433_cmu_data *data = dev_get_drvdata(dev);
-       int i;
-
-       clk_prepare_enable(data->clk);
-
-       for (i = 0; i < data->nr_pclks; i++)
-               clk_prepare_enable(data->pclks[i]);
-
-       samsung_clk_restore(data->ctx.reg_base, data->clk_save,
-                           data->nr_clk_save);
-
-       for (i = 0; i < data->nr_pclks; i++)
-               clk_disable_unprepare(data->pclks[i]);
-
-       return 0;
-}
-
 static int __init exynos5433_cmu_probe(struct platform_device *pdev)
 {
-       const struct samsung_cmu_info *info;
-       struct exynos5433_cmu_data *data;
-       struct samsung_clk_provider *ctx;
-       struct device *dev = &pdev->dev;
-       void __iomem *reg_base;
-       int i;
-
-       info = of_device_get_match_data(dev);
-
-       data = devm_kzalloc(dev,
-                           struct_size(data, ctx.clk_data.hws, info->nr_clk_ids),
-                           GFP_KERNEL);
-       if (!data)
-               return -ENOMEM;
-       ctx = &data->ctx;
-
-       reg_base = devm_platform_ioremap_resource(pdev, 0);
-       if (IS_ERR(reg_base))
-               return PTR_ERR(reg_base);
-
-       for (i = 0; i < info->nr_clk_ids; ++i)
-               ctx->clk_data.hws[i] = ERR_PTR(-ENOENT);
-
-       ctx->clk_data.num = info->nr_clk_ids;
-       ctx->reg_base = reg_base;
-       ctx->dev = dev;
-       spin_lock_init(&ctx->lock);
-
-       data->clk_save = samsung_clk_alloc_reg_dump(info->clk_regs,
-                                                   info->nr_clk_regs);
-       if (!data->clk_save)
-               return -ENOMEM;
-       data->nr_clk_save = info->nr_clk_regs;
-       data->clk_suspend = info->suspend_regs;
-       data->nr_clk_suspend = info->nr_suspend_regs;
-       data->nr_pclks = of_clk_get_parent_count(dev->of_node);
-
-       if (data->nr_pclks > 0) {
-               data->pclks = devm_kcalloc(dev, sizeof(struct clk *),
-                                          data->nr_pclks, GFP_KERNEL);
-               if (!data->pclks) {
-                       kfree(data->clk_save);
-                       return -ENOMEM;
-               }
-               for (i = 0; i < data->nr_pclks; i++) {
-                       struct clk *clk = of_clk_get(dev->of_node, i);
-
-                       if (IS_ERR(clk)) {
-                               kfree(data->clk_save);
-                               while (--i >= 0)
-                                       clk_put(data->pclks[i]);
-                               return PTR_ERR(clk);
-                       }
-                       data->pclks[i] = clk;
-               }
-       }
-
-       if (info->clk_name)
-               data->clk = clk_get(dev, info->clk_name);
-       clk_prepare_enable(data->clk);
-
-       platform_set_drvdata(pdev, data);
-
-       /*
-        * Enable runtime PM here to allow the clock core using runtime PM
-        * for the registered clocks. Additionally, we increase the runtime
-        * PM usage count before registering the clocks, to prevent the
-        * clock core from runtime suspending the device.
-        */
-       pm_runtime_get_noresume(dev);
-       pm_runtime_set_active(dev);
-       pm_runtime_enable(dev);
-
-       if (info->pll_clks)
-               samsung_clk_register_pll(ctx, info->pll_clks, info->nr_pll_clks,
-                                        reg_base);
-       if (info->mux_clks)
-               samsung_clk_register_mux(ctx, info->mux_clks,
-                                        info->nr_mux_clks);
-       if (info->div_clks)
-               samsung_clk_register_div(ctx, info->div_clks,
-                                        info->nr_div_clks);
-       if (info->gate_clks)
-               samsung_clk_register_gate(ctx, info->gate_clks,
-                                         info->nr_gate_clks);
-       if (info->fixed_clks)
-               samsung_clk_register_fixed_rate(ctx, info->fixed_clks,
-                                               info->nr_fixed_clks);
-       if (info->fixed_factor_clks)
-               samsung_clk_register_fixed_factor(ctx, info->fixed_factor_clks,
-                                                 info->nr_fixed_factor_clks);
-
-       samsung_clk_of_add_provider(dev->of_node, ctx);
-       pm_runtime_put_sync(dev);
-
-       return 0;
+       return exynos_arm64_register_cmu_pm(pdev, false);
 }
 
 static const struct of_device_id exynos5433_cmu_of_match[] = {
@@ -5679,7 +5528,7 @@ static const struct of_device_id exynos5433_cmu_of_match[] = {
 };
 
 static const struct dev_pm_ops exynos5433_cmu_pm_ops = {
-       SET_RUNTIME_PM_OPS(exynos5433_cmu_suspend, exynos5433_cmu_resume,
+       SET_RUNTIME_PM_OPS(exynos_arm64_cmu_suspend, exynos_arm64_cmu_resume,
                           NULL)
        SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
                                     pm_runtime_force_resume)
index 541761e96aeb677d2abebfd86ef079ead45b15d1..98b23af7324d94efd77f2694c1176cd0b1fddcb4 100644 (file)
@@ -36,6 +36,7 @@
 #define CLK_CON_MUX_MUX_CLKCMU_CORE_MMC_EMBD   0x101c
 #define CLK_CON_MUX_MUX_CLKCMU_CORE_SSS                0x1020
 #define CLK_CON_MUX_MUX_CLKCMU_DPU             0x1034
+#define CLK_CON_MUX_MUX_CLKCMU_G3D_SWITCH      0x1038
 #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
@@ -57,6 +58,7 @@
 #define CLK_CON_DIV_CLKCMU_CORE_MMC_EMBD       0x1828
 #define CLK_CON_DIV_CLKCMU_CORE_SSS            0x182c
 #define CLK_CON_DIV_CLKCMU_DPU                 0x1840
+#define CLK_CON_DIV_CLKCMU_G3D_SWITCH          0x1844
 #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
@@ -84,6 +86,7 @@
 #define CLK_CON_GAT_GATE_CLKCMU_CORE_MMC_EMBD  0x2024
 #define CLK_CON_GAT_GATE_CLKCMU_CORE_SSS       0x2028
 #define CLK_CON_GAT_GATE_CLKCMU_DPU            0x203c
+#define CLK_CON_GAT_GATE_CLKCMU_G3D_SWITCH     0x2040
 #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
@@ -116,6 +119,7 @@ static const unsigned long top_clk_regs[] __initconst = {
        CLK_CON_MUX_MUX_CLKCMU_CORE_MMC_EMBD,
        CLK_CON_MUX_MUX_CLKCMU_CORE_SSS,
        CLK_CON_MUX_MUX_CLKCMU_DPU,
+       CLK_CON_MUX_MUX_CLKCMU_G3D_SWITCH,
        CLK_CON_MUX_MUX_CLKCMU_HSI_BUS,
        CLK_CON_MUX_MUX_CLKCMU_HSI_MMC_CARD,
        CLK_CON_MUX_MUX_CLKCMU_HSI_USB20DRD,
@@ -137,6 +141,7 @@ static const unsigned long top_clk_regs[] __initconst = {
        CLK_CON_DIV_CLKCMU_CORE_MMC_EMBD,
        CLK_CON_DIV_CLKCMU_CORE_SSS,
        CLK_CON_DIV_CLKCMU_DPU,
+       CLK_CON_DIV_CLKCMU_G3D_SWITCH,
        CLK_CON_DIV_CLKCMU_HSI_BUS,
        CLK_CON_DIV_CLKCMU_HSI_MMC_CARD,
        CLK_CON_DIV_CLKCMU_HSI_USB20DRD,
@@ -164,6 +169,7 @@ static const unsigned long top_clk_regs[] __initconst = {
        CLK_CON_GAT_GATE_CLKCMU_CORE_MMC_EMBD,
        CLK_CON_GAT_GATE_CLKCMU_CORE_SSS,
        CLK_CON_GAT_GATE_CLKCMU_DPU,
+       CLK_CON_GAT_GATE_CLKCMU_G3D_SWITCH,
        CLK_CON_GAT_GATE_CLKCMU_HSI_BUS,
        CLK_CON_GAT_GATE_CLKCMU_HSI_MMC_CARD,
        CLK_CON_GAT_GATE_CLKCMU_HSI_USB20DRD,
@@ -216,6 +222,9 @@ PNAME(mout_core_mmc_embd_p) = { "oscclk", "dout_shared0_div2",
                                    "oscclk", "oscclk" };
 PNAME(mout_core_sss_p)         = { "dout_shared0_div3", "dout_shared1_div3",
                                    "dout_shared0_div4", "dout_shared1_div4" };
+/* List of parent clocks for Muxes in CMU_TOP: for CMU_G3D */
+PNAME(mout_g3d_switch_p)       = { "dout_shared0_div2", "dout_shared1_div2",
+                                   "dout_shared0_div3", "dout_shared1_div3" };
 /* List of parent clocks for Muxes in CMU_TOP: for CMU_HSI */
 PNAME(mout_hsi_bus_p)          = { "dout_shared0_div2", "dout_shared1_div2" };
 PNAME(mout_hsi_mmc_card_p)     = { "oscclk", "dout_shared0_div2",
@@ -283,6 +292,10 @@ static const struct samsung_mux_clock top_mux_clks[] __initconst = {
        MUX(CLK_MOUT_DPU, "mout_dpu", mout_dpu_p,
            CLK_CON_MUX_MUX_CLKCMU_DPU, 0, 2),
 
+       /* G3D */
+       MUX(CLK_MOUT_G3D_SWITCH, "mout_g3d_switch", mout_g3d_switch_p,
+           CLK_CON_MUX_MUX_CLKCMU_G3D_SWITCH, 0, 2),
+
        /* HSI */
        MUX(CLK_MOUT_HSI_BUS, "mout_hsi_bus", mout_hsi_bus_p,
            CLK_CON_MUX_MUX_CLKCMU_HSI_BUS, 0, 1),
@@ -357,6 +370,10 @@ static const struct samsung_div_clock top_div_clks[] __initconst = {
        DIV(CLK_DOUT_DPU, "dout_dpu", "gout_dpu",
            CLK_CON_DIV_CLKCMU_DPU, 0, 4),
 
+       /* G3D */
+       DIV(CLK_DOUT_G3D_SWITCH, "dout_g3d_switch", "gout_g3d_switch",
+           CLK_CON_DIV_CLKCMU_G3D_SWITCH, 0, 3),
+
        /* HSI */
        DIV(CLK_DOUT_HSI_BUS, "dout_hsi_bus", "gout_hsi_bus",
            CLK_CON_DIV_CLKCMU_HSI_BUS, 0, 4),
@@ -417,6 +434,10 @@ static const struct samsung_gate_clock top_gate_clks[] __initconst = {
        GATE(CLK_GOUT_DPU, "gout_dpu", "mout_dpu",
             CLK_CON_GAT_GATE_CLKCMU_DPU, 21, 0, 0),
 
+       /* G3D */
+       GATE(CLK_GOUT_G3D_SWITCH, "gout_g3d_switch", "mout_g3d_switch",
+            CLK_CON_GAT_GATE_CLKCMU_G3D_SWITCH, 21, 0, 0),
+
        /* HSI */
        GATE(CLK_GOUT_HSI_BUS, "gout_hsi_bus", "mout_hsi_bus",
             CLK_CON_GAT_GATE_CLKCMU_HSI_BUS, 21, 0, 0),
@@ -591,7 +612,7 @@ static const struct samsung_gate_clock apm_gate_clks[] __initconst = {
             CLK_CON_GAT_GOUT_APM_APBIF_GPIO_ALIVE_PCLK, 21, CLK_IGNORE_UNUSED,
             0),
        GATE(CLK_GOUT_PMU_ALIVE_PCLK, "gout_pmu_alive_pclk", "dout_apm_bus",
-            CLK_CON_GAT_GOUT_APM_APBIF_PMU_ALIVE_PCLK, 21, 0, 0),
+            CLK_CON_GAT_GOUT_APM_APBIF_PMU_ALIVE_PCLK, 21, CLK_IS_CRITICAL, 0),
        GATE(CLK_GOUT_SYSREG_APM_PCLK, "gout_sysreg_apm_pclk", "dout_apm_bus",
             CLK_CON_GAT_GOUT_APM_SYSREG_APM_PCLK, 21, 0, 0),
 };
@@ -653,6 +674,7 @@ static const struct samsung_cmu_info apm_cmu_info __initconst = {
 #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_CLK_AUD_CMU_AUD_PCLK       0x2020
 #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
@@ -708,6 +730,7 @@ static const unsigned long aud_clk_regs[] __initconst = {
        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_CLK_AUD_CMU_AUD_PCLK,
        CLK_CON_GAT_GOUT_AUD_ABOX_ACLK,
        CLK_CON_GAT_GOUT_AUD_ABOX_BCLK_SPDY,
        CLK_CON_GAT_GOUT_AUD_ABOX_CCLK_ASB,
@@ -827,6 +850,9 @@ static const struct samsung_div_clock aud_div_clks[] __initconst = {
 };
 
 static const struct samsung_gate_clock aud_gate_clks[] __initconst = {
+       GATE(CLK_GOUT_AUD_CMU_AUD_PCLK, "gout_aud_cmu_aud_pclk",
+            "dout_aud_busd",
+            CLK_CON_GAT_CLK_AUD_CMU_AUD_PCLK, 21, CLK_IGNORE_UNUSED, 0),
        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",
@@ -992,6 +1018,102 @@ static const struct samsung_cmu_info cmgp_cmu_info __initconst = {
        .clk_name               = "gout_clkcmu_cmgp_bus",
 };
 
+/* ---- CMU_G3D ------------------------------------------------------------- */
+
+/* Register Offset definitions for CMU_G3D (0x11400000) */
+#define PLL_LOCKTIME_PLL_G3D                   0x0000
+#define PLL_CON0_PLL_G3D                       0x0100
+#define PLL_CON3_PLL_G3D                       0x010c
+#define PLL_CON0_MUX_CLKCMU_G3D_SWITCH_USER    0x0600
+#define CLK_CON_MUX_MUX_CLK_G3D_BUSD           0x1000
+#define CLK_CON_DIV_DIV_CLK_G3D_BUSP           0x1804
+#define CLK_CON_GAT_CLK_G3D_CMU_G3D_PCLK       0x2000
+#define CLK_CON_GAT_CLK_G3D_GPU_CLK            0x2004
+#define CLK_CON_GAT_GOUT_G3D_TZPC_PCLK         0x200c
+#define CLK_CON_GAT_GOUT_G3D_GRAY2BIN_CLK      0x2010
+#define CLK_CON_GAT_GOUT_G3D_BUSD_CLK          0x2024
+#define CLK_CON_GAT_GOUT_G3D_BUSP_CLK          0x2028
+#define CLK_CON_GAT_GOUT_G3D_SYSREG_PCLK       0x202c
+
+static const unsigned long g3d_clk_regs[] __initconst = {
+       PLL_LOCKTIME_PLL_G3D,
+       PLL_CON0_PLL_G3D,
+       PLL_CON3_PLL_G3D,
+       PLL_CON0_MUX_CLKCMU_G3D_SWITCH_USER,
+       CLK_CON_MUX_MUX_CLK_G3D_BUSD,
+       CLK_CON_DIV_DIV_CLK_G3D_BUSP,
+       CLK_CON_GAT_CLK_G3D_CMU_G3D_PCLK,
+       CLK_CON_GAT_CLK_G3D_GPU_CLK,
+       CLK_CON_GAT_GOUT_G3D_TZPC_PCLK,
+       CLK_CON_GAT_GOUT_G3D_GRAY2BIN_CLK,
+       CLK_CON_GAT_GOUT_G3D_BUSD_CLK,
+       CLK_CON_GAT_GOUT_G3D_BUSP_CLK,
+       CLK_CON_GAT_GOUT_G3D_SYSREG_PCLK,
+};
+
+/* List of parent clocks for Muxes in CMU_G3D */
+PNAME(mout_g3d_pll_p)          = { "oscclk", "fout_g3d_pll" };
+PNAME(mout_g3d_switch_user_p)  = { "oscclk", "dout_g3d_switch" };
+PNAME(mout_g3d_busd_p)         = { "mout_g3d_pll", "mout_g3d_switch_user" };
+
+/*
+ * Do not provide PLL table to PLL_G3D, 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 g3d_pll_clks[] __initconst = {
+       PLL(pll_0818x, CLK_FOUT_G3D_PLL, "fout_g3d_pll", "oscclk",
+           PLL_LOCKTIME_PLL_G3D, PLL_CON3_PLL_G3D, NULL),
+};
+
+static const struct samsung_mux_clock g3d_mux_clks[] __initconst = {
+       MUX(CLK_MOUT_G3D_PLL, "mout_g3d_pll", mout_g3d_pll_p,
+           PLL_CON0_PLL_G3D, 4, 1),
+       MUX(CLK_MOUT_G3D_SWITCH_USER, "mout_g3d_switch_user",
+           mout_g3d_switch_user_p,
+           PLL_CON0_MUX_CLKCMU_G3D_SWITCH_USER, 4, 1),
+       MUX(CLK_MOUT_G3D_BUSD, "mout_g3d_busd", mout_g3d_busd_p,
+           CLK_CON_MUX_MUX_CLK_G3D_BUSD, 0, 1),
+};
+
+static const struct samsung_div_clock g3d_div_clks[] __initconst = {
+       DIV(CLK_DOUT_G3D_BUSP, "dout_g3d_busp", "mout_g3d_busd",
+           CLK_CON_DIV_DIV_CLK_G3D_BUSP, 0, 3),
+};
+
+static const struct samsung_gate_clock g3d_gate_clks[] __initconst = {
+       GATE(CLK_GOUT_G3D_CMU_G3D_PCLK, "gout_g3d_cmu_g3d_pclk",
+            "dout_g3d_busp",
+            CLK_CON_GAT_CLK_G3D_CMU_G3D_PCLK, 21, CLK_IGNORE_UNUSED, 0),
+       GATE(CLK_GOUT_G3D_GPU_CLK, "gout_g3d_gpu_clk", "mout_g3d_busd",
+            CLK_CON_GAT_CLK_G3D_GPU_CLK, 21, 0, 0),
+       GATE(CLK_GOUT_G3D_TZPC_PCLK, "gout_g3d_tzpc_pclk", "dout_g3d_busp",
+            CLK_CON_GAT_GOUT_G3D_TZPC_PCLK, 21, 0, 0),
+       GATE(CLK_GOUT_G3D_GRAY2BIN_CLK, "gout_g3d_gray2bin_clk",
+            "mout_g3d_busd",
+            CLK_CON_GAT_GOUT_G3D_GRAY2BIN_CLK, 21, 0, 0),
+       GATE(CLK_GOUT_G3D_BUSD_CLK, "gout_g3d_busd_clk", "mout_g3d_busd",
+            CLK_CON_GAT_GOUT_G3D_BUSD_CLK, 21, 0, 0),
+       GATE(CLK_GOUT_G3D_BUSP_CLK, "gout_g3d_busp_clk", "dout_g3d_busp",
+            CLK_CON_GAT_GOUT_G3D_BUSP_CLK, 21, 0, 0),
+       GATE(CLK_GOUT_G3D_SYSREG_PCLK, "gout_g3d_sysreg_pclk", "dout_g3d_busp",
+            CLK_CON_GAT_GOUT_G3D_SYSREG_PCLK, 21, 0, 0),
+};
+
+static const struct samsung_cmu_info g3d_cmu_info __initconst = {
+       .pll_clks               = g3d_pll_clks,
+       .nr_pll_clks            = ARRAY_SIZE(g3d_pll_clks),
+       .mux_clks               = g3d_mux_clks,
+       .nr_mux_clks            = ARRAY_SIZE(g3d_mux_clks),
+       .div_clks               = g3d_div_clks,
+       .nr_div_clks            = ARRAY_SIZE(g3d_div_clks),
+       .gate_clks              = g3d_gate_clks,
+       .nr_gate_clks           = ARRAY_SIZE(g3d_gate_clks),
+       .nr_clk_ids             = G3D_NR_CLK,
+       .clk_regs               = g3d_clk_regs,
+       .nr_clk_regs            = ARRAY_SIZE(g3d_clk_regs),
+       .clk_name               = "dout_g3d_switch",
+};
+
 /* ---- CMU_HSI ------------------------------------------------------------- */
 
 /* Register Offset definitions for CMU_HSI (0x13400000) */
@@ -999,12 +1121,15 @@ static const struct samsung_cmu_info cmgp_cmu_info __initconst = {
 #define PLL_CON0_MUX_CLKCMU_HSI_MMC_CARD_USER                  0x0610
 #define PLL_CON0_MUX_CLKCMU_HSI_USB20DRD_USER                  0x0620
 #define CLK_CON_MUX_MUX_CLK_HSI_RTC                            0x1000
+#define CLK_CON_GAT_CLK_HSI_CMU_HSI_PCLK                       0x2000
 #define CLK_CON_GAT_HSI_USB20DRD_TOP_I_RTC_CLK__ALV            0x2008
 #define CLK_CON_GAT_HSI_USB20DRD_TOP_I_REF_CLK_50              0x200c
 #define CLK_CON_GAT_HSI_USB20DRD_TOP_I_PHY_REFCLK_26           0x2010
 #define CLK_CON_GAT_GOUT_HSI_GPIO_HSI_PCLK                     0x2018
 #define CLK_CON_GAT_GOUT_HSI_MMC_CARD_I_ACLK                   0x2024
 #define CLK_CON_GAT_GOUT_HSI_MMC_CARD_SDCLKIN                  0x2028
+#define CLK_CON_GAT_GOUT_HSI_PPMU_ACLK                         0x202c
+#define CLK_CON_GAT_GOUT_HSI_PPMU_PCLK                         0x2030
 #define CLK_CON_GAT_GOUT_HSI_SYSREG_HSI_PCLK                   0x2038
 #define CLK_CON_GAT_GOUT_HSI_USB20DRD_TOP_ACLK_PHYCTRL_20      0x203c
 #define CLK_CON_GAT_GOUT_HSI_USB20DRD_TOP_BUS_CLK_EARLY                0x2040
@@ -1014,12 +1139,15 @@ static const unsigned long hsi_clk_regs[] __initconst = {
        PLL_CON0_MUX_CLKCMU_HSI_MMC_CARD_USER,
        PLL_CON0_MUX_CLKCMU_HSI_USB20DRD_USER,
        CLK_CON_MUX_MUX_CLK_HSI_RTC,
+       CLK_CON_GAT_CLK_HSI_CMU_HSI_PCLK,
        CLK_CON_GAT_HSI_USB20DRD_TOP_I_RTC_CLK__ALV,
        CLK_CON_GAT_HSI_USB20DRD_TOP_I_REF_CLK_50,
        CLK_CON_GAT_HSI_USB20DRD_TOP_I_PHY_REFCLK_26,
        CLK_CON_GAT_GOUT_HSI_GPIO_HSI_PCLK,
        CLK_CON_GAT_GOUT_HSI_MMC_CARD_I_ACLK,
        CLK_CON_GAT_GOUT_HSI_MMC_CARD_SDCLKIN,
+       CLK_CON_GAT_GOUT_HSI_PPMU_ACLK,
+       CLK_CON_GAT_GOUT_HSI_PPMU_PCLK,
        CLK_CON_GAT_GOUT_HSI_SYSREG_HSI_PCLK,
        CLK_CON_GAT_GOUT_HSI_USB20DRD_TOP_ACLK_PHYCTRL_20,
        CLK_CON_GAT_GOUT_HSI_USB20DRD_TOP_BUS_CLK_EARLY,
@@ -1045,6 +1173,10 @@ static const struct samsung_mux_clock hsi_mux_clks[] __initconst = {
 };
 
 static const struct samsung_gate_clock hsi_gate_clks[] __initconst = {
+       /* TODO: Should be enabled in corresponding driver */
+       GATE(CLK_GOUT_HSI_CMU_HSI_PCLK, "gout_hsi_cmu_hsi_pclk",
+            "mout_hsi_bus_user",
+            CLK_CON_GAT_CLK_HSI_CMU_HSI_PCLK, 21, CLK_IGNORE_UNUSED, 0),
        GATE(CLK_GOUT_USB_RTC_CLK, "gout_usb_rtc", "mout_hsi_rtc",
             CLK_CON_GAT_HSI_USB20DRD_TOP_I_RTC_CLK__ALV, 21, 0, 0),
        GATE(CLK_GOUT_USB_REF_CLK, "gout_usb_ref", "mout_hsi_usb20drd_user",
@@ -1059,6 +1191,10 @@ static const struct samsung_gate_clock hsi_gate_clks[] __initconst = {
        GATE(CLK_GOUT_MMC_CARD_SDCLKIN, "gout_mmc_card_sdclkin",
             "mout_hsi_mmc_card_user",
             CLK_CON_GAT_GOUT_HSI_MMC_CARD_SDCLKIN, 21, CLK_SET_RATE_PARENT, 0),
+       GATE(CLK_GOUT_HSI_PPMU_ACLK, "gout_hsi_ppmu_aclk", "mout_hsi_bus_user",
+            CLK_CON_GAT_GOUT_HSI_PPMU_ACLK, 21, 0, 0),
+       GATE(CLK_GOUT_HSI_PPMU_PCLK, "gout_hsi_ppmu_pclk", "mout_hsi_bus_user",
+            CLK_CON_GAT_GOUT_HSI_PPMU_PCLK, 21, 0, 0),
        GATE(CLK_GOUT_SYSREG_HSI_PCLK, "gout_sysreg_hsi_pclk",
             "mout_hsi_bus_user",
             CLK_CON_GAT_GOUT_HSI_SYSREG_HSI_PCLK, 21, 0, 0),
@@ -1700,6 +1836,9 @@ static const struct of_device_id exynos850_cmu_of_match[] = {
        }, {
                .compatible = "samsung,exynos850-cmu-cmgp",
                .data = &cmgp_cmu_info,
+       }, {
+               .compatible = "samsung,exynos850-cmu-g3d",
+               .data = &g3d_cmu_info,
        }, {
                .compatible = "samsung,exynos850-cmu-hsi",
                .data = &hsi_cmu_info,
index df7812371d709c6d09706ef59ef462d69e9a27b0..74934c6182cea93ac6d183554646295b82da7c52 100644 (file)
@@ -1259,8 +1259,7 @@ static const struct clk_ops samsung_pll2650xx_clk_min_ops = {
 };
 
 static void __init _samsung_clk_register_pll(struct samsung_clk_provider *ctx,
-                               const struct samsung_pll_clock *pll_clk,
-                               void __iomem *base)
+                               const struct samsung_pll_clock *pll_clk)
 {
        struct samsung_clk_pll *pll;
        struct clk_init_data init;
@@ -1315,6 +1314,7 @@ static void __init _samsung_clk_register_pll(struct samsung_clk_provider *ctx,
                        init.ops = &samsung_pll35xx_clk_ops;
                break;
        case pll_1417x:
+       case pll_0818x:
        case pll_0822x:
                pll->enable_offs = PLL0822X_ENABLE_SHIFT;
                pll->lock_offs = PLL0822X_LOCK_STAT_SHIFT;
@@ -1395,8 +1395,8 @@ static void __init _samsung_clk_register_pll(struct samsung_clk_provider *ctx,
 
        pll->hw.init = &init;
        pll->type = pll_clk->type;
-       pll->lock_reg = base + pll_clk->lock_offset;
-       pll->con_reg = base + pll_clk->con_offset;
+       pll->lock_reg = ctx->reg_base + pll_clk->lock_offset;
+       pll->con_reg = ctx->reg_base + pll_clk->con_offset;
 
        ret = clk_hw_register(ctx->dev, &pll->hw);
        if (ret) {
@@ -1412,10 +1412,10 @@ static void __init _samsung_clk_register_pll(struct samsung_clk_provider *ctx,
 
 void __init samsung_clk_register_pll(struct samsung_clk_provider *ctx,
                        const struct samsung_pll_clock *pll_list,
-                       unsigned int nr_pll, void __iomem *base)
+                       unsigned int nr_pll)
 {
        int cnt;
 
        for (cnt = 0; cnt < nr_pll; cnt++)
-               _samsung_clk_register_pll(ctx, &pll_list[cnt], base);
+               _samsung_clk_register_pll(ctx, &pll_list[cnt]);
 }
index 5d5a58d40e7e98a2e56e17b7f5f5cc9f51912aec..0725d485c6eecd692bce2261600da035746098ab 100644 (file)
@@ -34,6 +34,7 @@ enum samsung_pll_type {
        pll_1451x,
        pll_1452x,
        pll_1460x,
+       pll_0818x,
        pll_0822x,
        pll_0831x,
        pll_142xx,
index d6b432a26d6391d240c1d646e29af1fd5e5e601d..d27a1f73f077e31ff7a42d8dbdade6ab1f373fb1 100644 (file)
@@ -405,7 +405,7 @@ void __init s3c64xx_clk_init(struct device_node *np, unsigned long xtal_f,
                        panic("%s: failed to map registers\n", __func__);
        }
 
-       ctx = samsung_clk_init(np, reg_base, NR_CLKS);
+       ctx = samsung_clk_init(NULL, reg_base, NR_CLKS);
        hws = ctx->clk_data.hws;
 
        /* Register external clocks. */
@@ -414,7 +414,7 @@ void __init s3c64xx_clk_init(struct device_node *np, unsigned long xtal_f,
 
        /* Register PLLs. */
        samsung_clk_register_pll(ctx, s3c64xx_pll_clks,
-                               ARRAY_SIZE(s3c64xx_pll_clks), reg_base);
+                               ARRAY_SIZE(s3c64xx_pll_clks));
 
        /* Register common internal clocks. */
        samsung_clk_register_fixed_rate(ctx, s3c64xx_fixed_rate_clks,
index 4425186bdcab56512423575c61f7b02283a391a8..cd85342e4ddbe28538d9f30e88c490089adc5e2c 100644 (file)
@@ -743,7 +743,7 @@ static void __init __s5pv210_clk_init(struct device_node *np,
        struct samsung_clk_provider *ctx;
        struct clk_hw **hws;
 
-       ctx = samsung_clk_init(np, reg_base, NR_CLKS);
+       ctx = samsung_clk_init(NULL, reg_base, NR_CLKS);
        hws = ctx->clk_data.hws;
 
        samsung_clk_register_mux(ctx, early_mux_clks,
@@ -753,7 +753,7 @@ static void __init __s5pv210_clk_init(struct device_node *np,
                samsung_clk_register_fixed_rate(ctx, s5p6442_frate_clks,
                        ARRAY_SIZE(s5p6442_frate_clks));
                samsung_clk_register_pll(ctx, s5p6442_pll_clks,
-                       ARRAY_SIZE(s5p6442_pll_clks), reg_base);
+                       ARRAY_SIZE(s5p6442_pll_clks));
                samsung_clk_register_mux(ctx, s5p6442_mux_clks,
                                ARRAY_SIZE(s5p6442_mux_clks));
                samsung_clk_register_div(ctx, s5p6442_div_clks,
@@ -764,7 +764,7 @@ static void __init __s5pv210_clk_init(struct device_node *np,
                samsung_clk_register_fixed_rate(ctx, s5pv210_frate_clks,
                        ARRAY_SIZE(s5pv210_frate_clks));
                samsung_clk_register_pll(ctx, s5pv210_pll_clks,
-                       ARRAY_SIZE(s5pv210_pll_clks), reg_base);
+                       ARRAY_SIZE(s5pv210_pll_clks));
                samsung_clk_register_mux(ctx, s5pv210_mux_clks,
                                ARRAY_SIZE(s5pv210_mux_clks));
                samsung_clk_register_div(ctx, s5pv210_div_clks,
index bca4731b14ea59e9f1e5eb4cf118d9fcb49aaf63..b6701905f25461934d60173e43756d96ab44ea47 100644 (file)
@@ -53,8 +53,18 @@ struct samsung_clk_reg_dump *samsung_clk_alloc_reg_dump(
        return rd;
 }
 
-/* setup the essentials required to support clock lookup using ccf */
-struct samsung_clk_provider *__init samsung_clk_init(struct device_node *np,
+/**
+ * samsung_clk_init() - Create and initialize a clock provider object
+ * @dev:       CMU device to enable runtime PM, or NULL if RPM is not needed
+ * @base:      Start address (mapped) of CMU registers
+ * @nr_clks:   Total clock count to allocate in clock provider object
+ *
+ * Setup the essentials required to support clock lookup using Common Clock
+ * Framework.
+ *
+ * Return: Allocated and initialized clock provider object.
+ */
+struct samsung_clk_provider * __init samsung_clk_init(struct device *dev,
                        void __iomem *base, unsigned long nr_clks)
 {
        struct samsung_clk_provider *ctx;
@@ -67,6 +77,7 @@ struct samsung_clk_provider *__init samsung_clk_init(struct device_node *np,
        for (i = 0; i < nr_clks; ++i)
                ctx->clk_data.hws[i] = ERR_PTR(-ENOENT);
 
+       ctx->dev = dev;
        ctx->reg_base = base;
        ctx->clk_data.num = nr_clks;
        spin_lock_init(&ctx->lock);
@@ -324,6 +335,33 @@ void samsung_clk_extended_sleep_init(void __iomem *reg_base,
 }
 #endif
 
+/**
+ * samsung_cmu_register_clocks() - Register all clocks provided in CMU object
+ * @ctx: Clock provider object
+ * @cmu: CMU object with clocks to register
+ */
+void __init samsung_cmu_register_clocks(struct samsung_clk_provider *ctx,
+                                       const struct samsung_cmu_info *cmu)
+{
+       if (cmu->pll_clks)
+               samsung_clk_register_pll(ctx, cmu->pll_clks, cmu->nr_pll_clks);
+       if (cmu->mux_clks)
+               samsung_clk_register_mux(ctx, cmu->mux_clks, cmu->nr_mux_clks);
+       if (cmu->div_clks)
+               samsung_clk_register_div(ctx, cmu->div_clks, cmu->nr_div_clks);
+       if (cmu->gate_clks)
+               samsung_clk_register_gate(ctx, cmu->gate_clks,
+                                         cmu->nr_gate_clks);
+       if (cmu->fixed_clks)
+               samsung_clk_register_fixed_rate(ctx, cmu->fixed_clks,
+                                               cmu->nr_fixed_clks);
+       if (cmu->fixed_factor_clks)
+               samsung_clk_register_fixed_factor(ctx, cmu->fixed_factor_clks,
+                                                 cmu->nr_fixed_factor_clks);
+       if (cmu->cpu_clks)
+               samsung_clk_register_cpu(ctx, cmu->cpu_clks, cmu->nr_cpu_clks);
+}
+
 /*
  * Common function which registers plls, muxes, dividers and gates
  * for each CMU. It also add CMU register list to register cache.
@@ -341,31 +379,13 @@ struct samsung_clk_provider * __init samsung_cmu_register_one(
                return NULL;
        }
 
-       ctx = samsung_clk_init(np, reg_base, cmu->nr_clk_ids);
+       ctx = samsung_clk_init(NULL, reg_base, cmu->nr_clk_ids);
+       samsung_cmu_register_clocks(ctx, cmu);
 
-       if (cmu->pll_clks)
-               samsung_clk_register_pll(ctx, cmu->pll_clks, cmu->nr_pll_clks,
-                       reg_base);
-       if (cmu->mux_clks)
-               samsung_clk_register_mux(ctx, cmu->mux_clks,
-                       cmu->nr_mux_clks);
-       if (cmu->div_clks)
-               samsung_clk_register_div(ctx, cmu->div_clks, cmu->nr_div_clks);
-       if (cmu->gate_clks)
-               samsung_clk_register_gate(ctx, cmu->gate_clks,
-                       cmu->nr_gate_clks);
-       if (cmu->fixed_clks)
-               samsung_clk_register_fixed_rate(ctx, cmu->fixed_clks,
-                       cmu->nr_fixed_clks);
-       if (cmu->fixed_factor_clks)
-               samsung_clk_register_fixed_factor(ctx, cmu->fixed_factor_clks,
-                       cmu->nr_fixed_factor_clks);
        if (cmu->clk_regs)
                samsung_clk_extended_sleep_init(reg_base,
                        cmu->clk_regs, cmu->nr_clk_regs,
                        cmu->suspend_regs, cmu->nr_suspend_regs);
-       if (cmu->cpu_clks)
-               samsung_clk_register_cpu(ctx, cmu->cpu_clks, cmu->nr_cpu_clks);
 
        samsung_clk_of_add_provider(np, ctx);
 
index b46e83a2581f4e5b07ee34f08753d48fdfa64a6d..ab9c3d7a25b3d6514afda12a1cf722d44daf4df4 100644 (file)
@@ -16,6 +16,7 @@
 /**
  * struct samsung_clk_provider: information about clock provider
  * @reg_base: virtual address for the register base.
+ * @dev: clock provider device needed for runtime PM.
  * @lock: maintains exclusion between callbacks for a given clock-provider.
  * @clk_data: holds clock related data like clk_hw* and number of clocks.
  */
@@ -337,9 +338,8 @@ struct samsung_cmu_info {
        const char *clk_name;
 };
 
-struct samsung_clk_provider * samsung_clk_init(
-                       struct device_node *np, void __iomem *base,
-                       unsigned long nr_clks);
+struct samsung_clk_provider *samsung_clk_init(struct device *dev,
+                       void __iomem *base, unsigned long nr_clks);
 void samsung_clk_of_add_provider(struct device_node *np,
                        struct samsung_clk_provider *ctx);
 void samsung_clk_of_register_fixed_ext(
@@ -373,10 +373,12 @@ void samsung_clk_register_gate(struct samsung_clk_provider *ctx,
                        unsigned int nr_clk);
 void samsung_clk_register_pll(struct samsung_clk_provider *ctx,
                        const struct samsung_pll_clock *pll_list,
-                       unsigned int nr_clk, void __iomem *base);
+                       unsigned int nr_clk);
 void samsung_clk_register_cpu(struct samsung_clk_provider *ctx,
                const struct samsung_cpu_clock *list, unsigned int nr_clk);
 
+void samsung_cmu_register_clocks(struct samsung_clk_provider *ctx,
+                                const struct samsung_cmu_info *cmu);
 struct samsung_clk_provider *samsung_cmu_register_one(
                        struct device_node *,
                        const struct samsung_cmu_info *);
index 88d5289883d38361a1250d0856e035705134a890..afacba338c9123b196c2f907f4f70d07abab9d3a 100644 (file)
 #define CLK_DOUT_MFCMSCL_M2M           73
 #define CLK_DOUT_MFCMSCL_MCSC          74
 #define CLK_DOUT_MFCMSCL_JPEG          75
-#define TOP_NR_CLK                     76
+#define CLK_MOUT_G3D_SWITCH            76
+#define CLK_GOUT_G3D_SWITCH            77
+#define CLK_DOUT_G3D_SWITCH            78
+#define TOP_NR_CLK                     79
 
 /* CMU_APM */
 #define CLK_RCO_I3C_PMIC               1
 #define IOCLK_AUDIOCDCLK5              58
 #define IOCLK_AUDIOCDCLK6              59
 #define TICK_USB                       60
-#define AUD_NR_CLK                     61
+#define CLK_GOUT_AUD_CMU_AUD_PCLK      61
+#define AUD_NR_CLK                     62
 
 /* CMU_CMGP */
 #define CLK_RCO_CMGP                   1
 #define CLK_GOUT_SYSREG_CMGP_PCLK      15
 #define CMGP_NR_CLK                    16
 
+/* CMU_G3D */
+#define CLK_FOUT_G3D_PLL               1
+#define CLK_MOUT_G3D_PLL               2
+#define CLK_MOUT_G3D_SWITCH_USER       3
+#define CLK_MOUT_G3D_BUSD              4
+#define CLK_DOUT_G3D_BUSP              5
+#define CLK_GOUT_G3D_CMU_G3D_PCLK      6
+#define CLK_GOUT_G3D_GPU_CLK           7
+#define CLK_GOUT_G3D_TZPC_PCLK         8
+#define CLK_GOUT_G3D_GRAY2BIN_CLK      9
+#define CLK_GOUT_G3D_BUSD_CLK          10
+#define CLK_GOUT_G3D_BUSP_CLK          11
+#define CLK_GOUT_G3D_SYSREG_PCLK       12
+#define G3D_NR_CLK                     13
+
 /* CMU_HSI */
 #define CLK_MOUT_HSI_BUS_USER          1
 #define CLK_MOUT_HSI_MMC_CARD_USER     2
 #define CLK_GOUT_MMC_CARD_ACLK         11
 #define CLK_GOUT_MMC_CARD_SDCLKIN      12
 #define CLK_GOUT_SYSREG_HSI_PCLK       13
-#define HSI_NR_CLK                     14
+#define CLK_GOUT_HSI_PPMU_ACLK         14
+#define CLK_GOUT_HSI_PPMU_PCLK         15
+#define CLK_GOUT_HSI_CMU_HSI_PCLK      16
+#define HSI_NR_CLK                     17
 
 /* CMU_IS */
 #define CLK_MOUT_IS_BUS_USER           1
index 1db513d6b3eee35f96289fb4d4a4c2e79e04af65..cb687949be41fd204e351683cebc41d9e3980ea0 100644 (file)
 #define DISP_CC_XO_CLK                         19
 #define DISP_CC_XO_CLK_SRC                     20
 
+/* GDSCs */
 #define MDSS_GDSC                              0
 
+/* Resets */
+#define DISP_CC_MDSS_CORE_BCR                  0
+
 #endif
diff --git a/include/dt-bindings/clock/qcom,gcc-msm8917.h b/include/dt-bindings/clock/qcom,gcc-msm8917.h
new file mode 100644 (file)
index 0000000..a371b1a
--- /dev/null
@@ -0,0 +1,190 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+
+#ifndef _DT_BINDINGS_CLK_MSM_GCC_8917_H
+#define _DT_BINDINGS_CLK_MSM_GCC_8917_H
+
+/* Clocks */
+#define APSS_AHB_CLK_SRC                       0
+#define BLSP1_QUP2_I2C_APPS_CLK_SRC            1
+#define BLSP1_QUP2_SPI_APPS_CLK_SRC            2
+#define BLSP1_QUP3_I2C_APPS_CLK_SRC            3
+#define BLSP1_QUP3_SPI_APPS_CLK_SRC            4
+#define BLSP1_QUP4_I2C_APPS_CLK_SRC            5
+#define BLSP1_QUP4_SPI_APPS_CLK_SRC            6
+#define BLSP1_UART1_APPS_CLK_SRC               7
+#define BLSP1_UART2_APPS_CLK_SRC               8
+#define BLSP2_QUP1_I2C_APPS_CLK_SRC            9
+#define BLSP2_QUP1_SPI_APPS_CLK_SRC            10
+#define BLSP2_QUP2_I2C_APPS_CLK_SRC            11
+#define BLSP2_QUP2_SPI_APPS_CLK_SRC            12
+#define BLSP2_QUP3_I2C_APPS_CLK_SRC            13
+#define BLSP2_QUP3_SPI_APPS_CLK_SRC            14
+#define BLSP2_UART1_APPS_CLK_SRC               15
+#define BLSP2_UART2_APPS_CLK_SRC               16
+#define BYTE0_CLK_SRC                          17
+#define CAMSS_GP0_CLK_SRC                      18
+#define CAMSS_GP1_CLK_SRC                      19
+#define CAMSS_TOP_AHB_CLK_SRC                  20
+#define CCI_CLK_SRC                            21
+#define CPP_CLK_SRC                            22
+#define CRYPTO_CLK_SRC                         23
+#define CSI0PHYTIMER_CLK_SRC                   24
+#define CSI0_CLK_SRC                           25
+#define CSI1PHYTIMER_CLK_SRC                   26
+#define CSI1_CLK_SRC                           27
+#define CSI2_CLK_SRC                           28
+#define ESC0_CLK_SRC                           29
+#define GCC_APSS_TCU_CLK                       30
+#define GCC_BIMC_GFX_CLK                       31
+#define GCC_BIMC_GPU_CLK                       32
+#define GCC_BLSP1_AHB_CLK                      33
+#define GCC_BLSP1_QUP2_I2C_APPS_CLK            34
+#define GCC_BLSP1_QUP2_SPI_APPS_CLK            35
+#define GCC_BLSP1_QUP3_I2C_APPS_CLK            36
+#define GCC_BLSP1_QUP3_SPI_APPS_CLK            37
+#define GCC_BLSP1_QUP4_I2C_APPS_CLK            38
+#define GCC_BLSP1_QUP4_SPI_APPS_CLK            39
+#define GCC_BLSP1_UART1_APPS_CLK               40
+#define GCC_BLSP1_UART2_APPS_CLK               41
+#define GCC_BLSP2_AHB_CLK                      42
+#define GCC_BLSP2_QUP1_I2C_APPS_CLK            43
+#define GCC_BLSP2_QUP1_SPI_APPS_CLK            44
+#define GCC_BLSP2_QUP2_I2C_APPS_CLK            45
+#define GCC_BLSP2_QUP2_SPI_APPS_CLK            46
+#define GCC_BLSP2_QUP3_I2C_APPS_CLK            47
+#define GCC_BLSP2_QUP3_SPI_APPS_CLK            48
+#define GCC_BLSP2_UART1_APPS_CLK               49
+#define GCC_BLSP2_UART2_APPS_CLK               50
+#define GCC_BOOT_ROM_AHB_CLK                   51
+#define GCC_CAMSS_AHB_CLK                      52
+#define GCC_CAMSS_CCI_AHB_CLK                  53
+#define GCC_CAMSS_CCI_CLK                      54
+#define GCC_CAMSS_CPP_AHB_CLK                  55
+#define GCC_CAMSS_CPP_CLK                      56
+#define GCC_CAMSS_CSI0PHYTIMER_CLK             57
+#define GCC_CAMSS_CSI0PHY_CLK                  58
+#define GCC_CAMSS_CSI0PIX_CLK                  59
+#define GCC_CAMSS_CSI0RDI_CLK                  60
+#define GCC_CAMSS_CSI0_AHB_CLK                 61
+#define GCC_CAMSS_CSI0_CLK                     62
+#define GCC_CAMSS_CSI1PHYTIMER_CLK             63
+#define GCC_CAMSS_CSI1PHY_CLK                  64
+#define GCC_CAMSS_CSI1PIX_CLK                  65
+#define GCC_CAMSS_CSI1RDI_CLK                  66
+#define GCC_CAMSS_CSI1_AHB_CLK                 67
+#define GCC_CAMSS_CSI1_CLK                     68
+#define GCC_CAMSS_CSI2PHY_CLK                  69
+#define GCC_CAMSS_CSI2PIX_CLK                  70
+#define GCC_CAMSS_CSI2RDI_CLK                  71
+#define GCC_CAMSS_CSI2_AHB_CLK                 72
+#define GCC_CAMSS_CSI2_CLK                     73
+#define GCC_CAMSS_CSI_VFE0_CLK                 74
+#define GCC_CAMSS_CSI_VFE1_CLK                 75
+#define GCC_CAMSS_GP0_CLK                      76
+#define GCC_CAMSS_GP1_CLK                      77
+#define GCC_CAMSS_ISPIF_AHB_CLK                        78
+#define GCC_CAMSS_JPEG0_CLK                    79
+#define GCC_CAMSS_JPEG_AHB_CLK                 80
+#define GCC_CAMSS_JPEG_AXI_CLK                 81
+#define GCC_CAMSS_MCLK0_CLK                    82
+#define GCC_CAMSS_MCLK1_CLK                    83
+#define GCC_CAMSS_MCLK2_CLK                    84
+#define GCC_CAMSS_MICRO_AHB_CLK                        85
+#define GCC_CAMSS_TOP_AHB_CLK                  86
+#define GCC_CAMSS_VFE0_AHB_CLK                 87
+#define GCC_CAMSS_VFE0_AXI_CLK                 88
+#define GCC_CAMSS_VFE0_CLK                     89
+#define GCC_CAMSS_VFE1_AHB_CLK                 90
+#define GCC_CAMSS_VFE1_AXI_CLK                 91
+#define GCC_CAMSS_VFE1_CLK                     92
+#define GCC_CPP_TBU_CLK                                93
+#define GCC_CRYPTO_AHB_CLK                     94
+#define GCC_CRYPTO_AXI_CLK                     95
+#define GCC_CRYPTO_CLK                         96
+#define GCC_DCC_CLK                            97
+#define GCC_GFX_TBU_CLK                                98
+#define GCC_GFX_TCU_CLK                                99
+#define GCC_GP1_CLK                            100
+#define GCC_GP2_CLK                            101
+#define GCC_GP3_CLK                            102
+#define GCC_GTCU_AHB_CLK                       103
+#define GCC_JPEG_TBU_CLK                       104
+#define GCC_MDP_TBU_CLK                                105
+#define GCC_MDSS_AHB_CLK                       106
+#define GCC_MDSS_AXI_CLK                       107
+#define GCC_MDSS_BYTE0_CLK                     108
+#define GCC_MDSS_ESC0_CLK                      109
+#define GCC_MDSS_MDP_CLK                       110
+#define GCC_MDSS_PCLK0_CLK                     111
+#define GCC_MDSS_VSYNC_CLK                     112
+#define GCC_MSS_CFG_AHB_CLK                    113
+#define GCC_MSS_Q6_BIMC_AXI_CLK                        114
+#define GCC_OXILI_AHB_CLK                      115
+#define GCC_OXILI_GFX3D_CLK                    116
+#define GCC_PDM2_CLK                           117
+#define GCC_PDM_AHB_CLK                                118
+#define GCC_PRNG_AHB_CLK                       119
+#define GCC_QDSS_DAP_CLK                       120
+#define GCC_SDCC1_AHB_CLK                      121
+#define GCC_SDCC1_APPS_CLK                     122
+#define GCC_SDCC1_ICE_CORE_CLK                 123
+#define GCC_SDCC2_AHB_CLK                      124
+#define GCC_SDCC2_APPS_CLK                     125
+#define GCC_SMMU_CFG_CLK                       126
+#define GCC_USB2A_PHY_SLEEP_CLK                        127
+#define GCC_USB_HS_AHB_CLK                     128
+#define GCC_USB_HS_PHY_CFG_AHB_CLK             129
+#define GCC_USB_HS_SYSTEM_CLK                  130
+#define GCC_VENUS0_AHB_CLK                     131
+#define GCC_VENUS0_AXI_CLK                     132
+#define GCC_VENUS0_CORE0_VCODEC0_CLK           133
+#define GCC_VENUS0_VCODEC0_CLK                 134
+#define GCC_VENUS_TBU_CLK                      135
+#define GCC_VFE1_TBU_CLK                       136
+#define GCC_VFE_TBU_CLK                                137
+#define GFX3D_CLK_SRC                          138
+#define GP1_CLK_SRC                            139
+#define GP2_CLK_SRC                            140
+#define GP3_CLK_SRC                            141
+#define GPLL0                                  142
+#define GPLL0_EARLY                            143
+#define GPLL3                                  144
+#define GPLL3_EARLY                            145
+#define GPLL4                                  146
+#define GPLL4_EARLY                            147
+#define GPLL6                                  148
+#define GPLL6_EARLY                            149
+#define JPEG0_CLK_SRC                          150
+#define MCLK0_CLK_SRC                          151
+#define MCLK1_CLK_SRC                          152
+#define MCLK2_CLK_SRC                          153
+#define MDP_CLK_SRC                            154
+#define PCLK0_CLK_SRC                          155
+#define PDM2_CLK_SRC                           156
+#define SDCC1_APPS_CLK_SRC                     157
+#define SDCC1_ICE_CORE_CLK_SRC                 158
+#define SDCC2_APPS_CLK_SRC                     159
+#define USB_HS_SYSTEM_CLK_SRC                  160
+#define VCODEC0_CLK_SRC                                161
+#define VFE0_CLK_SRC                           162
+#define VFE1_CLK_SRC                           163
+#define VSYNC_CLK_SRC                          164
+
+/* GCC block resets */
+#define GCC_CAMSS_MICRO_BCR                    0
+#define GCC_MSS_BCR                            1
+#define GCC_QUSB2_PHY_BCR                      2
+#define GCC_USB_HS_BCR                         3
+#define GCC_USB2_HS_PHY_ONLY_BCR               4
+
+/* GDSCs */
+#define CPP_GDSC                               0
+#define JPEG_GDSC                              1
+#define MDSS_GDSC                              2
+#define OXILI_GX_GDSC                          3
+#define VENUS_CORE0_GDSC                       4
+#define VENUS_GDSC                             5
+#define VFE0_GDSC                              6
+#define VFE1_GDSC                              7
+
+#endif
index cb2fb638825ca847ed7fcbc76403e3d4a5b1c0f9..721105ea4fad84ffde4aa2bcba83c83d7542608d 100644 (file)
 #define USB30_MP_GDSC                                  9
 #define USB30_PRIM_GDSC                                        10
 #define USB30_SEC_GDSC                                 11
+#define EMAC_0_GDSC                                    12
+#define EMAC_1_GDSC                                    13
 
 #endif
diff --git a/include/dt-bindings/clock/qcom,ipq5332-gcc.h b/include/dt-bindings/clock/qcom,ipq5332-gcc.h
new file mode 100644 (file)
index 0000000..8a405a0
--- /dev/null
@@ -0,0 +1,356 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ */
+
+#ifndef _DT_BINDINGS_CLK_QCOM_GCC_IPQ5332_H
+#define _DT_BINDINGS_CLK_QCOM_GCC_IPQ5332_H
+
+#define GPLL0_MAIN                                     0
+#define GPLL0                                          1
+#define GPLL2_MAIN                                     2
+#define GPLL2                                          3
+#define GPLL4_MAIN                                     4
+#define GPLL4                                          5
+#define GCC_ADSS_PWM_CLK                               6
+#define GCC_ADSS_PWM_CLK_SRC                           7
+#define GCC_AHB_CLK                                    8
+#define GCC_APSS_AXI_CLK_SRC                           9
+#define GCC_BLSP1_AHB_CLK                              10
+#define GCC_BLSP1_QUP1_I2C_APPS_CLK                    11
+#define GCC_BLSP1_QUP1_SPI_APPS_CLK                    12
+#define GCC_BLSP1_QUP1_SPI_APPS_CLK_SRC                        13
+#define GCC_BLSP1_QUP2_I2C_APPS_CLK                    14
+#define GCC_BLSP1_QUP2_SPI_APPS_CLK                    15
+#define GCC_BLSP1_QUP2_SPI_APPS_CLK_SRC                        16
+#define GCC_BLSP1_QUP3_I2C_APPS_CLK                    17
+#define GCC_BLSP1_QUP3_SPI_APPS_CLK                    18
+#define GCC_BLSP1_QUP3_SPI_APPS_CLK_SRC                        19
+#define GCC_BLSP1_SLEEP_CLK                            20
+#define GCC_BLSP1_UART1_APPS_CLK                       21
+#define GCC_BLSP1_UART1_APPS_CLK_SRC                   22
+#define GCC_BLSP1_UART2_APPS_CLK                       23
+#define GCC_BLSP1_UART2_APPS_CLK_SRC                   24
+#define GCC_BLSP1_UART3_APPS_CLK                       25
+#define GCC_BLSP1_UART3_APPS_CLK_SRC                   26
+#define GCC_CE_AHB_CLK                                 27
+#define GCC_CE_AXI_CLK                                 28
+#define GCC_CE_PCNOC_AHB_CLK                           29
+#define GCC_CMN_12GPLL_AHB_CLK                         30
+#define GCC_CMN_12GPLL_APU_CLK                         31
+#define GCC_CMN_12GPLL_SYS_CLK                         32
+#define GCC_GP1_CLK                                    33
+#define GCC_GP1_CLK_SRC                                        34
+#define GCC_GP2_CLK                                    35
+#define GCC_GP2_CLK_SRC                                        36
+#define GCC_LPASS_CORE_AXIM_CLK                                37
+#define GCC_LPASS_SWAY_CLK                             38
+#define GCC_LPASS_SWAY_CLK_SRC                         39
+#define GCC_MDIO_AHB_CLK                               40
+#define GCC_MDIO_SLAVE_AHB_CLK                         41
+#define GCC_MEM_NOC_Q6_AXI_CLK                         42
+#define GCC_MEM_NOC_TS_CLK                             43
+#define GCC_NSS_TS_CLK                                 44
+#define GCC_NSS_TS_CLK_SRC                             45
+#define GCC_NSSCC_CLK                                  46
+#define GCC_NSSCFG_CLK                                 47
+#define GCC_NSSNOC_ATB_CLK                             48
+#define GCC_NSSNOC_NSSCC_CLK                           49
+#define GCC_NSSNOC_QOSGEN_REF_CLK                      50
+#define GCC_NSSNOC_SNOC_1_CLK                          51
+#define GCC_NSSNOC_SNOC_CLK                            52
+#define GCC_NSSNOC_TIMEOUT_REF_CLK                     53
+#define GCC_NSSNOC_XO_DCD_CLK                          54
+#define GCC_PCIE3X1_0_AHB_CLK                          55
+#define GCC_PCIE3X1_0_AUX_CLK                          56
+#define GCC_PCIE3X1_0_AXI_CLK_SRC                      57
+#define GCC_PCIE3X1_0_AXI_M_CLK                                58
+#define GCC_PCIE3X1_0_AXI_S_BRIDGE_CLK                 59
+#define GCC_PCIE3X1_0_AXI_S_CLK                                60
+#define GCC_PCIE3X1_0_PIPE_CLK                         61
+#define GCC_PCIE3X1_0_RCHG_CLK                         62
+#define GCC_PCIE3X1_0_RCHG_CLK_SRC                     63
+#define GCC_PCIE3X1_1_AHB_CLK                          64
+#define GCC_PCIE3X1_1_AUX_CLK                          65
+#define GCC_PCIE3X1_1_AXI_CLK_SRC                      66
+#define GCC_PCIE3X1_1_AXI_M_CLK                                67
+#define GCC_PCIE3X1_1_AXI_S_BRIDGE_CLK                 68
+#define GCC_PCIE3X1_1_AXI_S_CLK                                69
+#define GCC_PCIE3X1_1_PIPE_CLK                         70
+#define GCC_PCIE3X1_1_RCHG_CLK                         71
+#define GCC_PCIE3X1_1_RCHG_CLK_SRC                     72
+#define GCC_PCIE3X1_PHY_AHB_CLK                                73
+#define GCC_PCIE3X2_AHB_CLK                            74
+#define GCC_PCIE3X2_AUX_CLK                            75
+#define GCC_PCIE3X2_AXI_M_CLK                          76
+#define GCC_PCIE3X2_AXI_M_CLK_SRC                      77
+#define GCC_PCIE3X2_AXI_S_BRIDGE_CLK                   78
+#define GCC_PCIE3X2_AXI_S_CLK                          79
+#define GCC_PCIE3X2_AXI_S_CLK_SRC                      80
+#define GCC_PCIE3X2_PHY_AHB_CLK                                81
+#define GCC_PCIE3X2_PIPE_CLK                           82
+#define GCC_PCIE3X2_RCHG_CLK                           83
+#define GCC_PCIE3X2_RCHG_CLK_SRC                       84
+#define GCC_PCIE_AUX_CLK_SRC                           85
+#define GCC_PCNOC_AT_CLK                               86
+#define GCC_PCNOC_BFDCD_CLK_SRC                                87
+#define GCC_PCNOC_LPASS_CLK                            88
+#define GCC_PRNG_AHB_CLK                               89
+#define GCC_Q6_AHB_CLK                                 90
+#define GCC_Q6_AHB_S_CLK                               91
+#define GCC_Q6_AXIM_CLK                                        92
+#define GCC_Q6_AXIM_CLK_SRC                            93
+#define GCC_Q6_AXIS_CLK                                        94
+#define GCC_Q6_TSCTR_1TO2_CLK                          95
+#define GCC_Q6SS_ATBM_CLK                              96
+#define GCC_Q6SS_PCLKDBG_CLK                           97
+#define GCC_Q6SS_TRIG_CLK                              98
+#define GCC_QDSS_AT_CLK                                        99
+#define GCC_QDSS_AT_CLK_SRC                            100
+#define GCC_QDSS_CFG_AHB_CLK                           101
+#define GCC_QDSS_DAP_AHB_CLK                           102
+#define GCC_QDSS_DAP_CLK                               103
+#define GCC_QDSS_DAP_DIV_CLK_SRC                       104
+#define GCC_QDSS_ETR_USB_CLK                           105
+#define GCC_QDSS_EUD_AT_CLK                            106
+#define GCC_QDSS_TSCTR_CLK_SRC                         107
+#define GCC_QPIC_AHB_CLK                               108
+#define GCC_QPIC_CLK                                   109
+#define GCC_QPIC_IO_MACRO_CLK                          110
+#define GCC_QPIC_IO_MACRO_CLK_SRC                      111
+#define GCC_QPIC_SLEEP_CLK                             112
+#define GCC_SDCC1_AHB_CLK                              113
+#define GCC_SDCC1_APPS_CLK                             114
+#define GCC_SDCC1_APPS_CLK_SRC                         115
+#define GCC_SLEEP_CLK_SRC                              116
+#define GCC_SNOC_LPASS_CFG_CLK                         117
+#define GCC_SNOC_NSSNOC_1_CLK                          118
+#define GCC_SNOC_NSSNOC_CLK                            119
+#define GCC_SNOC_PCIE3_1LANE_1_M_CLK                   120
+#define GCC_SNOC_PCIE3_1LANE_1_S_CLK                   121
+#define GCC_SNOC_PCIE3_1LANE_M_CLK                     122
+#define GCC_SNOC_PCIE3_1LANE_S_CLK                     123
+#define GCC_SNOC_PCIE3_2LANE_M_CLK                     124
+#define GCC_SNOC_PCIE3_2LANE_S_CLK                     125
+#define GCC_SNOC_USB_CLK                               126
+#define GCC_SYS_NOC_AT_CLK                             127
+#define GCC_SYS_NOC_WCSS_AHB_CLK                       128
+#define GCC_SYSTEM_NOC_BFDCD_CLK_SRC                   129
+#define GCC_UNIPHY0_AHB_CLK                            130
+#define GCC_UNIPHY0_SYS_CLK                            131
+#define GCC_UNIPHY1_AHB_CLK                            132
+#define GCC_UNIPHY1_SYS_CLK                            133
+#define GCC_UNIPHY_SYS_CLK_SRC                         134
+#define GCC_USB0_AUX_CLK                               135
+#define GCC_USB0_AUX_CLK_SRC                           136
+#define GCC_USB0_EUD_AT_CLK                            137
+#define GCC_USB0_LFPS_CLK                              138
+#define GCC_USB0_LFPS_CLK_SRC                          139
+#define GCC_USB0_MASTER_CLK                            140
+#define GCC_USB0_MASTER_CLK_SRC                                141
+#define GCC_USB0_MOCK_UTMI_CLK                         142
+#define GCC_USB0_MOCK_UTMI_CLK_SRC                     143
+#define GCC_USB0_MOCK_UTMI_DIV_CLK_SRC                 144
+#define GCC_USB0_PHY_CFG_AHB_CLK                       145
+#define GCC_USB0_PIPE_CLK                              146
+#define GCC_USB0_SLEEP_CLK                             147
+#define GCC_WCSS_AHB_CLK_SRC                           148
+#define GCC_WCSS_AXIM_CLK                              149
+#define GCC_WCSS_AXIS_CLK                              150
+#define GCC_WCSS_DBG_IFC_APB_BDG_CLK                   151
+#define GCC_WCSS_DBG_IFC_APB_CLK                       152
+#define GCC_WCSS_DBG_IFC_ATB_BDG_CLK                   153
+#define GCC_WCSS_DBG_IFC_ATB_CLK                       154
+#define GCC_WCSS_DBG_IFC_NTS_BDG_CLK                   155
+#define GCC_WCSS_DBG_IFC_NTS_CLK                       156
+#define GCC_WCSS_ECAHB_CLK                             157
+#define GCC_WCSS_MST_ASYNC_BDG_CLK                     158
+#define GCC_WCSS_SLV_ASYNC_BDG_CLK                     159
+#define GCC_XO_CLK                                     160
+#define GCC_XO_CLK_SRC                                 161
+#define GCC_XO_DIV4_CLK                                        162
+#define GCC_IM_SLEEP_CLK                               163
+#define GCC_NSSNOC_PCNOC_1_CLK                         164
+#define GCC_MEM_NOC_AHB_CLK                            165
+#define GCC_MEM_NOC_APSS_AXI_CLK                       166
+#define GCC_SNOC_QOSGEN_EXTREF_DIV_CLK_SRC             167
+#define GCC_MEM_NOC_QOSGEN_EXTREF_CLK                  168
+#define GCC_PCIE3X2_PIPE_CLK_SRC                       169
+#define GCC_PCIE3X1_0_PIPE_CLK_SRC                     170
+#define GCC_PCIE3X1_1_PIPE_CLK_SRC                     171
+#define GCC_USB0_PIPE_CLK_SRC                          172
+
+#define GCC_ADSS_BCR                                   0
+#define GCC_ADSS_PWM_CLK_ARES                          1
+#define GCC_AHB_CLK_ARES                               2
+#define GCC_APC0_VOLTAGE_DROOP_DETECTOR_BCR            3
+#define GCC_APC0_VOLTAGE_DROOP_DETECTOR_GPLL0_CLK_ARES 4
+#define GCC_APSS_AHB_CLK_ARES                          5
+#define GCC_APSS_AXI_CLK_ARES                          6
+#define GCC_BLSP1_AHB_CLK_ARES                         7
+#define GCC_BLSP1_BCR                                  8
+#define GCC_BLSP1_QUP1_BCR                             9
+#define GCC_BLSP1_QUP1_I2C_APPS_CLK_ARES               10
+#define GCC_BLSP1_QUP1_SPI_APPS_CLK_ARES               11
+#define GCC_BLSP1_QUP2_BCR                             12
+#define GCC_BLSP1_QUP2_I2C_APPS_CLK_ARES               13
+#define GCC_BLSP1_QUP2_SPI_APPS_CLK_ARES               14
+#define GCC_BLSP1_QUP3_BCR                             15
+#define GCC_BLSP1_QUP3_I2C_APPS_CLK_ARES               16
+#define GCC_BLSP1_QUP3_SPI_APPS_CLK_ARES               17
+#define GCC_BLSP1_SLEEP_CLK_ARES                       18
+#define GCC_BLSP1_UART1_APPS_CLK_ARES                  19
+#define GCC_BLSP1_UART1_BCR                            20
+#define GCC_BLSP1_UART2_APPS_CLK_ARES                  21
+#define GCC_BLSP1_UART2_BCR                            22
+#define GCC_BLSP1_UART3_APPS_CLK_ARES                  23
+#define GCC_BLSP1_UART3_BCR                            24
+#define GCC_CE_BCR                                     25
+#define GCC_CMN_BLK_BCR                                        26
+#define GCC_CMN_LDO0_BCR                               27
+#define GCC_CMN_LDO1_BCR                               28
+#define GCC_DCC_BCR                                    29
+#define GCC_GP1_CLK_ARES                               30
+#define GCC_GP2_CLK_ARES                               31
+#define GCC_LPASS_BCR                                  32
+#define GCC_LPASS_CORE_AXIM_CLK_ARES                   33
+#define GCC_LPASS_SWAY_CLK_ARES                                34
+#define GCC_MDIOM_BCR                                  35
+#define GCC_MDIOS_BCR                                  36
+#define GCC_NSS_BCR                                    37
+#define GCC_NSS_TS_CLK_ARES                            38
+#define GCC_NSSCC_CLK_ARES                             39
+#define GCC_NSSCFG_CLK_ARES                            40
+#define GCC_NSSNOC_ATB_CLK_ARES                                41
+#define GCC_NSSNOC_NSSCC_CLK_ARES                      42
+#define GCC_NSSNOC_QOSGEN_REF_CLK_ARES                 43
+#define GCC_NSSNOC_SNOC_1_CLK_ARES                     44
+#define GCC_NSSNOC_SNOC_CLK_ARES                       45
+#define GCC_NSSNOC_TIMEOUT_REF_CLK_ARES                        46
+#define GCC_NSSNOC_XO_DCD_CLK_ARES                     47
+#define GCC_PCIE3X1_0_AHB_CLK_ARES                     48
+#define GCC_PCIE3X1_0_AUX_CLK_ARES                     49
+#define GCC_PCIE3X1_0_AXI_M_CLK_ARES                   50
+#define GCC_PCIE3X1_0_AXI_S_BRIDGE_CLK_ARES            51
+#define GCC_PCIE3X1_0_AXI_S_CLK_ARES                   52
+#define GCC_PCIE3X1_0_BCR                              53
+#define GCC_PCIE3X1_0_LINK_DOWN_BCR                    54
+#define GCC_PCIE3X1_0_PHY_BCR                          55
+#define GCC_PCIE3X1_0_PHY_PHY_BCR                      56
+#define GCC_PCIE3X1_1_AHB_CLK_ARES                     57
+#define GCC_PCIE3X1_1_AUX_CLK_ARES                     58
+#define GCC_PCIE3X1_1_AXI_M_CLK_ARES                   59
+#define GCC_PCIE3X1_1_AXI_S_BRIDGE_CLK_ARES            60
+#define GCC_PCIE3X1_1_AXI_S_CLK_ARES                   61
+#define GCC_PCIE3X1_1_BCR                              62
+#define GCC_PCIE3X1_1_LINK_DOWN_BCR                    63
+#define GCC_PCIE3X1_1_PHY_BCR                          64
+#define GCC_PCIE3X1_1_PHY_PHY_BCR                      65
+#define GCC_PCIE3X1_PHY_AHB_CLK_ARES                   66
+#define GCC_PCIE3X2_AHB_CLK_ARES                       67
+#define GCC_PCIE3X2_AUX_CLK_ARES                       68
+#define GCC_PCIE3X2_AXI_M_CLK_ARES                     69
+#define GCC_PCIE3X2_AXI_S_BRIDGE_CLK_ARES              70
+#define GCC_PCIE3X2_AXI_S_CLK_ARES                     71
+#define GCC_PCIE3X2_BCR                                        72
+#define GCC_PCIE3X2_LINK_DOWN_BCR                      73
+#define GCC_PCIE3X2_PHY_AHB_CLK_ARES                   74
+#define GCC_PCIE3X2_PHY_BCR                            75
+#define GCC_PCIE3X2PHY_PHY_BCR                         76
+#define GCC_PCNOC_BCR                                  77
+#define GCC_PCNOC_LPASS_CLK_ARES                       78
+#define GCC_PRNG_AHB_CLK_ARES                          79
+#define GCC_PRNG_BCR                                   80
+#define GCC_Q6_AHB_CLK_ARES                            81
+#define GCC_Q6_AHB_S_CLK_ARES                          82
+#define GCC_Q6_AXIM_CLK_ARES                           83
+#define GCC_Q6_AXIS_CLK_ARES                           84
+#define GCC_Q6_TSCTR_1TO2_CLK_ARES                     85
+#define GCC_Q6SS_ATBM_CLK_ARES                         86
+#define GCC_Q6SS_PCLKDBG_CLK_ARES                      87
+#define GCC_Q6SS_TRIG_CLK_ARES                         88
+#define GCC_QDSS_APB2JTAG_CLK_ARES                     89
+#define GCC_QDSS_AT_CLK_ARES                           90
+#define GCC_QDSS_BCR                                   91
+#define GCC_QDSS_CFG_AHB_CLK_ARES                      92
+#define GCC_QDSS_DAP_AHB_CLK_ARES                      93
+#define GCC_QDSS_DAP_CLK_ARES                          94
+#define GCC_QDSS_ETR_USB_CLK_ARES                      95
+#define GCC_QDSS_EUD_AT_CLK_ARES                       96
+#define GCC_QDSS_STM_CLK_ARES                          97
+#define GCC_QDSS_TRACECLKIN_CLK_ARES                   98
+#define GCC_QDSS_TS_CLK_ARES                           99
+#define GCC_QDSS_TSCTR_DIV16_CLK_ARES                  100
+#define GCC_QDSS_TSCTR_DIV2_CLK_ARES                   101
+#define GCC_QDSS_TSCTR_DIV3_CLK_ARES                   102
+#define GCC_QDSS_TSCTR_DIV4_CLK_ARES                   103
+#define GCC_QDSS_TSCTR_DIV8_CLK_ARES                   104
+#define GCC_QPIC_AHB_CLK_ARES                          105
+#define GCC_QPIC_CLK_ARES                              106
+#define GCC_QPIC_BCR                                   107
+#define GCC_QPIC_IO_MACRO_CLK_ARES                     108
+#define GCC_QPIC_SLEEP_CLK_ARES                                109
+#define GCC_QUSB2_0_PHY_BCR                            110
+#define GCC_SDCC1_AHB_CLK_ARES                         111
+#define GCC_SDCC1_APPS_CLK_ARES                                112
+#define GCC_SDCC_BCR                                   113
+#define GCC_SNOC_BCR                                   114
+#define GCC_SNOC_LPASS_CFG_CLK_ARES                    115
+#define GCC_SNOC_NSSNOC_1_CLK_ARES                     116
+#define GCC_SNOC_NSSNOC_CLK_ARES                       117
+#define GCC_SYS_NOC_QDSS_STM_AXI_CLK_ARES              118
+#define GCC_SYS_NOC_WCSS_AHB_CLK_ARES                  119
+#define GCC_UNIPHY0_AHB_CLK_ARES                       120
+#define GCC_UNIPHY0_BCR                                        121
+#define GCC_UNIPHY0_SYS_CLK_ARES                       122
+#define GCC_UNIPHY1_AHB_CLK_ARES                       123
+#define GCC_UNIPHY1_BCR                                        124
+#define GCC_UNIPHY1_SYS_CLK_ARES                       125
+#define GCC_USB0_AUX_CLK_ARES                          126
+#define GCC_USB0_EUD_AT_CLK_ARES                       127
+#define GCC_USB0_LFPS_CLK_ARES                         128
+#define GCC_USB0_MASTER_CLK_ARES                       129
+#define GCC_USB0_MOCK_UTMI_CLK_ARES                    130
+#define GCC_USB0_PHY_BCR                               131
+#define GCC_USB0_PHY_CFG_AHB_CLK_ARES                  132
+#define GCC_USB0_SLEEP_CLK_ARES                                133
+#define GCC_USB3PHY_0_PHY_BCR                          134
+#define GCC_USB_BCR                                    135
+#define GCC_WCSS_AXIM_CLK_ARES                         136
+#define GCC_WCSS_AXIS_CLK_ARES                         137
+#define GCC_WCSS_BCR                                   138
+#define GCC_WCSS_DBG_IFC_APB_BDG_CLK_ARES              139
+#define GCC_WCSS_DBG_IFC_APB_CLK_ARES                  140
+#define GCC_WCSS_DBG_IFC_ATB_BDG_CLK_ARES              141
+#define GCC_WCSS_DBG_IFC_ATB_CLK_ARES                  142
+#define GCC_WCSS_DBG_IFC_NTS_BDG_CLK_ARES              143
+#define GCC_WCSS_DBG_IFC_NTS_CLK_ARES                  144
+#define GCC_WCSS_ECAHB_CLK_ARES                                145
+#define GCC_WCSS_MST_ASYNC_BDG_CLK_ARES                        146
+#define GCC_WCSS_Q6_BCR                                        147
+#define GCC_WCSS_SLV_ASYNC_BDG_CLK_ARES                        148
+#define GCC_XO_CLK_ARES                                        149
+#define GCC_XO_DIV4_CLK_ARES                           150
+#define GCC_Q6SS_DBG_ARES                              151
+#define GCC_WCSS_DBG_BDG_ARES                          152
+#define GCC_WCSS_DBG_ARES                              153
+#define GCC_WCSS_AXI_S_ARES                            154
+#define GCC_WCSS_AXI_M_ARES                            155
+#define GCC_WCSSAON_ARES                               156
+#define GCC_PCIE3X2_PIPE_ARES                          157
+#define GCC_PCIE3X2_CORE_STICKY_ARES                   158
+#define GCC_PCIE3X2_AXI_S_STICKY_ARES                  159
+#define GCC_PCIE3X2_AXI_M_STICKY_ARES                  160
+#define GCC_PCIE3X1_0_PIPE_ARES                                161
+#define GCC_PCIE3X1_0_CORE_STICKY_ARES                 162
+#define GCC_PCIE3X1_0_AXI_S_STICKY_ARES                        163
+#define GCC_PCIE3X1_0_AXI_M_STICKY_ARES                        164
+#define GCC_PCIE3X1_1_PIPE_ARES                                165
+#define GCC_PCIE3X1_1_CORE_STICKY_ARES                 166
+#define GCC_PCIE3X1_1_AXI_S_STICKY_ARES                        167
+#define GCC_PCIE3X1_1_AXI_M_STICKY_ARES                        168
+#define GCC_IM_SLEEP_CLK_ARES                          169
+#define GCC_NSSNOC_PCNOC_1_CLK_ARES                    170
+#define GCC_UNIPHY0_XPCS_ARES                          171
+#define GCC_UNIPHY1_XPCS_ARES                          172
+#endif
diff --git a/include/dt-bindings/clock/qcom,ipq9574-gcc.h b/include/dt-bindings/clock/qcom,ipq9574-gcc.h
new file mode 100644 (file)
index 0000000..5a2961b
--- /dev/null
@@ -0,0 +1,213 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (c) 2018-2023 The Linux Foundation. All rights reserved.
+ */
+
+#ifndef _DT_BINDINGS_CLOCK_IPQ_GCC_9574_H
+#define _DT_BINDINGS_CLOCK_IPQ_GCC_9574_H
+
+#define GPLL0_MAIN                                     0
+#define GPLL0                                          1
+#define GPLL2_MAIN                                     2
+#define GPLL2                                          3
+#define GPLL4_MAIN                                     4
+#define GPLL4                                          5
+#define GCC_SLEEP_CLK_SRC                              6
+#define APSS_AHB_CLK_SRC                               7
+#define APSS_AXI_CLK_SRC                               8
+#define BLSP1_QUP1_I2C_APPS_CLK_SRC                    9
+#define BLSP1_QUP1_SPI_APPS_CLK_SRC                    10
+#define BLSP1_QUP2_I2C_APPS_CLK_SRC                    11
+#define BLSP1_QUP2_SPI_APPS_CLK_SRC                    12
+#define BLSP1_QUP3_I2C_APPS_CLK_SRC                    13
+#define BLSP1_QUP3_SPI_APPS_CLK_SRC                    14
+#define BLSP1_QUP4_I2C_APPS_CLK_SRC                    15
+#define BLSP1_QUP4_SPI_APPS_CLK_SRC                    16
+#define BLSP1_QUP5_I2C_APPS_CLK_SRC                    17
+#define BLSP1_QUP5_SPI_APPS_CLK_SRC                    18
+#define BLSP1_QUP6_I2C_APPS_CLK_SRC                    19
+#define BLSP1_QUP6_SPI_APPS_CLK_SRC                    20
+#define BLSP1_UART1_APPS_CLK_SRC                       21
+#define BLSP1_UART2_APPS_CLK_SRC                       22
+#define BLSP1_UART3_APPS_CLK_SRC                       23
+#define BLSP1_UART4_APPS_CLK_SRC                       24
+#define BLSP1_UART5_APPS_CLK_SRC                       25
+#define BLSP1_UART6_APPS_CLK_SRC                       26
+#define GCC_APSS_AHB_CLK                               27
+#define GCC_APSS_AXI_CLK                               28
+#define GCC_BLSP1_QUP1_I2C_APPS_CLK                    29
+#define GCC_BLSP1_QUP1_SPI_APPS_CLK                    30
+#define GCC_BLSP1_QUP2_I2C_APPS_CLK                    31
+#define GCC_BLSP1_QUP2_SPI_APPS_CLK                    32
+#define GCC_BLSP1_QUP3_I2C_APPS_CLK                    33
+#define GCC_BLSP1_QUP3_SPI_APPS_CLK                    34
+#define GCC_BLSP1_QUP4_I2C_APPS_CLK                    35
+#define GCC_BLSP1_QUP4_SPI_APPS_CLK                    36
+#define GCC_BLSP1_QUP5_I2C_APPS_CLK                    37
+#define GCC_BLSP1_QUP5_SPI_APPS_CLK                    38
+#define GCC_BLSP1_QUP6_I2C_APPS_CLK                    39
+#define GCC_BLSP1_QUP6_SPI_APPS_CLK                    40
+#define GCC_BLSP1_UART1_APPS_CLK                       41
+#define GCC_BLSP1_UART2_APPS_CLK                       42
+#define GCC_BLSP1_UART3_APPS_CLK                       43
+#define GCC_BLSP1_UART4_APPS_CLK                       44
+#define GCC_BLSP1_UART5_APPS_CLK                       45
+#define GCC_BLSP1_UART6_APPS_CLK                       46
+#define PCIE0_AXI_M_CLK_SRC                            47
+#define GCC_PCIE0_AXI_M_CLK                            48
+#define PCIE1_AXI_M_CLK_SRC                            49
+#define GCC_PCIE1_AXI_M_CLK                            50
+#define PCIE2_AXI_M_CLK_SRC                            51
+#define GCC_PCIE2_AXI_M_CLK                            52
+#define PCIE3_AXI_M_CLK_SRC                            53
+#define GCC_PCIE3_AXI_M_CLK                            54
+#define PCIE0_AXI_S_CLK_SRC                            55
+#define GCC_PCIE0_AXI_S_BRIDGE_CLK                     56
+#define GCC_PCIE0_AXI_S_CLK                            57
+#define PCIE1_AXI_S_CLK_SRC                            58
+#define GCC_PCIE1_AXI_S_BRIDGE_CLK                     59
+#define GCC_PCIE1_AXI_S_CLK                            60
+#define PCIE2_AXI_S_CLK_SRC                            61
+#define GCC_PCIE2_AXI_S_BRIDGE_CLK                     62
+#define GCC_PCIE2_AXI_S_CLK                            63
+#define PCIE3_AXI_S_CLK_SRC                            64
+#define GCC_PCIE3_AXI_S_BRIDGE_CLK                     65
+#define GCC_PCIE3_AXI_S_CLK                            66
+#define PCIE0_PIPE_CLK_SRC                             67
+#define PCIE1_PIPE_CLK_SRC                             68
+#define PCIE2_PIPE_CLK_SRC                             69
+#define PCIE3_PIPE_CLK_SRC                             70
+#define PCIE_AUX_CLK_SRC                               71
+#define GCC_PCIE0_AUX_CLK                              72
+#define GCC_PCIE1_AUX_CLK                              73
+#define GCC_PCIE2_AUX_CLK                              74
+#define GCC_PCIE3_AUX_CLK                              75
+#define PCIE0_RCHNG_CLK_SRC                            76
+#define GCC_PCIE0_RCHNG_CLK                            77
+#define PCIE1_RCHNG_CLK_SRC                            78
+#define GCC_PCIE1_RCHNG_CLK                            79
+#define PCIE2_RCHNG_CLK_SRC                            80
+#define GCC_PCIE2_RCHNG_CLK                            81
+#define PCIE3_RCHNG_CLK_SRC                            82
+#define GCC_PCIE3_RCHNG_CLK                            83
+#define GCC_PCIE0_AHB_CLK                              84
+#define GCC_PCIE1_AHB_CLK                              85
+#define GCC_PCIE2_AHB_CLK                              86
+#define GCC_PCIE3_AHB_CLK                              87
+#define USB0_AUX_CLK_SRC                               88
+#define GCC_USB0_AUX_CLK                               89
+#define USB0_MASTER_CLK_SRC                            90
+#define GCC_USB0_MASTER_CLK                            91
+#define GCC_SNOC_USB_CLK                               92
+#define GCC_ANOC_USB_AXI_CLK                           93
+#define USB0_MOCK_UTMI_CLK_SRC                         94
+#define USB0_MOCK_UTMI_DIV_CLK_SRC                     95
+#define GCC_USB0_MOCK_UTMI_CLK                         96
+#define USB0_PIPE_CLK_SRC                              97
+#define GCC_USB0_PHY_CFG_AHB_CLK                       98
+#define SDCC1_APPS_CLK_SRC                             99
+#define GCC_SDCC1_APPS_CLK                             100
+#define SDCC1_ICE_CORE_CLK_SRC                         101
+#define GCC_SDCC1_ICE_CORE_CLK                         102
+#define GCC_SDCC1_AHB_CLK                              103
+#define PCNOC_BFDCD_CLK_SRC                            104
+#define GCC_NSSCFG_CLK                                 105
+#define GCC_NSSNOC_NSSCC_CLK                           106
+#define GCC_NSSCC_CLK                                  107
+#define GCC_NSSNOC_PCNOC_1_CLK                         108
+#define GCC_QDSS_DAP_AHB_CLK                           109
+#define GCC_QDSS_CFG_AHB_CLK                           110
+#define GCC_QPIC_AHB_CLK                               111
+#define GCC_QPIC_CLK                                   112
+#define GCC_BLSP1_AHB_CLK                              113
+#define GCC_MDIO_AHB_CLK                               114
+#define GCC_PRNG_AHB_CLK                               115
+#define GCC_UNIPHY0_AHB_CLK                            116
+#define GCC_UNIPHY1_AHB_CLK                            117
+#define GCC_UNIPHY2_AHB_CLK                            118
+#define GCC_CMN_12GPLL_AHB_CLK                         119
+#define GCC_CMN_12GPLL_APU_CLK                         120
+#define SYSTEM_NOC_BFDCD_CLK_SRC                       121
+#define GCC_NSSNOC_SNOC_CLK                            122
+#define GCC_NSSNOC_SNOC_1_CLK                          123
+#define GCC_QDSS_ETR_USB_CLK                           124
+#define WCSS_AHB_CLK_SRC                               125
+#define GCC_Q6_AHB_CLK                                 126
+#define GCC_Q6_AHB_S_CLK                               127
+#define GCC_WCSS_ECAHB_CLK                             128
+#define GCC_WCSS_ACMT_CLK                              129
+#define GCC_SYS_NOC_WCSS_AHB_CLK                       130
+#define WCSS_AXI_M_CLK_SRC                             131
+#define GCC_ANOC_WCSS_AXI_M_CLK                                132
+#define QDSS_AT_CLK_SRC                                        133
+#define GCC_Q6SS_ATBM_CLK                              134
+#define GCC_WCSS_DBG_IFC_ATB_CLK                       135
+#define GCC_NSSNOC_ATB_CLK                             136
+#define GCC_QDSS_AT_CLK                                        137
+#define GCC_SYS_NOC_AT_CLK                             138
+#define GCC_PCNOC_AT_CLK                               139
+#define GCC_USB0_EUD_AT_CLK                            140
+#define GCC_QDSS_EUD_AT_CLK                            141
+#define QDSS_STM_CLK_SRC                               142
+#define GCC_QDSS_STM_CLK                               143
+#define GCC_SYS_NOC_QDSS_STM_AXI_CLK                   144
+#define QDSS_TRACECLKIN_CLK_SRC                                145
+#define GCC_QDSS_TRACECLKIN_CLK                                146
+#define QDSS_TSCTR_CLK_SRC                             147
+#define GCC_Q6_TSCTR_1TO2_CLK                          148
+#define GCC_WCSS_DBG_IFC_NTS_CLK                       149
+#define GCC_QDSS_TSCTR_DIV2_CLK                                150
+#define GCC_QDSS_TS_CLK                                        151
+#define GCC_QDSS_TSCTR_DIV4_CLK                                152
+#define GCC_NSS_TS_CLK                                 153
+#define GCC_QDSS_TSCTR_DIV8_CLK                                154
+#define GCC_QDSS_TSCTR_DIV16_CLK                       155
+#define GCC_Q6SS_PCLKDBG_CLK                           156
+#define GCC_Q6SS_TRIG_CLK                              157
+#define GCC_WCSS_DBG_IFC_APB_CLK                       158
+#define GCC_WCSS_DBG_IFC_DAPBUS_CLK                    159
+#define GCC_QDSS_DAP_CLK                               160
+#define GCC_QDSS_APB2JTAG_CLK                          161
+#define GCC_QDSS_TSCTR_DIV3_CLK                                162
+#define QPIC_IO_MACRO_CLK_SRC                          163
+#define GCC_QPIC_IO_MACRO_CLK                           164
+#define Q6_AXI_CLK_SRC                                 165
+#define GCC_Q6_AXIM_CLK                                        166
+#define GCC_WCSS_Q6_TBU_CLK                            167
+#define GCC_MEM_NOC_Q6_AXI_CLK                         168
+#define Q6_AXIM2_CLK_SRC                               169
+#define NSSNOC_MEMNOC_BFDCD_CLK_SRC                    170
+#define GCC_NSSNOC_MEMNOC_CLK                          171
+#define GCC_NSSNOC_MEM_NOC_1_CLK                       172
+#define GCC_NSS_TBU_CLK                                        173
+#define GCC_MEM_NOC_NSSNOC_CLK                         174
+#define LPASS_AXIM_CLK_SRC                             175
+#define LPASS_SWAY_CLK_SRC                             176
+#define ADSS_PWM_CLK_SRC                               177
+#define GCC_ADSS_PWM_CLK                               178
+#define GP1_CLK_SRC                                    179
+#define GP2_CLK_SRC                                    180
+#define GP3_CLK_SRC                                    181
+#define DDRSS_SMS_SLOW_CLK_SRC                         182
+#define GCC_XO_CLK_SRC                                 183
+#define GCC_XO_CLK                                     184
+#define GCC_NSSNOC_QOSGEN_REF_CLK                      185
+#define GCC_NSSNOC_TIMEOUT_REF_CLK                     186
+#define GCC_XO_DIV4_CLK                                        187
+#define GCC_UNIPHY0_SYS_CLK                            188
+#define GCC_UNIPHY1_SYS_CLK                            189
+#define GCC_UNIPHY2_SYS_CLK                            190
+#define GCC_CMN_12GPLL_SYS_CLK                         191
+#define GCC_NSSNOC_XO_DCD_CLK                          192
+#define GCC_Q6SS_BOOT_CLK                              193
+#define UNIPHY_SYS_CLK_SRC                             194
+#define NSS_TS_CLK_SRC                                 195
+#define GCC_ANOC_PCIE0_1LANE_M_CLK                     196
+#define GCC_ANOC_PCIE1_1LANE_M_CLK                     197
+#define GCC_ANOC_PCIE2_2LANE_M_CLK                     198
+#define GCC_ANOC_PCIE3_2LANE_M_CLK                     199
+#define GCC_SNOC_PCIE0_1LANE_S_CLK                     200
+#define GCC_SNOC_PCIE1_1LANE_S_CLK                     201
+#define GCC_SNOC_PCIE2_2LANE_S_CLK                     202
+#define GCC_SNOC_PCIE3_2LANE_S_CLK                     203
+#endif
diff --git a/include/dt-bindings/clock/qcom,sa8775p-gpucc.h b/include/dt-bindings/clock/qcom,sa8775p-gpucc.h
new file mode 100644 (file)
index 0000000..a5fd784
--- /dev/null
@@ -0,0 +1,50 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2023, Linaro Limited
+ */
+
+#ifndef _DT_BINDINGS_CLK_QCOM_GPUCC_SA8775P_H
+#define _DT_BINDINGS_CLK_QCOM_GPUCC_SA8775P_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_FF_CLK                       5
+#define GPU_CC_CX_GMU_CLK                      6
+#define GPU_CC_CX_SNOC_DVM_CLK                 7
+#define GPU_CC_CXO_AON_CLK                     8
+#define GPU_CC_CXO_CLK                         9
+#define GPU_CC_DEMET_CLK                       10
+#define GPU_CC_DEMET_DIV_CLK_SRC               11
+#define GPU_CC_FF_CLK_SRC                      12
+#define GPU_CC_GMU_CLK_SRC                     13
+#define GPU_CC_HLOS1_VOTE_GPU_SMMU_CLK         14
+#define GPU_CC_HUB_AHB_DIV_CLK_SRC             15
+#define GPU_CC_HUB_AON_CLK                     16
+#define GPU_CC_HUB_CLK_SRC                     17
+#define GPU_CC_HUB_CX_INT_CLK                  18
+#define GPU_CC_HUB_CX_INT_DIV_CLK_SRC          19
+#define GPU_CC_MEMNOC_GFX_CLK                  20
+#define GPU_CC_SLEEP_CLK                       21
+#define GPU_CC_XO_CLK_SRC                      22
+
+/* GPU_CC resets */
+#define GPUCC_GPU_CC_ACD_BCR                   0
+#define GPUCC_GPU_CC_CB_BCR                    1
+#define GPUCC_GPU_CC_CX_BCR                    2
+#define GPUCC_GPU_CC_FAST_HUB_BCR              3
+#define GPUCC_GPU_CC_FF_BCR                    4
+#define GPUCC_GPU_CC_GFX3D_AON_BCR             5
+#define GPUCC_GPU_CC_GMU_BCR                   6
+#define GPUCC_GPU_CC_GX_BCR                    7
+#define GPUCC_GPU_CC_XO_BCR                    8
+
+/* GPU_CC power domains */
+#define GPU_CC_CX_GDSC                         0
+#define GPU_CC_GX_GDSC                         1
+
+#endif /* _DT_BINDINGS_CLK_QCOM_GPUCC_SA8775P_H */
diff --git a/include/dt-bindings/clock/qcom,sm6115-gpucc.h b/include/dt-bindings/clock/qcom,sm6115-gpucc.h
new file mode 100644 (file)
index 0000000..945f21a
--- /dev/null
@@ -0,0 +1,36 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023, Linaro Limited
+ */
+
+#ifndef _DT_BINDINGS_CLK_QCOM_GPU_CC_SM6115_H
+#define _DT_BINDINGS_CLK_QCOM_GPU_CC_SM6115_H
+
+/* GPU_CC clocks */
+#define GPU_CC_PLL0                    0
+#define GPU_CC_PLL0_OUT_AUX2           1
+#define GPU_CC_PLL1                    2
+#define GPU_CC_PLL1_OUT_AUX            3
+#define GPU_CC_AHB_CLK                 4
+#define GPU_CC_CRC_AHB_CLK             5
+#define GPU_CC_CX_GFX3D_CLK            6
+#define GPU_CC_CX_GMU_CLK              7
+#define GPU_CC_CX_SNOC_DVM_CLK         8
+#define GPU_CC_CXO_AON_CLK             9
+#define GPU_CC_CXO_CLK                 10
+#define GPU_CC_GMU_CLK_SRC             11
+#define GPU_CC_GX_CXO_CLK              12
+#define GPU_CC_GX_GFX3D_CLK            13
+#define GPU_CC_GX_GFX3D_CLK_SRC                14
+#define GPU_CC_SLEEP_CLK               15
+#define GPU_CC_HLOS1_VOTE_GPU_SMMU_CLK 16
+
+/* Resets */
+#define GPU_GX_BCR                     0
+
+/* GDSCs */
+#define GPU_CX_GDSC                    0
+#define GPU_GX_GDSC                    1
+
+#endif
diff --git a/include/dt-bindings/clock/qcom,sm6125-gpucc.h b/include/dt-bindings/clock/qcom,sm6125-gpucc.h
new file mode 100644 (file)
index 0000000..ce5bd92
--- /dev/null
@@ -0,0 +1,31 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023, Linaro Limited
+ */
+
+#ifndef _DT_BINDINGS_CLK_QCOM_GPU_CC_SM6125_H
+#define _DT_BINDINGS_CLK_QCOM_GPU_CC_SM6125_H
+
+/* Clocks */
+#define GPU_CC_PLL0_OUT_AUX2                   0
+#define GPU_CC_PLL1_OUT_AUX2                   1
+#define GPU_CC_CRC_AHB_CLK                     2
+#define GPU_CC_CX_APB_CLK                      3
+#define GPU_CC_CX_GFX3D_CLK                    4
+#define GPU_CC_CX_GMU_CLK                      5
+#define GPU_CC_CX_SNOC_DVM_CLK                 6
+#define GPU_CC_CXO_AON_CLK                     7
+#define GPU_CC_CXO_CLK                         8
+#define GPU_CC_GMU_CLK_SRC                     9
+#define GPU_CC_SLEEP_CLK                       10
+#define GPU_CC_GX_GFX3D_CLK                    11
+#define GPU_CC_GX_GFX3D_CLK_SRC                        12
+#define GPU_CC_AHB_CLK                         13
+#define GPU_CC_HLOS1_VOTE_GPU_SMMU_CLK         14
+
+/* GDSCs */
+#define GPU_CX_GDSC                            0
+#define GPU_GX_GDSC                            1
+
+#endif
diff --git a/include/dt-bindings/clock/qcom,sm6375-gpucc.h b/include/dt-bindings/clock/qcom,sm6375-gpucc.h
new file mode 100644 (file)
index 0000000..0887ac0
--- /dev/null
@@ -0,0 +1,36 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023, Linaro Limited
+ */
+
+#ifndef _DT_BINDINGS_CLK_QCOM_GPU_CC_BLAIR_H
+#define _DT_BINDINGS_CLK_QCOM_GPU_CC_BLAIR_H
+
+/* GPU CC clocks */
+#define GPU_CC_PLL0                                    0
+#define GPU_CC_PLL1                                    1
+#define GPU_CC_AHB_CLK                                 2
+#define GPU_CC_CX_GFX3D_CLK                            3
+#define GPU_CC_CX_GFX3D_SLV_CLK                                4
+#define GPU_CC_CX_GMU_CLK                              5
+#define GPU_CC_CX_SNOC_DVM_CLK                         6
+#define GPU_CC_CXO_AON_CLK                             7
+#define GPU_CC_CXO_CLK                                 8
+#define GPU_CC_GMU_CLK_SRC                             9
+#define GPU_CC_GX_CXO_CLK                              10
+#define GPU_CC_GX_GFX3D_CLK                            11
+#define GPU_CC_GX_GFX3D_CLK_SRC                                12
+#define GPU_CC_GX_GMU_CLK                              13
+#define GPU_CC_SLEEP_CLK                               14
+
+/* GDSCs */
+#define GPU_CX_GDSC                                    0
+#define GPU_GX_GDSC                                    1
+
+/* Resets */
+#define GPU_GX_BCR                                     0
+#define GPU_ACD_BCR                                    1
+#define GPU_GX_ACD_MISC_BCR                            2
+
+#endif
diff --git a/include/dt-bindings/clock/qcom,sm7150-gcc.h b/include/dt-bindings/clock/qcom,sm7150-gcc.h
new file mode 100644 (file)
index 0000000..7719ffc
--- /dev/null
@@ -0,0 +1,186 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023, Danila Tikhonov <danila@jiaxyga.com>
+ * Copyright (c) 2023, David Wronek <davidwronek@gmail.com>
+ */
+
+#ifndef _DT_BINDINGS_CLK_QCOM_GCC_SM7150_H
+#define _DT_BINDINGS_CLK_QCOM_GCC_SM7150_H
+
+/* GCC clock registers */
+#define GCC_GPLL0_MAIN_DIV_CDIV                                0
+#define GPLL0                                          1
+#define GPLL0_OUT_EVEN                                 2
+#define GPLL6                                          3
+#define GPLL7                                          4
+#define GCC_AGGRE_NOC_PCIE_TBU_CLK                     5
+#define GCC_AGGRE_UFS_PHY_AXI_CLK                      6
+#define GCC_AGGRE_UFS_PHY_AXI_HW_CTL_CLK               7
+#define GCC_AGGRE_USB3_PRIM_AXI_CLK                    8
+#define GCC_APC_VS_CLK                                 9
+#define GCC_BOOT_ROM_AHB_CLK                           10
+#define GCC_CAMERA_HF_AXI_CLK                          11
+#define GCC_CAMERA_SF_AXI_CLK                          12
+#define GCC_CE1_AHB_CLK                                        13
+#define GCC_CE1_AXI_CLK                                        14
+#define GCC_CE1_CLK                                    15
+#define GCC_CFG_NOC_USB3_PRIM_AXI_CLK                  16
+#define GCC_CPUSS_AHB_CLK                              17
+#define GCC_CPUSS_AHB_CLK_SRC                          18
+#define GCC_CPUSS_RBCPR_CLK                            19
+#define GCC_CPUSS_RBCPR_CLK_SRC                                20
+#define GCC_DDRSS_GPU_AXI_CLK                          21
+#define GCC_DISP_GPLL0_CLK_SRC                         22
+#define GCC_DISP_GPLL0_DIV_CLK_SRC                     23
+#define GCC_DISP_HF_AXI_CLK                            24
+#define GCC_DISP_SF_AXI_CLK                            25
+#define GCC_GP1_CLK                                    26
+#define GCC_GP1_CLK_SRC                                        27
+#define GCC_GP2_CLK                                    28
+#define GCC_GP2_CLK_SRC                                        29
+#define GCC_GP3_CLK                                    30
+#define GCC_GP3_CLK_SRC                                        31
+#define GCC_GPU_GPLL0_CLK_SRC                          32
+#define GCC_GPU_GPLL0_DIV_CLK_SRC                      33
+#define GCC_GPU_MEMNOC_GFX_CLK                         34
+#define GCC_GPU_SNOC_DVM_GFX_CLK                       35
+#define GCC_GPU_VS_CLK                                 36
+#define GCC_NPU_AXI_CLK                                        37
+#define GCC_NPU_CFG_AHB_CLK                            38
+#define GCC_NPU_GPLL0_CLK_SRC                          39
+#define GCC_NPU_GPLL0_DIV_CLK_SRC                      40
+#define GCC_PCIE_0_AUX_CLK                             41
+#define GCC_PCIE_0_AUX_CLK_SRC                         42
+#define GCC_PCIE_0_CFG_AHB_CLK                         43
+#define GCC_PCIE_0_CLKREF_CLK                          44
+#define GCC_PCIE_0_MSTR_AXI_CLK                                45
+#define GCC_PCIE_0_PIPE_CLK                            46
+#define GCC_PCIE_0_SLV_AXI_CLK                         47
+#define GCC_PCIE_0_SLV_Q2A_AXI_CLK                     48
+#define GCC_PCIE_PHY_AUX_CLK                           49
+#define GCC_PCIE_PHY_REFGEN_CLK                                50
+#define GCC_PCIE_PHY_REFGEN_CLK_SRC                    51
+#define GCC_PDM2_CLK                                   52
+#define GCC_PDM2_CLK_SRC                               53
+#define GCC_PDM_AHB_CLK                                        54
+#define GCC_PDM_XO4_CLK                                        55
+#define GCC_PRNG_AHB_CLK                               56
+#define GCC_QUPV3_WRAP0_CORE_2X_CLK                    57
+#define GCC_QUPV3_WRAP0_CORE_CLK                       58
+#define GCC_QUPV3_WRAP0_S0_CLK                         59
+#define GCC_QUPV3_WRAP0_S0_CLK_SRC                     60
+#define GCC_QUPV3_WRAP0_S1_CLK                         61
+#define GCC_QUPV3_WRAP0_S1_CLK_SRC                     62
+#define GCC_QUPV3_WRAP0_S2_CLK                         63
+#define GCC_QUPV3_WRAP0_S2_CLK_SRC                     64
+#define GCC_QUPV3_WRAP0_S3_CLK                         65
+#define GCC_QUPV3_WRAP0_S3_CLK_SRC                     66
+#define GCC_QUPV3_WRAP0_S4_CLK                         67
+#define GCC_QUPV3_WRAP0_S4_CLK_SRC                     68
+#define GCC_QUPV3_WRAP0_S5_CLK                         69
+#define GCC_QUPV3_WRAP0_S5_CLK_SRC                     70
+#define GCC_QUPV3_WRAP0_S6_CLK                         71
+#define GCC_QUPV3_WRAP0_S6_CLK_SRC                     72
+#define GCC_QUPV3_WRAP0_S7_CLK                         73
+#define GCC_QUPV3_WRAP0_S7_CLK_SRC                     74
+#define GCC_QUPV3_WRAP1_CORE_2X_CLK                    75
+#define GCC_QUPV3_WRAP1_CORE_CLK                       76
+#define GCC_QUPV3_WRAP1_S0_CLK                         77
+#define GCC_QUPV3_WRAP1_S0_CLK_SRC                     78
+#define GCC_QUPV3_WRAP1_S1_CLK                         79
+#define GCC_QUPV3_WRAP1_S1_CLK_SRC                     80
+#define GCC_QUPV3_WRAP1_S2_CLK                         81
+#define GCC_QUPV3_WRAP1_S2_CLK_SRC                     82
+#define GCC_QUPV3_WRAP1_S3_CLK                         83
+#define GCC_QUPV3_WRAP1_S3_CLK_SRC                     84
+#define GCC_QUPV3_WRAP1_S4_CLK                         85
+#define GCC_QUPV3_WRAP1_S4_CLK_SRC                     86
+#define GCC_QUPV3_WRAP1_S5_CLK                         87
+#define GCC_QUPV3_WRAP1_S5_CLK_SRC                     88
+#define GCC_QUPV3_WRAP1_S6_CLK                         89
+#define GCC_QUPV3_WRAP1_S6_CLK_SRC                     90
+#define GCC_QUPV3_WRAP1_S7_CLK                         91
+#define GCC_QUPV3_WRAP1_S7_CLK_SRC                     92
+#define GCC_QUPV3_WRAP_0_M_AHB_CLK                     93
+#define GCC_QUPV3_WRAP_0_S_AHB_CLK                     94
+#define GCC_QUPV3_WRAP_1_M_AHB_CLK                     95
+#define GCC_QUPV3_WRAP_1_S_AHB_CLK                     96
+#define GCC_SDCC1_AHB_CLK                              97
+#define GCC_SDCC1_APPS_CLK                             98
+#define GCC_SDCC1_APPS_CLK_SRC                         99
+#define GCC_SDCC1_ICE_CORE_CLK                         100
+#define GCC_SDCC1_ICE_CORE_CLK_SRC                     101
+#define GCC_SDCC2_AHB_CLK                              102
+#define GCC_SDCC2_APPS_CLK                             103
+#define GCC_SDCC2_APPS_CLK_SRC                         104
+#define GCC_SDCC4_AHB_CLK                              105
+#define GCC_SDCC4_APPS_CLK                             106
+#define GCC_SDCC4_APPS_CLK_SRC                         107
+#define GCC_SYS_NOC_CPUSS_AHB_CLK                      108
+#define GCC_TSIF_AHB_CLK                               109
+#define GCC_TSIF_INACTIVITY_TIMERS_CLK                 110
+#define GCC_TSIF_REF_CLK                               111
+#define GCC_TSIF_REF_CLK_SRC                           112
+#define GCC_UFS_MEM_CLKREF_CLK                         113
+#define GCC_UFS_PHY_AHB_CLK                            114
+#define GCC_UFS_PHY_AXI_CLK                            115
+#define GCC_UFS_PHY_AXI_CLK_SRC                                116
+#define GCC_UFS_PHY_AXI_HW_CTL_CLK                     117
+#define GCC_UFS_PHY_ICE_CORE_CLK                       118
+#define GCC_UFS_PHY_ICE_CORE_CLK_SRC                   119
+#define GCC_UFS_PHY_ICE_CORE_HW_CTL_CLK                        120
+#define GCC_UFS_PHY_PHY_AUX_CLK                                121
+#define GCC_UFS_PHY_PHY_AUX_CLK_SRC                    122
+#define GCC_UFS_PHY_PHY_AUX_HW_CTL_CLK                 123
+#define GCC_UFS_PHY_RX_SYMBOL_0_CLK                    124
+#define GCC_UFS_PHY_TX_SYMBOL_0_CLK                    125
+#define GCC_UFS_PHY_UNIPRO_CORE_CLK                    126
+#define GCC_UFS_PHY_UNIPRO_CORE_CLK_SRC                        127
+#define GCC_UFS_PHY_UNIPRO_CORE_HW_CTL_CLK             128
+#define GCC_USB30_PRIM_MASTER_CLK                      129
+#define GCC_USB30_PRIM_MASTER_CLK_SRC                  130
+#define GCC_USB30_PRIM_MOCK_UTMI_CLK                   131
+#define GCC_USB30_PRIM_MOCK_UTMI_CLK_SRC               132
+#define GCC_USB30_PRIM_SLEEP_CLK                       133
+#define GCC_USB3_PRIM_CLKREF_CLK                       134
+#define GCC_USB3_PRIM_PHY_AUX_CLK                      135
+#define GCC_USB3_PRIM_PHY_AUX_CLK_SRC                  136
+#define GCC_USB3_PRIM_PHY_COM_AUX_CLK                  137
+#define GCC_USB3_PRIM_PHY_PIPE_CLK                     138
+#define GCC_USB_PHY_CFG_AHB2PHY_CLK                    139
+#define GCC_VDDA_VS_CLK                                        140
+#define GCC_VDDCX_VS_CLK                               141
+#define GCC_VDDMX_VS_CLK                               142
+#define GCC_VIDEO_AXI_CLK                              143
+#define GCC_VS_CTRL_AHB_CLK                            144
+#define GCC_VS_CTRL_CLK                                        145
+#define GCC_VS_CTRL_CLK_SRC                            146
+#define GCC_VSENSOR_CLK_SRC                            147
+
+/* GCC Resets */
+#define GCC_PCIE_0_BCR                                 0
+#define GCC_PCIE_PHY_BCR                               1
+#define GCC_PCIE_PHY_COM_BCR                           2
+#define GCC_UFS_PHY_BCR                                        3
+#define GCC_USB30_PRIM_BCR                             4
+#define GCC_USB3_DP_PHY_PRIM_BCR                       5
+#define GCC_USB3_DP_PHY_SEC_BCR                                6
+#define GCC_USB3_PHY_PRIM_BCR                          7
+#define GCC_USB3_PHY_SEC_BCR                           8
+#define GCC_QUSB2PHY_PRIM_BCR                          9
+#define GCC_VIDEO_AXI_CLK_BCR                          10
+
+/* GCC GDSCRs */
+#define PCIE_0_GDSC                                    0
+#define UFS_PHY_GDSC                                   1
+#define USB30_PRIM_GDSC                                        2
+#define HLOS1_VOTE_AGGRE_NOC_MMU_AUDIO_TBU_GDSC                3
+#define HLOS1_VOTE_AGGRE_NOC_MMU_PCIE_TBU_GDSC         4
+#define HLOS1_VOTE_AGGRE_NOC_MMU_TBU1_GDSC             5
+#define HLOS1_VOTE_AGGRE_NOC_MMU_TBU2_GDSC             6
+#define HLOS1_VOTE_MMNOC_MMU_TBU_HF0_GDSC              7
+#define HLOS1_VOTE_MMNOC_MMU_TBU_HF1_GDSC              8
+#define HLOS1_VOTE_MMNOC_MMU_TBU_SF_GDSC               9
+
+#endif
diff --git a/include/dt-bindings/reset/qcom,ipq9574-gcc.h b/include/dt-bindings/reset/qcom,ipq9574-gcc.h
new file mode 100644 (file)
index 0000000..d01dc6a
--- /dev/null
@@ -0,0 +1,164 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/*
+ * Copyright (c) 2018-2023, The Linux Foundation. All rights reserved.
+ */
+
+#ifndef _DT_BINDINGS_RESET_IPQ_GCC_9574_H
+#define _DT_BINDINGS_RESET_IPQ_GCC_9574_H
+
+#define GCC_ADSS_BCR                                           0
+#define GCC_APC0_VOLTAGE_DROOP_DETECTOR_BCR                    1
+#define GCC_BLSP1_BCR                                          2
+#define GCC_BLSP1_QUP1_BCR                                     3
+#define GCC_BLSP1_QUP2_BCR                                     4
+#define GCC_BLSP1_QUP3_BCR                                     5
+#define GCC_BLSP1_QUP4_BCR                                     6
+#define GCC_BLSP1_QUP5_BCR                                     7
+#define GCC_BLSP1_QUP6_BCR                                     8
+#define GCC_BLSP1_UART1_BCR                                    9
+#define GCC_BLSP1_UART2_BCR                                    10
+#define GCC_BLSP1_UART3_BCR                                    11
+#define GCC_BLSP1_UART4_BCR                                    12
+#define GCC_BLSP1_UART5_BCR                                    13
+#define GCC_BLSP1_UART6_BCR                                    14
+#define GCC_BOOT_ROM_BCR                                       15
+#define GCC_MDIO_BCR                                           16
+#define GCC_NSS_BCR                                            17
+#define GCC_NSS_TBU_BCR                                                18
+#define GCC_PCIE0_BCR                                          19
+#define GCC_PCIE0_LINK_DOWN_BCR                                        20
+#define GCC_PCIE0_PHY_BCR                                      21
+#define GCC_PCIE0PHY_PHY_BCR                                   22
+#define GCC_PCIE1_BCR                                          23
+#define GCC_PCIE1_LINK_DOWN_BCR                                        24
+#define GCC_PCIE1_PHY_BCR                                      25
+#define GCC_PCIE1PHY_PHY_BCR                                   26
+#define GCC_PCIE2_BCR                                          27
+#define GCC_PCIE2_LINK_DOWN_BCR                                        28
+#define GCC_PCIE2_PHY_BCR                                      29
+#define GCC_PCIE2PHY_PHY_BCR                                   30
+#define GCC_PCIE3_BCR                                          31
+#define GCC_PCIE3_LINK_DOWN_BCR                                        32
+#define GCC_PCIE3_PHY_BCR                                      33
+#define GCC_PCIE3PHY_PHY_BCR                                   34
+#define GCC_PRNG_BCR                                           35
+#define GCC_QUSB2_0_PHY_BCR                                    36
+#define GCC_SDCC_BCR                                           37
+#define GCC_TLMM_BCR                                           38
+#define GCC_UNIPHY0_BCR                                                39
+#define GCC_UNIPHY1_BCR                                                40
+#define GCC_UNIPHY2_BCR                                                41
+#define GCC_USB0_PHY_BCR                                       42
+#define GCC_USB3PHY_0_PHY_BCR                                  43
+#define GCC_USB_BCR                                            44
+#define GCC_ANOC0_TBU_BCR                                      45
+#define GCC_ANOC1_TBU_BCR                                      46
+#define GCC_ANOC_BCR                                           47
+#define GCC_APSS_TCU_BCR                                       48
+#define GCC_CMN_BLK_BCR                                                49
+#define GCC_CMN_BLK_AHB_ARES                                   50
+#define GCC_CMN_BLK_SYS_ARES                                   51
+#define GCC_CMN_BLK_APU_ARES                                   52
+#define GCC_DCC_BCR                                            53
+#define GCC_DDRSS_BCR                                          54
+#define GCC_IMEM_BCR                                           55
+#define GCC_LPASS_BCR                                          56
+#define GCC_MPM_BCR                                            57
+#define GCC_MSG_RAM_BCR                                                58
+#define GCC_NSSNOC_MEMNOC_1_ARES                               59
+#define GCC_NSSNOC_PCNOC_1_ARES                                        60
+#define GCC_NSSNOC_SNOC_1_ARES                                 61
+#define GCC_NSSNOC_XO_DCD_ARES                                 62
+#define GCC_NSSNOC_TS_ARES                                     63
+#define GCC_NSSCC_ARES                                         64
+#define GCC_NSSNOC_NSSCC_ARES                                  65
+#define GCC_NSSNOC_ATB_ARES                                    66
+#define GCC_NSSNOC_MEMNOC_ARES                                 67
+#define GCC_NSSNOC_QOSGEN_REF_ARES                             68
+#define GCC_NSSNOC_SNOC_ARES                                   69
+#define GCC_NSSNOC_TIMEOUT_REF_ARES                            70
+#define GCC_NSS_CFG_ARES                                       71
+#define GCC_UBI0_DBG_ARES                                      72
+#define GCC_PCIE0_AHB_ARES                                     73
+#define GCC_PCIE0_AUX_ARES                                     74
+#define GCC_PCIE0_AXI_M_ARES                                   75
+#define GCC_PCIE0_AXI_M_STICKY_ARES                            76
+#define GCC_PCIE0_AXI_S_ARES                                   77
+#define GCC_PCIE0_AXI_S_STICKY_ARES                            78
+#define GCC_PCIE0_CORE_STICKY_ARES                             79
+#define GCC_PCIE0_PIPE_ARES                                    80
+#define GCC_PCIE1_AHB_ARES                                     81
+#define GCC_PCIE1_AUX_ARES                                     82
+#define GCC_PCIE1_AXI_M_ARES                                   83
+#define GCC_PCIE1_AXI_M_STICKY_ARES                            84
+#define GCC_PCIE1_AXI_S_ARES                                   85
+#define GCC_PCIE1_AXI_S_STICKY_ARES                            86
+#define GCC_PCIE1_CORE_STICKY_ARES                             87
+#define GCC_PCIE1_PIPE_ARES                                    88
+#define GCC_PCIE2_AHB_ARES                                     89
+#define GCC_PCIE2_AUX_ARES                                     90
+#define GCC_PCIE2_AXI_M_ARES                                   91
+#define GCC_PCIE2_AXI_M_STICKY_ARES                            92
+#define GCC_PCIE2_AXI_S_ARES                                   93
+#define GCC_PCIE2_AXI_S_STICKY_ARES                            94
+#define GCC_PCIE2_CORE_STICKY_ARES                             95
+#define GCC_PCIE2_PIPE_ARES                                    96
+#define GCC_PCIE3_AHB_ARES                                     97
+#define GCC_PCIE3_AUX_ARES                                     98
+#define GCC_PCIE3_AXI_M_ARES                                   99
+#define GCC_PCIE3_AXI_M_STICKY_ARES                            100
+#define GCC_PCIE3_AXI_S_ARES                                   101
+#define GCC_PCIE3_AXI_S_STICKY_ARES                            102
+#define GCC_PCIE3_CORE_STICKY_ARES                             103
+#define GCC_PCIE3_PIPE_ARES                                    104
+#define GCC_PCNOC_BCR                                          105
+#define GCC_PCNOC_BUS_TIMEOUT0_BCR                             106
+#define GCC_PCNOC_BUS_TIMEOUT1_BCR                             107
+#define GCC_PCNOC_BUS_TIMEOUT2_BCR                             108
+#define GCC_PCNOC_BUS_TIMEOUT3_BCR                             109
+#define GCC_PCNOC_BUS_TIMEOUT4_BCR                             110
+#define GCC_PCNOC_BUS_TIMEOUT5_BCR                             111
+#define GCC_PCNOC_BUS_TIMEOUT6_BCR                             112
+#define GCC_PCNOC_BUS_TIMEOUT7_BCR                             113
+#define GCC_PCNOC_BUS_TIMEOUT8_BCR                             114
+#define GCC_PCNOC_BUS_TIMEOUT9_BCR                             115
+#define GCC_PCNOC_TBU_BCR                                      116
+#define GCC_Q6SS_DBG_ARES                                      117
+#define GCC_Q6_AHB_ARES                                                118
+#define GCC_Q6_AHB_S_ARES                                      119
+#define GCC_Q6_AXIM2_ARES                                      120
+#define GCC_Q6_AXIM_ARES                                       121
+#define GCC_QDSS_BCR                                           122
+#define GCC_QPIC_BCR                                           123
+#define GCC_QPIC_AHB_ARES                                      124
+#define GCC_QPIC_ARES                                          125
+#define GCC_RBCPR_BCR                                          126
+#define GCC_RBCPR_MX_BCR                                       127
+#define GCC_SEC_CTRL_BCR                                       128
+#define GCC_SMMU_CFG_BCR                                       129
+#define GCC_SNOC_BCR                                           130
+#define GCC_SPDM_BCR                                           131
+#define GCC_TME_BCR                                            132
+#define GCC_UNIPHY0_SYS_RESET                                  133
+#define GCC_UNIPHY0_AHB_RESET                                  134
+#define GCC_UNIPHY0_XPCS_RESET                                 135
+#define GCC_UNIPHY1_SYS_RESET                                  136
+#define GCC_UNIPHY1_AHB_RESET                                  137
+#define GCC_UNIPHY1_XPCS_RESET                                 138
+#define GCC_UNIPHY2_SYS_RESET                                  139
+#define GCC_UNIPHY2_AHB_RESET                                  140
+#define GCC_UNIPHY2_XPCS_RESET                                 141
+#define GCC_USB_MISC_RESET                                     142
+#define GCC_WCSSAON_RESET                                      143
+#define GCC_WCSS_ACMT_ARES                                     144
+#define GCC_WCSS_AHB_S_ARES                                    145
+#define GCC_WCSS_AXI_M_ARES                                    146
+#define GCC_WCSS_BCR                                           147
+#define GCC_WCSS_DBG_ARES                                      148
+#define GCC_WCSS_DBG_BDG_ARES                                  149
+#define GCC_WCSS_ECAHB_ARES                                    150
+#define GCC_WCSS_Q6_BCR                                                151
+#define GCC_WCSS_Q6_TBU_BCR                                    152
+#define GCC_TCSR_BCR                                           153
+
+#endif