Merge branches 'clk-microchip', 'clk-xilinx', 'clk-allwinner', 'clk-imx' and 'clk-qcom' into clk-next

* clk-microchip:
clk: at91: sama7d65: add sama7d65 pmc driver
dt-bindings: clock: Add SAMA7D65 PMC compatible string
dt-bindings: clocks: atmel,at91sam9x5-sckc: add sama7d65
clk: at91: sckc: Use SCKC_{TD, MD}_SLCK IDs for clk32k clocks
dt-bindings: clk: at91: Add clock IDs for the slow clock controller

* clk-xilinx:
clk: clocking-wizard: calculate dividers fractional parts
dt-bindings: clock: xilinx: Add reset GPIO for VCU
dt-bindings: clock: xilinx: Convert VCU bindings to dtschema

* clk-allwinner:
clk: sunxi-ng: h616: Reparent CPU clock during frequency changes
clk: sunxi-ng: a64: stop force-selecting PLL-MIPI as TCON0 parent
clk: sunxi-ng: a64: drop redundant CLK_PLL_VIDEO0_2X and CLK_PLL_MIPI
dt-bindings: clock: sunxi: Export PLL_VIDEO_2X and PLL_MIPI

* clk-imx:
clk: imx: Apply some clks only for i.MX93
arm64: dts: imx93: Use IMX93_CLK_SPDIF_IPG as SPDIF IPG clock
clk: imx93: Add IMX93_CLK_SPDIF_IPG clock
dt-bindings: clock: imx93: Add SPDIF IPG clk
clk: imx: pll14xx: Add 208 MHz and 416 MHz entries for PLL1416x
clk: imx8mp: Fix clkout1/2 support

* clk-qcom: (63 commits)
clk: qcom: Select CLK_X1E80100_GCC in config CLK_X1P42100_GPUCC
dt-bindings: clock: move qcom,x1e80100-camcc to its own file
clk: qcom: smd-rpm: Add clocks for MSM8940
dt-bindings: clock: qcom,rpmcc: Add MSM8940 compatible
clk: qcom: smd-rpm: Add clocks for MSM8937
dt-bindings: clock: qcom,rpmcc: Add MSM8937 compatible
clk: qcom: ipq5424: Use icc-clk for enabling NoC related clocks
dt-bindings: interconnect: Add Qualcomm IPQ5424 support
clk: qcom: Add SM6115 LPASSCC
dt-bindings: clock: Add Qualcomm SM6115 LPASS clock controller
clk: qcom: gcc-sdm845: Do not use shared clk_ops for QUPs
clk: qcom: gcc-sdm845: Add general purpose clock ops
clk: qcom: clk-rcg2: split __clk_rcg2_configure function
clk: qcom: clk-rcg2: document calc_rate function
clk: qcom: gcc-x1e80100: Do not turn off usb_2 controller GDSC
clk: qcom: ipq5424: add gcc_xo_clk
dt-bindings: clock: qcom: gcc-ipq5424: add gcc_xo_clk macro
dt-bindings: clock: qcom: gcc-ipq5424: remove apss_dbg clock macro
clk: qcom: ipq5424: remove apss_dbg clock
dt-bindings: clock: qcom,sdm845-camcc: add sdm670 compatible
...

+12841 -267
+2
Documentation/devicetree/bindings/clock/atmel,at91rm9200-pmc.yaml
··· 43 43 - atmel,sama5d4-pmc 44 44 - microchip,sam9x60-pmc 45 45 - microchip,sam9x7-pmc 46 + - microchip,sama7d65-pmc 46 47 - microchip,sama7g5-pmc 47 48 - const: syscon 48 49 ··· 91 90 enum: 92 91 - microchip,sam9x60-pmc 93 92 - microchip,sam9x7-pmc 93 + - microchip,sama7d65-pmc 94 94 - microchip,sama7g5-pmc 95 95 then: 96 96 properties:
+1
Documentation/devicetree/bindings/clock/atmel,at91sam9x5-sckc.yaml
··· 20 20 - items: 21 21 - enum: 22 22 - microchip,sam9x7-sckc 23 + - microchip,sama7d65-sckc 23 24 - microchip,sama7g5-sckc 24 25 - const: microchip,sam9x60-sckc 25 26
+77
Documentation/devicetree/bindings/clock/qcom,ipq9574-cmn-pll.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/clock/qcom,ipq9574-cmn-pll.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm CMN PLL Clock Controller on IPQ SoC 8 + 9 + maintainers: 10 + - Bjorn Andersson <andersson@kernel.org> 11 + - Luo Jie <quic_luoj@quicinc.com> 12 + 13 + description: 14 + The CMN (or common) PLL clock controller expects a reference 15 + input clock. This reference clock is from the on-board Wi-Fi. 16 + The CMN PLL supplies a number of fixed rate output clocks to 17 + the devices providing networking functions and to GCC. These 18 + networking hardware include PPE (packet process engine), PCS 19 + and the externally connected switch or PHY devices. The CMN 20 + PLL block also outputs fixed rate clocks to GCC. The PLL's 21 + primary function is to enable fixed rate output clocks for 22 + networking hardware functions used with the IPQ SoC. 23 + 24 + properties: 25 + compatible: 26 + enum: 27 + - qcom,ipq9574-cmn-pll 28 + 29 + reg: 30 + maxItems: 1 31 + 32 + clocks: 33 + items: 34 + - description: The reference clock. The supported clock rates include 35 + 25000000, 31250000, 40000000, 48000000, 50000000 and 96000000 HZ. 36 + - description: The AHB clock 37 + - description: The SYS clock 38 + description: 39 + The reference clock is the source clock of CMN PLL, which is from the 40 + Wi-Fi. The AHB and SYS clocks must be enabled to access CMN PLL 41 + clock registers. 42 + 43 + clock-names: 44 + items: 45 + - const: ref 46 + - const: ahb 47 + - const: sys 48 + 49 + "#clock-cells": 50 + const: 1 51 + 52 + required: 53 + - compatible 54 + - reg 55 + - clocks 56 + - clock-names 57 + - "#clock-cells" 58 + 59 + additionalProperties: false 60 + 61 + examples: 62 + - | 63 + #include <dt-bindings/clock/qcom,ipq-cmn-pll.h> 64 + #include <dt-bindings/clock/qcom,ipq9574-gcc.h> 65 + 66 + cmn_pll: clock-controller@9b000 { 67 + compatible = "qcom,ipq9574-cmn-pll"; 68 + reg = <0x0009b000 0x800>; 69 + clocks = <&cmn_pll_ref_clk>, 70 + <&gcc GCC_CMN_12GPLL_AHB_CLK>, 71 + <&gcc GCC_CMN_12GPLL_SYS_CLK>; 72 + clock-names = "ref", "ahb", "sys"; 73 + #clock-cells = <1>; 74 + assigned-clocks = <&cmn_pll CMN_PLL_CLK>; 75 + assigned-clock-rates-u64 = /bits/ 64 <12000000000>; 76 + }; 77 + ...
+4
Documentation/devicetree/bindings/clock/qcom,mmcc.yaml
··· 78 78 then: 79 79 properties: 80 80 clocks: 81 + minItems: 8 81 82 items: 82 83 - description: Board PXO source 83 84 - description: PLL 3 clock ··· 88 87 - description: DSI phy instance 2 dsi clock 89 88 - description: DSI phy instance 2 byte clock 90 89 - description: HDMI phy PLL clock 90 + - description: LVDS PLL clock 91 91 92 92 clock-names: 93 + minItems: 8 93 94 items: 94 95 - const: pxo 95 96 - const: pll3 ··· 101 98 - const: dsi2pll 102 99 - const: dsi2pllbyte 103 100 - const: hdmipll 101 + - const: lvdspll 104 102 105 103 - if: 106 104 properties:
+59
Documentation/devicetree/bindings/clock/qcom,qcs615-gcc.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/clock/qcom,qcs615-gcc.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm Global Clock & Reset Controller on QCS615 8 + 9 + maintainers: 10 + - Taniya Das <quic_tdas@quicinc.com> 11 + 12 + description: | 13 + Qualcomm global clock control module provides the clocks, resets and power 14 + domains on QCS615. 15 + 16 + See also: include/dt-bindings/clock/qcom,qcs615-gcc.h 17 + 18 + properties: 19 + compatible: 20 + const: qcom,qcs615-gcc 21 + 22 + clocks: 23 + items: 24 + - description: Board XO source 25 + - description: Board active XO source 26 + - description: Sleep clock source 27 + 28 + clock-names: 29 + items: 30 + - const: bi_tcxo 31 + - const: bi_tcxo_ao 32 + - const: sleep_clk 33 + 34 + required: 35 + - compatible 36 + - clocks 37 + - clock-names 38 + - '#power-domain-cells' 39 + 40 + allOf: 41 + - $ref: qcom,gcc.yaml# 42 + 43 + unevaluatedProperties: false 44 + 45 + examples: 46 + - | 47 + #include <dt-bindings/clock/qcom,rpmh.h> 48 + clock-controller@100000 { 49 + compatible = "qcom,qcs615-gcc"; 50 + reg = <0x00100000 0x1f0000>; 51 + clocks = <&rpmhcc RPMH_CXO_CLK>, 52 + <&rpmhcc RPMH_CXO_CLK_A>, 53 + <&sleep_clk>; 54 + clock-names = "bi_tcxo", "bi_tcxo_ao", "sleep_clk"; 55 + #clock-cells = <1>; 56 + #reset-cells = <1>; 57 + #power-domain-cells = <1>; 58 + }; 59 + ...
+4
Documentation/devicetree/bindings/clock/qcom,rpmcc.yaml
··· 33 33 - qcom,rpmcc-msm8916 34 34 - qcom,rpmcc-msm8917 35 35 - qcom,rpmcc-msm8936 36 + - qcom,rpmcc-msm8937 37 + - qcom,rpmcc-msm8940 36 38 - qcom,rpmcc-msm8953 37 39 - qcom,rpmcc-msm8974 38 40 - qcom,rpmcc-msm8976 ··· 112 110 - qcom,rpmcc-msm8916 113 111 - qcom,rpmcc-msm8917 114 112 - qcom,rpmcc-msm8936 113 + - qcom,rpmcc-msm8937 114 + - qcom,rpmcc-msm8940 115 115 - qcom,rpmcc-msm8953 116 116 - qcom,rpmcc-msm8974 117 117 - qcom,rpmcc-msm8976
+2
Documentation/devicetree/bindings/clock/qcom,rpmhcc.yaml
··· 17 17 properties: 18 18 compatible: 19 19 enum: 20 + - qcom,qcs615-rpmh-clk 20 21 - qcom,qdu1000-rpmh-clk 21 22 - qcom,sa8775p-rpmh-clk 22 23 - qcom,sar2130p-rpmh-clk ··· 38 37 - qcom,sm8450-rpmh-clk 39 38 - qcom,sm8550-rpmh-clk 40 39 - qcom,sm8650-rpmh-clk 40 + - qcom,sm8750-rpmh-clk 41 41 - qcom,x1e80100-rpmh-clk 42 42 43 43 clocks:
+17 -10
Documentation/devicetree/bindings/clock/qcom,sc7280-lpasscorecc.yaml
··· 18 18 include/dt-bindings/clock/qcom,lpassaudiocc-sc7280.h 19 19 20 20 properties: 21 - clocks: true 22 - 23 - clock-names: true 24 - 25 - reg: true 26 - 27 21 compatible: 28 22 enum: 29 23 - qcom,sc7280-lpassaoncc ··· 25 31 - qcom,sc7280-lpasscorecc 26 32 - qcom,sc7280-lpasshm 27 33 28 - power-domains: 29 - maxItems: 1 34 + reg: 35 + minItems: 1 36 + maxItems: 2 37 + 38 + clocks: 39 + minItems: 1 40 + maxItems: 3 41 + 42 + clock-names: 43 + minItems: 1 44 + maxItems: 3 30 45 31 46 '#clock-cells': 32 47 const: 1 48 + 49 + power-domains: 50 + maxItems: 1 33 51 34 52 '#power-domain-cells': 35 53 const: 1 ··· 62 56 - clock-names 63 57 - '#clock-cells' 64 58 - '#power-domain-cells' 65 - 66 - additionalProperties: false 67 59 68 60 allOf: 69 61 - if: ··· 129 125 130 126 reg: 131 127 maxItems: 1 128 + 129 + additionalProperties: false 130 + 132 131 examples: 133 132 - | 134 133 #include <dt-bindings/clock/qcom,rpmh.h>
+5 -1
Documentation/devicetree/bindings/clock/qcom,sdm845-camcc.yaml
··· 20 20 21 21 properties: 22 22 compatible: 23 - const: qcom,sdm845-camcc 23 + oneOf: 24 + - items: 25 + - const: qcom,sdm670-camcc 26 + - const: qcom,sdm845-camcc 27 + - const: qcom,sdm845-camcc 24 28 25 29 clocks: 26 30 items:
+46
Documentation/devicetree/bindings/clock/qcom,sm6115-lpasscc.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/clock/qcom,sm6115-lpasscc.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm LPASS Core & Audio Clock Controller on SM6115 8 + 9 + maintainers: 10 + - Konrad Dybcio <konradybcio@kernel.org> 11 + - Srinivas Kandagatla <srinivas.kandagatla@linaro.org> 12 + 13 + description: | 14 + Qualcomm LPASS core and audio clock controllers provide audio-related resets 15 + on SM6115 and its derivatives. 16 + 17 + See also:: 18 + include/dt-bindings/clock/qcom,sm6115-lpasscc.h 19 + 20 + properties: 21 + compatible: 22 + enum: 23 + - qcom,sm6115-lpassaudiocc 24 + - qcom,sm6115-lpasscc 25 + 26 + reg: 27 + maxItems: 1 28 + 29 + '#reset-cells': 30 + const: 1 31 + 32 + required: 33 + - compatible 34 + - reg 35 + - '#reset-cells' 36 + 37 + additionalProperties: false 38 + 39 + examples: 40 + - | 41 + lpass_audiocc: clock-controller@a6a9000 { 42 + compatible = "qcom,sm6115-lpassaudiocc"; 43 + reg = <0x0a6a9000 0x1000>; 44 + #reset-cells = <1>; 45 + }; 46 + ...
-2
Documentation/devicetree/bindings/clock/qcom,sm8450-camcc.yaml
··· 19 19 include/dt-bindings/clock/qcom,sm8450-camcc.h 20 20 include/dt-bindings/clock/qcom,sm8550-camcc.h 21 21 include/dt-bindings/clock/qcom,sm8650-camcc.h 22 - include/dt-bindings/clock/qcom,x1e80100-camcc.h 23 22 24 23 properties: 25 24 compatible: ··· 28 29 - qcom,sm8475-camcc 29 30 - qcom,sm8550-camcc 30 31 - qcom,sm8650-camcc 31 - - qcom,x1e80100-camcc 32 32 33 33 clocks: 34 34 items:
+1
Documentation/devicetree/bindings/clock/qcom,sm8450-gpucc.yaml
··· 32 32 - qcom,sm8550-gpucc 33 33 - qcom,sm8650-gpucc 34 34 - qcom,x1e80100-gpucc 35 + - qcom,x1p42100-gpucc 35 36 36 37 clocks: 37 38 items:
+3 -1
Documentation/devicetree/bindings/clock/qcom,sm8550-dispcc.yaml
··· 12 12 13 13 description: | 14 14 Qualcomm display clock control module provides the clocks, resets and power 15 - domains on SM8550. 15 + domains on SM8550, SM8650, SM8750 and few other platforms. 16 16 17 17 See also: 18 18 - include/dt-bindings/clock/qcom,sm8550-dispcc.h 19 19 - include/dt-bindings/clock/qcom,sm8650-dispcc.h 20 + - include/dt-bindings/clock/qcom,sm8750-dispcc.h 20 21 - include/dt-bindings/clock/qcom,x1e80100-dispcc.h 21 22 22 23 properties: ··· 26 25 - qcom,sar2130p-dispcc 27 26 - qcom,sm8550-dispcc 28 27 - qcom,sm8650-dispcc 28 + - qcom,sm8750-dispcc 29 29 - qcom,x1e80100-dispcc 30 30 31 31 clocks:
+2
Documentation/devicetree/bindings/clock/qcom,sm8550-tcsr.yaml
··· 16 16 See also: 17 17 - include/dt-bindings/clock/qcom,sm8550-tcsr.h 18 18 - include/dt-bindings/clock/qcom,sm8650-tcsr.h 19 + - include/dt-bindings/clock/qcom,sm8750-tcsr.h 19 20 20 21 properties: 21 22 compatible: ··· 25 24 - qcom,sar2130p-tcsr 26 25 - qcom,sm8550-tcsr 27 26 - qcom,sm8650-tcsr 27 + - qcom,sm8750-tcsr 28 28 - qcom,x1e80100-tcsr 29 29 - const: syscon 30 30
+62
Documentation/devicetree/bindings/clock/qcom,sm8750-gcc.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/clock/qcom,sm8750-gcc.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm Global Clock & Reset Controller on SM8750 8 + 9 + maintainers: 10 + - Taniya Das <quic_tdas@quicinc.com> 11 + 12 + description: | 13 + Qualcomm global clock control module provides the clocks, resets and power 14 + domains on SM8750 15 + 16 + See also: include/dt-bindings/clock/qcom,sm8750-gcc.h 17 + 18 + properties: 19 + compatible: 20 + const: qcom,sm8750-gcc 21 + 22 + clocks: 23 + items: 24 + - description: Board XO source 25 + - description: Board Always On XO source 26 + - description: Sleep clock source 27 + - description: PCIE 0 Pipe clock source 28 + - description: UFS Phy Rx symbol 0 clock source 29 + - description: UFS Phy Rx symbol 1 clock source 30 + - description: UFS Phy Tx symbol 0 clock source 31 + - description: USB3 Phy wrapper pipe clock source 32 + 33 + required: 34 + - compatible 35 + - clocks 36 + - '#power-domain-cells' 37 + 38 + allOf: 39 + - $ref: qcom,gcc.yaml# 40 + 41 + unevaluatedProperties: false 42 + 43 + examples: 44 + - | 45 + #include <dt-bindings/clock/qcom,rpmh.h> 46 + clock-controller@100000 { 47 + compatible = "qcom,sm8750-gcc"; 48 + reg = <0x00100000 0x001f4200>; 49 + clocks = <&rpmhcc RPMH_CXO_CLK>, 50 + <&rpmhcc RPMH_CXO_CLK_A>, 51 + <&sleep_clk>, 52 + <&pcie0_phy>, 53 + <&ufs_mem_phy 0>, 54 + <&ufs_mem_phy 1>, 55 + <&ufs_mem_phy 2>, 56 + <&usb_1_qmpphy>; 57 + #clock-cells = <1>; 58 + #reset-cells = <1>; 59 + #power-domain-cells = <1>; 60 + }; 61 + 62 + ...
+74
Documentation/devicetree/bindings/clock/qcom,x1e80100-camcc.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/clock/qcom,x1e80100-camcc.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm Camera Clock & Reset Controller on x1e80100 8 + 9 + maintainers: 10 + - Bryan O'Donoghue <bryan.odonoghue@linaro.org> 11 + 12 + description: | 13 + Qualcomm camera clock control module provides the clocks, resets and power 14 + domains on x1e80100. 15 + 16 + See also: 17 + include/dt-bindings/clock/qcom,x1e80100-camcc.h 18 + 19 + allOf: 20 + - $ref: qcom,gcc.yaml# 21 + 22 + properties: 23 + compatible: 24 + enum: 25 + - qcom,x1e80100-camcc 26 + 27 + reg: 28 + maxItems: 1 29 + 30 + clocks: 31 + items: 32 + - description: Camera AHB clock from GCC 33 + - description: Board XO source 34 + - description: Board active XO source 35 + - description: Sleep clock source 36 + 37 + power-domains: 38 + items: 39 + - description: A phandle to the MXC power-domain 40 + - description: A phandle to the MMCX power-domain 41 + 42 + required-opps: 43 + maxItems: 1 44 + description: 45 + A phandle to an OPP node describing MMCX performance points. 46 + 47 + required: 48 + - compatible 49 + - clocks 50 + - power-domains 51 + - required-opps 52 + 53 + unevaluatedProperties: false 54 + 55 + examples: 56 + - | 57 + #include <dt-bindings/clock/qcom,x1e80100-gcc.h> 58 + #include <dt-bindings/clock/qcom,rpmh.h> 59 + #include <dt-bindings/power/qcom,rpmhpd.h> 60 + clock-controller@ade0000 { 61 + compatible = "qcom,x1e80100-camcc"; 62 + reg = <0xade0000 0x20000>; 63 + clocks = <&gcc GCC_CAMERA_AHB_CLK>, 64 + <&rpmhcc RPMH_CXO_CLK>, 65 + <&rpmhcc RPMH_CXO_CLK_A>, 66 + <&sleep_clk>; 67 + power-domains = <&rpmhpd RPMHPD_MXC>, 68 + <&rpmhpd RPMHPD_MMCX>; 69 + required-opps = <&rpmhpd_opp_low_svs>; 70 + #clock-cells = <1>; 71 + #reset-cells = <1>; 72 + #power-domain-cells = <1>; 73 + }; 74 + ...
+5 -1
Documentation/devicetree/bindings/clock/qcom,x1e80100-gcc.yaml
··· 17 17 18 18 properties: 19 19 compatible: 20 - const: qcom,x1e80100-gcc 20 + oneOf: 21 + - items: 22 + - const: qcom,x1p42100-gcc 23 + - const: qcom,x1e80100-gcc 24 + - const: qcom,x1e80100-gcc 21 25 22 26 clocks: 23 27 items:
+59
Documentation/devicetree/bindings/clock/xlnx,vcu.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/clock/xlnx,vcu.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + title: LogicoreIP designed compatible with Xilinx ZYNQ family. 7 + 8 + maintainers: 9 + - Rohit Visavalia <rohit.visavalia@amd.com> 10 + 11 + description: 12 + LogicoreIP design to provide the isolation between processing system 13 + and programmable logic. Also provides the list of register set to configure 14 + the frequency. 15 + 16 + properties: 17 + compatible: 18 + items: 19 + - enum: 20 + - xlnx,vcu 21 + - xlnx,vcu-logicoreip-1.0 22 + 23 + reg: 24 + maxItems: 1 25 + 26 + clocks: 27 + items: 28 + - description: pll ref clocksource 29 + - description: aclk 30 + 31 + clock-names: 32 + items: 33 + - const: pll_ref 34 + - const: aclk 35 + 36 + reset-gpios: 37 + maxItems: 1 38 + 39 + required: 40 + - reg 41 + - clocks 42 + - clock-names 43 + 44 + additionalProperties: false 45 + 46 + examples: 47 + - | 48 + #include <dt-bindings/gpio/gpio.h> 49 + fpga { 50 + #address-cells = <2>; 51 + #size-cells = <2>; 52 + xlnx_vcu: vcu@a0040000 { 53 + compatible = "xlnx,vcu-logicoreip-1.0"; 54 + reg = <0x0 0xa0040000 0x0 0x1000>; 55 + reset-gpios = <&gpio 78 GPIO_ACTIVE_HIGH>; 56 + clocks = <&si570_1>, <&clkc 71>; 57 + clock-names = "pll_ref", "aclk"; 58 + }; 59 + };
-26
Documentation/devicetree/bindings/soc/xilinx/xlnx,vcu.txt
··· 1 - LogicoreIP designed compatible with Xilinx ZYNQ family. 2 - ------------------------------------------------------- 3 - 4 - General concept 5 - --------------- 6 - 7 - LogicoreIP design to provide the isolation between processing system 8 - and programmable logic. Also provides the list of register set to configure 9 - the frequency. 10 - 11 - Required properties: 12 - - compatible: shall be one of: 13 - "xlnx,vcu" 14 - "xlnx,vcu-logicoreip-1.0" 15 - - reg : The base offset and size of the VCU_PL_SLCR register space. 16 - - clocks: phandle for aclk and pll_ref clocksource 17 - - clock-names: The identification string, "aclk", is always required for 18 - the axi clock. "pll_ref" is required for pll. 19 - Example: 20 - 21 - xlnx_vcu: vcu@a0040000 { 22 - compatible = "xlnx,vcu-logicoreip-1.0"; 23 - reg = <0x0 0xa0040000 0x0 0x1000>; 24 - clocks = <&si570_1>, <&clkc 71>; 25 - clock-names = "pll_ref", "aclk"; 26 - };
+1 -1
arch/arm64/boot/dts/freescale/imx93.dtsi
··· 925 925 reg-names = "ram", "regs", "rxfifo", "txfifo"; 926 926 interrupts = <GIC_SPI 203 IRQ_TYPE_LEVEL_HIGH>, 927 927 <GIC_SPI 204 IRQ_TYPE_LEVEL_HIGH>; 928 - clocks = <&clk IMX93_CLK_BUS_WAKEUP>, 928 + clocks = <&clk IMX93_CLK_SPDIF_IPG>, 929 929 <&clk IMX93_CLK_SPDIF_GATE>, 930 930 <&clk IMX93_CLK_DUMMY>, 931 931 <&clk IMX93_CLK_AUD_XCVR_GATE>;
+1
drivers/clk/at91/Makefile
··· 24 24 obj-$(CONFIG_SOC_SAMA5D3) += sama5d3.o dt-compat.o 25 25 obj-$(CONFIG_SOC_SAMA5D4) += sama5d4.o dt-compat.o 26 26 obj-$(CONFIG_SOC_SAMA5D2) += sama5d2.o dt-compat.o 27 + obj-$(CONFIG_SOC_SAMA7D65) += sama7d65.o 27 28 obj-$(CONFIG_SOC_SAMA7G5) += sama7g5.o
+1 -1
drivers/clk/at91/clk-master.c
··· 20 20 21 21 #define PMC_MCR_CSS_SHIFT (16) 22 22 23 - #define MASTER_MAX_ID 4 23 + #define MASTER_MAX_ID 9 24 24 25 25 #define to_clk_master(hw) container_of(hw, struct clk_master, hw) 26 26
+1 -1
drivers/clk/at91/clk-sam9x60-pll.c
··· 23 23 #define UPLL_DIV 2 24 24 #define PLL_MUL_MAX (FIELD_GET(PMC_PLL_CTRL1_MUL_MSK, UINT_MAX) + 1) 25 25 26 - #define PLL_MAX_ID 7 26 + #define PLL_MAX_ID 9 27 27 28 28 struct sam9x60_pll_core { 29 29 struct regmap *regmap;
+1
drivers/clk/at91/pmc.c
··· 151 151 static const struct of_device_id pmc_dt_ids[] = { 152 152 { .compatible = "atmel,sama5d2-pmc" }, 153 153 { .compatible = "microchip,sama7g5-pmc", }, 154 + { .compatible = "microchip,sama7d65-pmc", }, 154 155 { /* sentinel */ } 155 156 }; 156 157
+1375
drivers/clk/at91/sama7d65.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * SAMA7D65 PMC code. 4 + * 5 + * Copyright (C) 2024 Microchip Technology Inc. and its subsidiaries 6 + * 7 + * Author: Ryan Wanner <ryan.wanner@microchip.com> 8 + */ 9 + #include <linux/clk.h> 10 + #include <linux/clk-provider.h> 11 + #include <linux/mfd/syscon.h> 12 + #include <linux/slab.h> 13 + 14 + #include <dt-bindings/clock/at91.h> 15 + 16 + #include "pmc.h" 17 + 18 + static DEFINE_SPINLOCK(pmc_pll_lock); 19 + static DEFINE_SPINLOCK(pmc_mck0_lock); 20 + static DEFINE_SPINLOCK(pmc_mckX_lock); 21 + 22 + #define PMC_INDEX_MAX 25 23 + 24 + /* 25 + * PLL clocks identifiers 26 + * @PLL_ID_CPU: CPU PLL identifier 27 + * @PLL_ID_SYS: System PLL identifier 28 + * @PLL_ID_DDR: DDR PLL identifier 29 + * @PLL_ID_GPU: Graphics subsystem PLL identifier 30 + * @PLL_ID_BAUD: Baud PLL identifier 31 + * @PLL_ID_AUDIO: Audio PLL identifier 32 + * @PLL_ID_ETH: Ethernet PLL identifier 33 + * @PLL_ID_LVDS: LVDS PLL identifier 34 + * @PLL_ID_USB: USB PLL identifier 35 + */ 36 + enum pll_ids { 37 + PLL_ID_CPU, 38 + PLL_ID_SYS, 39 + PLL_ID_DDR, 40 + PLL_ID_GPU, 41 + PLL_ID_BAUD, 42 + PLL_ID_AUDIO, 43 + PLL_ID_ETH, 44 + PLL_ID_LVDS, 45 + PLL_ID_USB, 46 + PLL_ID_MAX 47 + }; 48 + 49 + /* 50 + * PLL component identifier 51 + * @PLL_COMPID_FRAC: Fractional PLL component identifier 52 + * @PLL_COMPID_DIV0: 1st PLL divider component identifier 53 + * @PLL_COMPID_DIV1: 2nd PLL divider component identifier 54 + */ 55 + enum pll_component_id { 56 + PLL_COMPID_FRAC, 57 + PLL_COMPID_DIV0, 58 + PLL_COMPID_DIV1, 59 + PLL_COMPID_MAX 60 + }; 61 + 62 + /* 63 + * PLL type identifiers 64 + * @PLL_TYPE_FRAC: fractional PLL identifier 65 + * @PLL_TYPE_DIV: divider PLL identifier 66 + */ 67 + enum pll_type { 68 + PLL_TYPE_FRAC, 69 + PLL_TYPE_DIV 70 + }; 71 + 72 + /* Layout for fractional PLLs. */ 73 + static const struct clk_pll_layout pll_layout_frac = { 74 + .mul_mask = GENMASK(31, 24), 75 + .frac_mask = GENMASK(21, 0), 76 + .mul_shift = 24, 77 + .frac_shift = 0, 78 + }; 79 + 80 + /* Layout for DIVPMC dividers. */ 81 + static const struct clk_pll_layout pll_layout_divpmc = { 82 + .div_mask = GENMASK(7, 0), 83 + .endiv_mask = BIT(29), 84 + .div_shift = 0, 85 + .endiv_shift = 29, 86 + }; 87 + 88 + /* Layout for DIVIO dividers. */ 89 + static const struct clk_pll_layout pll_layout_divio = { 90 + .div_mask = GENMASK(19, 12), 91 + .endiv_mask = BIT(30), 92 + .div_shift = 12, 93 + .endiv_shift = 30, 94 + }; 95 + 96 + /* 97 + * CPU PLL output range. 98 + * Notice: The upper limit has been setup to 1000000002 due to hardware 99 + * block which cannot output exactly 1GHz. 100 + */ 101 + static const struct clk_range cpu_pll_outputs[] = { 102 + { .min = 2343750, .max = 1000000002 }, 103 + }; 104 + 105 + /* PLL output range. */ 106 + static const struct clk_range pll_outputs[] = { 107 + { .min = 2343750, .max = 1200000000 }, 108 + }; 109 + 110 + /* 111 + * Min: fCOREPLLCK = 600 MHz, PMC_PLL_CTRL0.DIVPMC = 255 112 + * Max: fCOREPLLCK = 800 MHz, PMC_PLL_CTRL0.DIVPMC = 0 113 + */ 114 + static const struct clk_range lvdspll_outputs[] = { 115 + { .min = 16406250, .max = 800000000 }, 116 + }; 117 + 118 + static const struct clk_range upll_outputs[] = { 119 + { .min = 480000000, .max = 480000000 }, 120 + }; 121 + 122 + /* Fractional PLL core output range. */ 123 + static const struct clk_range core_outputs[] = { 124 + { .min = 600000000, .max = 1200000000 }, 125 + }; 126 + 127 + static const struct clk_range lvdspll_core_outputs[] = { 128 + { .min = 600000000, .max = 1200000000 }, 129 + }; 130 + 131 + static const struct clk_range upll_core_outputs[] = { 132 + { .min = 600000000, .max = 1200000000 }, 133 + }; 134 + 135 + /* CPU PLL characteristics. */ 136 + static const struct clk_pll_characteristics cpu_pll_characteristics = { 137 + .input = { .min = 12000000, .max = 50000000 }, 138 + .num_output = ARRAY_SIZE(cpu_pll_outputs), 139 + .output = cpu_pll_outputs, 140 + .core_output = core_outputs, 141 + }; 142 + 143 + /* PLL characteristics. */ 144 + static const struct clk_pll_characteristics pll_characteristics = { 145 + .input = { .min = 12000000, .max = 50000000 }, 146 + .num_output = ARRAY_SIZE(pll_outputs), 147 + .output = pll_outputs, 148 + .core_output = core_outputs, 149 + }; 150 + 151 + static const struct clk_pll_characteristics lvdspll_characteristics = { 152 + .input = { .min = 12000000, .max = 50000000 }, 153 + .num_output = ARRAY_SIZE(lvdspll_outputs), 154 + .output = lvdspll_outputs, 155 + .core_output = lvdspll_core_outputs, 156 + }; 157 + 158 + static const struct clk_pll_characteristics upll_characteristics = { 159 + .input = { .min = 20000000, .max = 50000000 }, 160 + .num_output = ARRAY_SIZE(upll_outputs), 161 + .output = upll_outputs, 162 + .core_output = upll_core_outputs, 163 + .upll = true, 164 + }; 165 + 166 + /* 167 + * SAMA7D65 PLL possible parents 168 + * @SAMA7D65_PLL_PARENT_MAINCK: MAINCK is PLL a parent 169 + * @SAMA7D65_PLL_PARENT_MAIN_XTAL: MAIN XTAL is a PLL parent 170 + * @SAMA7D65_PLL_PARENT_FRACCK: Frac PLL is a PLL parent (for PLL dividers) 171 + */ 172 + enum sama7d65_pll_parent { 173 + SAMA7D65_PLL_PARENT_MAINCK, 174 + SAMA7D65_PLL_PARENT_MAIN_XTAL, 175 + SAMA7D65_PLL_PARENT_FRACCK 176 + }; 177 + 178 + /* 179 + * PLL clocks description 180 + * @n: clock name 181 + * @l: clock layout 182 + * @c: clock characteristics 183 + * @hw: pointer to clk_hw 184 + * @t: clock type 185 + * @f: clock flags 186 + * @p: clock parent 187 + * @eid: export index in sama7d65->chws[] array 188 + * @safe_div: intermediate divider need to be set on PRE_RATE_CHANGE 189 + * notification 190 + */ 191 + static struct sama7d65_pll { 192 + const char *n; 193 + const struct clk_pll_layout *l; 194 + const struct clk_pll_characteristics *c; 195 + struct clk_hw *hw; 196 + unsigned long f; 197 + enum sama7d65_pll_parent p; 198 + u8 t; 199 + u8 eid; 200 + u8 safe_div; 201 + } sama7d65_plls[][PLL_COMPID_MAX] = { 202 + [PLL_ID_CPU] = { 203 + [PLL_COMPID_FRAC] = { 204 + .n = "cpupll_fracck", 205 + .p = SAMA7D65_PLL_PARENT_MAINCK, 206 + .l = &pll_layout_frac, 207 + .c = &cpu_pll_characteristics, 208 + .t = PLL_TYPE_FRAC, 209 + /* 210 + * This feeds cpupll_divpmcck which feeds CPU. It should 211 + * not be disabled. 212 + */ 213 + .f = CLK_IS_CRITICAL, 214 + }, 215 + 216 + [PLL_COMPID_DIV0] = { 217 + .n = "cpupll_divpmcck", 218 + .p = SAMA7D65_PLL_PARENT_FRACCK, 219 + .l = &pll_layout_divpmc, 220 + .c = &cpu_pll_characteristics, 221 + .t = PLL_TYPE_DIV, 222 + /* This feeds CPU. It should not be disabled. */ 223 + .f = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT, 224 + .eid = PMC_CPUPLL, 225 + /* 226 + * Safe div=15 should be safe even for switching b/w 1GHz and 227 + * 90MHz (frac pll might go up to 1.2GHz). 228 + */ 229 + .safe_div = 15, 230 + }, 231 + }, 232 + 233 + [PLL_ID_SYS] = { 234 + [PLL_COMPID_FRAC] = { 235 + .n = "syspll_fracck", 236 + .p = SAMA7D65_PLL_PARENT_MAINCK, 237 + .l = &pll_layout_frac, 238 + .c = &pll_characteristics, 239 + .t = PLL_TYPE_FRAC, 240 + /* 241 + * This feeds syspll_divpmcck which may feed critical parts 242 + * of the systems like timers. Therefore it should not be 243 + * disabled. 244 + */ 245 + .f = CLK_IS_CRITICAL | CLK_SET_RATE_GATE, 246 + }, 247 + 248 + [PLL_COMPID_DIV0] = { 249 + .n = "syspll_divpmcck", 250 + .p = SAMA7D65_PLL_PARENT_FRACCK, 251 + .l = &pll_layout_divpmc, 252 + .c = &pll_characteristics, 253 + .t = PLL_TYPE_DIV, 254 + /* 255 + * This may feed critical parts of the systems like timers. 256 + * Therefore it should not be disabled. 257 + */ 258 + .f = CLK_IS_CRITICAL | CLK_SET_RATE_GATE, 259 + .eid = PMC_SYSPLL, 260 + }, 261 + }, 262 + 263 + [PLL_ID_DDR] = { 264 + [PLL_COMPID_FRAC] = { 265 + .n = "ddrpll_fracck", 266 + .p = SAMA7D65_PLL_PARENT_MAINCK, 267 + .l = &pll_layout_frac, 268 + .c = &pll_characteristics, 269 + .t = PLL_TYPE_FRAC, 270 + /* 271 + * This feeds ddrpll_divpmcck which feeds DDR. It should not 272 + * be disabled. 273 + */ 274 + .f = CLK_IS_CRITICAL | CLK_SET_RATE_GATE, 275 + }, 276 + 277 + [PLL_COMPID_DIV0] = { 278 + .n = "ddrpll_divpmcck", 279 + .p = SAMA7D65_PLL_PARENT_FRACCK, 280 + .l = &pll_layout_divpmc, 281 + .c = &pll_characteristics, 282 + .t = PLL_TYPE_DIV, 283 + /* This feeds DDR. It should not be disabled. */ 284 + .f = CLK_IS_CRITICAL | CLK_SET_RATE_GATE, 285 + }, 286 + }, 287 + 288 + [PLL_ID_GPU] = { 289 + [PLL_COMPID_FRAC] = { 290 + .n = "gpupll_fracck", 291 + .p = SAMA7D65_PLL_PARENT_MAINCK, 292 + .l = &pll_layout_frac, 293 + .c = &pll_characteristics, 294 + .t = PLL_TYPE_FRAC, 295 + .f = CLK_SET_RATE_GATE, 296 + }, 297 + 298 + [PLL_COMPID_DIV0] = { 299 + .n = "gpupll_divpmcck", 300 + .p = SAMA7D65_PLL_PARENT_FRACCK, 301 + .l = &pll_layout_divpmc, 302 + .c = &pll_characteristics, 303 + .t = PLL_TYPE_DIV, 304 + .f = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE | 305 + CLK_SET_RATE_PARENT, 306 + }, 307 + }, 308 + 309 + [PLL_ID_BAUD] = { 310 + [PLL_COMPID_FRAC] = { 311 + .n = "baudpll_fracck", 312 + .p = SAMA7D65_PLL_PARENT_MAINCK, 313 + .l = &pll_layout_frac, 314 + .c = &pll_characteristics, 315 + .t = PLL_TYPE_FRAC, 316 + .f = CLK_SET_RATE_GATE, 317 + }, 318 + 319 + [PLL_COMPID_DIV0] = { 320 + .n = "baudpll_divpmcck", 321 + .p = SAMA7D65_PLL_PARENT_FRACCK, 322 + .l = &pll_layout_divpmc, 323 + .c = &pll_characteristics, 324 + .t = PLL_TYPE_DIV, 325 + .f = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE | 326 + CLK_SET_RATE_PARENT, 327 + .eid = PMC_BAUDPLL, 328 + }, 329 + }, 330 + 331 + [PLL_ID_AUDIO] = { 332 + [PLL_COMPID_FRAC] = { 333 + .n = "audiopll_fracck", 334 + .p = SAMA7D65_PLL_PARENT_MAIN_XTAL, 335 + .l = &pll_layout_frac, 336 + .c = &pll_characteristics, 337 + .t = PLL_TYPE_FRAC, 338 + .f = CLK_SET_RATE_GATE, 339 + }, 340 + 341 + [PLL_COMPID_DIV0] = { 342 + .n = "audiopll_divpmcck", 343 + .p = SAMA7D65_PLL_PARENT_FRACCK, 344 + .l = &pll_layout_divpmc, 345 + .c = &pll_characteristics, 346 + .t = PLL_TYPE_DIV, 347 + .f = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE | 348 + CLK_SET_RATE_PARENT, 349 + .eid = PMC_AUDIOPMCPLL, 350 + }, 351 + 352 + [PLL_COMPID_DIV1] = { 353 + .n = "audiopll_diviock", 354 + .p = SAMA7D65_PLL_PARENT_FRACCK, 355 + .l = &pll_layout_divio, 356 + .c = &pll_characteristics, 357 + .t = PLL_TYPE_DIV, 358 + .f = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE | 359 + CLK_SET_RATE_PARENT, 360 + .eid = PMC_AUDIOIOPLL, 361 + }, 362 + }, 363 + 364 + [PLL_ID_ETH] = { 365 + [PLL_COMPID_FRAC] = { 366 + .n = "ethpll_fracck", 367 + .p = SAMA7D65_PLL_PARENT_MAIN_XTAL, 368 + .l = &pll_layout_frac, 369 + .c = &pll_characteristics, 370 + .t = PLL_TYPE_FRAC, 371 + .f = CLK_SET_RATE_GATE, 372 + }, 373 + 374 + [PLL_COMPID_DIV0] = { 375 + .n = "ethpll_divpmcck", 376 + .p = SAMA7D65_PLL_PARENT_FRACCK, 377 + .l = &pll_layout_divpmc, 378 + .c = &pll_characteristics, 379 + .t = PLL_TYPE_DIV, 380 + .f = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE | 381 + CLK_SET_RATE_PARENT, 382 + .eid = PMC_ETHPLL, 383 + }, 384 + }, 385 + 386 + [PLL_ID_LVDS] = { 387 + [PLL_COMPID_FRAC] = { 388 + .n = "lvdspll_fracck", 389 + .p = SAMA7D65_PLL_PARENT_MAIN_XTAL, 390 + .l = &pll_layout_frac, 391 + .c = &lvdspll_characteristics, 392 + .t = PLL_TYPE_FRAC, 393 + .f = CLK_SET_RATE_GATE, 394 + }, 395 + 396 + [PLL_COMPID_DIV0] = { 397 + .n = "lvdspll_divpmcck", 398 + .p = SAMA7D65_PLL_PARENT_FRACCK, 399 + .l = &pll_layout_divpmc, 400 + .c = &lvdspll_characteristics, 401 + .t = PLL_TYPE_DIV, 402 + .f = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE | 403 + CLK_SET_RATE_PARENT, 404 + .eid = PMC_LVDSPLL, 405 + }, 406 + }, 407 + 408 + [PLL_ID_USB] = { 409 + [PLL_COMPID_FRAC] = { 410 + .n = "usbpll_fracck", 411 + .p = SAMA7D65_PLL_PARENT_MAIN_XTAL, 412 + .l = &pll_layout_frac, 413 + .c = &upll_characteristics, 414 + .t = PLL_TYPE_FRAC, 415 + .f = CLK_SET_RATE_GATE, 416 + }, 417 + 418 + [PLL_COMPID_DIV0] = { 419 + .n = "usbpll_divpmcck", 420 + .p = SAMA7D65_PLL_PARENT_FRACCK, 421 + .l = &pll_layout_divpmc, 422 + .c = &upll_characteristics, 423 + .t = PLL_TYPE_DIV, 424 + .f = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE | 425 + CLK_SET_RATE_PARENT, 426 + .eid = PMC_UTMI, 427 + }, 428 + }, 429 + }; 430 + 431 + /* Used to create an array entry identifying a PLL by its components. */ 432 + #define PLL_IDS_TO_ARR_ENTRY(_id, _comp) { PLL_ID_##_id, PLL_COMPID_##_comp} 433 + 434 + /* 435 + * Master clock (MCK[0..9]) description 436 + * @n: clock name 437 + * @ep_chg_chg_id: index in parents array that specifies the changeable 438 + * @ep: extra parents names array (entry formed by PLL components 439 + * identifiers (see enum pll_component_id)) 440 + * @hw: pointer to clk_hw 441 + * parent 442 + * @ep_count: extra parents count 443 + * @ep_mux_table: mux table for extra parents 444 + * @id: clock id 445 + * @eid: export index in sama7d65->chws[] array 446 + * @c: true if clock is critical and cannot be disabled 447 + */ 448 + static struct { 449 + const char *n; 450 + struct { 451 + int pll_id; 452 + int pll_compid; 453 + } ep[4]; 454 + struct clk_hw *hw; 455 + int ep_chg_id; 456 + u8 ep_count; 457 + u8 ep_mux_table[4]; 458 + u8 id; 459 + u8 eid; 460 + u8 c; 461 + } sama7d65_mckx[] = { 462 + { .n = "mck0", }, /* Dummy entry for MCK0 to store hw in probe. */ 463 + { .n = "mck1", 464 + .id = 1, 465 + .ep = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), }, 466 + .ep_mux_table = { 5, }, 467 + .ep_count = 1, 468 + .ep_chg_id = INT_MIN, 469 + .eid = PMC_MCK1, 470 + .c = 1, }, 471 + 472 + { .n = "mck2", 473 + .id = 2, 474 + .ep = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(DDR, DIV0), }, 475 + .ep_mux_table = { 5, 6, }, 476 + .ep_count = 2, 477 + .ep_chg_id = INT_MIN, 478 + .c = 1, }, 479 + 480 + { .n = "mck3", 481 + .id = 3, 482 + .ep = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(DDR, DIV0), }, 483 + .ep_mux_table = { 5, 6, }, 484 + .ep_count = 2, 485 + .ep_chg_id = INT_MIN, 486 + .eid = PMC_MCK3, 487 + .c = 1, }, 488 + 489 + { .n = "mck4", 490 + .id = 4, 491 + .ep = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), }, 492 + .ep_mux_table = { 5, }, 493 + .ep_count = 1, 494 + .ep_chg_id = INT_MIN, 495 + .c = 1, }, 496 + 497 + { .n = "mck5", 498 + .id = 5, 499 + .ep = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), }, 500 + .ep_mux_table = { 5, }, 501 + .ep_count = 1, 502 + .ep_chg_id = INT_MIN, 503 + .eid = PMC_MCK5, 504 + .c = 1, }, 505 + 506 + { .n = "mck6", 507 + .id = 6, 508 + .ep = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), }, 509 + .ep_mux_table = { 5, }, 510 + .ep_chg_id = INT_MIN, 511 + .ep_count = 1, 512 + .c = 1, }, 513 + 514 + { .n = "mck7", 515 + .id = 7, 516 + .ep = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), }, 517 + .ep_mux_table = { 5, }, 518 + .ep_chg_id = INT_MIN, 519 + .ep_count = 1, }, 520 + 521 + { .n = "mck8", 522 + .id = 8, 523 + .ep = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), }, 524 + .ep_mux_table = { 5, }, 525 + .ep_chg_id = INT_MIN, 526 + .ep_count = 1, }, 527 + 528 + { .n = "mck9", 529 + .id = 9, 530 + .ep = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), }, 531 + .ep_mux_table = { 5, }, 532 + .ep_chg_id = INT_MIN, 533 + .ep_count = 1, }, 534 + }; 535 + 536 + /* 537 + * System clock description 538 + * @n: clock name 539 + * @p: clock parent name 540 + * @id: clock id 541 + */ 542 + static const struct { 543 + const char *n; 544 + const char *p; 545 + u8 id; 546 + } sama7d65_systemck[] = { 547 + { .n = "uhpck", .p = "usbck", .id = 6 }, 548 + { .n = "pck0", .p = "prog0", .id = 8, }, 549 + { .n = "pck1", .p = "prog1", .id = 9, }, 550 + { .n = "pck2", .p = "prog2", .id = 10, }, 551 + { .n = "pck3", .p = "prog3", .id = 11, }, 552 + { .n = "pck4", .p = "prog4", .id = 12, }, 553 + { .n = "pck5", .p = "prog5", .id = 13, }, 554 + { .n = "pck6", .p = "prog6", .id = 14, }, 555 + { .n = "pck7", .p = "prog7", .id = 15, }, 556 + }; 557 + 558 + /* Mux table for programmable clocks. */ 559 + static u32 sama7d65_prog_mux_table[] = { 0, 1, 2, 5, 7, 8, 9, 10, 12 }; 560 + 561 + /* 562 + * Peripheral clock parent hw identifier (used to index in sama7d65_mckx[]) 563 + * @PCK_PARENT_HW_MCK0: pck parent hw identifier is MCK0 564 + * @PCK_PARENT_HW_MCK1: pck parent hw identifier is MCK1 565 + * @PCK_PARENT_HW_MCK2: pck parent hw identifier is MCK2 566 + * @PCK_PARENT_HW_MCK3: pck parent hw identifier is MCK3 567 + * @PCK_PARENT_HW_MCK4: pck parent hw identifier is MCK4 568 + * @PCK_PARENT_HW_MCK5: pck parent hw identifier is MCK5 569 + * @PCK_PARENT_HW_MCK6: pck parent hw identifier is MCK6 570 + * @PCK_PARENT_HW_MCK7: pck parent hw identifier is MCK7 571 + * @PCK_PARENT_HW_MCK8: pck parent hw identifier is MCK8 572 + * @PCK_PARENT_HW_MCK9: pck parent hw identifier is MCK9 573 + * @PCK_PARENT_HW_MAX: max identifier 574 + */ 575 + enum sama7d65_pck_parent_hw_id { 576 + PCK_PARENT_HW_MCK0, 577 + PCK_PARENT_HW_MCK1, 578 + PCK_PARENT_HW_MCK2, 579 + PCK_PARENT_HW_MCK3, 580 + PCK_PARENT_HW_MCK4, 581 + PCK_PARENT_HW_MCK5, 582 + PCK_PARENT_HW_MCK6, 583 + PCK_PARENT_HW_MCK7, 584 + PCK_PARENT_HW_MCK8, 585 + PCK_PARENT_HW_MCK9, 586 + PCK_PARENT_HW_MAX 587 + }; 588 + 589 + /* 590 + * Peripheral clock description 591 + * @n: clock name 592 + * @p: clock parent hw id 593 + * @r: clock range values 594 + * @id: clock id 595 + * @chgp: index in parent array of the changeable parent 596 + */ 597 + static struct { 598 + const char *n; 599 + enum sama7d65_pck_parent_hw_id p; 600 + struct clk_range r; 601 + u8 chgp; 602 + u8 id; 603 + } sama7d65_periphck[] = { 604 + { .n = "pioA_clk", .p = PCK_PARENT_HW_MCK0, .id = 10, }, 605 + { .n = "securam_clk", .p = PCK_PARENT_HW_MCK0, .id = 17, }, 606 + { .n = "sfr_clk", .p = PCK_PARENT_HW_MCK7, .id = 18, }, 607 + { .n = "hsmc_clk", .p = PCK_PARENT_HW_MCK5, .id = 20, }, 608 + { .n = "xdmac0_clk", .p = PCK_PARENT_HW_MCK6, .id = 21, }, 609 + { .n = "xdmac1_clk", .p = PCK_PARENT_HW_MCK6, .id = 22, }, 610 + { .n = "xdmac2_clk", .p = PCK_PARENT_HW_MCK1, .id = 23, }, 611 + { .n = "acc_clk", .p = PCK_PARENT_HW_MCK7, .id = 24, }, 612 + { .n = "aes_clk", .p = PCK_PARENT_HW_MCK6, .id = 26, }, 613 + { .n = "tzaesbasc_clk", .p = PCK_PARENT_HW_MCK8, .id = 27, }, 614 + { .n = "asrc_clk", .p = PCK_PARENT_HW_MCK9, .id = 29, .r = { .max = 200000000, }, }, 615 + { .n = "cpkcc_clk", .p = PCK_PARENT_HW_MCK0, .id = 30, }, 616 + { .n = "eic_clk", .p = PCK_PARENT_HW_MCK7, .id = 33, }, 617 + { .n = "flex0_clk", .p = PCK_PARENT_HW_MCK7, .id = 34, }, 618 + { .n = "flex1_clk", .p = PCK_PARENT_HW_MCK7, .id = 35, }, 619 + { .n = "flex2_clk", .p = PCK_PARENT_HW_MCK7, .id = 36, }, 620 + { .n = "flex3_clk", .p = PCK_PARENT_HW_MCK7, .id = 37, }, 621 + { .n = "flex4_clk", .p = PCK_PARENT_HW_MCK8, .id = 38, }, 622 + { .n = "flex5_clk", .p = PCK_PARENT_HW_MCK8, .id = 39, }, 623 + { .n = "flex6_clk", .p = PCK_PARENT_HW_MCK8, .id = 40, }, 624 + { .n = "flex7_clk", .p = PCK_PARENT_HW_MCK8, .id = 41, }, 625 + { .n = "flex8_clk", .p = PCK_PARENT_HW_MCK9, .id = 42, }, 626 + { .n = "flex9_clk", .p = PCK_PARENT_HW_MCK9, .id = 43, }, 627 + { .n = "flex10_clk", .p = PCK_PARENT_HW_MCK9, .id = 44, }, 628 + { .n = "gmac0_clk", .p = PCK_PARENT_HW_MCK6, .id = 46, }, 629 + { .n = "gmac1_clk", .p = PCK_PARENT_HW_MCK6, .id = 47, }, 630 + { .n = "gmac0_tsu_clk", .p = PCK_PARENT_HW_MCK1, .id = 49, }, 631 + { .n = "gmac1_tsu_clk", .p = PCK_PARENT_HW_MCK1, .id = 50, }, 632 + { .n = "icm_clk", .p = PCK_PARENT_HW_MCK5, .id = 53, }, 633 + { .n = "i2smcc0_clk", .p = PCK_PARENT_HW_MCK9, .id = 54, .r = { .max = 200000000, }, }, 634 + { .n = "i2smcc1_clk", .p = PCK_PARENT_HW_MCK9, .id = 55, .r = { .max = 200000000, }, }, 635 + { .n = "lcd_clk", .p = PCK_PARENT_HW_MCK3, .id = 56, }, 636 + { .n = "matrix_clk", .p = PCK_PARENT_HW_MCK5, .id = 57, }, 637 + { .n = "mcan0_clk", .p = PCK_PARENT_HW_MCK5, .id = 58, .r = { .max = 200000000, }, }, 638 + { .n = "mcan1_clk", .p = PCK_PARENT_HW_MCK5, .id = 59, .r = { .max = 200000000, }, }, 639 + { .n = "mcan2_clk", .p = PCK_PARENT_HW_MCK5, .id = 60, .r = { .max = 200000000, }, }, 640 + { .n = "mcan3_clk", .p = PCK_PARENT_HW_MCK5, .id = 61, .r = { .max = 200000000, }, }, 641 + { .n = "mcan4_clk", .p = PCK_PARENT_HW_MCK5, .id = 62, .r = { .max = 200000000, }, }, 642 + { .n = "pdmc0_clk", .p = PCK_PARENT_HW_MCK9, .id = 64, .r = { .max = 200000000, }, }, 643 + { .n = "pdmc1_clk", .p = PCK_PARENT_HW_MCK9, .id = 65, .r = { .max = 200000000, }, }, 644 + { .n = "pit64b0_clk", .p = PCK_PARENT_HW_MCK7, .id = 66, }, 645 + { .n = "pit64b1_clk", .p = PCK_PARENT_HW_MCK7, .id = 67, }, 646 + { .n = "pit64b2_clk", .p = PCK_PARENT_HW_MCK7, .id = 68, }, 647 + { .n = "pit64b3_clk", .p = PCK_PARENT_HW_MCK8, .id = 69, }, 648 + { .n = "pit64b4_clk", .p = PCK_PARENT_HW_MCK8, .id = 70, }, 649 + { .n = "pit64b5_clk", .p = PCK_PARENT_HW_MCK8, .id = 71, }, 650 + { .n = "pwm_clk", .p = PCK_PARENT_HW_MCK7, .id = 72, }, 651 + { .n = "qspi0_clk", .p = PCK_PARENT_HW_MCK5, .id = 73, }, 652 + { .n = "qspi1_clk", .p = PCK_PARENT_HW_MCK5, .id = 74, }, 653 + { .n = "sdmmc0_clk", .p = PCK_PARENT_HW_MCK1, .id = 75, }, 654 + { .n = "sdmmc1_clk", .p = PCK_PARENT_HW_MCK1, .id = 76, }, 655 + { .n = "sdmmc2_clk", .p = PCK_PARENT_HW_MCK1, .id = 77, }, 656 + { .n = "sha_clk", .p = PCK_PARENT_HW_MCK6, .id = 78, }, 657 + { .n = "spdifrx_clk", .p = PCK_PARENT_HW_MCK9, .id = 79, .r = { .max = 200000000, }, }, 658 + { .n = "spdiftx_clk", .p = PCK_PARENT_HW_MCK9, .id = 80, .r = { .max = 200000000, }, }, 659 + { .n = "ssc0_clk", .p = PCK_PARENT_HW_MCK7, .id = 81, .r = { .max = 200000000, }, }, 660 + { .n = "ssc1_clk", .p = PCK_PARENT_HW_MCK8, .id = 82, .r = { .max = 200000000, }, }, 661 + { .n = "tcb0_ch0_clk", .p = PCK_PARENT_HW_MCK8, .id = 83, .r = { .max = 200000000, }, }, 662 + { .n = "tcb0_ch1_clk", .p = PCK_PARENT_HW_MCK8, .id = 84, .r = { .max = 200000000, }, }, 663 + { .n = "tcb0_ch2_clk", .p = PCK_PARENT_HW_MCK8, .id = 85, .r = { .max = 200000000, }, }, 664 + { .n = "tcb1_ch0_clk", .p = PCK_PARENT_HW_MCK5, .id = 86, .r = { .max = 200000000, }, }, 665 + { .n = "tcb1_ch1_clk", .p = PCK_PARENT_HW_MCK5, .id = 87, .r = { .max = 200000000, }, }, 666 + { .n = "tcb1_ch2_clk", .p = PCK_PARENT_HW_MCK5, .id = 88, .r = { .max = 200000000, }, }, 667 + { .n = "tcpca_clk", .p = PCK_PARENT_HW_MCK5, .id = 89, }, 668 + { .n = "tcpcb_clk", .p = PCK_PARENT_HW_MCK5, .id = 90, }, 669 + { .n = "tdes_clk", .p = PCK_PARENT_HW_MCK6, .id = 91, }, 670 + { .n = "trng_clk", .p = PCK_PARENT_HW_MCK6, .id = 92, }, 671 + { .n = "udphsa_clk", .p = PCK_PARENT_HW_MCK5, .id = 99, }, 672 + { .n = "udphsb_clk", .p = PCK_PARENT_HW_MCK5, .id = 100, }, 673 + { .n = "uhphs_clk", .p = PCK_PARENT_HW_MCK5, .id = 101, }, 674 + { .n = "dsi_clk", .p = PCK_PARENT_HW_MCK3, .id = 103, }, 675 + { .n = "lvdsc_clk", .p = PCK_PARENT_HW_MCK3, .id = 104, }, 676 + }; 677 + 678 + /* 679 + * Generic clock description 680 + * @n: clock name 681 + * @pp: PLL parents (entry formed by PLL components identifiers 682 + * (see enum pll_component_id)) 683 + * @pp_mux_table: PLL parents mux table 684 + * @r: clock output range 685 + * @pp_chg_id: id in parent array of changeable PLL parent 686 + * @pp_count: PLL parents count 687 + * @id: clock id 688 + */ 689 + static const struct { 690 + const char *n; 691 + struct { 692 + int pll_id; 693 + int pll_compid; 694 + } pp[8]; 695 + const char pp_mux_table[8]; 696 + struct clk_range r; 697 + int pp_chg_id; 698 + u8 pp_count; 699 + u8 id; 700 + } sama7d65_gck[] = { 701 + { .n = "adc_gclk", 702 + .id = 25, 703 + .r = { .max = 100000000, }, 704 + .pp = { PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), }, 705 + .pp_mux_table = { 8, 9, }, 706 + .pp_count = 2, 707 + .pp_chg_id = INT_MIN, }, 708 + 709 + { .n = "asrc_gclk", 710 + .id = 29, 711 + .r = { .max = 200000000 }, 712 + .pp = { PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), }, 713 + .pp_mux_table = { 9, }, 714 + .pp_count = 1, 715 + .pp_chg_id = INT_MIN, }, 716 + 717 + { .n = "flex0_gclk", 718 + .id = 34, 719 + .r = { .max = 34000000 }, 720 + .pp = { PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), }, 721 + .pp_mux_table = {8, }, 722 + .pp_count = 1, 723 + .pp_chg_id = INT_MIN, }, 724 + 725 + { .n = "flex1_gclk", 726 + .id = 35, 727 + .r = { .max = 34000000 }, 728 + .pp = { PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), }, 729 + .pp_mux_table = {8, }, 730 + .pp_count = 1, 731 + .pp_chg_id = INT_MIN, }, 732 + 733 + { .n = "flex2_gclk", 734 + .id = 36, 735 + .r = { .max = 34000000 }, 736 + .pp = { PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), }, 737 + .pp_mux_table = {8, }, 738 + .pp_count = 1, 739 + .pp_chg_id = INT_MIN, }, 740 + 741 + { .n = "flex3_gclk", 742 + .id = 37, 743 + .r = { .max = 34000000 }, 744 + .pp = { PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), }, 745 + .pp_mux_table = {8, }, 746 + .pp_count = 1, 747 + .pp_chg_id = INT_MIN, }, 748 + 749 + { .n = "flex4_gclk", 750 + .id = 38, 751 + .r = { .max = 34000000 }, 752 + .pp = { PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), }, 753 + .pp_mux_table = { 8, }, 754 + .pp_count = 1, 755 + .pp_chg_id = INT_MIN, }, 756 + 757 + { .n = "flex5_gclk", 758 + .id = 39, 759 + .r = { .max = 34000000 }, 760 + .pp = { PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), }, 761 + .pp_mux_table = { 8, }, 762 + .pp_count = 1, 763 + .pp_chg_id = INT_MIN, }, 764 + 765 + { .n = "flex6_gclk", 766 + .id = 40, 767 + .r = { .max = 34000000 }, 768 + .pp = { PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), }, 769 + .pp_mux_table = { 8, }, 770 + .pp_count = 1, 771 + .pp_chg_id = INT_MIN, }, 772 + 773 + { .n = "flex7_gclk", 774 + .id = 41, 775 + .r = { .max = 34000000 }, 776 + .pp = { PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), }, 777 + .pp_mux_table = { 8, }, 778 + .pp_count = 1, 779 + .pp_chg_id = INT_MIN, }, 780 + 781 + { .n = "flex8_gclk", 782 + .id = 42, 783 + .r = { .max = 34000000 }, 784 + .pp = { PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), }, 785 + .pp_mux_table = { 8, }, 786 + .pp_count = 1, 787 + .pp_chg_id = INT_MIN, }, 788 + 789 + { .n = "flex9_gclk", 790 + .id = 43, 791 + .r = { .max = 34000000 }, 792 + .pp = { PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), }, 793 + .pp_mux_table = { 8, }, 794 + .pp_count = 1, 795 + .pp_chg_id = INT_MIN, }, 796 + 797 + { .n = "flex10_gclk", 798 + .id = 44, 799 + .r = { .max = 34000000 }, 800 + .pp = { PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), }, 801 + .pp_mux_table = { 8, }, 802 + .pp_count = 1, 803 + .pp_chg_id = INT_MIN, }, 804 + 805 + { .n = "gmac0_gclk", 806 + .id = 46, 807 + .r = { .max = 125000000 }, 808 + .pp = { PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), }, 809 + .pp_mux_table = { 10, }, 810 + .pp_count = 1, 811 + .pp_chg_id = 4, }, 812 + 813 + { .n = "gmac1_gclk", 814 + .id = 47, 815 + .r = { .max = 125000000 }, 816 + .pp = { PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), }, 817 + .pp_mux_table = { 10, }, 818 + .pp_count = 1, 819 + .pp_chg_id = 4, }, 820 + 821 + { .n = "gmac0_tsu_gclk", 822 + .id = 49, 823 + .r = { .max = 400000000 }, 824 + .pp = { PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), }, 825 + .pp_mux_table = {10, }, 826 + .pp_count = 1, 827 + .pp_chg_id = INT_MIN, }, 828 + 829 + { .n = "gmac1_tsu_gclk", 830 + .id = 50, 831 + .r = { .max = 400000000 }, 832 + .pp = { PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), }, 833 + .pp_mux_table = { 10, }, 834 + .pp_count = 1, 835 + .pp_chg_id = INT_MIN, }, 836 + 837 + { .n = "i2smcc0_gclk", 838 + .id = 54, 839 + .r = { .max = 100000000 }, 840 + .pp = { PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), }, 841 + .pp_mux_table = { 9, }, 842 + .pp_count = 1, 843 + .pp_chg_id = INT_MIN, }, 844 + 845 + { .n = "i2smcc1_gclk", 846 + .id = 55, 847 + .r = { .max = 100000000 }, 848 + .pp = { PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), }, 849 + .pp_mux_table = { 9, }, 850 + .pp_count = 1, 851 + .pp_chg_id = INT_MIN, }, 852 + 853 + { .n = "lcdc_gclk", 854 + .id = 56, 855 + .r = { .max = 90000000 }, 856 + .pp_count = 0, 857 + .pp_chg_id = INT_MIN, 858 + }, 859 + 860 + { .n = "mcan0_gclk", 861 + .id = 58, 862 + .r = { .max = 80000000 }, 863 + .pp = { PLL_IDS_TO_ARR_ENTRY(USB, DIV0), }, 864 + .pp_mux_table = { 12 }, 865 + .pp_count = 1, 866 + .pp_chg_id = 4, }, 867 + 868 + { .n = "mcan1_gclk", 869 + .id = 59, 870 + .r = { .max = 80000000 }, 871 + .pp = { PLL_IDS_TO_ARR_ENTRY(USB, DIV0), }, 872 + .pp_mux_table = { 12 }, 873 + .pp_count = 1, 874 + .pp_chg_id = 4, }, 875 + 876 + { .n = "mcan2_gclk", 877 + .id = 60, 878 + .r = { .max = 80000000 }, 879 + .pp = { PLL_IDS_TO_ARR_ENTRY(USB, DIV0), }, 880 + .pp_mux_table = { 12 }, 881 + .pp_count = 1, 882 + .pp_chg_id = 4, }, 883 + 884 + { .n = "mcan3_gclk", 885 + .id = 61, 886 + .r = { .max = 80000000 }, 887 + .pp = { PLL_IDS_TO_ARR_ENTRY(USB, DIV0), }, 888 + .pp_mux_table = { 12 }, 889 + .pp_count = 1, 890 + .pp_chg_id = 4, }, 891 + 892 + { .n = "mcan4_gclk", 893 + .id = 62, 894 + .r = { .max = 80000000 }, 895 + .pp = { PLL_IDS_TO_ARR_ENTRY(USB, DIV0), }, 896 + .pp_mux_table = { 12 }, 897 + .pp_count = 1, 898 + .pp_chg_id = 4, }, 899 + 900 + { .n = "pdmc0_gclk", 901 + .id = 64, 902 + .r = { .max = 80000000 }, 903 + .pp = { PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), }, 904 + .pp_mux_table = { 9 }, 905 + .pp_count = 1, 906 + .pp_chg_id = INT_MIN, }, 907 + 908 + { .n = "pdmc1_gclk", 909 + .id = 65, 910 + .r = { .max = 80000000, }, 911 + .pp = { PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), }, 912 + .pp_mux_table = { 9, }, 913 + .pp_count = 1, 914 + .pp_chg_id = INT_MIN, }, 915 + 916 + { .n = "pit64b0_gclk", 917 + .id = 66, 918 + .r = { .max = 34000000 }, 919 + .pp = { PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), 920 + PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), }, 921 + .pp_mux_table = { 8, 9, 10, }, 922 + .pp_count = 3, 923 + .pp_chg_id = INT_MIN, }, 924 + 925 + { .n = "pit64b1_gclk", 926 + .id = 67, 927 + .r = { .max = 34000000 }, 928 + .pp = { PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), 929 + PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), }, 930 + .pp_mux_table = { 8, 9, 10, }, 931 + .pp_count = 3, 932 + .pp_chg_id = INT_MIN, }, 933 + 934 + { .n = "pit64b2_gclk", 935 + .id = 68, 936 + .r = { .max = 34000000 }, 937 + .pp = { PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), 938 + PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), }, 939 + .pp_mux_table = { 8, 9, 10, }, 940 + .pp_count = 3, 941 + .pp_chg_id = INT_MIN, }, 942 + 943 + { .n = "pit64b3_gclk", 944 + .id = 69, 945 + .r = { .max = 34000000 }, 946 + .pp = { PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), 947 + PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), }, 948 + .pp_mux_table = {8, 9, 10, }, 949 + .pp_count = 3, 950 + .pp_chg_id = INT_MIN, }, 951 + 952 + { .n = "pit64b4_gclk", 953 + .id = 70, 954 + .r = { .max = 34000000 }, 955 + .pp = { PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), 956 + PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), }, 957 + .pp_mux_table = {8, 9, 10, }, 958 + .pp_count = 3, 959 + .pp_chg_id = INT_MIN, }, 960 + 961 + { .n = "pit64b5_gclk", 962 + .id = 71, 963 + .r = { .max = 34000000 }, 964 + .pp = { PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), 965 + PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), }, 966 + .pp_mux_table = {8, 9, 10, }, 967 + .pp_count = 3, 968 + .pp_chg_id = INT_MIN, }, 969 + 970 + { .n = "qspi0_gclk", 971 + .id = 73, 972 + .r = { .max = 400000000 }, 973 + .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), }, 974 + .pp_mux_table = { 5, 8, }, 975 + .pp_count = 2, 976 + .pp_chg_id = INT_MIN, }, 977 + 978 + { .n = "qspi1_gclk", 979 + .id = 74, 980 + .r = { .max = 266000000 }, 981 + .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), }, 982 + .pp_mux_table = { 5, 8, }, 983 + .pp_count = 2, 984 + .pp_chg_id = INT_MIN, }, 985 + 986 + { .n = "sdmmc0_gclk", 987 + .id = 75, 988 + .r = { .max = 208000000 }, 989 + .pp = { PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), }, 990 + .pp_mux_table = { 8, 10, }, 991 + .pp_count = 2, 992 + .pp_chg_id = 4, }, 993 + 994 + { .n = "sdmmc1_gclk", 995 + .id = 76, 996 + .r = { .max = 208000000 }, 997 + .pp = { PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), }, 998 + .pp_mux_table = { 8, 10, }, 999 + .pp_count = 2, 1000 + .pp_chg_id = 4, }, 1001 + 1002 + { .n = "sdmmc2_gclk", 1003 + .id = 77, 1004 + .r = { .max = 208000000 }, 1005 + .pp = { PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), }, 1006 + .pp_mux_table = { 8, 10 }, 1007 + .pp_count = 2, 1008 + .pp_chg_id = 4, }, 1009 + 1010 + { .n = "spdifrx_gclk", 1011 + .id = 79, 1012 + .r = { .max = 150000000 }, 1013 + .pp = { PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), }, 1014 + .pp_mux_table = { 9, }, 1015 + .pp_count = 1, 1016 + .pp_chg_id = INT_MIN, }, 1017 + 1018 + { .n = "spdiftx_gclk", 1019 + .id = 80, 1020 + .r = { .max = 25000000 }, 1021 + .pp = { PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), }, 1022 + .pp_mux_table = { 9, }, 1023 + .pp_count = 1, 1024 + .pp_chg_id = INT_MIN, }, 1025 + 1026 + { .n = "tcb0_ch0_gclk", 1027 + .id = 83, 1028 + .r = { .max = 34000000 }, 1029 + .pp = { PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), 1030 + PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), }, 1031 + .pp_mux_table = { 8, 9, 10, }, 1032 + .pp_count = 3, 1033 + .pp_chg_id = INT_MIN, }, 1034 + 1035 + { .n = "tcb1_ch0_gclk", 1036 + .id = 86, 1037 + .r = { .max = 67000000 }, 1038 + .pp = { PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), 1039 + PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), }, 1040 + .pp_mux_table = { 8, 9, 10, }, 1041 + .pp_count = 3, 1042 + .pp_chg_id = INT_MIN, }, 1043 + 1044 + { .n = "DSI_gclk", 1045 + .id = 103, 1046 + .r = {.max = 27000000}, 1047 + .pp = { PLL_IDS_TO_ARR_ENTRY(SYS, DIV0), }, 1048 + .pp_mux_table = {5}, 1049 + .pp_count = 1, 1050 + .pp_chg_id = INT_MIN, }, 1051 + 1052 + { .n = "I3CC_gclk", 1053 + .id = 105, 1054 + .r = {.max = 125000000}, 1055 + .pp = { PLL_IDS_TO_ARR_ENTRY(BAUD, DIV0), PLL_IDS_TO_ARR_ENTRY(AUDIO, DIV0), 1056 + PLL_IDS_TO_ARR_ENTRY(ETH, DIV0), }, 1057 + .pp_mux_table = {8, 9, 10, }, 1058 + .pp_count = 3, 1059 + .pp_chg_id = INT_MIN, }, 1060 + }; 1061 + 1062 + /* MCK0 characteristics. */ 1063 + static const struct clk_master_characteristics mck0_characteristics = { 1064 + .output = { .min = 32768, .max = 200000000 }, 1065 + .divisors = { 1, 2, 4, 3, 5 }, 1066 + .have_div3_pres = 1, 1067 + }; 1068 + 1069 + /* MCK0 layout. */ 1070 + static const struct clk_master_layout mck0_layout = { 1071 + .mask = 0x773, 1072 + .pres_shift = 4, 1073 + .offset = 0x28, 1074 + }; 1075 + 1076 + /* Programmable clock layout. */ 1077 + static const struct clk_programmable_layout programmable_layout = { 1078 + .pres_mask = 0xff, 1079 + .pres_shift = 8, 1080 + .css_mask = 0x1f, 1081 + .have_slck_mck = 0, 1082 + .is_pres_direct = 1, 1083 + }; 1084 + 1085 + /* Peripheral clock layout. */ 1086 + static const struct clk_pcr_layout sama7d65_pcr_layout = { 1087 + .offset = 0x88, 1088 + .cmd = BIT(31), 1089 + .gckcss_mask = GENMASK(12, 8), 1090 + .pid_mask = GENMASK(6, 0), 1091 + }; 1092 + 1093 + static void __init sama7d65_pmc_setup(struct device_node *np) 1094 + { 1095 + const char *main_xtal_name = "main_xtal"; 1096 + struct pmc_data *sama7d65_pmc; 1097 + const char *parent_names[11]; 1098 + void **alloc_mem = NULL; 1099 + int alloc_mem_size = 0; 1100 + struct regmap *regmap; 1101 + struct clk_hw *hw, *main_rc_hw, *main_osc_hw, *main_xtal_hw; 1102 + struct clk_hw *td_slck_hw, *md_slck_hw; 1103 + static struct clk_parent_data parent_data; 1104 + struct clk_hw *parent_hws[10]; 1105 + bool bypass; 1106 + int i, j; 1107 + 1108 + td_slck_hw = __clk_get_hw(of_clk_get_by_name(np, "td_slck")); 1109 + md_slck_hw = __clk_get_hw(of_clk_get_by_name(np, "md_slck")); 1110 + main_xtal_hw = __clk_get_hw(of_clk_get_by_name(np, main_xtal_name)); 1111 + 1112 + if (!td_slck_hw || !md_slck_hw || !main_xtal_hw) 1113 + return; 1114 + 1115 + regmap = device_node_to_regmap(np); 1116 + if (IS_ERR(regmap)) 1117 + return; 1118 + 1119 + sama7d65_pmc = pmc_data_allocate(PMC_INDEX_MAX, 1120 + nck(sama7d65_systemck), 1121 + nck(sama7d65_periphck), 1122 + nck(sama7d65_gck), 8); 1123 + if (!sama7d65_pmc) 1124 + return; 1125 + 1126 + alloc_mem = kmalloc(sizeof(void *) * 1127 + (ARRAY_SIZE(sama7d65_mckx) + ARRAY_SIZE(sama7d65_gck)), 1128 + GFP_KERNEL); 1129 + if (!alloc_mem) 1130 + goto err_free; 1131 + 1132 + main_rc_hw = at91_clk_register_main_rc_osc(regmap, "main_rc_osc", 12000000, 1133 + 50000000); 1134 + if (IS_ERR(main_rc_hw)) 1135 + goto err_free; 1136 + 1137 + bypass = of_property_read_bool(np, "atmel,osc-bypass"); 1138 + 1139 + parent_data.name = main_xtal_name; 1140 + parent_data.fw_name = main_xtal_name; 1141 + main_osc_hw = at91_clk_register_main_osc(regmap, "main_osc", NULL, 1142 + &parent_data, bypass); 1143 + if (IS_ERR(main_osc_hw)) 1144 + goto err_free; 1145 + 1146 + parent_hws[0] = main_rc_hw; 1147 + parent_hws[1] = main_osc_hw; 1148 + hw = at91_clk_register_sam9x5_main(regmap, "mainck", NULL, parent_hws, 2); 1149 + if (IS_ERR(hw)) 1150 + goto err_free; 1151 + 1152 + sama7d65_pmc->chws[PMC_MAIN] = hw; 1153 + 1154 + for (i = 0; i < PLL_ID_MAX; i++) { 1155 + for (j = 0; j < PLL_COMPID_MAX; j++) { 1156 + struct clk_hw *parent_hw; 1157 + 1158 + if (!sama7d65_plls[i][j].n) 1159 + continue; 1160 + 1161 + switch (sama7d65_plls[i][j].t) { 1162 + case PLL_TYPE_FRAC: 1163 + switch (sama7d65_plls[i][j].p) { 1164 + case SAMA7D65_PLL_PARENT_MAINCK: 1165 + parent_hw = sama7d65_pmc->chws[PMC_MAIN]; 1166 + break; 1167 + case SAMA7D65_PLL_PARENT_MAIN_XTAL: 1168 + parent_hw = main_xtal_hw; 1169 + break; 1170 + default: 1171 + /* Should not happen. */ 1172 + parent_hw = NULL; 1173 + break; 1174 + } 1175 + 1176 + hw = sam9x60_clk_register_frac_pll(regmap, 1177 + &pmc_pll_lock, sama7d65_plls[i][j].n, 1178 + NULL, parent_hw, i, 1179 + sama7d65_plls[i][j].c, 1180 + sama7d65_plls[i][j].l, 1181 + sama7d65_plls[i][j].f); 1182 + break; 1183 + 1184 + case PLL_TYPE_DIV: 1185 + hw = sam9x60_clk_register_div_pll(regmap, 1186 + &pmc_pll_lock, sama7d65_plls[i][j].n, 1187 + NULL, sama7d65_plls[i][0].hw, i, 1188 + sama7d65_plls[i][j].c, 1189 + sama7d65_plls[i][j].l, 1190 + sama7d65_plls[i][j].f, 1191 + sama7d65_plls[i][j].safe_div); 1192 + break; 1193 + 1194 + default: 1195 + continue; 1196 + } 1197 + 1198 + if (IS_ERR(hw)) 1199 + goto err_free; 1200 + 1201 + sama7d65_plls[i][j].hw = hw; 1202 + if (sama7d65_plls[i][j].eid) 1203 + sama7d65_pmc->chws[sama7d65_plls[i][j].eid] = hw; 1204 + } 1205 + } 1206 + 1207 + hw = at91_clk_register_master_div(regmap, "mck0", NULL, 1208 + sama7d65_plls[PLL_ID_CPU][1].hw, 1209 + &mck0_layout, &mck0_characteristics, 1210 + &pmc_mck0_lock, CLK_GET_RATE_NOCACHE, 5); 1211 + if (IS_ERR(hw)) 1212 + goto err_free; 1213 + 1214 + sama7d65_pmc->chws[PMC_MCK] = hw; 1215 + sama7d65_mckx[PCK_PARENT_HW_MCK0].hw = hw; 1216 + 1217 + parent_hws[0] = md_slck_hw; 1218 + parent_hws[1] = td_slck_hw; 1219 + parent_hws[2] = sama7d65_pmc->chws[PMC_MAIN]; 1220 + for (i = PCK_PARENT_HW_MCK1; i < ARRAY_SIZE(sama7d65_mckx); i++) { 1221 + u8 num_parents = 3 + sama7d65_mckx[i].ep_count; 1222 + struct clk_hw *tmp_parent_hws[8]; 1223 + u32 *mux_table; 1224 + 1225 + mux_table = kmalloc_array(num_parents, sizeof(*mux_table), 1226 + GFP_KERNEL); 1227 + if (!mux_table) 1228 + goto err_free; 1229 + 1230 + alloc_mem[alloc_mem_size++] = mux_table; 1231 + 1232 + PMC_INIT_TABLE(mux_table, 3); 1233 + PMC_FILL_TABLE(&mux_table[3], sama7d65_mckx[i].ep_mux_table, 1234 + sama7d65_mckx[i].ep_count); 1235 + for (j = 0; j < sama7d65_mckx[i].ep_count; j++) { 1236 + u8 pll_id = sama7d65_mckx[i].ep[j].pll_id; 1237 + u8 pll_compid = sama7d65_mckx[i].ep[j].pll_compid; 1238 + 1239 + tmp_parent_hws[j] = sama7d65_plls[pll_id][pll_compid].hw; 1240 + } 1241 + PMC_FILL_TABLE(&parent_hws[3], tmp_parent_hws, 1242 + sama7d65_mckx[i].ep_count); 1243 + 1244 + hw = at91_clk_sama7g5_register_master(regmap, sama7d65_mckx[i].n, 1245 + num_parents, NULL, parent_hws, 1246 + mux_table, &pmc_mckX_lock, 1247 + sama7d65_mckx[i].id, 1248 + sama7d65_mckx[i].c, 1249 + sama7d65_mckx[i].ep_chg_id); 1250 + 1251 + if (IS_ERR(hw)) 1252 + goto err_free; 1253 + 1254 + sama7d65_mckx[i].hw = hw; 1255 + if (sama7d65_mckx[i].eid) 1256 + sama7d65_pmc->chws[sama7d65_mckx[i].eid] = hw; 1257 + } 1258 + 1259 + parent_names[0] = "syspll_divpmcck"; 1260 + parent_names[1] = "usbpll_divpmcck"; 1261 + parent_names[2] = "main_osc"; 1262 + hw = sam9x60_clk_register_usb(regmap, "usbck", parent_names, 3); 1263 + if (IS_ERR(hw)) 1264 + goto err_free; 1265 + 1266 + parent_hws[0] = md_slck_hw; 1267 + parent_hws[1] = td_slck_hw; 1268 + parent_hws[2] = sama7d65_pmc->chws[PMC_MAIN]; 1269 + parent_hws[3] = sama7d65_plls[PLL_ID_SYS][PLL_COMPID_DIV0].hw; 1270 + parent_hws[4] = sama7d65_plls[PLL_ID_DDR][PLL_COMPID_DIV0].hw; 1271 + parent_hws[5] = sama7d65_plls[PLL_ID_GPU][PLL_COMPID_DIV0].hw; 1272 + parent_hws[6] = sama7d65_plls[PLL_ID_BAUD][PLL_COMPID_DIV0].hw; 1273 + parent_hws[7] = sama7d65_plls[PLL_ID_AUDIO][PLL_COMPID_DIV0].hw; 1274 + parent_hws[8] = sama7d65_plls[PLL_ID_ETH][PLL_COMPID_DIV0].hw; 1275 + 1276 + for (i = 0; i < 8; i++) { 1277 + char name[6]; 1278 + 1279 + snprintf(name, sizeof(name), "prog%d", i); 1280 + 1281 + hw = at91_clk_register_programmable(regmap, name, NULL, parent_hws, 1282 + 9, i, 1283 + &programmable_layout, 1284 + sama7d65_prog_mux_table); 1285 + if (IS_ERR(hw)) 1286 + goto err_free; 1287 + 1288 + sama7d65_pmc->pchws[i] = hw; 1289 + } 1290 + 1291 + for (i = 0; i < ARRAY_SIZE(sama7d65_systemck); i++) { 1292 + hw = at91_clk_register_system(regmap, sama7d65_systemck[i].n, 1293 + sama7d65_systemck[i].p, NULL, 1294 + sama7d65_systemck[i].id, 0); 1295 + if (IS_ERR(hw)) 1296 + goto err_free; 1297 + 1298 + sama7d65_pmc->shws[sama7d65_systemck[i].id] = hw; 1299 + } 1300 + 1301 + for (i = 0; i < ARRAY_SIZE(sama7d65_periphck); i++) { 1302 + hw = at91_clk_register_sam9x5_peripheral(regmap, &pmc_pcr_lock, 1303 + &sama7d65_pcr_layout, 1304 + sama7d65_periphck[i].n, 1305 + NULL, 1306 + sama7d65_mckx[sama7d65_periphck[i].p].hw, 1307 + sama7d65_periphck[i].id, 1308 + &sama7d65_periphck[i].r, 1309 + sama7d65_periphck[i].chgp ? 0 : 1310 + INT_MIN, 0); 1311 + if (IS_ERR(hw)) 1312 + goto err_free; 1313 + 1314 + sama7d65_pmc->phws[sama7d65_periphck[i].id] = hw; 1315 + } 1316 + 1317 + parent_hws[0] = md_slck_hw; 1318 + parent_hws[1] = td_slck_hw; 1319 + parent_hws[2] = sama7d65_pmc->chws[PMC_MAIN]; 1320 + parent_hws[3] = sama7d65_pmc->chws[PMC_MCK1]; 1321 + for (i = 0; i < ARRAY_SIZE(sama7d65_gck); i++) { 1322 + u8 num_parents = 4 + sama7d65_gck[i].pp_count; 1323 + struct clk_hw *tmp_parent_hws[8]; 1324 + u32 *mux_table; 1325 + 1326 + mux_table = kmalloc_array(num_parents, sizeof(*mux_table), 1327 + GFP_KERNEL); 1328 + if (!mux_table) 1329 + goto err_free; 1330 + 1331 + alloc_mem[alloc_mem_size++] = mux_table; 1332 + 1333 + PMC_INIT_TABLE(mux_table, 4); 1334 + PMC_FILL_TABLE(&mux_table[4], sama7d65_gck[i].pp_mux_table, 1335 + sama7d65_gck[i].pp_count); 1336 + for (j = 0; j < sama7d65_gck[i].pp_count; j++) { 1337 + u8 pll_id = sama7d65_gck[i].pp[j].pll_id; 1338 + u8 pll_compid = sama7d65_gck[i].pp[j].pll_compid; 1339 + 1340 + tmp_parent_hws[j] = sama7d65_plls[pll_id][pll_compid].hw; 1341 + } 1342 + PMC_FILL_TABLE(&parent_hws[4], tmp_parent_hws, 1343 + sama7d65_gck[i].pp_count); 1344 + 1345 + hw = at91_clk_register_generated(regmap, &pmc_pcr_lock, 1346 + &sama7d65_pcr_layout, 1347 + sama7d65_gck[i].n, NULL, 1348 + parent_hws, mux_table, 1349 + num_parents, 1350 + sama7d65_gck[i].id, 1351 + &sama7d65_gck[i].r, 1352 + sama7d65_gck[i].pp_chg_id); 1353 + if (IS_ERR(hw)) 1354 + goto err_free; 1355 + 1356 + sama7d65_pmc->ghws[sama7d65_gck[i].id] = hw; 1357 + } 1358 + 1359 + of_clk_add_hw_provider(np, of_clk_hw_pmc_get, sama7d65_pmc); 1360 + kfree(alloc_mem); 1361 + 1362 + return; 1363 + 1364 + err_free: 1365 + if (alloc_mem) { 1366 + for (i = 0; i < alloc_mem_size; i++) 1367 + kfree(alloc_mem[i]); 1368 + kfree(alloc_mem); 1369 + } 1370 + 1371 + kfree(sama7d65_pmc); 1372 + } 1373 + 1374 + /* Some clks are used for a clocksource */ 1375 + CLK_OF_DECLARE(sama7d65_pmc, "microchip,sama7d65-pmc", sama7d65_pmc_setup);
+13 -11
drivers/clk/at91/sckc.c
··· 12 12 #include <linux/of_address.h> 13 13 #include <linux/io.h> 14 14 15 + #include <dt-bindings/clock/at91.h> 16 + 15 17 #define SLOW_CLOCK_FREQ 32768 16 18 #define SLOWCK_SW_CYCLES 5 17 19 #define SLOWCK_SW_TIME_USEC ((SLOWCK_SW_CYCLES * USEC_PER_SEC) / \ ··· 472 470 { 473 471 void __iomem *regbase = of_iomap(np, 0); 474 472 struct clk_hw_onecell_data *clk_data; 475 - struct clk_hw *slow_rc, *slow_osc; 473 + struct clk_hw *slow_rc, *slow_osc, *hw; 476 474 const char *xtal_name; 477 475 const struct clk_hw *parent_hws[2]; 478 476 static struct clk_parent_data parent_data = { ··· 508 506 509 507 /* MD_SLCK and TD_SLCK. */ 510 508 clk_data->num = 2; 511 - clk_data->hws[0] = clk_hw_register_fixed_rate_parent_hw(NULL, "md_slck", 512 - slow_rc, 513 - 0, 32768); 514 - if (IS_ERR(clk_data->hws[0])) 509 + hw = clk_hw_register_fixed_rate_parent_hw(NULL, "md_slck", slow_rc, 510 + 0, 32768); 511 + if (IS_ERR(hw)) 515 512 goto clk_data_free; 513 + clk_data->hws[SCKC_MD_SLCK] = hw; 516 514 517 515 parent_hws[0] = slow_rc; 518 516 parent_hws[1] = slow_osc; 519 - clk_data->hws[1] = at91_clk_register_sam9x5_slow(regbase, "td_slck", 520 - parent_hws, 2, 521 - &at91sam9x60_bits); 522 - if (IS_ERR(clk_data->hws[1])) 517 + hw = at91_clk_register_sam9x5_slow(regbase, "td_slck", parent_hws, 518 + 2, &at91sam9x60_bits); 519 + if (IS_ERR(hw)) 523 520 goto unregister_md_slck; 521 + clk_data->hws[SCKC_TD_SLCK] = hw; 524 522 525 523 ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, clk_data); 526 524 if (WARN_ON(ret)) ··· 529 527 return; 530 528 531 529 unregister_td_slck: 532 - at91_clk_unregister_sam9x5_slow(clk_data->hws[1]); 530 + at91_clk_unregister_sam9x5_slow(clk_data->hws[SCKC_TD_SLCK]); 533 531 unregister_md_slck: 534 - clk_hw_unregister(clk_data->hws[0]); 532 + clk_hw_unregister(clk_data->hws[SCKC_MD_SLCK]); 535 533 clk_data_free: 536 534 kfree(clk_data); 537 535 unregister_slow_osc:
+3 -2
drivers/clk/imx/clk-imx8mp.c
··· 399 399 400 400 static const char * const imx8mp_clkout_sels[] = {"audio_pll1_out", "audio_pll2_out", "video_pll1_out", 401 401 "dummy", "dummy", "gpu_pll_out", "vpu_pll_out", 402 - "arm_pll_out", "sys_pll1", "sys_pll2", "sys_pll3", 403 - "dummy", "dummy", "osc_24m", "dummy", "osc_32k"}; 402 + "arm_pll_out", "sys_pll1_out", "sys_pll2_out", 403 + "sys_pll3_out", "dummy", "dummy", "osc_24m", 404 + "dummy", "osc_32k"}; 404 405 405 406 static struct clk_hw **hws; 406 407 static struct clk_hw_onecell_data *clk_hw_data;
+17 -15
drivers/clk/imx/clk-imx93.c
··· 15 15 16 16 #include "clk.h" 17 17 18 - #define IMX93_CLK_END 207 18 + #define IMX93_CLK_END 208 19 19 20 20 #define PLAT_IMX93 BIT(0) 21 21 #define PLAT_IMX91 BIT(1) ··· 38 38 static u32 share_count_sai3; 39 39 static u32 share_count_mub; 40 40 static u32 share_count_pdm; 41 + static u32 share_count_spdif; 41 42 42 43 static const char * const a55_core_sels[] = {"a55_alt", "arm_pll"}; 43 44 static const char *parent_names[MAX_SEL][4] = { ··· 71 70 { IMX93_CLK_WAKEUP_AXI, "wakeup_axi_root", 0x0380, FAST_SEL, CLK_IS_CRITICAL }, 72 71 { IMX93_CLK_SWO_TRACE, "swo_trace_root", 0x0400, LOW_SPEED_IO_SEL, }, 73 72 { IMX93_CLK_M33_SYSTICK, "m33_systick_root", 0x0480, LOW_SPEED_IO_SEL, 0, PLAT_IMX93, }, 74 - { IMX93_CLK_FLEXIO1, "flexio1_root", 0x0500, LOW_SPEED_IO_SEL, }, 75 - { IMX93_CLK_FLEXIO2, "flexio2_root", 0x0580, LOW_SPEED_IO_SEL, }, 73 + { IMX93_CLK_FLEXIO1, "flexio1_root", 0x0500, LOW_SPEED_IO_SEL, 0, PLAT_IMX93, }, 74 + { IMX93_CLK_FLEXIO2, "flexio2_root", 0x0580, LOW_SPEED_IO_SEL, 0, PLAT_IMX93, }, 76 75 { IMX93_CLK_LPTMR1, "lptmr1_root", 0x0700, LOW_SPEED_IO_SEL, }, 77 76 { IMX93_CLK_LPTMR2, "lptmr2_root", 0x0780, LOW_SPEED_IO_SEL, }, 78 77 { IMX93_CLK_TPM2, "tpm2_root", 0x0880, TPM_SEL, }, ··· 178 177 { IMX93_CLK_WDOG5_GATE, "wdog5", "osc_24m", 0x8400, }, 179 178 { IMX93_CLK_SEMA1_GATE, "sema1", "bus_aon_root", 0x8440, }, 180 179 { IMX93_CLK_SEMA2_GATE, "sema2", "bus_wakeup_root", 0x8480, }, 181 - { IMX93_CLK_MU1_A_GATE, "mu1_a", "bus_aon_root", 0x84c0, CLK_IGNORE_UNUSED }, 182 - { IMX93_CLK_MU2_A_GATE, "mu2_a", "bus_wakeup_root", 0x84c0, CLK_IGNORE_UNUSED }, 183 - { IMX93_CLK_MU1_B_GATE, "mu1_b", "bus_aon_root", 0x8500, 0, &share_count_mub }, 184 - { IMX93_CLK_MU2_B_GATE, "mu2_b", "bus_wakeup_root", 0x8500, 0, &share_count_mub }, 180 + { IMX93_CLK_MU1_A_GATE, "mu1_a", "bus_aon_root", 0x84c0, CLK_IGNORE_UNUSED, NULL, PLAT_IMX93 }, 181 + { IMX93_CLK_MU2_A_GATE, "mu2_a", "bus_wakeup_root", 0x84c0, CLK_IGNORE_UNUSED, NULL, PLAT_IMX93 }, 182 + { IMX93_CLK_MU1_B_GATE, "mu1_b", "bus_aon_root", 0x8500, 0, &share_count_mub, PLAT_IMX93 }, 183 + { IMX93_CLK_MU2_B_GATE, "mu2_b", "bus_wakeup_root", 0x8500, 0, &share_count_mub, PLAT_IMX93 }, 185 184 { IMX93_CLK_EDMA1_GATE, "edma1", "m33_root", 0x8540, }, 186 185 { IMX93_CLK_EDMA2_GATE, "edma2", "wakeup_axi_root", 0x8580, }, 187 186 { IMX93_CLK_FLEXSPI1_GATE, "flexspi1", "flexspi1_root", 0x8640, }, ··· 189 188 { IMX93_CLK_GPIO2_GATE, "gpio2", "bus_wakeup_root", 0x88c0, }, 190 189 { IMX93_CLK_GPIO3_GATE, "gpio3", "bus_wakeup_root", 0x8900, }, 191 190 { IMX93_CLK_GPIO4_GATE, "gpio4", "bus_wakeup_root", 0x8940, }, 192 - { IMX93_CLK_FLEXIO1_GATE, "flexio1", "flexio1_root", 0x8980, }, 193 - { IMX93_CLK_FLEXIO2_GATE, "flexio2", "flexio2_root", 0x89c0, }, 191 + { IMX93_CLK_FLEXIO1_GATE, "flexio1", "flexio1_root", 0x8980, 0, NULL, PLAT_IMX93}, 192 + { IMX93_CLK_FLEXIO2_GATE, "flexio2", "flexio2_root", 0x89c0, 0, NULL, PLAT_IMX93}, 194 193 { IMX93_CLK_LPIT1_GATE, "lpit1", "bus_aon_root", 0x8a00, }, 195 194 { IMX93_CLK_LPIT2_GATE, "lpit2", "bus_wakeup_root", 0x8a40, }, 196 195 { IMX93_CLK_LPTMR1_GATE, "lptmr1", "lptmr1_root", 0x8a80, }, ··· 239 238 { IMX93_CLK_SAI3_GATE, "sai3", "sai3_root", 0x94c0, 0, &share_count_sai3}, 240 239 { IMX93_CLK_SAI3_IPG, "sai3_ipg_clk", "bus_wakeup_root", 0x94c0, 0, &share_count_sai3}, 241 240 { IMX93_CLK_MIPI_CSI_GATE, "mipi_csi", "media_apb_root", 0x9580, }, 242 - { IMX93_CLK_MIPI_DSI_GATE, "mipi_dsi", "media_apb_root", 0x95c0, }, 243 - { IMX93_CLK_LVDS_GATE, "lvds", "media_ldb_root", 0x9600, }, 241 + { IMX93_CLK_MIPI_DSI_GATE, "mipi_dsi", "media_apb_root", 0x95c0, 0, NULL, PLAT_IMX93 }, 242 + { IMX93_CLK_LVDS_GATE, "lvds", "media_ldb_root", 0x9600, 0, NULL, PLAT_IMX93 }, 244 243 { IMX93_CLK_LCDIF_GATE, "lcdif", "media_apb_root", 0x9640, }, 245 - { IMX93_CLK_PXP_GATE, "pxp", "media_apb_root", 0x9680, }, 244 + { IMX93_CLK_PXP_GATE, "pxp", "media_apb_root", 0x9680, 0, NULL, PLAT_IMX93 }, 246 245 { IMX93_CLK_ISI_GATE, "isi", "media_apb_root", 0x96c0, }, 247 246 { IMX93_CLK_NIC_MEDIA_GATE, "nic_media", "media_axi_root", 0x9700, }, 248 247 { IMX93_CLK_USB_CONTROLLER_GATE, "usb_controller", "hsio_root", 0x9a00, }, ··· 253 252 { IMX93_CLK_MQS1_GATE, "mqs1", "sai1_root", 0x9b00, }, 254 253 { IMX93_CLK_MQS2_GATE, "mqs2", "sai3_root", 0x9b40, }, 255 254 { IMX93_CLK_AUD_XCVR_GATE, "aud_xcvr", "audio_xcvr_root", 0x9b80, }, 256 - { IMX93_CLK_SPDIF_GATE, "spdif", "spdif_root", 0x9c00, }, 255 + { IMX93_CLK_SPDIF_IPG, "spdif_ipg_clk", "bus_wakeup_root", 0x9c00, 0, &share_count_spdif}, 256 + { IMX93_CLK_SPDIF_GATE, "spdif", "spdif_root", 0x9c00, 0, &share_count_spdif}, 257 257 { IMX93_CLK_HSIO_32K_GATE, "hsio_32k", "osc_32k", 0x9dc0, }, 258 258 { IMX93_CLK_ENET1_GATE, "enet1", "wakeup_axi_root", 0x9e00, 0, NULL, PLAT_IMX93, }, 259 259 { IMX93_CLK_ENET_QOS_GATE, "enet_qos", "wakeup_axi_root", 0x9e40, 0, NULL, PLAT_IMX93, }, 260 - { IMX91_CLK_ENET2_REGULAR_GATE, "enet2_regular", "wakeup_axi_root", 0x9e00, 0, NULL, PLAT_IMX91, }, 261 - { IMX91_CLK_ENET1_QOS_TSN_GATE, "enet1_qos_tsn", "wakeup_axi_root", 0x9e40, 0, NULL, PLAT_IMX91, }, 260 + { IMX91_CLK_ENET2_REGULAR_GATE, "enet2_regular", "wakeup_axi_root", 0x9e00, 0, NULL, PLAT_IMX91, }, 261 + { IMX91_CLK_ENET1_QOS_TSN_GATE, "enet1_qos_tsn", "wakeup_axi_root", 0x9e40, 0, NULL, PLAT_IMX91, }, 262 262 /* Critical because clk accessed during CPU idle */ 263 263 { IMX93_CLK_SYS_CNT_GATE, "sys_cnt", "osc_24m", 0x9e80, CLK_IS_CRITICAL}, 264 264 { IMX93_CLK_TSTMR1_GATE, "tstmr1", "bus_aon_root", 0x9ec0, },
+2
drivers/clk/imx/clk-pll14xx.c
··· 56 56 PLL_1416X_RATE(700000000U, 350, 3, 2), 57 57 PLL_1416X_RATE(640000000U, 320, 3, 2), 58 58 PLL_1416X_RATE(600000000U, 300, 3, 2), 59 + PLL_1416X_RATE(416000000U, 208, 3, 2), 59 60 PLL_1416X_RATE(320000000U, 160, 3, 2), 61 + PLL_1416X_RATE(208000000U, 208, 3, 3), 60 62 }; 61 63 62 64 static const struct imx_pll14xx_rate_table imx_pll1443x_tbl[] = {
+65
drivers/clk/qcom/Kconfig
··· 64 64 Support for the TCSR clock controller on X1E80100 devices. 65 65 Say Y if you want to use peripheral devices such as SD/UFS. 66 66 67 + config CLK_X1P42100_GPUCC 68 + tristate "X1P42100 Graphics Clock Controller" 69 + depends on ARM64 || COMPILE_TEST 70 + select CLK_X1E80100_GCC 71 + help 72 + Support for the graphics clock controller on X1P42100 devices. 73 + Say Y if you want to support graphics controller devices and 74 + functionality such as 3D graphics. 75 + 67 76 config CLK_QCM2290_GPUCC 68 77 tristate "QCM2290 Graphics Clock Controller" 69 78 depends on ARM64 || COMPILE_TEST ··· 198 189 CPUs. 199 190 Say Y if you want to support CPU frequency scaling on 200 191 ipq based devices. 192 + 193 + config IPQ_CMN_PLL 194 + tristate "IPQ CMN PLL Clock Controller" 195 + help 196 + Support for CMN PLL clock controller on IPQ platform. The 197 + CMN PLL consumes the AHB/SYS clocks from GCC and supplies 198 + the output clocks to the networking hardware and GCC blocks. 199 + Say Y or M if you want to support CMN PLL clock on the IPQ 200 + based devices. 201 201 202 202 config IPQ_GCC_4019 203 203 tristate "IPQ4019 Global Clock Controller" ··· 512 494 QCS8300 devices. 513 495 Say Y if you want to use peripheral devices such as UART, 514 496 SPI, I2C, USB, SD/UFS, PCIe etc. 497 + 498 + config QCS_GCC_615 499 + tristate "QCS615 Global Clock Controller" 500 + depends on ARM64 || COMPILE_TEST 501 + select QCOM_GDSC 502 + help 503 + Support for the global clock controller on QCS615 devices. 504 + Say Y if you want to use multimedia devices or peripheral 505 + devices such as UART, SPI, I2C, USB, SD/eMMC, PCIe etc. 515 506 516 507 config SC_CAMCC_7180 517 508 tristate "SC7180 Camera Clock Controller" ··· 1049 1022 Say Y if you want to support display devices and functionality such as 1050 1023 splash screen. 1051 1024 1025 + config SM_DISPCC_8750 1026 + tristate "SM8750 Display Clock Controller" 1027 + depends on ARM64 || COMPILE_TEST 1028 + depends on SM_GCC_8750 1029 + select QCOM_GDSC 1030 + help 1031 + Support for the display clock controller on Qualcomm Technologies, Inc 1032 + SM8750 devices. 1033 + Say Y if you want to support display devices and functionality such as 1034 + splash screen. 1035 + 1052 1036 config SM_GCC_4450 1053 1037 tristate "SM4450 Global Clock Controller" 1054 1038 depends on ARM64 || COMPILE_TEST ··· 1117 1079 config SM_GCC_8150 1118 1080 tristate "SM8150 Global Clock Controller" 1119 1081 depends on ARM64 || COMPILE_TEST 1082 + select QCOM_GDSC 1120 1083 help 1121 1084 Support for the global clock controller on SM8150 devices. 1122 1085 Say Y if you want to use peripheral devices such as UART, ··· 1166 1127 select QCOM_GDSC 1167 1128 help 1168 1129 Support for the global clock controller on SM8650 devices. 1130 + Say Y if you want to use peripheral devices such as UART, 1131 + SPI, I2C, USB, SD/UFS, PCIe etc. 1132 + 1133 + config SM_GCC_8750 1134 + tristate "SM8750 Global Clock Controller" 1135 + depends on ARM64 || COMPILE_TEST 1136 + select QCOM_GDSC 1137 + help 1138 + Support for the global clock controller on SM8750 devices. 1169 1139 Say Y if you want to use peripheral devices such as UART, 1170 1140 SPI, I2C, USB, SD/UFS, PCIe etc. 1171 1141 ··· 1278 1230 Say Y if you want to support graphics controller devices and 1279 1231 functionality such as 3D graphics. 1280 1232 1233 + config SM_LPASSCC_6115 1234 + tristate "SM6115 Low Power Audio Subsystem (LPASS) Clock Controller" 1235 + depends on ARM64 || COMPILE_TEST 1236 + select SM_GCC_6115 1237 + help 1238 + Support for the LPASS clock controller on SM6115 devices. 1239 + Say Y if you want to toggle LPASS-adjacent resets within 1240 + this clock controller to reset the LPASS subsystem. 1241 + 1281 1242 config SM_TCSRCC_8550 1282 1243 tristate "SM8550 TCSR Clock Controller" 1283 1244 depends on ARM64 || COMPILE_TEST ··· 1302 1245 help 1303 1246 Support for the TCSR clock controller on SM8650 devices. 1304 1247 Say Y if you want to use peripheral devices such as SD/UFS. 1248 + 1249 + config SM_TCSRCC_8750 1250 + tristate "SM8750 TCSR Clock Controller" 1251 + depends on ARM64 || COMPILE_TEST 1252 + select QCOM_GDSC 1253 + help 1254 + Support for the TCSR clock controller on SM8750 devices. 1255 + Say Y if you want to use peripheral devices such as UFS/USB/PCIe. 1305 1256 1306 1257 config SA_VIDEOCC_8775P 1307 1258 tristate "SA8775P Video Clock Controller"
+7
drivers/clk/qcom/Makefile
··· 26 26 obj-$(CONFIG_CLK_X1E80100_GCC) += gcc-x1e80100.o 27 27 obj-$(CONFIG_CLK_X1E80100_GPUCC) += gpucc-x1e80100.o 28 28 obj-$(CONFIG_CLK_X1E80100_TCSRCC) += tcsrcc-x1e80100.o 29 + obj-$(CONFIG_CLK_X1P42100_GPUCC) += gpucc-x1p42100.o 29 30 obj-$(CONFIG_CLK_QCM2290_GPUCC) += gpucc-qcm2290.o 30 31 obj-$(CONFIG_IPQ_APSS_PLL) += apss-ipq-pll.o 31 32 obj-$(CONFIG_IPQ_APSS_6018) += apss-ipq6018.o 33 + obj-$(CONFIG_IPQ_CMN_PLL) += ipq-cmn-pll.o 32 34 obj-$(CONFIG_IPQ_GCC_4019) += gcc-ipq4019.o 33 35 obj-$(CONFIG_IPQ_GCC_5018) += gcc-ipq5018.o 34 36 obj-$(CONFIG_IPQ_GCC_5332) += gcc-ipq5332.o ··· 73 71 obj-$(CONFIG_QCM_GCC_2290) += gcc-qcm2290.o 74 72 obj-$(CONFIG_QCM_DISPCC_2290) += dispcc-qcm2290.o 75 73 obj-$(CONFIG_QCS_GCC_404) += gcc-qcs404.o 74 + obj-$(CONFIG_QCS_GCC_615) += gcc-qcs615.o 76 75 obj-$(CONFIG_QCS_GCC_8300) += gcc-qcs8300.o 77 76 obj-$(CONFIG_QCS_Q6SSTOP_404) += q6sstop-qcs404.o 78 77 obj-$(CONFIG_QCS_TURING_404) += turingcc-qcs404.o ··· 134 131 obj-$(CONFIG_SM_DISPCC_8250) += dispcc-sm8250.o 135 132 obj-$(CONFIG_SM_DISPCC_8450) += dispcc-sm8450.o 136 133 obj-$(CONFIG_SM_DISPCC_8550) += dispcc-sm8550.o 134 + obj-$(CONFIG_SM_DISPCC_8750) += dispcc-sm8750.o 137 135 obj-$(CONFIG_SM_GCC_4450) += gcc-sm4450.o 138 136 obj-$(CONFIG_SM_GCC_6115) += gcc-sm6115.o 139 137 obj-$(CONFIG_SM_GCC_6125) += gcc-sm6125.o ··· 147 143 obj-$(CONFIG_SM_GCC_8450) += gcc-sm8450.o 148 144 obj-$(CONFIG_SM_GCC_8550) += gcc-sm8550.o 149 145 obj-$(CONFIG_SM_GCC_8650) += gcc-sm8650.o 146 + obj-$(CONFIG_SM_GCC_8750) += gcc-sm8750.o 150 147 obj-$(CONFIG_SM_GPUCC_4450) += gpucc-sm4450.o 151 148 obj-$(CONFIG_SM_GPUCC_6115) += gpucc-sm6115.o 152 149 obj-$(CONFIG_SM_GPUCC_6125) += gpucc-sm6125.o ··· 159 154 obj-$(CONFIG_SM_GPUCC_8450) += gpucc-sm8450.o 160 155 obj-$(CONFIG_SM_GPUCC_8550) += gpucc-sm8550.o 161 156 obj-$(CONFIG_SM_GPUCC_8650) += gpucc-sm8650.o 157 + obj-$(CONFIG_SM_LPASSCC_6115) += lpasscc-sm6115.o 162 158 obj-$(CONFIG_SM_TCSRCC_8550) += tcsrcc-sm8550.o 163 159 obj-$(CONFIG_SM_TCSRCC_8650) += tcsrcc-sm8650.o 160 + obj-$(CONFIG_SM_TCSRCC_8750) += tcsrcc-sm8750.o 164 161 obj-$(CONFIG_SM_VIDEOCC_7150) += videocc-sm7150.o 165 162 obj-$(CONFIG_SM_VIDEOCC_8150) += videocc-sm8150.o 166 163 obj-$(CONFIG_SM_VIDEOCC_8250) += videocc-sm8250.o
+1 -2
drivers/clk/qcom/apss-ipq-pll.c
··· 73 73 .main_output_mask = BIT(0), 74 74 .aux_output_mask = BIT(1), 75 75 .early_output_mask = BIT(3), 76 - .alpha_en_mask = BIT(24), 77 76 .status_val = 0x3, 78 77 .status_mask = GENMASK(10, 8), 79 78 .lock_det = BIT(2), 80 79 .test_ctl_hi_val = 0x00400003, 81 80 }; 82 81 82 + /* 1.080 GHz configuration */ 83 83 static const struct alpha_pll_config ipq5332_pll_config = { 84 84 .l = 0x2d, 85 85 .config_ctl_val = 0x4001075b, 86 86 .main_output_mask = BIT(0), 87 87 .aux_output_mask = BIT(1), 88 88 .early_output_mask = BIT(3), 89 - .alpha_en_mask = BIT(24), 90 89 .status_val = 0x3, 91 90 .status_mask = GENMASK(10, 8), 92 91 .lock_det = BIT(2),
+7
drivers/clk/qcom/camcc-x1e80100.c
··· 2212 2212 }, 2213 2213 }; 2214 2214 2215 + static struct gdsc cam_cc_titan_top_gdsc; 2216 + 2215 2217 static struct gdsc cam_cc_bps_gdsc = { 2216 2218 .gdscr = 0x10004, 2217 2219 .en_rest_wait_val = 0x2, ··· 2223 2221 .name = "cam_cc_bps_gdsc", 2224 2222 }, 2225 2223 .pwrsts = PWRSTS_OFF_ON, 2224 + .parent = &cam_cc_titan_top_gdsc.pd, 2226 2225 .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 2227 2226 }; 2228 2227 ··· 2236 2233 .name = "cam_cc_ife_0_gdsc", 2237 2234 }, 2238 2235 .pwrsts = PWRSTS_OFF_ON, 2236 + .parent = &cam_cc_titan_top_gdsc.pd, 2239 2237 .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 2240 2238 }; 2241 2239 ··· 2249 2245 .name = "cam_cc_ife_1_gdsc", 2250 2246 }, 2251 2247 .pwrsts = PWRSTS_OFF_ON, 2248 + .parent = &cam_cc_titan_top_gdsc.pd, 2252 2249 .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 2253 2250 }; 2254 2251 ··· 2262 2257 .name = "cam_cc_ipe_0_gdsc", 2263 2258 }, 2264 2259 .pwrsts = PWRSTS_OFF_ON, 2260 + .parent = &cam_cc_titan_top_gdsc.pd, 2265 2261 .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 2266 2262 }; 2267 2263 ··· 2275 2269 .name = "cam_cc_sfe_0_gdsc", 2276 2270 }, 2277 2271 .pwrsts = PWRSTS_OFF_ON, 2272 + .parent = &cam_cc_titan_top_gdsc.pd, 2278 2273 .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 2279 2274 }; 2280 2275
+180 -1
drivers/clk/qcom/clk-alpha-pll.c
··· 58 58 #define PLL_TEST_CTL_U(p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL_U]) 59 59 #define PLL_TEST_CTL_U1(p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL_U1]) 60 60 #define PLL_TEST_CTL_U2(p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL_U2]) 61 + #define PLL_TEST_CTL_U3(p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL_U3]) 61 62 #define PLL_STATUS(p) ((p)->offset + (p)->regs[PLL_OFF_STATUS]) 62 63 #define PLL_OPMODE(p) ((p)->offset + (p)->regs[PLL_OFF_OPMODE]) 63 64 #define PLL_FRAC(p) ((p)->offset + (p)->regs[PLL_OFF_FRAC]) ··· 198 197 [PLL_OFF_TEST_CTL_U1] = 0x34, 199 198 [PLL_OFF_TEST_CTL_U2] = 0x38, 200 199 }, 200 + [CLK_ALPHA_PLL_TYPE_PONGO_ELU] = { 201 + [PLL_OFF_OPMODE] = 0x04, 202 + [PLL_OFF_STATE] = 0x08, 203 + [PLL_OFF_STATUS] = 0x0c, 204 + [PLL_OFF_L_VAL] = 0x10, 205 + [PLL_OFF_USER_CTL] = 0x14, 206 + [PLL_OFF_USER_CTL_U] = 0x18, 207 + [PLL_OFF_CONFIG_CTL] = 0x1c, 208 + [PLL_OFF_CONFIG_CTL_U] = 0x20, 209 + [PLL_OFF_CONFIG_CTL_U1] = 0x24, 210 + [PLL_OFF_CONFIG_CTL_U2] = 0x28, 211 + [PLL_OFF_TEST_CTL] = 0x2c, 212 + [PLL_OFF_TEST_CTL_U] = 0x30, 213 + [PLL_OFF_TEST_CTL_U1] = 0x34, 214 + [PLL_OFF_TEST_CTL_U2] = 0x38, 215 + [PLL_OFF_TEST_CTL_U3] = 0x3c, 216 + }, 217 + [CLK_ALPHA_PLL_TYPE_TAYCAN_ELU] = { 218 + [PLL_OFF_OPMODE] = 0x04, 219 + [PLL_OFF_STATE] = 0x08, 220 + [PLL_OFF_STATUS] = 0x0c, 221 + [PLL_OFF_L_VAL] = 0x10, 222 + [PLL_OFF_ALPHA_VAL] = 0x14, 223 + [PLL_OFF_USER_CTL] = 0x18, 224 + [PLL_OFF_USER_CTL_U] = 0x1c, 225 + [PLL_OFF_CONFIG_CTL] = 0x20, 226 + [PLL_OFF_CONFIG_CTL_U] = 0x24, 227 + [PLL_OFF_CONFIG_CTL_U1] = 0x28, 228 + [PLL_OFF_TEST_CTL] = 0x2c, 229 + [PLL_OFF_TEST_CTL_U] = 0x30, 230 + }, 201 231 [CLK_ALPHA_PLL_TYPE_RIVIAN_EVO] = { 202 232 [PLL_OFF_OPMODE] = 0x04, 203 233 [PLL_OFF_STATUS] = 0x0c, ··· 355 323 #define LUCID_EVO_PLL_CAL_L_VAL_SHIFT 16 356 324 #define LUCID_OLE_PLL_RINGOSC_CAL_L_VAL_SHIFT 24 357 325 326 + /* PONGO ELU PLL specific setting and offsets */ 327 + #define PONGO_PLL_OUT_MASK GENMASK(1, 0) 328 + #define PONGO_PLL_L_VAL_MASK GENMASK(11, 0) 329 + #define PONGO_XO_PRESENT BIT(10) 330 + #define PONGO_CLOCK_SELECT BIT(12) 331 + 358 332 /* ZONDA PLL specific */ 359 333 #define ZONDA_PLL_OUT_MASK 0xf 360 334 #define ZONDA_STAY_IN_CFA BIT(16) ··· 390 352 if (ret) 391 353 return ret; 392 354 393 - for (count = 200; count > 0; count--) { 355 + /* Pongo PLLs using a 32KHz reference can take upwards of 1500us to lock. */ 356 + for (count = 1500; count > 0; count--) { 394 357 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val); 395 358 if (ret) 396 359 return ret; ··· 471 432 mask |= config->pre_div_mask; 472 433 mask |= config->post_div_mask; 473 434 mask |= config->vco_mask; 435 + mask |= config->alpha_en_mask; 436 + mask |= config->alpha_mode_mask; 474 437 475 438 regmap_update_bits(regmap, PLL_USER_CTL(pll), mask, val); 476 439 ··· 2534 2493 .set_rate = alpha_pll_lucid_5lpe_set_rate, 2535 2494 }; 2536 2495 EXPORT_SYMBOL_GPL(clk_alpha_pll_reset_lucid_evo_ops); 2496 + 2497 + static int alpha_pll_pongo_elu_prepare(struct clk_hw *hw) 2498 + { 2499 + struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 2500 + struct regmap *regmap = pll->clkr.regmap; 2501 + int ret; 2502 + 2503 + /* Enable PLL intially to one-time calibrate against XO. */ 2504 + regmap_write(regmap, PLL_OPMODE(pll), PLL_RUN); 2505 + regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N); 2506 + regmap_update_bits(regmap, PLL_MODE(pll), PONGO_XO_PRESENT, PONGO_XO_PRESENT); 2507 + 2508 + /* Set regmap for wait_for_pll() */ 2509 + pll->clkr.regmap = regmap; 2510 + ret = wait_for_pll_enable_lock(pll); 2511 + if (ret) { 2512 + /* Reverse calibration - disable PLL output */ 2513 + regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0); 2514 + return ret; 2515 + } 2516 + 2517 + /* Disable PLL after one-time calibration. */ 2518 + regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY); 2519 + 2520 + /* Select internally generated clock. */ 2521 + regmap_update_bits(regmap, PLL_MODE(pll), PONGO_CLOCK_SELECT, 2522 + PONGO_CLOCK_SELECT); 2523 + 2524 + return 0; 2525 + } 2526 + 2527 + static int alpha_pll_pongo_elu_enable(struct clk_hw *hw) 2528 + { 2529 + struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 2530 + struct regmap *regmap = pll->clkr.regmap; 2531 + int ret; 2532 + 2533 + /* Check if PLL is already enabled */ 2534 + if (trion_pll_is_enabled(pll, regmap)) 2535 + return 0; 2536 + 2537 + ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N); 2538 + if (ret) 2539 + return ret; 2540 + 2541 + /* Set operation mode to RUN */ 2542 + regmap_write(regmap, PLL_OPMODE(pll), PLL_RUN); 2543 + 2544 + ret = wait_for_pll_enable_lock(pll); 2545 + if (ret) 2546 + return ret; 2547 + 2548 + /* Enable the global PLL outputs */ 2549 + ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, PLL_OUTCTRL); 2550 + if (ret) 2551 + return ret; 2552 + 2553 + /* Ensure that the write above goes through before returning. */ 2554 + mb(); 2555 + 2556 + return ret; 2557 + } 2558 + 2559 + static void alpha_pll_pongo_elu_disable(struct clk_hw *hw) 2560 + { 2561 + struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 2562 + struct regmap *regmap = pll->clkr.regmap; 2563 + int ret; 2564 + 2565 + /* Disable the global PLL output */ 2566 + ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0); 2567 + if (ret) 2568 + return; 2569 + 2570 + /* Place the PLL mode in STANDBY */ 2571 + regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY); 2572 + } 2573 + 2574 + static unsigned long alpha_pll_pongo_elu_recalc_rate(struct clk_hw *hw, 2575 + unsigned long parent_rate) 2576 + { 2577 + struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); 2578 + struct regmap *regmap = pll->clkr.regmap; 2579 + u32 l; 2580 + 2581 + if (regmap_read(regmap, PLL_L_VAL(pll), &l)) 2582 + return 0; 2583 + 2584 + l &= PONGO_PLL_L_VAL_MASK; 2585 + 2586 + return alpha_pll_calc_rate(parent_rate, l, 0, pll_alpha_width(pll)); 2587 + } 2588 + 2589 + const struct clk_ops clk_alpha_pll_pongo_elu_ops = { 2590 + .prepare = alpha_pll_pongo_elu_prepare, 2591 + .enable = alpha_pll_pongo_elu_enable, 2592 + .disable = alpha_pll_pongo_elu_disable, 2593 + .recalc_rate = alpha_pll_pongo_elu_recalc_rate, 2594 + }; 2595 + EXPORT_SYMBOL_GPL(clk_alpha_pll_pongo_elu_ops); 2596 + 2597 + void clk_pongo_elu_pll_configure(struct clk_alpha_pll *pll, 2598 + struct regmap *regmap, 2599 + const struct alpha_pll_config *config) 2600 + { 2601 + u32 val; 2602 + 2603 + regmap_update_bits(regmap, PLL_USER_CTL(pll), PONGO_PLL_OUT_MASK, 2604 + PONGO_PLL_OUT_MASK); 2605 + 2606 + if (trion_pll_is_enabled(pll, regmap)) 2607 + return; 2608 + 2609 + if (regmap_read(regmap, PLL_L_VAL(pll), &val)) 2610 + return; 2611 + val &= PONGO_PLL_L_VAL_MASK; 2612 + if (val) 2613 + return; 2614 + 2615 + clk_alpha_pll_write_config(regmap, PLL_L_VAL(pll), config->l); 2616 + clk_alpha_pll_write_config(regmap, PLL_ALPHA_VAL(pll), config->alpha); 2617 + clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL(pll), config->config_ctl_val); 2618 + clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U(pll), config->config_ctl_hi_val); 2619 + clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U1(pll), config->config_ctl_hi1_val); 2620 + clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U2(pll), config->config_ctl_hi2_val); 2621 + clk_alpha_pll_write_config(regmap, PLL_USER_CTL(pll), 2622 + config->user_ctl_val | PONGO_PLL_OUT_MASK); 2623 + clk_alpha_pll_write_config(regmap, PLL_USER_CTL_U(pll), config->user_ctl_hi_val); 2624 + clk_alpha_pll_write_config(regmap, PLL_TEST_CTL(pll), config->test_ctl_val); 2625 + clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U(pll), config->test_ctl_hi_val); 2626 + clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U1(pll), config->test_ctl_hi1_val); 2627 + clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U2(pll), config->test_ctl_hi2_val); 2628 + clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U3(pll), config->test_ctl_hi3_val); 2629 + 2630 + /* Disable PLL output */ 2631 + regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0); 2632 + } 2633 + EXPORT_SYMBOL_GPL(clk_pongo_elu_pll_configure); 2537 2634 2538 2635 void clk_rivian_evo_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 2539 2636 const struct alpha_pll_config *config)
+13
drivers/clk/qcom/clk-alpha-pll.h
··· 27 27 CLK_ALPHA_PLL_TYPE_ZONDA_OLE, 28 28 CLK_ALPHA_PLL_TYPE_LUCID_EVO, 29 29 CLK_ALPHA_PLL_TYPE_LUCID_OLE, 30 + CLK_ALPHA_PLL_TYPE_PONGO_ELU, 31 + CLK_ALPHA_PLL_TYPE_TAYCAN_ELU, 30 32 CLK_ALPHA_PLL_TYPE_RIVIAN_EVO, 31 33 CLK_ALPHA_PLL_TYPE_DEFAULT_EVO, 32 34 CLK_ALPHA_PLL_TYPE_BRAMMO_EVO, ··· 54 52 PLL_OFF_TEST_CTL_U, 55 53 PLL_OFF_TEST_CTL_U1, 56 54 PLL_OFF_TEST_CTL_U2, 55 + PLL_OFF_TEST_CTL_U3, 57 56 PLL_OFF_STATE, 58 57 PLL_OFF_STATUS, 59 58 PLL_OFF_OPMODE, ··· 140 137 u32 test_ctl_hi_mask; 141 138 u32 test_ctl_hi1_val; 142 139 u32 test_ctl_hi2_val; 140 + u32 test_ctl_hi3_val; 143 141 u32 main_output_mask; 144 142 u32 aux_output_mask; 145 143 u32 aux2_output_mask; ··· 189 185 #define clk_alpha_pll_zonda_ole_ops clk_alpha_pll_zonda_ops 190 186 191 187 extern const struct clk_ops clk_alpha_pll_lucid_evo_ops; 188 + #define clk_alpha_pll_taycan_elu_ops clk_alpha_pll_lucid_evo_ops 192 189 extern const struct clk_ops clk_alpha_pll_reset_lucid_evo_ops; 193 190 #define clk_alpha_pll_reset_lucid_ole_ops clk_alpha_pll_reset_lucid_evo_ops 194 191 extern const struct clk_ops clk_alpha_pll_fixed_lucid_evo_ops; 195 192 #define clk_alpha_pll_fixed_lucid_ole_ops clk_alpha_pll_fixed_lucid_evo_ops 193 + #define clk_alpha_pll_fixed_taycan_elu_ops clk_alpha_pll_fixed_lucid_evo_ops 196 194 extern const struct clk_ops clk_alpha_pll_postdiv_lucid_evo_ops; 197 195 #define clk_alpha_pll_postdiv_lucid_ole_ops clk_alpha_pll_postdiv_lucid_evo_ops 196 + #define clk_alpha_pll_postdiv_taycan_elu_ops clk_alpha_pll_postdiv_lucid_evo_ops 198 197 198 + extern const struct clk_ops clk_alpha_pll_pongo_elu_ops; 199 199 extern const struct clk_ops clk_alpha_pll_rivian_evo_ops; 200 200 #define clk_alpha_pll_postdiv_rivian_evo_ops clk_alpha_pll_postdiv_fabia_ops 201 201 ··· 226 218 const struct alpha_pll_config *config); 227 219 void clk_lucid_ole_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 228 220 const struct alpha_pll_config *config); 221 + void clk_pongo_elu_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 222 + const struct alpha_pll_config *config); 223 + #define clk_taycan_elu_pll_configure(pll, regmap, config) \ 224 + clk_lucid_evo_pll_configure(pll, regmap, config) 225 + 229 226 void clk_rivian_evo_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, 230 227 const struct alpha_pll_config *config); 231 228 void clk_stromer_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
+1
drivers/clk/qcom/clk-rcg.c
··· 597 597 }; 598 598 599 599 static const struct frac_entry pixel_table[] = { 600 + { 1, 1 }, 600 601 { 1, 2 }, 601 602 { 1, 3 }, 602 603 { 3, 16 },
+1
drivers/clk/qcom/clk-rcg.h
··· 189 189 container_of(to_clk_rcg2(_hw), struct clk_rcg2_gfx3d, rcg) 190 190 191 191 extern const struct clk_ops clk_rcg2_ops; 192 + extern const struct clk_ops clk_rcg2_gp_ops; 192 193 extern const struct clk_ops clk_rcg2_floor_ops; 193 194 extern const struct clk_ops clk_rcg2_fm_ops; 194 195 extern const struct clk_ops clk_rcg2_mux_closest_ops;
+189 -9
drivers/clk/qcom/clk-rcg2.c
··· 8 8 #include <linux/err.h> 9 9 #include <linux/bug.h> 10 10 #include <linux/export.h> 11 + #include <linux/clk.h> 11 12 #include <linux/clk-provider.h> 12 13 #include <linux/delay.h> 13 14 #include <linux/rational.h> 14 15 #include <linux/regmap.h> 15 16 #include <linux/math64.h> 17 + #include <linux/gcd.h> 16 18 #include <linux/minmax.h> 17 19 #include <linux/slab.h> 18 20 ··· 34 32 35 33 #define CFG_REG 0x4 36 34 #define CFG_SRC_DIV_SHIFT 0 35 + #define CFG_SRC_DIV_LENGTH 8 37 36 #define CFG_SRC_SEL_SHIFT 8 38 37 #define CFG_SRC_SEL_MASK (0x7 << CFG_SRC_SEL_SHIFT) 39 38 #define CFG_MODE_SHIFT 12 ··· 151 148 return update_config(rcg); 152 149 } 153 150 154 - /* 155 - * Calculate m/n:d rate 151 + /** 152 + * convert_to_reg_val() - Convert divisor values to hardware values. 153 + * 154 + * @f: Frequency table with pure m/n/pre_div parameters. 155 + */ 156 + static void convert_to_reg_val(struct freq_tbl *f) 157 + { 158 + f->pre_div *= 2; 159 + f->pre_div -= 1; 160 + } 161 + 162 + /** 163 + * calc_rate() - Calculate rate based on m/n:d values 164 + * 165 + * @rate: Parent rate. 166 + * @m: Multiplier. 167 + * @n: Divisor. 168 + * @mode: Use zero to ignore m/n calculation. 169 + * @hid_div: Pre divisor register value. Pre divisor value 170 + * relates to hid_div as pre_div = (hid_div + 1) / 2. 171 + * 172 + * Return calculated rate according to formula: 156 173 * 157 174 * parent_rate m 158 175 * rate = ----------- x --- 159 - * hid_div n 176 + * pre_div n 160 177 */ 161 178 static unsigned long 162 179 calc_rate(unsigned long rate, u32 m, u32 n, u32 mode, u32 hid_div) ··· 416 393 return _freq_tbl_fm_determine_rate(hw, rcg->freq_multi_tbl, req); 417 394 } 418 395 419 - static int __clk_rcg2_configure(struct clk_rcg2 *rcg, const struct freq_tbl *f, 420 - u32 *_cfg) 396 + /** 397 + * clk_rcg2_split_div() - Split multiplier that doesn't fit in n neither in pre_div. 398 + * 399 + * @multiplier: Multiplier to split between n and pre_div. 400 + * @pre_div: Pointer to pre divisor value. 401 + * @n: Pointer to n divisor value. 402 + * @pre_div_max: Pre divisor maximum value. 403 + */ 404 + static inline void clk_rcg2_split_div(int multiplier, unsigned int *pre_div, 405 + u16 *n, unsigned int pre_div_max) 421 406 { 422 - u32 cfg, mask, d_val, not2d_val, n_minus_m; 407 + *n = mult_frac(multiplier * *n, *pre_div, pre_div_max); 408 + *pre_div = pre_div_max; 409 + } 410 + 411 + static void clk_rcg2_calc_mnd(u64 parent_rate, u64 rate, struct freq_tbl *f, 412 + unsigned int mnd_max, unsigned int pre_div_max) 413 + { 414 + int i = 2; 415 + unsigned int pre_div = 1; 416 + unsigned long rates_gcd, scaled_parent_rate; 417 + u16 m, n = 1, n_candidate = 1, n_max; 418 + 419 + rates_gcd = gcd(parent_rate, rate); 420 + m = div64_u64(rate, rates_gcd); 421 + scaled_parent_rate = div64_u64(parent_rate, rates_gcd); 422 + while (scaled_parent_rate > (mnd_max + m) * pre_div_max) { 423 + // we're exceeding divisor's range, trying lower scale. 424 + if (m > 1) { 425 + m--; 426 + scaled_parent_rate = mult_frac(scaled_parent_rate, m, (m + 1)); 427 + } else { 428 + // cannot lower scale, just set max divisor values. 429 + f->n = mnd_max + m; 430 + f->pre_div = pre_div_max; 431 + f->m = m; 432 + return; 433 + } 434 + } 435 + 436 + n_max = m + mnd_max; 437 + 438 + while (scaled_parent_rate > 1) { 439 + while (scaled_parent_rate % i == 0) { 440 + n_candidate *= i; 441 + if (n_candidate < n_max) 442 + n = n_candidate; 443 + else if (pre_div * i < pre_div_max) 444 + pre_div *= i; 445 + else 446 + clk_rcg2_split_div(i, &pre_div, &n, pre_div_max); 447 + 448 + scaled_parent_rate /= i; 449 + } 450 + i++; 451 + } 452 + 453 + f->m = m; 454 + f->n = n; 455 + f->pre_div = pre_div > 1 ? pre_div : 0; 456 + } 457 + 458 + static int clk_rcg2_determine_gp_rate(struct clk_hw *hw, 459 + struct clk_rate_request *req) 460 + { 461 + struct clk_rcg2 *rcg = to_clk_rcg2(hw); 462 + struct freq_tbl f_tbl = {}, *f = &f_tbl; 463 + int mnd_max = BIT(rcg->mnd_width) - 1; 464 + int hid_max = BIT(rcg->hid_width) - 1; 465 + struct clk_hw *parent; 466 + u64 parent_rate; 467 + 468 + parent = clk_hw_get_parent(hw); 469 + parent_rate = clk_get_rate(parent->clk); 470 + if (!parent_rate) 471 + return -EINVAL; 472 + 473 + clk_rcg2_calc_mnd(parent_rate, req->rate, f, mnd_max, hid_max / 2); 474 + convert_to_reg_val(f); 475 + req->rate = calc_rate(parent_rate, f->m, f->n, f->n, f->pre_div); 476 + 477 + return 0; 478 + } 479 + 480 + static int __clk_rcg2_configure_parent(struct clk_rcg2 *rcg, u8 src, u32 *_cfg) 481 + { 423 482 struct clk_hw *hw = &rcg->clkr.hw; 424 - int ret, index = qcom_find_src_index(hw, rcg->parent_map, f->src); 483 + int index = qcom_find_src_index(hw, rcg->parent_map, src); 425 484 426 485 if (index < 0) 427 486 return index; 487 + 488 + *_cfg &= ~CFG_SRC_SEL_MASK; 489 + *_cfg |= rcg->parent_map[index].cfg << CFG_SRC_SEL_SHIFT; 490 + 491 + return 0; 492 + } 493 + 494 + static int __clk_rcg2_configure_mnd(struct clk_rcg2 *rcg, const struct freq_tbl *f, 495 + u32 *_cfg) 496 + { 497 + u32 cfg, mask, d_val, not2d_val, n_minus_m; 498 + int ret; 428 499 429 500 if (rcg->mnd_width && f->n) { 430 501 mask = BIT(rcg->mnd_width) - 1; ··· 548 431 } 549 432 550 433 mask = BIT(rcg->hid_width) - 1; 551 - mask |= CFG_SRC_SEL_MASK | CFG_MODE_MASK | CFG_HW_CLK_CTRL_MASK; 434 + mask |= CFG_MODE_MASK | CFG_HW_CLK_CTRL_MASK; 552 435 cfg = f->pre_div << CFG_SRC_DIV_SHIFT; 553 - cfg |= rcg->parent_map[index].cfg << CFG_SRC_SEL_SHIFT; 554 436 if (rcg->mnd_width && f->n && (f->m != f->n)) 555 437 cfg |= CFG_MODE_DUAL_EDGE; 556 438 if (rcg->hw_clk_ctrl) ··· 557 441 558 442 *_cfg &= ~mask; 559 443 *_cfg |= cfg; 444 + 445 + return 0; 446 + } 447 + 448 + static int __clk_rcg2_configure(struct clk_rcg2 *rcg, const struct freq_tbl *f, 449 + u32 *_cfg) 450 + { 451 + int ret; 452 + 453 + ret = __clk_rcg2_configure_parent(rcg, f->src, _cfg); 454 + if (ret) 455 + return ret; 456 + 457 + ret = __clk_rcg2_configure_mnd(rcg, f, _cfg); 458 + if (ret) 459 + return ret; 560 460 561 461 return 0; 562 462 } ··· 587 455 return ret; 588 456 589 457 ret = __clk_rcg2_configure(rcg, f, &cfg); 458 + if (ret) 459 + return ret; 460 + 461 + ret = regmap_write(rcg->clkr.regmap, RCG_CFG_OFFSET(rcg), cfg); 462 + if (ret) 463 + return ret; 464 + 465 + return update_config(rcg); 466 + } 467 + 468 + static int clk_rcg2_configure_gp(struct clk_rcg2 *rcg, const struct freq_tbl *f) 469 + { 470 + u32 cfg; 471 + int ret; 472 + 473 + ret = regmap_read(rcg->clkr.regmap, RCG_CFG_OFFSET(rcg), &cfg); 474 + if (ret) 475 + return ret; 476 + 477 + ret = __clk_rcg2_configure_mnd(rcg, f, &cfg); 590 478 if (ret) 591 479 return ret; 592 480 ··· 668 516 unsigned long parent_rate) 669 517 { 670 518 return __clk_rcg2_set_rate(hw, rate, CEIL); 519 + } 520 + 521 + static int clk_rcg2_set_gp_rate(struct clk_hw *hw, unsigned long rate, 522 + unsigned long parent_rate) 523 + { 524 + struct clk_rcg2 *rcg = to_clk_rcg2(hw); 525 + int mnd_max = BIT(rcg->mnd_width) - 1; 526 + int hid_max = BIT(rcg->hid_width) - 1; 527 + struct freq_tbl f_tbl = {}, *f = &f_tbl; 528 + int ret; 529 + 530 + clk_rcg2_calc_mnd(parent_rate, rate, f, mnd_max, hid_max / 2); 531 + convert_to_reg_val(f); 532 + ret = clk_rcg2_configure_gp(rcg, f); 533 + 534 + return ret; 671 535 } 672 536 673 537 static int clk_rcg2_set_floor_rate(struct clk_hw *hw, unsigned long rate, ··· 812 644 .set_duty_cycle = clk_rcg2_set_duty_cycle, 813 645 }; 814 646 EXPORT_SYMBOL_GPL(clk_rcg2_ops); 647 + 648 + const struct clk_ops clk_rcg2_gp_ops = { 649 + .is_enabled = clk_rcg2_is_enabled, 650 + .get_parent = clk_rcg2_get_parent, 651 + .set_parent = clk_rcg2_set_parent, 652 + .recalc_rate = clk_rcg2_recalc_rate, 653 + .determine_rate = clk_rcg2_determine_gp_rate, 654 + .set_rate = clk_rcg2_set_gp_rate, 655 + .get_duty_cycle = clk_rcg2_get_duty_cycle, 656 + .set_duty_cycle = clk_rcg2_set_duty_cycle, 657 + }; 658 + EXPORT_SYMBOL_GPL(clk_rcg2_gp_ops); 815 659 816 660 const struct clk_ops clk_rcg2_floor_ops = { 817 661 .is_enabled = clk_rcg2_is_enabled,
+11 -16
drivers/clk/qcom/clk-rpm.c
··· 4 4 * Copyright (c) 2014, The Linux Foundation. All rights reserved. 5 5 */ 6 6 7 + #include <linux/cleanup.h> 7 8 #include <linux/clk-provider.h> 8 9 #include <linux/err.h> 9 10 #include <linux/export.h> ··· 225 224 unsigned long active_rate, sleep_rate; 226 225 int ret; 227 226 228 - mutex_lock(&rpm_clk_lock); 227 + guard(mutex)(&rpm_clk_lock); 229 228 230 229 if (!r->rate) 231 - goto out; 230 + return; 232 231 233 232 /* Take peer clock's rate into account only if it's enabled. */ 234 233 if (peer->enabled) ··· 238 237 active_rate = r->branch ? !!peer_rate : peer_rate; 239 238 ret = clk_rpm_set_rate_active(r, active_rate); 240 239 if (ret) 241 - goto out; 240 + return; 242 241 243 242 sleep_rate = r->branch ? !!peer_sleep_rate : peer_sleep_rate; 244 243 ret = clk_rpm_set_rate_sleep(r, sleep_rate); 245 244 if (ret) 246 - goto out; 245 + return; 247 246 248 247 r->enabled = false; 249 - 250 - out: 251 - mutex_unlock(&rpm_clk_lock); 252 248 } 253 249 254 250 static int clk_rpm_xo_prepare(struct clk_hw *hw) ··· 322 324 unsigned long active_rate, sleep_rate; 323 325 unsigned long this_rate = 0, this_sleep_rate = 0; 324 326 unsigned long peer_rate = 0, peer_sleep_rate = 0; 325 - int ret = 0; 327 + int ret; 326 328 327 - mutex_lock(&rpm_clk_lock); 329 + guard(mutex)(&rpm_clk_lock); 328 330 329 331 if (!r->enabled) 330 - goto out; 332 + return 0; 331 333 332 334 to_active_sleep(r, rate, &this_rate, &this_sleep_rate); 333 335 ··· 339 341 active_rate = max(this_rate, peer_rate); 340 342 ret = clk_rpm_set_rate_active(r, active_rate); 341 343 if (ret) 342 - goto out; 344 + return ret; 343 345 344 346 sleep_rate = max(this_sleep_rate, peer_sleep_rate); 345 347 ret = clk_rpm_set_rate_sleep(r, sleep_rate); 346 348 if (ret) 347 - goto out; 349 + return ret; 348 350 349 351 r->rate = rate; 350 352 351 - out: 352 - mutex_unlock(&rpm_clk_lock); 353 - 354 - return ret; 353 + return 0; 355 354 } 356 355 357 356 static long clk_rpm_round_rate(struct clk_hw *hw, unsigned long rate,
+45 -2
drivers/clk/qcom/clk-rpmh.c
··· 330 330 { 331 331 struct clk_rpmh *c = to_clk_rpmh(hw); 332 332 333 - return c->aggr_state * c->unit; 333 + return (unsigned long)c->aggr_state * c->unit; 334 334 } 335 335 336 336 static const struct clk_ops clk_rpmh_bcm_ops = { ··· 368 368 DEFINE_CLK_RPMH_VRM(rf_clk2, _d, "rfclkd2", 1); 369 369 DEFINE_CLK_RPMH_VRM(rf_clk3, _d, "rfclkd3", 1); 370 370 DEFINE_CLK_RPMH_VRM(rf_clk4, _d, "rfclkd4", 1); 371 + 372 + DEFINE_CLK_RPMH_VRM(rf_clk3, _a2, "rfclka3", 2); 371 373 372 374 DEFINE_CLK_RPMH_VRM(clk1, _a1, "clka1", 1); 373 375 DEFINE_CLK_RPMH_VRM(clk2, _a1, "clka2", 1); ··· 810 808 .num_clks = ARRAY_SIZE(x1e80100_rpmh_clocks), 811 809 }; 812 810 811 + static struct clk_hw *qcs615_rpmh_clocks[] = { 812 + [RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div2.hw, 813 + [RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div2_ao.hw, 814 + [RPMH_LN_BB_CLK2] = &clk_rpmh_ln_bb_clk2_a2.hw, 815 + [RPMH_LN_BB_CLK2_A] = &clk_rpmh_ln_bb_clk2_a2_ao.hw, 816 + [RPMH_LN_BB_CLK3] = &clk_rpmh_ln_bb_clk3_a2.hw, 817 + [RPMH_LN_BB_CLK3_A] = &clk_rpmh_ln_bb_clk3_a2_ao.hw, 818 + [RPMH_RF_CLK1] = &clk_rpmh_rf_clk1_a.hw, 819 + [RPMH_RF_CLK1_A] = &clk_rpmh_rf_clk1_a_ao.hw, 820 + [RPMH_RF_CLK2] = &clk_rpmh_rf_clk2_a.hw, 821 + [RPMH_RF_CLK2_A] = &clk_rpmh_rf_clk2_a_ao.hw, 822 + }; 823 + 824 + static const struct clk_rpmh_desc clk_rpmh_qcs615 = { 825 + .clks = qcs615_rpmh_clocks, 826 + .num_clks = ARRAY_SIZE(qcs615_rpmh_clocks), 827 + }; 828 + 829 + static struct clk_hw *sm8750_rpmh_clocks[] = { 830 + [RPMH_CXO_CLK] = &clk_rpmh_bi_tcxo_div2.hw, 831 + [RPMH_CXO_CLK_A] = &clk_rpmh_bi_tcxo_div2_ao.hw, 832 + [RPMH_LN_BB_CLK1] = &clk_rpmh_clk6_a2.hw, 833 + [RPMH_LN_BB_CLK1_A] = &clk_rpmh_clk6_a2_ao.hw, 834 + [RPMH_LN_BB_CLK3] = &clk_rpmh_clk8_a2.hw, 835 + [RPMH_LN_BB_CLK3_A] = &clk_rpmh_clk8_a2_ao.hw, 836 + [RPMH_RF_CLK1] = &clk_rpmh_rf_clk1_a.hw, 837 + [RPMH_RF_CLK1_A] = &clk_rpmh_rf_clk1_a_ao.hw, 838 + [RPMH_RF_CLK2] = &clk_rpmh_rf_clk2_a.hw, 839 + [RPMH_RF_CLK2_A] = &clk_rpmh_rf_clk2_a_ao.hw, 840 + [RPMH_RF_CLK3] = &clk_rpmh_rf_clk3_a2.hw, 841 + [RPMH_RF_CLK3_A] = &clk_rpmh_rf_clk3_a2_ao.hw, 842 + [RPMH_IPA_CLK] = &clk_rpmh_ipa.hw, 843 + }; 844 + 845 + static const struct clk_rpmh_desc clk_rpmh_sm8750 = { 846 + .clks = sm8750_rpmh_clocks, 847 + .num_clks = ARRAY_SIZE(sm8750_rpmh_clocks), 848 + }; 849 + 813 850 static struct clk_hw *of_clk_rpmh_hw_get(struct of_phandle_args *clkspec, 814 851 void *data) 815 852 { ··· 932 891 } 933 892 934 893 static const struct of_device_id clk_rpmh_match_table[] = { 894 + { .compatible = "qcom,qcs615-rpmh-clk", .data = &clk_rpmh_qcs615}, 935 895 { .compatible = "qcom,qdu1000-rpmh-clk", .data = &clk_rpmh_qdu1000}, 936 896 { .compatible = "qcom,sa8775p-rpmh-clk", .data = &clk_rpmh_sa8775p}, 937 897 { .compatible = "qcom,sar2130p-rpmh-clk", .data = &clk_rpmh_sar2130p}, 938 898 { .compatible = "qcom,sc7180-rpmh-clk", .data = &clk_rpmh_sc7180}, 899 + { .compatible = "qcom,sc7280-rpmh-clk", .data = &clk_rpmh_sc7280}, 939 900 { .compatible = "qcom,sc8180x-rpmh-clk", .data = &clk_rpmh_sc8180x}, 940 901 { .compatible = "qcom,sc8280xp-rpmh-clk", .data = &clk_rpmh_sc8280xp}, 941 902 { .compatible = "qcom,sdm845-rpmh-clk", .data = &clk_rpmh_sdm845}, ··· 953 910 { .compatible = "qcom,sm8450-rpmh-clk", .data = &clk_rpmh_sm8450}, 954 911 { .compatible = "qcom,sm8550-rpmh-clk", .data = &clk_rpmh_sm8550}, 955 912 { .compatible = "qcom,sm8650-rpmh-clk", .data = &clk_rpmh_sm8650}, 956 - { .compatible = "qcom,sc7280-rpmh-clk", .data = &clk_rpmh_sc7280}, 913 + { .compatible = "qcom,sm8750-rpmh-clk", .data = &clk_rpmh_sm8750}, 957 914 { .compatible = "qcom,x1e80100-rpmh-clk", .data = &clk_rpmh_x1e80100}, 958 915 { } 959 916 };
+66 -15
drivers/clk/qcom/clk-smd-rpm.c
··· 4 4 * Copyright (c) 2014, The Linux Foundation. All rights reserved. 5 5 */ 6 6 7 + #include <linux/cleanup.h> 7 8 #include <linux/clk-provider.h> 8 9 #include <linux/err.h> 9 10 #include <linux/export.h> ··· 310 309 unsigned long active_rate, sleep_rate; 311 310 int ret; 312 311 313 - mutex_lock(&rpm_smd_clk_lock); 312 + guard(mutex)(&rpm_smd_clk_lock); 314 313 315 314 if (!r->rate) 316 - goto out; 315 + return; 317 316 318 317 /* Take peer clock's rate into account only if it's enabled. */ 319 318 if (peer->enabled) ··· 323 322 active_rate = r->branch ? !!peer_rate : peer_rate; 324 323 ret = clk_smd_rpm_set_rate_active(r, active_rate); 325 324 if (ret) 326 - goto out; 325 + return; 327 326 328 327 sleep_rate = r->branch ? !!peer_sleep_rate : peer_sleep_rate; 329 328 ret = clk_smd_rpm_set_rate_sleep(r, sleep_rate); 330 329 if (ret) 331 - goto out; 330 + return; 332 331 333 332 r->enabled = false; 334 - 335 - out: 336 - mutex_unlock(&rpm_smd_clk_lock); 337 333 } 338 334 339 335 static int clk_smd_rpm_set_rate(struct clk_hw *hw, unsigned long rate, ··· 343 345 unsigned long peer_rate = 0, peer_sleep_rate = 0; 344 346 int ret = 0; 345 347 346 - mutex_lock(&rpm_smd_clk_lock); 348 + guard(mutex)(&rpm_smd_clk_lock); 347 349 348 350 if (!r->enabled) 349 - goto out; 351 + return 0; 350 352 351 353 to_active_sleep(r, rate, &this_rate, &this_sleep_rate); 352 354 ··· 358 360 active_rate = max(this_rate, peer_rate); 359 361 ret = clk_smd_rpm_set_rate_active(r, active_rate); 360 362 if (ret) 361 - goto out; 363 + return ret; 362 364 363 365 sleep_rate = max(this_sleep_rate, peer_sleep_rate); 364 366 ret = clk_smd_rpm_set_rate_sleep(r, sleep_rate); 365 367 if (ret) 366 - goto out; 368 + return ret; 367 369 368 370 r->rate = rate; 369 371 370 - out: 371 - mutex_unlock(&rpm_smd_clk_lock); 372 - 373 - return ret; 372 + return 0; 374 373 } 375 374 376 375 static long clk_smd_rpm_round_rate(struct clk_hw *hw, unsigned long rate, ··· 693 698 .num_clks = ARRAY_SIZE(msm8936_clks), 694 699 .icc_clks = bimc_pcnoc_snoc_smmnoc_icc_clks, 695 700 .num_icc_clks = ARRAY_SIZE(bimc_pcnoc_snoc_smmnoc_icc_clks), 701 + }; 702 + 703 + static struct clk_smd_rpm *msm8937_clks[] = { 704 + [RPM_SMD_XO_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo, 705 + [RPM_SMD_XO_A_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo_a, 706 + [RPM_SMD_QDSS_CLK] = &clk_smd_rpm_qdss_clk, 707 + [RPM_SMD_QDSS_A_CLK] = &clk_smd_rpm_qdss_a_clk, 708 + [RPM_SMD_BB_CLK1] = &clk_smd_rpm_bb_clk1, 709 + [RPM_SMD_BB_CLK1_A] = &clk_smd_rpm_bb_clk1_a, 710 + [RPM_SMD_BB_CLK2] = &clk_smd_rpm_bb_clk2, 711 + [RPM_SMD_BB_CLK2_A] = &clk_smd_rpm_bb_clk2_a, 712 + [RPM_SMD_RF_CLK2] = &clk_smd_rpm_rf_clk2, 713 + [RPM_SMD_RF_CLK2_A] = &clk_smd_rpm_rf_clk2_a, 714 + [RPM_SMD_DIV_CLK2] = &clk_smd_rpm_div_clk2, 715 + [RPM_SMD_DIV_A_CLK2] = &clk_smd_rpm_div_clk2_a, 716 + [RPM_SMD_BB_CLK1_PIN] = &clk_smd_rpm_bb_clk1_pin, 717 + [RPM_SMD_BB_CLK1_A_PIN] = &clk_smd_rpm_bb_clk1_a_pin, 718 + [RPM_SMD_BB_CLK2_PIN] = &clk_smd_rpm_bb_clk2_pin, 719 + [RPM_SMD_BB_CLK2_A_PIN] = &clk_smd_rpm_bb_clk2_a_pin, 720 + }; 721 + 722 + static const struct rpm_smd_clk_desc rpm_clk_msm8937 = { 723 + .clks = msm8937_clks, 724 + .num_clks = ARRAY_SIZE(msm8937_clks), 725 + .icc_clks = bimc_pcnoc_snoc_smmnoc_icc_clks, 726 + .num_icc_clks = ARRAY_SIZE(bimc_pcnoc_snoc_smmnoc_icc_clks), 727 + }; 728 + 729 + static struct clk_smd_rpm *msm8940_clks[] = { 730 + [RPM_SMD_XO_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo, 731 + [RPM_SMD_XO_A_CLK_SRC] = &clk_smd_rpm_branch_bi_tcxo_a, 732 + [RPM_SMD_IPA_CLK] = &clk_smd_rpm_ipa_clk, 733 + [RPM_SMD_IPA_A_CLK] = &clk_smd_rpm_ipa_a_clk, 734 + [RPM_SMD_QDSS_CLK] = &clk_smd_rpm_qdss_clk, 735 + [RPM_SMD_QDSS_A_CLK] = &clk_smd_rpm_qdss_a_clk, 736 + [RPM_SMD_BB_CLK1] = &clk_smd_rpm_bb_clk1, 737 + [RPM_SMD_BB_CLK1_A] = &clk_smd_rpm_bb_clk1_a, 738 + [RPM_SMD_BB_CLK2] = &clk_smd_rpm_bb_clk2, 739 + [RPM_SMD_BB_CLK2_A] = &clk_smd_rpm_bb_clk2_a, 740 + [RPM_SMD_RF_CLK2] = &clk_smd_rpm_rf_clk2, 741 + [RPM_SMD_RF_CLK2_A] = &clk_smd_rpm_rf_clk2_a, 742 + [RPM_SMD_DIV_CLK2] = &clk_smd_rpm_div_clk2, 743 + [RPM_SMD_DIV_A_CLK2] = &clk_smd_rpm_div_clk2_a, 744 + [RPM_SMD_BB_CLK1_PIN] = &clk_smd_rpm_bb_clk1_pin, 745 + [RPM_SMD_BB_CLK1_A_PIN] = &clk_smd_rpm_bb_clk1_a_pin, 746 + [RPM_SMD_BB_CLK2_PIN] = &clk_smd_rpm_bb_clk2_pin, 747 + [RPM_SMD_BB_CLK2_A_PIN] = &clk_smd_rpm_bb_clk2_a_pin, 748 + }; 749 + 750 + static const struct rpm_smd_clk_desc rpm_clk_msm8940 = { 751 + .clks = msm8940_clks, 752 + .num_clks = ARRAY_SIZE(msm8940_clks), 753 + .icc_clks = bimc_pcnoc_snoc_smmnoc_icc_clks, 754 + .num_icc_clks = ARRAY_SIZE(bimc_pcnoc_snoc_smmnoc_icc_clks), 696 755 }; 697 756 698 757 static struct clk_smd_rpm *msm8974_clks[] = { ··· 1265 1216 { .compatible = "qcom,rpmcc-msm8916", .data = &rpm_clk_msm8916 }, 1266 1217 { .compatible = "qcom,rpmcc-msm8917", .data = &rpm_clk_msm8917 }, 1267 1218 { .compatible = "qcom,rpmcc-msm8936", .data = &rpm_clk_msm8936 }, 1219 + { .compatible = "qcom,rpmcc-msm8937", .data = &rpm_clk_msm8937 }, 1220 + { .compatible = "qcom,rpmcc-msm8940", .data = &rpm_clk_msm8940 }, 1268 1221 { .compatible = "qcom,rpmcc-msm8953", .data = &rpm_clk_msm8953 }, 1269 1222 { .compatible = "qcom,rpmcc-msm8974", .data = &rpm_clk_msm8974 }, 1270 1223 { .compatible = "qcom,rpmcc-msm8976", .data = &rpm_clk_msm8976 },
+5 -8
drivers/clk/qcom/clk-spmi-pmic-div.c
··· 3 3 */ 4 4 5 5 #include <linux/bitops.h> 6 + #include <linux/cleanup.h> 6 7 #include <linux/clk.h> 7 8 #include <linux/clk-provider.h> 8 9 #include <linux/delay.h> ··· 141 140 { 142 141 struct clkdiv *clkdiv = to_clkdiv(hw); 143 142 unsigned int div_factor = div_to_div_factor(parent_rate / rate); 144 - unsigned long flags; 145 143 bool enabled; 146 144 int ret; 147 145 148 - spin_lock_irqsave(&clkdiv->lock, flags); 146 + guard(spinlock_irqsave)(&clkdiv->lock); 147 + 149 148 enabled = is_spmi_pmic_clkdiv_enabled(clkdiv); 150 149 if (enabled) { 151 150 ret = spmi_pmic_clkdiv_set_enable_state(clkdiv, false); 152 151 if (ret) 153 - goto unlock; 152 + return ret; 154 153 } 155 154 156 155 ret = regmap_update_bits(clkdiv->regmap, clkdiv->base + REG_DIV_CTL1, 157 156 DIV_CTL1_DIV_FACTOR_MASK, div_factor); 158 157 if (ret) 159 - goto unlock; 158 + return ret; 160 159 161 160 if (enabled) 162 161 ret = __spmi_pmic_clkdiv_set_enable_state(clkdiv, true, 163 162 div_factor); 164 - 165 - unlock: 166 - spin_unlock_irqrestore(&clkdiv->lock, flags); 167 - 168 163 return ret; 169 164 } 170 165
-2
drivers/clk/qcom/dispcc-qcm2290.c
··· 40 40 /* 768MHz configuration */ 41 41 static const struct alpha_pll_config disp_cc_pll0_config = { 42 42 .l = 0x28, 43 - .alpha = 0x0, 44 - .alpha_en_mask = BIT(24), 45 43 .vco_val = 0x2 << 20, 46 44 .vco_mask = GENMASK(21, 20), 47 45 .main_output_mask = BIT(0),
-2
drivers/clk/qcom/dispcc-sm6115.c
··· 48 48 /* 768MHz configuration */ 49 49 static const struct alpha_pll_config disp_cc_pll0_config = { 50 50 .l = 0x28, 51 - .alpha = 0x0, 52 - .alpha_en_mask = BIT(24), 53 51 .vco_val = 0x2 << 20, 54 52 .vco_mask = GENMASK(21, 20), 55 53 .main_output_mask = BIT(0),
+3 -4
drivers/clk/qcom/dispcc-sm6350.c
··· 187 187 .cmd_rcgr = 0x1144, 188 188 .mnd_width = 0, 189 189 .hid_width = 5, 190 + .parent_map = disp_cc_parent_map_6, 190 191 .freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src, 191 192 .clkr.hw.init = &(struct clk_init_data){ 192 193 .name = "disp_cc_mdss_dp_aux_clk_src", 193 - .parent_data = &(const struct clk_parent_data){ 194 - .fw_name = "bi_tcxo", 195 - }, 196 - .num_parents = 1, 194 + .parent_data = disp_cc_parent_data_6, 195 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_6), 197 196 .ops = &clk_rcg2_ops, 198 197 }, 199 198 };
+1963
drivers/clk/qcom/dispcc-sm8750.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Copyright (c) 2021, The Linux Foundation. All rights reserved. 4 + * Copyright (c) 2023-2024, Linaro Ltd. 5 + */ 6 + 7 + #include <linux/clk-provider.h> 8 + #include <linux/err.h> 9 + #include <linux/kernel.h> 10 + #include <linux/mod_devicetable.h> 11 + #include <linux/module.h> 12 + #include <linux/platform_device.h> 13 + #include <linux/regmap.h> 14 + #include <linux/pm_runtime.h> 15 + 16 + #include <dt-bindings/clock/qcom,sm8750-dispcc.h> 17 + 18 + #include "common.h" 19 + #include "clk-alpha-pll.h" 20 + #include "clk-branch.h" 21 + #include "clk-pll.h" 22 + #include "clk-rcg.h" 23 + #include "clk-regmap.h" 24 + #include "clk-regmap-divider.h" 25 + #include "clk-regmap-mux.h" 26 + #include "reset.h" 27 + #include "gdsc.h" 28 + 29 + /* Need to match the order of clocks in DT binding */ 30 + enum { 31 + DT_BI_TCXO, 32 + DT_BI_TCXO_AO, 33 + DT_AHB_CLK, 34 + DT_SLEEP_CLK, 35 + 36 + DT_DSI0_PHY_PLL_OUT_BYTECLK, 37 + DT_DSI0_PHY_PLL_OUT_DSICLK, 38 + DT_DSI1_PHY_PLL_OUT_BYTECLK, 39 + DT_DSI1_PHY_PLL_OUT_DSICLK, 40 + 41 + DT_DP0_PHY_PLL_LINK_CLK, 42 + DT_DP0_PHY_PLL_VCO_DIV_CLK, 43 + DT_DP1_PHY_PLL_LINK_CLK, 44 + DT_DP1_PHY_PLL_VCO_DIV_CLK, 45 + DT_DP2_PHY_PLL_LINK_CLK, 46 + DT_DP2_PHY_PLL_VCO_DIV_CLK, 47 + DT_DP3_PHY_PLL_LINK_CLK, 48 + DT_DP3_PHY_PLL_VCO_DIV_CLK, 49 + }; 50 + 51 + #define DISP_CC_MISC_CMD 0xF000 52 + 53 + enum { 54 + P_BI_TCXO, 55 + P_DISP_CC_PLL0_OUT_MAIN, 56 + P_DISP_CC_PLL1_OUT_EVEN, 57 + P_DISP_CC_PLL1_OUT_MAIN, 58 + P_DISP_CC_PLL2_OUT_MAIN, 59 + P_DP0_PHY_PLL_LINK_CLK, 60 + P_DP0_PHY_PLL_VCO_DIV_CLK, 61 + P_DP1_PHY_PLL_LINK_CLK, 62 + P_DP1_PHY_PLL_VCO_DIV_CLK, 63 + P_DP2_PHY_PLL_LINK_CLK, 64 + P_DP2_PHY_PLL_VCO_DIV_CLK, 65 + P_DP3_PHY_PLL_LINK_CLK, 66 + P_DP3_PHY_PLL_VCO_DIV_CLK, 67 + P_DSI0_PHY_PLL_OUT_BYTECLK, 68 + P_DSI0_PHY_PLL_OUT_DSICLK, 69 + P_DSI1_PHY_PLL_OUT_BYTECLK, 70 + P_DSI1_PHY_PLL_OUT_DSICLK, 71 + P_SLEEP_CLK, 72 + }; 73 + 74 + static const struct pll_vco pongo_elu_vco[] = { 75 + { 38400000, 38400000, 0 }, 76 + }; 77 + 78 + static const struct pll_vco taycan_elu_vco[] = { 79 + { 249600000, 2500000000, 0 }, 80 + }; 81 + 82 + static struct alpha_pll_config disp_cc_pll0_config = { 83 + .l = 0xd, 84 + .alpha = 0x6492, 85 + .config_ctl_val = 0x19660387, 86 + .config_ctl_hi_val = 0x098060a0, 87 + .config_ctl_hi1_val = 0xb416cb20, 88 + .user_ctl_val = 0x00000000, 89 + .user_ctl_hi_val = 0x00000002, 90 + }; 91 + 92 + static struct clk_alpha_pll disp_cc_pll0 = { 93 + .offset = 0x0, 94 + .vco_table = taycan_elu_vco, 95 + .num_vco = ARRAY_SIZE(taycan_elu_vco), 96 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_ELU], 97 + .clkr = { 98 + .hw.init = &(const struct clk_init_data) { 99 + .name = "disp_cc_pll0", 100 + .parent_data = &(const struct clk_parent_data) { 101 + .index = DT_BI_TCXO, 102 + }, 103 + .num_parents = 1, 104 + .ops = &clk_alpha_pll_taycan_elu_ops, 105 + }, 106 + }, 107 + }; 108 + 109 + static struct alpha_pll_config disp_cc_pll1_config = { 110 + .l = 0x1f, 111 + .alpha = 0x4000, 112 + .config_ctl_val = 0x19660387, 113 + .config_ctl_hi_val = 0x098060a0, 114 + .config_ctl_hi1_val = 0xb416cb20, 115 + .user_ctl_val = 0x00000000, 116 + .user_ctl_hi_val = 0x00000002, 117 + }; 118 + 119 + static struct clk_alpha_pll disp_cc_pll1 = { 120 + .offset = 0x1000, 121 + .vco_table = taycan_elu_vco, 122 + .num_vco = ARRAY_SIZE(taycan_elu_vco), 123 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_ELU], 124 + .clkr = { 125 + .hw.init = &(const struct clk_init_data) { 126 + .name = "disp_cc_pll1", 127 + .parent_data = &(const struct clk_parent_data) { 128 + .index = DT_BI_TCXO, 129 + }, 130 + .num_parents = 1, 131 + .ops = &clk_alpha_pll_taycan_elu_ops, 132 + }, 133 + }, 134 + }; 135 + 136 + static const struct alpha_pll_config disp_cc_pll2_config = { 137 + .l = 0x493, 138 + .alpha = 0x0, 139 + .config_ctl_val = 0x60000f68, 140 + .config_ctl_hi_val = 0x0001c808, 141 + .config_ctl_hi1_val = 0x00000000, 142 + .config_ctl_hi2_val = 0x040082f4, 143 + .test_ctl_val = 0x00008000, 144 + .test_ctl_hi_val = 0x0080c496, 145 + .test_ctl_hi1_val = 0x40100180, 146 + .test_ctl_hi2_val = 0x441001bc, 147 + .test_ctl_hi3_val = 0x002003d8, 148 + .user_ctl_val = 0x00000400, 149 + .user_ctl_hi_val = 0x00e50302, 150 + }; 151 + 152 + static struct clk_alpha_pll disp_cc_pll2 = { 153 + .offset = 0x2000, 154 + .vco_table = pongo_elu_vco, 155 + .num_vco = ARRAY_SIZE(pongo_elu_vco), 156 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_PONGO_ELU], 157 + .clkr = { 158 + .hw.init = &(const struct clk_init_data) { 159 + .name = "disp_cc_pll2", 160 + .parent_data = &(const struct clk_parent_data) { 161 + .index = DT_SLEEP_CLK, 162 + }, 163 + .num_parents = 1, 164 + .ops = &clk_alpha_pll_pongo_elu_ops, 165 + }, 166 + }, 167 + }; 168 + 169 + static const struct parent_map disp_cc_parent_map_0[] = { 170 + { P_BI_TCXO, 0 }, 171 + }; 172 + 173 + static const struct clk_parent_data disp_cc_parent_data_0[] = { 174 + { .index = DT_BI_TCXO }, 175 + }; 176 + 177 + static const struct clk_parent_data disp_cc_parent_data_0_ao[] = { 178 + { .index = DT_BI_TCXO_AO }, 179 + }; 180 + 181 + static const struct parent_map disp_cc_parent_map_1[] = { 182 + { P_BI_TCXO, 0 }, 183 + { P_DSI0_PHY_PLL_OUT_DSICLK, 1 }, 184 + { P_DSI0_PHY_PLL_OUT_BYTECLK, 2 }, 185 + { P_DSI1_PHY_PLL_OUT_DSICLK, 3 }, 186 + { P_DSI1_PHY_PLL_OUT_BYTECLK, 4 }, 187 + }; 188 + 189 + static const struct clk_parent_data disp_cc_parent_data_1[] = { 190 + { .index = DT_BI_TCXO }, 191 + { .index = DT_DSI0_PHY_PLL_OUT_DSICLK }, 192 + { .index = DT_DSI0_PHY_PLL_OUT_BYTECLK }, 193 + { .index = DT_DSI1_PHY_PLL_OUT_DSICLK }, 194 + { .index = DT_DSI1_PHY_PLL_OUT_BYTECLK }, 195 + }; 196 + 197 + static const struct parent_map disp_cc_parent_map_2[] = { 198 + { P_BI_TCXO, 0 }, 199 + { P_DP3_PHY_PLL_VCO_DIV_CLK, 3 }, 200 + { P_DP1_PHY_PLL_VCO_DIV_CLK, 4 }, 201 + { P_DP2_PHY_PLL_VCO_DIV_CLK, 6 }, 202 + }; 203 + 204 + static const struct clk_parent_data disp_cc_parent_data_2[] = { 205 + { .index = DT_BI_TCXO }, 206 + { .index = DT_DP3_PHY_PLL_VCO_DIV_CLK }, 207 + { .index = DT_DP1_PHY_PLL_VCO_DIV_CLK }, 208 + { .index = DT_DP2_PHY_PLL_VCO_DIV_CLK }, 209 + }; 210 + 211 + static const struct parent_map disp_cc_parent_map_3[] = { 212 + { P_BI_TCXO, 0 }, 213 + { P_DP1_PHY_PLL_LINK_CLK, 2 }, 214 + { P_DP2_PHY_PLL_LINK_CLK, 3 }, 215 + { P_DP3_PHY_PLL_LINK_CLK, 4 }, 216 + }; 217 + 218 + static const struct clk_parent_data disp_cc_parent_data_3[] = { 219 + { .index = DT_BI_TCXO }, 220 + { .index = DT_DP1_PHY_PLL_LINK_CLK }, 221 + { .index = DT_DP2_PHY_PLL_LINK_CLK }, 222 + { .index = DT_DP3_PHY_PLL_LINK_CLK }, 223 + }; 224 + 225 + static const struct parent_map disp_cc_parent_map_4[] = { 226 + { P_BI_TCXO, 0 }, 227 + { P_DSI0_PHY_PLL_OUT_DSICLK, 1 }, 228 + { P_DISP_CC_PLL2_OUT_MAIN, 2 }, 229 + { P_DSI1_PHY_PLL_OUT_DSICLK, 3 }, 230 + }; 231 + 232 + static const struct clk_parent_data disp_cc_parent_data_4[] = { 233 + { .index = DT_BI_TCXO }, 234 + { .index = DT_DSI0_PHY_PLL_OUT_DSICLK }, 235 + { .hw = &disp_cc_pll2.clkr.hw }, 236 + { .index = DT_DSI1_PHY_PLL_OUT_DSICLK }, 237 + }; 238 + 239 + static const struct parent_map disp_cc_parent_map_5[] = { 240 + { P_BI_TCXO, 0 }, 241 + { P_DP0_PHY_PLL_LINK_CLK, 1 }, 242 + { P_DP0_PHY_PLL_VCO_DIV_CLK, 2 }, 243 + { P_DP3_PHY_PLL_VCO_DIV_CLK, 3 }, 244 + { P_DP1_PHY_PLL_VCO_DIV_CLK, 4 }, 245 + { P_DP2_PHY_PLL_VCO_DIV_CLK, 6 }, 246 + }; 247 + 248 + static const struct clk_parent_data disp_cc_parent_data_5[] = { 249 + { .index = DT_BI_TCXO }, 250 + { .index = DT_DP0_PHY_PLL_LINK_CLK }, 251 + { .index = DT_DP0_PHY_PLL_VCO_DIV_CLK }, 252 + { .index = DT_DP3_PHY_PLL_VCO_DIV_CLK }, 253 + { .index = DT_DP1_PHY_PLL_VCO_DIV_CLK }, 254 + { .index = DT_DP2_PHY_PLL_VCO_DIV_CLK }, 255 + }; 256 + 257 + static const struct parent_map disp_cc_parent_map_6[] = { 258 + { P_BI_TCXO, 0 }, 259 + { P_DSI0_PHY_PLL_OUT_BYTECLK, 2 }, 260 + { P_DSI1_PHY_PLL_OUT_BYTECLK, 4 }, 261 + }; 262 + 263 + static const struct clk_parent_data disp_cc_parent_data_6[] = { 264 + { .index = DT_BI_TCXO }, 265 + { .index = DT_DSI0_PHY_PLL_OUT_BYTECLK }, 266 + { .index = DT_DSI1_PHY_PLL_OUT_BYTECLK }, 267 + }; 268 + 269 + static const struct parent_map disp_cc_parent_map_7[] = { 270 + { P_BI_TCXO, 0 }, 271 + { P_DISP_CC_PLL1_OUT_MAIN, 4 }, 272 + { P_DISP_CC_PLL1_OUT_EVEN, 6 }, 273 + }; 274 + 275 + static const struct clk_parent_data disp_cc_parent_data_7[] = { 276 + { .index = DT_BI_TCXO }, 277 + { .hw = &disp_cc_pll1.clkr.hw }, 278 + { .hw = &disp_cc_pll1.clkr.hw }, 279 + }; 280 + 281 + static const struct parent_map disp_cc_parent_map_8[] = { 282 + { P_BI_TCXO, 0 }, 283 + { P_DP0_PHY_PLL_LINK_CLK, 1 }, 284 + { P_DP1_PHY_PLL_LINK_CLK, 2 }, 285 + { P_DP2_PHY_PLL_LINK_CLK, 3 }, 286 + { P_DP3_PHY_PLL_LINK_CLK, 4 }, 287 + }; 288 + 289 + static const struct clk_parent_data disp_cc_parent_data_8[] = { 290 + { .index = DT_BI_TCXO }, 291 + { .index = DT_DP0_PHY_PLL_LINK_CLK }, 292 + { .index = DT_DP1_PHY_PLL_LINK_CLK }, 293 + { .index = DT_DP2_PHY_PLL_LINK_CLK }, 294 + { .index = DT_DP3_PHY_PLL_LINK_CLK }, 295 + }; 296 + 297 + static const struct parent_map disp_cc_parent_map_9[] = { 298 + { P_BI_TCXO, 0 }, 299 + { P_DISP_CC_PLL0_OUT_MAIN, 1 }, 300 + { P_DISP_CC_PLL1_OUT_MAIN, 4 }, 301 + { P_DISP_CC_PLL1_OUT_EVEN, 6 }, 302 + }; 303 + 304 + static const struct clk_parent_data disp_cc_parent_data_9[] = { 305 + { .index = DT_BI_TCXO }, 306 + { .hw = &disp_cc_pll0.clkr.hw }, 307 + { .hw = &disp_cc_pll1.clkr.hw }, 308 + { .hw = &disp_cc_pll1.clkr.hw }, 309 + }; 310 + 311 + static const struct parent_map disp_cc_parent_map_10[] = { 312 + { P_BI_TCXO, 0 }, 313 + { P_DISP_CC_PLL2_OUT_MAIN, 2 }, 314 + }; 315 + 316 + static const struct clk_parent_data disp_cc_parent_data_10[] = { 317 + { .index = DT_BI_TCXO }, 318 + { .hw = &disp_cc_pll2.clkr.hw }, 319 + }; 320 + 321 + static const struct parent_map disp_cc_parent_map_11[] = { 322 + { P_SLEEP_CLK, 0 }, 323 + }; 324 + 325 + static const struct clk_parent_data disp_cc_parent_data_11[] = { 326 + { .index = DT_SLEEP_CLK }, 327 + }; 328 + 329 + static const struct freq_tbl ftbl_disp_cc_esync0_clk_src[] = { 330 + F(19200000, P_BI_TCXO, 1, 0, 0), 331 + { } 332 + }; 333 + 334 + static struct clk_rcg2 disp_cc_esync0_clk_src = { 335 + .cmd_rcgr = 0x80c0, 336 + .mnd_width = 16, 337 + .hid_width = 5, 338 + .parent_map = disp_cc_parent_map_4, 339 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 340 + .clkr.hw.init = &(const struct clk_init_data) { 341 + .name = "disp_cc_esync0_clk_src", 342 + .parent_data = disp_cc_parent_data_4, 343 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_4), 344 + .flags = CLK_SET_RATE_PARENT, 345 + .ops = &clk_byte2_ops, 346 + }, 347 + }; 348 + 349 + static struct clk_rcg2 disp_cc_esync1_clk_src = { 350 + .cmd_rcgr = 0x80d8, 351 + .mnd_width = 16, 352 + .hid_width = 5, 353 + .parent_map = disp_cc_parent_map_4, 354 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 355 + .clkr.hw.init = &(const struct clk_init_data) { 356 + .name = "disp_cc_esync1_clk_src", 357 + .parent_data = disp_cc_parent_data_4, 358 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_4), 359 + .flags = CLK_SET_RATE_PARENT, 360 + .ops = &clk_byte2_ops, 361 + }, 362 + }; 363 + 364 + static const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = { 365 + F(19200000, P_BI_TCXO, 1, 0, 0), 366 + F(37500000, P_DISP_CC_PLL1_OUT_MAIN, 16, 0, 0), 367 + F(75000000, P_DISP_CC_PLL1_OUT_MAIN, 8, 0, 0), 368 + { } 369 + }; 370 + 371 + static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = { 372 + .cmd_rcgr = 0x8360, 373 + .mnd_width = 0, 374 + .hid_width = 5, 375 + .parent_map = disp_cc_parent_map_7, 376 + .freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src, 377 + .clkr.hw.init = &(const struct clk_init_data) { 378 + .name = "disp_cc_mdss_ahb_clk_src", 379 + .parent_data = disp_cc_parent_data_7, 380 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_7), 381 + .flags = CLK_SET_RATE_PARENT, 382 + .ops = &clk_rcg2_shared_ops, 383 + }, 384 + }; 385 + 386 + static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = { 387 + .cmd_rcgr = 0x8180, 388 + .mnd_width = 0, 389 + .hid_width = 5, 390 + .parent_map = disp_cc_parent_map_1, 391 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 392 + .clkr.hw.init = &(const struct clk_init_data) { 393 + .name = "disp_cc_mdss_byte0_clk_src", 394 + .parent_data = disp_cc_parent_data_1, 395 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_1), 396 + .flags = CLK_SET_RATE_PARENT, 397 + .ops = &clk_byte2_ops, 398 + }, 399 + }; 400 + 401 + static struct clk_rcg2 disp_cc_mdss_byte1_clk_src = { 402 + .cmd_rcgr = 0x819c, 403 + .mnd_width = 0, 404 + .hid_width = 5, 405 + .parent_map = disp_cc_parent_map_1, 406 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 407 + .clkr.hw.init = &(const struct clk_init_data) { 408 + .name = "disp_cc_mdss_byte1_clk_src", 409 + .parent_data = disp_cc_parent_data_1, 410 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_1), 411 + .flags = CLK_SET_RATE_PARENT, 412 + .ops = &clk_byte2_ops, 413 + }, 414 + }; 415 + 416 + static struct clk_rcg2 disp_cc_mdss_dptx0_aux_clk_src = { 417 + .cmd_rcgr = 0x8234, 418 + .mnd_width = 0, 419 + .hid_width = 5, 420 + .parent_map = disp_cc_parent_map_0, 421 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 422 + .clkr.hw.init = &(const struct clk_init_data) { 423 + .name = "disp_cc_mdss_dptx0_aux_clk_src", 424 + .parent_data = disp_cc_parent_data_0, 425 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_0), 426 + .flags = CLK_SET_RATE_PARENT, 427 + .ops = &clk_rcg2_ops, 428 + }, 429 + }; 430 + 431 + static struct clk_rcg2 disp_cc_mdss_dptx0_link_clk_src = { 432 + .cmd_rcgr = 0x81e8, 433 + .mnd_width = 0, 434 + .hid_width = 5, 435 + .parent_map = disp_cc_parent_map_8, 436 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 437 + .clkr.hw.init = &(const struct clk_init_data) { 438 + .name = "disp_cc_mdss_dptx0_link_clk_src", 439 + .parent_data = disp_cc_parent_data_8, 440 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_8), 441 + .flags = CLK_SET_RATE_PARENT, 442 + .ops = &clk_byte2_ops, 443 + }, 444 + }; 445 + 446 + static struct clk_rcg2 disp_cc_mdss_dptx0_pixel0_clk_src = { 447 + .cmd_rcgr = 0x8204, 448 + .mnd_width = 16, 449 + .hid_width = 5, 450 + .parent_map = disp_cc_parent_map_5, 451 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 452 + .clkr.hw.init = &(const struct clk_init_data) { 453 + .name = "disp_cc_mdss_dptx0_pixel0_clk_src", 454 + .parent_data = disp_cc_parent_data_5, 455 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_5), 456 + .flags = CLK_SET_RATE_PARENT, 457 + .ops = &clk_dp_ops, 458 + }, 459 + }; 460 + 461 + static struct clk_rcg2 disp_cc_mdss_dptx0_pixel1_clk_src = { 462 + .cmd_rcgr = 0x821c, 463 + .mnd_width = 16, 464 + .hid_width = 5, 465 + .parent_map = disp_cc_parent_map_5, 466 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 467 + .clkr.hw.init = &(const struct clk_init_data) { 468 + .name = "disp_cc_mdss_dptx0_pixel1_clk_src", 469 + .parent_data = disp_cc_parent_data_5, 470 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_5), 471 + .flags = CLK_SET_RATE_PARENT, 472 + .ops = &clk_dp_ops, 473 + }, 474 + }; 475 + 476 + static struct clk_rcg2 disp_cc_mdss_dptx1_aux_clk_src = { 477 + .cmd_rcgr = 0x8298, 478 + .mnd_width = 0, 479 + .hid_width = 5, 480 + .parent_map = disp_cc_parent_map_0, 481 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 482 + .clkr.hw.init = &(const struct clk_init_data) { 483 + .name = "disp_cc_mdss_dptx1_aux_clk_src", 484 + .parent_data = disp_cc_parent_data_0, 485 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_0), 486 + .flags = CLK_SET_RATE_PARENT, 487 + .ops = &clk_rcg2_ops, 488 + }, 489 + }; 490 + 491 + static struct clk_rcg2 disp_cc_mdss_dptx1_link_clk_src = { 492 + .cmd_rcgr = 0x827c, 493 + .mnd_width = 0, 494 + .hid_width = 5, 495 + .parent_map = disp_cc_parent_map_3, 496 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 497 + .clkr.hw.init = &(const struct clk_init_data) { 498 + .name = "disp_cc_mdss_dptx1_link_clk_src", 499 + .parent_data = disp_cc_parent_data_3, 500 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_3), 501 + .flags = CLK_SET_RATE_PARENT, 502 + .ops = &clk_byte2_ops, 503 + }, 504 + }; 505 + 506 + static struct clk_rcg2 disp_cc_mdss_dptx1_pixel0_clk_src = { 507 + .cmd_rcgr = 0x824c, 508 + .mnd_width = 16, 509 + .hid_width = 5, 510 + .parent_map = disp_cc_parent_map_2, 511 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 512 + .clkr.hw.init = &(const struct clk_init_data) { 513 + .name = "disp_cc_mdss_dptx1_pixel0_clk_src", 514 + .parent_data = disp_cc_parent_data_2, 515 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_2), 516 + .flags = CLK_SET_RATE_PARENT, 517 + .ops = &clk_dp_ops, 518 + }, 519 + }; 520 + 521 + static struct clk_rcg2 disp_cc_mdss_dptx1_pixel1_clk_src = { 522 + .cmd_rcgr = 0x8264, 523 + .mnd_width = 16, 524 + .hid_width = 5, 525 + .parent_map = disp_cc_parent_map_2, 526 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 527 + .clkr.hw.init = &(const struct clk_init_data) { 528 + .name = "disp_cc_mdss_dptx1_pixel1_clk_src", 529 + .parent_data = disp_cc_parent_data_2, 530 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_2), 531 + .flags = CLK_SET_RATE_PARENT, 532 + .ops = &clk_dp_ops, 533 + }, 534 + }; 535 + 536 + static struct clk_rcg2 disp_cc_mdss_dptx2_aux_clk_src = { 537 + .cmd_rcgr = 0x82fc, 538 + .mnd_width = 0, 539 + .hid_width = 5, 540 + .parent_map = disp_cc_parent_map_0, 541 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 542 + .clkr.hw.init = &(const struct clk_init_data) { 543 + .name = "disp_cc_mdss_dptx2_aux_clk_src", 544 + .parent_data = disp_cc_parent_data_0, 545 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_0), 546 + .flags = CLK_SET_RATE_PARENT, 547 + .ops = &clk_rcg2_ops, 548 + }, 549 + }; 550 + 551 + static struct clk_rcg2 disp_cc_mdss_dptx2_link_clk_src = { 552 + .cmd_rcgr = 0x82b0, 553 + .mnd_width = 0, 554 + .hid_width = 5, 555 + .parent_map = disp_cc_parent_map_3, 556 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 557 + .clkr.hw.init = &(const struct clk_init_data) { 558 + .name = "disp_cc_mdss_dptx2_link_clk_src", 559 + .parent_data = disp_cc_parent_data_3, 560 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_3), 561 + .flags = CLK_SET_RATE_PARENT, 562 + .ops = &clk_byte2_ops, 563 + }, 564 + }; 565 + 566 + static struct clk_rcg2 disp_cc_mdss_dptx2_pixel0_clk_src = { 567 + .cmd_rcgr = 0x82cc, 568 + .mnd_width = 16, 569 + .hid_width = 5, 570 + .parent_map = disp_cc_parent_map_2, 571 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 572 + .clkr.hw.init = &(const struct clk_init_data) { 573 + .name = "disp_cc_mdss_dptx2_pixel0_clk_src", 574 + .parent_data = disp_cc_parent_data_2, 575 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_2), 576 + .flags = CLK_SET_RATE_PARENT, 577 + .ops = &clk_dp_ops, 578 + }, 579 + }; 580 + 581 + static struct clk_rcg2 disp_cc_mdss_dptx2_pixel1_clk_src = { 582 + .cmd_rcgr = 0x82e4, 583 + .mnd_width = 16, 584 + .hid_width = 5, 585 + .parent_map = disp_cc_parent_map_2, 586 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 587 + .clkr.hw.init = &(const struct clk_init_data) { 588 + .name = "disp_cc_mdss_dptx2_pixel1_clk_src", 589 + .parent_data = disp_cc_parent_data_2, 590 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_2), 591 + .flags = CLK_SET_RATE_PARENT, 592 + .ops = &clk_dp_ops, 593 + }, 594 + }; 595 + 596 + static struct clk_rcg2 disp_cc_mdss_dptx3_aux_clk_src = { 597 + .cmd_rcgr = 0x8348, 598 + .mnd_width = 0, 599 + .hid_width = 5, 600 + .parent_map = disp_cc_parent_map_0, 601 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 602 + .clkr.hw.init = &(const struct clk_init_data) { 603 + .name = "disp_cc_mdss_dptx3_aux_clk_src", 604 + .parent_data = disp_cc_parent_data_0, 605 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_0), 606 + .flags = CLK_SET_RATE_PARENT, 607 + .ops = &clk_rcg2_ops, 608 + }, 609 + }; 610 + 611 + static struct clk_rcg2 disp_cc_mdss_dptx3_link_clk_src = { 612 + .cmd_rcgr = 0x832c, 613 + .mnd_width = 0, 614 + .hid_width = 5, 615 + .parent_map = disp_cc_parent_map_3, 616 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 617 + .clkr.hw.init = &(const struct clk_init_data) { 618 + .name = "disp_cc_mdss_dptx3_link_clk_src", 619 + .parent_data = disp_cc_parent_data_3, 620 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_3), 621 + .flags = CLK_SET_RATE_PARENT, 622 + .ops = &clk_byte2_ops, 623 + }, 624 + }; 625 + 626 + static struct clk_rcg2 disp_cc_mdss_dptx3_pixel0_clk_src = { 627 + .cmd_rcgr = 0x8314, 628 + .mnd_width = 16, 629 + .hid_width = 5, 630 + .parent_map = disp_cc_parent_map_2, 631 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 632 + .clkr.hw.init = &(const struct clk_init_data) { 633 + .name = "disp_cc_mdss_dptx3_pixel0_clk_src", 634 + .parent_data = disp_cc_parent_data_2, 635 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_2), 636 + .flags = CLK_SET_RATE_PARENT, 637 + .ops = &clk_dp_ops, 638 + }, 639 + }; 640 + 641 + static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = { 642 + .cmd_rcgr = 0x81b8, 643 + .mnd_width = 0, 644 + .hid_width = 5, 645 + .parent_map = disp_cc_parent_map_6, 646 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 647 + .clkr.hw.init = &(const struct clk_init_data) { 648 + .name = "disp_cc_mdss_esc0_clk_src", 649 + .parent_data = disp_cc_parent_data_6, 650 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_6), 651 + .flags = CLK_SET_RATE_PARENT, 652 + .ops = &clk_rcg2_shared_ops, 653 + }, 654 + }; 655 + 656 + static struct clk_rcg2 disp_cc_mdss_esc1_clk_src = { 657 + .cmd_rcgr = 0x81d0, 658 + .mnd_width = 0, 659 + .hid_width = 5, 660 + .parent_map = disp_cc_parent_map_6, 661 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 662 + .clkr.hw.init = &(const struct clk_init_data) { 663 + .name = "disp_cc_mdss_esc1_clk_src", 664 + .parent_data = disp_cc_parent_data_6, 665 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_6), 666 + .flags = CLK_SET_RATE_PARENT, 667 + .ops = &clk_rcg2_shared_ops, 668 + }, 669 + }; 670 + 671 + static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = { 672 + F(19200000, P_BI_TCXO, 1, 0, 0), 673 + F(85714286, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 674 + F(100000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 675 + F(156000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 676 + F(207000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 677 + F(337000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 678 + F(417000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 679 + F(532000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 680 + F(575000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), 681 + { } 682 + }; 683 + 684 + static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = { 685 + .cmd_rcgr = 0x8150, 686 + .mnd_width = 0, 687 + .hid_width = 5, 688 + .parent_map = disp_cc_parent_map_9, 689 + .freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src, 690 + .clkr.hw.init = &(const struct clk_init_data) { 691 + .name = "disp_cc_mdss_mdp_clk_src", 692 + .parent_data = disp_cc_parent_data_9, 693 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_9), 694 + .flags = CLK_SET_RATE_PARENT, 695 + /* 696 + * TODO: Downstream does not manage the clock directly, but 697 + * places votes via new hardware block called "cesta". 698 + * It is not clear whether such approach should be taken instead 699 + * of manual control. 700 + */ 701 + .ops = &clk_rcg2_shared_ops, 702 + }, 703 + }; 704 + 705 + static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = { 706 + .cmd_rcgr = 0x8108, 707 + .mnd_width = 8, 708 + .hid_width = 5, 709 + .parent_map = disp_cc_parent_map_1, 710 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 711 + .clkr.hw.init = &(const struct clk_init_data) { 712 + .name = "disp_cc_mdss_pclk0_clk_src", 713 + .parent_data = disp_cc_parent_data_1, 714 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_1), 715 + .flags = CLK_SET_RATE_PARENT, 716 + .ops = &clk_pixel_ops, 717 + }, 718 + }; 719 + 720 + static struct clk_rcg2 disp_cc_mdss_pclk1_clk_src = { 721 + .cmd_rcgr = 0x8120, 722 + .mnd_width = 8, 723 + .hid_width = 5, 724 + .parent_map = disp_cc_parent_map_1, 725 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 726 + .clkr.hw.init = &(const struct clk_init_data) { 727 + .name = "disp_cc_mdss_pclk1_clk_src", 728 + .parent_data = disp_cc_parent_data_1, 729 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_1), 730 + .flags = CLK_SET_RATE_PARENT, 731 + .ops = &clk_pixel_ops, 732 + }, 733 + }; 734 + 735 + static struct clk_rcg2 disp_cc_mdss_pclk2_clk_src = { 736 + .cmd_rcgr = 0x8138, 737 + .mnd_width = 8, 738 + .hid_width = 5, 739 + .parent_map = disp_cc_parent_map_1, 740 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 741 + .clkr.hw.init = &(const struct clk_init_data) { 742 + .name = "disp_cc_mdss_pclk2_clk_src", 743 + .parent_data = disp_cc_parent_data_1, 744 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_1), 745 + .flags = CLK_SET_RATE_PARENT, 746 + .ops = &clk_pixel_ops, 747 + }, 748 + }; 749 + 750 + static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = { 751 + .cmd_rcgr = 0x8168, 752 + .mnd_width = 0, 753 + .hid_width = 5, 754 + .parent_map = disp_cc_parent_map_0, 755 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 756 + .clkr.hw.init = &(const struct clk_init_data) { 757 + .name = "disp_cc_mdss_vsync_clk_src", 758 + .parent_data = disp_cc_parent_data_0, 759 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_0), 760 + .flags = CLK_SET_RATE_PARENT, 761 + .ops = &clk_rcg2_ops, 762 + }, 763 + }; 764 + 765 + static const struct freq_tbl ftbl_disp_cc_osc_clk_src[] = { 766 + F(38400000, P_DISP_CC_PLL2_OUT_MAIN, 1, 0, 0), 767 + { } 768 + }; 769 + 770 + static struct clk_rcg2 disp_cc_osc_clk_src = { 771 + .cmd_rcgr = 0x80f0, 772 + .mnd_width = 0, 773 + .hid_width = 5, 774 + .parent_map = disp_cc_parent_map_10, 775 + .freq_tbl = ftbl_disp_cc_osc_clk_src, 776 + .clkr.hw.init = &(const struct clk_init_data) { 777 + .name = "disp_cc_osc_clk_src", 778 + .parent_data = disp_cc_parent_data_10, 779 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_10), 780 + .flags = CLK_SET_RATE_PARENT, 781 + .ops = &clk_rcg2_ops, 782 + }, 783 + }; 784 + 785 + static const struct freq_tbl ftbl_disp_cc_sleep_clk_src[] = { 786 + F(32000, P_SLEEP_CLK, 1, 0, 0), 787 + { } 788 + }; 789 + 790 + static struct clk_rcg2 disp_cc_sleep_clk_src = { 791 + .cmd_rcgr = 0xe064, 792 + .mnd_width = 0, 793 + .hid_width = 5, 794 + .parent_map = disp_cc_parent_map_11, 795 + .freq_tbl = ftbl_disp_cc_sleep_clk_src, 796 + .clkr.hw.init = &(const struct clk_init_data) { 797 + .name = "disp_cc_sleep_clk_src", 798 + .parent_data = disp_cc_parent_data_11, 799 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_11), 800 + .flags = CLK_SET_RATE_PARENT, 801 + .ops = &clk_rcg2_ops, 802 + }, 803 + }; 804 + 805 + static struct clk_rcg2 disp_cc_xo_clk_src = { 806 + .cmd_rcgr = 0xe044, 807 + .mnd_width = 0, 808 + .hid_width = 5, 809 + .parent_map = disp_cc_parent_map_0, 810 + .freq_tbl = ftbl_disp_cc_esync0_clk_src, 811 + .clkr.hw.init = &(const struct clk_init_data) { 812 + .name = "disp_cc_xo_clk_src", 813 + .parent_data = disp_cc_parent_data_0_ao, 814 + .num_parents = ARRAY_SIZE(disp_cc_parent_data_0_ao), 815 + .flags = CLK_SET_RATE_PARENT, 816 + .ops = &clk_rcg2_ops, 817 + }, 818 + }; 819 + 820 + static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = { 821 + .reg = 0x8198, 822 + .shift = 0, 823 + .width = 4, 824 + .clkr.hw.init = &(const struct clk_init_data) { 825 + .name = "disp_cc_mdss_byte0_div_clk_src", 826 + .parent_hws = (const struct clk_hw*[]) { 827 + &disp_cc_mdss_byte0_clk_src.clkr.hw, 828 + }, 829 + .num_parents = 1, 830 + .flags = CLK_SET_RATE_PARENT, 831 + .ops = &clk_regmap_div_ops, 832 + }, 833 + }; 834 + 835 + static struct clk_regmap_div disp_cc_mdss_byte1_div_clk_src = { 836 + .reg = 0x81b4, 837 + .shift = 0, 838 + .width = 4, 839 + .clkr.hw.init = &(const struct clk_init_data) { 840 + .name = "disp_cc_mdss_byte1_div_clk_src", 841 + .parent_hws = (const struct clk_hw*[]) { 842 + &disp_cc_mdss_byte1_clk_src.clkr.hw, 843 + }, 844 + .num_parents = 1, 845 + .flags = CLK_SET_RATE_PARENT, 846 + .ops = &clk_regmap_div_ops, 847 + }, 848 + }; 849 + 850 + static struct clk_regmap_div disp_cc_mdss_dptx0_link_div_clk_src = { 851 + .reg = 0x8200, 852 + .shift = 0, 853 + .width = 4, 854 + .clkr.hw.init = &(const struct clk_init_data) { 855 + .name = "disp_cc_mdss_dptx0_link_div_clk_src", 856 + .parent_hws = (const struct clk_hw*[]) { 857 + &disp_cc_mdss_dptx0_link_clk_src.clkr.hw, 858 + }, 859 + .num_parents = 1, 860 + .flags = CLK_SET_RATE_PARENT, 861 + .ops = &clk_regmap_div_ro_ops, 862 + }, 863 + }; 864 + 865 + static struct clk_regmap_div disp_cc_mdss_dptx1_link_div_clk_src = { 866 + .reg = 0x8294, 867 + .shift = 0, 868 + .width = 4, 869 + .clkr.hw.init = &(const struct clk_init_data) { 870 + .name = "disp_cc_mdss_dptx1_link_div_clk_src", 871 + .parent_hws = (const struct clk_hw*[]) { 872 + &disp_cc_mdss_dptx1_link_clk_src.clkr.hw, 873 + }, 874 + .num_parents = 1, 875 + .flags = CLK_SET_RATE_PARENT, 876 + .ops = &clk_regmap_div_ro_ops, 877 + }, 878 + }; 879 + 880 + static struct clk_regmap_div disp_cc_mdss_dptx2_link_div_clk_src = { 881 + .reg = 0x82c8, 882 + .shift = 0, 883 + .width = 4, 884 + .clkr.hw.init = &(const struct clk_init_data) { 885 + .name = "disp_cc_mdss_dptx2_link_div_clk_src", 886 + .parent_hws = (const struct clk_hw*[]) { 887 + &disp_cc_mdss_dptx2_link_clk_src.clkr.hw, 888 + }, 889 + .num_parents = 1, 890 + .flags = CLK_SET_RATE_PARENT, 891 + .ops = &clk_regmap_div_ro_ops, 892 + }, 893 + }; 894 + 895 + static struct clk_regmap_div disp_cc_mdss_dptx3_link_div_clk_src = { 896 + .reg = 0x8344, 897 + .shift = 0, 898 + .width = 4, 899 + .clkr.hw.init = &(const struct clk_init_data) { 900 + .name = "disp_cc_mdss_dptx3_link_div_clk_src", 901 + .parent_hws = (const struct clk_hw*[]) { 902 + &disp_cc_mdss_dptx3_link_clk_src.clkr.hw, 903 + }, 904 + .num_parents = 1, 905 + .flags = CLK_SET_RATE_PARENT, 906 + .ops = &clk_regmap_div_ro_ops, 907 + }, 908 + }; 909 + 910 + static struct clk_branch disp_cc_esync0_clk = { 911 + .halt_reg = 0x80b8, 912 + .halt_check = BRANCH_HALT, 913 + .clkr = { 914 + .enable_reg = 0x80b8, 915 + .enable_mask = BIT(0), 916 + .hw.init = &(const struct clk_init_data) { 917 + .name = "disp_cc_esync0_clk", 918 + .parent_hws = (const struct clk_hw*[]) { 919 + &disp_cc_esync0_clk_src.clkr.hw, 920 + }, 921 + .num_parents = 1, 922 + .flags = CLK_SET_RATE_PARENT, 923 + .ops = &clk_branch2_ops, 924 + }, 925 + }, 926 + }; 927 + 928 + static struct clk_branch disp_cc_esync1_clk = { 929 + .halt_reg = 0x80bc, 930 + .halt_check = BRANCH_HALT, 931 + .clkr = { 932 + .enable_reg = 0x80bc, 933 + .enable_mask = BIT(0), 934 + .hw.init = &(const struct clk_init_data) { 935 + .name = "disp_cc_esync1_clk", 936 + .parent_hws = (const struct clk_hw*[]) { 937 + &disp_cc_esync1_clk_src.clkr.hw, 938 + }, 939 + .num_parents = 1, 940 + .flags = CLK_SET_RATE_PARENT, 941 + .ops = &clk_branch2_ops, 942 + }, 943 + }, 944 + }; 945 + 946 + static struct clk_branch disp_cc_mdss_accu_shift_clk = { 947 + .halt_reg = 0xe060, 948 + .halt_check = BRANCH_HALT_VOTED, 949 + .clkr = { 950 + .enable_reg = 0xe060, 951 + .enable_mask = BIT(0), 952 + .hw.init = &(const struct clk_init_data) { 953 + .name = "disp_cc_mdss_accu_shift_clk", 954 + .parent_hws = (const struct clk_hw*[]) { 955 + &disp_cc_xo_clk_src.clkr.hw, 956 + }, 957 + .num_parents = 1, 958 + .flags = CLK_SET_RATE_PARENT, 959 + .ops = &clk_branch2_ops, 960 + }, 961 + }, 962 + }; 963 + 964 + static struct clk_branch disp_cc_mdss_ahb1_clk = { 965 + .halt_reg = 0xa028, 966 + .halt_check = BRANCH_HALT, 967 + .clkr = { 968 + .enable_reg = 0xa028, 969 + .enable_mask = BIT(0), 970 + .hw.init = &(const struct clk_init_data) { 971 + .name = "disp_cc_mdss_ahb1_clk", 972 + .parent_hws = (const struct clk_hw*[]) { 973 + &disp_cc_mdss_ahb_clk_src.clkr.hw, 974 + }, 975 + .num_parents = 1, 976 + .flags = CLK_SET_RATE_PARENT, 977 + .ops = &clk_branch2_ops, 978 + }, 979 + }, 980 + }; 981 + 982 + static struct clk_branch disp_cc_mdss_ahb_clk = { 983 + .halt_reg = 0x80b0, 984 + .halt_check = BRANCH_HALT, 985 + .clkr = { 986 + .enable_reg = 0x80b0, 987 + .enable_mask = BIT(0), 988 + .hw.init = &(const struct clk_init_data) { 989 + .name = "disp_cc_mdss_ahb_clk", 990 + .parent_hws = (const struct clk_hw*[]) { 991 + &disp_cc_mdss_ahb_clk_src.clkr.hw, 992 + }, 993 + .num_parents = 1, 994 + .flags = CLK_SET_RATE_PARENT, 995 + .ops = &clk_branch2_ops, 996 + }, 997 + }, 998 + }; 999 + 1000 + static struct clk_branch disp_cc_mdss_byte0_clk = { 1001 + .halt_reg = 0x8034, 1002 + .halt_check = BRANCH_HALT, 1003 + .clkr = { 1004 + .enable_reg = 0x8034, 1005 + .enable_mask = BIT(0), 1006 + .hw.init = &(const struct clk_init_data) { 1007 + .name = "disp_cc_mdss_byte0_clk", 1008 + .parent_hws = (const struct clk_hw*[]) { 1009 + &disp_cc_mdss_byte0_clk_src.clkr.hw, 1010 + }, 1011 + .num_parents = 1, 1012 + .flags = CLK_SET_RATE_PARENT, 1013 + .ops = &clk_branch2_ops, 1014 + }, 1015 + }, 1016 + }; 1017 + 1018 + static struct clk_branch disp_cc_mdss_byte0_intf_clk = { 1019 + .halt_reg = 0x8038, 1020 + .halt_check = BRANCH_HALT, 1021 + .clkr = { 1022 + .enable_reg = 0x8038, 1023 + .enable_mask = BIT(0), 1024 + .hw.init = &(const struct clk_init_data) { 1025 + .name = "disp_cc_mdss_byte0_intf_clk", 1026 + .parent_hws = (const struct clk_hw*[]) { 1027 + &disp_cc_mdss_byte0_div_clk_src.clkr.hw, 1028 + }, 1029 + .num_parents = 1, 1030 + .flags = CLK_SET_RATE_PARENT, 1031 + .ops = &clk_branch2_ops, 1032 + }, 1033 + }, 1034 + }; 1035 + 1036 + static struct clk_branch disp_cc_mdss_byte1_clk = { 1037 + .halt_reg = 0x803c, 1038 + .halt_check = BRANCH_HALT, 1039 + .clkr = { 1040 + .enable_reg = 0x803c, 1041 + .enable_mask = BIT(0), 1042 + .hw.init = &(const struct clk_init_data) { 1043 + .name = "disp_cc_mdss_byte1_clk", 1044 + .parent_hws = (const struct clk_hw*[]) { 1045 + &disp_cc_mdss_byte1_clk_src.clkr.hw, 1046 + }, 1047 + .num_parents = 1, 1048 + .flags = CLK_SET_RATE_PARENT, 1049 + .ops = &clk_branch2_ops, 1050 + }, 1051 + }, 1052 + }; 1053 + 1054 + static struct clk_branch disp_cc_mdss_byte1_intf_clk = { 1055 + .halt_reg = 0x8040, 1056 + .halt_check = BRANCH_HALT, 1057 + .clkr = { 1058 + .enable_reg = 0x8040, 1059 + .enable_mask = BIT(0), 1060 + .hw.init = &(const struct clk_init_data) { 1061 + .name = "disp_cc_mdss_byte1_intf_clk", 1062 + .parent_hws = (const struct clk_hw*[]) { 1063 + &disp_cc_mdss_byte1_div_clk_src.clkr.hw, 1064 + }, 1065 + .num_parents = 1, 1066 + .flags = CLK_SET_RATE_PARENT, 1067 + .ops = &clk_branch2_ops, 1068 + }, 1069 + }, 1070 + }; 1071 + 1072 + static struct clk_branch disp_cc_mdss_dptx0_aux_clk = { 1073 + .halt_reg = 0x8064, 1074 + .halt_check = BRANCH_HALT, 1075 + .clkr = { 1076 + .enable_reg = 0x8064, 1077 + .enable_mask = BIT(0), 1078 + .hw.init = &(const struct clk_init_data) { 1079 + .name = "disp_cc_mdss_dptx0_aux_clk", 1080 + .parent_hws = (const struct clk_hw*[]) { 1081 + &disp_cc_mdss_dptx0_aux_clk_src.clkr.hw, 1082 + }, 1083 + .num_parents = 1, 1084 + .flags = CLK_SET_RATE_PARENT, 1085 + .ops = &clk_branch2_ops, 1086 + }, 1087 + }, 1088 + }; 1089 + 1090 + static struct clk_branch disp_cc_mdss_dptx0_crypto_clk = { 1091 + .halt_reg = 0x8058, 1092 + .halt_check = BRANCH_HALT, 1093 + .clkr = { 1094 + .enable_reg = 0x8058, 1095 + .enable_mask = BIT(0), 1096 + .hw.init = &(const struct clk_init_data) { 1097 + .name = "disp_cc_mdss_dptx0_crypto_clk", 1098 + .parent_hws = (const struct clk_hw*[]) { 1099 + &disp_cc_mdss_dptx0_link_clk_src.clkr.hw, 1100 + }, 1101 + .num_parents = 1, 1102 + .flags = CLK_SET_RATE_PARENT, 1103 + .ops = &clk_branch2_ops, 1104 + }, 1105 + }, 1106 + }; 1107 + 1108 + static struct clk_branch disp_cc_mdss_dptx0_link_clk = { 1109 + .halt_reg = 0x804c, 1110 + .halt_check = BRANCH_HALT, 1111 + .clkr = { 1112 + .enable_reg = 0x804c, 1113 + .enable_mask = BIT(0), 1114 + .hw.init = &(const struct clk_init_data) { 1115 + .name = "disp_cc_mdss_dptx0_link_clk", 1116 + .parent_hws = (const struct clk_hw*[]) { 1117 + &disp_cc_mdss_dptx0_link_clk_src.clkr.hw, 1118 + }, 1119 + .num_parents = 1, 1120 + .flags = CLK_SET_RATE_PARENT, 1121 + .ops = &clk_branch2_ops, 1122 + }, 1123 + }, 1124 + }; 1125 + 1126 + static struct clk_branch disp_cc_mdss_dptx0_link_intf_clk = { 1127 + .halt_reg = 0x8054, 1128 + .halt_check = BRANCH_HALT, 1129 + .clkr = { 1130 + .enable_reg = 0x8054, 1131 + .enable_mask = BIT(0), 1132 + .hw.init = &(const struct clk_init_data) { 1133 + .name = "disp_cc_mdss_dptx0_link_intf_clk", 1134 + .parent_hws = (const struct clk_hw*[]) { 1135 + &disp_cc_mdss_dptx0_link_div_clk_src.clkr.hw, 1136 + }, 1137 + .num_parents = 1, 1138 + .flags = CLK_SET_RATE_PARENT, 1139 + .ops = &clk_branch2_ops, 1140 + }, 1141 + }, 1142 + }; 1143 + 1144 + static struct clk_branch disp_cc_mdss_dptx0_pixel0_clk = { 1145 + .halt_reg = 0x805c, 1146 + .halt_check = BRANCH_HALT, 1147 + .clkr = { 1148 + .enable_reg = 0x805c, 1149 + .enable_mask = BIT(0), 1150 + .hw.init = &(const struct clk_init_data) { 1151 + .name = "disp_cc_mdss_dptx0_pixel0_clk", 1152 + .parent_hws = (const struct clk_hw*[]) { 1153 + &disp_cc_mdss_dptx0_pixel0_clk_src.clkr.hw, 1154 + }, 1155 + .num_parents = 1, 1156 + .flags = CLK_SET_RATE_PARENT, 1157 + .ops = &clk_branch2_ops, 1158 + }, 1159 + }, 1160 + }; 1161 + 1162 + static struct clk_branch disp_cc_mdss_dptx0_pixel1_clk = { 1163 + .halt_reg = 0x8060, 1164 + .halt_check = BRANCH_HALT, 1165 + .clkr = { 1166 + .enable_reg = 0x8060, 1167 + .enable_mask = BIT(0), 1168 + .hw.init = &(const struct clk_init_data) { 1169 + .name = "disp_cc_mdss_dptx0_pixel1_clk", 1170 + .parent_hws = (const struct clk_hw*[]) { 1171 + &disp_cc_mdss_dptx0_pixel1_clk_src.clkr.hw, 1172 + }, 1173 + .num_parents = 1, 1174 + .flags = CLK_SET_RATE_PARENT, 1175 + .ops = &clk_branch2_ops, 1176 + }, 1177 + }, 1178 + }; 1179 + 1180 + static struct clk_branch disp_cc_mdss_dptx0_usb_router_link_intf_clk = { 1181 + .halt_reg = 0x8050, 1182 + .halt_check = BRANCH_HALT, 1183 + .clkr = { 1184 + .enable_reg = 0x8050, 1185 + .enable_mask = BIT(0), 1186 + .hw.init = &(const struct clk_init_data) { 1187 + .name = "disp_cc_mdss_dptx0_usb_router_link_intf_clk", 1188 + .parent_hws = (const struct clk_hw*[]) { 1189 + &disp_cc_mdss_dptx0_link_div_clk_src.clkr.hw, 1190 + }, 1191 + .num_parents = 1, 1192 + .flags = CLK_SET_RATE_PARENT, 1193 + .ops = &clk_branch2_ops, 1194 + }, 1195 + }, 1196 + }; 1197 + 1198 + static struct clk_branch disp_cc_mdss_dptx1_aux_clk = { 1199 + .halt_reg = 0x8080, 1200 + .halt_check = BRANCH_HALT, 1201 + .clkr = { 1202 + .enable_reg = 0x8080, 1203 + .enable_mask = BIT(0), 1204 + .hw.init = &(const struct clk_init_data) { 1205 + .name = "disp_cc_mdss_dptx1_aux_clk", 1206 + .parent_hws = (const struct clk_hw*[]) { 1207 + &disp_cc_mdss_dptx1_aux_clk_src.clkr.hw, 1208 + }, 1209 + .num_parents = 1, 1210 + .flags = CLK_SET_RATE_PARENT, 1211 + .ops = &clk_branch2_ops, 1212 + }, 1213 + }, 1214 + }; 1215 + 1216 + static struct clk_branch disp_cc_mdss_dptx1_crypto_clk = { 1217 + .halt_reg = 0x807c, 1218 + .halt_check = BRANCH_HALT, 1219 + .clkr = { 1220 + .enable_reg = 0x807c, 1221 + .enable_mask = BIT(0), 1222 + .hw.init = &(const struct clk_init_data) { 1223 + .name = "disp_cc_mdss_dptx1_crypto_clk", 1224 + .parent_hws = (const struct clk_hw*[]) { 1225 + &disp_cc_mdss_dptx1_link_clk_src.clkr.hw, 1226 + }, 1227 + .num_parents = 1, 1228 + .flags = CLK_SET_RATE_PARENT, 1229 + .ops = &clk_branch2_ops, 1230 + }, 1231 + }, 1232 + }; 1233 + 1234 + static struct clk_branch disp_cc_mdss_dptx1_link_clk = { 1235 + .halt_reg = 0x8070, 1236 + .halt_check = BRANCH_HALT, 1237 + .clkr = { 1238 + .enable_reg = 0x8070, 1239 + .enable_mask = BIT(0), 1240 + .hw.init = &(const struct clk_init_data) { 1241 + .name = "disp_cc_mdss_dptx1_link_clk", 1242 + .parent_hws = (const struct clk_hw*[]) { 1243 + &disp_cc_mdss_dptx1_link_clk_src.clkr.hw, 1244 + }, 1245 + .num_parents = 1, 1246 + .flags = CLK_SET_RATE_PARENT, 1247 + .ops = &clk_branch2_ops, 1248 + }, 1249 + }, 1250 + }; 1251 + 1252 + static struct clk_branch disp_cc_mdss_dptx1_link_intf_clk = { 1253 + .halt_reg = 0x8078, 1254 + .halt_check = BRANCH_HALT, 1255 + .clkr = { 1256 + .enable_reg = 0x8078, 1257 + .enable_mask = BIT(0), 1258 + .hw.init = &(const struct clk_init_data) { 1259 + .name = "disp_cc_mdss_dptx1_link_intf_clk", 1260 + .parent_hws = (const struct clk_hw*[]) { 1261 + &disp_cc_mdss_dptx1_link_div_clk_src.clkr.hw, 1262 + }, 1263 + .num_parents = 1, 1264 + .flags = CLK_SET_RATE_PARENT, 1265 + .ops = &clk_branch2_ops, 1266 + }, 1267 + }, 1268 + }; 1269 + 1270 + static struct clk_branch disp_cc_mdss_dptx1_pixel0_clk = { 1271 + .halt_reg = 0x8068, 1272 + .halt_check = BRANCH_HALT, 1273 + .clkr = { 1274 + .enable_reg = 0x8068, 1275 + .enable_mask = BIT(0), 1276 + .hw.init = &(const struct clk_init_data) { 1277 + .name = "disp_cc_mdss_dptx1_pixel0_clk", 1278 + .parent_hws = (const struct clk_hw*[]) { 1279 + &disp_cc_mdss_dptx1_pixel0_clk_src.clkr.hw, 1280 + }, 1281 + .num_parents = 1, 1282 + .flags = CLK_SET_RATE_PARENT, 1283 + .ops = &clk_branch2_ops, 1284 + }, 1285 + }, 1286 + }; 1287 + 1288 + static struct clk_branch disp_cc_mdss_dptx1_pixel1_clk = { 1289 + .halt_reg = 0x806c, 1290 + .halt_check = BRANCH_HALT, 1291 + .clkr = { 1292 + .enable_reg = 0x806c, 1293 + .enable_mask = BIT(0), 1294 + .hw.init = &(const struct clk_init_data) { 1295 + .name = "disp_cc_mdss_dptx1_pixel1_clk", 1296 + .parent_hws = (const struct clk_hw*[]) { 1297 + &disp_cc_mdss_dptx1_pixel1_clk_src.clkr.hw, 1298 + }, 1299 + .num_parents = 1, 1300 + .flags = CLK_SET_RATE_PARENT, 1301 + .ops = &clk_branch2_ops, 1302 + }, 1303 + }, 1304 + }; 1305 + 1306 + static struct clk_branch disp_cc_mdss_dptx1_usb_router_link_intf_clk = { 1307 + .halt_reg = 0x8074, 1308 + .halt_check = BRANCH_HALT, 1309 + .clkr = { 1310 + .enable_reg = 0x8074, 1311 + .enable_mask = BIT(0), 1312 + .hw.init = &(const struct clk_init_data) { 1313 + .name = "disp_cc_mdss_dptx1_usb_router_link_intf_clk", 1314 + .parent_hws = (const struct clk_hw*[]) { 1315 + &disp_cc_mdss_dptx1_link_div_clk_src.clkr.hw, 1316 + }, 1317 + .num_parents = 1, 1318 + .flags = CLK_SET_RATE_PARENT, 1319 + .ops = &clk_branch2_ops, 1320 + }, 1321 + }, 1322 + }; 1323 + 1324 + static struct clk_branch disp_cc_mdss_dptx2_aux_clk = { 1325 + .halt_reg = 0x8098, 1326 + .halt_check = BRANCH_HALT, 1327 + .clkr = { 1328 + .enable_reg = 0x8098, 1329 + .enable_mask = BIT(0), 1330 + .hw.init = &(const struct clk_init_data) { 1331 + .name = "disp_cc_mdss_dptx2_aux_clk", 1332 + .parent_hws = (const struct clk_hw*[]) { 1333 + &disp_cc_mdss_dptx2_aux_clk_src.clkr.hw, 1334 + }, 1335 + .num_parents = 1, 1336 + .flags = CLK_SET_RATE_PARENT, 1337 + .ops = &clk_branch2_ops, 1338 + }, 1339 + }, 1340 + }; 1341 + 1342 + static struct clk_branch disp_cc_mdss_dptx2_crypto_clk = { 1343 + .halt_reg = 0x8094, 1344 + .halt_check = BRANCH_HALT, 1345 + .clkr = { 1346 + .enable_reg = 0x8094, 1347 + .enable_mask = BIT(0), 1348 + .hw.init = &(const struct clk_init_data) { 1349 + .name = "disp_cc_mdss_dptx2_crypto_clk", 1350 + .parent_hws = (const struct clk_hw*[]) { 1351 + &disp_cc_mdss_dptx2_link_clk_src.clkr.hw, 1352 + }, 1353 + .num_parents = 1, 1354 + .flags = CLK_SET_RATE_PARENT, 1355 + .ops = &clk_branch2_ops, 1356 + }, 1357 + }, 1358 + }; 1359 + 1360 + static struct clk_branch disp_cc_mdss_dptx2_link_clk = { 1361 + .halt_reg = 0x808c, 1362 + .halt_check = BRANCH_HALT, 1363 + .clkr = { 1364 + .enable_reg = 0x808c, 1365 + .enable_mask = BIT(0), 1366 + .hw.init = &(const struct clk_init_data) { 1367 + .name = "disp_cc_mdss_dptx2_link_clk", 1368 + .parent_hws = (const struct clk_hw*[]) { 1369 + &disp_cc_mdss_dptx2_link_clk_src.clkr.hw, 1370 + }, 1371 + .num_parents = 1, 1372 + .flags = CLK_SET_RATE_PARENT, 1373 + .ops = &clk_branch2_ops, 1374 + }, 1375 + }, 1376 + }; 1377 + 1378 + static struct clk_branch disp_cc_mdss_dptx2_link_intf_clk = { 1379 + .halt_reg = 0x8090, 1380 + .halt_check = BRANCH_HALT, 1381 + .clkr = { 1382 + .enable_reg = 0x8090, 1383 + .enable_mask = BIT(0), 1384 + .hw.init = &(const struct clk_init_data) { 1385 + .name = "disp_cc_mdss_dptx2_link_intf_clk", 1386 + .parent_hws = (const struct clk_hw*[]) { 1387 + &disp_cc_mdss_dptx2_link_div_clk_src.clkr.hw, 1388 + }, 1389 + .num_parents = 1, 1390 + .flags = CLK_SET_RATE_PARENT, 1391 + .ops = &clk_branch2_ops, 1392 + }, 1393 + }, 1394 + }; 1395 + 1396 + static struct clk_branch disp_cc_mdss_dptx2_pixel0_clk = { 1397 + .halt_reg = 0x8084, 1398 + .halt_check = BRANCH_HALT, 1399 + .clkr = { 1400 + .enable_reg = 0x8084, 1401 + .enable_mask = BIT(0), 1402 + .hw.init = &(const struct clk_init_data) { 1403 + .name = "disp_cc_mdss_dptx2_pixel0_clk", 1404 + .parent_hws = (const struct clk_hw*[]) { 1405 + &disp_cc_mdss_dptx2_pixel0_clk_src.clkr.hw, 1406 + }, 1407 + .num_parents = 1, 1408 + .flags = CLK_SET_RATE_PARENT, 1409 + .ops = &clk_branch2_ops, 1410 + }, 1411 + }, 1412 + }; 1413 + 1414 + static struct clk_branch disp_cc_mdss_dptx2_pixel1_clk = { 1415 + .halt_reg = 0x8088, 1416 + .halt_check = BRANCH_HALT, 1417 + .clkr = { 1418 + .enable_reg = 0x8088, 1419 + .enable_mask = BIT(0), 1420 + .hw.init = &(const struct clk_init_data) { 1421 + .name = "disp_cc_mdss_dptx2_pixel1_clk", 1422 + .parent_hws = (const struct clk_hw*[]) { 1423 + &disp_cc_mdss_dptx2_pixel1_clk_src.clkr.hw, 1424 + }, 1425 + .num_parents = 1, 1426 + .flags = CLK_SET_RATE_PARENT, 1427 + .ops = &clk_branch2_ops, 1428 + }, 1429 + }, 1430 + }; 1431 + 1432 + static struct clk_branch disp_cc_mdss_dptx3_aux_clk = { 1433 + .halt_reg = 0x80a8, 1434 + .halt_check = BRANCH_HALT, 1435 + .clkr = { 1436 + .enable_reg = 0x80a8, 1437 + .enable_mask = BIT(0), 1438 + .hw.init = &(const struct clk_init_data) { 1439 + .name = "disp_cc_mdss_dptx3_aux_clk", 1440 + .parent_hws = (const struct clk_hw*[]) { 1441 + &disp_cc_mdss_dptx3_aux_clk_src.clkr.hw, 1442 + }, 1443 + .num_parents = 1, 1444 + .flags = CLK_SET_RATE_PARENT, 1445 + .ops = &clk_branch2_ops, 1446 + }, 1447 + }, 1448 + }; 1449 + 1450 + static struct clk_branch disp_cc_mdss_dptx3_crypto_clk = { 1451 + .halt_reg = 0x80ac, 1452 + .halt_check = BRANCH_HALT, 1453 + .clkr = { 1454 + .enable_reg = 0x80ac, 1455 + .enable_mask = BIT(0), 1456 + .hw.init = &(const struct clk_init_data) { 1457 + .name = "disp_cc_mdss_dptx3_crypto_clk", 1458 + .parent_hws = (const struct clk_hw*[]) { 1459 + &disp_cc_mdss_dptx3_link_clk_src.clkr.hw, 1460 + }, 1461 + .num_parents = 1, 1462 + .flags = CLK_SET_RATE_PARENT, 1463 + .ops = &clk_branch2_ops, 1464 + }, 1465 + }, 1466 + }; 1467 + 1468 + static struct clk_branch disp_cc_mdss_dptx3_link_clk = { 1469 + .halt_reg = 0x80a0, 1470 + .halt_check = BRANCH_HALT, 1471 + .clkr = { 1472 + .enable_reg = 0x80a0, 1473 + .enable_mask = BIT(0), 1474 + .hw.init = &(const struct clk_init_data) { 1475 + .name = "disp_cc_mdss_dptx3_link_clk", 1476 + .parent_hws = (const struct clk_hw*[]) { 1477 + &disp_cc_mdss_dptx3_link_clk_src.clkr.hw, 1478 + }, 1479 + .num_parents = 1, 1480 + .flags = CLK_SET_RATE_PARENT, 1481 + .ops = &clk_branch2_ops, 1482 + }, 1483 + }, 1484 + }; 1485 + 1486 + static struct clk_branch disp_cc_mdss_dptx3_link_intf_clk = { 1487 + .halt_reg = 0x80a4, 1488 + .halt_check = BRANCH_HALT, 1489 + .clkr = { 1490 + .enable_reg = 0x80a4, 1491 + .enable_mask = BIT(0), 1492 + .hw.init = &(const struct clk_init_data) { 1493 + .name = "disp_cc_mdss_dptx3_link_intf_clk", 1494 + .parent_hws = (const struct clk_hw*[]) { 1495 + &disp_cc_mdss_dptx3_link_div_clk_src.clkr.hw, 1496 + }, 1497 + .num_parents = 1, 1498 + .flags = CLK_SET_RATE_PARENT, 1499 + .ops = &clk_branch2_ops, 1500 + }, 1501 + }, 1502 + }; 1503 + 1504 + static struct clk_branch disp_cc_mdss_dptx3_pixel0_clk = { 1505 + .halt_reg = 0x809c, 1506 + .halt_check = BRANCH_HALT, 1507 + .clkr = { 1508 + .enable_reg = 0x809c, 1509 + .enable_mask = BIT(0), 1510 + .hw.init = &(const struct clk_init_data) { 1511 + .name = "disp_cc_mdss_dptx3_pixel0_clk", 1512 + .parent_hws = (const struct clk_hw*[]) { 1513 + &disp_cc_mdss_dptx3_pixel0_clk_src.clkr.hw, 1514 + }, 1515 + .num_parents = 1, 1516 + .flags = CLK_SET_RATE_PARENT, 1517 + .ops = &clk_branch2_ops, 1518 + }, 1519 + }, 1520 + }; 1521 + 1522 + static struct clk_branch disp_cc_mdss_esc0_clk = { 1523 + .halt_reg = 0x8044, 1524 + .halt_check = BRANCH_HALT, 1525 + .clkr = { 1526 + .enable_reg = 0x8044, 1527 + .enable_mask = BIT(0), 1528 + .hw.init = &(const struct clk_init_data) { 1529 + .name = "disp_cc_mdss_esc0_clk", 1530 + .parent_hws = (const struct clk_hw*[]) { 1531 + &disp_cc_mdss_esc0_clk_src.clkr.hw, 1532 + }, 1533 + .num_parents = 1, 1534 + .flags = CLK_SET_RATE_PARENT, 1535 + .ops = &clk_branch2_ops, 1536 + }, 1537 + }, 1538 + }; 1539 + 1540 + static struct clk_branch disp_cc_mdss_esc1_clk = { 1541 + .halt_reg = 0x8048, 1542 + .halt_check = BRANCH_HALT, 1543 + .clkr = { 1544 + .enable_reg = 0x8048, 1545 + .enable_mask = BIT(0), 1546 + .hw.init = &(const struct clk_init_data) { 1547 + .name = "disp_cc_mdss_esc1_clk", 1548 + .parent_hws = (const struct clk_hw*[]) { 1549 + &disp_cc_mdss_esc1_clk_src.clkr.hw, 1550 + }, 1551 + .num_parents = 1, 1552 + .flags = CLK_SET_RATE_PARENT, 1553 + .ops = &clk_branch2_ops, 1554 + }, 1555 + }, 1556 + }; 1557 + 1558 + static struct clk_branch disp_cc_mdss_mdp1_clk = { 1559 + .halt_reg = 0xa004, 1560 + .halt_check = BRANCH_HALT, 1561 + .clkr = { 1562 + .enable_reg = 0xa004, 1563 + .enable_mask = BIT(0), 1564 + .hw.init = &(const struct clk_init_data) { 1565 + .name = "disp_cc_mdss_mdp1_clk", 1566 + .parent_hws = (const struct clk_hw*[]) { 1567 + &disp_cc_mdss_mdp_clk_src.clkr.hw, 1568 + }, 1569 + .num_parents = 1, 1570 + .flags = CLK_SET_RATE_PARENT, 1571 + .ops = &clk_branch2_ops, 1572 + }, 1573 + }, 1574 + }; 1575 + 1576 + static struct clk_branch disp_cc_mdss_mdp_clk = { 1577 + .halt_reg = 0x8010, 1578 + .halt_check = BRANCH_HALT, 1579 + .clkr = { 1580 + .enable_reg = 0x8010, 1581 + .enable_mask = BIT(0), 1582 + .hw.init = &(const struct clk_init_data) { 1583 + .name = "disp_cc_mdss_mdp_clk", 1584 + .parent_hws = (const struct clk_hw*[]) { 1585 + &disp_cc_mdss_mdp_clk_src.clkr.hw, 1586 + }, 1587 + .num_parents = 1, 1588 + .flags = CLK_SET_RATE_PARENT, 1589 + .ops = &clk_branch2_aon_ops, 1590 + }, 1591 + }, 1592 + }; 1593 + 1594 + static struct clk_branch disp_cc_mdss_mdp_lut1_clk = { 1595 + .halt_reg = 0xa014, 1596 + .halt_check = BRANCH_HALT, 1597 + .clkr = { 1598 + .enable_reg = 0xa014, 1599 + .enable_mask = BIT(0), 1600 + .hw.init = &(const struct clk_init_data) { 1601 + .name = "disp_cc_mdss_mdp_lut1_clk", 1602 + .parent_hws = (const struct clk_hw*[]) { 1603 + &disp_cc_mdss_mdp_clk_src.clkr.hw, 1604 + }, 1605 + .num_parents = 1, 1606 + .flags = CLK_SET_RATE_PARENT, 1607 + .ops = &clk_branch2_ops, 1608 + }, 1609 + }, 1610 + }; 1611 + 1612 + static struct clk_branch disp_cc_mdss_mdp_lut_clk = { 1613 + .halt_reg = 0x8020, 1614 + .halt_check = BRANCH_HALT_VOTED, 1615 + .clkr = { 1616 + .enable_reg = 0x8020, 1617 + .enable_mask = BIT(0), 1618 + .hw.init = &(const struct clk_init_data) { 1619 + .name = "disp_cc_mdss_mdp_lut_clk", 1620 + .parent_hws = (const struct clk_hw*[]) { 1621 + &disp_cc_mdss_mdp_clk_src.clkr.hw, 1622 + }, 1623 + .num_parents = 1, 1624 + .flags = CLK_SET_RATE_PARENT, 1625 + .ops = &clk_branch2_ops, 1626 + }, 1627 + }, 1628 + }; 1629 + 1630 + static struct clk_branch disp_cc_mdss_non_gdsc_ahb_clk = { 1631 + .halt_reg = 0xc004, 1632 + .halt_check = BRANCH_HALT_VOTED, 1633 + .clkr = { 1634 + .enable_reg = 0xc004, 1635 + .enable_mask = BIT(0), 1636 + .hw.init = &(const struct clk_init_data) { 1637 + .name = "disp_cc_mdss_non_gdsc_ahb_clk", 1638 + .parent_hws = (const struct clk_hw*[]) { 1639 + &disp_cc_mdss_ahb_clk_src.clkr.hw, 1640 + }, 1641 + .num_parents = 1, 1642 + .flags = CLK_SET_RATE_PARENT, 1643 + .ops = &clk_branch2_ops, 1644 + }, 1645 + }, 1646 + }; 1647 + 1648 + static struct clk_branch disp_cc_mdss_pclk0_clk = { 1649 + .halt_reg = 0x8004, 1650 + .halt_check = BRANCH_HALT, 1651 + .clkr = { 1652 + .enable_reg = 0x8004, 1653 + .enable_mask = BIT(0), 1654 + .hw.init = &(const struct clk_init_data) { 1655 + .name = "disp_cc_mdss_pclk0_clk", 1656 + .parent_hws = (const struct clk_hw*[]) { 1657 + &disp_cc_mdss_pclk0_clk_src.clkr.hw, 1658 + }, 1659 + .num_parents = 1, 1660 + .flags = CLK_SET_RATE_PARENT, 1661 + .ops = &clk_branch2_ops, 1662 + }, 1663 + }, 1664 + }; 1665 + 1666 + static struct clk_branch disp_cc_mdss_pclk1_clk = { 1667 + .halt_reg = 0x8008, 1668 + .halt_check = BRANCH_HALT, 1669 + .clkr = { 1670 + .enable_reg = 0x8008, 1671 + .enable_mask = BIT(0), 1672 + .hw.init = &(const struct clk_init_data) { 1673 + .name = "disp_cc_mdss_pclk1_clk", 1674 + .parent_hws = (const struct clk_hw*[]) { 1675 + &disp_cc_mdss_pclk1_clk_src.clkr.hw, 1676 + }, 1677 + .num_parents = 1, 1678 + .flags = CLK_SET_RATE_PARENT, 1679 + .ops = &clk_branch2_ops, 1680 + }, 1681 + }, 1682 + }; 1683 + 1684 + static struct clk_branch disp_cc_mdss_pclk2_clk = { 1685 + .halt_reg = 0x800c, 1686 + .halt_check = BRANCH_HALT, 1687 + .clkr = { 1688 + .enable_reg = 0x800c, 1689 + .enable_mask = BIT(0), 1690 + .hw.init = &(const struct clk_init_data) { 1691 + .name = "disp_cc_mdss_pclk2_clk", 1692 + .parent_hws = (const struct clk_hw*[]) { 1693 + &disp_cc_mdss_pclk2_clk_src.clkr.hw, 1694 + }, 1695 + .num_parents = 1, 1696 + .flags = CLK_SET_RATE_PARENT, 1697 + .ops = &clk_branch2_ops, 1698 + }, 1699 + }, 1700 + }; 1701 + 1702 + static struct clk_branch disp_cc_mdss_vsync1_clk = { 1703 + .halt_reg = 0xa024, 1704 + .halt_check = BRANCH_HALT, 1705 + .clkr = { 1706 + .enable_reg = 0xa024, 1707 + .enable_mask = BIT(0), 1708 + .hw.init = &(const struct clk_init_data) { 1709 + .name = "disp_cc_mdss_vsync1_clk", 1710 + .parent_hws = (const struct clk_hw*[]) { 1711 + &disp_cc_mdss_vsync_clk_src.clkr.hw, 1712 + }, 1713 + .num_parents = 1, 1714 + .flags = CLK_SET_RATE_PARENT, 1715 + .ops = &clk_branch2_ops, 1716 + }, 1717 + }, 1718 + }; 1719 + 1720 + static struct clk_branch disp_cc_mdss_vsync_clk = { 1721 + .halt_reg = 0x8030, 1722 + .halt_check = BRANCH_HALT, 1723 + .clkr = { 1724 + .enable_reg = 0x8030, 1725 + .enable_mask = BIT(0), 1726 + .hw.init = &(const struct clk_init_data) { 1727 + .name = "disp_cc_mdss_vsync_clk", 1728 + .parent_hws = (const struct clk_hw*[]) { 1729 + &disp_cc_mdss_vsync_clk_src.clkr.hw, 1730 + }, 1731 + .num_parents = 1, 1732 + .flags = CLK_SET_RATE_PARENT, 1733 + .ops = &clk_branch2_ops, 1734 + }, 1735 + }, 1736 + }; 1737 + 1738 + static struct clk_branch disp_cc_osc_clk = { 1739 + .halt_reg = 0x80b4, 1740 + .halt_check = BRANCH_HALT, 1741 + .clkr = { 1742 + .enable_reg = 0x80b4, 1743 + .enable_mask = BIT(0), 1744 + .hw.init = &(const struct clk_init_data) { 1745 + .name = "disp_cc_osc_clk", 1746 + .parent_hws = (const struct clk_hw*[]) { 1747 + &disp_cc_osc_clk_src.clkr.hw, 1748 + }, 1749 + .num_parents = 1, 1750 + .flags = CLK_SET_RATE_PARENT, 1751 + .ops = &clk_branch2_ops, 1752 + }, 1753 + }, 1754 + }; 1755 + 1756 + static struct gdsc mdss_gdsc = { 1757 + .gdscr = 0x9000, 1758 + .en_rest_wait_val = 0x2, 1759 + .en_few_wait_val = 0x2, 1760 + .clk_dis_wait_val = 0xf, 1761 + .pd = { 1762 + .name = "mdss_gdsc", 1763 + }, 1764 + .pwrsts = PWRSTS_OFF_ON, 1765 + .flags = POLL_CFG_GDSCR | HW_CTRL | RETAIN_FF_ENABLE, 1766 + }; 1767 + 1768 + static struct gdsc mdss_int2_gdsc = { 1769 + .gdscr = 0xb000, 1770 + .en_rest_wait_val = 0x2, 1771 + .en_few_wait_val = 0x2, 1772 + .clk_dis_wait_val = 0xf, 1773 + .pd = { 1774 + .name = "mdss_int2_gdsc", 1775 + }, 1776 + .pwrsts = PWRSTS_OFF_ON, 1777 + .flags = POLL_CFG_GDSCR | HW_CTRL | RETAIN_FF_ENABLE, 1778 + }; 1779 + 1780 + static struct clk_regmap *disp_cc_sm8750_clocks[] = { 1781 + [DISP_CC_ESYNC0_CLK] = &disp_cc_esync0_clk.clkr, 1782 + [DISP_CC_ESYNC0_CLK_SRC] = &disp_cc_esync0_clk_src.clkr, 1783 + [DISP_CC_ESYNC1_CLK] = &disp_cc_esync1_clk.clkr, 1784 + [DISP_CC_ESYNC1_CLK_SRC] = &disp_cc_esync1_clk_src.clkr, 1785 + [DISP_CC_MDSS_ACCU_SHIFT_CLK] = &disp_cc_mdss_accu_shift_clk.clkr, 1786 + [DISP_CC_MDSS_AHB1_CLK] = &disp_cc_mdss_ahb1_clk.clkr, 1787 + [DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr, 1788 + [DISP_CC_MDSS_AHB_CLK_SRC] = &disp_cc_mdss_ahb_clk_src.clkr, 1789 + [DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr, 1790 + [DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr, 1791 + [DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] = &disp_cc_mdss_byte0_div_clk_src.clkr, 1792 + [DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr, 1793 + [DISP_CC_MDSS_BYTE1_CLK] = &disp_cc_mdss_byte1_clk.clkr, 1794 + [DISP_CC_MDSS_BYTE1_CLK_SRC] = &disp_cc_mdss_byte1_clk_src.clkr, 1795 + [DISP_CC_MDSS_BYTE1_DIV_CLK_SRC] = &disp_cc_mdss_byte1_div_clk_src.clkr, 1796 + [DISP_CC_MDSS_BYTE1_INTF_CLK] = &disp_cc_mdss_byte1_intf_clk.clkr, 1797 + [DISP_CC_MDSS_DPTX0_AUX_CLK] = &disp_cc_mdss_dptx0_aux_clk.clkr, 1798 + [DISP_CC_MDSS_DPTX0_AUX_CLK_SRC] = &disp_cc_mdss_dptx0_aux_clk_src.clkr, 1799 + [DISP_CC_MDSS_DPTX0_CRYPTO_CLK] = &disp_cc_mdss_dptx0_crypto_clk.clkr, 1800 + [DISP_CC_MDSS_DPTX0_LINK_CLK] = &disp_cc_mdss_dptx0_link_clk.clkr, 1801 + [DISP_CC_MDSS_DPTX0_LINK_CLK_SRC] = &disp_cc_mdss_dptx0_link_clk_src.clkr, 1802 + [DISP_CC_MDSS_DPTX0_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dptx0_link_div_clk_src.clkr, 1803 + [DISP_CC_MDSS_DPTX0_LINK_INTF_CLK] = &disp_cc_mdss_dptx0_link_intf_clk.clkr, 1804 + [DISP_CC_MDSS_DPTX0_PIXEL0_CLK] = &disp_cc_mdss_dptx0_pixel0_clk.clkr, 1805 + [DISP_CC_MDSS_DPTX0_PIXEL0_CLK_SRC] = &disp_cc_mdss_dptx0_pixel0_clk_src.clkr, 1806 + [DISP_CC_MDSS_DPTX0_PIXEL1_CLK] = &disp_cc_mdss_dptx0_pixel1_clk.clkr, 1807 + [DISP_CC_MDSS_DPTX0_PIXEL1_CLK_SRC] = &disp_cc_mdss_dptx0_pixel1_clk_src.clkr, 1808 + [DISP_CC_MDSS_DPTX0_USB_ROUTER_LINK_INTF_CLK] = 1809 + &disp_cc_mdss_dptx0_usb_router_link_intf_clk.clkr, 1810 + [DISP_CC_MDSS_DPTX1_AUX_CLK] = &disp_cc_mdss_dptx1_aux_clk.clkr, 1811 + [DISP_CC_MDSS_DPTX1_AUX_CLK_SRC] = &disp_cc_mdss_dptx1_aux_clk_src.clkr, 1812 + [DISP_CC_MDSS_DPTX1_CRYPTO_CLK] = &disp_cc_mdss_dptx1_crypto_clk.clkr, 1813 + [DISP_CC_MDSS_DPTX1_LINK_CLK] = &disp_cc_mdss_dptx1_link_clk.clkr, 1814 + [DISP_CC_MDSS_DPTX1_LINK_CLK_SRC] = &disp_cc_mdss_dptx1_link_clk_src.clkr, 1815 + [DISP_CC_MDSS_DPTX1_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dptx1_link_div_clk_src.clkr, 1816 + [DISP_CC_MDSS_DPTX1_LINK_INTF_CLK] = &disp_cc_mdss_dptx1_link_intf_clk.clkr, 1817 + [DISP_CC_MDSS_DPTX1_PIXEL0_CLK] = &disp_cc_mdss_dptx1_pixel0_clk.clkr, 1818 + [DISP_CC_MDSS_DPTX1_PIXEL0_CLK_SRC] = &disp_cc_mdss_dptx1_pixel0_clk_src.clkr, 1819 + [DISP_CC_MDSS_DPTX1_PIXEL1_CLK] = &disp_cc_mdss_dptx1_pixel1_clk.clkr, 1820 + [DISP_CC_MDSS_DPTX1_PIXEL1_CLK_SRC] = &disp_cc_mdss_dptx1_pixel1_clk_src.clkr, 1821 + [DISP_CC_MDSS_DPTX1_USB_ROUTER_LINK_INTF_CLK] = 1822 + &disp_cc_mdss_dptx1_usb_router_link_intf_clk.clkr, 1823 + [DISP_CC_MDSS_DPTX2_AUX_CLK] = &disp_cc_mdss_dptx2_aux_clk.clkr, 1824 + [DISP_CC_MDSS_DPTX2_AUX_CLK_SRC] = &disp_cc_mdss_dptx2_aux_clk_src.clkr, 1825 + [DISP_CC_MDSS_DPTX2_CRYPTO_CLK] = &disp_cc_mdss_dptx2_crypto_clk.clkr, 1826 + [DISP_CC_MDSS_DPTX2_LINK_CLK] = &disp_cc_mdss_dptx2_link_clk.clkr, 1827 + [DISP_CC_MDSS_DPTX2_LINK_CLK_SRC] = &disp_cc_mdss_dptx2_link_clk_src.clkr, 1828 + [DISP_CC_MDSS_DPTX2_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dptx2_link_div_clk_src.clkr, 1829 + [DISP_CC_MDSS_DPTX2_LINK_INTF_CLK] = &disp_cc_mdss_dptx2_link_intf_clk.clkr, 1830 + [DISP_CC_MDSS_DPTX2_PIXEL0_CLK] = &disp_cc_mdss_dptx2_pixel0_clk.clkr, 1831 + [DISP_CC_MDSS_DPTX2_PIXEL0_CLK_SRC] = &disp_cc_mdss_dptx2_pixel0_clk_src.clkr, 1832 + [DISP_CC_MDSS_DPTX2_PIXEL1_CLK] = &disp_cc_mdss_dptx2_pixel1_clk.clkr, 1833 + [DISP_CC_MDSS_DPTX2_PIXEL1_CLK_SRC] = &disp_cc_mdss_dptx2_pixel1_clk_src.clkr, 1834 + [DISP_CC_MDSS_DPTX3_AUX_CLK] = &disp_cc_mdss_dptx3_aux_clk.clkr, 1835 + [DISP_CC_MDSS_DPTX3_AUX_CLK_SRC] = &disp_cc_mdss_dptx3_aux_clk_src.clkr, 1836 + [DISP_CC_MDSS_DPTX3_CRYPTO_CLK] = &disp_cc_mdss_dptx3_crypto_clk.clkr, 1837 + [DISP_CC_MDSS_DPTX3_LINK_CLK] = &disp_cc_mdss_dptx3_link_clk.clkr, 1838 + [DISP_CC_MDSS_DPTX3_LINK_CLK_SRC] = &disp_cc_mdss_dptx3_link_clk_src.clkr, 1839 + [DISP_CC_MDSS_DPTX3_LINK_DIV_CLK_SRC] = &disp_cc_mdss_dptx3_link_div_clk_src.clkr, 1840 + [DISP_CC_MDSS_DPTX3_LINK_INTF_CLK] = &disp_cc_mdss_dptx3_link_intf_clk.clkr, 1841 + [DISP_CC_MDSS_DPTX3_PIXEL0_CLK] = &disp_cc_mdss_dptx3_pixel0_clk.clkr, 1842 + [DISP_CC_MDSS_DPTX3_PIXEL0_CLK_SRC] = &disp_cc_mdss_dptx3_pixel0_clk_src.clkr, 1843 + [DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr, 1844 + [DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr, 1845 + [DISP_CC_MDSS_ESC1_CLK] = &disp_cc_mdss_esc1_clk.clkr, 1846 + [DISP_CC_MDSS_ESC1_CLK_SRC] = &disp_cc_mdss_esc1_clk_src.clkr, 1847 + [DISP_CC_MDSS_MDP1_CLK] = &disp_cc_mdss_mdp1_clk.clkr, 1848 + [DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr, 1849 + [DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr, 1850 + [DISP_CC_MDSS_MDP_LUT1_CLK] = &disp_cc_mdss_mdp_lut1_clk.clkr, 1851 + [DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr, 1852 + [DISP_CC_MDSS_NON_GDSC_AHB_CLK] = &disp_cc_mdss_non_gdsc_ahb_clk.clkr, 1853 + [DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr, 1854 + [DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr, 1855 + [DISP_CC_MDSS_PCLK1_CLK] = &disp_cc_mdss_pclk1_clk.clkr, 1856 + [DISP_CC_MDSS_PCLK1_CLK_SRC] = &disp_cc_mdss_pclk1_clk_src.clkr, 1857 + [DISP_CC_MDSS_PCLK2_CLK] = &disp_cc_mdss_pclk2_clk.clkr, 1858 + [DISP_CC_MDSS_PCLK2_CLK_SRC] = &disp_cc_mdss_pclk2_clk_src.clkr, 1859 + [DISP_CC_MDSS_VSYNC1_CLK] = &disp_cc_mdss_vsync1_clk.clkr, 1860 + [DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr, 1861 + [DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr, 1862 + [DISP_CC_OSC_CLK] = &disp_cc_osc_clk.clkr, 1863 + [DISP_CC_OSC_CLK_SRC] = &disp_cc_osc_clk_src.clkr, 1864 + [DISP_CC_PLL0] = &disp_cc_pll0.clkr, 1865 + [DISP_CC_PLL1] = &disp_cc_pll1.clkr, 1866 + [DISP_CC_PLL2] = &disp_cc_pll2.clkr, 1867 + [DISP_CC_SLEEP_CLK_SRC] = &disp_cc_sleep_clk_src.clkr, 1868 + [DISP_CC_XO_CLK_SRC] = &disp_cc_xo_clk_src.clkr, 1869 + }; 1870 + 1871 + static const struct qcom_reset_map disp_cc_sm8750_resets[] = { 1872 + [DISP_CC_MDSS_CORE_BCR] = { 0x8000 }, 1873 + [DISP_CC_MDSS_CORE_INT2_BCR] = { 0xa000 }, 1874 + [DISP_CC_MDSS_RSCC_BCR] = { 0xc000 }, 1875 + }; 1876 + 1877 + static struct gdsc *disp_cc_sm8750_gdscs[] = { 1878 + [MDSS_GDSC] = &mdss_gdsc, 1879 + [MDSS_INT2_GDSC] = &mdss_int2_gdsc, 1880 + }; 1881 + 1882 + static const struct regmap_config disp_cc_sm8750_regmap_config = { 1883 + .reg_bits = 32, 1884 + .reg_stride = 4, 1885 + .val_bits = 32, 1886 + .max_register = 0x11014, 1887 + .fast_io = true, 1888 + }; 1889 + 1890 + static struct qcom_cc_desc disp_cc_sm8750_desc = { 1891 + .config = &disp_cc_sm8750_regmap_config, 1892 + .clks = disp_cc_sm8750_clocks, 1893 + .num_clks = ARRAY_SIZE(disp_cc_sm8750_clocks), 1894 + .resets = disp_cc_sm8750_resets, 1895 + .num_resets = ARRAY_SIZE(disp_cc_sm8750_resets), 1896 + .gdscs = disp_cc_sm8750_gdscs, 1897 + .num_gdscs = ARRAY_SIZE(disp_cc_sm8750_gdscs), 1898 + }; 1899 + 1900 + static const struct of_device_id disp_cc_sm8750_match_table[] = { 1901 + { .compatible = "qcom,sm8750-dispcc" }, 1902 + { } 1903 + }; 1904 + MODULE_DEVICE_TABLE(of, disp_cc_sm8750_match_table); 1905 + 1906 + static int disp_cc_sm8750_probe(struct platform_device *pdev) 1907 + { 1908 + struct regmap *regmap; 1909 + int ret; 1910 + 1911 + ret = devm_pm_runtime_enable(&pdev->dev); 1912 + if (ret) 1913 + return ret; 1914 + 1915 + ret = pm_runtime_resume_and_get(&pdev->dev); 1916 + if (ret) 1917 + return ret; 1918 + 1919 + regmap = qcom_cc_map(pdev, &disp_cc_sm8750_desc); 1920 + if (IS_ERR(regmap)) { 1921 + ret = PTR_ERR(regmap); 1922 + goto err_put_rpm; 1923 + } 1924 + 1925 + clk_taycan_elu_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config); 1926 + clk_taycan_elu_pll_configure(&disp_cc_pll1, regmap, &disp_cc_pll1_config); 1927 + clk_pongo_elu_pll_configure(&disp_cc_pll2, regmap, &disp_cc_pll2_config); 1928 + 1929 + /* Enable clock gating for MDP clocks */ 1930 + regmap_update_bits(regmap, DISP_CC_MISC_CMD, 0x10, 0x10); 1931 + 1932 + /* Keep some clocks always-on */ 1933 + qcom_branch_set_clk_en(regmap, 0xe07c); /* DISP_CC_SLEEP_CLK */ 1934 + qcom_branch_set_clk_en(regmap, 0xe05c); /* DISP_CC_XO_CLK */ 1935 + qcom_branch_set_clk_en(regmap, 0xc00c); /* DISP_CC_MDSS_RSCC_AHB_CLK */ 1936 + qcom_branch_set_clk_en(regmap, 0xc008); /* DISP_CC_MDSS_RSCC_VSYNC_CLK */ 1937 + 1938 + ret = qcom_cc_really_probe(&pdev->dev, &disp_cc_sm8750_desc, regmap); 1939 + if (ret) 1940 + goto err_put_rpm; 1941 + 1942 + pm_runtime_put(&pdev->dev); 1943 + 1944 + return 0; 1945 + 1946 + err_put_rpm: 1947 + pm_runtime_put_sync(&pdev->dev); 1948 + 1949 + return ret; 1950 + } 1951 + 1952 + static struct platform_driver disp_cc_sm8750_driver = { 1953 + .probe = disp_cc_sm8750_probe, 1954 + .driver = { 1955 + .name = "disp_cc-sm8750", 1956 + .of_match_table = disp_cc_sm8750_match_table, 1957 + }, 1958 + }; 1959 + 1960 + module_platform_driver(disp_cc_sm8750_driver); 1961 + 1962 + MODULE_DESCRIPTION("QTI DISPCC SM8750 Driver"); 1963 + MODULE_LICENSE("GPL");
+38 -19
drivers/clk/qcom/gcc-ipq5424.c
··· 5 5 */ 6 6 7 7 #include <linux/clk-provider.h> 8 + #include <linux/interconnect-provider.h> 8 9 #include <linux/kernel.h> 9 10 #include <linux/module.h> 10 11 #include <linux/of.h> ··· 13 12 #include <linux/regmap.h> 14 13 15 14 #include <dt-bindings/clock/qcom,ipq5424-gcc.h> 15 + #include <dt-bindings/interconnect/qcom,ipq5424.h> 16 16 #include <dt-bindings/reset/qcom,ipq5424-gcc.h> 17 17 18 18 #include "clk-alpha-pll.h" ··· 324 322 .parent_data = &gcc_parent_data_xo, 325 323 .num_parents = 1, 326 324 .ops = &clk_rcg2_ops, 325 + }, 326 + }; 327 + 328 + static struct clk_branch gcc_xo_clk = { 329 + .halt_reg = 0x34018, 330 + .halt_check = BRANCH_HALT, 331 + .clkr = { 332 + .enable_reg = 0x34018, 333 + .enable_mask = BIT(0), 334 + .hw.init = &(const struct clk_init_data) { 335 + .name = "gcc_xo_clk", 336 + .parent_hws = (const struct clk_hw*[]) { 337 + &gcc_xo_clk_src.clkr.hw, 338 + }, 339 + .num_parents = 1, 340 + .flags = CLK_SET_RATE_PARENT, 341 + .ops = &clk_branch2_ops, 342 + }, 327 343 }, 328 344 }; 329 345 ··· 1109 1089 .name = "gcc_adss_pwm_clk", 1110 1090 .parent_hws = (const struct clk_hw*[]) { 1111 1091 &gcc_adss_pwm_clk_src.clkr.hw, 1112 - }, 1113 - .num_parents = 1, 1114 - .flags = CLK_SET_RATE_PARENT, 1115 - .ops = &clk_branch2_ops, 1116 - }, 1117 - }, 1118 - }; 1119 - 1120 - static struct clk_branch gcc_apss_dbg_clk = { 1121 - .halt_reg = 0x2402c, 1122 - .halt_check = BRANCH_HALT_VOTED, 1123 - .clkr = { 1124 - .enable_reg = 0x2402c, 1125 - .enable_mask = BIT(0), 1126 - .hw.init = &(const struct clk_init_data) { 1127 - .name = "gcc_apss_dbg_clk", 1128 - .parent_hws = (const struct clk_hw*[]) { 1129 - &gcc_qdss_dap_sync_clk_src.hw 1130 1092 }, 1131 1093 .num_parents = 1, 1132 1094 .flags = CLK_SET_RATE_PARENT, ··· 2787 2785 static struct clk_regmap *gcc_ipq5424_clocks[] = { 2788 2786 [GCC_ADSS_PWM_CLK] = &gcc_adss_pwm_clk.clkr, 2789 2787 [GCC_ADSS_PWM_CLK_SRC] = &gcc_adss_pwm_clk_src.clkr, 2790 - [GCC_APSS_DBG_CLK] = &gcc_apss_dbg_clk.clkr, 2791 2788 [GCC_CNOC_PCIE0_1LANE_S_CLK] = &gcc_cnoc_pcie0_1lane_s_clk.clkr, 2792 2789 [GCC_CNOC_PCIE1_1LANE_S_CLK] = &gcc_cnoc_pcie1_1lane_s_clk.clkr, 2793 2790 [GCC_CNOC_PCIE2_2LANE_S_CLK] = &gcc_cnoc_pcie2_2lane_s_clk.clkr, ··· 2921 2920 [GCC_QPIC_CLK_SRC] = &gcc_qpic_clk_src.clkr, 2922 2921 [GCC_QPIC_AHB_CLK] = &gcc_qpic_ahb_clk.clkr, 2923 2922 [GCC_XO_CLK_SRC] = &gcc_xo_clk_src.clkr, 2923 + [GCC_XO_CLK] = &gcc_xo_clk.clkr, 2924 2924 [GCC_QDSS_DAP_CLK] = &gcc_qdss_dap_clk.clkr, 2925 2925 [GCC_QDSS_AT_CLK] = &gcc_qdss_at_clk.clkr, 2926 2926 [GPLL0] = &gpll0.clkr, ··· 3232 3230 [GCC_QUSB2_1_PHY_BCR] = { 0x3C030, 0 }, 3233 3231 }; 3234 3232 3233 + #define IPQ_APPS_ID 5424 /* some unique value */ 3234 + 3235 + static const struct qcom_icc_hws_data icc_ipq5424_hws[] = { 3236 + { MASTER_ANOC_PCIE0, SLAVE_ANOC_PCIE0, GCC_ANOC_PCIE0_1LANE_M_CLK }, 3237 + { MASTER_CNOC_PCIE0, SLAVE_CNOC_PCIE0, GCC_CNOC_PCIE0_1LANE_S_CLK }, 3238 + { MASTER_ANOC_PCIE1, SLAVE_ANOC_PCIE1, GCC_ANOC_PCIE1_1LANE_M_CLK }, 3239 + { MASTER_CNOC_PCIE1, SLAVE_CNOC_PCIE1, GCC_CNOC_PCIE1_1LANE_S_CLK }, 3240 + { MASTER_ANOC_PCIE2, SLAVE_ANOC_PCIE2, GCC_ANOC_PCIE2_2LANE_M_CLK }, 3241 + { MASTER_CNOC_PCIE2, SLAVE_CNOC_PCIE2, GCC_CNOC_PCIE2_2LANE_S_CLK }, 3242 + { MASTER_ANOC_PCIE3, SLAVE_ANOC_PCIE3, GCC_ANOC_PCIE3_2LANE_M_CLK }, 3243 + { MASTER_CNOC_PCIE3, SLAVE_CNOC_PCIE3, GCC_CNOC_PCIE3_2LANE_S_CLK }, 3244 + { MASTER_CNOC_USB, SLAVE_CNOC_USB, GCC_CNOC_USB_CLK }, 3245 + }; 3246 + 3235 3247 static const struct of_device_id gcc_ipq5424_match_table[] = { 3236 3248 { .compatible = "qcom,ipq5424-gcc" }, 3237 3249 { } ··· 3276 3260 .num_resets = ARRAY_SIZE(gcc_ipq5424_resets), 3277 3261 .clk_hws = gcc_ipq5424_hws, 3278 3262 .num_clk_hws = ARRAY_SIZE(gcc_ipq5424_hws), 3263 + .icc_hws = icc_ipq5424_hws, 3264 + .num_icc_hws = ARRAY_SIZE(icc_ipq5424_hws), 3279 3265 }; 3280 3266 3281 3267 static int gcc_ipq5424_probe(struct platform_device *pdev) ··· 3290 3272 .driver = { 3291 3273 .name = "qcom,gcc-ipq5424", 3292 3274 .of_match_table = gcc_ipq5424_match_table, 3275 + .sync_state = icc_sync_state, 3293 3276 }, 3294 3277 }; 3295 3278
+1 -3
drivers/clk/qcom/gcc-ipq6018.c
··· 4194 4194 .test_ctl_hi_val = 0x4000, 4195 4195 }; 4196 4196 4197 + /* 1200 MHz configuration */ 4197 4198 static const struct alpha_pll_config nss_crypto_pll_config = { 4198 4199 .l = 0x32, 4199 - .alpha = 0x0, 4200 - .alpha_hi = 0x0, 4201 4200 .config_ctl_val = 0x4001055b, 4202 4201 .main_output_mask = BIT(0), 4203 4202 .pre_div_val = 0x0, ··· 4205 4206 .post_div_mask = GENMASK(11, 8), 4206 4207 .vco_mask = GENMASK(21, 20), 4207 4208 .vco_val = 0x0, 4208 - .alpha_en_mask = BIT(24), 4209 4209 }; 4210 4210 4211 4211 static struct clk_hw *gcc_ipq6018_hws[] = {
+1 -1
drivers/clk/qcom/gcc-mdm9607.c
··· 535 535 }; 536 536 537 537 static struct clk_rcg2 blsp1_uart6_apps_clk_src = { 538 - .cmd_rcgr = 0x6044, 538 + .cmd_rcgr = 0x7044, 539 539 .mnd_width = 16, 540 540 .hid_width = 5, 541 541 .parent_map = gcc_xo_gpll0_map,
+3034
drivers/clk/qcom/gcc-qcs615.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved. 4 + */ 5 + 6 + #include <linux/clk-provider.h> 7 + #include <linux/module.h> 8 + #include <linux/mod_devicetable.h> 9 + #include <linux/of.h> 10 + #include <linux/platform_device.h> 11 + #include <linux/regmap.h> 12 + 13 + #include <dt-bindings/clock/qcom,qcs615-gcc.h> 14 + 15 + #include "clk-alpha-pll.h" 16 + #include "clk-branch.h" 17 + #include "clk-rcg.h" 18 + #include "clk-regmap.h" 19 + #include "clk-regmap-divider.h" 20 + #include "clk-regmap-mux.h" 21 + #include "common.h" 22 + #include "gdsc.h" 23 + #include "reset.h" 24 + 25 + enum { 26 + DT_BI_TCXO, 27 + DT_BI_TCXO_AO, 28 + DT_SLEEP_CLK, 29 + }; 30 + 31 + enum { 32 + P_BI_TCXO, 33 + P_GPLL0_OUT_AUX2_DIV, 34 + P_GPLL0_OUT_MAIN, 35 + P_GPLL3_OUT_MAIN, 36 + P_GPLL3_OUT_MAIN_DIV, 37 + P_GPLL4_OUT_MAIN, 38 + P_GPLL6_OUT_MAIN, 39 + P_GPLL7_OUT_MAIN, 40 + P_GPLL8_OUT_MAIN, 41 + P_SLEEP_CLK, 42 + }; 43 + 44 + static struct clk_alpha_pll gpll0 = { 45 + .offset = 0x0, 46 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 47 + .clkr = { 48 + .enable_reg = 0x52000, 49 + .enable_mask = BIT(0), 50 + .hw.init = &(const struct clk_init_data) { 51 + .name = "gpll0", 52 + .parent_data = &(const struct clk_parent_data) { 53 + .index = DT_BI_TCXO, 54 + }, 55 + .num_parents = 1, 56 + .ops = &clk_alpha_pll_ops, 57 + }, 58 + }, 59 + }; 60 + 61 + /* Fixed divider clock of GPLL0 instead of PLL normal postdiv */ 62 + static struct clk_fixed_factor gpll0_out_aux2_div = { 63 + .mult = 1, 64 + .div = 2, 65 + .hw.init = &(struct clk_init_data) { 66 + .name = "gpll0_out_aux2_div", 67 + .parent_data = &(const struct clk_parent_data) { 68 + .hw = &gpll0.clkr.hw, 69 + }, 70 + .num_parents = 1, 71 + .ops = &clk_fixed_factor_ops, 72 + }, 73 + }; 74 + 75 + static struct clk_alpha_pll gpll3 = { 76 + .offset = 0x3000, 77 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 78 + .clkr = { 79 + .enable_reg = 0x52000, 80 + .enable_mask = BIT(3), 81 + .hw.init = &(const struct clk_init_data) { 82 + .name = "gpll3", 83 + .parent_data = &(const struct clk_parent_data) { 84 + .index = DT_BI_TCXO, 85 + }, 86 + .num_parents = 1, 87 + .ops = &clk_alpha_pll_ops, 88 + }, 89 + }, 90 + }; 91 + 92 + /* Fixed divider clock of GPLL3 instead of PLL normal postdiv */ 93 + static struct clk_fixed_factor gpll3_out_aux2_div = { 94 + .mult = 1, 95 + .div = 2, 96 + .hw.init = &(struct clk_init_data) { 97 + .name = "gpll3_out_aux2_div", 98 + .parent_data = &(const struct clk_parent_data) { 99 + .hw = &gpll3.clkr.hw, 100 + }, 101 + .num_parents = 1, 102 + .ops = &clk_fixed_factor_ops, 103 + }, 104 + }; 105 + 106 + static struct clk_alpha_pll gpll4 = { 107 + .offset = 0x76000, 108 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 109 + .clkr = { 110 + .enable_reg = 0x52000, 111 + .enable_mask = BIT(4), 112 + .hw.init = &(const struct clk_init_data) { 113 + .name = "gpll4", 114 + .parent_data = &(const struct clk_parent_data) { 115 + .index = DT_BI_TCXO, 116 + }, 117 + .num_parents = 1, 118 + .ops = &clk_alpha_pll_ops, 119 + }, 120 + }, 121 + }; 122 + 123 + static struct clk_alpha_pll gpll6 = { 124 + .offset = 0x13000, 125 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 126 + .clkr = { 127 + .enable_reg = 0x52000, 128 + .enable_mask = BIT(6), 129 + .hw.init = &(const struct clk_init_data) { 130 + .name = "gpll6", 131 + .parent_data = &(const struct clk_parent_data) { 132 + .index = DT_BI_TCXO, 133 + }, 134 + .num_parents = 1, 135 + .ops = &clk_alpha_pll_ops, 136 + }, 137 + }, 138 + }; 139 + 140 + static const struct clk_div_table post_div_table_gpll6_out_main[] = { 141 + { 0x1, 2 }, 142 + { } 143 + }; 144 + 145 + static struct clk_alpha_pll_postdiv gpll6_out_main = { 146 + .offset = 0x13000, 147 + .post_div_shift = 8, 148 + .post_div_table = post_div_table_gpll6_out_main, 149 + .num_post_div = ARRAY_SIZE(post_div_table_gpll6_out_main), 150 + .width = 4, 151 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 152 + .clkr.hw.init = &(const struct clk_init_data) { 153 + .name = "gpll6_out_main", 154 + .parent_hws = (const struct clk_hw*[]) { 155 + &gpll6.clkr.hw, 156 + }, 157 + .num_parents = 1, 158 + .ops = &clk_alpha_pll_postdiv_ops, 159 + }, 160 + }; 161 + 162 + static struct clk_alpha_pll gpll7 = { 163 + .offset = 0x1a000, 164 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 165 + .clkr = { 166 + .enable_reg = 0x52000, 167 + .enable_mask = BIT(7), 168 + .hw.init = &(const struct clk_init_data) { 169 + .name = "gpll7", 170 + .parent_data = &(const struct clk_parent_data) { 171 + .index = DT_BI_TCXO, 172 + }, 173 + .num_parents = 1, 174 + .ops = &clk_alpha_pll_ops, 175 + }, 176 + }, 177 + }; 178 + 179 + static struct clk_alpha_pll gpll8 = { 180 + .offset = 0x1b000, 181 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 182 + .clkr = { 183 + .enable_reg = 0x52000, 184 + .enable_mask = BIT(8), 185 + .hw.init = &(const struct clk_init_data) { 186 + .name = "gpll8", 187 + .parent_data = &(const struct clk_parent_data) { 188 + .index = DT_BI_TCXO, 189 + }, 190 + .num_parents = 1, 191 + .ops = &clk_alpha_pll_ops, 192 + }, 193 + }, 194 + }; 195 + 196 + static const struct clk_div_table post_div_table_gpll8_out_main[] = { 197 + { 0x1, 2 }, 198 + { } 199 + }; 200 + 201 + static struct clk_alpha_pll_postdiv gpll8_out_main = { 202 + .offset = 0x1b000, 203 + .post_div_shift = 8, 204 + .post_div_table = post_div_table_gpll8_out_main, 205 + .num_post_div = ARRAY_SIZE(post_div_table_gpll8_out_main), 206 + .width = 4, 207 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], 208 + .clkr.hw.init = &(const struct clk_init_data) { 209 + .name = "gpll8_out_main", 210 + .parent_hws = (const struct clk_hw*[]) { 211 + &gpll8.clkr.hw, 212 + }, 213 + .num_parents = 1, 214 + .ops = &clk_alpha_pll_postdiv_ops, 215 + }, 216 + }; 217 + 218 + static const struct parent_map gcc_parent_map_0[] = { 219 + { P_BI_TCXO, 0 }, 220 + { P_GPLL0_OUT_MAIN, 1 }, 221 + { P_GPLL0_OUT_AUX2_DIV, 6 }, 222 + }; 223 + 224 + static const struct clk_parent_data gcc_parent_data_0[] = { 225 + { .index = DT_BI_TCXO }, 226 + { .hw = &gpll0.clkr.hw }, 227 + { .hw = &gpll0_out_aux2_div.hw }, 228 + }; 229 + 230 + static const struct clk_parent_data gcc_parent_data_0_ao[] = { 231 + { .index = DT_BI_TCXO_AO }, 232 + { .hw = &gpll0.clkr.hw }, 233 + { .hw = &gpll0.clkr.hw }, 234 + }; 235 + 236 + static const struct parent_map gcc_parent_map_1[] = { 237 + { P_BI_TCXO, 0 }, 238 + { P_GPLL0_OUT_MAIN, 1 }, 239 + { P_GPLL6_OUT_MAIN, 2 }, 240 + { P_GPLL0_OUT_AUX2_DIV, 6 }, 241 + }; 242 + 243 + static const struct clk_parent_data gcc_parent_data_1[] = { 244 + { .index = DT_BI_TCXO }, 245 + { .hw = &gpll0.clkr.hw }, 246 + { .hw = &gpll6_out_main.clkr.hw }, 247 + { .hw = &gpll0_out_aux2_div.hw }, 248 + }; 249 + 250 + static const struct parent_map gcc_parent_map_2[] = { 251 + { P_BI_TCXO, 0 }, 252 + { P_GPLL0_OUT_MAIN, 1 }, 253 + { P_SLEEP_CLK, 5 }, 254 + { P_GPLL0_OUT_AUX2_DIV, 6 }, 255 + }; 256 + 257 + static const struct clk_parent_data gcc_parent_data_2[] = { 258 + { .index = DT_BI_TCXO }, 259 + { .hw = &gpll0.clkr.hw }, 260 + { .index = DT_SLEEP_CLK }, 261 + { .hw = &gpll0_out_aux2_div.hw }, 262 + }; 263 + 264 + static const struct parent_map gcc_parent_map_3[] = { 265 + { P_BI_TCXO, 0 }, 266 + { P_SLEEP_CLK, 5 }, 267 + }; 268 + 269 + static const struct clk_parent_data gcc_parent_data_3[] = { 270 + { .index = DT_BI_TCXO }, 271 + { .index = DT_SLEEP_CLK }, 272 + }; 273 + 274 + static const struct parent_map gcc_parent_map_4[] = { 275 + { P_BI_TCXO, 0 }, 276 + }; 277 + 278 + static const struct clk_parent_data gcc_parent_data_4[] = { 279 + { .index = DT_BI_TCXO }, 280 + }; 281 + 282 + static const struct parent_map gcc_parent_map_5[] = { 283 + { P_BI_TCXO, 0 }, 284 + { P_GPLL0_OUT_MAIN, 1 }, 285 + { P_GPLL7_OUT_MAIN, 3 }, 286 + { P_GPLL4_OUT_MAIN, 5 }, 287 + { P_GPLL0_OUT_AUX2_DIV, 6 }, 288 + }; 289 + 290 + static const struct clk_parent_data gcc_parent_data_5[] = { 291 + { .index = DT_BI_TCXO }, 292 + { .hw = &gpll0.clkr.hw }, 293 + { .hw = &gpll7.clkr.hw }, 294 + { .hw = &gpll4.clkr.hw }, 295 + { .hw = &gpll0_out_aux2_div.hw }, 296 + }; 297 + 298 + static const struct parent_map gcc_parent_map_6[] = { 299 + { P_BI_TCXO, 0 }, 300 + { P_GPLL0_OUT_MAIN, 1 }, 301 + { P_GPLL7_OUT_MAIN, 3 }, 302 + { P_GPLL0_OUT_AUX2_DIV, 6 }, 303 + }; 304 + 305 + static const struct clk_parent_data gcc_parent_data_6[] = { 306 + { .index = DT_BI_TCXO }, 307 + { .hw = &gpll0.clkr.hw }, 308 + { .hw = &gpll7.clkr.hw }, 309 + { .hw = &gpll0_out_aux2_div.hw }, 310 + }; 311 + 312 + static const struct parent_map gcc_parent_map_7[] = { 313 + { P_BI_TCXO, 0 }, 314 + { P_GPLL0_OUT_MAIN, 1 }, 315 + { P_GPLL3_OUT_MAIN_DIV, 4 }, 316 + { P_GPLL0_OUT_AUX2_DIV, 6 }, 317 + }; 318 + 319 + static const struct clk_parent_data gcc_parent_data_7[] = { 320 + { .index = DT_BI_TCXO }, 321 + { .hw = &gpll0.clkr.hw }, 322 + { .hw = &gpll3_out_aux2_div.hw }, 323 + { .hw = &gpll0_out_aux2_div.hw }, 324 + }; 325 + 326 + static const struct parent_map gcc_parent_map_8[] = { 327 + { P_BI_TCXO, 0 }, 328 + { P_GPLL0_OUT_MAIN, 1 }, 329 + { P_GPLL8_OUT_MAIN, 2 }, 330 + { P_GPLL4_OUT_MAIN, 5 }, 331 + { P_GPLL0_OUT_AUX2_DIV, 6 }, 332 + }; 333 + 334 + static const struct clk_parent_data gcc_parent_data_8[] = { 335 + { .index = DT_BI_TCXO }, 336 + { .hw = &gpll0.clkr.hw }, 337 + { .hw = &gpll8_out_main.clkr.hw }, 338 + { .hw = &gpll4.clkr.hw }, 339 + { .hw = &gpll0_out_aux2_div.hw }, 340 + }; 341 + 342 + static const struct parent_map gcc_parent_map_9[] = { 343 + { P_BI_TCXO, 0 }, 344 + { P_GPLL0_OUT_MAIN, 1 }, 345 + { P_GPLL3_OUT_MAIN, 4 }, 346 + }; 347 + 348 + static const struct clk_parent_data gcc_parent_data_9[] = { 349 + { .index = DT_BI_TCXO }, 350 + { .hw = &gpll0.clkr.hw }, 351 + { .hw = &gpll3.clkr.hw }, 352 + }; 353 + 354 + static const struct freq_tbl ftbl_gcc_cpuss_ahb_clk_src[] = { 355 + F(19200000, P_BI_TCXO, 1, 0, 0), 356 + { } 357 + }; 358 + 359 + static struct clk_rcg2 gcc_cpuss_ahb_clk_src = { 360 + .cmd_rcgr = 0x48014, 361 + .mnd_width = 0, 362 + .hid_width = 5, 363 + .parent_map = gcc_parent_map_0, 364 + .freq_tbl = ftbl_gcc_cpuss_ahb_clk_src, 365 + .clkr.hw.init = &(const struct clk_init_data) { 366 + .name = "gcc_cpuss_ahb_clk_src", 367 + .parent_data = gcc_parent_data_0_ao, 368 + .num_parents = ARRAY_SIZE(gcc_parent_data_0_ao), 369 + .ops = &clk_rcg2_ops, 370 + }, 371 + }; 372 + 373 + static const struct freq_tbl ftbl_gcc_emac_ptp_clk_src[] = { 374 + F(19200000, P_BI_TCXO, 1, 0, 0), 375 + F(50000000, P_GPLL0_OUT_AUX2_DIV, 6, 0, 0), 376 + F(75000000, P_GPLL0_OUT_AUX2_DIV, 4, 0, 0), 377 + F(125000000, P_GPLL7_OUT_MAIN, 4, 0, 0), 378 + F(250000000, P_GPLL7_OUT_MAIN, 2, 0, 0), 379 + { } 380 + }; 381 + 382 + static struct clk_rcg2 gcc_emac_ptp_clk_src = { 383 + .cmd_rcgr = 0x6038, 384 + .mnd_width = 0, 385 + .hid_width = 5, 386 + .parent_map = gcc_parent_map_5, 387 + .freq_tbl = ftbl_gcc_emac_ptp_clk_src, 388 + .clkr.hw.init = &(const struct clk_init_data) { 389 + .name = "gcc_emac_ptp_clk_src", 390 + .parent_data = gcc_parent_data_5, 391 + .num_parents = ARRAY_SIZE(gcc_parent_data_5), 392 + .ops = &clk_rcg2_ops, 393 + }, 394 + }; 395 + 396 + static const struct freq_tbl ftbl_gcc_emac_rgmii_clk_src[] = { 397 + F(2500000, P_BI_TCXO, 1, 25, 192), 398 + F(5000000, P_BI_TCXO, 1, 25, 96), 399 + F(19200000, P_BI_TCXO, 1, 0, 0), 400 + F(25000000, P_GPLL0_OUT_AUX2_DIV, 12, 0, 0), 401 + F(50000000, P_GPLL0_OUT_AUX2_DIV, 6, 0, 0), 402 + F(75000000, P_GPLL0_OUT_AUX2_DIV, 4, 0, 0), 403 + F(125000000, P_GPLL7_OUT_MAIN, 4, 0, 0), 404 + F(250000000, P_GPLL7_OUT_MAIN, 2, 0, 0), 405 + { } 406 + }; 407 + 408 + static struct clk_rcg2 gcc_emac_rgmii_clk_src = { 409 + .cmd_rcgr = 0x601c, 410 + .mnd_width = 8, 411 + .hid_width = 5, 412 + .parent_map = gcc_parent_map_6, 413 + .freq_tbl = ftbl_gcc_emac_rgmii_clk_src, 414 + .clkr.hw.init = &(const struct clk_init_data) { 415 + .name = "gcc_emac_rgmii_clk_src", 416 + .parent_data = gcc_parent_data_6, 417 + .num_parents = ARRAY_SIZE(gcc_parent_data_6), 418 + .ops = &clk_rcg2_ops, 419 + }, 420 + }; 421 + 422 + static const struct freq_tbl ftbl_gcc_gp1_clk_src[] = { 423 + F(25000000, P_GPLL0_OUT_AUX2_DIV, 12, 0, 0), 424 + F(50000000, P_GPLL0_OUT_AUX2_DIV, 6, 0, 0), 425 + F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 426 + F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 427 + { } 428 + }; 429 + 430 + static struct clk_rcg2 gcc_gp1_clk_src = { 431 + .cmd_rcgr = 0x64004, 432 + .mnd_width = 8, 433 + .hid_width = 5, 434 + .parent_map = gcc_parent_map_2, 435 + .freq_tbl = ftbl_gcc_gp1_clk_src, 436 + .clkr.hw.init = &(const struct clk_init_data) { 437 + .name = "gcc_gp1_clk_src", 438 + .parent_data = gcc_parent_data_2, 439 + .num_parents = ARRAY_SIZE(gcc_parent_data_2), 440 + .ops = &clk_rcg2_ops, 441 + }, 442 + }; 443 + 444 + static struct clk_rcg2 gcc_gp2_clk_src = { 445 + .cmd_rcgr = 0x65004, 446 + .mnd_width = 8, 447 + .hid_width = 5, 448 + .parent_map = gcc_parent_map_2, 449 + .freq_tbl = ftbl_gcc_gp1_clk_src, 450 + .clkr.hw.init = &(const struct clk_init_data) { 451 + .name = "gcc_gp2_clk_src", 452 + .parent_data = gcc_parent_data_2, 453 + .num_parents = ARRAY_SIZE(gcc_parent_data_2), 454 + .ops = &clk_rcg2_ops, 455 + }, 456 + }; 457 + 458 + static struct clk_rcg2 gcc_gp3_clk_src = { 459 + .cmd_rcgr = 0x66004, 460 + .mnd_width = 8, 461 + .hid_width = 5, 462 + .parent_map = gcc_parent_map_2, 463 + .freq_tbl = ftbl_gcc_gp1_clk_src, 464 + .clkr.hw.init = &(const struct clk_init_data) { 465 + .name = "gcc_gp3_clk_src", 466 + .parent_data = gcc_parent_data_2, 467 + .num_parents = ARRAY_SIZE(gcc_parent_data_2), 468 + .ops = &clk_rcg2_ops, 469 + }, 470 + }; 471 + 472 + static const struct freq_tbl ftbl_gcc_pcie_0_aux_clk_src[] = { 473 + F(9600000, P_BI_TCXO, 2, 0, 0), 474 + F(19200000, P_BI_TCXO, 1, 0, 0), 475 + { } 476 + }; 477 + 478 + static struct clk_rcg2 gcc_pcie_0_aux_clk_src = { 479 + .cmd_rcgr = 0x6b02c, 480 + .mnd_width = 16, 481 + .hid_width = 5, 482 + .parent_map = gcc_parent_map_3, 483 + .freq_tbl = ftbl_gcc_pcie_0_aux_clk_src, 484 + .clkr.hw.init = &(const struct clk_init_data) { 485 + .name = "gcc_pcie_0_aux_clk_src", 486 + .parent_data = gcc_parent_data_3, 487 + .num_parents = ARRAY_SIZE(gcc_parent_data_3), 488 + .ops = &clk_rcg2_shared_ops, 489 + }, 490 + }; 491 + 492 + static const struct freq_tbl ftbl_gcc_pcie_phy_refgen_clk_src[] = { 493 + F(19200000, P_BI_TCXO, 1, 0, 0), 494 + F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 495 + { } 496 + }; 497 + 498 + static struct clk_rcg2 gcc_pcie_phy_refgen_clk_src = { 499 + .cmd_rcgr = 0x6f014, 500 + .mnd_width = 0, 501 + .hid_width = 5, 502 + .parent_map = gcc_parent_map_0, 503 + .freq_tbl = ftbl_gcc_pcie_phy_refgen_clk_src, 504 + .clkr.hw.init = &(const struct clk_init_data) { 505 + .name = "gcc_pcie_phy_refgen_clk_src", 506 + .parent_data = gcc_parent_data_0, 507 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 508 + .ops = &clk_rcg2_ops, 509 + }, 510 + }; 511 + 512 + static const struct freq_tbl ftbl_gcc_pdm2_clk_src[] = { 513 + F(19200000, P_BI_TCXO, 1, 0, 0), 514 + F(60000000, P_GPLL0_OUT_MAIN, 10, 0, 0), 515 + { } 516 + }; 517 + 518 + static struct clk_rcg2 gcc_pdm2_clk_src = { 519 + .cmd_rcgr = 0x33010, 520 + .mnd_width = 0, 521 + .hid_width = 5, 522 + .parent_map = gcc_parent_map_0, 523 + .freq_tbl = ftbl_gcc_pdm2_clk_src, 524 + .clkr.hw.init = &(const struct clk_init_data) { 525 + .name = "gcc_pdm2_clk_src", 526 + .parent_data = gcc_parent_data_0, 527 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 528 + .ops = &clk_rcg2_ops, 529 + }, 530 + }; 531 + 532 + static const struct freq_tbl ftbl_gcc_qspi_core_clk_src[] = { 533 + F(60000000, P_GPLL0_OUT_AUX2_DIV, 5, 0, 0), 534 + F(133250000, P_GPLL3_OUT_MAIN_DIV, 4, 0, 0), 535 + F(266500000, P_GPLL3_OUT_MAIN_DIV, 2, 0, 0), 536 + { } 537 + }; 538 + 539 + static struct clk_rcg2 gcc_qspi_core_clk_src = { 540 + .cmd_rcgr = 0x4b008, 541 + .mnd_width = 0, 542 + .hid_width = 5, 543 + .parent_map = gcc_parent_map_7, 544 + .freq_tbl = ftbl_gcc_qspi_core_clk_src, 545 + .clkr.hw.init = &(const struct clk_init_data) { 546 + .name = "gcc_qspi_core_clk_src", 547 + .parent_data = gcc_parent_data_7, 548 + .num_parents = ARRAY_SIZE(gcc_parent_data_7), 549 + .ops = &clk_rcg2_ops, 550 + }, 551 + }; 552 + 553 + static const struct freq_tbl ftbl_gcc_qupv3_wrap0_s0_clk_src[] = { 554 + F(7372800, P_GPLL0_OUT_AUX2_DIV, 1, 384, 15625), 555 + F(14745600, P_GPLL0_OUT_AUX2_DIV, 1, 768, 15625), 556 + F(19200000, P_BI_TCXO, 1, 0, 0), 557 + F(29491200, P_GPLL0_OUT_AUX2_DIV, 1, 1536, 15625), 558 + F(32000000, P_GPLL0_OUT_AUX2_DIV, 1, 8, 75), 559 + F(48000000, P_GPLL0_OUT_AUX2_DIV, 1, 4, 25), 560 + F(64000000, P_GPLL0_OUT_AUX2_DIV, 1, 16, 75), 561 + F(75000000, P_GPLL0_OUT_AUX2_DIV, 4, 0, 0), 562 + F(80000000, P_GPLL0_OUT_AUX2_DIV, 1, 4, 15), 563 + F(96000000, P_GPLL0_OUT_AUX2_DIV, 1, 8, 25), 564 + F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 565 + F(102400000, P_GPLL0_OUT_AUX2_DIV, 1, 128, 375), 566 + F(112000000, P_GPLL0_OUT_AUX2_DIV, 1, 28, 75), 567 + F(117964800, P_GPLL0_OUT_AUX2_DIV, 1, 6144, 15625), 568 + F(120000000, P_GPLL0_OUT_AUX2_DIV, 2.5, 0, 0), 569 + F(128000000, P_GPLL6_OUT_MAIN, 3, 0, 0), 570 + { } 571 + }; 572 + 573 + static struct clk_init_data gcc_qupv3_wrap0_s0_clk_src_init = { 574 + .name = "gcc_qupv3_wrap0_s0_clk_src", 575 + .parent_data = gcc_parent_data_1, 576 + .num_parents = ARRAY_SIZE(gcc_parent_data_1), 577 + .ops = &clk_rcg2_ops, 578 + }; 579 + 580 + static struct clk_rcg2 gcc_qupv3_wrap0_s0_clk_src = { 581 + .cmd_rcgr = 0x17148, 582 + .mnd_width = 16, 583 + .hid_width = 5, 584 + .parent_map = gcc_parent_map_1, 585 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 586 + .clkr.hw.init = &gcc_qupv3_wrap0_s0_clk_src_init, 587 + }; 588 + 589 + static struct clk_init_data gcc_qupv3_wrap0_s1_clk_src_init = { 590 + .name = "gcc_qupv3_wrap0_s1_clk_src", 591 + .parent_data = gcc_parent_data_1, 592 + .num_parents = ARRAY_SIZE(gcc_parent_data_1), 593 + .ops = &clk_rcg2_ops, 594 + }; 595 + 596 + static struct clk_rcg2 gcc_qupv3_wrap0_s1_clk_src = { 597 + .cmd_rcgr = 0x17278, 598 + .mnd_width = 16, 599 + .hid_width = 5, 600 + .parent_map = gcc_parent_map_1, 601 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 602 + .clkr.hw.init = &gcc_qupv3_wrap0_s1_clk_src_init, 603 + }; 604 + 605 + static struct clk_init_data gcc_qupv3_wrap0_s2_clk_src_init = { 606 + .name = "gcc_qupv3_wrap0_s2_clk_src", 607 + .parent_data = gcc_parent_data_1, 608 + .num_parents = ARRAY_SIZE(gcc_parent_data_1), 609 + .ops = &clk_rcg2_ops, 610 + }; 611 + 612 + static struct clk_rcg2 gcc_qupv3_wrap0_s2_clk_src = { 613 + .cmd_rcgr = 0x173a8, 614 + .mnd_width = 16, 615 + .hid_width = 5, 616 + .parent_map = gcc_parent_map_1, 617 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 618 + .clkr.hw.init = &gcc_qupv3_wrap0_s2_clk_src_init, 619 + }; 620 + 621 + static struct clk_init_data gcc_qupv3_wrap0_s3_clk_src_init = { 622 + .name = "gcc_qupv3_wrap0_s3_clk_src", 623 + .parent_data = gcc_parent_data_1, 624 + .num_parents = ARRAY_SIZE(gcc_parent_data_1), 625 + .ops = &clk_rcg2_ops, 626 + }; 627 + 628 + static struct clk_rcg2 gcc_qupv3_wrap0_s3_clk_src = { 629 + .cmd_rcgr = 0x174d8, 630 + .mnd_width = 16, 631 + .hid_width = 5, 632 + .parent_map = gcc_parent_map_1, 633 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 634 + .clkr.hw.init = &gcc_qupv3_wrap0_s3_clk_src_init, 635 + }; 636 + 637 + static struct clk_init_data gcc_qupv3_wrap0_s4_clk_src_init = { 638 + .name = "gcc_qupv3_wrap0_s4_clk_src", 639 + .parent_data = gcc_parent_data_1, 640 + .num_parents = ARRAY_SIZE(gcc_parent_data_1), 641 + .ops = &clk_rcg2_ops, 642 + }; 643 + 644 + static struct clk_rcg2 gcc_qupv3_wrap0_s4_clk_src = { 645 + .cmd_rcgr = 0x17608, 646 + .mnd_width = 16, 647 + .hid_width = 5, 648 + .parent_map = gcc_parent_map_1, 649 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 650 + .clkr.hw.init = &gcc_qupv3_wrap0_s4_clk_src_init, 651 + }; 652 + 653 + static struct clk_init_data gcc_qupv3_wrap0_s5_clk_src_init = { 654 + .name = "gcc_qupv3_wrap0_s5_clk_src", 655 + .parent_data = gcc_parent_data_1, 656 + .num_parents = ARRAY_SIZE(gcc_parent_data_1), 657 + .ops = &clk_rcg2_ops, 658 + }; 659 + 660 + static struct clk_rcg2 gcc_qupv3_wrap0_s5_clk_src = { 661 + .cmd_rcgr = 0x17738, 662 + .mnd_width = 16, 663 + .hid_width = 5, 664 + .parent_map = gcc_parent_map_1, 665 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 666 + .clkr.hw.init = &gcc_qupv3_wrap0_s5_clk_src_init, 667 + }; 668 + 669 + static struct clk_init_data gcc_qupv3_wrap1_s0_clk_src_init = { 670 + .name = "gcc_qupv3_wrap1_s0_clk_src", 671 + .parent_data = gcc_parent_data_1, 672 + .num_parents = ARRAY_SIZE(gcc_parent_data_1), 673 + .ops = &clk_rcg2_ops, 674 + }; 675 + 676 + static struct clk_rcg2 gcc_qupv3_wrap1_s0_clk_src = { 677 + .cmd_rcgr = 0x18148, 678 + .mnd_width = 16, 679 + .hid_width = 5, 680 + .parent_map = gcc_parent_map_1, 681 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 682 + .clkr.hw.init = &gcc_qupv3_wrap1_s0_clk_src_init, 683 + }; 684 + 685 + static struct clk_init_data gcc_qupv3_wrap1_s1_clk_src_init = { 686 + .name = "gcc_qupv3_wrap1_s1_clk_src", 687 + .parent_data = gcc_parent_data_1, 688 + .num_parents = ARRAY_SIZE(gcc_parent_data_1), 689 + .ops = &clk_rcg2_ops, 690 + }; 691 + 692 + static struct clk_rcg2 gcc_qupv3_wrap1_s1_clk_src = { 693 + .cmd_rcgr = 0x18278, 694 + .mnd_width = 16, 695 + .hid_width = 5, 696 + .parent_map = gcc_parent_map_1, 697 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 698 + .clkr.hw.init = &gcc_qupv3_wrap1_s1_clk_src_init, 699 + }; 700 + 701 + static struct clk_init_data gcc_qupv3_wrap1_s2_clk_src_init = { 702 + .name = "gcc_qupv3_wrap1_s2_clk_src", 703 + .parent_data = gcc_parent_data_1, 704 + .num_parents = ARRAY_SIZE(gcc_parent_data_1), 705 + .ops = &clk_rcg2_ops, 706 + }; 707 + 708 + static struct clk_rcg2 gcc_qupv3_wrap1_s2_clk_src = { 709 + .cmd_rcgr = 0x183a8, 710 + .mnd_width = 16, 711 + .hid_width = 5, 712 + .parent_map = gcc_parent_map_1, 713 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 714 + .clkr.hw.init = &gcc_qupv3_wrap1_s2_clk_src_init, 715 + }; 716 + 717 + static struct clk_init_data gcc_qupv3_wrap1_s3_clk_src_init = { 718 + .name = "gcc_qupv3_wrap1_s3_clk_src", 719 + .parent_data = gcc_parent_data_1, 720 + .num_parents = ARRAY_SIZE(gcc_parent_data_1), 721 + .ops = &clk_rcg2_ops, 722 + }; 723 + 724 + static struct clk_rcg2 gcc_qupv3_wrap1_s3_clk_src = { 725 + .cmd_rcgr = 0x184d8, 726 + .mnd_width = 16, 727 + .hid_width = 5, 728 + .parent_map = gcc_parent_map_1, 729 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 730 + .clkr.hw.init = &gcc_qupv3_wrap1_s3_clk_src_init, 731 + }; 732 + 733 + static struct clk_init_data gcc_qupv3_wrap1_s4_clk_src_init = { 734 + .name = "gcc_qupv3_wrap1_s4_clk_src", 735 + .parent_data = gcc_parent_data_1, 736 + .num_parents = ARRAY_SIZE(gcc_parent_data_1), 737 + .ops = &clk_rcg2_ops, 738 + }; 739 + 740 + static struct clk_rcg2 gcc_qupv3_wrap1_s4_clk_src = { 741 + .cmd_rcgr = 0x18608, 742 + .mnd_width = 16, 743 + .hid_width = 5, 744 + .parent_map = gcc_parent_map_1, 745 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 746 + .clkr.hw.init = &gcc_qupv3_wrap1_s4_clk_src_init, 747 + }; 748 + 749 + static struct clk_init_data gcc_qupv3_wrap1_s5_clk_src_init = { 750 + .name = "gcc_qupv3_wrap1_s5_clk_src", 751 + .parent_data = gcc_parent_data_1, 752 + .num_parents = ARRAY_SIZE(gcc_parent_data_1), 753 + .ops = &clk_rcg2_ops, 754 + }; 755 + 756 + static struct clk_rcg2 gcc_qupv3_wrap1_s5_clk_src = { 757 + .cmd_rcgr = 0x18738, 758 + .mnd_width = 16, 759 + .hid_width = 5, 760 + .parent_map = gcc_parent_map_1, 761 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 762 + .clkr.hw.init = &gcc_qupv3_wrap1_s5_clk_src_init, 763 + }; 764 + 765 + static const struct freq_tbl ftbl_gcc_sdcc1_apps_clk_src[] = { 766 + F(144000, P_BI_TCXO, 16, 3, 25), 767 + F(400000, P_BI_TCXO, 12, 1, 4), 768 + F(20000000, P_GPLL0_OUT_AUX2_DIV, 5, 1, 3), 769 + F(25000000, P_GPLL0_OUT_AUX2_DIV, 6, 1, 2), 770 + F(50000000, P_GPLL0_OUT_AUX2_DIV, 6, 0, 0), 771 + F(100000000, P_GPLL0_OUT_AUX2_DIV, 3, 0, 0), 772 + F(192000000, P_GPLL6_OUT_MAIN, 2, 0, 0), 773 + F(384000000, P_GPLL6_OUT_MAIN, 1, 0, 0), 774 + { } 775 + }; 776 + 777 + static struct clk_rcg2 gcc_sdcc1_apps_clk_src = { 778 + .cmd_rcgr = 0x12028, 779 + .mnd_width = 8, 780 + .hid_width = 5, 781 + .parent_map = gcc_parent_map_1, 782 + .freq_tbl = ftbl_gcc_sdcc1_apps_clk_src, 783 + .clkr.hw.init = &(const struct clk_init_data) { 784 + .name = "gcc_sdcc1_apps_clk_src", 785 + .parent_data = gcc_parent_data_1, 786 + .num_parents = ARRAY_SIZE(gcc_parent_data_1), 787 + .ops = &clk_rcg2_floor_ops, 788 + }, 789 + }; 790 + 791 + static const struct freq_tbl ftbl_gcc_sdcc1_ice_core_clk_src[] = { 792 + F(75000000, P_GPLL0_OUT_AUX2_DIV, 4, 0, 0), 793 + F(150000000, P_GPLL0_OUT_MAIN, 4, 0, 0), 794 + F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 795 + F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0), 796 + { } 797 + }; 798 + 799 + static struct clk_rcg2 gcc_sdcc1_ice_core_clk_src = { 800 + .cmd_rcgr = 0x12010, 801 + .mnd_width = 0, 802 + .hid_width = 5, 803 + .parent_map = gcc_parent_map_0, 804 + .freq_tbl = ftbl_gcc_sdcc1_ice_core_clk_src, 805 + .clkr.hw.init = &(const struct clk_init_data) { 806 + .name = "gcc_sdcc1_ice_core_clk_src", 807 + .parent_data = gcc_parent_data_0, 808 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 809 + .ops = &clk_rcg2_floor_ops, 810 + }, 811 + }; 812 + 813 + static const struct freq_tbl ftbl_gcc_sdcc2_apps_clk_src[] = { 814 + F(400000, P_BI_TCXO, 12, 1, 4), 815 + F(19200000, P_BI_TCXO, 1, 0, 0), 816 + F(25000000, P_GPLL0_OUT_AUX2_DIV, 12, 0, 0), 817 + F(50000000, P_GPLL0_OUT_AUX2_DIV, 6, 0, 0), 818 + F(100000000, P_GPLL0_OUT_AUX2_DIV, 3, 0, 0), 819 + F(202000000, P_GPLL8_OUT_MAIN, 2, 0, 0), 820 + { } 821 + }; 822 + 823 + static struct clk_rcg2 gcc_sdcc2_apps_clk_src = { 824 + .cmd_rcgr = 0x1400c, 825 + .mnd_width = 8, 826 + .hid_width = 5, 827 + .parent_map = gcc_parent_map_8, 828 + .freq_tbl = ftbl_gcc_sdcc2_apps_clk_src, 829 + .clkr.hw.init = &(const struct clk_init_data) { 830 + .name = "gcc_sdcc2_apps_clk_src", 831 + .parent_data = gcc_parent_data_8, 832 + .num_parents = ARRAY_SIZE(gcc_parent_data_8), 833 + .ops = &clk_rcg2_floor_ops, 834 + }, 835 + }; 836 + 837 + static const struct freq_tbl ftbl_gcc_ufs_phy_axi_clk_src[] = { 838 + F(25000000, P_GPLL0_OUT_AUX2_DIV, 12, 0, 0), 839 + F(50000000, P_GPLL0_OUT_AUX2_DIV, 6, 0, 0), 840 + F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 841 + F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 842 + F(240000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0), 843 + { } 844 + }; 845 + 846 + static struct clk_rcg2 gcc_ufs_phy_axi_clk_src = { 847 + .cmd_rcgr = 0x77020, 848 + .mnd_width = 8, 849 + .hid_width = 5, 850 + .parent_map = gcc_parent_map_0, 851 + .freq_tbl = ftbl_gcc_ufs_phy_axi_clk_src, 852 + .clkr.hw.init = &(const struct clk_init_data) { 853 + .name = "gcc_ufs_phy_axi_clk_src", 854 + .parent_data = gcc_parent_data_0, 855 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 856 + .ops = &clk_rcg2_ops, 857 + }, 858 + }; 859 + 860 + static const struct freq_tbl ftbl_gcc_ufs_phy_ice_core_clk_src[] = { 861 + F(37500000, P_GPLL0_OUT_AUX2_DIV, 8, 0, 0), 862 + F(75000000, P_GPLL0_OUT_AUX2_DIV, 4, 0, 0), 863 + F(150000000, P_GPLL0_OUT_MAIN, 4, 0, 0), 864 + F(300000000, P_GPLL0_OUT_MAIN, 2, 0, 0), 865 + { } 866 + }; 867 + 868 + static struct clk_rcg2 gcc_ufs_phy_ice_core_clk_src = { 869 + .cmd_rcgr = 0x77048, 870 + .mnd_width = 0, 871 + .hid_width = 5, 872 + .parent_map = gcc_parent_map_0, 873 + .freq_tbl = ftbl_gcc_ufs_phy_ice_core_clk_src, 874 + .clkr.hw.init = &(const struct clk_init_data) { 875 + .name = "gcc_ufs_phy_ice_core_clk_src", 876 + .parent_data = gcc_parent_data_0, 877 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 878 + .ops = &clk_rcg2_ops, 879 + }, 880 + }; 881 + 882 + static struct clk_rcg2 gcc_ufs_phy_phy_aux_clk_src = { 883 + .cmd_rcgr = 0x7707c, 884 + .mnd_width = 0, 885 + .hid_width = 5, 886 + .parent_map = gcc_parent_map_4, 887 + .freq_tbl = ftbl_gcc_pcie_0_aux_clk_src, 888 + .clkr.hw.init = &(const struct clk_init_data) { 889 + .name = "gcc_ufs_phy_phy_aux_clk_src", 890 + .parent_data = gcc_parent_data_4, 891 + .num_parents = ARRAY_SIZE(gcc_parent_data_4), 892 + .ops = &clk_rcg2_ops, 893 + }, 894 + }; 895 + 896 + static const struct freq_tbl ftbl_gcc_ufs_phy_unipro_core_clk_src[] = { 897 + F(37500000, P_GPLL0_OUT_AUX2_DIV, 8, 0, 0), 898 + F(75000000, P_GPLL0_OUT_MAIN, 8, 0, 0), 899 + F(150000000, P_GPLL0_OUT_MAIN, 4, 0, 0), 900 + { } 901 + }; 902 + 903 + static struct clk_rcg2 gcc_ufs_phy_unipro_core_clk_src = { 904 + .cmd_rcgr = 0x77060, 905 + .mnd_width = 0, 906 + .hid_width = 5, 907 + .parent_map = gcc_parent_map_0, 908 + .freq_tbl = ftbl_gcc_ufs_phy_unipro_core_clk_src, 909 + .clkr.hw.init = &(const struct clk_init_data) { 910 + .name = "gcc_ufs_phy_unipro_core_clk_src", 911 + .parent_data = gcc_parent_data_0, 912 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 913 + .ops = &clk_rcg2_ops, 914 + }, 915 + }; 916 + 917 + static const struct freq_tbl ftbl_gcc_usb20_sec_master_clk_src[] = { 918 + F(19200000, P_BI_TCXO, 1, 0, 0), 919 + F(60000000, P_GPLL0_OUT_MAIN, 10, 0, 0), 920 + F(120000000, P_GPLL0_OUT_MAIN, 5, 0, 0), 921 + { } 922 + }; 923 + 924 + static struct clk_rcg2 gcc_usb20_sec_master_clk_src = { 925 + .cmd_rcgr = 0xa601c, 926 + .mnd_width = 8, 927 + .hid_width = 5, 928 + .parent_map = gcc_parent_map_0, 929 + .freq_tbl = ftbl_gcc_usb20_sec_master_clk_src, 930 + .clkr.hw.init = &(const struct clk_init_data) { 931 + .name = "gcc_usb20_sec_master_clk_src", 932 + .parent_data = gcc_parent_data_0, 933 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 934 + .ops = &clk_rcg2_ops, 935 + }, 936 + }; 937 + 938 + static struct clk_rcg2 gcc_usb20_sec_mock_utmi_clk_src = { 939 + .cmd_rcgr = 0xa6034, 940 + .mnd_width = 0, 941 + .hid_width = 5, 942 + .parent_map = gcc_parent_map_0, 943 + .freq_tbl = ftbl_gcc_pdm2_clk_src, 944 + .clkr.hw.init = &(const struct clk_init_data) { 945 + .name = "gcc_usb20_sec_mock_utmi_clk_src", 946 + .parent_data = gcc_parent_data_0, 947 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 948 + .ops = &clk_rcg2_ops, 949 + }, 950 + }; 951 + 952 + static const struct freq_tbl ftbl_gcc_usb2_sec_phy_aux_clk_src[] = { 953 + F(19200000, P_BI_TCXO, 1, 0, 0), 954 + { } 955 + }; 956 + 957 + static struct clk_rcg2 gcc_usb2_sec_phy_aux_clk_src = { 958 + .cmd_rcgr = 0xa6060, 959 + .mnd_width = 0, 960 + .hid_width = 5, 961 + .parent_map = gcc_parent_map_3, 962 + .freq_tbl = ftbl_gcc_usb2_sec_phy_aux_clk_src, 963 + .clkr.hw.init = &(const struct clk_init_data) { 964 + .name = "gcc_usb2_sec_phy_aux_clk_src", 965 + .parent_data = gcc_parent_data_3, 966 + .num_parents = ARRAY_SIZE(gcc_parent_data_3), 967 + .ops = &clk_rcg2_ops, 968 + }, 969 + }; 970 + 971 + static const struct freq_tbl ftbl_gcc_usb30_prim_master_clk_src[] = { 972 + F(66666667, P_GPLL0_OUT_AUX2_DIV, 4.5, 0, 0), 973 + F(133333333, P_GPLL0_OUT_MAIN, 4.5, 0, 0), 974 + F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 975 + F(240000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0), 976 + { } 977 + }; 978 + 979 + static struct clk_rcg2 gcc_usb30_prim_master_clk_src = { 980 + .cmd_rcgr = 0xf01c, 981 + .mnd_width = 8, 982 + .hid_width = 5, 983 + .parent_map = gcc_parent_map_0, 984 + .freq_tbl = ftbl_gcc_usb30_prim_master_clk_src, 985 + .clkr.hw.init = &(const struct clk_init_data) { 986 + .name = "gcc_usb30_prim_master_clk_src", 987 + .parent_data = gcc_parent_data_0, 988 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 989 + .ops = &clk_rcg2_ops, 990 + }, 991 + }; 992 + 993 + static const struct freq_tbl ftbl_gcc_usb30_prim_mock_utmi_clk_src[] = { 994 + F(19200000, P_BI_TCXO, 1, 0, 0), 995 + F(20000000, P_GPLL0_OUT_AUX2_DIV, 15, 0, 0), 996 + F(40000000, P_GPLL0_OUT_AUX2_DIV, 7.5, 0, 0), 997 + F(60000000, P_GPLL0_OUT_MAIN, 10, 0, 0), 998 + { } 999 + }; 1000 + 1001 + static struct clk_rcg2 gcc_usb30_prim_mock_utmi_clk_src = { 1002 + .cmd_rcgr = 0xf034, 1003 + .mnd_width = 0, 1004 + .hid_width = 5, 1005 + .parent_map = gcc_parent_map_0, 1006 + .freq_tbl = ftbl_gcc_usb30_prim_mock_utmi_clk_src, 1007 + .clkr.hw.init = &(const struct clk_init_data) { 1008 + .name = "gcc_usb30_prim_mock_utmi_clk_src", 1009 + .parent_data = gcc_parent_data_0, 1010 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 1011 + .ops = &clk_rcg2_ops, 1012 + }, 1013 + }; 1014 + 1015 + static struct clk_rcg2 gcc_usb3_prim_phy_aux_clk_src = { 1016 + .cmd_rcgr = 0xf060, 1017 + .mnd_width = 0, 1018 + .hid_width = 5, 1019 + .parent_map = gcc_parent_map_3, 1020 + .freq_tbl = ftbl_gcc_usb2_sec_phy_aux_clk_src, 1021 + .clkr.hw.init = &(const struct clk_init_data) { 1022 + .name = "gcc_usb3_prim_phy_aux_clk_src", 1023 + .parent_data = gcc_parent_data_3, 1024 + .num_parents = ARRAY_SIZE(gcc_parent_data_3), 1025 + .ops = &clk_rcg2_ops, 1026 + }, 1027 + }; 1028 + 1029 + static const struct freq_tbl ftbl_gcc_vsensor_clk_src[] = { 1030 + F(19200000, P_BI_TCXO, 1, 0, 0), 1031 + F(400000000, P_GPLL0_OUT_MAIN, 1.5, 0, 0), 1032 + { } 1033 + }; 1034 + 1035 + static struct clk_rcg2 gcc_vsensor_clk_src = { 1036 + .cmd_rcgr = 0x7a018, 1037 + .mnd_width = 0, 1038 + .hid_width = 5, 1039 + .parent_map = gcc_parent_map_9, 1040 + .freq_tbl = ftbl_gcc_vsensor_clk_src, 1041 + .clkr.hw.init = &(const struct clk_init_data) { 1042 + .name = "gcc_vsensor_clk_src", 1043 + .parent_data = gcc_parent_data_9, 1044 + .num_parents = ARRAY_SIZE(gcc_parent_data_9), 1045 + .ops = &clk_rcg2_ops, 1046 + }, 1047 + }; 1048 + 1049 + static struct clk_branch gcc_aggre_ufs_phy_axi_clk = { 1050 + .halt_reg = 0x770c0, 1051 + .halt_check = BRANCH_HALT_VOTED, 1052 + .hwcg_reg = 0x770c0, 1053 + .hwcg_bit = 1, 1054 + .clkr = { 1055 + .enable_reg = 0x770c0, 1056 + .enable_mask = BIT(0), 1057 + .hw.init = &(const struct clk_init_data) { 1058 + .name = "gcc_aggre_ufs_phy_axi_clk", 1059 + .parent_hws = (const struct clk_hw*[]) { 1060 + &gcc_ufs_phy_axi_clk_src.clkr.hw, 1061 + }, 1062 + .num_parents = 1, 1063 + .flags = CLK_SET_RATE_PARENT, 1064 + .ops = &clk_branch2_ops, 1065 + }, 1066 + }, 1067 + }; 1068 + 1069 + static struct clk_branch gcc_aggre_usb2_sec_axi_clk = { 1070 + .halt_reg = 0xa6084, 1071 + .halt_check = BRANCH_HALT_VOTED, 1072 + .clkr = { 1073 + .enable_reg = 0xa6084, 1074 + .enable_mask = BIT(0), 1075 + .hw.init = &(const struct clk_init_data) { 1076 + .name = "gcc_aggre_usb2_sec_axi_clk", 1077 + .parent_hws = (const struct clk_hw*[]) { 1078 + &gcc_usb20_sec_master_clk_src.clkr.hw, 1079 + }, 1080 + .num_parents = 1, 1081 + .flags = CLK_SET_RATE_PARENT, 1082 + .ops = &clk_branch2_ops, 1083 + }, 1084 + }, 1085 + }; 1086 + 1087 + static struct clk_branch gcc_aggre_usb3_prim_axi_clk = { 1088 + .halt_reg = 0xf07c, 1089 + .halt_check = BRANCH_HALT_VOTED, 1090 + .clkr = { 1091 + .enable_reg = 0xf07c, 1092 + .enable_mask = BIT(0), 1093 + .hw.init = &(const struct clk_init_data) { 1094 + .name = "gcc_aggre_usb3_prim_axi_clk", 1095 + .parent_hws = (const struct clk_hw*[]) { 1096 + &gcc_usb30_prim_master_clk_src.clkr.hw, 1097 + }, 1098 + .num_parents = 1, 1099 + .flags = CLK_SET_RATE_PARENT, 1100 + .ops = &clk_branch2_ops, 1101 + }, 1102 + }, 1103 + }; 1104 + 1105 + static struct clk_branch gcc_ahb2phy_east_clk = { 1106 + .halt_reg = 0x6a008, 1107 + .halt_check = BRANCH_HALT_VOTED, 1108 + .hwcg_reg = 0x6a008, 1109 + .hwcg_bit = 1, 1110 + .clkr = { 1111 + .enable_reg = 0x6a008, 1112 + .enable_mask = BIT(0), 1113 + .hw.init = &(const struct clk_init_data) { 1114 + .name = "gcc_ahb2phy_east_clk", 1115 + .ops = &clk_branch2_ops, 1116 + }, 1117 + }, 1118 + }; 1119 + 1120 + static struct clk_branch gcc_ahb2phy_west_clk = { 1121 + .halt_reg = 0x6a004, 1122 + .halt_check = BRANCH_HALT_VOTED, 1123 + .hwcg_reg = 0x6a004, 1124 + .hwcg_bit = 1, 1125 + .clkr = { 1126 + .enable_reg = 0x6a004, 1127 + .enable_mask = BIT(0), 1128 + .hw.init = &(const struct clk_init_data) { 1129 + .name = "gcc_ahb2phy_west_clk", 1130 + .ops = &clk_branch2_ops, 1131 + }, 1132 + }, 1133 + }; 1134 + 1135 + static struct clk_branch gcc_boot_rom_ahb_clk = { 1136 + .halt_reg = 0x38004, 1137 + .halt_check = BRANCH_HALT_VOTED, 1138 + .hwcg_reg = 0x38004, 1139 + .hwcg_bit = 1, 1140 + .clkr = { 1141 + .enable_reg = 0x52004, 1142 + .enable_mask = BIT(10), 1143 + .hw.init = &(const struct clk_init_data) { 1144 + .name = "gcc_boot_rom_ahb_clk", 1145 + .ops = &clk_branch2_ops, 1146 + }, 1147 + }, 1148 + }; 1149 + 1150 + static struct clk_branch gcc_camera_hf_axi_clk = { 1151 + .halt_reg = 0xb030, 1152 + .halt_check = BRANCH_HALT_VOTED, 1153 + .clkr = { 1154 + .enable_reg = 0xb030, 1155 + .enable_mask = BIT(0), 1156 + .hw.init = &(const struct clk_init_data) { 1157 + .name = "gcc_camera_hf_axi_clk", 1158 + .ops = &clk_branch2_ops, 1159 + }, 1160 + }, 1161 + }; 1162 + 1163 + static struct clk_branch gcc_ce1_ahb_clk = { 1164 + .halt_reg = 0x4100c, 1165 + .halt_check = BRANCH_HALT_VOTED, 1166 + .hwcg_reg = 0x4100c, 1167 + .hwcg_bit = 1, 1168 + .clkr = { 1169 + .enable_reg = 0x52004, 1170 + .enable_mask = BIT(3), 1171 + .hw.init = &(const struct clk_init_data) { 1172 + .name = "gcc_ce1_ahb_clk", 1173 + .ops = &clk_branch2_ops, 1174 + }, 1175 + }, 1176 + }; 1177 + 1178 + static struct clk_branch gcc_ce1_axi_clk = { 1179 + .halt_reg = 0x41008, 1180 + .halt_check = BRANCH_HALT_VOTED, 1181 + .clkr = { 1182 + .enable_reg = 0x52004, 1183 + .enable_mask = BIT(4), 1184 + .hw.init = &(const struct clk_init_data) { 1185 + .name = "gcc_ce1_axi_clk", 1186 + .ops = &clk_branch2_ops, 1187 + }, 1188 + }, 1189 + }; 1190 + 1191 + static struct clk_branch gcc_ce1_clk = { 1192 + .halt_reg = 0x41004, 1193 + .halt_check = BRANCH_HALT_VOTED, 1194 + .clkr = { 1195 + .enable_reg = 0x52004, 1196 + .enable_mask = BIT(5), 1197 + .hw.init = &(const struct clk_init_data) { 1198 + .name = "gcc_ce1_clk", 1199 + .ops = &clk_branch2_ops, 1200 + }, 1201 + }, 1202 + }; 1203 + 1204 + static struct clk_branch gcc_cfg_noc_usb2_sec_axi_clk = { 1205 + .halt_reg = 0xa609c, 1206 + .halt_check = BRANCH_HALT_VOTED, 1207 + .clkr = { 1208 + .enable_reg = 0xa609c, 1209 + .enable_mask = BIT(0), 1210 + .hw.init = &(const struct clk_init_data) { 1211 + .name = "gcc_cfg_noc_usb2_sec_axi_clk", 1212 + .parent_hws = (const struct clk_hw*[]) { 1213 + &gcc_usb20_sec_master_clk_src.clkr.hw, 1214 + }, 1215 + .num_parents = 1, 1216 + .flags = CLK_SET_RATE_PARENT, 1217 + .ops = &clk_branch2_ops, 1218 + }, 1219 + }, 1220 + }; 1221 + 1222 + static struct clk_branch gcc_cfg_noc_usb3_prim_axi_clk = { 1223 + .halt_reg = 0xf078, 1224 + .halt_check = BRANCH_HALT_VOTED, 1225 + .clkr = { 1226 + .enable_reg = 0xf078, 1227 + .enable_mask = BIT(0), 1228 + .hw.init = &(const struct clk_init_data) { 1229 + .name = "gcc_cfg_noc_usb3_prim_axi_clk", 1230 + .parent_hws = (const struct clk_hw*[]) { 1231 + &gcc_usb30_prim_master_clk_src.clkr.hw, 1232 + }, 1233 + .num_parents = 1, 1234 + .flags = CLK_SET_RATE_PARENT, 1235 + .ops = &clk_branch2_ops, 1236 + }, 1237 + }, 1238 + }; 1239 + 1240 + static struct clk_branch gcc_cpuss_ahb_clk = { 1241 + .halt_reg = 0x48000, 1242 + .halt_check = BRANCH_HALT_VOTED, 1243 + .clkr = { 1244 + .enable_reg = 0x52004, 1245 + .enable_mask = BIT(21), 1246 + .hw.init = &(const struct clk_init_data) { 1247 + .name = "gcc_cpuss_ahb_clk", 1248 + .parent_hws = (const struct clk_hw*[]) { 1249 + &gcc_cpuss_ahb_clk_src.clkr.hw, 1250 + }, 1251 + .num_parents = 1, 1252 + .flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT, 1253 + .ops = &clk_branch2_ops, 1254 + }, 1255 + }, 1256 + }; 1257 + 1258 + static struct clk_branch gcc_ddrss_gpu_axi_clk = { 1259 + .halt_reg = 0x71154, 1260 + .halt_check = BRANCH_HALT_VOTED, 1261 + .clkr = { 1262 + .enable_reg = 0x71154, 1263 + .enable_mask = BIT(0), 1264 + .hw.init = &(const struct clk_init_data) { 1265 + .name = "gcc_ddrss_gpu_axi_clk", 1266 + .ops = &clk_branch2_ops, 1267 + }, 1268 + }, 1269 + }; 1270 + 1271 + static struct clk_branch gcc_disp_gpll0_div_clk_src = { 1272 + .halt_check = BRANCH_HALT_DELAY, 1273 + .clkr = { 1274 + .enable_reg = 0x52004, 1275 + .enable_mask = BIT(20), 1276 + .hw.init = &(const struct clk_init_data) { 1277 + .name = "gcc_disp_gpll0_div_clk_src", 1278 + .parent_hws = (const struct clk_hw*[]) { 1279 + &gpll0_out_aux2_div.hw, 1280 + }, 1281 + .num_parents = 1, 1282 + .ops = &clk_branch2_ops, 1283 + }, 1284 + }, 1285 + }; 1286 + 1287 + static struct clk_branch gcc_disp_hf_axi_clk = { 1288 + .halt_reg = 0xb038, 1289 + .halt_check = BRANCH_HALT_VOTED, 1290 + .clkr = { 1291 + .enable_reg = 0xb038, 1292 + .enable_mask = BIT(0), 1293 + .hw.init = &(const struct clk_init_data) { 1294 + .name = "gcc_disp_hf_axi_clk", 1295 + .ops = &clk_branch2_ops, 1296 + }, 1297 + }, 1298 + }; 1299 + 1300 + static struct clk_branch gcc_emac_axi_clk = { 1301 + .halt_reg = 0x6010, 1302 + .halt_check = BRANCH_HALT, 1303 + .clkr = { 1304 + .enable_reg = 0x6010, 1305 + .enable_mask = BIT(0), 1306 + .hw.init = &(const struct clk_init_data) { 1307 + .name = "gcc_emac_axi_clk", 1308 + .ops = &clk_branch2_ops, 1309 + }, 1310 + }, 1311 + }; 1312 + 1313 + static struct clk_branch gcc_emac_ptp_clk = { 1314 + .halt_reg = 0x6034, 1315 + .halt_check = BRANCH_HALT, 1316 + .clkr = { 1317 + .enable_reg = 0x6034, 1318 + .enable_mask = BIT(0), 1319 + .hw.init = &(const struct clk_init_data) { 1320 + .name = "gcc_emac_ptp_clk", 1321 + .parent_hws = (const struct clk_hw*[]) { 1322 + &gcc_emac_ptp_clk_src.clkr.hw, 1323 + }, 1324 + .num_parents = 1, 1325 + .flags = CLK_SET_RATE_PARENT, 1326 + .ops = &clk_branch2_ops, 1327 + }, 1328 + }, 1329 + }; 1330 + 1331 + static struct clk_branch gcc_emac_rgmii_clk = { 1332 + .halt_reg = 0x6018, 1333 + .halt_check = BRANCH_HALT, 1334 + .clkr = { 1335 + .enable_reg = 0x6018, 1336 + .enable_mask = BIT(0), 1337 + .hw.init = &(const struct clk_init_data) { 1338 + .name = "gcc_emac_rgmii_clk", 1339 + .parent_hws = (const struct clk_hw*[]) { 1340 + &gcc_emac_rgmii_clk_src.clkr.hw, 1341 + }, 1342 + .num_parents = 1, 1343 + .flags = CLK_SET_RATE_PARENT, 1344 + .ops = &clk_branch2_ops, 1345 + }, 1346 + }, 1347 + }; 1348 + 1349 + static struct clk_branch gcc_emac_slv_ahb_clk = { 1350 + .halt_reg = 0x6014, 1351 + .halt_check = BRANCH_HALT, 1352 + .hwcg_reg = 0x6014, 1353 + .hwcg_bit = 1, 1354 + .clkr = { 1355 + .enable_reg = 0x6014, 1356 + .enable_mask = BIT(0), 1357 + .hw.init = &(const struct clk_init_data) { 1358 + .name = "gcc_emac_slv_ahb_clk", 1359 + .ops = &clk_branch2_ops, 1360 + }, 1361 + }, 1362 + }; 1363 + 1364 + static struct clk_branch gcc_gp1_clk = { 1365 + .halt_reg = 0x64000, 1366 + .halt_check = BRANCH_HALT, 1367 + .clkr = { 1368 + .enable_reg = 0x64000, 1369 + .enable_mask = BIT(0), 1370 + .hw.init = &(const struct clk_init_data) { 1371 + .name = "gcc_gp1_clk", 1372 + .parent_hws = (const struct clk_hw*[]) { 1373 + &gcc_gp1_clk_src.clkr.hw, 1374 + }, 1375 + .num_parents = 1, 1376 + .flags = CLK_SET_RATE_PARENT, 1377 + .ops = &clk_branch2_ops, 1378 + }, 1379 + }, 1380 + }; 1381 + 1382 + static struct clk_branch gcc_gp2_clk = { 1383 + .halt_reg = 0x65000, 1384 + .halt_check = BRANCH_HALT, 1385 + .clkr = { 1386 + .enable_reg = 0x65000, 1387 + .enable_mask = BIT(0), 1388 + .hw.init = &(const struct clk_init_data) { 1389 + .name = "gcc_gp2_clk", 1390 + .parent_hws = (const struct clk_hw*[]) { 1391 + &gcc_gp2_clk_src.clkr.hw, 1392 + }, 1393 + .num_parents = 1, 1394 + .flags = CLK_SET_RATE_PARENT, 1395 + .ops = &clk_branch2_ops, 1396 + }, 1397 + }, 1398 + }; 1399 + 1400 + static struct clk_branch gcc_gp3_clk = { 1401 + .halt_reg = 0x66000, 1402 + .halt_check = BRANCH_HALT, 1403 + .clkr = { 1404 + .enable_reg = 0x66000, 1405 + .enable_mask = BIT(0), 1406 + .hw.init = &(const struct clk_init_data) { 1407 + .name = "gcc_gp3_clk", 1408 + .parent_hws = (const struct clk_hw*[]) { 1409 + &gcc_gp3_clk_src.clkr.hw, 1410 + }, 1411 + .num_parents = 1, 1412 + .flags = CLK_SET_RATE_PARENT, 1413 + .ops = &clk_branch2_ops, 1414 + }, 1415 + }, 1416 + }; 1417 + 1418 + static struct clk_branch gcc_gpu_gpll0_clk_src = { 1419 + .halt_check = BRANCH_HALT_DELAY, 1420 + .clkr = { 1421 + .enable_reg = 0x52004, 1422 + .enable_mask = BIT(15), 1423 + .hw.init = &(const struct clk_init_data) { 1424 + .name = "gcc_gpu_gpll0_clk_src", 1425 + .parent_hws = (const struct clk_hw*[]) { 1426 + &gpll0.clkr.hw, 1427 + }, 1428 + .num_parents = 1, 1429 + .ops = &clk_branch2_ops, 1430 + }, 1431 + }, 1432 + }; 1433 + 1434 + static struct clk_branch gcc_gpu_gpll0_div_clk_src = { 1435 + .halt_check = BRANCH_HALT_DELAY, 1436 + .clkr = { 1437 + .enable_reg = 0x52004, 1438 + .enable_mask = BIT(16), 1439 + .hw.init = &(const struct clk_init_data) { 1440 + .name = "gcc_gpu_gpll0_div_clk_src", 1441 + .parent_hws = (const struct clk_hw*[]) { 1442 + &gpll0_out_aux2_div.hw, 1443 + }, 1444 + .num_parents = 1, 1445 + .ops = &clk_branch2_ops, 1446 + }, 1447 + }, 1448 + }; 1449 + 1450 + static struct clk_branch gcc_gpu_iref_clk = { 1451 + .halt_reg = 0x8c010, 1452 + .halt_check = BRANCH_HALT, 1453 + .clkr = { 1454 + .enable_reg = 0x8c010, 1455 + .enable_mask = BIT(0), 1456 + .hw.init = &(const struct clk_init_data) { 1457 + .name = "gcc_gpu_iref_clk", 1458 + .ops = &clk_branch2_ops, 1459 + }, 1460 + }, 1461 + }; 1462 + 1463 + static struct clk_branch gcc_gpu_memnoc_gfx_clk = { 1464 + .halt_reg = 0x7100c, 1465 + .halt_check = BRANCH_HALT_VOTED, 1466 + .clkr = { 1467 + .enable_reg = 0x7100c, 1468 + .enable_mask = BIT(0), 1469 + .hw.init = &(const struct clk_init_data) { 1470 + .name = "gcc_gpu_memnoc_gfx_clk", 1471 + .ops = &clk_branch2_ops, 1472 + }, 1473 + }, 1474 + }; 1475 + 1476 + static struct clk_branch gcc_gpu_snoc_dvm_gfx_clk = { 1477 + .halt_reg = 0x71018, 1478 + .halt_check = BRANCH_HALT, 1479 + .clkr = { 1480 + .enable_reg = 0x71018, 1481 + .enable_mask = BIT(0), 1482 + .hw.init = &(const struct clk_init_data) { 1483 + .name = "gcc_gpu_snoc_dvm_gfx_clk", 1484 + .ops = &clk_branch2_ops, 1485 + }, 1486 + }, 1487 + }; 1488 + 1489 + static struct clk_branch gcc_pcie0_phy_refgen_clk = { 1490 + .halt_reg = 0x6f02c, 1491 + .halt_check = BRANCH_HALT, 1492 + .clkr = { 1493 + .enable_reg = 0x6f02c, 1494 + .enable_mask = BIT(0), 1495 + .hw.init = &(const struct clk_init_data) { 1496 + .name = "gcc_pcie0_phy_refgen_clk", 1497 + .parent_hws = (const struct clk_hw*[]) { 1498 + &gcc_pcie_phy_refgen_clk_src.clkr.hw, 1499 + }, 1500 + .num_parents = 1, 1501 + .flags = CLK_SET_RATE_PARENT, 1502 + .ops = &clk_branch2_ops, 1503 + }, 1504 + }, 1505 + }; 1506 + 1507 + static struct clk_branch gcc_pcie_0_aux_clk = { 1508 + .halt_reg = 0x6b020, 1509 + .halt_check = BRANCH_HALT_VOTED, 1510 + .clkr = { 1511 + .enable_reg = 0x5200c, 1512 + .enable_mask = BIT(3), 1513 + .hw.init = &(const struct clk_init_data) { 1514 + .name = "gcc_pcie_0_aux_clk", 1515 + .parent_hws = (const struct clk_hw*[]) { 1516 + &gcc_pcie_0_aux_clk_src.clkr.hw, 1517 + }, 1518 + .num_parents = 1, 1519 + .flags = CLK_SET_RATE_PARENT, 1520 + .ops = &clk_branch2_ops, 1521 + }, 1522 + }, 1523 + }; 1524 + 1525 + static struct clk_branch gcc_pcie_0_cfg_ahb_clk = { 1526 + .halt_reg = 0x6b01c, 1527 + .halt_check = BRANCH_HALT_VOTED, 1528 + .hwcg_reg = 0x6b01c, 1529 + .hwcg_bit = 1, 1530 + .clkr = { 1531 + .enable_reg = 0x5200c, 1532 + .enable_mask = BIT(2), 1533 + .hw.init = &(const struct clk_init_data) { 1534 + .name = "gcc_pcie_0_cfg_ahb_clk", 1535 + .ops = &clk_branch2_ops, 1536 + }, 1537 + }, 1538 + }; 1539 + 1540 + static struct clk_branch gcc_pcie_0_clkref_clk = { 1541 + .halt_reg = 0x8c00c, 1542 + .halt_check = BRANCH_HALT, 1543 + .clkr = { 1544 + .enable_reg = 0x8c00c, 1545 + .enable_mask = BIT(0), 1546 + .hw.init = &(const struct clk_init_data) { 1547 + .name = "gcc_pcie_0_clkref_clk", 1548 + .ops = &clk_branch2_ops, 1549 + }, 1550 + }, 1551 + }; 1552 + 1553 + static struct clk_branch gcc_pcie_0_mstr_axi_clk = { 1554 + .halt_reg = 0x6b018, 1555 + .halt_check = BRANCH_HALT_VOTED, 1556 + .clkr = { 1557 + .enable_reg = 0x5200c, 1558 + .enable_mask = BIT(1), 1559 + .hw.init = &(const struct clk_init_data) { 1560 + .name = "gcc_pcie_0_mstr_axi_clk", 1561 + .ops = &clk_branch2_ops, 1562 + }, 1563 + }, 1564 + }; 1565 + 1566 + static struct clk_branch gcc_pcie_0_pipe_clk = { 1567 + .halt_reg = 0x6b024, 1568 + .halt_check = BRANCH_HALT_SKIP, 1569 + .clkr = { 1570 + .enable_reg = 0x5200c, 1571 + .enable_mask = BIT(4), 1572 + .hw.init = &(const struct clk_init_data) { 1573 + .name = "gcc_pcie_0_pipe_clk", 1574 + .ops = &clk_branch2_ops, 1575 + }, 1576 + }, 1577 + }; 1578 + 1579 + static struct clk_branch gcc_pcie_0_slv_axi_clk = { 1580 + .halt_reg = 0x6b014, 1581 + .halt_check = BRANCH_HALT_VOTED, 1582 + .hwcg_reg = 0x6b014, 1583 + .hwcg_bit = 1, 1584 + .clkr = { 1585 + .enable_reg = 0x5200c, 1586 + .enable_mask = BIT(0), 1587 + .hw.init = &(const struct clk_init_data) { 1588 + .name = "gcc_pcie_0_slv_axi_clk", 1589 + .ops = &clk_branch2_ops, 1590 + }, 1591 + }, 1592 + }; 1593 + 1594 + static struct clk_branch gcc_pcie_0_slv_q2a_axi_clk = { 1595 + .halt_reg = 0x6b010, 1596 + .halt_check = BRANCH_HALT_VOTED, 1597 + .clkr = { 1598 + .enable_reg = 0x5200c, 1599 + .enable_mask = BIT(5), 1600 + .hw.init = &(const struct clk_init_data) { 1601 + .name = "gcc_pcie_0_slv_q2a_axi_clk", 1602 + .ops = &clk_branch2_ops, 1603 + }, 1604 + }, 1605 + }; 1606 + 1607 + static struct clk_branch gcc_pcie_phy_aux_clk = { 1608 + .halt_reg = 0x6f004, 1609 + .halt_check = BRANCH_HALT, 1610 + .clkr = { 1611 + .enable_reg = 0x6f004, 1612 + .enable_mask = BIT(0), 1613 + .hw.init = &(const struct clk_init_data) { 1614 + .name = "gcc_pcie_phy_aux_clk", 1615 + .parent_hws = (const struct clk_hw*[]) { 1616 + &gcc_pcie_0_aux_clk_src.clkr.hw, 1617 + }, 1618 + .num_parents = 1, 1619 + .flags = CLK_SET_RATE_PARENT, 1620 + .ops = &clk_branch2_ops, 1621 + }, 1622 + }, 1623 + }; 1624 + 1625 + static struct clk_branch gcc_pdm2_clk = { 1626 + .halt_reg = 0x3300c, 1627 + .halt_check = BRANCH_HALT, 1628 + .clkr = { 1629 + .enable_reg = 0x3300c, 1630 + .enable_mask = BIT(0), 1631 + .hw.init = &(const struct clk_init_data) { 1632 + .name = "gcc_pdm2_clk", 1633 + .parent_hws = (const struct clk_hw*[]) { 1634 + &gcc_pdm2_clk_src.clkr.hw, 1635 + }, 1636 + .num_parents = 1, 1637 + .flags = CLK_SET_RATE_PARENT, 1638 + .ops = &clk_branch2_ops, 1639 + }, 1640 + }, 1641 + }; 1642 + 1643 + static struct clk_branch gcc_pdm_ahb_clk = { 1644 + .halt_reg = 0x33004, 1645 + .halt_check = BRANCH_HALT, 1646 + .hwcg_reg = 0x33004, 1647 + .hwcg_bit = 1, 1648 + .clkr = { 1649 + .enable_reg = 0x33004, 1650 + .enable_mask = BIT(0), 1651 + .hw.init = &(const struct clk_init_data) { 1652 + .name = "gcc_pdm_ahb_clk", 1653 + .ops = &clk_branch2_ops, 1654 + }, 1655 + }, 1656 + }; 1657 + 1658 + static struct clk_branch gcc_pdm_xo4_clk = { 1659 + .halt_reg = 0x33008, 1660 + .halt_check = BRANCH_HALT, 1661 + .clkr = { 1662 + .enable_reg = 0x33008, 1663 + .enable_mask = BIT(0), 1664 + .hw.init = &(const struct clk_init_data) { 1665 + .name = "gcc_pdm_xo4_clk", 1666 + .ops = &clk_branch2_ops, 1667 + }, 1668 + }, 1669 + }; 1670 + 1671 + static struct clk_branch gcc_prng_ahb_clk = { 1672 + .halt_reg = 0x34004, 1673 + .halt_check = BRANCH_HALT_VOTED, 1674 + .hwcg_reg = 0x34004, 1675 + .hwcg_bit = 1, 1676 + .clkr = { 1677 + .enable_reg = 0x52004, 1678 + .enable_mask = BIT(13), 1679 + .hw.init = &(const struct clk_init_data) { 1680 + .name = "gcc_prng_ahb_clk", 1681 + .ops = &clk_branch2_ops, 1682 + }, 1683 + }, 1684 + }; 1685 + 1686 + static struct clk_branch gcc_qmip_camera_nrt_ahb_clk = { 1687 + .halt_reg = 0xb018, 1688 + .halt_check = BRANCH_HALT_VOTED, 1689 + .hwcg_reg = 0xb018, 1690 + .hwcg_bit = 1, 1691 + .clkr = { 1692 + .enable_reg = 0xb018, 1693 + .enable_mask = BIT(0), 1694 + .hw.init = &(const struct clk_init_data) { 1695 + .name = "gcc_qmip_camera_nrt_ahb_clk", 1696 + .ops = &clk_branch2_ops, 1697 + }, 1698 + }, 1699 + }; 1700 + 1701 + static struct clk_branch gcc_qmip_disp_ahb_clk = { 1702 + .halt_reg = 0xb020, 1703 + .halt_check = BRANCH_HALT_VOTED, 1704 + .hwcg_reg = 0xb020, 1705 + .hwcg_bit = 1, 1706 + .clkr = { 1707 + .enable_reg = 0xb020, 1708 + .enable_mask = BIT(0), 1709 + .hw.init = &(const struct clk_init_data) { 1710 + .name = "gcc_qmip_disp_ahb_clk", 1711 + .ops = &clk_branch2_ops, 1712 + }, 1713 + }, 1714 + }; 1715 + 1716 + static struct clk_branch gcc_qmip_pcie_ahb_clk = { 1717 + .halt_reg = 0x6b044, 1718 + .halt_check = BRANCH_HALT_VOTED, 1719 + .hwcg_reg = 0x6b044, 1720 + .hwcg_bit = 1, 1721 + .clkr = { 1722 + .enable_reg = 0x5200c, 1723 + .enable_mask = BIT(28), 1724 + .hw.init = &(const struct clk_init_data) { 1725 + .name = "gcc_qmip_pcie_ahb_clk", 1726 + .ops = &clk_branch2_ops, 1727 + }, 1728 + }, 1729 + }; 1730 + 1731 + static struct clk_branch gcc_qmip_video_vcodec_ahb_clk = { 1732 + .halt_reg = 0xb014, 1733 + .halt_check = BRANCH_HALT_VOTED, 1734 + .hwcg_reg = 0xb014, 1735 + .hwcg_bit = 1, 1736 + .clkr = { 1737 + .enable_reg = 0xb014, 1738 + .enable_mask = BIT(0), 1739 + .hw.init = &(const struct clk_init_data) { 1740 + .name = "gcc_qmip_video_vcodec_ahb_clk", 1741 + .ops = &clk_branch2_ops, 1742 + }, 1743 + }, 1744 + }; 1745 + 1746 + static struct clk_branch gcc_qspi_cnoc_periph_ahb_clk = { 1747 + .halt_reg = 0x4b000, 1748 + .halt_check = BRANCH_HALT_VOTED, 1749 + .clkr = { 1750 + .enable_reg = 0x4b000, 1751 + .enable_mask = BIT(0), 1752 + .hw.init = &(const struct clk_init_data) { 1753 + .name = "gcc_qspi_cnoc_periph_ahb_clk", 1754 + .ops = &clk_branch2_ops, 1755 + }, 1756 + }, 1757 + }; 1758 + 1759 + static struct clk_branch gcc_qspi_core_clk = { 1760 + .halt_reg = 0x4b004, 1761 + .halt_check = BRANCH_HALT, 1762 + .clkr = { 1763 + .enable_reg = 0x4b004, 1764 + .enable_mask = BIT(0), 1765 + .hw.init = &(const struct clk_init_data) { 1766 + .name = "gcc_qspi_core_clk", 1767 + .parent_hws = (const struct clk_hw*[]) { 1768 + &gcc_qspi_core_clk_src.clkr.hw, 1769 + }, 1770 + .num_parents = 1, 1771 + .flags = CLK_SET_RATE_PARENT, 1772 + .ops = &clk_branch2_ops, 1773 + }, 1774 + }, 1775 + }; 1776 + 1777 + static struct clk_branch gcc_qupv3_wrap0_core_2x_clk = { 1778 + .halt_reg = 0x17014, 1779 + .halt_check = BRANCH_HALT_VOTED, 1780 + .clkr = { 1781 + .enable_reg = 0x5200c, 1782 + .enable_mask = BIT(9), 1783 + .hw.init = &(const struct clk_init_data) { 1784 + .name = "gcc_qupv3_wrap0_core_2x_clk", 1785 + .ops = &clk_branch2_ops, 1786 + }, 1787 + }, 1788 + }; 1789 + 1790 + static struct clk_branch gcc_qupv3_wrap0_core_clk = { 1791 + .halt_reg = 0x1700c, 1792 + .halt_check = BRANCH_HALT_VOTED, 1793 + .clkr = { 1794 + .enable_reg = 0x5200c, 1795 + .enable_mask = BIT(8), 1796 + .hw.init = &(const struct clk_init_data) { 1797 + .name = "gcc_qupv3_wrap0_core_clk", 1798 + .ops = &clk_branch2_ops, 1799 + }, 1800 + }, 1801 + }; 1802 + 1803 + static struct clk_branch gcc_qupv3_wrap0_s0_clk = { 1804 + .halt_reg = 0x17144, 1805 + .halt_check = BRANCH_HALT_VOTED, 1806 + .clkr = { 1807 + .enable_reg = 0x5200c, 1808 + .enable_mask = BIT(10), 1809 + .hw.init = &(const struct clk_init_data) { 1810 + .name = "gcc_qupv3_wrap0_s0_clk", 1811 + .parent_hws = (const struct clk_hw*[]) { 1812 + &gcc_qupv3_wrap0_s0_clk_src.clkr.hw, 1813 + }, 1814 + .num_parents = 1, 1815 + .flags = CLK_SET_RATE_PARENT, 1816 + .ops = &clk_branch2_ops, 1817 + }, 1818 + }, 1819 + }; 1820 + 1821 + static struct clk_branch gcc_qupv3_wrap0_s1_clk = { 1822 + .halt_reg = 0x17274, 1823 + .halt_check = BRANCH_HALT_VOTED, 1824 + .clkr = { 1825 + .enable_reg = 0x5200c, 1826 + .enable_mask = BIT(11), 1827 + .hw.init = &(const struct clk_init_data) { 1828 + .name = "gcc_qupv3_wrap0_s1_clk", 1829 + .parent_hws = (const struct clk_hw*[]) { 1830 + &gcc_qupv3_wrap0_s1_clk_src.clkr.hw, 1831 + }, 1832 + .num_parents = 1, 1833 + .flags = CLK_SET_RATE_PARENT, 1834 + .ops = &clk_branch2_ops, 1835 + }, 1836 + }, 1837 + }; 1838 + 1839 + static struct clk_branch gcc_qupv3_wrap0_s2_clk = { 1840 + .halt_reg = 0x173a4, 1841 + .halt_check = BRANCH_HALT_VOTED, 1842 + .clkr = { 1843 + .enable_reg = 0x5200c, 1844 + .enable_mask = BIT(12), 1845 + .hw.init = &(const struct clk_init_data) { 1846 + .name = "gcc_qupv3_wrap0_s2_clk", 1847 + .parent_hws = (const struct clk_hw*[]) { 1848 + &gcc_qupv3_wrap0_s2_clk_src.clkr.hw, 1849 + }, 1850 + .num_parents = 1, 1851 + .flags = CLK_SET_RATE_PARENT, 1852 + .ops = &clk_branch2_ops, 1853 + }, 1854 + }, 1855 + }; 1856 + 1857 + static struct clk_branch gcc_qupv3_wrap0_s3_clk = { 1858 + .halt_reg = 0x174d4, 1859 + .halt_check = BRANCH_HALT_VOTED, 1860 + .clkr = { 1861 + .enable_reg = 0x5200c, 1862 + .enable_mask = BIT(13), 1863 + .hw.init = &(const struct clk_init_data) { 1864 + .name = "gcc_qupv3_wrap0_s3_clk", 1865 + .parent_hws = (const struct clk_hw*[]) { 1866 + &gcc_qupv3_wrap0_s3_clk_src.clkr.hw, 1867 + }, 1868 + .num_parents = 1, 1869 + .flags = CLK_SET_RATE_PARENT, 1870 + .ops = &clk_branch2_ops, 1871 + }, 1872 + }, 1873 + }; 1874 + 1875 + static struct clk_branch gcc_qupv3_wrap0_s4_clk = { 1876 + .halt_reg = 0x17604, 1877 + .halt_check = BRANCH_HALT_VOTED, 1878 + .clkr = { 1879 + .enable_reg = 0x5200c, 1880 + .enable_mask = BIT(14), 1881 + .hw.init = &(const struct clk_init_data) { 1882 + .name = "gcc_qupv3_wrap0_s4_clk", 1883 + .parent_hws = (const struct clk_hw*[]) { 1884 + &gcc_qupv3_wrap0_s4_clk_src.clkr.hw, 1885 + }, 1886 + .num_parents = 1, 1887 + .flags = CLK_SET_RATE_PARENT, 1888 + .ops = &clk_branch2_ops, 1889 + }, 1890 + }, 1891 + }; 1892 + 1893 + static struct clk_branch gcc_qupv3_wrap0_s5_clk = { 1894 + .halt_reg = 0x17734, 1895 + .halt_check = BRANCH_HALT_VOTED, 1896 + .clkr = { 1897 + .enable_reg = 0x5200c, 1898 + .enable_mask = BIT(15), 1899 + .hw.init = &(const struct clk_init_data) { 1900 + .name = "gcc_qupv3_wrap0_s5_clk", 1901 + .parent_hws = (const struct clk_hw*[]) { 1902 + &gcc_qupv3_wrap0_s5_clk_src.clkr.hw, 1903 + }, 1904 + .num_parents = 1, 1905 + .flags = CLK_SET_RATE_PARENT, 1906 + .ops = &clk_branch2_ops, 1907 + }, 1908 + }, 1909 + }; 1910 + 1911 + static struct clk_branch gcc_qupv3_wrap1_core_2x_clk = { 1912 + .halt_reg = 0x18014, 1913 + .halt_check = BRANCH_HALT_VOTED, 1914 + .clkr = { 1915 + .enable_reg = 0x5200c, 1916 + .enable_mask = BIT(18), 1917 + .hw.init = &(const struct clk_init_data) { 1918 + .name = "gcc_qupv3_wrap1_core_2x_clk", 1919 + .ops = &clk_branch2_ops, 1920 + }, 1921 + }, 1922 + }; 1923 + 1924 + static struct clk_branch gcc_qupv3_wrap1_core_clk = { 1925 + .halt_reg = 0x1800c, 1926 + .halt_check = BRANCH_HALT_VOTED, 1927 + .clkr = { 1928 + .enable_reg = 0x5200c, 1929 + .enable_mask = BIT(19), 1930 + .hw.init = &(const struct clk_init_data) { 1931 + .name = "gcc_qupv3_wrap1_core_clk", 1932 + .ops = &clk_branch2_ops, 1933 + }, 1934 + }, 1935 + }; 1936 + 1937 + static struct clk_branch gcc_qupv3_wrap1_s0_clk = { 1938 + .halt_reg = 0x18144, 1939 + .halt_check = BRANCH_HALT_VOTED, 1940 + .clkr = { 1941 + .enable_reg = 0x5200c, 1942 + .enable_mask = BIT(22), 1943 + .hw.init = &(const struct clk_init_data) { 1944 + .name = "gcc_qupv3_wrap1_s0_clk", 1945 + .parent_hws = (const struct clk_hw*[]) { 1946 + &gcc_qupv3_wrap1_s0_clk_src.clkr.hw, 1947 + }, 1948 + .num_parents = 1, 1949 + .flags = CLK_SET_RATE_PARENT, 1950 + .ops = &clk_branch2_ops, 1951 + }, 1952 + }, 1953 + }; 1954 + 1955 + static struct clk_branch gcc_qupv3_wrap1_s1_clk = { 1956 + .halt_reg = 0x18274, 1957 + .halt_check = BRANCH_HALT_VOTED, 1958 + .clkr = { 1959 + .enable_reg = 0x5200c, 1960 + .enable_mask = BIT(23), 1961 + .hw.init = &(const struct clk_init_data) { 1962 + .name = "gcc_qupv3_wrap1_s1_clk", 1963 + .parent_hws = (const struct clk_hw*[]) { 1964 + &gcc_qupv3_wrap1_s1_clk_src.clkr.hw, 1965 + }, 1966 + .num_parents = 1, 1967 + .flags = CLK_SET_RATE_PARENT, 1968 + .ops = &clk_branch2_ops, 1969 + }, 1970 + }, 1971 + }; 1972 + 1973 + static struct clk_branch gcc_qupv3_wrap1_s2_clk = { 1974 + .halt_reg = 0x183a4, 1975 + .halt_check = BRANCH_HALT_VOTED, 1976 + .clkr = { 1977 + .enable_reg = 0x5200c, 1978 + .enable_mask = BIT(24), 1979 + .hw.init = &(const struct clk_init_data) { 1980 + .name = "gcc_qupv3_wrap1_s2_clk", 1981 + .parent_hws = (const struct clk_hw*[]) { 1982 + &gcc_qupv3_wrap1_s2_clk_src.clkr.hw, 1983 + }, 1984 + .num_parents = 1, 1985 + .flags = CLK_SET_RATE_PARENT, 1986 + .ops = &clk_branch2_ops, 1987 + }, 1988 + }, 1989 + }; 1990 + 1991 + static struct clk_branch gcc_qupv3_wrap1_s3_clk = { 1992 + .halt_reg = 0x184d4, 1993 + .halt_check = BRANCH_HALT_VOTED, 1994 + .clkr = { 1995 + .enable_reg = 0x5200c, 1996 + .enable_mask = BIT(25), 1997 + .hw.init = &(const struct clk_init_data) { 1998 + .name = "gcc_qupv3_wrap1_s3_clk", 1999 + .parent_hws = (const struct clk_hw*[]) { 2000 + &gcc_qupv3_wrap1_s3_clk_src.clkr.hw, 2001 + }, 2002 + .num_parents = 1, 2003 + .flags = CLK_SET_RATE_PARENT, 2004 + .ops = &clk_branch2_ops, 2005 + }, 2006 + }, 2007 + }; 2008 + 2009 + static struct clk_branch gcc_qupv3_wrap1_s4_clk = { 2010 + .halt_reg = 0x18604, 2011 + .halt_check = BRANCH_HALT_VOTED, 2012 + .clkr = { 2013 + .enable_reg = 0x5200c, 2014 + .enable_mask = BIT(26), 2015 + .hw.init = &(const struct clk_init_data) { 2016 + .name = "gcc_qupv3_wrap1_s4_clk", 2017 + .parent_hws = (const struct clk_hw*[]) { 2018 + &gcc_qupv3_wrap1_s4_clk_src.clkr.hw, 2019 + }, 2020 + .num_parents = 1, 2021 + .flags = CLK_SET_RATE_PARENT, 2022 + .ops = &clk_branch2_ops, 2023 + }, 2024 + }, 2025 + }; 2026 + 2027 + static struct clk_branch gcc_qupv3_wrap1_s5_clk = { 2028 + .halt_reg = 0x18734, 2029 + .halt_check = BRANCH_HALT_VOTED, 2030 + .clkr = { 2031 + .enable_reg = 0x5200c, 2032 + .enable_mask = BIT(27), 2033 + .hw.init = &(const struct clk_init_data) { 2034 + .name = "gcc_qupv3_wrap1_s5_clk", 2035 + .parent_hws = (const struct clk_hw*[]) { 2036 + &gcc_qupv3_wrap1_s5_clk_src.clkr.hw, 2037 + }, 2038 + .num_parents = 1, 2039 + .flags = CLK_SET_RATE_PARENT, 2040 + .ops = &clk_branch2_ops, 2041 + }, 2042 + }, 2043 + }; 2044 + 2045 + static struct clk_branch gcc_qupv3_wrap_0_m_ahb_clk = { 2046 + .halt_reg = 0x17004, 2047 + .halt_check = BRANCH_HALT_VOTED, 2048 + .clkr = { 2049 + .enable_reg = 0x5200c, 2050 + .enable_mask = BIT(6), 2051 + .hw.init = &(const struct clk_init_data) { 2052 + .name = "gcc_qupv3_wrap_0_m_ahb_clk", 2053 + .ops = &clk_branch2_ops, 2054 + }, 2055 + }, 2056 + }; 2057 + 2058 + static struct clk_branch gcc_qupv3_wrap_0_s_ahb_clk = { 2059 + .halt_reg = 0x17008, 2060 + .halt_check = BRANCH_HALT_VOTED, 2061 + .hwcg_reg = 0x17008, 2062 + .hwcg_bit = 1, 2063 + .clkr = { 2064 + .enable_reg = 0x5200c, 2065 + .enable_mask = BIT(7), 2066 + .hw.init = &(const struct clk_init_data) { 2067 + .name = "gcc_qupv3_wrap_0_s_ahb_clk", 2068 + .ops = &clk_branch2_ops, 2069 + }, 2070 + }, 2071 + }; 2072 + 2073 + static struct clk_branch gcc_qupv3_wrap_1_m_ahb_clk = { 2074 + .halt_reg = 0x18004, 2075 + .halt_check = BRANCH_HALT_VOTED, 2076 + .clkr = { 2077 + .enable_reg = 0x5200c, 2078 + .enable_mask = BIT(20), 2079 + .hw.init = &(const struct clk_init_data) { 2080 + .name = "gcc_qupv3_wrap_1_m_ahb_clk", 2081 + .ops = &clk_branch2_ops, 2082 + }, 2083 + }, 2084 + }; 2085 + 2086 + static struct clk_branch gcc_qupv3_wrap_1_s_ahb_clk = { 2087 + .halt_reg = 0x18008, 2088 + .halt_check = BRANCH_HALT_VOTED, 2089 + .hwcg_reg = 0x18008, 2090 + .hwcg_bit = 1, 2091 + .clkr = { 2092 + .enable_reg = 0x5200c, 2093 + .enable_mask = BIT(21), 2094 + .hw.init = &(const struct clk_init_data) { 2095 + .name = "gcc_qupv3_wrap_1_s_ahb_clk", 2096 + .ops = &clk_branch2_ops, 2097 + }, 2098 + }, 2099 + }; 2100 + 2101 + static struct clk_branch gcc_rx1_usb2_clkref_clk = { 2102 + .halt_reg = 0x8c030, 2103 + .halt_check = BRANCH_HALT, 2104 + .clkr = { 2105 + .enable_reg = 0x8c030, 2106 + .enable_mask = BIT(0), 2107 + .hw.init = &(const struct clk_init_data) { 2108 + .name = "gcc_rx1_usb2_clkref_clk", 2109 + .ops = &clk_branch2_ops, 2110 + }, 2111 + }, 2112 + }; 2113 + 2114 + static struct clk_branch gcc_rx3_usb2_clkref_clk = { 2115 + .halt_reg = 0x8c038, 2116 + .halt_check = BRANCH_HALT_VOTED, 2117 + .clkr = { 2118 + .enable_reg = 0x8c038, 2119 + .enable_mask = BIT(0), 2120 + .hw.init = &(const struct clk_init_data) { 2121 + .name = "gcc_rx3_usb2_clkref_clk", 2122 + .ops = &clk_branch2_ops, 2123 + }, 2124 + }, 2125 + }; 2126 + 2127 + static struct clk_branch gcc_sdcc1_ahb_clk = { 2128 + .halt_reg = 0x12008, 2129 + .halt_check = BRANCH_HALT, 2130 + .clkr = { 2131 + .enable_reg = 0x12008, 2132 + .enable_mask = BIT(0), 2133 + .hw.init = &(const struct clk_init_data) { 2134 + .name = "gcc_sdcc1_ahb_clk", 2135 + .ops = &clk_branch2_ops, 2136 + }, 2137 + }, 2138 + }; 2139 + 2140 + static struct clk_branch gcc_sdcc1_apps_clk = { 2141 + .halt_reg = 0x12004, 2142 + .halt_check = BRANCH_HALT, 2143 + .clkr = { 2144 + .enable_reg = 0x12004, 2145 + .enable_mask = BIT(0), 2146 + .hw.init = &(const struct clk_init_data) { 2147 + .name = "gcc_sdcc1_apps_clk", 2148 + .parent_hws = (const struct clk_hw*[]) { 2149 + &gcc_sdcc1_apps_clk_src.clkr.hw, 2150 + }, 2151 + .num_parents = 1, 2152 + .flags = CLK_SET_RATE_PARENT, 2153 + .ops = &clk_branch2_ops, 2154 + }, 2155 + }, 2156 + }; 2157 + 2158 + static struct clk_branch gcc_sdcc1_ice_core_clk = { 2159 + .halt_reg = 0x1200c, 2160 + .halt_check = BRANCH_HALT, 2161 + .clkr = { 2162 + .enable_reg = 0x1200c, 2163 + .enable_mask = BIT(0), 2164 + .hw.init = &(const struct clk_init_data) { 2165 + .name = "gcc_sdcc1_ice_core_clk", 2166 + .parent_hws = (const struct clk_hw*[]) { 2167 + &gcc_sdcc1_ice_core_clk_src.clkr.hw, 2168 + }, 2169 + .num_parents = 1, 2170 + .flags = CLK_SET_RATE_PARENT, 2171 + .ops = &clk_branch2_ops, 2172 + }, 2173 + }, 2174 + }; 2175 + 2176 + static struct clk_branch gcc_sdcc2_ahb_clk = { 2177 + .halt_reg = 0x14008, 2178 + .halt_check = BRANCH_HALT, 2179 + .clkr = { 2180 + .enable_reg = 0x14008, 2181 + .enable_mask = BIT(0), 2182 + .hw.init = &(const struct clk_init_data) { 2183 + .name = "gcc_sdcc2_ahb_clk", 2184 + .ops = &clk_branch2_ops, 2185 + }, 2186 + }, 2187 + }; 2188 + 2189 + static struct clk_branch gcc_sdcc2_apps_clk = { 2190 + .halt_reg = 0x14004, 2191 + .halt_check = BRANCH_HALT, 2192 + .clkr = { 2193 + .enable_reg = 0x14004, 2194 + .enable_mask = BIT(0), 2195 + .hw.init = &(const struct clk_init_data) { 2196 + .name = "gcc_sdcc2_apps_clk", 2197 + .parent_hws = (const struct clk_hw*[]) { 2198 + &gcc_sdcc2_apps_clk_src.clkr.hw, 2199 + }, 2200 + .num_parents = 1, 2201 + .flags = CLK_SET_RATE_PARENT, 2202 + .ops = &clk_branch2_ops, 2203 + }, 2204 + }, 2205 + }; 2206 + 2207 + static struct clk_branch gcc_sys_noc_cpuss_ahb_clk = { 2208 + .halt_reg = 0x4819c, 2209 + .halt_check = BRANCH_HALT_VOTED, 2210 + .clkr = { 2211 + .enable_reg = 0x52004, 2212 + .enable_mask = BIT(0), 2213 + .hw.init = &(struct clk_init_data) { 2214 + .name = "gcc_sys_noc_cpuss_ahb_clk", 2215 + .parent_data = &(const struct clk_parent_data) { 2216 + .hw = &gcc_cpuss_ahb_clk_src.clkr.hw, 2217 + }, 2218 + .num_parents = 1, 2219 + .flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT, 2220 + .ops = &clk_branch2_ops, 2221 + }, 2222 + }, 2223 + }; 2224 + 2225 + static struct clk_branch gcc_ufs_card_clkref_clk = { 2226 + .halt_reg = 0x8c004, 2227 + .halt_check = BRANCH_HALT_VOTED, 2228 + .clkr = { 2229 + .enable_reg = 0x8c004, 2230 + .enable_mask = BIT(0), 2231 + .hw.init = &(const struct clk_init_data) { 2232 + .name = "gcc_ufs_card_clkref_clk", 2233 + .ops = &clk_branch2_ops, 2234 + }, 2235 + }, 2236 + }; 2237 + 2238 + static struct clk_branch gcc_ufs_mem_clkref_clk = { 2239 + .halt_reg = 0x8c000, 2240 + .halt_check = BRANCH_HALT, 2241 + .clkr = { 2242 + .enable_reg = 0x8c000, 2243 + .enable_mask = BIT(0), 2244 + .hw.init = &(const struct clk_init_data) { 2245 + .name = "gcc_ufs_mem_clkref_clk", 2246 + .ops = &clk_branch2_ops, 2247 + }, 2248 + }, 2249 + }; 2250 + 2251 + static struct clk_branch gcc_ufs_phy_ahb_clk = { 2252 + .halt_reg = 0x77014, 2253 + .halt_check = BRANCH_HALT_VOTED, 2254 + .hwcg_reg = 0x77014, 2255 + .hwcg_bit = 1, 2256 + .clkr = { 2257 + .enable_reg = 0x77014, 2258 + .enable_mask = BIT(0), 2259 + .hw.init = &(const struct clk_init_data) { 2260 + .name = "gcc_ufs_phy_ahb_clk", 2261 + .ops = &clk_branch2_ops, 2262 + }, 2263 + }, 2264 + }; 2265 + 2266 + static struct clk_branch gcc_ufs_phy_axi_clk = { 2267 + .halt_reg = 0x77010, 2268 + .halt_check = BRANCH_HALT, 2269 + .hwcg_reg = 0x77010, 2270 + .hwcg_bit = 1, 2271 + .clkr = { 2272 + .enable_reg = 0x77010, 2273 + .enable_mask = BIT(0), 2274 + .hw.init = &(const struct clk_init_data) { 2275 + .name = "gcc_ufs_phy_axi_clk", 2276 + .parent_hws = (const struct clk_hw*[]) { 2277 + &gcc_ufs_phy_axi_clk_src.clkr.hw, 2278 + }, 2279 + .num_parents = 1, 2280 + .flags = CLK_SET_RATE_PARENT, 2281 + .ops = &clk_branch2_ops, 2282 + }, 2283 + }, 2284 + }; 2285 + 2286 + static struct clk_branch gcc_ufs_phy_ice_core_clk = { 2287 + .halt_reg = 0x77044, 2288 + .halt_check = BRANCH_HALT, 2289 + .hwcg_reg = 0x77044, 2290 + .hwcg_bit = 1, 2291 + .clkr = { 2292 + .enable_reg = 0x77044, 2293 + .enable_mask = BIT(0), 2294 + .hw.init = &(const struct clk_init_data) { 2295 + .name = "gcc_ufs_phy_ice_core_clk", 2296 + .parent_hws = (const struct clk_hw*[]) { 2297 + &gcc_ufs_phy_ice_core_clk_src.clkr.hw, 2298 + }, 2299 + .num_parents = 1, 2300 + .flags = CLK_SET_RATE_PARENT, 2301 + .ops = &clk_branch2_ops, 2302 + }, 2303 + }, 2304 + }; 2305 + 2306 + static struct clk_branch gcc_ufs_phy_phy_aux_clk = { 2307 + .halt_reg = 0x77078, 2308 + .halt_check = BRANCH_HALT, 2309 + .hwcg_reg = 0x77078, 2310 + .hwcg_bit = 1, 2311 + .clkr = { 2312 + .enable_reg = 0x77078, 2313 + .enable_mask = BIT(0), 2314 + .hw.init = &(const struct clk_init_data) { 2315 + .name = "gcc_ufs_phy_phy_aux_clk", 2316 + .parent_hws = (const struct clk_hw*[]) { 2317 + &gcc_ufs_phy_phy_aux_clk_src.clkr.hw, 2318 + }, 2319 + .num_parents = 1, 2320 + .flags = CLK_SET_RATE_PARENT, 2321 + .ops = &clk_branch2_ops, 2322 + }, 2323 + }, 2324 + }; 2325 + 2326 + static struct clk_branch gcc_ufs_phy_rx_symbol_0_clk = { 2327 + .halt_reg = 0x7701c, 2328 + .halt_check = BRANCH_HALT_DELAY, 2329 + .clkr = { 2330 + .enable_reg = 0x7701c, 2331 + .enable_mask = BIT(0), 2332 + .hw.init = &(const struct clk_init_data) { 2333 + .name = "gcc_ufs_phy_rx_symbol_0_clk", 2334 + .ops = &clk_branch2_ops, 2335 + }, 2336 + }, 2337 + }; 2338 + 2339 + static struct clk_branch gcc_ufs_phy_tx_symbol_0_clk = { 2340 + .halt_reg = 0x77018, 2341 + .halt_check = BRANCH_HALT_DELAY, 2342 + .clkr = { 2343 + .enable_reg = 0x77018, 2344 + .enable_mask = BIT(0), 2345 + .hw.init = &(const struct clk_init_data) { 2346 + .name = "gcc_ufs_phy_tx_symbol_0_clk", 2347 + .ops = &clk_branch2_ops, 2348 + }, 2349 + }, 2350 + }; 2351 + 2352 + static struct clk_branch gcc_ufs_phy_unipro_core_clk = { 2353 + .halt_reg = 0x77040, 2354 + .halt_check = BRANCH_HALT, 2355 + .hwcg_reg = 0x77040, 2356 + .hwcg_bit = 1, 2357 + .clkr = { 2358 + .enable_reg = 0x77040, 2359 + .enable_mask = BIT(0), 2360 + .hw.init = &(const struct clk_init_data) { 2361 + .name = "gcc_ufs_phy_unipro_core_clk", 2362 + .parent_hws = (const struct clk_hw*[]) { 2363 + &gcc_ufs_phy_unipro_core_clk_src.clkr.hw, 2364 + }, 2365 + .num_parents = 1, 2366 + .flags = CLK_SET_RATE_PARENT, 2367 + .ops = &clk_branch2_ops, 2368 + }, 2369 + }, 2370 + }; 2371 + 2372 + static struct clk_branch gcc_usb20_sec_master_clk = { 2373 + .halt_reg = 0xa6010, 2374 + .halt_check = BRANCH_HALT_VOTED, 2375 + .clkr = { 2376 + .enable_reg = 0xa6010, 2377 + .enable_mask = BIT(0), 2378 + .hw.init = &(const struct clk_init_data) { 2379 + .name = "gcc_usb20_sec_master_clk", 2380 + .parent_hws = (const struct clk_hw*[]) { 2381 + &gcc_usb20_sec_master_clk_src.clkr.hw, 2382 + }, 2383 + .num_parents = 1, 2384 + .flags = CLK_SET_RATE_PARENT, 2385 + .ops = &clk_branch2_ops, 2386 + }, 2387 + }, 2388 + }; 2389 + 2390 + static struct clk_branch gcc_usb20_sec_mock_utmi_clk = { 2391 + .halt_reg = 0xa6018, 2392 + .halt_check = BRANCH_HALT, 2393 + .clkr = { 2394 + .enable_reg = 0xa6018, 2395 + .enable_mask = BIT(0), 2396 + .hw.init = &(const struct clk_init_data) { 2397 + .name = "gcc_usb20_sec_mock_utmi_clk", 2398 + .parent_hws = (const struct clk_hw*[]) { 2399 + &gcc_usb20_sec_mock_utmi_clk_src.clkr.hw, 2400 + }, 2401 + .num_parents = 1, 2402 + .flags = CLK_SET_RATE_PARENT, 2403 + .ops = &clk_branch2_ops, 2404 + }, 2405 + }, 2406 + }; 2407 + 2408 + static struct clk_branch gcc_usb20_sec_sleep_clk = { 2409 + .halt_reg = 0xa6014, 2410 + .halt_check = BRANCH_HALT, 2411 + .clkr = { 2412 + .enable_reg = 0xa6014, 2413 + .enable_mask = BIT(0), 2414 + .hw.init = &(const struct clk_init_data) { 2415 + .name = "gcc_usb20_sec_sleep_clk", 2416 + .ops = &clk_branch2_ops, 2417 + }, 2418 + }, 2419 + }; 2420 + 2421 + static struct clk_branch gcc_usb2_prim_clkref_clk = { 2422 + .halt_reg = 0x8c028, 2423 + .halt_check = BRANCH_HALT_VOTED, 2424 + .clkr = { 2425 + .enable_reg = 0x8c028, 2426 + .enable_mask = BIT(0), 2427 + .hw.init = &(const struct clk_init_data) { 2428 + .name = "gcc_usb2_prim_clkref_clk", 2429 + .ops = &clk_branch2_ops, 2430 + }, 2431 + }, 2432 + }; 2433 + 2434 + static struct clk_branch gcc_usb2_sec_clkref_clk = { 2435 + .halt_reg = 0x8c018, 2436 + .halt_check = BRANCH_HALT_VOTED, 2437 + .clkr = { 2438 + .enable_reg = 0x8c018, 2439 + .enable_mask = BIT(0), 2440 + .hw.init = &(const struct clk_init_data) { 2441 + .name = "gcc_usb2_sec_clkref_clk", 2442 + .ops = &clk_branch2_ops, 2443 + }, 2444 + }, 2445 + }; 2446 + 2447 + static struct clk_branch gcc_usb2_sec_phy_aux_clk = { 2448 + .halt_reg = 0xa6050, 2449 + .halt_check = BRANCH_HALT, 2450 + .clkr = { 2451 + .enable_reg = 0xa6050, 2452 + .enable_mask = BIT(0), 2453 + .hw.init = &(const struct clk_init_data) { 2454 + .name = "gcc_usb2_sec_phy_aux_clk", 2455 + .parent_hws = (const struct clk_hw*[]) { 2456 + &gcc_usb2_sec_phy_aux_clk_src.clkr.hw, 2457 + }, 2458 + .num_parents = 1, 2459 + .flags = CLK_SET_RATE_PARENT, 2460 + .ops = &clk_branch2_ops, 2461 + }, 2462 + }, 2463 + }; 2464 + 2465 + static struct clk_branch gcc_usb2_sec_phy_com_aux_clk = { 2466 + .halt_reg = 0xa6054, 2467 + .halt_check = BRANCH_HALT, 2468 + .clkr = { 2469 + .enable_reg = 0xa6054, 2470 + .enable_mask = BIT(0), 2471 + .hw.init = &(const struct clk_init_data) { 2472 + .name = "gcc_usb2_sec_phy_com_aux_clk", 2473 + .parent_hws = (const struct clk_hw*[]) { 2474 + &gcc_usb2_sec_phy_aux_clk_src.clkr.hw, 2475 + }, 2476 + .num_parents = 1, 2477 + .flags = CLK_SET_RATE_PARENT, 2478 + .ops = &clk_branch2_ops, 2479 + }, 2480 + }, 2481 + }; 2482 + 2483 + static struct clk_branch gcc_usb2_sec_phy_pipe_clk = { 2484 + .halt_reg = 0xa6058, 2485 + .halt_check = BRANCH_HALT_SKIP, 2486 + .clkr = { 2487 + .enable_reg = 0xa6058, 2488 + .enable_mask = BIT(0), 2489 + .hw.init = &(const struct clk_init_data) { 2490 + .name = "gcc_usb2_sec_phy_pipe_clk", 2491 + .ops = &clk_branch2_ops, 2492 + }, 2493 + }, 2494 + }; 2495 + 2496 + static struct clk_branch gcc_usb30_prim_master_clk = { 2497 + .halt_reg = 0xf010, 2498 + .halt_check = BRANCH_HALT_VOTED, 2499 + .clkr = { 2500 + .enable_reg = 0xf010, 2501 + .enable_mask = BIT(0), 2502 + .hw.init = &(const struct clk_init_data) { 2503 + .name = "gcc_usb30_prim_master_clk", 2504 + .parent_hws = (const struct clk_hw*[]) { 2505 + &gcc_usb30_prim_master_clk_src.clkr.hw, 2506 + }, 2507 + .num_parents = 1, 2508 + .flags = CLK_SET_RATE_PARENT, 2509 + .ops = &clk_branch2_ops, 2510 + }, 2511 + }, 2512 + }; 2513 + 2514 + static struct clk_branch gcc_usb30_prim_mock_utmi_clk = { 2515 + .halt_reg = 0xf018, 2516 + .halt_check = BRANCH_HALT, 2517 + .clkr = { 2518 + .enable_reg = 0xf018, 2519 + .enable_mask = BIT(0), 2520 + .hw.init = &(const struct clk_init_data) { 2521 + .name = "gcc_usb30_prim_mock_utmi_clk", 2522 + .parent_hws = (const struct clk_hw*[]) { 2523 + &gcc_usb30_prim_mock_utmi_clk_src.clkr.hw, 2524 + }, 2525 + .num_parents = 1, 2526 + .flags = CLK_SET_RATE_PARENT, 2527 + .ops = &clk_branch2_ops, 2528 + }, 2529 + }, 2530 + }; 2531 + 2532 + static struct clk_branch gcc_usb30_prim_sleep_clk = { 2533 + .halt_reg = 0xf014, 2534 + .halt_check = BRANCH_HALT, 2535 + .clkr = { 2536 + .enable_reg = 0xf014, 2537 + .enable_mask = BIT(0), 2538 + .hw.init = &(const struct clk_init_data) { 2539 + .name = "gcc_usb30_prim_sleep_clk", 2540 + .ops = &clk_branch2_ops, 2541 + }, 2542 + }, 2543 + }; 2544 + 2545 + static struct clk_branch gcc_usb3_prim_clkref_clk = { 2546 + .halt_reg = 0x8c014, 2547 + .halt_check = BRANCH_HALT_DELAY, 2548 + .clkr = { 2549 + .enable_reg = 0x8c014, 2550 + .enable_mask = BIT(0), 2551 + .hw.init = &(const struct clk_init_data) { 2552 + .name = "gcc_usb3_prim_clkref_clk", 2553 + .ops = &clk_branch2_ops, 2554 + }, 2555 + }, 2556 + }; 2557 + 2558 + static struct clk_branch gcc_usb3_prim_phy_aux_clk = { 2559 + .halt_reg = 0xf050, 2560 + .halt_check = BRANCH_HALT, 2561 + .clkr = { 2562 + .enable_reg = 0xf050, 2563 + .enable_mask = BIT(0), 2564 + .hw.init = &(const struct clk_init_data) { 2565 + .name = "gcc_usb3_prim_phy_aux_clk", 2566 + .parent_hws = (const struct clk_hw*[]) { 2567 + &gcc_usb3_prim_phy_aux_clk_src.clkr.hw, 2568 + }, 2569 + .num_parents = 1, 2570 + .flags = CLK_SET_RATE_PARENT, 2571 + .ops = &clk_branch2_ops, 2572 + }, 2573 + }, 2574 + }; 2575 + 2576 + static struct clk_branch gcc_usb3_prim_phy_com_aux_clk = { 2577 + .halt_reg = 0xf054, 2578 + .halt_check = BRANCH_HALT, 2579 + .clkr = { 2580 + .enable_reg = 0xf054, 2581 + .enable_mask = BIT(0), 2582 + .hw.init = &(const struct clk_init_data) { 2583 + .name = "gcc_usb3_prim_phy_com_aux_clk", 2584 + .parent_hws = (const struct clk_hw*[]) { 2585 + &gcc_usb3_prim_phy_aux_clk_src.clkr.hw, 2586 + }, 2587 + .num_parents = 1, 2588 + .flags = CLK_SET_RATE_PARENT, 2589 + .ops = &clk_branch2_ops, 2590 + }, 2591 + }, 2592 + }; 2593 + 2594 + static struct clk_branch gcc_usb3_prim_phy_pipe_clk = { 2595 + .halt_reg = 0xf058, 2596 + .halt_check = BRANCH_HALT_SKIP, 2597 + .clkr = { 2598 + .enable_reg = 0xf058, 2599 + .enable_mask = BIT(0), 2600 + .hw.init = &(const struct clk_init_data) { 2601 + .name = "gcc_usb3_prim_phy_pipe_clk", 2602 + .ops = &clk_branch2_ops, 2603 + }, 2604 + }, 2605 + }; 2606 + 2607 + static struct clk_branch gcc_usb3_sec_clkref_clk = { 2608 + .halt_reg = 0x8c008, 2609 + .halt_check = BRANCH_HALT_DELAY, 2610 + .clkr = { 2611 + .enable_reg = 0x8c008, 2612 + .enable_mask = BIT(0), 2613 + .hw.init = &(const struct clk_init_data) { 2614 + .name = "gcc_usb3_sec_clkref_clk", 2615 + .ops = &clk_branch2_ops, 2616 + }, 2617 + }, 2618 + }; 2619 + 2620 + static struct clk_branch gcc_video_axi0_clk = { 2621 + .halt_reg = 0xb024, 2622 + .halt_check = BRANCH_HALT_VOTED, 2623 + .clkr = { 2624 + .enable_reg = 0xb024, 2625 + .enable_mask = BIT(0), 2626 + .hw.init = &(const struct clk_init_data) { 2627 + .name = "gcc_video_axi0_clk", 2628 + .ops = &clk_branch2_ops, 2629 + }, 2630 + }, 2631 + }; 2632 + 2633 + static struct clk_hw *gcc_qcs615_hws[] = { 2634 + [GPLL0_OUT_AUX2_DIV] = &gpll0_out_aux2_div.hw, 2635 + [GPLL3_OUT_AUX2_DIV] = &gpll3_out_aux2_div.hw, 2636 + }; 2637 + 2638 + static struct gdsc emac_gdsc = { 2639 + .gdscr = 0x6004, 2640 + .en_rest_wait_val = 0x2, 2641 + .en_few_wait_val = 0x2, 2642 + .clk_dis_wait_val = 0x2, 2643 + .pd = { 2644 + .name = "emac_gdsc", 2645 + }, 2646 + .pwrsts = PWRSTS_OFF_ON, 2647 + }; 2648 + 2649 + static struct gdsc pcie_0_gdsc = { 2650 + .gdscr = 0x6b004, 2651 + .en_rest_wait_val = 0x2, 2652 + .en_few_wait_val = 0x2, 2653 + .clk_dis_wait_val = 0x2, 2654 + .pd = { 2655 + .name = "pcie_0_gdsc", 2656 + }, 2657 + .pwrsts = PWRSTS_OFF_ON, 2658 + }; 2659 + 2660 + static struct gdsc ufs_phy_gdsc = { 2661 + .gdscr = 0x77004, 2662 + .en_rest_wait_val = 0x2, 2663 + .en_few_wait_val = 0x2, 2664 + .clk_dis_wait_val = 0x2, 2665 + .pd = { 2666 + .name = "ufs_phy_gdsc", 2667 + }, 2668 + .pwrsts = PWRSTS_OFF_ON, 2669 + }; 2670 + 2671 + static struct gdsc usb20_sec_gdsc = { 2672 + .gdscr = 0xa6004, 2673 + .en_rest_wait_val = 0x2, 2674 + .en_few_wait_val = 0x2, 2675 + .clk_dis_wait_val = 0x2, 2676 + .pd = { 2677 + .name = "usb20_sec_gdsc", 2678 + }, 2679 + .pwrsts = PWRSTS_OFF_ON, 2680 + }; 2681 + 2682 + static struct gdsc usb30_prim_gdsc = { 2683 + .gdscr = 0xf004, 2684 + .en_rest_wait_val = 0x2, 2685 + .en_few_wait_val = 0x2, 2686 + .clk_dis_wait_val = 0x2, 2687 + .pd = { 2688 + .name = "usb30_prim_gdsc", 2689 + }, 2690 + .pwrsts = PWRSTS_OFF_ON, 2691 + }; 2692 + 2693 + static struct gdsc hlos1_vote_aggre_noc_mmu_audio_tbu_gdsc = { 2694 + .gdscr = 0x7d040, 2695 + .pd = { 2696 + .name = "hlos1_vote_aggre_noc_mmu_audio_tbu", 2697 + }, 2698 + .pwrsts = PWRSTS_OFF_ON, 2699 + .flags = VOTABLE, 2700 + }; 2701 + 2702 + static struct gdsc hlos1_vote_aggre_noc_mmu_tbu1_gdsc = { 2703 + .gdscr = 0x7d044, 2704 + .pd = { 2705 + .name = "hlos1_vote_aggre_noc_mmu_tbu1", 2706 + }, 2707 + .pwrsts = PWRSTS_OFF_ON, 2708 + .flags = VOTABLE, 2709 + }; 2710 + 2711 + static struct gdsc hlos1_vote_aggre_noc_mmu_tbu2_gdsc = { 2712 + .gdscr = 0x7d048, 2713 + .pd = { 2714 + .name = "hlos1_vote_aggre_noc_mmu_tbu2", 2715 + }, 2716 + .pwrsts = PWRSTS_OFF_ON, 2717 + .flags = VOTABLE, 2718 + }; 2719 + 2720 + static struct gdsc hlos1_vote_aggre_noc_mmu_pcie_tbu_gdsc = { 2721 + .gdscr = 0x7d04c, 2722 + .pd = { 2723 + .name = "hlos1_vote_aggre_noc_mmu_pcie_tbu", 2724 + }, 2725 + .pwrsts = PWRSTS_OFF_ON, 2726 + .flags = VOTABLE, 2727 + }; 2728 + 2729 + static struct gdsc hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc = { 2730 + .gdscr = 0x7d050, 2731 + .pd = { 2732 + .name = "hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc", 2733 + }, 2734 + .pwrsts = PWRSTS_OFF_ON, 2735 + .flags = VOTABLE, 2736 + }; 2737 + 2738 + static struct gdsc hlos1_vote_mmnoc_mmu_tbu_sf_gdsc = { 2739 + .gdscr = 0x7d054, 2740 + .pd = { 2741 + .name = "hlos1_vote_mmnoc_mmu_tbu_sf_gdsc", 2742 + }, 2743 + .pwrsts = PWRSTS_OFF_ON, 2744 + .flags = VOTABLE, 2745 + }; 2746 + 2747 + static struct gdsc hlos1_vote_mmnoc_mmu_tbu_hf1_gdsc = { 2748 + .gdscr = 0x7d058, 2749 + .pd = { 2750 + .name = "hlos1_vote_mmnoc_mmu_tbu_hf1_gdsc", 2751 + }, 2752 + .pwrsts = PWRSTS_OFF_ON, 2753 + .flags = VOTABLE, 2754 + }; 2755 + 2756 + static struct clk_regmap *gcc_qcs615_clocks[] = { 2757 + [GCC_AGGRE_UFS_PHY_AXI_CLK] = &gcc_aggre_ufs_phy_axi_clk.clkr, 2758 + [GCC_AGGRE_USB2_SEC_AXI_CLK] = &gcc_aggre_usb2_sec_axi_clk.clkr, 2759 + [GCC_AGGRE_USB3_PRIM_AXI_CLK] = &gcc_aggre_usb3_prim_axi_clk.clkr, 2760 + [GCC_AHB2PHY_EAST_CLK] = &gcc_ahb2phy_east_clk.clkr, 2761 + [GCC_AHB2PHY_WEST_CLK] = &gcc_ahb2phy_west_clk.clkr, 2762 + [GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr, 2763 + [GCC_CAMERA_HF_AXI_CLK] = &gcc_camera_hf_axi_clk.clkr, 2764 + [GCC_CE1_AHB_CLK] = &gcc_ce1_ahb_clk.clkr, 2765 + [GCC_CE1_AXI_CLK] = &gcc_ce1_axi_clk.clkr, 2766 + [GCC_CE1_CLK] = &gcc_ce1_clk.clkr, 2767 + [GCC_CFG_NOC_USB2_SEC_AXI_CLK] = &gcc_cfg_noc_usb2_sec_axi_clk.clkr, 2768 + [GCC_CFG_NOC_USB3_PRIM_AXI_CLK] = &gcc_cfg_noc_usb3_prim_axi_clk.clkr, 2769 + [GCC_CPUSS_AHB_CLK] = &gcc_cpuss_ahb_clk.clkr, 2770 + [GCC_CPUSS_AHB_CLK_SRC] = &gcc_cpuss_ahb_clk_src.clkr, 2771 + [GCC_DDRSS_GPU_AXI_CLK] = &gcc_ddrss_gpu_axi_clk.clkr, 2772 + [GCC_DISP_GPLL0_DIV_CLK_SRC] = &gcc_disp_gpll0_div_clk_src.clkr, 2773 + [GCC_DISP_HF_AXI_CLK] = &gcc_disp_hf_axi_clk.clkr, 2774 + [GCC_EMAC_AXI_CLK] = &gcc_emac_axi_clk.clkr, 2775 + [GCC_EMAC_PTP_CLK] = &gcc_emac_ptp_clk.clkr, 2776 + [GCC_EMAC_PTP_CLK_SRC] = &gcc_emac_ptp_clk_src.clkr, 2777 + [GCC_EMAC_RGMII_CLK] = &gcc_emac_rgmii_clk.clkr, 2778 + [GCC_EMAC_RGMII_CLK_SRC] = &gcc_emac_rgmii_clk_src.clkr, 2779 + [GCC_EMAC_SLV_AHB_CLK] = &gcc_emac_slv_ahb_clk.clkr, 2780 + [GCC_GP1_CLK] = &gcc_gp1_clk.clkr, 2781 + [GCC_GP1_CLK_SRC] = &gcc_gp1_clk_src.clkr, 2782 + [GCC_GP2_CLK] = &gcc_gp2_clk.clkr, 2783 + [GCC_GP2_CLK_SRC] = &gcc_gp2_clk_src.clkr, 2784 + [GCC_GP3_CLK] = &gcc_gp3_clk.clkr, 2785 + [GCC_GP3_CLK_SRC] = &gcc_gp3_clk_src.clkr, 2786 + [GCC_GPU_GPLL0_CLK_SRC] = &gcc_gpu_gpll0_clk_src.clkr, 2787 + [GCC_GPU_GPLL0_DIV_CLK_SRC] = &gcc_gpu_gpll0_div_clk_src.clkr, 2788 + [GCC_GPU_IREF_CLK] = &gcc_gpu_iref_clk.clkr, 2789 + [GCC_GPU_MEMNOC_GFX_CLK] = &gcc_gpu_memnoc_gfx_clk.clkr, 2790 + [GCC_GPU_SNOC_DVM_GFX_CLK] = &gcc_gpu_snoc_dvm_gfx_clk.clkr, 2791 + [GCC_PCIE0_PHY_REFGEN_CLK] = &gcc_pcie0_phy_refgen_clk.clkr, 2792 + [GCC_PCIE_0_AUX_CLK] = &gcc_pcie_0_aux_clk.clkr, 2793 + [GCC_PCIE_0_AUX_CLK_SRC] = &gcc_pcie_0_aux_clk_src.clkr, 2794 + [GCC_PCIE_0_CFG_AHB_CLK] = &gcc_pcie_0_cfg_ahb_clk.clkr, 2795 + [GCC_PCIE_0_CLKREF_CLK] = &gcc_pcie_0_clkref_clk.clkr, 2796 + [GCC_PCIE_0_MSTR_AXI_CLK] = &gcc_pcie_0_mstr_axi_clk.clkr, 2797 + [GCC_PCIE_0_PIPE_CLK] = &gcc_pcie_0_pipe_clk.clkr, 2798 + [GCC_PCIE_0_SLV_AXI_CLK] = &gcc_pcie_0_slv_axi_clk.clkr, 2799 + [GCC_PCIE_0_SLV_Q2A_AXI_CLK] = &gcc_pcie_0_slv_q2a_axi_clk.clkr, 2800 + [GCC_PCIE_PHY_AUX_CLK] = &gcc_pcie_phy_aux_clk.clkr, 2801 + [GCC_PCIE_PHY_REFGEN_CLK_SRC] = &gcc_pcie_phy_refgen_clk_src.clkr, 2802 + [GCC_PDM2_CLK] = &gcc_pdm2_clk.clkr, 2803 + [GCC_PDM2_CLK_SRC] = &gcc_pdm2_clk_src.clkr, 2804 + [GCC_PDM_AHB_CLK] = &gcc_pdm_ahb_clk.clkr, 2805 + [GCC_PDM_XO4_CLK] = &gcc_pdm_xo4_clk.clkr, 2806 + [GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr, 2807 + [GCC_QMIP_CAMERA_NRT_AHB_CLK] = &gcc_qmip_camera_nrt_ahb_clk.clkr, 2808 + [GCC_QMIP_DISP_AHB_CLK] = &gcc_qmip_disp_ahb_clk.clkr, 2809 + [GCC_QMIP_PCIE_AHB_CLK] = &gcc_qmip_pcie_ahb_clk.clkr, 2810 + [GCC_QMIP_VIDEO_VCODEC_AHB_CLK] = &gcc_qmip_video_vcodec_ahb_clk.clkr, 2811 + [GCC_QSPI_CNOC_PERIPH_AHB_CLK] = &gcc_qspi_cnoc_periph_ahb_clk.clkr, 2812 + [GCC_QSPI_CORE_CLK] = &gcc_qspi_core_clk.clkr, 2813 + [GCC_QSPI_CORE_CLK_SRC] = &gcc_qspi_core_clk_src.clkr, 2814 + [GCC_QUPV3_WRAP0_CORE_2X_CLK] = &gcc_qupv3_wrap0_core_2x_clk.clkr, 2815 + [GCC_QUPV3_WRAP0_CORE_CLK] = &gcc_qupv3_wrap0_core_clk.clkr, 2816 + [GCC_QUPV3_WRAP0_S0_CLK] = &gcc_qupv3_wrap0_s0_clk.clkr, 2817 + [GCC_QUPV3_WRAP0_S0_CLK_SRC] = &gcc_qupv3_wrap0_s0_clk_src.clkr, 2818 + [GCC_QUPV3_WRAP0_S1_CLK] = &gcc_qupv3_wrap0_s1_clk.clkr, 2819 + [GCC_QUPV3_WRAP0_S1_CLK_SRC] = &gcc_qupv3_wrap0_s1_clk_src.clkr, 2820 + [GCC_QUPV3_WRAP0_S2_CLK] = &gcc_qupv3_wrap0_s2_clk.clkr, 2821 + [GCC_QUPV3_WRAP0_S2_CLK_SRC] = &gcc_qupv3_wrap0_s2_clk_src.clkr, 2822 + [GCC_QUPV3_WRAP0_S3_CLK] = &gcc_qupv3_wrap0_s3_clk.clkr, 2823 + [GCC_QUPV3_WRAP0_S3_CLK_SRC] = &gcc_qupv3_wrap0_s3_clk_src.clkr, 2824 + [GCC_QUPV3_WRAP0_S4_CLK] = &gcc_qupv3_wrap0_s4_clk.clkr, 2825 + [GCC_QUPV3_WRAP0_S4_CLK_SRC] = &gcc_qupv3_wrap0_s4_clk_src.clkr, 2826 + [GCC_QUPV3_WRAP0_S5_CLK] = &gcc_qupv3_wrap0_s5_clk.clkr, 2827 + [GCC_QUPV3_WRAP0_S5_CLK_SRC] = &gcc_qupv3_wrap0_s5_clk_src.clkr, 2828 + [GCC_QUPV3_WRAP1_CORE_2X_CLK] = &gcc_qupv3_wrap1_core_2x_clk.clkr, 2829 + [GCC_QUPV3_WRAP1_CORE_CLK] = &gcc_qupv3_wrap1_core_clk.clkr, 2830 + [GCC_QUPV3_WRAP1_S0_CLK] = &gcc_qupv3_wrap1_s0_clk.clkr, 2831 + [GCC_QUPV3_WRAP1_S0_CLK_SRC] = &gcc_qupv3_wrap1_s0_clk_src.clkr, 2832 + [GCC_QUPV3_WRAP1_S1_CLK] = &gcc_qupv3_wrap1_s1_clk.clkr, 2833 + [GCC_QUPV3_WRAP1_S1_CLK_SRC] = &gcc_qupv3_wrap1_s1_clk_src.clkr, 2834 + [GCC_QUPV3_WRAP1_S2_CLK] = &gcc_qupv3_wrap1_s2_clk.clkr, 2835 + [GCC_QUPV3_WRAP1_S2_CLK_SRC] = &gcc_qupv3_wrap1_s2_clk_src.clkr, 2836 + [GCC_QUPV3_WRAP1_S3_CLK] = &gcc_qupv3_wrap1_s3_clk.clkr, 2837 + [GCC_QUPV3_WRAP1_S3_CLK_SRC] = &gcc_qupv3_wrap1_s3_clk_src.clkr, 2838 + [GCC_QUPV3_WRAP1_S4_CLK] = &gcc_qupv3_wrap1_s4_clk.clkr, 2839 + [GCC_QUPV3_WRAP1_S4_CLK_SRC] = &gcc_qupv3_wrap1_s4_clk_src.clkr, 2840 + [GCC_QUPV3_WRAP1_S5_CLK] = &gcc_qupv3_wrap1_s5_clk.clkr, 2841 + [GCC_QUPV3_WRAP1_S5_CLK_SRC] = &gcc_qupv3_wrap1_s5_clk_src.clkr, 2842 + [GCC_QUPV3_WRAP_0_M_AHB_CLK] = &gcc_qupv3_wrap_0_m_ahb_clk.clkr, 2843 + [GCC_QUPV3_WRAP_0_S_AHB_CLK] = &gcc_qupv3_wrap_0_s_ahb_clk.clkr, 2844 + [GCC_QUPV3_WRAP_1_M_AHB_CLK] = &gcc_qupv3_wrap_1_m_ahb_clk.clkr, 2845 + [GCC_QUPV3_WRAP_1_S_AHB_CLK] = &gcc_qupv3_wrap_1_s_ahb_clk.clkr, 2846 + [GCC_RX1_USB2_CLKREF_CLK] = &gcc_rx1_usb2_clkref_clk.clkr, 2847 + [GCC_RX3_USB2_CLKREF_CLK] = &gcc_rx3_usb2_clkref_clk.clkr, 2848 + [GCC_SDCC1_AHB_CLK] = &gcc_sdcc1_ahb_clk.clkr, 2849 + [GCC_SDCC1_APPS_CLK] = &gcc_sdcc1_apps_clk.clkr, 2850 + [GCC_SDCC1_APPS_CLK_SRC] = &gcc_sdcc1_apps_clk_src.clkr, 2851 + [GCC_SDCC1_ICE_CORE_CLK] = &gcc_sdcc1_ice_core_clk.clkr, 2852 + [GCC_SDCC1_ICE_CORE_CLK_SRC] = &gcc_sdcc1_ice_core_clk_src.clkr, 2853 + [GCC_SDCC2_AHB_CLK] = &gcc_sdcc2_ahb_clk.clkr, 2854 + [GCC_SDCC2_APPS_CLK] = &gcc_sdcc2_apps_clk.clkr, 2855 + [GCC_SDCC2_APPS_CLK_SRC] = &gcc_sdcc2_apps_clk_src.clkr, 2856 + [GCC_SYS_NOC_CPUSS_AHB_CLK] = &gcc_sys_noc_cpuss_ahb_clk.clkr, 2857 + [GCC_UFS_CARD_CLKREF_CLK] = &gcc_ufs_card_clkref_clk.clkr, 2858 + [GCC_UFS_MEM_CLKREF_CLK] = &gcc_ufs_mem_clkref_clk.clkr, 2859 + [GCC_UFS_PHY_AHB_CLK] = &gcc_ufs_phy_ahb_clk.clkr, 2860 + [GCC_UFS_PHY_AXI_CLK] = &gcc_ufs_phy_axi_clk.clkr, 2861 + [GCC_UFS_PHY_AXI_CLK_SRC] = &gcc_ufs_phy_axi_clk_src.clkr, 2862 + [GCC_UFS_PHY_ICE_CORE_CLK] = &gcc_ufs_phy_ice_core_clk.clkr, 2863 + [GCC_UFS_PHY_ICE_CORE_CLK_SRC] = &gcc_ufs_phy_ice_core_clk_src.clkr, 2864 + [GCC_UFS_PHY_PHY_AUX_CLK] = &gcc_ufs_phy_phy_aux_clk.clkr, 2865 + [GCC_UFS_PHY_PHY_AUX_CLK_SRC] = &gcc_ufs_phy_phy_aux_clk_src.clkr, 2866 + [GCC_UFS_PHY_RX_SYMBOL_0_CLK] = &gcc_ufs_phy_rx_symbol_0_clk.clkr, 2867 + [GCC_UFS_PHY_TX_SYMBOL_0_CLK] = &gcc_ufs_phy_tx_symbol_0_clk.clkr, 2868 + [GCC_UFS_PHY_UNIPRO_CORE_CLK] = &gcc_ufs_phy_unipro_core_clk.clkr, 2869 + [GCC_UFS_PHY_UNIPRO_CORE_CLK_SRC] = &gcc_ufs_phy_unipro_core_clk_src.clkr, 2870 + [GCC_USB20_SEC_MASTER_CLK] = &gcc_usb20_sec_master_clk.clkr, 2871 + [GCC_USB20_SEC_MASTER_CLK_SRC] = &gcc_usb20_sec_master_clk_src.clkr, 2872 + [GCC_USB20_SEC_MOCK_UTMI_CLK] = &gcc_usb20_sec_mock_utmi_clk.clkr, 2873 + [GCC_USB20_SEC_MOCK_UTMI_CLK_SRC] = &gcc_usb20_sec_mock_utmi_clk_src.clkr, 2874 + [GCC_USB20_SEC_SLEEP_CLK] = &gcc_usb20_sec_sleep_clk.clkr, 2875 + [GCC_USB2_PRIM_CLKREF_CLK] = &gcc_usb2_prim_clkref_clk.clkr, 2876 + [GCC_USB2_SEC_CLKREF_CLK] = &gcc_usb2_sec_clkref_clk.clkr, 2877 + [GCC_USB2_SEC_PHY_AUX_CLK] = &gcc_usb2_sec_phy_aux_clk.clkr, 2878 + [GCC_USB2_SEC_PHY_AUX_CLK_SRC] = &gcc_usb2_sec_phy_aux_clk_src.clkr, 2879 + [GCC_USB2_SEC_PHY_COM_AUX_CLK] = &gcc_usb2_sec_phy_com_aux_clk.clkr, 2880 + [GCC_USB2_SEC_PHY_PIPE_CLK] = &gcc_usb2_sec_phy_pipe_clk.clkr, 2881 + [GCC_USB30_PRIM_MASTER_CLK] = &gcc_usb30_prim_master_clk.clkr, 2882 + [GCC_USB30_PRIM_MASTER_CLK_SRC] = &gcc_usb30_prim_master_clk_src.clkr, 2883 + [GCC_USB30_PRIM_MOCK_UTMI_CLK] = &gcc_usb30_prim_mock_utmi_clk.clkr, 2884 + [GCC_USB30_PRIM_MOCK_UTMI_CLK_SRC] = &gcc_usb30_prim_mock_utmi_clk_src.clkr, 2885 + [GCC_USB30_PRIM_SLEEP_CLK] = &gcc_usb30_prim_sleep_clk.clkr, 2886 + [GCC_USB3_PRIM_CLKREF_CLK] = &gcc_usb3_prim_clkref_clk.clkr, 2887 + [GCC_USB3_PRIM_PHY_AUX_CLK] = &gcc_usb3_prim_phy_aux_clk.clkr, 2888 + [GCC_USB3_PRIM_PHY_AUX_CLK_SRC] = &gcc_usb3_prim_phy_aux_clk_src.clkr, 2889 + [GCC_USB3_PRIM_PHY_COM_AUX_CLK] = &gcc_usb3_prim_phy_com_aux_clk.clkr, 2890 + [GCC_USB3_PRIM_PHY_PIPE_CLK] = &gcc_usb3_prim_phy_pipe_clk.clkr, 2891 + [GCC_USB3_SEC_CLKREF_CLK] = &gcc_usb3_sec_clkref_clk.clkr, 2892 + [GCC_VIDEO_AXI0_CLK] = &gcc_video_axi0_clk.clkr, 2893 + [GCC_VSENSOR_CLK_SRC] = &gcc_vsensor_clk_src.clkr, 2894 + [GPLL0] = &gpll0.clkr, 2895 + [GPLL3] = &gpll3.clkr, 2896 + [GPLL4] = &gpll4.clkr, 2897 + [GPLL6] = &gpll6.clkr, 2898 + [GPLL6_OUT_MAIN] = &gpll6_out_main.clkr, 2899 + [GPLL7] = &gpll7.clkr, 2900 + [GPLL8] = &gpll8.clkr, 2901 + [GPLL8_OUT_MAIN] = &gpll8_out_main.clkr, 2902 + }; 2903 + 2904 + static struct gdsc *gcc_qcs615_gdscs[] = { 2905 + [EMAC_GDSC] = &emac_gdsc, 2906 + [PCIE_0_GDSC] = &pcie_0_gdsc, 2907 + [UFS_PHY_GDSC] = &ufs_phy_gdsc, 2908 + [USB20_SEC_GDSC] = &usb20_sec_gdsc, 2909 + [USB30_PRIM_GDSC] = &usb30_prim_gdsc, 2910 + [HLOS1_VOTE_AGGRE_NOC_MMU_AUDIO_TBU_GDSC] = &hlos1_vote_aggre_noc_mmu_audio_tbu_gdsc, 2911 + [HLOS1_VOTE_AGGRE_NOC_MMU_TBU1_GDSC] = &hlos1_vote_aggre_noc_mmu_tbu1_gdsc, 2912 + [HLOS1_VOTE_AGGRE_NOC_MMU_TBU2_GDSC] = &hlos1_vote_aggre_noc_mmu_tbu2_gdsc, 2913 + [HLOS1_VOTE_AGGRE_NOC_MMU_PCIE_TBU_GDSC] = &hlos1_vote_aggre_noc_mmu_pcie_tbu_gdsc, 2914 + [HLOS1_VOTE_MMNOC_MMU_TBU_HF0_GDSC] = &hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc, 2915 + [HLOS1_VOTE_MMNOC_MMU_TBU_SF_GDSC] = &hlos1_vote_mmnoc_mmu_tbu_sf_gdsc, 2916 + [HLOS1_VOTE_MMNOC_MMU_TBU_HF1_GDSC] = &hlos1_vote_mmnoc_mmu_tbu_hf1_gdsc, 2917 + }; 2918 + 2919 + static const struct qcom_reset_map gcc_qcs615_resets[] = { 2920 + [GCC_EMAC_BCR] = { 0x6000 }, 2921 + [GCC_QUSB2PHY_PRIM_BCR] = { 0xd000 }, 2922 + [GCC_QUSB2PHY_SEC_BCR] = { 0xd004 }, 2923 + [GCC_USB30_PRIM_BCR] = { 0xf000 }, 2924 + [GCC_USB2_PHY_SEC_BCR] = { 0x50018 }, 2925 + [GCC_USB3_DP_PHY_SEC_BCR] = { 0x50020 }, 2926 + [GCC_USB3PHY_PHY_SEC_BCR] = { 0x5001c }, 2927 + [GCC_PCIE_0_BCR] = { 0x6b000 }, 2928 + [GCC_PCIE_0_PHY_BCR] = { 0x6c01c }, 2929 + [GCC_PCIE_PHY_BCR] = { 0x6f000 }, 2930 + [GCC_PCIE_PHY_COM_BCR] = { 0x6f010 }, 2931 + [GCC_UFS_PHY_BCR] = { 0x77000 }, 2932 + [GCC_USB20_SEC_BCR] = { 0xa6000 }, 2933 + [GCC_USB3PHY_PHY_PRIM_SP0_BCR] = { 0x50008 }, 2934 + [GCC_USB3_PHY_PRIM_SP0_BCR] = { 0x50000 }, 2935 + [GCC_SDCC1_BCR] = { 0x12000 }, 2936 + [GCC_SDCC2_BCR] = { 0x14000 }, 2937 + }; 2938 + 2939 + static const struct clk_rcg_dfs_data gcc_dfs_clocks[] = { 2940 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s0_clk_src), 2941 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s1_clk_src), 2942 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s2_clk_src), 2943 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s3_clk_src), 2944 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s4_clk_src), 2945 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s5_clk_src), 2946 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s0_clk_src), 2947 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s1_clk_src), 2948 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s2_clk_src), 2949 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s3_clk_src), 2950 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s4_clk_src), 2951 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s5_clk_src), 2952 + }; 2953 + 2954 + static const struct regmap_config gcc_qcs615_regmap_config = { 2955 + .reg_bits = 32, 2956 + .reg_stride = 4, 2957 + .val_bits = 32, 2958 + .max_register = 0xa609c, 2959 + .fast_io = true, 2960 + }; 2961 + 2962 + static const struct qcom_cc_desc gcc_qcs615_desc = { 2963 + .config = &gcc_qcs615_regmap_config, 2964 + .clk_hws = gcc_qcs615_hws, 2965 + .num_clk_hws = ARRAY_SIZE(gcc_qcs615_hws), 2966 + .clks = gcc_qcs615_clocks, 2967 + .num_clks = ARRAY_SIZE(gcc_qcs615_clocks), 2968 + .resets = gcc_qcs615_resets, 2969 + .num_resets = ARRAY_SIZE(gcc_qcs615_resets), 2970 + .gdscs = gcc_qcs615_gdscs, 2971 + .num_gdscs = ARRAY_SIZE(gcc_qcs615_gdscs), 2972 + }; 2973 + 2974 + static const struct of_device_id gcc_qcs615_match_table[] = { 2975 + { .compatible = "qcom,qcs615-gcc" }, 2976 + { } 2977 + }; 2978 + MODULE_DEVICE_TABLE(of, gcc_qcs615_match_table); 2979 + 2980 + static int gcc_qcs615_probe(struct platform_device *pdev) 2981 + { 2982 + struct regmap *regmap; 2983 + int ret; 2984 + 2985 + regmap = qcom_cc_map(pdev, &gcc_qcs615_desc); 2986 + if (IS_ERR(regmap)) 2987 + return PTR_ERR(regmap); 2988 + /* 2989 + * Disable the GPLL0 active input to MM blocks and GPU 2990 + * via MISC registers. 2991 + */ 2992 + regmap_update_bits(regmap, 0x0b084, BIT(0), BIT(0)); 2993 + regmap_update_bits(regmap, 0x9b000, BIT(0), BIT(0)); 2994 + 2995 + /* Keep some clocks always enabled */ 2996 + qcom_branch_set_clk_en(regmap, 0xb008); /* GCC_CAMERA_AHB_CLK */ 2997 + qcom_branch_set_clk_en(regmap, 0xb044); /* GCC_CAMERA_XO_CLK */ 2998 + qcom_branch_set_clk_en(regmap, 0xb00c); /* GCC_DISP_AHB_CLK */ 2999 + qcom_branch_set_clk_en(regmap, 0xb048); /* GCC_DISP_XO_CLK */ 3000 + qcom_branch_set_clk_en(regmap, 0x71004); /* GCC_GPU_CFG_AHB_CLK */ 3001 + qcom_branch_set_clk_en(regmap, 0xb004); /* GCC_VIDEO_AHB_CLK */ 3002 + qcom_branch_set_clk_en(regmap, 0xb040); /* GCC_VIDEO_XO_CLK */ 3003 + qcom_branch_set_clk_en(regmap, 0x480040); /* GCC_CPUSS_GNOC_CLK */ 3004 + 3005 + ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks, 3006 + ARRAY_SIZE(gcc_dfs_clocks)); 3007 + if (ret) 3008 + return ret; 3009 + 3010 + return qcom_cc_really_probe(&pdev->dev, &gcc_qcs615_desc, regmap); 3011 + } 3012 + 3013 + static struct platform_driver gcc_qcs615_driver = { 3014 + .probe = gcc_qcs615_probe, 3015 + .driver = { 3016 + .name = "gcc-qcs615", 3017 + .of_match_table = gcc_qcs615_match_table, 3018 + }, 3019 + }; 3020 + 3021 + static int __init gcc_qcs615_init(void) 3022 + { 3023 + return platform_driver_register(&gcc_qcs615_driver); 3024 + } 3025 + subsys_initcall(gcc_qcs615_init); 3026 + 3027 + static void __exit gcc_qcs615_exit(void) 3028 + { 3029 + platform_driver_unregister(&gcc_qcs615_driver); 3030 + } 3031 + module_exit(gcc_qcs615_exit); 3032 + 3033 + MODULE_DESCRIPTION("QTI GCC QCS615 Driver"); 3034 + MODULE_LICENSE("GPL");
+19 -24
drivers/clk/qcom/gcc-sdm845.c
··· 284 284 }; 285 285 286 286 static const struct freq_tbl ftbl_gcc_gp1_clk_src[] = { 287 - F(19200000, P_BI_TCXO, 1, 0, 0), 288 - F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0), 289 - F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0), 290 - F(100000000, P_GPLL0_OUT_MAIN, 6, 0, 0), 291 - F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 292 287 { } 293 288 }; 294 289 ··· 297 302 .name = "gcc_gp1_clk_src", 298 303 .parent_data = gcc_parent_data_1, 299 304 .num_parents = ARRAY_SIZE(gcc_parent_data_1), 300 - .ops = &clk_rcg2_ops, 305 + .ops = &clk_rcg2_gp_ops, 301 306 }, 302 307 }; 303 308 ··· 311 316 .name = "gcc_gp2_clk_src", 312 317 .parent_data = gcc_parent_data_1, 313 318 .num_parents = ARRAY_SIZE(gcc_parent_data_1), 314 - .ops = &clk_rcg2_ops, 319 + .ops = &clk_rcg2_gp_ops, 315 320 }, 316 321 }; 317 322 ··· 325 330 .name = "gcc_gp3_clk_src", 326 331 .parent_data = gcc_parent_data_1, 327 332 .num_parents = ARRAY_SIZE(gcc_parent_data_1), 328 - .ops = &clk_rcg2_ops, 333 + .ops = &clk_rcg2_gp_ops, 329 334 }, 330 335 }; 331 336 ··· 449 454 .name = "gcc_qupv3_wrap0_s0_clk_src", 450 455 .parent_data = gcc_parent_data_0, 451 456 .num_parents = ARRAY_SIZE(gcc_parent_data_0), 452 - .ops = &clk_rcg2_shared_ops, 457 + .ops = &clk_rcg2_ops, 453 458 }; 454 459 455 460 static struct clk_rcg2 gcc_qupv3_wrap0_s0_clk_src = { ··· 465 470 .name = "gcc_qupv3_wrap0_s1_clk_src", 466 471 .parent_data = gcc_parent_data_0, 467 472 .num_parents = ARRAY_SIZE(gcc_parent_data_0), 468 - .ops = &clk_rcg2_shared_ops, 473 + .ops = &clk_rcg2_ops, 469 474 }; 470 475 471 476 static struct clk_rcg2 gcc_qupv3_wrap0_s1_clk_src = { ··· 481 486 .name = "gcc_qupv3_wrap0_s2_clk_src", 482 487 .parent_data = gcc_parent_data_0, 483 488 .num_parents = ARRAY_SIZE(gcc_parent_data_0), 484 - .ops = &clk_rcg2_shared_ops, 489 + .ops = &clk_rcg2_ops, 485 490 }; 486 491 487 492 static struct clk_rcg2 gcc_qupv3_wrap0_s2_clk_src = { ··· 497 502 .name = "gcc_qupv3_wrap0_s3_clk_src", 498 503 .parent_data = gcc_parent_data_0, 499 504 .num_parents = ARRAY_SIZE(gcc_parent_data_0), 500 - .ops = &clk_rcg2_shared_ops, 505 + .ops = &clk_rcg2_ops, 501 506 }; 502 507 503 508 static struct clk_rcg2 gcc_qupv3_wrap0_s3_clk_src = { ··· 513 518 .name = "gcc_qupv3_wrap0_s4_clk_src", 514 519 .parent_data = gcc_parent_data_0, 515 520 .num_parents = ARRAY_SIZE(gcc_parent_data_0), 516 - .ops = &clk_rcg2_shared_ops, 521 + .ops = &clk_rcg2_ops, 517 522 }; 518 523 519 524 static struct clk_rcg2 gcc_qupv3_wrap0_s4_clk_src = { ··· 529 534 .name = "gcc_qupv3_wrap0_s5_clk_src", 530 535 .parent_data = gcc_parent_data_0, 531 536 .num_parents = ARRAY_SIZE(gcc_parent_data_0), 532 - .ops = &clk_rcg2_shared_ops, 537 + .ops = &clk_rcg2_ops, 533 538 }; 534 539 535 540 static struct clk_rcg2 gcc_qupv3_wrap0_s5_clk_src = { ··· 545 550 .name = "gcc_qupv3_wrap0_s6_clk_src", 546 551 .parent_data = gcc_parent_data_0, 547 552 .num_parents = ARRAY_SIZE(gcc_parent_data_0), 548 - .ops = &clk_rcg2_shared_ops, 553 + .ops = &clk_rcg2_ops, 549 554 }; 550 555 551 556 static struct clk_rcg2 gcc_qupv3_wrap0_s6_clk_src = { ··· 561 566 .name = "gcc_qupv3_wrap0_s7_clk_src", 562 567 .parent_data = gcc_parent_data_0, 563 568 .num_parents = ARRAY_SIZE(gcc_parent_data_0), 564 - .ops = &clk_rcg2_shared_ops, 569 + .ops = &clk_rcg2_ops, 565 570 }; 566 571 567 572 static struct clk_rcg2 gcc_qupv3_wrap0_s7_clk_src = { ··· 577 582 .name = "gcc_qupv3_wrap1_s0_clk_src", 578 583 .parent_data = gcc_parent_data_0, 579 584 .num_parents = ARRAY_SIZE(gcc_parent_data_0), 580 - .ops = &clk_rcg2_shared_ops, 585 + .ops = &clk_rcg2_ops, 581 586 }; 582 587 583 588 static struct clk_rcg2 gcc_qupv3_wrap1_s0_clk_src = { ··· 593 598 .name = "gcc_qupv3_wrap1_s1_clk_src", 594 599 .parent_data = gcc_parent_data_0, 595 600 .num_parents = ARRAY_SIZE(gcc_parent_data_0), 596 - .ops = &clk_rcg2_shared_ops, 601 + .ops = &clk_rcg2_ops, 597 602 }; 598 603 599 604 static struct clk_rcg2 gcc_qupv3_wrap1_s1_clk_src = { ··· 609 614 .name = "gcc_qupv3_wrap1_s2_clk_src", 610 615 .parent_data = gcc_parent_data_0, 611 616 .num_parents = ARRAY_SIZE(gcc_parent_data_0), 612 - .ops = &clk_rcg2_shared_ops, 617 + .ops = &clk_rcg2_ops, 613 618 }; 614 619 615 620 static struct clk_rcg2 gcc_qupv3_wrap1_s2_clk_src = { ··· 625 630 .name = "gcc_qupv3_wrap1_s3_clk_src", 626 631 .parent_data = gcc_parent_data_0, 627 632 .num_parents = ARRAY_SIZE(gcc_parent_data_0), 628 - .ops = &clk_rcg2_shared_ops, 633 + .ops = &clk_rcg2_ops, 629 634 }; 630 635 631 636 static struct clk_rcg2 gcc_qupv3_wrap1_s3_clk_src = { ··· 641 646 .name = "gcc_qupv3_wrap1_s4_clk_src", 642 647 .parent_data = gcc_parent_data_0, 643 648 .num_parents = ARRAY_SIZE(gcc_parent_data_0), 644 - .ops = &clk_rcg2_shared_ops, 649 + .ops = &clk_rcg2_ops, 645 650 }; 646 651 647 652 static struct clk_rcg2 gcc_qupv3_wrap1_s4_clk_src = { ··· 657 662 .name = "gcc_qupv3_wrap1_s5_clk_src", 658 663 .parent_data = gcc_parent_data_0, 659 664 .num_parents = ARRAY_SIZE(gcc_parent_data_0), 660 - .ops = &clk_rcg2_shared_ops, 665 + .ops = &clk_rcg2_ops, 661 666 }; 662 667 663 668 static struct clk_rcg2 gcc_qupv3_wrap1_s5_clk_src = { ··· 673 678 .name = "gcc_qupv3_wrap1_s6_clk_src", 674 679 .parent_data = gcc_parent_data_0, 675 680 .num_parents = ARRAY_SIZE(gcc_parent_data_0), 676 - .ops = &clk_rcg2_shared_ops, 681 + .ops = &clk_rcg2_ops, 677 682 }; 678 683 679 684 static struct clk_rcg2 gcc_qupv3_wrap1_s6_clk_src = { ··· 689 694 .name = "gcc_qupv3_wrap1_s7_clk_src", 690 695 .parent_data = gcc_parent_data_0, 691 696 .num_parents = ARRAY_SIZE(gcc_parent_data_0), 692 - .ops = &clk_rcg2_shared_ops, 697 + .ops = &clk_rcg2_ops, 693 698 }; 694 699 695 700 static struct clk_rcg2 gcc_qupv3_wrap1_s7_clk_src = {
+14 -8
drivers/clk/qcom/gcc-sm6350.c
··· 182 182 { .hw = &gpll0_out_odd.clkr.hw }, 183 183 }; 184 184 185 + static const struct parent_map gcc_parent_map_3[] = { 186 + { P_BI_TCXO, 0 }, 187 + }; 188 + 189 + static const struct clk_parent_data gcc_parent_data_3[] = { 190 + { .fw_name = "bi_tcxo" }, 191 + }; 192 + 185 193 static const struct parent_map gcc_parent_map_4[] = { 186 194 { P_BI_TCXO, 0 }, 187 195 { P_GPLL0_OUT_MAIN, 1 }, ··· 709 701 .cmd_rcgr = 0x3a0b0, 710 702 .mnd_width = 0, 711 703 .hid_width = 5, 704 + .parent_map = gcc_parent_map_3, 712 705 .freq_tbl = ftbl_gcc_ufs_phy_phy_aux_clk_src, 713 706 .clkr.hw.init = &(struct clk_init_data){ 714 707 .name = "gcc_ufs_phy_phy_aux_clk_src", 715 - .parent_data = &(const struct clk_parent_data){ 716 - .fw_name = "bi_tcxo", 717 - }, 718 - .num_parents = 1, 708 + .parent_data = gcc_parent_data_3, 709 + .num_parents = ARRAY_SIZE(gcc_parent_data_3), 719 710 .ops = &clk_rcg2_ops, 720 711 }, 721 712 }; ··· 771 764 .cmd_rcgr = 0x1a034, 772 765 .mnd_width = 0, 773 766 .hid_width = 5, 767 + .parent_map = gcc_parent_map_3, 774 768 .freq_tbl = ftbl_gcc_usb30_prim_mock_utmi_clk_src, 775 769 .clkr.hw.init = &(struct clk_init_data){ 776 770 .name = "gcc_usb30_prim_mock_utmi_clk_src", 777 - .parent_data = &(const struct clk_parent_data){ 778 - .fw_name = "bi_tcxo", 779 - }, 780 - .num_parents = 1, 771 + .parent_data = gcc_parent_data_3, 772 + .num_parents = ARRAY_SIZE(gcc_parent_data_3), 781 773 .ops = &clk_rcg2_ops, 782 774 }, 783 775 };
+4 -4
drivers/clk/qcom/gcc-sm8550.c
··· 3003 3003 .pd = { 3004 3004 .name = "pcie_0_gdsc", 3005 3005 }, 3006 - .pwrsts = PWRSTS_OFF_ON, 3006 + .pwrsts = PWRSTS_RET_ON, 3007 3007 .flags = VOTABLE | POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 3008 3008 }; 3009 3009 ··· 3014 3014 .pd = { 3015 3015 .name = "pcie_0_phy_gdsc", 3016 3016 }, 3017 - .pwrsts = PWRSTS_OFF_ON, 3017 + .pwrsts = PWRSTS_RET_ON, 3018 3018 .flags = VOTABLE | POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 3019 3019 }; 3020 3020 ··· 3025 3025 .pd = { 3026 3026 .name = "pcie_1_gdsc", 3027 3027 }, 3028 - .pwrsts = PWRSTS_OFF_ON, 3028 + .pwrsts = PWRSTS_RET_ON, 3029 3029 .flags = VOTABLE | POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 3030 3030 }; 3031 3031 ··· 3036 3036 .pd = { 3037 3037 .name = "pcie_1_phy_gdsc", 3038 3038 }, 3039 - .pwrsts = PWRSTS_OFF_ON, 3039 + .pwrsts = PWRSTS_RET_ON, 3040 3040 .flags = VOTABLE | POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 3041 3041 }; 3042 3042
+4 -4
drivers/clk/qcom/gcc-sm8650.c
··· 3437 3437 .pd = { 3438 3438 .name = "pcie_0_gdsc", 3439 3439 }, 3440 - .pwrsts = PWRSTS_OFF_ON, 3440 + .pwrsts = PWRSTS_RET_ON, 3441 3441 .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE | VOTABLE, 3442 3442 }; 3443 3443 ··· 3448 3448 .pd = { 3449 3449 .name = "pcie_0_phy_gdsc", 3450 3450 }, 3451 - .pwrsts = PWRSTS_OFF_ON, 3451 + .pwrsts = PWRSTS_RET_ON, 3452 3452 .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE | VOTABLE, 3453 3453 }; 3454 3454 ··· 3459 3459 .pd = { 3460 3460 .name = "pcie_1_gdsc", 3461 3461 }, 3462 - .pwrsts = PWRSTS_OFF_ON, 3462 + .pwrsts = PWRSTS_RET_ON, 3463 3463 .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE | VOTABLE, 3464 3464 }; 3465 3465 ··· 3470 3470 .pd = { 3471 3471 .name = "pcie_1_phy_gdsc", 3472 3472 }, 3473 - .pwrsts = PWRSTS_OFF_ON, 3473 + .pwrsts = PWRSTS_RET_ON, 3474 3474 .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE | VOTABLE, 3475 3475 }; 3476 3476
+3274
drivers/clk/qcom/gcc-sm8750.c
··· 1 + // SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + /* 3 + * Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved. 4 + */ 5 + 6 + #include <linux/clk-provider.h> 7 + #include <linux/mod_devicetable.h> 8 + #include <linux/module.h> 9 + #include <linux/platform_device.h> 10 + #include <linux/regmap.h> 11 + 12 + #include <dt-bindings/clock/qcom,sm8750-gcc.h> 13 + 14 + #include "clk-alpha-pll.h" 15 + #include "clk-branch.h" 16 + #include "clk-pll.h" 17 + #include "clk-rcg.h" 18 + #include "clk-regmap.h" 19 + #include "clk-regmap-divider.h" 20 + #include "clk-regmap-mux.h" 21 + #include "clk-regmap-phy-mux.h" 22 + #include "common.h" 23 + #include "gdsc.h" 24 + #include "reset.h" 25 + 26 + enum { 27 + DT_BI_TCXO, 28 + DT_BI_TCXO_AO, 29 + DT_SLEEP_CLK, 30 + DT_PCIE_0_PIPE_CLK, 31 + DT_UFS_PHY_RX_SYMBOL_0_CLK, 32 + DT_UFS_PHY_RX_SYMBOL_1_CLK, 33 + DT_UFS_PHY_TX_SYMBOL_0_CLK, 34 + DT_USB3_PHY_WRAPPER_GCC_USB30_PIPE_CLK, 35 + }; 36 + 37 + enum { 38 + P_BI_TCXO, 39 + P_GCC_GPLL0_OUT_EVEN, 40 + P_GCC_GPLL0_OUT_MAIN, 41 + P_GCC_GPLL1_OUT_MAIN, 42 + P_GCC_GPLL4_OUT_MAIN, 43 + P_GCC_GPLL7_OUT_MAIN, 44 + P_GCC_GPLL9_OUT_MAIN, 45 + P_PCIE_0_PIPE_CLK, 46 + P_SLEEP_CLK, 47 + P_UFS_PHY_RX_SYMBOL_0_CLK, 48 + P_UFS_PHY_RX_SYMBOL_1_CLK, 49 + P_UFS_PHY_TX_SYMBOL_0_CLK, 50 + P_USB3_PHY_WRAPPER_GCC_USB30_PIPE_CLK, 51 + }; 52 + 53 + static struct clk_alpha_pll gcc_gpll0 = { 54 + .offset = 0x0, 55 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_ELU], 56 + .clkr = { 57 + .enable_reg = 0x52020, 58 + .enable_mask = BIT(0), 59 + .hw.init = &(const struct clk_init_data) { 60 + .name = "gcc_gpll0", 61 + .parent_data = &(const struct clk_parent_data) { 62 + .index = DT_BI_TCXO, 63 + }, 64 + .num_parents = 1, 65 + .ops = &clk_alpha_pll_fixed_taycan_elu_ops, 66 + }, 67 + }, 68 + }; 69 + 70 + static const struct clk_div_table post_div_table_gcc_gpll0_out_even[] = { 71 + { 0x1, 2 }, 72 + { } 73 + }; 74 + 75 + static struct clk_alpha_pll_postdiv gcc_gpll0_out_even = { 76 + .offset = 0x0, 77 + .post_div_shift = 10, 78 + .post_div_table = post_div_table_gcc_gpll0_out_even, 79 + .num_post_div = ARRAY_SIZE(post_div_table_gcc_gpll0_out_even), 80 + .width = 4, 81 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_ELU], 82 + .clkr.hw.init = &(const struct clk_init_data) { 83 + .name = "gcc_gpll0_out_even", 84 + .parent_hws = (const struct clk_hw*[]) { 85 + &gcc_gpll0.clkr.hw, 86 + }, 87 + .num_parents = 1, 88 + .ops = &clk_alpha_pll_postdiv_taycan_elu_ops, 89 + }, 90 + }; 91 + 92 + static struct clk_alpha_pll gcc_gpll1 = { 93 + .offset = 0x1000, 94 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_ELU], 95 + .clkr = { 96 + .enable_reg = 0x52020, 97 + .enable_mask = BIT(1), 98 + .hw.init = &(const struct clk_init_data) { 99 + .name = "gcc_gpll1", 100 + .parent_data = &(const struct clk_parent_data) { 101 + .index = DT_BI_TCXO, 102 + }, 103 + .num_parents = 1, 104 + .ops = &clk_alpha_pll_fixed_taycan_elu_ops, 105 + }, 106 + }, 107 + }; 108 + 109 + static struct clk_alpha_pll gcc_gpll4 = { 110 + .offset = 0x4000, 111 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_ELU], 112 + .clkr = { 113 + .enable_reg = 0x52020, 114 + .enable_mask = BIT(4), 115 + .hw.init = &(const struct clk_init_data) { 116 + .name = "gcc_gpll4", 117 + .parent_data = &(const struct clk_parent_data) { 118 + .index = DT_BI_TCXO, 119 + }, 120 + .num_parents = 1, 121 + .ops = &clk_alpha_pll_fixed_taycan_elu_ops, 122 + }, 123 + }, 124 + }; 125 + 126 + static struct clk_alpha_pll gcc_gpll7 = { 127 + .offset = 0x7000, 128 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_ELU], 129 + .clkr = { 130 + .enable_reg = 0x52020, 131 + .enable_mask = BIT(7), 132 + .hw.init = &(const struct clk_init_data) { 133 + .name = "gcc_gpll7", 134 + .parent_data = &(const struct clk_parent_data) { 135 + .index = DT_BI_TCXO, 136 + }, 137 + .num_parents = 1, 138 + .ops = &clk_alpha_pll_fixed_taycan_elu_ops, 139 + }, 140 + }, 141 + }; 142 + 143 + static struct clk_alpha_pll gcc_gpll9 = { 144 + .offset = 0x9000, 145 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TAYCAN_ELU], 146 + .clkr = { 147 + .enable_reg = 0x52020, 148 + .enable_mask = BIT(9), 149 + .hw.init = &(const struct clk_init_data) { 150 + .name = "gcc_gpll9", 151 + .parent_data = &(const struct clk_parent_data) { 152 + .index = DT_BI_TCXO, 153 + }, 154 + .num_parents = 1, 155 + .ops = &clk_alpha_pll_fixed_taycan_elu_ops, 156 + }, 157 + }, 158 + }; 159 + 160 + static const struct parent_map gcc_parent_map_0[] = { 161 + { P_BI_TCXO, 0 }, 162 + { P_GCC_GPLL0_OUT_MAIN, 1 }, 163 + { P_GCC_GPLL0_OUT_EVEN, 6 }, 164 + }; 165 + 166 + static const struct clk_parent_data gcc_parent_data_0[] = { 167 + { .index = DT_BI_TCXO }, 168 + { .hw = &gcc_gpll0.clkr.hw }, 169 + { .hw = &gcc_gpll0_out_even.clkr.hw }, 170 + }; 171 + 172 + static const struct parent_map gcc_parent_map_1[] = { 173 + { P_BI_TCXO, 0 }, 174 + { P_GCC_GPLL0_OUT_MAIN, 1 }, 175 + { P_SLEEP_CLK, 5 }, 176 + { P_GCC_GPLL0_OUT_EVEN, 6 }, 177 + }; 178 + 179 + static const struct clk_parent_data gcc_parent_data_1[] = { 180 + { .index = DT_BI_TCXO }, 181 + { .hw = &gcc_gpll0.clkr.hw }, 182 + { .index = DT_SLEEP_CLK }, 183 + { .hw = &gcc_gpll0_out_even.clkr.hw }, 184 + }; 185 + 186 + static const struct parent_map gcc_parent_map_2[] = { 187 + { P_BI_TCXO, 0 }, 188 + { P_GCC_GPLL0_OUT_MAIN, 1 }, 189 + { P_GCC_GPLL1_OUT_MAIN, 4 }, 190 + { P_GCC_GPLL4_OUT_MAIN, 5 }, 191 + { P_GCC_GPLL0_OUT_EVEN, 6 }, 192 + }; 193 + 194 + static const struct clk_parent_data gcc_parent_data_2[] = { 195 + { .index = DT_BI_TCXO }, 196 + { .hw = &gcc_gpll0.clkr.hw }, 197 + { .hw = &gcc_gpll1.clkr.hw }, 198 + { .hw = &gcc_gpll4.clkr.hw }, 199 + { .hw = &gcc_gpll0_out_even.clkr.hw }, 200 + }; 201 + 202 + static const struct parent_map gcc_parent_map_3[] = { 203 + { P_BI_TCXO, 0 }, 204 + { P_GCC_GPLL0_OUT_MAIN, 1 }, 205 + { P_GCC_GPLL4_OUT_MAIN, 5 }, 206 + { P_GCC_GPLL0_OUT_EVEN, 6 }, 207 + }; 208 + 209 + static const struct clk_parent_data gcc_parent_data_3[] = { 210 + { .index = DT_BI_TCXO }, 211 + { .hw = &gcc_gpll0.clkr.hw }, 212 + { .hw = &gcc_gpll4.clkr.hw }, 213 + { .hw = &gcc_gpll0_out_even.clkr.hw }, 214 + }; 215 + 216 + static const struct parent_map gcc_parent_map_4[] = { 217 + { P_BI_TCXO, 0 }, 218 + { P_SLEEP_CLK, 5 }, 219 + }; 220 + 221 + static const struct clk_parent_data gcc_parent_data_4[] = { 222 + { .index = DT_BI_TCXO }, 223 + { .index = DT_SLEEP_CLK }, 224 + }; 225 + 226 + static const struct parent_map gcc_parent_map_5[] = { 227 + { P_BI_TCXO, 0 }, 228 + { P_GCC_GPLL0_OUT_MAIN, 1 }, 229 + { P_GCC_GPLL7_OUT_MAIN, 2 }, 230 + { P_GCC_GPLL0_OUT_EVEN, 6 }, 231 + }; 232 + 233 + static const struct clk_parent_data gcc_parent_data_5[] = { 234 + { .index = DT_BI_TCXO }, 235 + { .hw = &gcc_gpll0.clkr.hw }, 236 + { .hw = &gcc_gpll7.clkr.hw }, 237 + { .hw = &gcc_gpll0_out_even.clkr.hw }, 238 + }; 239 + 240 + static const struct parent_map gcc_parent_map_6[] = { 241 + { P_BI_TCXO, 0 }, 242 + }; 243 + 244 + static const struct clk_parent_data gcc_parent_data_6[] = { 245 + { .index = DT_BI_TCXO }, 246 + }; 247 + 248 + static const struct parent_map gcc_parent_map_8[] = { 249 + { P_BI_TCXO, 0 }, 250 + { P_GCC_GPLL0_OUT_MAIN, 1 }, 251 + { P_GCC_GPLL9_OUT_MAIN, 2 }, 252 + { P_GCC_GPLL4_OUT_MAIN, 5 }, 253 + { P_GCC_GPLL0_OUT_EVEN, 6 }, 254 + }; 255 + 256 + static const struct clk_parent_data gcc_parent_data_8[] = { 257 + { .index = DT_BI_TCXO }, 258 + { .hw = &gcc_gpll0.clkr.hw }, 259 + { .hw = &gcc_gpll9.clkr.hw }, 260 + { .hw = &gcc_gpll4.clkr.hw }, 261 + { .hw = &gcc_gpll0_out_even.clkr.hw }, 262 + }; 263 + 264 + static const struct parent_map gcc_parent_map_9[] = { 265 + { P_UFS_PHY_RX_SYMBOL_0_CLK, 0 }, 266 + { P_BI_TCXO, 2 }, 267 + }; 268 + 269 + static const struct clk_parent_data gcc_parent_data_9[] = { 270 + { .index = DT_UFS_PHY_RX_SYMBOL_0_CLK }, 271 + { .index = DT_BI_TCXO }, 272 + }; 273 + 274 + static const struct parent_map gcc_parent_map_10[] = { 275 + { P_UFS_PHY_RX_SYMBOL_1_CLK, 0 }, 276 + { P_BI_TCXO, 2 }, 277 + }; 278 + 279 + static const struct clk_parent_data gcc_parent_data_10[] = { 280 + { .index = DT_UFS_PHY_RX_SYMBOL_1_CLK }, 281 + { .index = DT_BI_TCXO }, 282 + }; 283 + 284 + static const struct parent_map gcc_parent_map_11[] = { 285 + { P_UFS_PHY_TX_SYMBOL_0_CLK, 0 }, 286 + { P_BI_TCXO, 2 }, 287 + }; 288 + 289 + static const struct clk_parent_data gcc_parent_data_11[] = { 290 + { .index = DT_UFS_PHY_TX_SYMBOL_0_CLK }, 291 + { .index = DT_BI_TCXO }, 292 + }; 293 + 294 + static const struct parent_map gcc_parent_map_12[] = { 295 + { P_USB3_PHY_WRAPPER_GCC_USB30_PIPE_CLK, 0 }, 296 + { P_BI_TCXO, 2 }, 297 + }; 298 + 299 + static const struct clk_parent_data gcc_parent_data_12[] = { 300 + { .index = DT_USB3_PHY_WRAPPER_GCC_USB30_PIPE_CLK }, 301 + { .index = DT_BI_TCXO }, 302 + }; 303 + 304 + static struct clk_regmap_phy_mux gcc_pcie_0_pipe_clk_src = { 305 + .reg = 0x6b080, 306 + .clkr = { 307 + .hw.init = &(const struct clk_init_data) { 308 + .name = "gcc_pcie_0_pipe_clk_src", 309 + .parent_data = &(const struct clk_parent_data){ 310 + .index = DT_PCIE_0_PIPE_CLK, 311 + }, 312 + .num_parents = 1, 313 + .ops = &clk_regmap_phy_mux_ops, 314 + }, 315 + }, 316 + }; 317 + 318 + static struct clk_regmap_mux gcc_ufs_phy_rx_symbol_0_clk_src = { 319 + .reg = 0x77068, 320 + .shift = 0, 321 + .width = 2, 322 + .parent_map = gcc_parent_map_9, 323 + .clkr = { 324 + .hw.init = &(const struct clk_init_data) { 325 + .name = "gcc_ufs_phy_rx_symbol_0_clk_src", 326 + .parent_data = gcc_parent_data_9, 327 + .num_parents = ARRAY_SIZE(gcc_parent_data_9), 328 + .ops = &clk_regmap_mux_closest_ops, 329 + }, 330 + }, 331 + }; 332 + 333 + static struct clk_regmap_mux gcc_ufs_phy_rx_symbol_1_clk_src = { 334 + .reg = 0x770ec, 335 + .shift = 0, 336 + .width = 2, 337 + .parent_map = gcc_parent_map_10, 338 + .clkr = { 339 + .hw.init = &(const struct clk_init_data) { 340 + .name = "gcc_ufs_phy_rx_symbol_1_clk_src", 341 + .parent_data = gcc_parent_data_10, 342 + .num_parents = ARRAY_SIZE(gcc_parent_data_10), 343 + .ops = &clk_regmap_mux_closest_ops, 344 + }, 345 + }, 346 + }; 347 + 348 + static struct clk_regmap_mux gcc_ufs_phy_tx_symbol_0_clk_src = { 349 + .reg = 0x77058, 350 + .shift = 0, 351 + .width = 2, 352 + .parent_map = gcc_parent_map_11, 353 + .clkr = { 354 + .hw.init = &(const struct clk_init_data) { 355 + .name = "gcc_ufs_phy_tx_symbol_0_clk_src", 356 + .parent_data = gcc_parent_data_11, 357 + .num_parents = ARRAY_SIZE(gcc_parent_data_11), 358 + .ops = &clk_regmap_mux_closest_ops, 359 + }, 360 + }, 361 + }; 362 + 363 + static struct clk_regmap_mux gcc_usb3_prim_phy_pipe_clk_src = { 364 + .reg = 0x39070, 365 + .shift = 0, 366 + .width = 2, 367 + .parent_map = gcc_parent_map_12, 368 + .clkr = { 369 + .hw.init = &(const struct clk_init_data) { 370 + .name = "gcc_usb3_prim_phy_pipe_clk_src", 371 + .parent_data = gcc_parent_data_12, 372 + .num_parents = ARRAY_SIZE(gcc_parent_data_12), 373 + .ops = &clk_regmap_mux_closest_ops, 374 + }, 375 + }, 376 + }; 377 + 378 + static const struct freq_tbl ftbl_gcc_gp1_clk_src[] = { 379 + F(50000000, P_GCC_GPLL0_OUT_EVEN, 6, 0, 0), 380 + F(100000000, P_GCC_GPLL0_OUT_MAIN, 6, 0, 0), 381 + F(200000000, P_GCC_GPLL0_OUT_MAIN, 3, 0, 0), 382 + { } 383 + }; 384 + 385 + static struct clk_rcg2 gcc_gp1_clk_src = { 386 + .cmd_rcgr = 0x64004, 387 + .mnd_width = 16, 388 + .hid_width = 5, 389 + .parent_map = gcc_parent_map_1, 390 + .freq_tbl = ftbl_gcc_gp1_clk_src, 391 + .clkr.hw.init = &(const struct clk_init_data) { 392 + .name = "gcc_gp1_clk_src", 393 + .parent_data = gcc_parent_data_1, 394 + .num_parents = ARRAY_SIZE(gcc_parent_data_1), 395 + .flags = CLK_SET_RATE_PARENT, 396 + .ops = &clk_rcg2_shared_ops, 397 + }, 398 + }; 399 + 400 + static struct clk_rcg2 gcc_gp2_clk_src = { 401 + .cmd_rcgr = 0x65004, 402 + .mnd_width = 16, 403 + .hid_width = 5, 404 + .parent_map = gcc_parent_map_1, 405 + .freq_tbl = ftbl_gcc_gp1_clk_src, 406 + .clkr.hw.init = &(const struct clk_init_data) { 407 + .name = "gcc_gp2_clk_src", 408 + .parent_data = gcc_parent_data_1, 409 + .num_parents = ARRAY_SIZE(gcc_parent_data_1), 410 + .flags = CLK_SET_RATE_PARENT, 411 + .ops = &clk_rcg2_shared_ops, 412 + }, 413 + }; 414 + 415 + static struct clk_rcg2 gcc_gp3_clk_src = { 416 + .cmd_rcgr = 0x66004, 417 + .mnd_width = 16, 418 + .hid_width = 5, 419 + .parent_map = gcc_parent_map_1, 420 + .freq_tbl = ftbl_gcc_gp1_clk_src, 421 + .clkr.hw.init = &(const struct clk_init_data) { 422 + .name = "gcc_gp3_clk_src", 423 + .parent_data = gcc_parent_data_1, 424 + .num_parents = ARRAY_SIZE(gcc_parent_data_1), 425 + .flags = CLK_SET_RATE_PARENT, 426 + .ops = &clk_rcg2_shared_ops, 427 + }, 428 + }; 429 + 430 + static const struct freq_tbl ftbl_gcc_pcie_0_aux_clk_src[] = { 431 + F(19200000, P_BI_TCXO, 1, 0, 0), 432 + { } 433 + }; 434 + 435 + static struct clk_rcg2 gcc_pcie_0_aux_clk_src = { 436 + .cmd_rcgr = 0x6b084, 437 + .mnd_width = 16, 438 + .hid_width = 5, 439 + .parent_map = gcc_parent_map_4, 440 + .freq_tbl = ftbl_gcc_pcie_0_aux_clk_src, 441 + .clkr.hw.init = &(const struct clk_init_data) { 442 + .name = "gcc_pcie_0_aux_clk_src", 443 + .parent_data = gcc_parent_data_4, 444 + .num_parents = ARRAY_SIZE(gcc_parent_data_4), 445 + .flags = CLK_SET_RATE_PARENT, 446 + .ops = &clk_rcg2_shared_ops, 447 + }, 448 + }; 449 + 450 + static const struct freq_tbl ftbl_gcc_pcie_0_phy_rchng_clk_src[] = { 451 + F(19200000, P_BI_TCXO, 1, 0, 0), 452 + F(100000000, P_GCC_GPLL0_OUT_EVEN, 3, 0, 0), 453 + { } 454 + }; 455 + 456 + static struct clk_rcg2 gcc_pcie_0_phy_rchng_clk_src = { 457 + .cmd_rcgr = 0x6b068, 458 + .mnd_width = 0, 459 + .hid_width = 5, 460 + .parent_map = gcc_parent_map_0, 461 + .freq_tbl = ftbl_gcc_pcie_0_phy_rchng_clk_src, 462 + .clkr.hw.init = &(const struct clk_init_data) { 463 + .name = "gcc_pcie_0_phy_rchng_clk_src", 464 + .parent_data = gcc_parent_data_0, 465 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 466 + .flags = CLK_SET_RATE_PARENT, 467 + .ops = &clk_rcg2_shared_ops, 468 + }, 469 + }; 470 + 471 + static const struct freq_tbl ftbl_gcc_pdm2_clk_src[] = { 472 + F(60000000, P_GCC_GPLL0_OUT_MAIN, 10, 0, 0), 473 + { } 474 + }; 475 + 476 + static struct clk_rcg2 gcc_pdm2_clk_src = { 477 + .cmd_rcgr = 0x33010, 478 + .mnd_width = 0, 479 + .hid_width = 5, 480 + .parent_map = gcc_parent_map_0, 481 + .freq_tbl = ftbl_gcc_pdm2_clk_src, 482 + .clkr.hw.init = &(const struct clk_init_data) { 483 + .name = "gcc_pdm2_clk_src", 484 + .parent_data = gcc_parent_data_0, 485 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 486 + .flags = CLK_SET_RATE_PARENT, 487 + .ops = &clk_rcg2_shared_ops, 488 + }, 489 + }; 490 + 491 + static struct clk_rcg2 gcc_qupv3_i2c_s0_clk_src = { 492 + .cmd_rcgr = 0x17008, 493 + .mnd_width = 0, 494 + .hid_width = 5, 495 + .parent_map = gcc_parent_map_0, 496 + .freq_tbl = ftbl_gcc_pcie_0_aux_clk_src, 497 + .clkr.hw.init = &(const struct clk_init_data) { 498 + .name = "gcc_qupv3_i2c_s0_clk_src", 499 + .parent_data = gcc_parent_data_0, 500 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 501 + .flags = CLK_SET_RATE_PARENT, 502 + .ops = &clk_rcg2_shared_ops, 503 + }, 504 + }; 505 + 506 + static struct clk_rcg2 gcc_qupv3_i2c_s1_clk_src = { 507 + .cmd_rcgr = 0x17024, 508 + .mnd_width = 0, 509 + .hid_width = 5, 510 + .parent_map = gcc_parent_map_0, 511 + .freq_tbl = ftbl_gcc_pcie_0_aux_clk_src, 512 + .clkr.hw.init = &(const struct clk_init_data) { 513 + .name = "gcc_qupv3_i2c_s1_clk_src", 514 + .parent_data = gcc_parent_data_0, 515 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 516 + .flags = CLK_SET_RATE_PARENT, 517 + .ops = &clk_rcg2_shared_ops, 518 + }, 519 + }; 520 + 521 + static struct clk_rcg2 gcc_qupv3_i2c_s2_clk_src = { 522 + .cmd_rcgr = 0x17040, 523 + .mnd_width = 0, 524 + .hid_width = 5, 525 + .parent_map = gcc_parent_map_0, 526 + .freq_tbl = ftbl_gcc_pcie_0_aux_clk_src, 527 + .clkr.hw.init = &(const struct clk_init_data) { 528 + .name = "gcc_qupv3_i2c_s2_clk_src", 529 + .parent_data = gcc_parent_data_0, 530 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 531 + .flags = CLK_SET_RATE_PARENT, 532 + .ops = &clk_rcg2_shared_ops, 533 + }, 534 + }; 535 + 536 + static struct clk_rcg2 gcc_qupv3_i2c_s3_clk_src = { 537 + .cmd_rcgr = 0x1705c, 538 + .mnd_width = 0, 539 + .hid_width = 5, 540 + .parent_map = gcc_parent_map_0, 541 + .freq_tbl = ftbl_gcc_pcie_0_aux_clk_src, 542 + .clkr.hw.init = &(const struct clk_init_data) { 543 + .name = "gcc_qupv3_i2c_s3_clk_src", 544 + .parent_data = gcc_parent_data_0, 545 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 546 + .flags = CLK_SET_RATE_PARENT, 547 + .ops = &clk_rcg2_shared_ops, 548 + }, 549 + }; 550 + 551 + static struct clk_rcg2 gcc_qupv3_i2c_s4_clk_src = { 552 + .cmd_rcgr = 0x17078, 553 + .mnd_width = 0, 554 + .hid_width = 5, 555 + .parent_map = gcc_parent_map_0, 556 + .freq_tbl = ftbl_gcc_pcie_0_aux_clk_src, 557 + .clkr.hw.init = &(const struct clk_init_data) { 558 + .name = "gcc_qupv3_i2c_s4_clk_src", 559 + .parent_data = gcc_parent_data_0, 560 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 561 + .flags = CLK_SET_RATE_PARENT, 562 + .ops = &clk_rcg2_shared_ops, 563 + }, 564 + }; 565 + 566 + static struct clk_rcg2 gcc_qupv3_i2c_s5_clk_src = { 567 + .cmd_rcgr = 0x17094, 568 + .mnd_width = 0, 569 + .hid_width = 5, 570 + .parent_map = gcc_parent_map_0, 571 + .freq_tbl = ftbl_gcc_pcie_0_aux_clk_src, 572 + .clkr.hw.init = &(const struct clk_init_data) { 573 + .name = "gcc_qupv3_i2c_s5_clk_src", 574 + .parent_data = gcc_parent_data_0, 575 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 576 + .flags = CLK_SET_RATE_PARENT, 577 + .ops = &clk_rcg2_shared_ops, 578 + }, 579 + }; 580 + 581 + static struct clk_rcg2 gcc_qupv3_i2c_s6_clk_src = { 582 + .cmd_rcgr = 0x170b0, 583 + .mnd_width = 0, 584 + .hid_width = 5, 585 + .parent_map = gcc_parent_map_0, 586 + .freq_tbl = ftbl_gcc_pcie_0_aux_clk_src, 587 + .clkr.hw.init = &(const struct clk_init_data) { 588 + .name = "gcc_qupv3_i2c_s6_clk_src", 589 + .parent_data = gcc_parent_data_0, 590 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 591 + .flags = CLK_SET_RATE_PARENT, 592 + .ops = &clk_rcg2_shared_ops, 593 + }, 594 + }; 595 + 596 + static struct clk_rcg2 gcc_qupv3_i2c_s7_clk_src = { 597 + .cmd_rcgr = 0x170cc, 598 + .mnd_width = 0, 599 + .hid_width = 5, 600 + .parent_map = gcc_parent_map_0, 601 + .freq_tbl = ftbl_gcc_pcie_0_aux_clk_src, 602 + .clkr.hw.init = &(const struct clk_init_data) { 603 + .name = "gcc_qupv3_i2c_s7_clk_src", 604 + .parent_data = gcc_parent_data_0, 605 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 606 + .flags = CLK_SET_RATE_PARENT, 607 + .ops = &clk_rcg2_shared_ops, 608 + }, 609 + }; 610 + 611 + static struct clk_rcg2 gcc_qupv3_i2c_s8_clk_src = { 612 + .cmd_rcgr = 0x170e8, 613 + .mnd_width = 0, 614 + .hid_width = 5, 615 + .parent_map = gcc_parent_map_0, 616 + .freq_tbl = ftbl_gcc_pcie_0_aux_clk_src, 617 + .clkr.hw.init = &(const struct clk_init_data) { 618 + .name = "gcc_qupv3_i2c_s8_clk_src", 619 + .parent_data = gcc_parent_data_0, 620 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 621 + .flags = CLK_SET_RATE_PARENT, 622 + .ops = &clk_rcg2_shared_ops, 623 + }, 624 + }; 625 + 626 + static struct clk_rcg2 gcc_qupv3_i2c_s9_clk_src = { 627 + .cmd_rcgr = 0x17104, 628 + .mnd_width = 0, 629 + .hid_width = 5, 630 + .parent_map = gcc_parent_map_0, 631 + .freq_tbl = ftbl_gcc_pcie_0_aux_clk_src, 632 + .clkr.hw.init = &(const struct clk_init_data) { 633 + .name = "gcc_qupv3_i2c_s9_clk_src", 634 + .parent_data = gcc_parent_data_0, 635 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 636 + .flags = CLK_SET_RATE_PARENT, 637 + .ops = &clk_rcg2_shared_ops, 638 + }, 639 + }; 640 + 641 + /* Check this frequency table.*/ 642 + static const struct freq_tbl ftbl_gcc_qupv3_wrap1_qspi_ref_clk_src[] = { 643 + F(7372800, P_GCC_GPLL0_OUT_EVEN, 1, 384, 15625), 644 + F(14745600, P_GCC_GPLL0_OUT_EVEN, 1, 768, 15625), 645 + F(19200000, P_BI_TCXO, 1, 0, 0), 646 + F(29491200, P_GCC_GPLL0_OUT_EVEN, 1, 1536, 15625), 647 + F(32000000, P_GCC_GPLL0_OUT_EVEN, 1, 8, 75), 648 + F(48000000, P_GCC_GPLL0_OUT_EVEN, 1, 4, 25), 649 + F(51200000, P_GCC_GPLL0_OUT_EVEN, 1, 64, 375), 650 + F(64000000, P_GCC_GPLL0_OUT_EVEN, 1, 16, 75), 651 + F(75000000, P_GCC_GPLL0_OUT_EVEN, 4, 0, 0), 652 + F(80000000, P_GCC_GPLL0_OUT_EVEN, 1, 4, 15), 653 + F(96000000, P_GCC_GPLL0_OUT_EVEN, 1, 8, 25), 654 + F(100000000, P_GCC_GPLL0_OUT_MAIN, 6, 0, 0), 655 + F(102400000, P_GCC_GPLL0_OUT_EVEN, 1, 128, 375), 656 + F(112000000, P_GCC_GPLL0_OUT_EVEN, 1, 28, 75), 657 + F(117964800, P_GCC_GPLL0_OUT_EVEN, 1, 6144, 15625), 658 + F(120000000, P_GCC_GPLL0_OUT_MAIN, 5, 0, 0), 659 + F(150000000, P_GCC_GPLL0_OUT_EVEN, 2, 0, 0), 660 + F(250000000, P_GCC_GPLL7_OUT_MAIN, 2, 0, 0), 661 + { } 662 + }; 663 + 664 + static struct clk_init_data gcc_qupv3_wrap1_qspi_ref_clk_src_init = { 665 + .name = "gcc_qupv3_wrap1_qspi_ref_clk_src", 666 + .parent_data = gcc_parent_data_5, 667 + .num_parents = ARRAY_SIZE(gcc_parent_data_5), 668 + .flags = CLK_SET_RATE_PARENT, 669 + .ops = &clk_rcg2_shared_ops, 670 + }; 671 + 672 + static struct clk_rcg2 gcc_qupv3_wrap1_qspi_ref_clk_src = { 673 + .cmd_rcgr = 0x188c0, 674 + .mnd_width = 16, 675 + .hid_width = 5, 676 + .parent_map = gcc_parent_map_5, 677 + .freq_tbl = ftbl_gcc_qupv3_wrap1_qspi_ref_clk_src, 678 + .clkr.hw.init = &gcc_qupv3_wrap1_qspi_ref_clk_src_init, 679 + }; 680 + 681 + static const struct freq_tbl ftbl_gcc_qupv3_wrap1_s0_clk_src[] = { 682 + F(7372800, P_GCC_GPLL0_OUT_EVEN, 1, 384, 15625), 683 + F(14745600, P_GCC_GPLL0_OUT_EVEN, 1, 768, 15625), 684 + F(19200000, P_BI_TCXO, 1, 0, 0), 685 + F(29491200, P_GCC_GPLL0_OUT_EVEN, 1, 1536, 15625), 686 + F(32000000, P_GCC_GPLL0_OUT_EVEN, 1, 8, 75), 687 + F(48000000, P_GCC_GPLL0_OUT_EVEN, 1, 4, 25), 688 + F(51200000, P_GCC_GPLL0_OUT_EVEN, 1, 64, 375), 689 + F(64000000, P_GCC_GPLL0_OUT_EVEN, 1, 16, 75), 690 + F(75000000, P_GCC_GPLL0_OUT_EVEN, 4, 0, 0), 691 + F(80000000, P_GCC_GPLL0_OUT_EVEN, 1, 4, 15), 692 + F(96000000, P_GCC_GPLL0_OUT_EVEN, 1, 8, 25), 693 + F(100000000, P_GCC_GPLL0_OUT_MAIN, 6, 0, 0), 694 + F(102400000, P_GCC_GPLL0_OUT_EVEN, 1, 128, 375), 695 + F(112000000, P_GCC_GPLL0_OUT_EVEN, 1, 28, 75), 696 + F(117964800, P_GCC_GPLL0_OUT_EVEN, 1, 6144, 15625), 697 + F(120000000, P_GCC_GPLL0_OUT_MAIN, 5, 0, 0), 698 + { } 699 + }; 700 + 701 + static struct clk_init_data gcc_qupv3_wrap1_s0_clk_src_init = { 702 + .name = "gcc_qupv3_wrap1_s0_clk_src", 703 + .parent_data = gcc_parent_data_0, 704 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 705 + .flags = CLK_SET_RATE_PARENT, 706 + .ops = &clk_rcg2_shared_ops, 707 + }; 708 + 709 + static struct clk_rcg2 gcc_qupv3_wrap1_s0_clk_src = { 710 + .cmd_rcgr = 0x18014, 711 + .mnd_width = 16, 712 + .hid_width = 5, 713 + .parent_map = gcc_parent_map_0, 714 + .freq_tbl = ftbl_gcc_qupv3_wrap1_s0_clk_src, 715 + .clkr.hw.init = &gcc_qupv3_wrap1_s0_clk_src_init, 716 + }; 717 + 718 + static struct clk_init_data gcc_qupv3_wrap1_s1_clk_src_init = { 719 + .name = "gcc_qupv3_wrap1_s1_clk_src", 720 + .parent_data = gcc_parent_data_0, 721 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 722 + .flags = CLK_SET_RATE_PARENT, 723 + .ops = &clk_rcg2_shared_ops, 724 + }; 725 + 726 + static struct clk_rcg2 gcc_qupv3_wrap1_s1_clk_src = { 727 + .cmd_rcgr = 0x18150, 728 + .mnd_width = 16, 729 + .hid_width = 5, 730 + .parent_map = gcc_parent_map_0, 731 + .freq_tbl = ftbl_gcc_qupv3_wrap1_s0_clk_src, 732 + .clkr.hw.init = &gcc_qupv3_wrap1_s1_clk_src_init, 733 + }; 734 + 735 + static const struct freq_tbl ftbl_gcc_qupv3_wrap1_s3_clk_src[] = { 736 + F(7372800, P_GCC_GPLL0_OUT_EVEN, 1, 384, 15625), 737 + F(14745600, P_GCC_GPLL0_OUT_EVEN, 1, 768, 15625), 738 + F(19200000, P_BI_TCXO, 1, 0, 0), 739 + F(29491200, P_GCC_GPLL0_OUT_EVEN, 1, 1536, 15625), 740 + F(32000000, P_GCC_GPLL0_OUT_EVEN, 1, 8, 75), 741 + F(48000000, P_GCC_GPLL0_OUT_EVEN, 1, 4, 25), 742 + F(51200000, P_GCC_GPLL0_OUT_EVEN, 1, 64, 375), 743 + F(64000000, P_GCC_GPLL0_OUT_EVEN, 1, 16, 75), 744 + F(75000000, P_GCC_GPLL0_OUT_EVEN, 4, 0, 0), 745 + F(80000000, P_GCC_GPLL0_OUT_EVEN, 1, 4, 15), 746 + F(96000000, P_GCC_GPLL0_OUT_EVEN, 1, 8, 25), 747 + F(100000000, P_GCC_GPLL0_OUT_MAIN, 6, 0, 0), 748 + { } 749 + }; 750 + 751 + static struct clk_init_data gcc_qupv3_wrap1_s3_clk_src_init = { 752 + .name = "gcc_qupv3_wrap1_s3_clk_src", 753 + .parent_data = gcc_parent_data_0, 754 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 755 + .flags = CLK_SET_RATE_PARENT, 756 + .ops = &clk_rcg2_shared_ops, 757 + }; 758 + 759 + static struct clk_rcg2 gcc_qupv3_wrap1_s3_clk_src = { 760 + .cmd_rcgr = 0x182a0, 761 + .mnd_width = 16, 762 + .hid_width = 5, 763 + .parent_map = gcc_parent_map_0, 764 + .freq_tbl = ftbl_gcc_qupv3_wrap1_s3_clk_src, 765 + .clkr.hw.init = &gcc_qupv3_wrap1_s3_clk_src_init, 766 + }; 767 + 768 + static struct clk_init_data gcc_qupv3_wrap1_s4_clk_src_init = { 769 + .name = "gcc_qupv3_wrap1_s4_clk_src", 770 + .parent_data = gcc_parent_data_0, 771 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 772 + .flags = CLK_SET_RATE_PARENT, 773 + .ops = &clk_rcg2_shared_ops, 774 + }; 775 + 776 + static struct clk_rcg2 gcc_qupv3_wrap1_s4_clk_src = { 777 + .cmd_rcgr = 0x183dc, 778 + .mnd_width = 16, 779 + .hid_width = 5, 780 + .parent_map = gcc_parent_map_0, 781 + .freq_tbl = ftbl_gcc_qupv3_wrap1_s0_clk_src, 782 + .clkr.hw.init = &gcc_qupv3_wrap1_s4_clk_src_init, 783 + }; 784 + 785 + static struct clk_init_data gcc_qupv3_wrap1_s5_clk_src_init = { 786 + .name = "gcc_qupv3_wrap1_s5_clk_src", 787 + .parent_data = gcc_parent_data_0, 788 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 789 + .flags = CLK_SET_RATE_PARENT, 790 + .ops = &clk_rcg2_shared_ops, 791 + }; 792 + 793 + static struct clk_rcg2 gcc_qupv3_wrap1_s5_clk_src = { 794 + .cmd_rcgr = 0x18518, 795 + .mnd_width = 16, 796 + .hid_width = 5, 797 + .parent_map = gcc_parent_map_0, 798 + .freq_tbl = ftbl_gcc_qupv3_wrap1_s3_clk_src, 799 + .clkr.hw.init = &gcc_qupv3_wrap1_s5_clk_src_init, 800 + }; 801 + 802 + static struct clk_init_data gcc_qupv3_wrap1_s6_clk_src_init = { 803 + .name = "gcc_qupv3_wrap1_s6_clk_src", 804 + .parent_data = gcc_parent_data_0, 805 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 806 + .flags = CLK_SET_RATE_PARENT, 807 + .ops = &clk_rcg2_shared_ops, 808 + }; 809 + 810 + static struct clk_rcg2 gcc_qupv3_wrap1_s6_clk_src = { 811 + .cmd_rcgr = 0x18654, 812 + .mnd_width = 16, 813 + .hid_width = 5, 814 + .parent_map = gcc_parent_map_0, 815 + .freq_tbl = ftbl_gcc_qupv3_wrap1_s3_clk_src, 816 + .clkr.hw.init = &gcc_qupv3_wrap1_s6_clk_src_init, 817 + }; 818 + 819 + static struct clk_init_data gcc_qupv3_wrap1_s7_clk_src_init = { 820 + .name = "gcc_qupv3_wrap1_s7_clk_src", 821 + .parent_data = gcc_parent_data_0, 822 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 823 + .flags = CLK_SET_RATE_PARENT, 824 + .ops = &clk_rcg2_shared_ops, 825 + }; 826 + 827 + static struct clk_rcg2 gcc_qupv3_wrap1_s7_clk_src = { 828 + .cmd_rcgr = 0x18790, 829 + .mnd_width = 16, 830 + .hid_width = 5, 831 + .parent_map = gcc_parent_map_0, 832 + .freq_tbl = ftbl_gcc_qupv3_wrap1_s3_clk_src, 833 + .clkr.hw.init = &gcc_qupv3_wrap1_s7_clk_src_init, 834 + }; 835 + 836 + static const struct freq_tbl ftbl_gcc_qupv3_wrap2_ibi_ctrl_0_clk_src[] = { 837 + F(37500000, P_GCC_GPLL0_OUT_EVEN, 8, 0, 0), 838 + { } 839 + }; 840 + 841 + static struct clk_rcg2 gcc_qupv3_wrap2_ibi_ctrl_0_clk_src = { 842 + .cmd_rcgr = 0x1e9f4, 843 + .mnd_width = 0, 844 + .hid_width = 5, 845 + .parent_map = gcc_parent_map_2, 846 + .freq_tbl = ftbl_gcc_qupv3_wrap2_ibi_ctrl_0_clk_src, 847 + .clkr.hw.init = &(const struct clk_init_data) { 848 + .name = "gcc_qupv3_wrap2_ibi_ctrl_0_clk_src", 849 + .parent_data = gcc_parent_data_2, 850 + .num_parents = ARRAY_SIZE(gcc_parent_data_2), 851 + .flags = CLK_SET_RATE_PARENT, 852 + .ops = &clk_rcg2_shared_ops, 853 + }, 854 + }; 855 + 856 + static struct clk_init_data gcc_qupv3_wrap2_s0_clk_src_init = { 857 + .name = "gcc_qupv3_wrap2_s0_clk_src", 858 + .parent_data = gcc_parent_data_0, 859 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 860 + .flags = CLK_SET_RATE_PARENT, 861 + .ops = &clk_rcg2_shared_ops, 862 + }; 863 + 864 + static struct clk_rcg2 gcc_qupv3_wrap2_s0_clk_src = { 865 + .cmd_rcgr = 0x1e014, 866 + .mnd_width = 16, 867 + .hid_width = 5, 868 + .parent_map = gcc_parent_map_0, 869 + .freq_tbl = ftbl_gcc_qupv3_wrap1_s0_clk_src, 870 + .clkr.hw.init = &gcc_qupv3_wrap2_s0_clk_src_init, 871 + }; 872 + 873 + static struct clk_init_data gcc_qupv3_wrap2_s1_clk_src_init = { 874 + .name = "gcc_qupv3_wrap2_s1_clk_src", 875 + .parent_data = gcc_parent_data_0, 876 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 877 + .flags = CLK_SET_RATE_PARENT, 878 + .ops = &clk_rcg2_shared_ops, 879 + }; 880 + 881 + static struct clk_rcg2 gcc_qupv3_wrap2_s1_clk_src = { 882 + .cmd_rcgr = 0x1e150, 883 + .mnd_width = 16, 884 + .hid_width = 5, 885 + .parent_map = gcc_parent_map_0, 886 + .freq_tbl = ftbl_gcc_qupv3_wrap1_s0_clk_src, 887 + .clkr.hw.init = &gcc_qupv3_wrap2_s1_clk_src_init, 888 + }; 889 + 890 + static struct clk_init_data gcc_qupv3_wrap2_s2_clk_src_init = { 891 + .name = "gcc_qupv3_wrap2_s2_clk_src", 892 + .parent_data = gcc_parent_data_0, 893 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 894 + .flags = CLK_SET_RATE_PARENT, 895 + .ops = &clk_rcg2_shared_ops, 896 + }; 897 + 898 + static struct clk_rcg2 gcc_qupv3_wrap2_s2_clk_src = { 899 + .cmd_rcgr = 0x1e28c, 900 + .mnd_width = 16, 901 + .hid_width = 5, 902 + .parent_map = gcc_parent_map_0, 903 + .freq_tbl = ftbl_gcc_qupv3_wrap1_s0_clk_src, 904 + .clkr.hw.init = &gcc_qupv3_wrap2_s2_clk_src_init, 905 + }; 906 + 907 + static struct clk_init_data gcc_qupv3_wrap2_s3_clk_src_init = { 908 + .name = "gcc_qupv3_wrap2_s3_clk_src", 909 + .parent_data = gcc_parent_data_0, 910 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 911 + .flags = CLK_SET_RATE_PARENT, 912 + .ops = &clk_rcg2_shared_ops, 913 + }; 914 + 915 + static struct clk_rcg2 gcc_qupv3_wrap2_s3_clk_src = { 916 + .cmd_rcgr = 0x1e3c8, 917 + .mnd_width = 16, 918 + .hid_width = 5, 919 + .parent_map = gcc_parent_map_0, 920 + .freq_tbl = ftbl_gcc_qupv3_wrap1_s0_clk_src, 921 + .clkr.hw.init = &gcc_qupv3_wrap2_s3_clk_src_init, 922 + }; 923 + 924 + static struct clk_init_data gcc_qupv3_wrap2_s4_clk_src_init = { 925 + .name = "gcc_qupv3_wrap2_s4_clk_src", 926 + .parent_data = gcc_parent_data_0, 927 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 928 + .flags = CLK_SET_RATE_PARENT, 929 + .ops = &clk_rcg2_shared_ops, 930 + }; 931 + 932 + static struct clk_rcg2 gcc_qupv3_wrap2_s4_clk_src = { 933 + .cmd_rcgr = 0x1e504, 934 + .mnd_width = 16, 935 + .hid_width = 5, 936 + .parent_map = gcc_parent_map_0, 937 + .freq_tbl = ftbl_gcc_qupv3_wrap1_s3_clk_src, 938 + .clkr.hw.init = &gcc_qupv3_wrap2_s4_clk_src_init, 939 + }; 940 + 941 + static struct clk_init_data gcc_qupv3_wrap2_s5_clk_src_init = { 942 + .name = "gcc_qupv3_wrap2_s5_clk_src", 943 + .parent_data = gcc_parent_data_0, 944 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 945 + .flags = CLK_SET_RATE_PARENT, 946 + .ops = &clk_rcg2_shared_ops, 947 + }; 948 + 949 + static struct clk_rcg2 gcc_qupv3_wrap2_s5_clk_src = { 950 + .cmd_rcgr = 0x1e640, 951 + .mnd_width = 16, 952 + .hid_width = 5, 953 + .parent_map = gcc_parent_map_0, 954 + .freq_tbl = ftbl_gcc_qupv3_wrap1_s3_clk_src, 955 + .clkr.hw.init = &gcc_qupv3_wrap2_s5_clk_src_init, 956 + }; 957 + 958 + static const struct freq_tbl ftbl_gcc_qupv3_wrap2_s6_clk_src[] = { 959 + F(7372800, P_GCC_GPLL0_OUT_EVEN, 1, 384, 15625), 960 + F(14745600, P_GCC_GPLL0_OUT_EVEN, 1, 768, 15625), 961 + F(19200000, P_BI_TCXO, 1, 0, 0), 962 + F(29491200, P_GCC_GPLL0_OUT_EVEN, 1, 1536, 15625), 963 + F(32000000, P_GCC_GPLL0_OUT_EVEN, 1, 8, 75), 964 + F(48000000, P_GCC_GPLL0_OUT_EVEN, 1, 4, 25), 965 + F(51200000, P_GCC_GPLL0_OUT_EVEN, 1, 64, 375), 966 + F(64000000, P_GCC_GPLL0_OUT_EVEN, 1, 16, 75), 967 + F(75000000, P_GCC_GPLL0_OUT_EVEN, 4, 0, 0), 968 + F(80000000, P_GCC_GPLL0_OUT_EVEN, 1, 4, 15), 969 + F(96000000, P_GCC_GPLL0_OUT_EVEN, 1, 8, 25), 970 + F(100000000, P_GCC_GPLL0_OUT_MAIN, 6, 0, 0), 971 + F(102400000, P_GCC_GPLL0_OUT_EVEN, 1, 128, 375), 972 + F(112000000, P_GCC_GPLL0_OUT_EVEN, 1, 28, 75), 973 + F(117964800, P_GCC_GPLL0_OUT_EVEN, 1, 6144, 15625), 974 + F(128000000, P_GCC_GPLL0_OUT_MAIN, 1, 16, 75), 975 + { } 976 + }; 977 + 978 + static struct clk_init_data gcc_qupv3_wrap2_s6_clk_src_init = { 979 + .name = "gcc_qupv3_wrap2_s6_clk_src", 980 + .parent_data = gcc_parent_data_5, 981 + .num_parents = ARRAY_SIZE(gcc_parent_data_5), 982 + .flags = CLK_SET_RATE_PARENT, 983 + .ops = &clk_rcg2_shared_ops, 984 + }; 985 + 986 + static struct clk_rcg2 gcc_qupv3_wrap2_s6_clk_src = { 987 + .cmd_rcgr = 0x1e77c, 988 + .mnd_width = 16, 989 + .hid_width = 5, 990 + .parent_map = gcc_parent_map_5, 991 + .freq_tbl = ftbl_gcc_qupv3_wrap2_s6_clk_src, 992 + .clkr.hw.init = &gcc_qupv3_wrap2_s6_clk_src_init, 993 + }; 994 + 995 + static struct clk_init_data gcc_qupv3_wrap2_s7_clk_src_init = { 996 + .name = "gcc_qupv3_wrap2_s7_clk_src", 997 + .parent_data = gcc_parent_data_0, 998 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 999 + .flags = CLK_SET_RATE_PARENT, 1000 + .ops = &clk_rcg2_shared_ops, 1001 + }; 1002 + 1003 + static struct clk_rcg2 gcc_qupv3_wrap2_s7_clk_src = { 1004 + .cmd_rcgr = 0x1e8b8, 1005 + .mnd_width = 16, 1006 + .hid_width = 5, 1007 + .parent_map = gcc_parent_map_0, 1008 + .freq_tbl = ftbl_gcc_qupv3_wrap1_s0_clk_src, 1009 + .clkr.hw.init = &gcc_qupv3_wrap2_s7_clk_src_init, 1010 + }; 1011 + 1012 + static const struct freq_tbl ftbl_gcc_sdcc2_apps_clk_src[] = { 1013 + F(400000, P_BI_TCXO, 12, 1, 4), 1014 + F(25000000, P_GCC_GPLL0_OUT_EVEN, 12, 0, 0), 1015 + F(50000000, P_GCC_GPLL0_OUT_EVEN, 6, 0, 0), 1016 + F(100000000, P_GCC_GPLL0_OUT_EVEN, 3, 0, 0), 1017 + F(202000000, P_GCC_GPLL9_OUT_MAIN, 4, 0, 0), 1018 + { } 1019 + }; 1020 + 1021 + static struct clk_rcg2 gcc_sdcc2_apps_clk_src = { 1022 + .cmd_rcgr = 0x1401c, 1023 + .mnd_width = 8, 1024 + .hid_width = 5, 1025 + .parent_map = gcc_parent_map_8, 1026 + .freq_tbl = ftbl_gcc_sdcc2_apps_clk_src, 1027 + .clkr.hw.init = &(const struct clk_init_data) { 1028 + .name = "gcc_sdcc2_apps_clk_src", 1029 + .parent_data = gcc_parent_data_8, 1030 + .num_parents = ARRAY_SIZE(gcc_parent_data_8), 1031 + .flags = CLK_SET_RATE_PARENT, 1032 + .ops = &clk_rcg2_floor_ops, 1033 + }, 1034 + }; 1035 + 1036 + static const struct freq_tbl ftbl_gcc_sdcc4_apps_clk_src[] = { 1037 + F(400000, P_BI_TCXO, 12, 1, 4), 1038 + F(25000000, P_GCC_GPLL0_OUT_EVEN, 12, 0, 0), 1039 + F(75000000, P_GCC_GPLL0_OUT_EVEN, 4, 0, 0), 1040 + { } 1041 + }; 1042 + 1043 + static struct clk_rcg2 gcc_sdcc4_apps_clk_src = { 1044 + .cmd_rcgr = 0x1601c, 1045 + .mnd_width = 8, 1046 + .hid_width = 5, 1047 + .parent_map = gcc_parent_map_0, 1048 + .freq_tbl = ftbl_gcc_sdcc4_apps_clk_src, 1049 + .clkr.hw.init = &(const struct clk_init_data) { 1050 + .name = "gcc_sdcc4_apps_clk_src", 1051 + .parent_data = gcc_parent_data_0, 1052 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 1053 + .flags = CLK_SET_RATE_PARENT, 1054 + .ops = &clk_rcg2_floor_ops, 1055 + }, 1056 + }; 1057 + 1058 + static const struct freq_tbl ftbl_gcc_ufs_phy_axi_clk_src[] = { 1059 + F(25000000, P_GCC_GPLL0_OUT_EVEN, 12, 0, 0), 1060 + F(100000000, P_GCC_GPLL0_OUT_EVEN, 3, 0, 0), 1061 + F(201500000, P_GCC_GPLL4_OUT_MAIN, 4, 0, 0), 1062 + F(403000000, P_GCC_GPLL4_OUT_MAIN, 2, 0, 0), 1063 + { } 1064 + }; 1065 + 1066 + static struct clk_rcg2 gcc_ufs_phy_axi_clk_src = { 1067 + .cmd_rcgr = 0x77034, 1068 + .mnd_width = 8, 1069 + .hid_width = 5, 1070 + .parent_map = gcc_parent_map_3, 1071 + .freq_tbl = ftbl_gcc_ufs_phy_axi_clk_src, 1072 + .clkr.hw.init = &(const struct clk_init_data) { 1073 + .name = "gcc_ufs_phy_axi_clk_src", 1074 + .parent_data = gcc_parent_data_3, 1075 + .num_parents = ARRAY_SIZE(gcc_parent_data_3), 1076 + .flags = CLK_SET_RATE_PARENT, 1077 + .ops = &clk_rcg2_shared_ops, 1078 + }, 1079 + }; 1080 + 1081 + static const struct freq_tbl ftbl_gcc_ufs_phy_ice_core_clk_src[] = { 1082 + F(100000000, P_GCC_GPLL0_OUT_EVEN, 3, 0, 0), 1083 + F(201500000, P_GCC_GPLL4_OUT_MAIN, 4, 0, 0), 1084 + F(403000000, P_GCC_GPLL4_OUT_MAIN, 2, 0, 0), 1085 + { } 1086 + }; 1087 + 1088 + static struct clk_rcg2 gcc_ufs_phy_ice_core_clk_src = { 1089 + .cmd_rcgr = 0x7708c, 1090 + .mnd_width = 0, 1091 + .hid_width = 5, 1092 + .parent_map = gcc_parent_map_3, 1093 + .freq_tbl = ftbl_gcc_ufs_phy_ice_core_clk_src, 1094 + .clkr.hw.init = &(const struct clk_init_data) { 1095 + .name = "gcc_ufs_phy_ice_core_clk_src", 1096 + .parent_data = gcc_parent_data_3, 1097 + .num_parents = ARRAY_SIZE(gcc_parent_data_3), 1098 + .flags = CLK_SET_RATE_PARENT, 1099 + .ops = &clk_rcg2_shared_ops, 1100 + }, 1101 + }; 1102 + 1103 + static const struct freq_tbl ftbl_gcc_ufs_phy_phy_aux_clk_src[] = { 1104 + F(9600000, P_BI_TCXO, 2, 0, 0), 1105 + F(19200000, P_BI_TCXO, 1, 0, 0), 1106 + { } 1107 + }; 1108 + 1109 + static struct clk_rcg2 gcc_ufs_phy_phy_aux_clk_src = { 1110 + .cmd_rcgr = 0x770c0, 1111 + .mnd_width = 0, 1112 + .hid_width = 5, 1113 + .parent_map = gcc_parent_map_6, 1114 + .freq_tbl = ftbl_gcc_ufs_phy_phy_aux_clk_src, 1115 + .clkr.hw.init = &(const struct clk_init_data) { 1116 + .name = "gcc_ufs_phy_phy_aux_clk_src", 1117 + .parent_data = gcc_parent_data_6, 1118 + .num_parents = ARRAY_SIZE(gcc_parent_data_6), 1119 + .flags = CLK_SET_RATE_PARENT, 1120 + .ops = &clk_rcg2_shared_ops, 1121 + }, 1122 + }; 1123 + 1124 + static struct clk_rcg2 gcc_ufs_phy_unipro_core_clk_src = { 1125 + .cmd_rcgr = 0x770a4, 1126 + .mnd_width = 0, 1127 + .hid_width = 5, 1128 + .parent_map = gcc_parent_map_3, 1129 + .freq_tbl = ftbl_gcc_ufs_phy_ice_core_clk_src, 1130 + .clkr.hw.init = &(const struct clk_init_data) { 1131 + .name = "gcc_ufs_phy_unipro_core_clk_src", 1132 + .parent_data = gcc_parent_data_3, 1133 + .num_parents = ARRAY_SIZE(gcc_parent_data_3), 1134 + .flags = CLK_SET_RATE_PARENT, 1135 + .ops = &clk_rcg2_shared_ops, 1136 + }, 1137 + }; 1138 + 1139 + static const struct freq_tbl ftbl_gcc_usb30_prim_master_clk_src[] = { 1140 + F(66666667, P_GCC_GPLL0_OUT_EVEN, 4.5, 0, 0), 1141 + F(133333333, P_GCC_GPLL0_OUT_MAIN, 4.5, 0, 0), 1142 + F(200000000, P_GCC_GPLL0_OUT_MAIN, 3, 0, 0), 1143 + F(240000000, P_GCC_GPLL0_OUT_MAIN, 2.5, 0, 0), 1144 + { } 1145 + }; 1146 + 1147 + static struct clk_rcg2 gcc_usb30_prim_master_clk_src = { 1148 + .cmd_rcgr = 0x39030, 1149 + .mnd_width = 8, 1150 + .hid_width = 5, 1151 + .parent_map = gcc_parent_map_0, 1152 + .freq_tbl = ftbl_gcc_usb30_prim_master_clk_src, 1153 + .clkr.hw.init = &(const struct clk_init_data) { 1154 + .name = "gcc_usb30_prim_master_clk_src", 1155 + .parent_data = gcc_parent_data_0, 1156 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 1157 + .flags = CLK_SET_RATE_PARENT, 1158 + .ops = &clk_rcg2_shared_ops, 1159 + }, 1160 + }; 1161 + 1162 + static struct clk_rcg2 gcc_usb30_prim_mock_utmi_clk_src = { 1163 + .cmd_rcgr = 0x39048, 1164 + .mnd_width = 0, 1165 + .hid_width = 5, 1166 + .parent_map = gcc_parent_map_0, 1167 + .freq_tbl = ftbl_gcc_pcie_0_aux_clk_src, 1168 + .clkr.hw.init = &(const struct clk_init_data) { 1169 + .name = "gcc_usb30_prim_mock_utmi_clk_src", 1170 + .parent_data = gcc_parent_data_0, 1171 + .num_parents = ARRAY_SIZE(gcc_parent_data_0), 1172 + .flags = CLK_SET_RATE_PARENT, 1173 + .ops = &clk_rcg2_shared_ops, 1174 + }, 1175 + }; 1176 + 1177 + static struct clk_rcg2 gcc_usb3_prim_phy_aux_clk_src = { 1178 + .cmd_rcgr = 0x39074, 1179 + .mnd_width = 0, 1180 + .hid_width = 5, 1181 + .parent_map = gcc_parent_map_4, 1182 + .freq_tbl = ftbl_gcc_pcie_0_aux_clk_src, 1183 + .clkr.hw.init = &(const struct clk_init_data) { 1184 + .name = "gcc_usb3_prim_phy_aux_clk_src", 1185 + .parent_data = gcc_parent_data_4, 1186 + .num_parents = ARRAY_SIZE(gcc_parent_data_4), 1187 + .flags = CLK_SET_RATE_PARENT, 1188 + .ops = &clk_rcg2_shared_ops, 1189 + }, 1190 + }; 1191 + 1192 + static struct clk_regmap_div gcc_qupv3_wrap1_s2_clk_src = { 1193 + .reg = 0x1828c, 1194 + .shift = 0, 1195 + .width = 4, 1196 + .clkr.hw.init = &(const struct clk_init_data) { 1197 + .name = "gcc_qupv3_wrap1_s2_clk_src", 1198 + .parent_hws = (const struct clk_hw*[]) { 1199 + &gcc_qupv3_wrap1_qspi_ref_clk_src.clkr.hw, 1200 + }, 1201 + .num_parents = 1, 1202 + .flags = CLK_SET_RATE_PARENT, 1203 + .ops = &clk_regmap_div_ro_ops, 1204 + }, 1205 + }; 1206 + 1207 + static struct clk_regmap_div gcc_usb30_prim_mock_utmi_postdiv_clk_src = { 1208 + .reg = 0x39060, 1209 + .shift = 0, 1210 + .width = 4, 1211 + .clkr.hw.init = &(const struct clk_init_data) { 1212 + .name = "gcc_usb30_prim_mock_utmi_postdiv_clk_src", 1213 + .parent_hws = (const struct clk_hw*[]) { 1214 + &gcc_usb30_prim_mock_utmi_clk_src.clkr.hw, 1215 + }, 1216 + .num_parents = 1, 1217 + .flags = CLK_SET_RATE_PARENT, 1218 + .ops = &clk_regmap_div_ro_ops, 1219 + }, 1220 + }; 1221 + 1222 + static struct clk_branch gcc_aggre_noc_pcie_axi_clk = { 1223 + .halt_reg = 0x10068, 1224 + .halt_check = BRANCH_HALT_SKIP, 1225 + .hwcg_reg = 0x10068, 1226 + .hwcg_bit = 1, 1227 + .clkr = { 1228 + .enable_reg = 0x52000, 1229 + .enable_mask = BIT(12), 1230 + .hw.init = &(const struct clk_init_data) { 1231 + .name = "gcc_aggre_noc_pcie_axi_clk", 1232 + .ops = &clk_branch2_ops, 1233 + }, 1234 + }, 1235 + }; 1236 + 1237 + static struct clk_branch gcc_aggre_ufs_phy_axi_clk = { 1238 + .halt_reg = 0x770f0, 1239 + .halt_check = BRANCH_HALT_VOTED, 1240 + .hwcg_reg = 0x770f0, 1241 + .hwcg_bit = 1, 1242 + .clkr = { 1243 + .enable_reg = 0x770f0, 1244 + .enable_mask = BIT(0), 1245 + .hw.init = &(const struct clk_init_data) { 1246 + .name = "gcc_aggre_ufs_phy_axi_clk", 1247 + .parent_hws = (const struct clk_hw*[]) { 1248 + &gcc_ufs_phy_axi_clk_src.clkr.hw, 1249 + }, 1250 + .num_parents = 1, 1251 + .flags = CLK_SET_RATE_PARENT, 1252 + .ops = &clk_branch2_ops, 1253 + }, 1254 + }, 1255 + }; 1256 + 1257 + static struct clk_branch gcc_aggre_usb3_prim_axi_clk = { 1258 + .halt_reg = 0x39090, 1259 + .halt_check = BRANCH_HALT_VOTED, 1260 + .hwcg_reg = 0x39090, 1261 + .hwcg_bit = 1, 1262 + .clkr = { 1263 + .enable_reg = 0x39090, 1264 + .enable_mask = BIT(0), 1265 + .hw.init = &(const struct clk_init_data) { 1266 + .name = "gcc_aggre_usb3_prim_axi_clk", 1267 + .parent_hws = (const struct clk_hw*[]) { 1268 + &gcc_usb30_prim_master_clk_src.clkr.hw, 1269 + }, 1270 + .num_parents = 1, 1271 + .flags = CLK_SET_RATE_PARENT, 1272 + .ops = &clk_branch2_ops, 1273 + }, 1274 + }, 1275 + }; 1276 + 1277 + static struct clk_branch gcc_boot_rom_ahb_clk = { 1278 + .halt_reg = 0x38004, 1279 + .halt_check = BRANCH_HALT_VOTED, 1280 + .hwcg_reg = 0x38004, 1281 + .hwcg_bit = 1, 1282 + .clkr = { 1283 + .enable_reg = 0x52000, 1284 + .enable_mask = BIT(10), 1285 + .hw.init = &(const struct clk_init_data) { 1286 + .name = "gcc_boot_rom_ahb_clk", 1287 + .ops = &clk_branch2_ops, 1288 + }, 1289 + }, 1290 + }; 1291 + 1292 + static struct clk_branch gcc_camera_hf_axi_clk = { 1293 + .halt_reg = 0x26014, 1294 + .halt_check = BRANCH_HALT_SKIP, 1295 + .hwcg_reg = 0x26014, 1296 + .hwcg_bit = 1, 1297 + .clkr = { 1298 + .enable_reg = 0x26014, 1299 + .enable_mask = BIT(0), 1300 + .hw.init = &(const struct clk_init_data) { 1301 + .name = "gcc_camera_hf_axi_clk", 1302 + .ops = &clk_branch2_ops, 1303 + }, 1304 + }, 1305 + }; 1306 + 1307 + static struct clk_branch gcc_camera_sf_axi_clk = { 1308 + .halt_reg = 0x26024, 1309 + .halt_check = BRANCH_HALT_SKIP, 1310 + .hwcg_reg = 0x26024, 1311 + .hwcg_bit = 1, 1312 + .clkr = { 1313 + .enable_reg = 0x26024, 1314 + .enable_mask = BIT(0), 1315 + .hw.init = &(const struct clk_init_data) { 1316 + .name = "gcc_camera_sf_axi_clk", 1317 + .ops = &clk_branch2_ops, 1318 + }, 1319 + }, 1320 + }; 1321 + 1322 + static struct clk_branch gcc_cfg_noc_pcie_anoc_ahb_clk = { 1323 + .halt_reg = 0x10050, 1324 + .halt_check = BRANCH_HALT_VOTED, 1325 + .hwcg_reg = 0x10050, 1326 + .hwcg_bit = 1, 1327 + .clkr = { 1328 + .enable_reg = 0x52000, 1329 + .enable_mask = BIT(20), 1330 + .hw.init = &(const struct clk_init_data) { 1331 + .name = "gcc_cfg_noc_pcie_anoc_ahb_clk", 1332 + .ops = &clk_branch2_ops, 1333 + }, 1334 + }, 1335 + }; 1336 + 1337 + static struct clk_branch gcc_cfg_noc_usb3_prim_axi_clk = { 1338 + .halt_reg = 0x3908c, 1339 + .halt_check = BRANCH_HALT_VOTED, 1340 + .hwcg_reg = 0x3908c, 1341 + .hwcg_bit = 1, 1342 + .clkr = { 1343 + .enable_reg = 0x3908c, 1344 + .enable_mask = BIT(0), 1345 + .hw.init = &(const struct clk_init_data) { 1346 + .name = "gcc_cfg_noc_usb3_prim_axi_clk", 1347 + .parent_hws = (const struct clk_hw*[]) { 1348 + &gcc_usb30_prim_master_clk_src.clkr.hw, 1349 + }, 1350 + .num_parents = 1, 1351 + .flags = CLK_SET_RATE_PARENT, 1352 + .ops = &clk_branch2_ops, 1353 + }, 1354 + }, 1355 + }; 1356 + 1357 + static struct clk_branch gcc_cnoc_pcie_sf_axi_clk = { 1358 + .halt_reg = 0x10058, 1359 + .halt_check = BRANCH_HALT_VOTED, 1360 + .hwcg_reg = 0x10058, 1361 + .hwcg_bit = 1, 1362 + .clkr = { 1363 + .enable_reg = 0x52008, 1364 + .enable_mask = BIT(6), 1365 + .hw.init = &(const struct clk_init_data) { 1366 + .name = "gcc_cnoc_pcie_sf_axi_clk", 1367 + .ops = &clk_branch2_ops, 1368 + }, 1369 + }, 1370 + }; 1371 + 1372 + static struct clk_branch gcc_ddrss_gpu_axi_clk = { 1373 + .halt_reg = 0x71150, 1374 + .halt_check = BRANCH_HALT_SKIP, 1375 + .hwcg_reg = 0x71150, 1376 + .hwcg_bit = 1, 1377 + .clkr = { 1378 + .enable_reg = 0x71150, 1379 + .enable_mask = BIT(0), 1380 + .hw.init = &(const struct clk_init_data) { 1381 + .name = "gcc_ddrss_gpu_axi_clk", 1382 + .ops = &clk_branch2_aon_ops, 1383 + }, 1384 + }, 1385 + }; 1386 + 1387 + static struct clk_branch gcc_ddrss_pcie_sf_qtb_clk = { 1388 + .halt_reg = 0x1007c, 1389 + .halt_check = BRANCH_HALT_SKIP, 1390 + .hwcg_reg = 0x1007c, 1391 + .hwcg_bit = 1, 1392 + .clkr = { 1393 + .enable_reg = 0x52000, 1394 + .enable_mask = BIT(19), 1395 + .hw.init = &(const struct clk_init_data) { 1396 + .name = "gcc_ddrss_pcie_sf_qtb_clk", 1397 + .ops = &clk_branch2_ops, 1398 + }, 1399 + }, 1400 + }; 1401 + 1402 + static struct clk_branch gcc_disp_hf_axi_clk = { 1403 + .halt_reg = 0x27008, 1404 + .halt_check = BRANCH_HALT_SKIP, 1405 + .clkr = { 1406 + .enable_reg = 0x27008, 1407 + .enable_mask = BIT(0), 1408 + .hw.init = &(const struct clk_init_data) { 1409 + .name = "gcc_disp_hf_axi_clk", 1410 + .ops = &clk_branch2_ops, 1411 + }, 1412 + }, 1413 + }; 1414 + 1415 + static struct clk_branch gcc_eva_axi0_clk = { 1416 + .halt_reg = 0x9f008, 1417 + .halt_check = BRANCH_HALT_SKIP, 1418 + .hwcg_reg = 0x9f008, 1419 + .hwcg_bit = 1, 1420 + .clkr = { 1421 + .enable_reg = 0x9f008, 1422 + .enable_mask = BIT(0), 1423 + .hw.init = &(const struct clk_init_data) { 1424 + .name = "gcc_eva_axi0_clk", 1425 + .ops = &clk_branch2_ops, 1426 + }, 1427 + }, 1428 + }; 1429 + 1430 + static struct clk_branch gcc_eva_axi0c_clk = { 1431 + .halt_reg = 0x9f018, 1432 + .halt_check = BRANCH_HALT_SKIP, 1433 + .hwcg_reg = 0x9f018, 1434 + .hwcg_bit = 1, 1435 + .clkr = { 1436 + .enable_reg = 0x9f018, 1437 + .enable_mask = BIT(0), 1438 + .hw.init = &(const struct clk_init_data) { 1439 + .name = "gcc_eva_axi0c_clk", 1440 + .ops = &clk_branch2_ops, 1441 + }, 1442 + }, 1443 + }; 1444 + 1445 + static struct clk_branch gcc_gp1_clk = { 1446 + .halt_reg = 0x64000, 1447 + .halt_check = BRANCH_HALT, 1448 + .clkr = { 1449 + .enable_reg = 0x64000, 1450 + .enable_mask = BIT(0), 1451 + .hw.init = &(const struct clk_init_data) { 1452 + .name = "gcc_gp1_clk", 1453 + .parent_hws = (const struct clk_hw*[]) { 1454 + &gcc_gp1_clk_src.clkr.hw, 1455 + }, 1456 + .num_parents = 1, 1457 + .flags = CLK_SET_RATE_PARENT, 1458 + .ops = &clk_branch2_ops, 1459 + }, 1460 + }, 1461 + }; 1462 + 1463 + static struct clk_branch gcc_gp2_clk = { 1464 + .halt_reg = 0x65000, 1465 + .halt_check = BRANCH_HALT, 1466 + .clkr = { 1467 + .enable_reg = 0x65000, 1468 + .enable_mask = BIT(0), 1469 + .hw.init = &(const struct clk_init_data) { 1470 + .name = "gcc_gp2_clk", 1471 + .parent_hws = (const struct clk_hw*[]) { 1472 + &gcc_gp2_clk_src.clkr.hw, 1473 + }, 1474 + .num_parents = 1, 1475 + .flags = CLK_SET_RATE_PARENT, 1476 + .ops = &clk_branch2_ops, 1477 + }, 1478 + }, 1479 + }; 1480 + 1481 + static struct clk_branch gcc_gp3_clk = { 1482 + .halt_reg = 0x66000, 1483 + .halt_check = BRANCH_HALT, 1484 + .clkr = { 1485 + .enable_reg = 0x66000, 1486 + .enable_mask = BIT(0), 1487 + .hw.init = &(const struct clk_init_data) { 1488 + .name = "gcc_gp3_clk", 1489 + .parent_hws = (const struct clk_hw*[]) { 1490 + &gcc_gp3_clk_src.clkr.hw, 1491 + }, 1492 + .num_parents = 1, 1493 + .flags = CLK_SET_RATE_PARENT, 1494 + .ops = &clk_branch2_ops, 1495 + }, 1496 + }, 1497 + }; 1498 + 1499 + static struct clk_branch gcc_gpu_gemnoc_gfx_clk = { 1500 + .halt_reg = 0x71010, 1501 + .halt_check = BRANCH_HALT_VOTED, 1502 + .hwcg_reg = 0x71010, 1503 + .hwcg_bit = 1, 1504 + .clkr = { 1505 + .enable_reg = 0x71010, 1506 + .enable_mask = BIT(0), 1507 + .hw.init = &(const struct clk_init_data) { 1508 + .name = "gcc_gpu_gemnoc_gfx_clk", 1509 + .ops = &clk_branch2_ops, 1510 + }, 1511 + }, 1512 + }; 1513 + 1514 + static struct clk_branch gcc_gpu_gpll0_clk_src = { 1515 + .halt_check = BRANCH_HALT_DELAY, 1516 + .clkr = { 1517 + .enable_reg = 0x52000, 1518 + .enable_mask = BIT(15), 1519 + .hw.init = &(const struct clk_init_data) { 1520 + .name = "gcc_gpu_gpll0_clk_src", 1521 + .parent_hws = (const struct clk_hw*[]) { 1522 + &gcc_gpll0.clkr.hw, 1523 + }, 1524 + .num_parents = 1, 1525 + .flags = CLK_SET_RATE_PARENT, 1526 + .ops = &clk_branch2_ops, 1527 + }, 1528 + }, 1529 + }; 1530 + 1531 + static struct clk_branch gcc_gpu_gpll0_div_clk_src = { 1532 + .halt_check = BRANCH_HALT_DELAY, 1533 + .clkr = { 1534 + .enable_reg = 0x52000, 1535 + .enable_mask = BIT(16), 1536 + .hw.init = &(const struct clk_init_data) { 1537 + .name = "gcc_gpu_gpll0_div_clk_src", 1538 + .parent_hws = (const struct clk_hw*[]) { 1539 + &gcc_gpll0_out_even.clkr.hw, 1540 + }, 1541 + .num_parents = 1, 1542 + .flags = CLK_SET_RATE_PARENT, 1543 + .ops = &clk_branch2_ops, 1544 + }, 1545 + }, 1546 + }; 1547 + 1548 + static struct clk_branch gcc_pcie_0_aux_clk = { 1549 + .halt_reg = 0x6b044, 1550 + .halt_check = BRANCH_HALT_VOTED, 1551 + .clkr = { 1552 + .enable_reg = 0x52008, 1553 + .enable_mask = BIT(3), 1554 + .hw.init = &(const struct clk_init_data) { 1555 + .name = "gcc_pcie_0_aux_clk", 1556 + .parent_hws = (const struct clk_hw*[]) { 1557 + &gcc_pcie_0_aux_clk_src.clkr.hw, 1558 + }, 1559 + .num_parents = 1, 1560 + .flags = CLK_SET_RATE_PARENT, 1561 + .ops = &clk_branch2_ops, 1562 + }, 1563 + }, 1564 + }; 1565 + 1566 + static struct clk_branch gcc_pcie_0_cfg_ahb_clk = { 1567 + .halt_reg = 0x6b040, 1568 + .halt_check = BRANCH_HALT_VOTED, 1569 + .hwcg_reg = 0x6b040, 1570 + .hwcg_bit = 1, 1571 + .clkr = { 1572 + .enable_reg = 0x52008, 1573 + .enable_mask = BIT(2), 1574 + .hw.init = &(const struct clk_init_data) { 1575 + .name = "gcc_pcie_0_cfg_ahb_clk", 1576 + .ops = &clk_branch2_ops, 1577 + }, 1578 + }, 1579 + }; 1580 + 1581 + static struct clk_branch gcc_pcie_0_mstr_axi_clk = { 1582 + .halt_reg = 0x6b030, 1583 + .halt_check = BRANCH_HALT_SKIP, 1584 + .hwcg_reg = 0x6b030, 1585 + .hwcg_bit = 1, 1586 + .clkr = { 1587 + .enable_reg = 0x52008, 1588 + .enable_mask = BIT(1), 1589 + .hw.init = &(const struct clk_init_data) { 1590 + .name = "gcc_pcie_0_mstr_axi_clk", 1591 + .ops = &clk_branch2_ops, 1592 + }, 1593 + }, 1594 + }; 1595 + 1596 + static struct clk_branch gcc_pcie_0_phy_rchng_clk = { 1597 + .halt_reg = 0x6b064, 1598 + .halt_check = BRANCH_HALT_VOTED, 1599 + .clkr = { 1600 + .enable_reg = 0x52000, 1601 + .enable_mask = BIT(22), 1602 + .hw.init = &(const struct clk_init_data) { 1603 + .name = "gcc_pcie_0_phy_rchng_clk", 1604 + .parent_hws = (const struct clk_hw*[]) { 1605 + &gcc_pcie_0_phy_rchng_clk_src.clkr.hw, 1606 + }, 1607 + .num_parents = 1, 1608 + .flags = CLK_SET_RATE_PARENT, 1609 + .ops = &clk_branch2_ops, 1610 + }, 1611 + }, 1612 + }; 1613 + 1614 + static struct clk_branch gcc_pcie_0_pipe_clk = { 1615 + .halt_reg = 0x6b054, 1616 + .halt_check = BRANCH_HALT_SKIP, 1617 + .clkr = { 1618 + .enable_reg = 0x52008, 1619 + .enable_mask = BIT(4), 1620 + .hw.init = &(const struct clk_init_data) { 1621 + .name = "gcc_pcie_0_pipe_clk", 1622 + .parent_hws = (const struct clk_hw*[]) { 1623 + &gcc_pcie_0_pipe_clk_src.clkr.hw, 1624 + }, 1625 + .num_parents = 1, 1626 + .flags = CLK_SET_RATE_PARENT, 1627 + .ops = &clk_branch2_ops, 1628 + }, 1629 + }, 1630 + }; 1631 + 1632 + static struct clk_branch gcc_pcie_0_slv_axi_clk = { 1633 + .halt_reg = 0x6b020, 1634 + .halt_check = BRANCH_HALT_VOTED, 1635 + .hwcg_reg = 0x6b020, 1636 + .hwcg_bit = 1, 1637 + .clkr = { 1638 + .enable_reg = 0x52008, 1639 + .enable_mask = BIT(0), 1640 + .hw.init = &(const struct clk_init_data) { 1641 + .name = "gcc_pcie_0_slv_axi_clk", 1642 + .ops = &clk_branch2_ops, 1643 + }, 1644 + }, 1645 + }; 1646 + 1647 + static struct clk_branch gcc_pcie_0_slv_q2a_axi_clk = { 1648 + .halt_reg = 0x6b01c, 1649 + .halt_check = BRANCH_HALT_VOTED, 1650 + .clkr = { 1651 + .enable_reg = 0x52008, 1652 + .enable_mask = BIT(5), 1653 + .hw.init = &(const struct clk_init_data) { 1654 + .name = "gcc_pcie_0_slv_q2a_axi_clk", 1655 + .ops = &clk_branch2_ops, 1656 + }, 1657 + }, 1658 + }; 1659 + 1660 + static struct clk_branch gcc_pdm2_clk = { 1661 + .halt_reg = 0x3300c, 1662 + .halt_check = BRANCH_HALT, 1663 + .clkr = { 1664 + .enable_reg = 0x3300c, 1665 + .enable_mask = BIT(0), 1666 + .hw.init = &(const struct clk_init_data) { 1667 + .name = "gcc_pdm2_clk", 1668 + .parent_hws = (const struct clk_hw*[]) { 1669 + &gcc_pdm2_clk_src.clkr.hw, 1670 + }, 1671 + .num_parents = 1, 1672 + .flags = CLK_SET_RATE_PARENT, 1673 + .ops = &clk_branch2_ops, 1674 + }, 1675 + }, 1676 + }; 1677 + 1678 + static struct clk_branch gcc_pdm_ahb_clk = { 1679 + .halt_reg = 0x33004, 1680 + .halt_check = BRANCH_HALT_VOTED, 1681 + .hwcg_reg = 0x33004, 1682 + .hwcg_bit = 1, 1683 + .clkr = { 1684 + .enable_reg = 0x33004, 1685 + .enable_mask = BIT(0), 1686 + .hw.init = &(const struct clk_init_data) { 1687 + .name = "gcc_pdm_ahb_clk", 1688 + .ops = &clk_branch2_ops, 1689 + }, 1690 + }, 1691 + }; 1692 + 1693 + static struct clk_branch gcc_pdm_xo4_clk = { 1694 + .halt_reg = 0x33008, 1695 + .halt_check = BRANCH_HALT, 1696 + .clkr = { 1697 + .enable_reg = 0x33008, 1698 + .enable_mask = BIT(0), 1699 + .hw.init = &(const struct clk_init_data) { 1700 + .name = "gcc_pdm_xo4_clk", 1701 + .ops = &clk_branch2_ops, 1702 + }, 1703 + }, 1704 + }; 1705 + 1706 + static struct clk_branch gcc_qmip_camera_cmd_ahb_clk = { 1707 + .halt_reg = 0x26010, 1708 + .halt_check = BRANCH_HALT_VOTED, 1709 + .hwcg_reg = 0x26010, 1710 + .hwcg_bit = 1, 1711 + .clkr = { 1712 + .enable_reg = 0x26010, 1713 + .enable_mask = BIT(0), 1714 + .hw.init = &(const struct clk_init_data) { 1715 + .name = "gcc_qmip_camera_cmd_ahb_clk", 1716 + .ops = &clk_branch2_ops, 1717 + }, 1718 + }, 1719 + }; 1720 + 1721 + static struct clk_branch gcc_qmip_camera_nrt_ahb_clk = { 1722 + .halt_reg = 0x26008, 1723 + .halt_check = BRANCH_HALT_VOTED, 1724 + .hwcg_reg = 0x26008, 1725 + .hwcg_bit = 1, 1726 + .clkr = { 1727 + .enable_reg = 0x26008, 1728 + .enable_mask = BIT(0), 1729 + .hw.init = &(const struct clk_init_data) { 1730 + .name = "gcc_qmip_camera_nrt_ahb_clk", 1731 + .ops = &clk_branch2_ops, 1732 + }, 1733 + }, 1734 + }; 1735 + 1736 + static struct clk_branch gcc_qmip_camera_rt_ahb_clk = { 1737 + .halt_reg = 0x2600c, 1738 + .halt_check = BRANCH_HALT_VOTED, 1739 + .hwcg_reg = 0x2600c, 1740 + .hwcg_bit = 1, 1741 + .clkr = { 1742 + .enable_reg = 0x2600c, 1743 + .enable_mask = BIT(0), 1744 + .hw.init = &(const struct clk_init_data) { 1745 + .name = "gcc_qmip_camera_rt_ahb_clk", 1746 + .ops = &clk_branch2_ops, 1747 + }, 1748 + }, 1749 + }; 1750 + 1751 + static struct clk_branch gcc_qmip_gpu_ahb_clk = { 1752 + .halt_reg = 0x71008, 1753 + .halt_check = BRANCH_HALT_VOTED, 1754 + .hwcg_reg = 0x71008, 1755 + .hwcg_bit = 1, 1756 + .clkr = { 1757 + .enable_reg = 0x71008, 1758 + .enable_mask = BIT(0), 1759 + .hw.init = &(const struct clk_init_data) { 1760 + .name = "gcc_qmip_gpu_ahb_clk", 1761 + .ops = &clk_branch2_ops, 1762 + }, 1763 + }, 1764 + }; 1765 + 1766 + static struct clk_branch gcc_qmip_pcie_ahb_clk = { 1767 + .halt_reg = 0x6b018, 1768 + .halt_check = BRANCH_HALT_VOTED, 1769 + .hwcg_reg = 0x6b018, 1770 + .hwcg_bit = 1, 1771 + .clkr = { 1772 + .enable_reg = 0x52000, 1773 + .enable_mask = BIT(11), 1774 + .hw.init = &(const struct clk_init_data) { 1775 + .name = "gcc_qmip_pcie_ahb_clk", 1776 + .ops = &clk_branch2_ops, 1777 + }, 1778 + }, 1779 + }; 1780 + 1781 + static struct clk_branch gcc_qmip_video_cv_cpu_ahb_clk = { 1782 + .halt_reg = 0x32014, 1783 + .halt_check = BRANCH_HALT_VOTED, 1784 + .hwcg_reg = 0x32014, 1785 + .hwcg_bit = 1, 1786 + .clkr = { 1787 + .enable_reg = 0x32014, 1788 + .enable_mask = BIT(0), 1789 + .hw.init = &(const struct clk_init_data) { 1790 + .name = "gcc_qmip_video_cv_cpu_ahb_clk", 1791 + .ops = &clk_branch2_ops, 1792 + }, 1793 + }, 1794 + }; 1795 + 1796 + static struct clk_branch gcc_qmip_video_cvp_ahb_clk = { 1797 + .halt_reg = 0x32008, 1798 + .halt_check = BRANCH_HALT_VOTED, 1799 + .hwcg_reg = 0x32008, 1800 + .hwcg_bit = 1, 1801 + .clkr = { 1802 + .enable_reg = 0x32008, 1803 + .enable_mask = BIT(0), 1804 + .hw.init = &(const struct clk_init_data) { 1805 + .name = "gcc_qmip_video_cvp_ahb_clk", 1806 + .ops = &clk_branch2_ops, 1807 + }, 1808 + }, 1809 + }; 1810 + 1811 + static struct clk_branch gcc_qmip_video_v_cpu_ahb_clk = { 1812 + .halt_reg = 0x32010, 1813 + .halt_check = BRANCH_HALT_VOTED, 1814 + .hwcg_reg = 0x32010, 1815 + .hwcg_bit = 1, 1816 + .clkr = { 1817 + .enable_reg = 0x32010, 1818 + .enable_mask = BIT(0), 1819 + .hw.init = &(const struct clk_init_data) { 1820 + .name = "gcc_qmip_video_v_cpu_ahb_clk", 1821 + .ops = &clk_branch2_ops, 1822 + }, 1823 + }, 1824 + }; 1825 + 1826 + static struct clk_branch gcc_qmip_video_vcodec_ahb_clk = { 1827 + .halt_reg = 0x3200c, 1828 + .halt_check = BRANCH_HALT_VOTED, 1829 + .hwcg_reg = 0x3200c, 1830 + .hwcg_bit = 1, 1831 + .clkr = { 1832 + .enable_reg = 0x3200c, 1833 + .enable_mask = BIT(0), 1834 + .hw.init = &(const struct clk_init_data) { 1835 + .name = "gcc_qmip_video_vcodec_ahb_clk", 1836 + .ops = &clk_branch2_ops, 1837 + }, 1838 + }, 1839 + }; 1840 + 1841 + static struct clk_branch gcc_qupv3_i2c_core_clk = { 1842 + .halt_reg = 0x23004, 1843 + .halt_check = BRANCH_HALT_VOTED, 1844 + .clkr = { 1845 + .enable_reg = 0x52008, 1846 + .enable_mask = BIT(8), 1847 + .hw.init = &(const struct clk_init_data) { 1848 + .name = "gcc_qupv3_i2c_core_clk", 1849 + .ops = &clk_branch2_ops, 1850 + }, 1851 + }, 1852 + }; 1853 + 1854 + static struct clk_branch gcc_qupv3_i2c_s0_clk = { 1855 + .halt_reg = 0x17004, 1856 + .halt_check = BRANCH_HALT_VOTED, 1857 + .clkr = { 1858 + .enable_reg = 0x52008, 1859 + .enable_mask = BIT(10), 1860 + .hw.init = &(const struct clk_init_data) { 1861 + .name = "gcc_qupv3_i2c_s0_clk", 1862 + .parent_hws = (const struct clk_hw*[]) { 1863 + &gcc_qupv3_i2c_s0_clk_src.clkr.hw, 1864 + }, 1865 + .num_parents = 1, 1866 + .flags = CLK_SET_RATE_PARENT, 1867 + .ops = &clk_branch2_ops, 1868 + }, 1869 + }, 1870 + }; 1871 + 1872 + static struct clk_branch gcc_qupv3_i2c_s1_clk = { 1873 + .halt_reg = 0x17020, 1874 + .halt_check = BRANCH_HALT_VOTED, 1875 + .clkr = { 1876 + .enable_reg = 0x52008, 1877 + .enable_mask = BIT(11), 1878 + .hw.init = &(const struct clk_init_data) { 1879 + .name = "gcc_qupv3_i2c_s1_clk", 1880 + .parent_hws = (const struct clk_hw*[]) { 1881 + &gcc_qupv3_i2c_s1_clk_src.clkr.hw, 1882 + }, 1883 + .num_parents = 1, 1884 + .flags = CLK_SET_RATE_PARENT, 1885 + .ops = &clk_branch2_ops, 1886 + }, 1887 + }, 1888 + }; 1889 + 1890 + static struct clk_branch gcc_qupv3_i2c_s2_clk = { 1891 + .halt_reg = 0x1703c, 1892 + .halt_check = BRANCH_HALT_VOTED, 1893 + .clkr = { 1894 + .enable_reg = 0x52008, 1895 + .enable_mask = BIT(12), 1896 + .hw.init = &(const struct clk_init_data) { 1897 + .name = "gcc_qupv3_i2c_s2_clk", 1898 + .parent_hws = (const struct clk_hw*[]) { 1899 + &gcc_qupv3_i2c_s2_clk_src.clkr.hw, 1900 + }, 1901 + .num_parents = 1, 1902 + .flags = CLK_SET_RATE_PARENT, 1903 + .ops = &clk_branch2_ops, 1904 + }, 1905 + }, 1906 + }; 1907 + 1908 + static struct clk_branch gcc_qupv3_i2c_s3_clk = { 1909 + .halt_reg = 0x17058, 1910 + .halt_check = BRANCH_HALT_VOTED, 1911 + .clkr = { 1912 + .enable_reg = 0x52008, 1913 + .enable_mask = BIT(13), 1914 + .hw.init = &(const struct clk_init_data) { 1915 + .name = "gcc_qupv3_i2c_s3_clk", 1916 + .parent_hws = (const struct clk_hw*[]) { 1917 + &gcc_qupv3_i2c_s3_clk_src.clkr.hw, 1918 + }, 1919 + .num_parents = 1, 1920 + .flags = CLK_SET_RATE_PARENT, 1921 + .ops = &clk_branch2_ops, 1922 + }, 1923 + }, 1924 + }; 1925 + 1926 + static struct clk_branch gcc_qupv3_i2c_s4_clk = { 1927 + .halt_reg = 0x17074, 1928 + .halt_check = BRANCH_HALT_VOTED, 1929 + .clkr = { 1930 + .enable_reg = 0x52008, 1931 + .enable_mask = BIT(14), 1932 + .hw.init = &(const struct clk_init_data) { 1933 + .name = "gcc_qupv3_i2c_s4_clk", 1934 + .parent_hws = (const struct clk_hw*[]) { 1935 + &gcc_qupv3_i2c_s4_clk_src.clkr.hw, 1936 + }, 1937 + .num_parents = 1, 1938 + .flags = CLK_SET_RATE_PARENT, 1939 + .ops = &clk_branch2_ops, 1940 + }, 1941 + }, 1942 + }; 1943 + 1944 + static struct clk_branch gcc_qupv3_i2c_s5_clk = { 1945 + .halt_reg = 0x17090, 1946 + .halt_check = BRANCH_HALT_VOTED, 1947 + .clkr = { 1948 + .enable_reg = 0x52008, 1949 + .enable_mask = BIT(15), 1950 + .hw.init = &(const struct clk_init_data) { 1951 + .name = "gcc_qupv3_i2c_s5_clk", 1952 + .parent_hws = (const struct clk_hw*[]) { 1953 + &gcc_qupv3_i2c_s5_clk_src.clkr.hw, 1954 + }, 1955 + .num_parents = 1, 1956 + .flags = CLK_SET_RATE_PARENT, 1957 + .ops = &clk_branch2_ops, 1958 + }, 1959 + }, 1960 + }; 1961 + 1962 + static struct clk_branch gcc_qupv3_i2c_s6_clk = { 1963 + .halt_reg = 0x170ac, 1964 + .halt_check = BRANCH_HALT_VOTED, 1965 + .clkr = { 1966 + .enable_reg = 0x52008, 1967 + .enable_mask = BIT(16), 1968 + .hw.init = &(const struct clk_init_data) { 1969 + .name = "gcc_qupv3_i2c_s6_clk", 1970 + .parent_hws = (const struct clk_hw*[]) { 1971 + &gcc_qupv3_i2c_s6_clk_src.clkr.hw, 1972 + }, 1973 + .num_parents = 1, 1974 + .flags = CLK_SET_RATE_PARENT, 1975 + .ops = &clk_branch2_ops, 1976 + }, 1977 + }, 1978 + }; 1979 + 1980 + static struct clk_branch gcc_qupv3_i2c_s7_clk = { 1981 + .halt_reg = 0x170c8, 1982 + .halt_check = BRANCH_HALT_VOTED, 1983 + .clkr = { 1984 + .enable_reg = 0x52008, 1985 + .enable_mask = BIT(17), 1986 + .hw.init = &(const struct clk_init_data) { 1987 + .name = "gcc_qupv3_i2c_s7_clk", 1988 + .parent_hws = (const struct clk_hw*[]) { 1989 + &gcc_qupv3_i2c_s7_clk_src.clkr.hw, 1990 + }, 1991 + .num_parents = 1, 1992 + .flags = CLK_SET_RATE_PARENT, 1993 + .ops = &clk_branch2_ops, 1994 + }, 1995 + }, 1996 + }; 1997 + 1998 + static struct clk_branch gcc_qupv3_i2c_s8_clk = { 1999 + .halt_reg = 0x170e4, 2000 + .halt_check = BRANCH_HALT_VOTED, 2001 + .clkr = { 2002 + .enable_reg = 0x52010, 2003 + .enable_mask = BIT(14), 2004 + .hw.init = &(const struct clk_init_data) { 2005 + .name = "gcc_qupv3_i2c_s8_clk", 2006 + .parent_hws = (const struct clk_hw*[]) { 2007 + &gcc_qupv3_i2c_s8_clk_src.clkr.hw, 2008 + }, 2009 + .num_parents = 1, 2010 + .flags = CLK_SET_RATE_PARENT, 2011 + .ops = &clk_branch2_ops, 2012 + }, 2013 + }, 2014 + }; 2015 + 2016 + static struct clk_branch gcc_qupv3_i2c_s9_clk = { 2017 + .halt_reg = 0x17100, 2018 + .halt_check = BRANCH_HALT_VOTED, 2019 + .clkr = { 2020 + .enable_reg = 0x52010, 2021 + .enable_mask = BIT(15), 2022 + .hw.init = &(const struct clk_init_data) { 2023 + .name = "gcc_qupv3_i2c_s9_clk", 2024 + .parent_hws = (const struct clk_hw*[]) { 2025 + &gcc_qupv3_i2c_s9_clk_src.clkr.hw, 2026 + }, 2027 + .num_parents = 1, 2028 + .flags = CLK_SET_RATE_PARENT, 2029 + .ops = &clk_branch2_ops, 2030 + }, 2031 + }, 2032 + }; 2033 + 2034 + static struct clk_branch gcc_qupv3_i2c_s_ahb_clk = { 2035 + .halt_reg = 0x23000, 2036 + .halt_check = BRANCH_HALT_VOTED, 2037 + .hwcg_reg = 0x23000, 2038 + .hwcg_bit = 1, 2039 + .clkr = { 2040 + .enable_reg = 0x52008, 2041 + .enable_mask = BIT(7), 2042 + .hw.init = &(const struct clk_init_data) { 2043 + .name = "gcc_qupv3_i2c_s_ahb_clk", 2044 + .ops = &clk_branch2_ops, 2045 + }, 2046 + }, 2047 + }; 2048 + 2049 + static struct clk_branch gcc_qupv3_wrap1_core_2x_clk = { 2050 + .halt_reg = 0x2315c, 2051 + .halt_check = BRANCH_HALT_VOTED, 2052 + .clkr = { 2053 + .enable_reg = 0x52008, 2054 + .enable_mask = BIT(18), 2055 + .hw.init = &(const struct clk_init_data) { 2056 + .name = "gcc_qupv3_wrap1_core_2x_clk", 2057 + .ops = &clk_branch2_ops, 2058 + }, 2059 + }, 2060 + }; 2061 + 2062 + static struct clk_branch gcc_qupv3_wrap1_core_clk = { 2063 + .halt_reg = 0x23148, 2064 + .halt_check = BRANCH_HALT_VOTED, 2065 + .clkr = { 2066 + .enable_reg = 0x52008, 2067 + .enable_mask = BIT(19), 2068 + .hw.init = &(const struct clk_init_data) { 2069 + .name = "gcc_qupv3_wrap1_core_clk", 2070 + .ops = &clk_branch2_ops, 2071 + }, 2072 + }, 2073 + }; 2074 + 2075 + static struct clk_branch gcc_qupv3_wrap1_qspi_ref_clk = { 2076 + .halt_reg = 0x188bc, 2077 + .halt_check = BRANCH_HALT_VOTED, 2078 + .clkr = { 2079 + .enable_reg = 0x52010, 2080 + .enable_mask = BIT(29), 2081 + .hw.init = &(const struct clk_init_data) { 2082 + .name = "gcc_qupv3_wrap1_qspi_ref_clk", 2083 + .parent_hws = (const struct clk_hw*[]) { 2084 + &gcc_qupv3_wrap1_qspi_ref_clk_src.clkr.hw, 2085 + }, 2086 + .num_parents = 1, 2087 + .flags = CLK_SET_RATE_PARENT, 2088 + .ops = &clk_branch2_ops, 2089 + }, 2090 + }, 2091 + }; 2092 + 2093 + static struct clk_branch gcc_qupv3_wrap1_s0_clk = { 2094 + .halt_reg = 0x18004, 2095 + .halt_check = BRANCH_HALT_VOTED, 2096 + .clkr = { 2097 + .enable_reg = 0x52008, 2098 + .enable_mask = BIT(22), 2099 + .hw.init = &(const struct clk_init_data) { 2100 + .name = "gcc_qupv3_wrap1_s0_clk", 2101 + .parent_hws = (const struct clk_hw*[]) { 2102 + &gcc_qupv3_wrap1_s0_clk_src.clkr.hw, 2103 + }, 2104 + .num_parents = 1, 2105 + .flags = CLK_SET_RATE_PARENT, 2106 + .ops = &clk_branch2_ops, 2107 + }, 2108 + }, 2109 + }; 2110 + 2111 + static struct clk_branch gcc_qupv3_wrap1_s1_clk = { 2112 + .halt_reg = 0x18140, 2113 + .halt_check = BRANCH_HALT_VOTED, 2114 + .clkr = { 2115 + .enable_reg = 0x52008, 2116 + .enable_mask = BIT(23), 2117 + .hw.init = &(const struct clk_init_data) { 2118 + .name = "gcc_qupv3_wrap1_s1_clk", 2119 + .parent_hws = (const struct clk_hw*[]) { 2120 + &gcc_qupv3_wrap1_s1_clk_src.clkr.hw, 2121 + }, 2122 + .num_parents = 1, 2123 + .flags = CLK_SET_RATE_PARENT, 2124 + .ops = &clk_branch2_ops, 2125 + }, 2126 + }, 2127 + }; 2128 + 2129 + static struct clk_branch gcc_qupv3_wrap1_s2_clk = { 2130 + .halt_reg = 0x1827c, 2131 + .halt_check = BRANCH_HALT_VOTED, 2132 + .clkr = { 2133 + .enable_reg = 0x52008, 2134 + .enable_mask = BIT(24), 2135 + .hw.init = &(const struct clk_init_data) { 2136 + .name = "gcc_qupv3_wrap1_s2_clk", 2137 + .parent_hws = (const struct clk_hw*[]) { 2138 + &gcc_qupv3_wrap1_s2_clk_src.clkr.hw, 2139 + }, 2140 + .num_parents = 1, 2141 + .flags = CLK_SET_RATE_PARENT, 2142 + .ops = &clk_branch2_ops, 2143 + }, 2144 + }, 2145 + }; 2146 + 2147 + static struct clk_branch gcc_qupv3_wrap1_s3_clk = { 2148 + .halt_reg = 0x18290, 2149 + .halt_check = BRANCH_HALT_VOTED, 2150 + .clkr = { 2151 + .enable_reg = 0x52008, 2152 + .enable_mask = BIT(25), 2153 + .hw.init = &(const struct clk_init_data) { 2154 + .name = "gcc_qupv3_wrap1_s3_clk", 2155 + .parent_hws = (const struct clk_hw*[]) { 2156 + &gcc_qupv3_wrap1_s3_clk_src.clkr.hw, 2157 + }, 2158 + .num_parents = 1, 2159 + .flags = CLK_SET_RATE_PARENT, 2160 + .ops = &clk_branch2_ops, 2161 + }, 2162 + }, 2163 + }; 2164 + 2165 + static struct clk_branch gcc_qupv3_wrap1_s4_clk = { 2166 + .halt_reg = 0x183cc, 2167 + .halt_check = BRANCH_HALT_VOTED, 2168 + .clkr = { 2169 + .enable_reg = 0x52008, 2170 + .enable_mask = BIT(26), 2171 + .hw.init = &(const struct clk_init_data) { 2172 + .name = "gcc_qupv3_wrap1_s4_clk", 2173 + .parent_hws = (const struct clk_hw*[]) { 2174 + &gcc_qupv3_wrap1_s4_clk_src.clkr.hw, 2175 + }, 2176 + .num_parents = 1, 2177 + .flags = CLK_SET_RATE_PARENT, 2178 + .ops = &clk_branch2_ops, 2179 + }, 2180 + }, 2181 + }; 2182 + 2183 + static struct clk_branch gcc_qupv3_wrap1_s5_clk = { 2184 + .halt_reg = 0x18508, 2185 + .halt_check = BRANCH_HALT_VOTED, 2186 + .clkr = { 2187 + .enable_reg = 0x52008, 2188 + .enable_mask = BIT(27), 2189 + .hw.init = &(const struct clk_init_data) { 2190 + .name = "gcc_qupv3_wrap1_s5_clk", 2191 + .parent_hws = (const struct clk_hw*[]) { 2192 + &gcc_qupv3_wrap1_s5_clk_src.clkr.hw, 2193 + }, 2194 + .num_parents = 1, 2195 + .flags = CLK_SET_RATE_PARENT, 2196 + .ops = &clk_branch2_ops, 2197 + }, 2198 + }, 2199 + }; 2200 + 2201 + static struct clk_branch gcc_qupv3_wrap1_s6_clk = { 2202 + .halt_reg = 0x18644, 2203 + .halt_check = BRANCH_HALT_VOTED, 2204 + .clkr = { 2205 + .enable_reg = 0x52008, 2206 + .enable_mask = BIT(28), 2207 + .hw.init = &(const struct clk_init_data) { 2208 + .name = "gcc_qupv3_wrap1_s6_clk", 2209 + .parent_hws = (const struct clk_hw*[]) { 2210 + &gcc_qupv3_wrap1_s6_clk_src.clkr.hw, 2211 + }, 2212 + .num_parents = 1, 2213 + .flags = CLK_SET_RATE_PARENT, 2214 + .ops = &clk_branch2_ops, 2215 + }, 2216 + }, 2217 + }; 2218 + 2219 + static struct clk_branch gcc_qupv3_wrap1_s7_clk = { 2220 + .halt_reg = 0x18780, 2221 + .halt_check = BRANCH_HALT_VOTED, 2222 + .clkr = { 2223 + .enable_reg = 0x52010, 2224 + .enable_mask = BIT(16), 2225 + .hw.init = &(const struct clk_init_data) { 2226 + .name = "gcc_qupv3_wrap1_s7_clk", 2227 + .parent_hws = (const struct clk_hw*[]) { 2228 + &gcc_qupv3_wrap1_s7_clk_src.clkr.hw, 2229 + }, 2230 + .num_parents = 1, 2231 + .flags = CLK_SET_RATE_PARENT, 2232 + .ops = &clk_branch2_ops, 2233 + }, 2234 + }, 2235 + }; 2236 + 2237 + static struct clk_branch gcc_qupv3_wrap2_core_2x_clk = { 2238 + .halt_reg = 0x232b4, 2239 + .halt_check = BRANCH_HALT_VOTED, 2240 + .clkr = { 2241 + .enable_reg = 0x52010, 2242 + .enable_mask = BIT(3), 2243 + .hw.init = &(const struct clk_init_data) { 2244 + .name = "gcc_qupv3_wrap2_core_2x_clk", 2245 + .ops = &clk_branch2_ops, 2246 + }, 2247 + }, 2248 + }; 2249 + 2250 + static struct clk_branch gcc_qupv3_wrap2_core_clk = { 2251 + .halt_reg = 0x232a0, 2252 + .halt_check = BRANCH_HALT_VOTED, 2253 + .clkr = { 2254 + .enable_reg = 0x52010, 2255 + .enable_mask = BIT(0), 2256 + .hw.init = &(const struct clk_init_data) { 2257 + .name = "gcc_qupv3_wrap2_core_clk", 2258 + .ops = &clk_branch2_ops, 2259 + }, 2260 + }, 2261 + }; 2262 + 2263 + static struct clk_branch gcc_qupv3_wrap2_ibi_ctrl_2_clk = { 2264 + .halt_reg = 0x1e9ec, 2265 + .halt_check = BRANCH_HALT_VOTED, 2266 + .hwcg_reg = 0x1e9ec, 2267 + .hwcg_bit = 1, 2268 + .clkr = { 2269 + .enable_reg = 0x52010, 2270 + .enable_mask = BIT(27), 2271 + .hw.init = &(const struct clk_init_data) { 2272 + .name = "gcc_qupv3_wrap2_ibi_ctrl_2_clk", 2273 + .parent_hws = (const struct clk_hw*[]) { 2274 + &gcc_qupv3_wrap2_ibi_ctrl_0_clk_src.clkr.hw, 2275 + }, 2276 + .num_parents = 1, 2277 + .flags = CLK_SET_RATE_PARENT, 2278 + .ops = &clk_branch2_ops, 2279 + }, 2280 + }, 2281 + }; 2282 + 2283 + static struct clk_branch gcc_qupv3_wrap2_ibi_ctrl_3_clk = { 2284 + .halt_reg = 0x1e9f0, 2285 + .halt_check = BRANCH_HALT_VOTED, 2286 + .hwcg_reg = 0x1e9f0, 2287 + .hwcg_bit = 1, 2288 + .clkr = { 2289 + .enable_reg = 0x52010, 2290 + .enable_mask = BIT(28), 2291 + .hw.init = &(const struct clk_init_data) { 2292 + .name = "gcc_qupv3_wrap2_ibi_ctrl_3_clk", 2293 + .parent_hws = (const struct clk_hw*[]) { 2294 + &gcc_qupv3_wrap2_ibi_ctrl_0_clk_src.clkr.hw, 2295 + }, 2296 + .num_parents = 1, 2297 + .flags = CLK_SET_RATE_PARENT, 2298 + .ops = &clk_branch2_ops, 2299 + }, 2300 + }, 2301 + }; 2302 + 2303 + static struct clk_branch gcc_qupv3_wrap2_s0_clk = { 2304 + .halt_reg = 0x1e004, 2305 + .halt_check = BRANCH_HALT_VOTED, 2306 + .clkr = { 2307 + .enable_reg = 0x52010, 2308 + .enable_mask = BIT(4), 2309 + .hw.init = &(const struct clk_init_data) { 2310 + .name = "gcc_qupv3_wrap2_s0_clk", 2311 + .parent_hws = (const struct clk_hw*[]) { 2312 + &gcc_qupv3_wrap2_s0_clk_src.clkr.hw, 2313 + }, 2314 + .num_parents = 1, 2315 + .flags = CLK_SET_RATE_PARENT, 2316 + .ops = &clk_branch2_ops, 2317 + }, 2318 + }, 2319 + }; 2320 + 2321 + static struct clk_branch gcc_qupv3_wrap2_s1_clk = { 2322 + .halt_reg = 0x1e140, 2323 + .halt_check = BRANCH_HALT_VOTED, 2324 + .clkr = { 2325 + .enable_reg = 0x52010, 2326 + .enable_mask = BIT(5), 2327 + .hw.init = &(const struct clk_init_data) { 2328 + .name = "gcc_qupv3_wrap2_s1_clk", 2329 + .parent_hws = (const struct clk_hw*[]) { 2330 + &gcc_qupv3_wrap2_s1_clk_src.clkr.hw, 2331 + }, 2332 + .num_parents = 1, 2333 + .flags = CLK_SET_RATE_PARENT, 2334 + .ops = &clk_branch2_ops, 2335 + }, 2336 + }, 2337 + }; 2338 + 2339 + static struct clk_branch gcc_qupv3_wrap2_s2_clk = { 2340 + .halt_reg = 0x1e27c, 2341 + .halt_check = BRANCH_HALT_VOTED, 2342 + .clkr = { 2343 + .enable_reg = 0x52010, 2344 + .enable_mask = BIT(6), 2345 + .hw.init = &(const struct clk_init_data) { 2346 + .name = "gcc_qupv3_wrap2_s2_clk", 2347 + .parent_hws = (const struct clk_hw*[]) { 2348 + &gcc_qupv3_wrap2_s2_clk_src.clkr.hw, 2349 + }, 2350 + .num_parents = 1, 2351 + .flags = CLK_SET_RATE_PARENT, 2352 + .ops = &clk_branch2_ops, 2353 + }, 2354 + }, 2355 + }; 2356 + 2357 + static struct clk_branch gcc_qupv3_wrap2_s3_clk = { 2358 + .halt_reg = 0x1e3b8, 2359 + .halt_check = BRANCH_HALT_VOTED, 2360 + .clkr = { 2361 + .enable_reg = 0x52010, 2362 + .enable_mask = BIT(7), 2363 + .hw.init = &(const struct clk_init_data) { 2364 + .name = "gcc_qupv3_wrap2_s3_clk", 2365 + .parent_hws = (const struct clk_hw*[]) { 2366 + &gcc_qupv3_wrap2_s3_clk_src.clkr.hw, 2367 + }, 2368 + .num_parents = 1, 2369 + .flags = CLK_SET_RATE_PARENT, 2370 + .ops = &clk_branch2_ops, 2371 + }, 2372 + }, 2373 + }; 2374 + 2375 + static struct clk_branch gcc_qupv3_wrap2_s4_clk = { 2376 + .halt_reg = 0x1e4f4, 2377 + .halt_check = BRANCH_HALT_VOTED, 2378 + .clkr = { 2379 + .enable_reg = 0x52010, 2380 + .enable_mask = BIT(8), 2381 + .hw.init = &(const struct clk_init_data) { 2382 + .name = "gcc_qupv3_wrap2_s4_clk", 2383 + .parent_hws = (const struct clk_hw*[]) { 2384 + &gcc_qupv3_wrap2_s4_clk_src.clkr.hw, 2385 + }, 2386 + .num_parents = 1, 2387 + .flags = CLK_SET_RATE_PARENT, 2388 + .ops = &clk_branch2_ops, 2389 + }, 2390 + }, 2391 + }; 2392 + 2393 + static struct clk_branch gcc_qupv3_wrap2_s5_clk = { 2394 + .halt_reg = 0x1e630, 2395 + .halt_check = BRANCH_HALT_VOTED, 2396 + .clkr = { 2397 + .enable_reg = 0x52010, 2398 + .enable_mask = BIT(9), 2399 + .hw.init = &(const struct clk_init_data) { 2400 + .name = "gcc_qupv3_wrap2_s5_clk", 2401 + .parent_hws = (const struct clk_hw*[]) { 2402 + &gcc_qupv3_wrap2_s5_clk_src.clkr.hw, 2403 + }, 2404 + .num_parents = 1, 2405 + .flags = CLK_SET_RATE_PARENT, 2406 + .ops = &clk_branch2_ops, 2407 + }, 2408 + }, 2409 + }; 2410 + 2411 + static struct clk_branch gcc_qupv3_wrap2_s6_clk = { 2412 + .halt_reg = 0x1e76c, 2413 + .halt_check = BRANCH_HALT_VOTED, 2414 + .clkr = { 2415 + .enable_reg = 0x52010, 2416 + .enable_mask = BIT(10), 2417 + .hw.init = &(const struct clk_init_data) { 2418 + .name = "gcc_qupv3_wrap2_s6_clk", 2419 + .parent_hws = (const struct clk_hw*[]) { 2420 + &gcc_qupv3_wrap2_s6_clk_src.clkr.hw, 2421 + }, 2422 + .num_parents = 1, 2423 + .flags = CLK_SET_RATE_PARENT, 2424 + .ops = &clk_branch2_ops, 2425 + }, 2426 + }, 2427 + }; 2428 + 2429 + static struct clk_branch gcc_qupv3_wrap2_s7_clk = { 2430 + .halt_reg = 0x1e8a8, 2431 + .halt_check = BRANCH_HALT_VOTED, 2432 + .clkr = { 2433 + .enable_reg = 0x52010, 2434 + .enable_mask = BIT(17), 2435 + .hw.init = &(const struct clk_init_data) { 2436 + .name = "gcc_qupv3_wrap2_s7_clk", 2437 + .parent_hws = (const struct clk_hw*[]) { 2438 + &gcc_qupv3_wrap2_s7_clk_src.clkr.hw, 2439 + }, 2440 + .num_parents = 1, 2441 + .flags = CLK_SET_RATE_PARENT, 2442 + .ops = &clk_branch2_ops, 2443 + }, 2444 + }, 2445 + }; 2446 + 2447 + static struct clk_branch gcc_qupv3_wrap_1_m_ahb_clk = { 2448 + .halt_reg = 0x23140, 2449 + .halt_check = BRANCH_HALT_VOTED, 2450 + .hwcg_reg = 0x23140, 2451 + .hwcg_bit = 1, 2452 + .clkr = { 2453 + .enable_reg = 0x52008, 2454 + .enable_mask = BIT(20), 2455 + .hw.init = &(const struct clk_init_data) { 2456 + .name = "gcc_qupv3_wrap_1_m_ahb_clk", 2457 + .ops = &clk_branch2_ops, 2458 + }, 2459 + }, 2460 + }; 2461 + 2462 + static struct clk_branch gcc_qupv3_wrap_1_s_ahb_clk = { 2463 + .halt_reg = 0x23144, 2464 + .halt_check = BRANCH_HALT_VOTED, 2465 + .hwcg_reg = 0x23144, 2466 + .hwcg_bit = 1, 2467 + .clkr = { 2468 + .enable_reg = 0x52008, 2469 + .enable_mask = BIT(21), 2470 + .hw.init = &(const struct clk_init_data) { 2471 + .name = "gcc_qupv3_wrap_1_s_ahb_clk", 2472 + .ops = &clk_branch2_ops, 2473 + }, 2474 + }, 2475 + }; 2476 + 2477 + static struct clk_branch gcc_qupv3_wrap_2_ibi_2_ahb_clk = { 2478 + .halt_reg = 0x1e9e4, 2479 + .halt_check = BRANCH_HALT_VOTED, 2480 + .hwcg_reg = 0x1e9e4, 2481 + .hwcg_bit = 1, 2482 + .clkr = { 2483 + .enable_reg = 0x52010, 2484 + .enable_mask = BIT(25), 2485 + .hw.init = &(const struct clk_init_data) { 2486 + .name = "gcc_qupv3_wrap_2_ibi_2_ahb_clk", 2487 + .ops = &clk_branch2_ops, 2488 + }, 2489 + }, 2490 + }; 2491 + 2492 + static struct clk_branch gcc_qupv3_wrap_2_ibi_3_ahb_clk = { 2493 + .halt_reg = 0x1e9e8, 2494 + .halt_check = BRANCH_HALT_VOTED, 2495 + .hwcg_reg = 0x1e9e8, 2496 + .hwcg_bit = 1, 2497 + .clkr = { 2498 + .enable_reg = 0x52010, 2499 + .enable_mask = BIT(26), 2500 + .hw.init = &(const struct clk_init_data) { 2501 + .name = "gcc_qupv3_wrap_2_ibi_3_ahb_clk", 2502 + .ops = &clk_branch2_ops, 2503 + }, 2504 + }, 2505 + }; 2506 + 2507 + static struct clk_branch gcc_qupv3_wrap_2_m_ahb_clk = { 2508 + .halt_reg = 0x23298, 2509 + .halt_check = BRANCH_HALT_VOTED, 2510 + .hwcg_reg = 0x23298, 2511 + .hwcg_bit = 1, 2512 + .clkr = { 2513 + .enable_reg = 0x52010, 2514 + .enable_mask = BIT(2), 2515 + .hw.init = &(const struct clk_init_data) { 2516 + .name = "gcc_qupv3_wrap_2_m_ahb_clk", 2517 + .ops = &clk_branch2_ops, 2518 + }, 2519 + }, 2520 + }; 2521 + 2522 + static struct clk_branch gcc_qupv3_wrap_2_s_ahb_clk = { 2523 + .halt_reg = 0x2329c, 2524 + .halt_check = BRANCH_HALT_VOTED, 2525 + .hwcg_reg = 0x2329c, 2526 + .hwcg_bit = 1, 2527 + .clkr = { 2528 + .enable_reg = 0x52010, 2529 + .enable_mask = BIT(1), 2530 + .hw.init = &(const struct clk_init_data) { 2531 + .name = "gcc_qupv3_wrap_2_s_ahb_clk", 2532 + .ops = &clk_branch2_ops, 2533 + }, 2534 + }, 2535 + }; 2536 + 2537 + static struct clk_branch gcc_sdcc2_ahb_clk = { 2538 + .halt_reg = 0x14014, 2539 + .halt_check = BRANCH_HALT, 2540 + .clkr = { 2541 + .enable_reg = 0x14014, 2542 + .enable_mask = BIT(0), 2543 + .hw.init = &(const struct clk_init_data) { 2544 + .name = "gcc_sdcc2_ahb_clk", 2545 + .ops = &clk_branch2_ops, 2546 + }, 2547 + }, 2548 + }; 2549 + 2550 + static struct clk_branch gcc_sdcc2_apps_clk = { 2551 + .halt_reg = 0x14004, 2552 + .halt_check = BRANCH_HALT, 2553 + .clkr = { 2554 + .enable_reg = 0x14004, 2555 + .enable_mask = BIT(0), 2556 + .hw.init = &(const struct clk_init_data) { 2557 + .name = "gcc_sdcc2_apps_clk", 2558 + .parent_hws = (const struct clk_hw*[]) { 2559 + &gcc_sdcc2_apps_clk_src.clkr.hw, 2560 + }, 2561 + .num_parents = 1, 2562 + .flags = CLK_SET_RATE_PARENT, 2563 + .ops = &clk_branch2_ops, 2564 + }, 2565 + }, 2566 + }; 2567 + 2568 + static struct clk_branch gcc_sdcc4_ahb_clk = { 2569 + .halt_reg = 0x16014, 2570 + .halt_check = BRANCH_HALT, 2571 + .clkr = { 2572 + .enable_reg = 0x16014, 2573 + .enable_mask = BIT(0), 2574 + .hw.init = &(const struct clk_init_data) { 2575 + .name = "gcc_sdcc4_ahb_clk", 2576 + .ops = &clk_branch2_ops, 2577 + }, 2578 + }, 2579 + }; 2580 + 2581 + static struct clk_branch gcc_sdcc4_apps_clk = { 2582 + .halt_reg = 0x16004, 2583 + .halt_check = BRANCH_HALT, 2584 + .clkr = { 2585 + .enable_reg = 0x16004, 2586 + .enable_mask = BIT(0), 2587 + .hw.init = &(const struct clk_init_data) { 2588 + .name = "gcc_sdcc4_apps_clk", 2589 + .parent_hws = (const struct clk_hw*[]) { 2590 + &gcc_sdcc4_apps_clk_src.clkr.hw, 2591 + }, 2592 + .num_parents = 1, 2593 + .flags = CLK_SET_RATE_PARENT, 2594 + .ops = &clk_branch2_ops, 2595 + }, 2596 + }, 2597 + }; 2598 + 2599 + static struct clk_branch gcc_ufs_phy_ahb_clk = { 2600 + .halt_reg = 0x77028, 2601 + .halt_check = BRANCH_HALT_VOTED, 2602 + .hwcg_reg = 0x77028, 2603 + .hwcg_bit = 1, 2604 + .clkr = { 2605 + .enable_reg = 0x77028, 2606 + .enable_mask = BIT(0), 2607 + .hw.init = &(const struct clk_init_data) { 2608 + .name = "gcc_ufs_phy_ahb_clk", 2609 + .ops = &clk_branch2_ops, 2610 + }, 2611 + }, 2612 + }; 2613 + 2614 + static struct clk_branch gcc_ufs_phy_axi_clk = { 2615 + .halt_reg = 0x77018, 2616 + .halt_check = BRANCH_HALT_VOTED, 2617 + .hwcg_reg = 0x77018, 2618 + .hwcg_bit = 1, 2619 + .clkr = { 2620 + .enable_reg = 0x77018, 2621 + .enable_mask = BIT(0), 2622 + .hw.init = &(const struct clk_init_data) { 2623 + .name = "gcc_ufs_phy_axi_clk", 2624 + .parent_hws = (const struct clk_hw*[]) { 2625 + &gcc_ufs_phy_axi_clk_src.clkr.hw, 2626 + }, 2627 + .num_parents = 1, 2628 + .flags = CLK_SET_RATE_PARENT, 2629 + .ops = &clk_branch2_ops, 2630 + }, 2631 + }, 2632 + }; 2633 + 2634 + static struct clk_branch gcc_ufs_phy_ice_core_clk = { 2635 + .halt_reg = 0x7707c, 2636 + .halt_check = BRANCH_HALT_VOTED, 2637 + .hwcg_reg = 0x7707c, 2638 + .hwcg_bit = 1, 2639 + .clkr = { 2640 + .enable_reg = 0x7707c, 2641 + .enable_mask = BIT(0), 2642 + .hw.init = &(const struct clk_init_data) { 2643 + .name = "gcc_ufs_phy_ice_core_clk", 2644 + .parent_hws = (const struct clk_hw*[]) { 2645 + &gcc_ufs_phy_ice_core_clk_src.clkr.hw, 2646 + }, 2647 + .num_parents = 1, 2648 + .flags = CLK_SET_RATE_PARENT, 2649 + .ops = &clk_branch2_ops, 2650 + }, 2651 + }, 2652 + }; 2653 + 2654 + static struct clk_branch gcc_ufs_phy_phy_aux_clk = { 2655 + .halt_reg = 0x770bc, 2656 + .halt_check = BRANCH_HALT_VOTED, 2657 + .hwcg_reg = 0x770bc, 2658 + .hwcg_bit = 1, 2659 + .clkr = { 2660 + .enable_reg = 0x770bc, 2661 + .enable_mask = BIT(0), 2662 + .hw.init = &(const struct clk_init_data) { 2663 + .name = "gcc_ufs_phy_phy_aux_clk", 2664 + .parent_hws = (const struct clk_hw*[]) { 2665 + &gcc_ufs_phy_phy_aux_clk_src.clkr.hw, 2666 + }, 2667 + .num_parents = 1, 2668 + .flags = CLK_SET_RATE_PARENT, 2669 + .ops = &clk_branch2_ops, 2670 + }, 2671 + }, 2672 + }; 2673 + 2674 + static struct clk_branch gcc_ufs_phy_rx_symbol_0_clk = { 2675 + .halt_reg = 0x77030, 2676 + .halt_check = BRANCH_HALT_DELAY, 2677 + .clkr = { 2678 + .enable_reg = 0x77030, 2679 + .enable_mask = BIT(0), 2680 + .hw.init = &(const struct clk_init_data) { 2681 + .name = "gcc_ufs_phy_rx_symbol_0_clk", 2682 + .parent_hws = (const struct clk_hw*[]) { 2683 + &gcc_ufs_phy_rx_symbol_0_clk_src.clkr.hw, 2684 + }, 2685 + .num_parents = 1, 2686 + .flags = CLK_SET_RATE_PARENT, 2687 + .ops = &clk_branch2_ops, 2688 + }, 2689 + }, 2690 + }; 2691 + 2692 + static struct clk_branch gcc_ufs_phy_rx_symbol_1_clk = { 2693 + .halt_reg = 0x770d8, 2694 + .halt_check = BRANCH_HALT_DELAY, 2695 + .clkr = { 2696 + .enable_reg = 0x770d8, 2697 + .enable_mask = BIT(0), 2698 + .hw.init = &(const struct clk_init_data) { 2699 + .name = "gcc_ufs_phy_rx_symbol_1_clk", 2700 + .parent_hws = (const struct clk_hw*[]) { 2701 + &gcc_ufs_phy_rx_symbol_1_clk_src.clkr.hw, 2702 + }, 2703 + .num_parents = 1, 2704 + .flags = CLK_SET_RATE_PARENT, 2705 + .ops = &clk_branch2_ops, 2706 + }, 2707 + }, 2708 + }; 2709 + 2710 + static struct clk_branch gcc_ufs_phy_tx_symbol_0_clk = { 2711 + .halt_reg = 0x7702c, 2712 + .halt_check = BRANCH_HALT_DELAY, 2713 + .clkr = { 2714 + .enable_reg = 0x7702c, 2715 + .enable_mask = BIT(0), 2716 + .hw.init = &(const struct clk_init_data) { 2717 + .name = "gcc_ufs_phy_tx_symbol_0_clk", 2718 + .parent_hws = (const struct clk_hw*[]) { 2719 + &gcc_ufs_phy_tx_symbol_0_clk_src.clkr.hw, 2720 + }, 2721 + .num_parents = 1, 2722 + .flags = CLK_SET_RATE_PARENT, 2723 + .ops = &clk_branch2_ops, 2724 + }, 2725 + }, 2726 + }; 2727 + 2728 + static struct clk_branch gcc_ufs_phy_unipro_core_clk = { 2729 + .halt_reg = 0x7706c, 2730 + .halt_check = BRANCH_HALT_VOTED, 2731 + .hwcg_reg = 0x7706c, 2732 + .hwcg_bit = 1, 2733 + .clkr = { 2734 + .enable_reg = 0x7706c, 2735 + .enable_mask = BIT(0), 2736 + .hw.init = &(const struct clk_init_data) { 2737 + .name = "gcc_ufs_phy_unipro_core_clk", 2738 + .parent_hws = (const struct clk_hw*[]) { 2739 + &gcc_ufs_phy_unipro_core_clk_src.clkr.hw, 2740 + }, 2741 + .num_parents = 1, 2742 + .flags = CLK_SET_RATE_PARENT, 2743 + .ops = &clk_branch2_ops, 2744 + }, 2745 + }, 2746 + }; 2747 + 2748 + static struct clk_branch gcc_usb30_prim_master_clk = { 2749 + .halt_reg = 0x39018, 2750 + .halt_check = BRANCH_HALT, 2751 + .clkr = { 2752 + .enable_reg = 0x39018, 2753 + .enable_mask = BIT(0), 2754 + .hw.init = &(const struct clk_init_data) { 2755 + .name = "gcc_usb30_prim_master_clk", 2756 + .parent_hws = (const struct clk_hw*[]) { 2757 + &gcc_usb30_prim_master_clk_src.clkr.hw, 2758 + }, 2759 + .num_parents = 1, 2760 + .flags = CLK_SET_RATE_PARENT, 2761 + .ops = &clk_branch2_ops, 2762 + }, 2763 + }, 2764 + }; 2765 + 2766 + static struct clk_branch gcc_usb30_prim_mock_utmi_clk = { 2767 + .halt_reg = 0x3902c, 2768 + .halt_check = BRANCH_HALT, 2769 + .clkr = { 2770 + .enable_reg = 0x3902c, 2771 + .enable_mask = BIT(0), 2772 + .hw.init = &(const struct clk_init_data) { 2773 + .name = "gcc_usb30_prim_mock_utmi_clk", 2774 + .parent_hws = (const struct clk_hw*[]) { 2775 + &gcc_usb30_prim_mock_utmi_postdiv_clk_src.clkr.hw, 2776 + }, 2777 + .num_parents = 1, 2778 + .flags = CLK_SET_RATE_PARENT, 2779 + .ops = &clk_branch2_ops, 2780 + }, 2781 + }, 2782 + }; 2783 + 2784 + static struct clk_branch gcc_usb30_prim_sleep_clk = { 2785 + .halt_reg = 0x39028, 2786 + .halt_check = BRANCH_HALT, 2787 + .clkr = { 2788 + .enable_reg = 0x39028, 2789 + .enable_mask = BIT(0), 2790 + .hw.init = &(const struct clk_init_data) { 2791 + .name = "gcc_usb30_prim_sleep_clk", 2792 + .ops = &clk_branch2_ops, 2793 + }, 2794 + }, 2795 + }; 2796 + 2797 + static struct clk_branch gcc_usb3_prim_phy_aux_clk = { 2798 + .halt_reg = 0x39064, 2799 + .halt_check = BRANCH_HALT, 2800 + .clkr = { 2801 + .enable_reg = 0x39064, 2802 + .enable_mask = BIT(0), 2803 + .hw.init = &(const struct clk_init_data) { 2804 + .name = "gcc_usb3_prim_phy_aux_clk", 2805 + .parent_hws = (const struct clk_hw*[]) { 2806 + &gcc_usb3_prim_phy_aux_clk_src.clkr.hw, 2807 + }, 2808 + .num_parents = 1, 2809 + .flags = CLK_SET_RATE_PARENT, 2810 + .ops = &clk_branch2_ops, 2811 + }, 2812 + }, 2813 + }; 2814 + 2815 + static struct clk_branch gcc_usb3_prim_phy_com_aux_clk = { 2816 + .halt_reg = 0x39068, 2817 + .halt_check = BRANCH_HALT, 2818 + .clkr = { 2819 + .enable_reg = 0x39068, 2820 + .enable_mask = BIT(0), 2821 + .hw.init = &(const struct clk_init_data) { 2822 + .name = "gcc_usb3_prim_phy_com_aux_clk", 2823 + .parent_hws = (const struct clk_hw*[]) { 2824 + &gcc_usb3_prim_phy_aux_clk_src.clkr.hw, 2825 + }, 2826 + .num_parents = 1, 2827 + .flags = CLK_SET_RATE_PARENT, 2828 + .ops = &clk_branch2_ops, 2829 + }, 2830 + }, 2831 + }; 2832 + 2833 + static struct clk_branch gcc_usb3_prim_phy_pipe_clk = { 2834 + .halt_reg = 0x3906c, 2835 + .halt_check = BRANCH_HALT_DELAY, 2836 + .hwcg_reg = 0x3906c, 2837 + .hwcg_bit = 1, 2838 + .clkr = { 2839 + .enable_reg = 0x3906c, 2840 + .enable_mask = BIT(0), 2841 + .hw.init = &(const struct clk_init_data) { 2842 + .name = "gcc_usb3_prim_phy_pipe_clk", 2843 + .parent_hws = (const struct clk_hw*[]) { 2844 + &gcc_usb3_prim_phy_pipe_clk_src.clkr.hw, 2845 + }, 2846 + .num_parents = 1, 2847 + .flags = CLK_SET_RATE_PARENT, 2848 + .ops = &clk_branch2_ops, 2849 + }, 2850 + }, 2851 + }; 2852 + 2853 + static struct clk_branch gcc_video_axi0_clk = { 2854 + .halt_reg = 0x32018, 2855 + .halt_check = BRANCH_HALT_SKIP, 2856 + .hwcg_reg = 0x32018, 2857 + .hwcg_bit = 1, 2858 + .clkr = { 2859 + .enable_reg = 0x32018, 2860 + .enable_mask = BIT(0), 2861 + .hw.init = &(const struct clk_init_data) { 2862 + .name = "gcc_video_axi0_clk", 2863 + .ops = &clk_branch2_ops, 2864 + }, 2865 + }, 2866 + }; 2867 + 2868 + static struct clk_branch gcc_video_axi1_clk = { 2869 + .halt_reg = 0x32028, 2870 + .halt_check = BRANCH_HALT_SKIP, 2871 + .hwcg_reg = 0x32028, 2872 + .hwcg_bit = 1, 2873 + .clkr = { 2874 + .enable_reg = 0x32028, 2875 + .enable_mask = BIT(0), 2876 + .hw.init = &(const struct clk_init_data) { 2877 + .name = "gcc_video_axi1_clk", 2878 + .ops = &clk_branch2_ops, 2879 + }, 2880 + }, 2881 + }; 2882 + 2883 + static struct gdsc gcc_pcie_0_gdsc = { 2884 + .gdscr = 0x6b004, 2885 + .en_rest_wait_val = 0x2, 2886 + .en_few_wait_val = 0x2, 2887 + .clk_dis_wait_val = 0xf, 2888 + .collapse_ctrl = 0x5214c, 2889 + .collapse_mask = BIT(0), 2890 + .pd = { 2891 + .name = "gcc_pcie_0_gdsc", 2892 + }, 2893 + .pwrsts = PWRSTS_OFF_ON, 2894 + .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE | VOTABLE, 2895 + }; 2896 + 2897 + static struct gdsc gcc_pcie_0_phy_gdsc = { 2898 + .gdscr = 0x6c000, 2899 + .en_rest_wait_val = 0x2, 2900 + .en_few_wait_val = 0x2, 2901 + .clk_dis_wait_val = 0x2, 2902 + .collapse_ctrl = 0x5214c, 2903 + .collapse_mask = BIT(2), 2904 + .pd = { 2905 + .name = "gcc_pcie_0_phy_gdsc", 2906 + }, 2907 + .pwrsts = PWRSTS_OFF_ON, 2908 + .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE | VOTABLE, 2909 + }; 2910 + 2911 + static struct gdsc gcc_ufs_mem_phy_gdsc = { 2912 + .gdscr = 0x9e000, 2913 + .en_rest_wait_val = 0x2, 2914 + .en_few_wait_val = 0x2, 2915 + .clk_dis_wait_val = 0x2, 2916 + .pd = { 2917 + .name = "gcc_ufs_mem_phy_gdsc", 2918 + }, 2919 + .pwrsts = PWRSTS_OFF_ON, 2920 + .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 2921 + }; 2922 + 2923 + static struct gdsc gcc_ufs_phy_gdsc = { 2924 + .gdscr = 0x77004, 2925 + .en_rest_wait_val = 0x2, 2926 + .en_few_wait_val = 0x2, 2927 + .clk_dis_wait_val = 0xf, 2928 + .pd = { 2929 + .name = "gcc_ufs_phy_gdsc", 2930 + }, 2931 + .pwrsts = PWRSTS_OFF_ON, 2932 + .flags = VOTABLE | POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 2933 + }; 2934 + 2935 + static struct gdsc gcc_usb30_prim_gdsc = { 2936 + .gdscr = 0x39004, 2937 + .en_rest_wait_val = 0x2, 2938 + .en_few_wait_val = 0x2, 2939 + .clk_dis_wait_val = 0xf, 2940 + .pd = { 2941 + .name = "gcc_usb30_prim_gdsc", 2942 + }, 2943 + .pwrsts = PWRSTS_OFF_ON, 2944 + .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 2945 + }; 2946 + 2947 + static struct gdsc gcc_usb3_phy_gdsc = { 2948 + .gdscr = 0x50018, 2949 + .en_rest_wait_val = 0x2, 2950 + .en_few_wait_val = 0x2, 2951 + .clk_dis_wait_val = 0x2, 2952 + .pd = { 2953 + .name = "gcc_usb3_phy_gdsc", 2954 + }, 2955 + .pwrsts = PWRSTS_OFF_ON, 2956 + .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 2957 + }; 2958 + 2959 + static struct clk_regmap *gcc_sm8750_clocks[] = { 2960 + [GCC_AGGRE_NOC_PCIE_AXI_CLK] = &gcc_aggre_noc_pcie_axi_clk.clkr, 2961 + [GCC_AGGRE_UFS_PHY_AXI_CLK] = &gcc_aggre_ufs_phy_axi_clk.clkr, 2962 + [GCC_AGGRE_USB3_PRIM_AXI_CLK] = &gcc_aggre_usb3_prim_axi_clk.clkr, 2963 + [GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr, 2964 + [GCC_CAMERA_HF_AXI_CLK] = &gcc_camera_hf_axi_clk.clkr, 2965 + [GCC_CAMERA_SF_AXI_CLK] = &gcc_camera_sf_axi_clk.clkr, 2966 + [GCC_CFG_NOC_PCIE_ANOC_AHB_CLK] = &gcc_cfg_noc_pcie_anoc_ahb_clk.clkr, 2967 + [GCC_CFG_NOC_USB3_PRIM_AXI_CLK] = &gcc_cfg_noc_usb3_prim_axi_clk.clkr, 2968 + [GCC_CNOC_PCIE_SF_AXI_CLK] = &gcc_cnoc_pcie_sf_axi_clk.clkr, 2969 + [GCC_DDRSS_GPU_AXI_CLK] = &gcc_ddrss_gpu_axi_clk.clkr, 2970 + [GCC_DDRSS_PCIE_SF_QTB_CLK] = &gcc_ddrss_pcie_sf_qtb_clk.clkr, 2971 + [GCC_DISP_HF_AXI_CLK] = &gcc_disp_hf_axi_clk.clkr, 2972 + [GCC_EVA_AXI0_CLK] = &gcc_eva_axi0_clk.clkr, 2973 + [GCC_EVA_AXI0C_CLK] = &gcc_eva_axi0c_clk.clkr, 2974 + [GCC_GP1_CLK] = &gcc_gp1_clk.clkr, 2975 + [GCC_GP1_CLK_SRC] = &gcc_gp1_clk_src.clkr, 2976 + [GCC_GP2_CLK] = &gcc_gp2_clk.clkr, 2977 + [GCC_GP2_CLK_SRC] = &gcc_gp2_clk_src.clkr, 2978 + [GCC_GP3_CLK] = &gcc_gp3_clk.clkr, 2979 + [GCC_GP3_CLK_SRC] = &gcc_gp3_clk_src.clkr, 2980 + [GCC_GPLL0] = &gcc_gpll0.clkr, 2981 + [GCC_GPLL0_OUT_EVEN] = &gcc_gpll0_out_even.clkr, 2982 + [GCC_GPLL1] = &gcc_gpll1.clkr, 2983 + [GCC_GPLL4] = &gcc_gpll4.clkr, 2984 + [GCC_GPLL7] = &gcc_gpll7.clkr, 2985 + [GCC_GPLL9] = &gcc_gpll9.clkr, 2986 + [GCC_GPU_GEMNOC_GFX_CLK] = &gcc_gpu_gemnoc_gfx_clk.clkr, 2987 + [GCC_GPU_GPLL0_CLK_SRC] = &gcc_gpu_gpll0_clk_src.clkr, 2988 + [GCC_GPU_GPLL0_DIV_CLK_SRC] = &gcc_gpu_gpll0_div_clk_src.clkr, 2989 + [GCC_PCIE_0_AUX_CLK] = &gcc_pcie_0_aux_clk.clkr, 2990 + [GCC_PCIE_0_AUX_CLK_SRC] = &gcc_pcie_0_aux_clk_src.clkr, 2991 + [GCC_PCIE_0_CFG_AHB_CLK] = &gcc_pcie_0_cfg_ahb_clk.clkr, 2992 + [GCC_PCIE_0_MSTR_AXI_CLK] = &gcc_pcie_0_mstr_axi_clk.clkr, 2993 + [GCC_PCIE_0_PHY_RCHNG_CLK] = &gcc_pcie_0_phy_rchng_clk.clkr, 2994 + [GCC_PCIE_0_PHY_RCHNG_CLK_SRC] = &gcc_pcie_0_phy_rchng_clk_src.clkr, 2995 + [GCC_PCIE_0_PIPE_CLK] = &gcc_pcie_0_pipe_clk.clkr, 2996 + [GCC_PCIE_0_PIPE_CLK_SRC] = &gcc_pcie_0_pipe_clk_src.clkr, 2997 + [GCC_PCIE_0_SLV_AXI_CLK] = &gcc_pcie_0_slv_axi_clk.clkr, 2998 + [GCC_PCIE_0_SLV_Q2A_AXI_CLK] = &gcc_pcie_0_slv_q2a_axi_clk.clkr, 2999 + [GCC_PDM2_CLK] = &gcc_pdm2_clk.clkr, 3000 + [GCC_PDM2_CLK_SRC] = &gcc_pdm2_clk_src.clkr, 3001 + [GCC_PDM_AHB_CLK] = &gcc_pdm_ahb_clk.clkr, 3002 + [GCC_PDM_XO4_CLK] = &gcc_pdm_xo4_clk.clkr, 3003 + [GCC_QMIP_CAMERA_CMD_AHB_CLK] = &gcc_qmip_camera_cmd_ahb_clk.clkr, 3004 + [GCC_QMIP_CAMERA_NRT_AHB_CLK] = &gcc_qmip_camera_nrt_ahb_clk.clkr, 3005 + [GCC_QMIP_CAMERA_RT_AHB_CLK] = &gcc_qmip_camera_rt_ahb_clk.clkr, 3006 + [GCC_QMIP_GPU_AHB_CLK] = &gcc_qmip_gpu_ahb_clk.clkr, 3007 + [GCC_QMIP_PCIE_AHB_CLK] = &gcc_qmip_pcie_ahb_clk.clkr, 3008 + [GCC_QMIP_VIDEO_CV_CPU_AHB_CLK] = &gcc_qmip_video_cv_cpu_ahb_clk.clkr, 3009 + [GCC_QMIP_VIDEO_CVP_AHB_CLK] = &gcc_qmip_video_cvp_ahb_clk.clkr, 3010 + [GCC_QMIP_VIDEO_V_CPU_AHB_CLK] = &gcc_qmip_video_v_cpu_ahb_clk.clkr, 3011 + [GCC_QMIP_VIDEO_VCODEC_AHB_CLK] = &gcc_qmip_video_vcodec_ahb_clk.clkr, 3012 + [GCC_QUPV3_I2C_CORE_CLK] = &gcc_qupv3_i2c_core_clk.clkr, 3013 + [GCC_QUPV3_I2C_S0_CLK] = &gcc_qupv3_i2c_s0_clk.clkr, 3014 + [GCC_QUPV3_I2C_S0_CLK_SRC] = &gcc_qupv3_i2c_s0_clk_src.clkr, 3015 + [GCC_QUPV3_I2C_S1_CLK] = &gcc_qupv3_i2c_s1_clk.clkr, 3016 + [GCC_QUPV3_I2C_S1_CLK_SRC] = &gcc_qupv3_i2c_s1_clk_src.clkr, 3017 + [GCC_QUPV3_I2C_S2_CLK] = &gcc_qupv3_i2c_s2_clk.clkr, 3018 + [GCC_QUPV3_I2C_S2_CLK_SRC] = &gcc_qupv3_i2c_s2_clk_src.clkr, 3019 + [GCC_QUPV3_I2C_S3_CLK] = &gcc_qupv3_i2c_s3_clk.clkr, 3020 + [GCC_QUPV3_I2C_S3_CLK_SRC] = &gcc_qupv3_i2c_s3_clk_src.clkr, 3021 + [GCC_QUPV3_I2C_S4_CLK] = &gcc_qupv3_i2c_s4_clk.clkr, 3022 + [GCC_QUPV3_I2C_S4_CLK_SRC] = &gcc_qupv3_i2c_s4_clk_src.clkr, 3023 + [GCC_QUPV3_I2C_S5_CLK] = &gcc_qupv3_i2c_s5_clk.clkr, 3024 + [GCC_QUPV3_I2C_S5_CLK_SRC] = &gcc_qupv3_i2c_s5_clk_src.clkr, 3025 + [GCC_QUPV3_I2C_S6_CLK] = &gcc_qupv3_i2c_s6_clk.clkr, 3026 + [GCC_QUPV3_I2C_S6_CLK_SRC] = &gcc_qupv3_i2c_s6_clk_src.clkr, 3027 + [GCC_QUPV3_I2C_S7_CLK] = &gcc_qupv3_i2c_s7_clk.clkr, 3028 + [GCC_QUPV3_I2C_S7_CLK_SRC] = &gcc_qupv3_i2c_s7_clk_src.clkr, 3029 + [GCC_QUPV3_I2C_S8_CLK] = &gcc_qupv3_i2c_s8_clk.clkr, 3030 + [GCC_QUPV3_I2C_S8_CLK_SRC] = &gcc_qupv3_i2c_s8_clk_src.clkr, 3031 + [GCC_QUPV3_I2C_S9_CLK] = &gcc_qupv3_i2c_s9_clk.clkr, 3032 + [GCC_QUPV3_I2C_S9_CLK_SRC] = &gcc_qupv3_i2c_s9_clk_src.clkr, 3033 + [GCC_QUPV3_I2C_S_AHB_CLK] = &gcc_qupv3_i2c_s_ahb_clk.clkr, 3034 + [GCC_QUPV3_WRAP1_CORE_2X_CLK] = &gcc_qupv3_wrap1_core_2x_clk.clkr, 3035 + [GCC_QUPV3_WRAP1_CORE_CLK] = &gcc_qupv3_wrap1_core_clk.clkr, 3036 + [GCC_QUPV3_WRAP1_QSPI_REF_CLK] = &gcc_qupv3_wrap1_qspi_ref_clk.clkr, 3037 + [GCC_QUPV3_WRAP1_QSPI_REF_CLK_SRC] = &gcc_qupv3_wrap1_qspi_ref_clk_src.clkr, 3038 + [GCC_QUPV3_WRAP1_S0_CLK] = &gcc_qupv3_wrap1_s0_clk.clkr, 3039 + [GCC_QUPV3_WRAP1_S0_CLK_SRC] = &gcc_qupv3_wrap1_s0_clk_src.clkr, 3040 + [GCC_QUPV3_WRAP1_S1_CLK] = &gcc_qupv3_wrap1_s1_clk.clkr, 3041 + [GCC_QUPV3_WRAP1_S1_CLK_SRC] = &gcc_qupv3_wrap1_s1_clk_src.clkr, 3042 + [GCC_QUPV3_WRAP1_S2_CLK] = &gcc_qupv3_wrap1_s2_clk.clkr, 3043 + [GCC_QUPV3_WRAP1_S2_CLK_SRC] = &gcc_qupv3_wrap1_s2_clk_src.clkr, 3044 + [GCC_QUPV3_WRAP1_S3_CLK] = &gcc_qupv3_wrap1_s3_clk.clkr, 3045 + [GCC_QUPV3_WRAP1_S3_CLK_SRC] = &gcc_qupv3_wrap1_s3_clk_src.clkr, 3046 + [GCC_QUPV3_WRAP1_S4_CLK] = &gcc_qupv3_wrap1_s4_clk.clkr, 3047 + [GCC_QUPV3_WRAP1_S4_CLK_SRC] = &gcc_qupv3_wrap1_s4_clk_src.clkr, 3048 + [GCC_QUPV3_WRAP1_S5_CLK] = &gcc_qupv3_wrap1_s5_clk.clkr, 3049 + [GCC_QUPV3_WRAP1_S5_CLK_SRC] = &gcc_qupv3_wrap1_s5_clk_src.clkr, 3050 + [GCC_QUPV3_WRAP1_S6_CLK] = &gcc_qupv3_wrap1_s6_clk.clkr, 3051 + [GCC_QUPV3_WRAP1_S6_CLK_SRC] = &gcc_qupv3_wrap1_s6_clk_src.clkr, 3052 + [GCC_QUPV3_WRAP1_S7_CLK] = &gcc_qupv3_wrap1_s7_clk.clkr, 3053 + [GCC_QUPV3_WRAP1_S7_CLK_SRC] = &gcc_qupv3_wrap1_s7_clk_src.clkr, 3054 + [GCC_QUPV3_WRAP2_CORE_2X_CLK] = &gcc_qupv3_wrap2_core_2x_clk.clkr, 3055 + [GCC_QUPV3_WRAP2_CORE_CLK] = &gcc_qupv3_wrap2_core_clk.clkr, 3056 + [GCC_QUPV3_WRAP2_IBI_CTRL_0_CLK_SRC] = &gcc_qupv3_wrap2_ibi_ctrl_0_clk_src.clkr, 3057 + [GCC_QUPV3_WRAP2_IBI_CTRL_2_CLK] = &gcc_qupv3_wrap2_ibi_ctrl_2_clk.clkr, 3058 + [GCC_QUPV3_WRAP2_IBI_CTRL_3_CLK] = &gcc_qupv3_wrap2_ibi_ctrl_3_clk.clkr, 3059 + [GCC_QUPV3_WRAP2_S0_CLK] = &gcc_qupv3_wrap2_s0_clk.clkr, 3060 + [GCC_QUPV3_WRAP2_S0_CLK_SRC] = &gcc_qupv3_wrap2_s0_clk_src.clkr, 3061 + [GCC_QUPV3_WRAP2_S1_CLK] = &gcc_qupv3_wrap2_s1_clk.clkr, 3062 + [GCC_QUPV3_WRAP2_S1_CLK_SRC] = &gcc_qupv3_wrap2_s1_clk_src.clkr, 3063 + [GCC_QUPV3_WRAP2_S2_CLK] = &gcc_qupv3_wrap2_s2_clk.clkr, 3064 + [GCC_QUPV3_WRAP2_S2_CLK_SRC] = &gcc_qupv3_wrap2_s2_clk_src.clkr, 3065 + [GCC_QUPV3_WRAP2_S3_CLK] = &gcc_qupv3_wrap2_s3_clk.clkr, 3066 + [GCC_QUPV3_WRAP2_S3_CLK_SRC] = &gcc_qupv3_wrap2_s3_clk_src.clkr, 3067 + [GCC_QUPV3_WRAP2_S4_CLK] = &gcc_qupv3_wrap2_s4_clk.clkr, 3068 + [GCC_QUPV3_WRAP2_S4_CLK_SRC] = &gcc_qupv3_wrap2_s4_clk_src.clkr, 3069 + [GCC_QUPV3_WRAP2_S5_CLK] = &gcc_qupv3_wrap2_s5_clk.clkr, 3070 + [GCC_QUPV3_WRAP2_S5_CLK_SRC] = &gcc_qupv3_wrap2_s5_clk_src.clkr, 3071 + [GCC_QUPV3_WRAP2_S6_CLK] = &gcc_qupv3_wrap2_s6_clk.clkr, 3072 + [GCC_QUPV3_WRAP2_S6_CLK_SRC] = &gcc_qupv3_wrap2_s6_clk_src.clkr, 3073 + [GCC_QUPV3_WRAP2_S7_CLK] = &gcc_qupv3_wrap2_s7_clk.clkr, 3074 + [GCC_QUPV3_WRAP2_S7_CLK_SRC] = &gcc_qupv3_wrap2_s7_clk_src.clkr, 3075 + [GCC_QUPV3_WRAP_1_M_AHB_CLK] = &gcc_qupv3_wrap_1_m_ahb_clk.clkr, 3076 + [GCC_QUPV3_WRAP_1_S_AHB_CLK] = &gcc_qupv3_wrap_1_s_ahb_clk.clkr, 3077 + [GCC_QUPV3_WRAP_2_IBI_2_AHB_CLK] = &gcc_qupv3_wrap_2_ibi_2_ahb_clk.clkr, 3078 + [GCC_QUPV3_WRAP_2_IBI_3_AHB_CLK] = &gcc_qupv3_wrap_2_ibi_3_ahb_clk.clkr, 3079 + [GCC_QUPV3_WRAP_2_M_AHB_CLK] = &gcc_qupv3_wrap_2_m_ahb_clk.clkr, 3080 + [GCC_QUPV3_WRAP_2_S_AHB_CLK] = &gcc_qupv3_wrap_2_s_ahb_clk.clkr, 3081 + [GCC_SDCC2_AHB_CLK] = &gcc_sdcc2_ahb_clk.clkr, 3082 + [GCC_SDCC2_APPS_CLK] = &gcc_sdcc2_apps_clk.clkr, 3083 + [GCC_SDCC2_APPS_CLK_SRC] = &gcc_sdcc2_apps_clk_src.clkr, 3084 + [GCC_SDCC4_AHB_CLK] = &gcc_sdcc4_ahb_clk.clkr, 3085 + [GCC_SDCC4_APPS_CLK] = &gcc_sdcc4_apps_clk.clkr, 3086 + [GCC_SDCC4_APPS_CLK_SRC] = &gcc_sdcc4_apps_clk_src.clkr, 3087 + [GCC_UFS_PHY_AHB_CLK] = &gcc_ufs_phy_ahb_clk.clkr, 3088 + [GCC_UFS_PHY_AXI_CLK] = &gcc_ufs_phy_axi_clk.clkr, 3089 + [GCC_UFS_PHY_AXI_CLK_SRC] = &gcc_ufs_phy_axi_clk_src.clkr, 3090 + [GCC_UFS_PHY_ICE_CORE_CLK] = &gcc_ufs_phy_ice_core_clk.clkr, 3091 + [GCC_UFS_PHY_ICE_CORE_CLK_SRC] = &gcc_ufs_phy_ice_core_clk_src.clkr, 3092 + [GCC_UFS_PHY_PHY_AUX_CLK] = &gcc_ufs_phy_phy_aux_clk.clkr, 3093 + [GCC_UFS_PHY_PHY_AUX_CLK_SRC] = &gcc_ufs_phy_phy_aux_clk_src.clkr, 3094 + [GCC_UFS_PHY_RX_SYMBOL_0_CLK] = &gcc_ufs_phy_rx_symbol_0_clk.clkr, 3095 + [GCC_UFS_PHY_RX_SYMBOL_0_CLK_SRC] = &gcc_ufs_phy_rx_symbol_0_clk_src.clkr, 3096 + [GCC_UFS_PHY_RX_SYMBOL_1_CLK] = &gcc_ufs_phy_rx_symbol_1_clk.clkr, 3097 + [GCC_UFS_PHY_RX_SYMBOL_1_CLK_SRC] = &gcc_ufs_phy_rx_symbol_1_clk_src.clkr, 3098 + [GCC_UFS_PHY_TX_SYMBOL_0_CLK] = &gcc_ufs_phy_tx_symbol_0_clk.clkr, 3099 + [GCC_UFS_PHY_TX_SYMBOL_0_CLK_SRC] = &gcc_ufs_phy_tx_symbol_0_clk_src.clkr, 3100 + [GCC_UFS_PHY_UNIPRO_CORE_CLK] = &gcc_ufs_phy_unipro_core_clk.clkr, 3101 + [GCC_UFS_PHY_UNIPRO_CORE_CLK_SRC] = &gcc_ufs_phy_unipro_core_clk_src.clkr, 3102 + [GCC_USB30_PRIM_MASTER_CLK] = &gcc_usb30_prim_master_clk.clkr, 3103 + [GCC_USB30_PRIM_MASTER_CLK_SRC] = &gcc_usb30_prim_master_clk_src.clkr, 3104 + [GCC_USB30_PRIM_MOCK_UTMI_CLK] = &gcc_usb30_prim_mock_utmi_clk.clkr, 3105 + [GCC_USB30_PRIM_MOCK_UTMI_CLK_SRC] = &gcc_usb30_prim_mock_utmi_clk_src.clkr, 3106 + [GCC_USB30_PRIM_MOCK_UTMI_POSTDIV_CLK_SRC] = &gcc_usb30_prim_mock_utmi_postdiv_clk_src.clkr, 3107 + [GCC_USB30_PRIM_SLEEP_CLK] = &gcc_usb30_prim_sleep_clk.clkr, 3108 + [GCC_USB3_PRIM_PHY_AUX_CLK] = &gcc_usb3_prim_phy_aux_clk.clkr, 3109 + [GCC_USB3_PRIM_PHY_AUX_CLK_SRC] = &gcc_usb3_prim_phy_aux_clk_src.clkr, 3110 + [GCC_USB3_PRIM_PHY_COM_AUX_CLK] = &gcc_usb3_prim_phy_com_aux_clk.clkr, 3111 + [GCC_USB3_PRIM_PHY_PIPE_CLK] = &gcc_usb3_prim_phy_pipe_clk.clkr, 3112 + [GCC_USB3_PRIM_PHY_PIPE_CLK_SRC] = &gcc_usb3_prim_phy_pipe_clk_src.clkr, 3113 + [GCC_VIDEO_AXI0_CLK] = &gcc_video_axi0_clk.clkr, 3114 + [GCC_VIDEO_AXI1_CLK] = &gcc_video_axi1_clk.clkr, 3115 + }; 3116 + 3117 + static struct gdsc *gcc_sm8750_gdscs[] = { 3118 + [GCC_PCIE_0_GDSC] = &gcc_pcie_0_gdsc, 3119 + [GCC_PCIE_0_PHY_GDSC] = &gcc_pcie_0_phy_gdsc, 3120 + [GCC_UFS_MEM_PHY_GDSC] = &gcc_ufs_mem_phy_gdsc, 3121 + [GCC_UFS_PHY_GDSC] = &gcc_ufs_phy_gdsc, 3122 + [GCC_USB30_PRIM_GDSC] = &gcc_usb30_prim_gdsc, 3123 + [GCC_USB3_PHY_GDSC] = &gcc_usb3_phy_gdsc, 3124 + }; 3125 + 3126 + static const struct qcom_reset_map gcc_sm8750_resets[] = { 3127 + [GCC_CAMERA_BCR] = { 0x26000 }, 3128 + [GCC_DISPLAY_BCR] = { 0x27000 }, 3129 + [GCC_EVA_BCR] = { 0x9f000 }, 3130 + [GCC_EVA_AXI0_CLK_ARES] = { 0x9f008, 2 }, 3131 + [GCC_EVA_AXI0C_CLK_ARES] = { 0x9f018, 2 }, 3132 + [GCC_GPU_BCR] = { 0x71000 }, 3133 + [GCC_PCIE_0_BCR] = { 0x6b000 }, 3134 + [GCC_PCIE_0_LINK_DOWN_BCR] = { 0x6c014 }, 3135 + [GCC_PCIE_0_NOCSR_COM_PHY_BCR] = { 0x6c020 }, 3136 + [GCC_PCIE_0_PHY_BCR] = { 0x6c01c }, 3137 + [GCC_PCIE_0_PHY_NOCSR_COM_PHY_BCR] = { 0x6c028 }, 3138 + [GCC_PCIE_PHY_BCR] = { 0x6f000 }, 3139 + [GCC_PCIE_PHY_CFG_AHB_BCR] = { 0x6f00c }, 3140 + [GCC_PCIE_PHY_COM_BCR] = { 0x6f010 }, 3141 + [GCC_PCIE_RSCC_BCR] = { 0x11000 }, 3142 + [GCC_PDM_BCR] = { 0x33000 }, 3143 + [GCC_QUPV3_WRAPPER_1_BCR] = { 0x18000 }, 3144 + [GCC_QUPV3_WRAPPER_2_BCR] = { 0x1e000 }, 3145 + [GCC_QUPV3_WRAPPER_I2C_BCR] = { 0x17000 }, 3146 + [GCC_QUSB2PHY_PRIM_BCR] = { 0x12000 }, 3147 + [GCC_QUSB2PHY_SEC_BCR] = { 0x12004 }, 3148 + [GCC_SDCC2_BCR] = { 0x14000 }, 3149 + [GCC_SDCC4_BCR] = { 0x16000 }, 3150 + [GCC_UFS_PHY_BCR] = { 0x77000 }, 3151 + [GCC_USB30_PRIM_BCR] = { 0x39000 }, 3152 + [GCC_USB3_DP_PHY_PRIM_BCR] = { 0x50008 }, 3153 + [GCC_USB3_DP_PHY_SEC_BCR] = { 0x50014 }, 3154 + [GCC_USB3_PHY_PRIM_BCR] = { 0x50000 }, 3155 + [GCC_USB3_PHY_SEC_BCR] = { 0x5000c }, 3156 + [GCC_USB3PHY_PHY_PRIM_BCR] = { 0x50004 }, 3157 + [GCC_USB3PHY_PHY_SEC_BCR] = { 0x50010 }, 3158 + [GCC_VIDEO_BCR] = { 0x32000 }, 3159 + [GCC_VIDEO_AXI0_CLK_ARES] = { 0x32018, 2 }, 3160 + [GCC_VIDEO_AXI1_CLK_ARES] = { 0x32028, 2 }, 3161 + }; 3162 + 3163 + 3164 + static const struct clk_rcg_dfs_data gcc_dfs_clocks[] = { 3165 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_qspi_ref_clk_src), 3166 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s0_clk_src), 3167 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s1_clk_src), 3168 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s3_clk_src), 3169 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s4_clk_src), 3170 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s5_clk_src), 3171 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s6_clk_src), 3172 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s7_clk_src), 3173 + DEFINE_RCG_DFS(gcc_qupv3_wrap2_s0_clk_src), 3174 + DEFINE_RCG_DFS(gcc_qupv3_wrap2_s1_clk_src), 3175 + DEFINE_RCG_DFS(gcc_qupv3_wrap2_s2_clk_src), 3176 + DEFINE_RCG_DFS(gcc_qupv3_wrap2_s3_clk_src), 3177 + DEFINE_RCG_DFS(gcc_qupv3_wrap2_s4_clk_src), 3178 + DEFINE_RCG_DFS(gcc_qupv3_wrap2_s5_clk_src), 3179 + DEFINE_RCG_DFS(gcc_qupv3_wrap2_s6_clk_src), 3180 + DEFINE_RCG_DFS(gcc_qupv3_wrap2_s7_clk_src), 3181 + }; 3182 + 3183 + static const struct regmap_config gcc_sm8750_regmap_config = { 3184 + .reg_bits = 32, 3185 + .reg_stride = 4, 3186 + .val_bits = 32, 3187 + .max_register = 0x1f41f0, 3188 + .fast_io = true, 3189 + }; 3190 + 3191 + static const struct qcom_cc_desc gcc_sm8750_desc = { 3192 + .config = &gcc_sm8750_regmap_config, 3193 + .clks = gcc_sm8750_clocks, 3194 + .num_clks = ARRAY_SIZE(gcc_sm8750_clocks), 3195 + .resets = gcc_sm8750_resets, 3196 + .num_resets = ARRAY_SIZE(gcc_sm8750_resets), 3197 + .gdscs = gcc_sm8750_gdscs, 3198 + .num_gdscs = ARRAY_SIZE(gcc_sm8750_gdscs), 3199 + }; 3200 + 3201 + static const struct of_device_id gcc_sm8750_match_table[] = { 3202 + { .compatible = "qcom,sm8750-gcc" }, 3203 + { } 3204 + }; 3205 + MODULE_DEVICE_TABLE(of, gcc_sm8750_match_table); 3206 + 3207 + static int gcc_sm8750_probe(struct platform_device *pdev) 3208 + { 3209 + struct regmap *regmap; 3210 + int ret; 3211 + 3212 + regmap = qcom_cc_map(pdev, &gcc_sm8750_desc); 3213 + if (IS_ERR(regmap)) 3214 + return PTR_ERR(regmap); 3215 + 3216 + ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks, 3217 + ARRAY_SIZE(gcc_dfs_clocks)); 3218 + if (ret) 3219 + return ret; 3220 + 3221 + /* 3222 + * Keep clocks always enabled: 3223 + * gcc_cam_bist_mclk_ahb_clk 3224 + * gcc_camera_ahb_clk 3225 + * gcc_camera_xo_clk 3226 + * gcc_disp_ahb_clk 3227 + * gcc_eva_ahb_clk 3228 + * gcc_eva_xo_clk 3229 + * gcc_gpu_cfg_ahb_clk 3230 + * gcc_video_ahb_clk 3231 + * gcc_video_xo_clk 3232 + * gcc_pcie_rscc_cfg_ahb_clk 3233 + * gcc_pcie_rscc_xo_clk 3234 + */ 3235 + qcom_branch_set_clk_en(regmap, 0xa0004); 3236 + qcom_branch_set_clk_en(regmap, 0x26004); 3237 + qcom_branch_set_clk_en(regmap, 0x26034); 3238 + qcom_branch_set_clk_en(regmap, 0x27004); 3239 + qcom_branch_set_clk_en(regmap, 0x9f004); 3240 + qcom_branch_set_clk_en(regmap, 0x9f01c); 3241 + qcom_branch_set_clk_en(regmap, 0x71004); 3242 + qcom_branch_set_clk_en(regmap, 0x32004); 3243 + qcom_branch_set_clk_en(regmap, 0x32038); 3244 + regmap_update_bits(regmap, 0x52010, BIT(20), BIT(20)); 3245 + regmap_update_bits(regmap, 0x52010, BIT(21), BIT(21)); 3246 + 3247 + /* FORCE_MEM_CORE_ON for ufs phy ice core clocks */ 3248 + qcom_branch_set_force_mem_core(regmap, gcc_ufs_phy_ice_core_clk, true); 3249 + 3250 + return qcom_cc_really_probe(&pdev->dev, &gcc_sm8750_desc, regmap); 3251 + } 3252 + 3253 + static struct platform_driver gcc_sm8750_driver = { 3254 + .probe = gcc_sm8750_probe, 3255 + .driver = { 3256 + .name = "gcc-sm8750", 3257 + .of_match_table = gcc_sm8750_match_table, 3258 + }, 3259 + }; 3260 + 3261 + static int __init gcc_sm8750_init(void) 3262 + { 3263 + return platform_driver_register(&gcc_sm8750_driver); 3264 + } 3265 + subsys_initcall(gcc_sm8750_init); 3266 + 3267 + static void __exit gcc_sm8750_exit(void) 3268 + { 3269 + platform_driver_unregister(&gcc_sm8750_driver); 3270 + } 3271 + module_exit(gcc_sm8750_exit); 3272 + 3273 + MODULE_DESCRIPTION("QTI GCC SM8750 Driver"); 3274 + MODULE_LICENSE("GPL");
+1 -1
drivers/clk/qcom/gcc-x1e80100.c
··· 6083 6083 .pd = { 6084 6084 .name = "gcc_usb20_prim_gdsc", 6085 6085 }, 6086 - .pwrsts = PWRSTS_OFF_ON, 6086 + .pwrsts = PWRSTS_RET_ON, 6087 6087 .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 6088 6088 }; 6089 6089
+587
drivers/clk/qcom/gpucc-x1p42100.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Copyright (c) 2023-2024, Qualcomm Innovation Center, Inc. All rights reserved. 4 + */ 5 + 6 + #include <linux/clk-provider.h> 7 + #include <linux/mod_devicetable.h> 8 + #include <linux/module.h> 9 + #include <linux/of.h> 10 + #include <linux/platform_device.h> 11 + #include <linux/pm_runtime.h> 12 + #include <linux/regmap.h> 13 + 14 + #include <dt-bindings/clock/qcom,x1e80100-gpucc.h> 15 + 16 + #include "clk-alpha-pll.h" 17 + #include "clk-branch.h" 18 + #include "clk-pll.h" 19 + #include "clk-rcg.h" 20 + #include "clk-regmap.h" 21 + #include "clk-regmap-divider.h" 22 + #include "clk-regmap-mux.h" 23 + #include "common.h" 24 + #include "gdsc.h" 25 + #include "reset.h" 26 + 27 + enum { 28 + DT_BI_TCXO, 29 + DT_GPLL0_OUT_MAIN, 30 + DT_GPLL0_OUT_MAIN_DIV, 31 + }; 32 + 33 + enum { 34 + P_BI_TCXO, 35 + P_GPLL0_OUT_MAIN, 36 + P_GPLL0_OUT_MAIN_DIV, 37 + P_GPU_CC_PLL0_OUT_MAIN, 38 + P_GPU_CC_PLL1_OUT_MAIN, 39 + }; 40 + 41 + static const struct pll_vco lucid_ole_vco[] = { 42 + { 249600000, 2300000000, 0 }, 43 + }; 44 + 45 + /* 560.0 MHz Configuration */ 46 + static const struct alpha_pll_config gpu_cc_pll0_config = { 47 + .l = 0x1d, 48 + .alpha = 0x2aaa, 49 + .config_ctl_val = 0x20485699, 50 + .config_ctl_hi_val = 0x00182261, 51 + .config_ctl_hi1_val = 0x82aa299c, 52 + .test_ctl_val = 0x00000000, 53 + .test_ctl_hi_val = 0x00000003, 54 + .test_ctl_hi1_val = 0x00009000, 55 + .test_ctl_hi2_val = 0x00000034, 56 + .user_ctl_val = 0x00000000, 57 + .user_ctl_hi_val = 0x00000005, 58 + }; 59 + 60 + static struct clk_alpha_pll gpu_cc_pll0 = { 61 + .offset = 0x0, 62 + .vco_table = lucid_ole_vco, 63 + .num_vco = ARRAY_SIZE(lucid_ole_vco), 64 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 65 + .clkr = { 66 + .hw.init = &(const struct clk_init_data) { 67 + .name = "gpu_cc_pll0", 68 + .parent_data = &(const struct clk_parent_data) { 69 + .index = DT_BI_TCXO, 70 + }, 71 + .num_parents = 1, 72 + .ops = &clk_alpha_pll_lucid_evo_ops, 73 + }, 74 + }, 75 + }; 76 + 77 + /* 440.0 MHz Configuration */ 78 + static const struct alpha_pll_config gpu_cc_pll1_config = { 79 + .l = 0x16, 80 + .alpha = 0xeaaa, 81 + .config_ctl_val = 0x20485699, 82 + .config_ctl_hi_val = 0x00182261, 83 + .config_ctl_hi1_val = 0x82aa299c, 84 + .test_ctl_val = 0x00000000, 85 + .test_ctl_hi_val = 0x00000003, 86 + .test_ctl_hi1_val = 0x00009000, 87 + .test_ctl_hi2_val = 0x00000034, 88 + .user_ctl_val = 0x00000000, 89 + .user_ctl_hi_val = 0x00000005, 90 + }; 91 + 92 + static struct clk_alpha_pll gpu_cc_pll1 = { 93 + .offset = 0x1000, 94 + .vco_table = lucid_ole_vco, 95 + .num_vco = ARRAY_SIZE(lucid_ole_vco), 96 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_LUCID_OLE], 97 + .clkr = { 98 + .hw.init = &(const struct clk_init_data) { 99 + .name = "gpu_cc_pll1", 100 + .parent_data = &(const struct clk_parent_data) { 101 + .index = DT_BI_TCXO, 102 + }, 103 + .num_parents = 1, 104 + .ops = &clk_alpha_pll_lucid_evo_ops, 105 + }, 106 + }, 107 + }; 108 + 109 + static const struct parent_map gpu_cc_parent_map_0[] = { 110 + { P_BI_TCXO, 0 }, 111 + { P_GPLL0_OUT_MAIN, 5 }, 112 + { P_GPLL0_OUT_MAIN_DIV, 6 }, 113 + }; 114 + 115 + static const struct clk_parent_data gpu_cc_parent_data_0[] = { 116 + { .index = DT_BI_TCXO }, 117 + { .index = DT_GPLL0_OUT_MAIN }, 118 + { .index = DT_GPLL0_OUT_MAIN_DIV }, 119 + }; 120 + 121 + static const struct parent_map gpu_cc_parent_map_1[] = { 122 + { P_BI_TCXO, 0 }, 123 + { P_GPU_CC_PLL0_OUT_MAIN, 1 }, 124 + { P_GPU_CC_PLL1_OUT_MAIN, 3 }, 125 + { P_GPLL0_OUT_MAIN, 5 }, 126 + { P_GPLL0_OUT_MAIN_DIV, 6 }, 127 + }; 128 + 129 + static const struct clk_parent_data gpu_cc_parent_data_1[] = { 130 + { .index = DT_BI_TCXO }, 131 + { .hw = &gpu_cc_pll0.clkr.hw }, 132 + { .hw = &gpu_cc_pll1.clkr.hw }, 133 + { .index = DT_GPLL0_OUT_MAIN }, 134 + { .index = DT_GPLL0_OUT_MAIN_DIV }, 135 + }; 136 + 137 + static const struct parent_map gpu_cc_parent_map_2[] = { 138 + { P_BI_TCXO, 0 }, 139 + { P_GPU_CC_PLL1_OUT_MAIN, 3 }, 140 + { P_GPLL0_OUT_MAIN, 5 }, 141 + { P_GPLL0_OUT_MAIN_DIV, 6 }, 142 + }; 143 + 144 + static const struct clk_parent_data gpu_cc_parent_data_2[] = { 145 + { .index = DT_BI_TCXO }, 146 + { .hw = &gpu_cc_pll1.clkr.hw }, 147 + { .index = DT_GPLL0_OUT_MAIN }, 148 + { .index = DT_GPLL0_OUT_MAIN_DIV }, 149 + }; 150 + 151 + static const struct freq_tbl ftbl_gpu_cc_ff_clk_src[] = { 152 + F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 153 + { } 154 + }; 155 + 156 + static struct clk_rcg2 gpu_cc_ff_clk_src = { 157 + .cmd_rcgr = 0x9474, 158 + .mnd_width = 0, 159 + .hid_width = 5, 160 + .parent_map = gpu_cc_parent_map_0, 161 + .freq_tbl = ftbl_gpu_cc_ff_clk_src, 162 + .clkr.hw.init = &(const struct clk_init_data) { 163 + .name = "gpu_cc_ff_clk_src", 164 + .parent_data = gpu_cc_parent_data_0, 165 + .num_parents = ARRAY_SIZE(gpu_cc_parent_data_0), 166 + .flags = CLK_SET_RATE_PARENT, 167 + .ops = &clk_rcg2_shared_ops, 168 + }, 169 + }; 170 + 171 + static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = { 172 + F(19200000, P_BI_TCXO, 1, 0, 0), 173 + F(220000000, P_GPU_CC_PLL1_OUT_MAIN, 2, 0, 0), 174 + F(550000000, P_GPU_CC_PLL1_OUT_MAIN, 2, 0, 0), 175 + { } 176 + }; 177 + 178 + static struct clk_rcg2 gpu_cc_gmu_clk_src = { 179 + .cmd_rcgr = 0x9318, 180 + .mnd_width = 0, 181 + .hid_width = 5, 182 + .parent_map = gpu_cc_parent_map_1, 183 + .freq_tbl = ftbl_gpu_cc_gmu_clk_src, 184 + .clkr.hw.init = &(const struct clk_init_data) { 185 + .name = "gpu_cc_gmu_clk_src", 186 + .parent_data = gpu_cc_parent_data_1, 187 + .num_parents = ARRAY_SIZE(gpu_cc_parent_data_1), 188 + .flags = CLK_SET_RATE_PARENT, 189 + .ops = &clk_rcg2_shared_ops, 190 + }, 191 + }; 192 + 193 + static struct clk_rcg2 gpu_cc_hub_clk_src = { 194 + .cmd_rcgr = 0x93ec, 195 + .mnd_width = 0, 196 + .hid_width = 5, 197 + .parent_map = gpu_cc_parent_map_2, 198 + .freq_tbl = ftbl_gpu_cc_ff_clk_src, 199 + .clkr.hw.init = &(const struct clk_init_data) { 200 + .name = "gpu_cc_hub_clk_src", 201 + .parent_data = gpu_cc_parent_data_2, 202 + .num_parents = ARRAY_SIZE(gpu_cc_parent_data_2), 203 + .flags = CLK_SET_RATE_PARENT, 204 + .ops = &clk_rcg2_shared_ops, 205 + }, 206 + }; 207 + 208 + static struct clk_branch gpu_cc_ahb_clk = { 209 + .halt_reg = 0x911c, 210 + .halt_check = BRANCH_HALT_DELAY, 211 + .clkr = { 212 + .enable_reg = 0x911c, 213 + .enable_mask = BIT(0), 214 + .hw.init = &(const struct clk_init_data) { 215 + .name = "gpu_cc_ahb_clk", 216 + .parent_hws = (const struct clk_hw*[]) { 217 + &gpu_cc_hub_clk_src.clkr.hw, 218 + }, 219 + .num_parents = 1, 220 + .flags = CLK_SET_RATE_PARENT, 221 + .ops = &clk_branch2_ops, 222 + }, 223 + }, 224 + }; 225 + 226 + static struct clk_branch gpu_cc_crc_ahb_clk = { 227 + .halt_reg = 0x9120, 228 + .halt_check = BRANCH_HALT_VOTED, 229 + .clkr = { 230 + .enable_reg = 0x9120, 231 + .enable_mask = BIT(0), 232 + .hw.init = &(const struct clk_init_data) { 233 + .name = "gpu_cc_crc_ahb_clk", 234 + .parent_hws = (const struct clk_hw*[]) { 235 + &gpu_cc_hub_clk_src.clkr.hw, 236 + }, 237 + .num_parents = 1, 238 + .flags = CLK_SET_RATE_PARENT, 239 + .ops = &clk_branch2_ops, 240 + }, 241 + }, 242 + }; 243 + 244 + static struct clk_branch gpu_cc_cx_accu_shift_clk = { 245 + .halt_reg = 0x9480, 246 + .halt_check = BRANCH_HALT_VOTED, 247 + .clkr = { 248 + .enable_reg = 0x9480, 249 + .enable_mask = BIT(0), 250 + .hw.init = &(const struct clk_init_data) { 251 + .name = "gpu_cc_cx_accu_shift_clk", 252 + .ops = &clk_branch2_ops, 253 + }, 254 + }, 255 + }; 256 + 257 + static struct clk_branch gpu_cc_cx_ff_clk = { 258 + .halt_reg = 0x914c, 259 + .halt_check = BRANCH_HALT, 260 + .clkr = { 261 + .enable_reg = 0x914c, 262 + .enable_mask = BIT(0), 263 + .hw.init = &(const struct clk_init_data) { 264 + .name = "gpu_cc_cx_ff_clk", 265 + .parent_hws = (const struct clk_hw*[]) { 266 + &gpu_cc_ff_clk_src.clkr.hw, 267 + }, 268 + .num_parents = 1, 269 + .flags = CLK_SET_RATE_PARENT, 270 + .ops = &clk_branch2_ops, 271 + }, 272 + }, 273 + }; 274 + 275 + static struct clk_branch gpu_cc_cx_gmu_clk = { 276 + .halt_reg = 0x913c, 277 + .halt_check = BRANCH_HALT_VOTED, 278 + .clkr = { 279 + .enable_reg = 0x913c, 280 + .enable_mask = BIT(0), 281 + .hw.init = &(const struct clk_init_data) { 282 + .name = "gpu_cc_cx_gmu_clk", 283 + .parent_hws = (const struct clk_hw*[]) { 284 + &gpu_cc_gmu_clk_src.clkr.hw, 285 + }, 286 + .num_parents = 1, 287 + .flags = CLK_SET_RATE_PARENT, 288 + .ops = &clk_branch2_aon_ops, 289 + }, 290 + }, 291 + }; 292 + 293 + static struct clk_branch gpu_cc_cxo_clk = { 294 + .halt_reg = 0x9144, 295 + .halt_check = BRANCH_HALT, 296 + .clkr = { 297 + .enable_reg = 0x9144, 298 + .enable_mask = BIT(0), 299 + .hw.init = &(const struct clk_init_data) { 300 + .name = "gpu_cc_cxo_clk", 301 + .ops = &clk_branch2_ops, 302 + }, 303 + }, 304 + }; 305 + 306 + static struct clk_branch gpu_cc_freq_measure_clk = { 307 + .halt_reg = 0x9008, 308 + .halt_check = BRANCH_HALT, 309 + .clkr = { 310 + .enable_reg = 0x9008, 311 + .enable_mask = BIT(0), 312 + .hw.init = &(const struct clk_init_data) { 313 + .name = "gpu_cc_freq_measure_clk", 314 + .ops = &clk_branch2_ops, 315 + }, 316 + }, 317 + }; 318 + 319 + static struct clk_branch gpu_cc_gx_accu_shift_clk = { 320 + .halt_reg = 0x947c, 321 + .halt_check = BRANCH_HALT_VOTED, 322 + .clkr = { 323 + .enable_reg = 0x947c, 324 + .enable_mask = BIT(0), 325 + .hw.init = &(const struct clk_init_data) { 326 + .name = "gpu_cc_gx_accu_shift_clk", 327 + .ops = &clk_branch2_ops, 328 + }, 329 + }, 330 + }; 331 + 332 + static struct clk_branch gpu_cc_gx_gmu_clk = { 333 + .halt_reg = 0x90bc, 334 + .halt_check = BRANCH_HALT, 335 + .clkr = { 336 + .enable_reg = 0x90bc, 337 + .enable_mask = BIT(0), 338 + .hw.init = &(const struct clk_init_data) { 339 + .name = "gpu_cc_gx_gmu_clk", 340 + .parent_hws = (const struct clk_hw*[]) { 341 + &gpu_cc_gmu_clk_src.clkr.hw, 342 + }, 343 + .num_parents = 1, 344 + .flags = CLK_SET_RATE_PARENT, 345 + .ops = &clk_branch2_ops, 346 + }, 347 + }, 348 + }; 349 + 350 + static struct clk_branch gpu_cc_gx_vsense_clk = { 351 + .halt_reg = 0x90b0, 352 + .halt_check = BRANCH_HALT_VOTED, 353 + .clkr = { 354 + .enable_reg = 0x90b0, 355 + .enable_mask = BIT(0), 356 + .hw.init = &(const struct clk_init_data) { 357 + .name = "gpu_cc_gx_vsense_clk", 358 + .ops = &clk_branch2_ops, 359 + }, 360 + }, 361 + }; 362 + 363 + static struct clk_branch gpu_cc_hub_aon_clk = { 364 + .halt_reg = 0x93e8, 365 + .halt_check = BRANCH_HALT, 366 + .clkr = { 367 + .enable_reg = 0x93e8, 368 + .enable_mask = BIT(0), 369 + .hw.init = &(const struct clk_init_data) { 370 + .name = "gpu_cc_hub_aon_clk", 371 + .parent_hws = (const struct clk_hw*[]) { 372 + &gpu_cc_hub_clk_src.clkr.hw, 373 + }, 374 + .num_parents = 1, 375 + .flags = CLK_SET_RATE_PARENT, 376 + .ops = &clk_branch2_aon_ops, 377 + }, 378 + }, 379 + }; 380 + 381 + static struct clk_branch gpu_cc_hub_cx_int_clk = { 382 + .halt_reg = 0x9148, 383 + .halt_check = BRANCH_HALT_VOTED, 384 + .clkr = { 385 + .enable_reg = 0x9148, 386 + .enable_mask = BIT(0), 387 + .hw.init = &(const struct clk_init_data) { 388 + .name = "gpu_cc_hub_cx_int_clk", 389 + .parent_hws = (const struct clk_hw*[]) { 390 + &gpu_cc_hub_clk_src.clkr.hw, 391 + }, 392 + .num_parents = 1, 393 + .flags = CLK_SET_RATE_PARENT, 394 + .ops = &clk_branch2_aon_ops, 395 + }, 396 + }, 397 + }; 398 + 399 + static struct clk_branch gpu_cc_memnoc_gfx_clk = { 400 + .halt_reg = 0x9150, 401 + .halt_check = BRANCH_HALT_VOTED, 402 + .clkr = { 403 + .enable_reg = 0x9150, 404 + .enable_mask = BIT(0), 405 + .hw.init = &(const struct clk_init_data) { 406 + .name = "gpu_cc_memnoc_gfx_clk", 407 + .ops = &clk_branch2_ops, 408 + }, 409 + }, 410 + }; 411 + 412 + static struct clk_branch gpu_cc_mnd1x_0_gfx3d_clk = { 413 + .halt_reg = 0x9288, 414 + .halt_check = BRANCH_HALT, 415 + .clkr = { 416 + .enable_reg = 0x9288, 417 + .enable_mask = BIT(0), 418 + .hw.init = &(const struct clk_init_data) { 419 + .name = "gpu_cc_mnd1x_0_gfx3d_clk", 420 + .ops = &clk_branch2_ops, 421 + }, 422 + }, 423 + }; 424 + 425 + static struct clk_branch gpu_cc_mnd1x_1_gfx3d_clk = { 426 + .halt_reg = 0x928c, 427 + .halt_check = BRANCH_HALT, 428 + .clkr = { 429 + .enable_reg = 0x928c, 430 + .enable_mask = BIT(0), 431 + .hw.init = &(const struct clk_init_data) { 432 + .name = "gpu_cc_mnd1x_1_gfx3d_clk", 433 + .ops = &clk_branch2_ops, 434 + }, 435 + }, 436 + }; 437 + 438 + static struct clk_branch gpu_cc_sleep_clk = { 439 + .halt_reg = 0x9134, 440 + .halt_check = BRANCH_HALT_VOTED, 441 + .clkr = { 442 + .enable_reg = 0x9134, 443 + .enable_mask = BIT(0), 444 + .hw.init = &(const struct clk_init_data) { 445 + .name = "gpu_cc_sleep_clk", 446 + .ops = &clk_branch2_ops, 447 + }, 448 + }, 449 + }; 450 + 451 + static struct gdsc gpu_cc_cx_gdsc = { 452 + .gdscr = 0x9108, 453 + .gds_hw_ctrl = 0x953c, 454 + .en_rest_wait_val = 0x2, 455 + .en_few_wait_val = 0x2, 456 + .clk_dis_wait_val = 0xf, 457 + .pd = { 458 + .name = "gpu_cc_cx_gdsc", 459 + }, 460 + .pwrsts = PWRSTS_OFF_ON, 461 + .flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 462 + }; 463 + 464 + static struct gdsc gpu_cc_gx_gdsc = { 465 + .gdscr = 0x905c, 466 + .en_rest_wait_val = 0x2, 467 + .en_few_wait_val = 0x2, 468 + .clk_dis_wait_val = 0xf, 469 + .pd = { 470 + .name = "gpu_cc_gx_gdsc", 471 + .power_on = gdsc_gx_do_nothing_enable, 472 + }, 473 + .pwrsts = PWRSTS_OFF_ON, 474 + .flags = CLAMP_IO | POLL_CFG_GDSCR | RETAIN_FF_ENABLE, 475 + }; 476 + 477 + static struct clk_regmap *gpu_cc_x1p42100_clocks[] = { 478 + [GPU_CC_AHB_CLK] = &gpu_cc_ahb_clk.clkr, 479 + [GPU_CC_CRC_AHB_CLK] = &gpu_cc_crc_ahb_clk.clkr, 480 + [GPU_CC_CX_ACCU_SHIFT_CLK] = &gpu_cc_cx_accu_shift_clk.clkr, 481 + [GPU_CC_CX_FF_CLK] = &gpu_cc_cx_ff_clk.clkr, 482 + [GPU_CC_CX_GMU_CLK] = &gpu_cc_cx_gmu_clk.clkr, 483 + [GPU_CC_CXO_CLK] = &gpu_cc_cxo_clk.clkr, 484 + [GPU_CC_FF_CLK_SRC] = &gpu_cc_ff_clk_src.clkr, 485 + [GPU_CC_FREQ_MEASURE_CLK] = &gpu_cc_freq_measure_clk.clkr, 486 + [GPU_CC_GMU_CLK_SRC] = &gpu_cc_gmu_clk_src.clkr, 487 + [GPU_CC_GX_ACCU_SHIFT_CLK] = &gpu_cc_gx_accu_shift_clk.clkr, 488 + [GPU_CC_GX_GMU_CLK] = &gpu_cc_gx_gmu_clk.clkr, 489 + [GPU_CC_GX_VSENSE_CLK] = &gpu_cc_gx_vsense_clk.clkr, 490 + [GPU_CC_HUB_AON_CLK] = &gpu_cc_hub_aon_clk.clkr, 491 + [GPU_CC_HUB_CLK_SRC] = &gpu_cc_hub_clk_src.clkr, 492 + [GPU_CC_HUB_CX_INT_CLK] = &gpu_cc_hub_cx_int_clk.clkr, 493 + [GPU_CC_MEMNOC_GFX_CLK] = &gpu_cc_memnoc_gfx_clk.clkr, 494 + [GPU_CC_MND1X_0_GFX3D_CLK] = &gpu_cc_mnd1x_0_gfx3d_clk.clkr, 495 + [GPU_CC_MND1X_1_GFX3D_CLK] = &gpu_cc_mnd1x_1_gfx3d_clk.clkr, 496 + [GPU_CC_PLL0] = &gpu_cc_pll0.clkr, 497 + [GPU_CC_PLL1] = &gpu_cc_pll1.clkr, 498 + [GPU_CC_SLEEP_CLK] = &gpu_cc_sleep_clk.clkr, 499 + }; 500 + 501 + static struct gdsc *gpu_cc_x1p42100_gdscs[] = { 502 + [GPU_CX_GDSC] = &gpu_cc_cx_gdsc, 503 + [GPU_GX_GDSC] = &gpu_cc_gx_gdsc, 504 + }; 505 + 506 + static const struct qcom_reset_map gpu_cc_x1p42100_resets[] = { 507 + [GPU_CC_ACD_BCR] = { 0x9358 }, 508 + [GPU_CC_CB_BCR] = { 0x93a0 }, 509 + [GPU_CC_CX_BCR] = { 0x9104 }, 510 + [GPU_CC_FAST_HUB_BCR] = { 0x93e4 }, 511 + [GPU_CC_FF_BCR] = { 0x9470 }, 512 + [GPU_CC_GFX3D_AON_BCR] = { 0x9198 }, 513 + [GPU_CC_GMU_BCR] = { 0x9314 }, 514 + [GPU_CC_GX_BCR] = { 0x9058 }, 515 + [GPU_CC_XO_BCR] = { 0x9000 }, 516 + }; 517 + 518 + static const struct regmap_config gpu_cc_x1p42100_regmap_config = { 519 + .reg_bits = 32, 520 + .reg_stride = 4, 521 + .val_bits = 32, 522 + .max_register = 0x9988, 523 + .fast_io = true, 524 + }; 525 + 526 + static struct qcom_cc_desc gpu_cc_x1p42100_desc = { 527 + .config = &gpu_cc_x1p42100_regmap_config, 528 + .clks = gpu_cc_x1p42100_clocks, 529 + .num_clks = ARRAY_SIZE(gpu_cc_x1p42100_clocks), 530 + .resets = gpu_cc_x1p42100_resets, 531 + .num_resets = ARRAY_SIZE(gpu_cc_x1p42100_resets), 532 + .gdscs = gpu_cc_x1p42100_gdscs, 533 + .num_gdscs = ARRAY_SIZE(gpu_cc_x1p42100_gdscs), 534 + }; 535 + 536 + static const struct of_device_id gpu_cc_x1p42100_match_table[] = { 537 + { .compatible = "qcom,x1p42100-gpucc" }, 538 + { } 539 + }; 540 + MODULE_DEVICE_TABLE(of, gpu_cc_x1p42100_match_table); 541 + 542 + static int gpu_cc_x1p42100_probe(struct platform_device *pdev) 543 + { 544 + struct regmap *regmap; 545 + int ret; 546 + 547 + ret = devm_pm_runtime_enable(&pdev->dev); 548 + if (ret) 549 + return ret; 550 + 551 + ret = pm_runtime_resume_and_get(&pdev->dev); 552 + if (ret) 553 + return ret; 554 + 555 + regmap = qcom_cc_map(pdev, &gpu_cc_x1p42100_desc); 556 + if (IS_ERR(regmap)) { 557 + pm_runtime_put(&pdev->dev); 558 + return PTR_ERR(regmap); 559 + } 560 + 561 + clk_lucid_ole_pll_configure(&gpu_cc_pll0, regmap, &gpu_cc_pll0_config); 562 + clk_lucid_ole_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config); 563 + 564 + /* Keep some clocks always enabled */ 565 + qcom_branch_set_clk_en(regmap, 0x93a4); /* GPU_CC_CB_CLK */ 566 + qcom_branch_set_clk_en(regmap, 0x9004); /* GPU_CC_CXO_AON_CLK */ 567 + qcom_branch_set_clk_en(regmap, 0x900c); /* GPU_CC_DEMET_CLK */ 568 + 569 + ret = qcom_cc_really_probe(&pdev->dev, &gpu_cc_x1p42100_desc, regmap); 570 + 571 + pm_runtime_put(&pdev->dev); 572 + 573 + return ret; 574 + } 575 + 576 + static struct platform_driver gpu_cc_x1p42100_driver = { 577 + .probe = gpu_cc_x1p42100_probe, 578 + .driver = { 579 + .name = "gpucc-x1p42100", 580 + .of_match_table = gpu_cc_x1p42100_match_table, 581 + }, 582 + }; 583 + 584 + module_platform_driver(gpu_cc_x1p42100_driver); 585 + 586 + MODULE_DESCRIPTION("QTI GPUCC X1P42100 Driver"); 587 + MODULE_LICENSE("GPL");
+435
drivers/clk/qcom/ipq-cmn-pll.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved. 4 + */ 5 + 6 + /* 7 + * CMN PLL block expects the reference clock from on-board Wi-Fi block, 8 + * and supplies fixed rate clocks as output to the networking hardware 9 + * blocks and to GCC. The networking related blocks include PPE (packet 10 + * process engine), the externally connected PHY or switch devices, and 11 + * the PCS. 12 + * 13 + * On the IPQ9574 SoC, there are three clocks with 50 MHZ and one clock 14 + * with 25 MHZ which are output from the CMN PLL to Ethernet PHY (or switch), 15 + * and one clock with 353 MHZ to PPE. The other fixed rate output clocks 16 + * are supplied to GCC (24 MHZ as XO and 32 KHZ as sleep clock), and to PCS 17 + * with 31.25 MHZ. 18 + * 19 + * +---------+ 20 + * | GCC | 21 + * +--+---+--+ 22 + * AHB CLK| |SYS CLK 23 + * V V 24 + * +-------+---+------+ 25 + * | +-------------> eth0-50mhz 26 + * REF CLK | IPQ9574 | 27 + * -------->+ +-------------> eth1-50mhz 28 + * | CMN PLL block | 29 + * | +-------------> eth2-50mhz 30 + * | | 31 + * +----+----+----+---+-------------> eth-25mhz 32 + * | | | 33 + * V V V 34 + * GCC PCS NSS/PPE 35 + */ 36 + 37 + #include <linux/bitfield.h> 38 + #include <linux/clk-provider.h> 39 + #include <linux/delay.h> 40 + #include <linux/err.h> 41 + #include <linux/mod_devicetable.h> 42 + #include <linux/module.h> 43 + #include <linux/platform_device.h> 44 + #include <linux/pm_clock.h> 45 + #include <linux/pm_runtime.h> 46 + #include <linux/regmap.h> 47 + 48 + #include <dt-bindings/clock/qcom,ipq-cmn-pll.h> 49 + 50 + #define CMN_PLL_REFCLK_SRC_SELECTION 0x28 51 + #define CMN_PLL_REFCLK_SRC_DIV GENMASK(9, 8) 52 + 53 + #define CMN_PLL_LOCKED 0x64 54 + #define CMN_PLL_CLKS_LOCKED BIT(8) 55 + 56 + #define CMN_PLL_POWER_ON_AND_RESET 0x780 57 + #define CMN_ANA_EN_SW_RSTN BIT(6) 58 + 59 + #define CMN_PLL_REFCLK_CONFIG 0x784 60 + #define CMN_PLL_REFCLK_EXTERNAL BIT(9) 61 + #define CMN_PLL_REFCLK_DIV GENMASK(8, 4) 62 + #define CMN_PLL_REFCLK_INDEX GENMASK(3, 0) 63 + 64 + #define CMN_PLL_CTRL 0x78c 65 + #define CMN_PLL_CTRL_LOCK_DETECT_EN BIT(15) 66 + 67 + #define CMN_PLL_DIVIDER_CTRL 0x794 68 + #define CMN_PLL_DIVIDER_CTRL_FACTOR GENMASK(9, 0) 69 + 70 + /** 71 + * struct cmn_pll_fixed_output_clk - CMN PLL output clocks information 72 + * @id: Clock specifier to be supplied 73 + * @name: Clock name to be registered 74 + * @rate: Clock rate 75 + */ 76 + struct cmn_pll_fixed_output_clk { 77 + unsigned int id; 78 + const char *name; 79 + unsigned long rate; 80 + }; 81 + 82 + /** 83 + * struct clk_cmn_pll - CMN PLL hardware specific data 84 + * @regmap: hardware regmap. 85 + * @hw: handle between common and hardware-specific interfaces 86 + */ 87 + struct clk_cmn_pll { 88 + struct regmap *regmap; 89 + struct clk_hw hw; 90 + }; 91 + 92 + #define CLK_PLL_OUTPUT(_id, _name, _rate) { \ 93 + .id = _id, \ 94 + .name = _name, \ 95 + .rate = _rate, \ 96 + } 97 + 98 + #define to_clk_cmn_pll(_hw) container_of(_hw, struct clk_cmn_pll, hw) 99 + 100 + static const struct regmap_config ipq_cmn_pll_regmap_config = { 101 + .reg_bits = 32, 102 + .reg_stride = 4, 103 + .val_bits = 32, 104 + .max_register = 0x7fc, 105 + .fast_io = true, 106 + }; 107 + 108 + static const struct cmn_pll_fixed_output_clk ipq9574_output_clks[] = { 109 + CLK_PLL_OUTPUT(XO_24MHZ_CLK, "xo-24mhz", 24000000UL), 110 + CLK_PLL_OUTPUT(SLEEP_32KHZ_CLK, "sleep-32khz", 32000UL), 111 + CLK_PLL_OUTPUT(PCS_31P25MHZ_CLK, "pcs-31p25mhz", 31250000UL), 112 + CLK_PLL_OUTPUT(NSS_1200MHZ_CLK, "nss-1200mhz", 1200000000UL), 113 + CLK_PLL_OUTPUT(PPE_353MHZ_CLK, "ppe-353mhz", 353000000UL), 114 + CLK_PLL_OUTPUT(ETH0_50MHZ_CLK, "eth0-50mhz", 50000000UL), 115 + CLK_PLL_OUTPUT(ETH1_50MHZ_CLK, "eth1-50mhz", 50000000UL), 116 + CLK_PLL_OUTPUT(ETH2_50MHZ_CLK, "eth2-50mhz", 50000000UL), 117 + CLK_PLL_OUTPUT(ETH_25MHZ_CLK, "eth-25mhz", 25000000UL), 118 + }; 119 + 120 + /* 121 + * CMN PLL has the single parent clock, which supports the several 122 + * possible parent clock rates, each parent clock rate is reflected 123 + * by the specific reference index value in the hardware. 124 + */ 125 + static int ipq_cmn_pll_find_freq_index(unsigned long parent_rate) 126 + { 127 + int index = -EINVAL; 128 + 129 + switch (parent_rate) { 130 + case 25000000: 131 + index = 3; 132 + break; 133 + case 31250000: 134 + index = 4; 135 + break; 136 + case 40000000: 137 + index = 6; 138 + break; 139 + case 48000000: 140 + case 96000000: 141 + /* 142 + * Parent clock rate 48 MHZ and 96 MHZ take the same value 143 + * of reference clock index. 96 MHZ needs the source clock 144 + * divider to be programmed as 2. 145 + */ 146 + index = 7; 147 + break; 148 + case 50000000: 149 + index = 8; 150 + break; 151 + default: 152 + break; 153 + } 154 + 155 + return index; 156 + } 157 + 158 + static unsigned long clk_cmn_pll_recalc_rate(struct clk_hw *hw, 159 + unsigned long parent_rate) 160 + { 161 + struct clk_cmn_pll *cmn_pll = to_clk_cmn_pll(hw); 162 + u32 val, factor; 163 + 164 + /* 165 + * The value of CMN_PLL_DIVIDER_CTRL_FACTOR is automatically adjusted 166 + * by HW according to the parent clock rate. 167 + */ 168 + regmap_read(cmn_pll->regmap, CMN_PLL_DIVIDER_CTRL, &val); 169 + factor = FIELD_GET(CMN_PLL_DIVIDER_CTRL_FACTOR, val); 170 + 171 + return parent_rate * 2 * factor; 172 + } 173 + 174 + static int clk_cmn_pll_determine_rate(struct clk_hw *hw, 175 + struct clk_rate_request *req) 176 + { 177 + int ret; 178 + 179 + /* Validate the rate of the single parent clock. */ 180 + ret = ipq_cmn_pll_find_freq_index(req->best_parent_rate); 181 + 182 + return ret < 0 ? ret : 0; 183 + } 184 + 185 + /* 186 + * This function is used to initialize the CMN PLL to enable the fixed 187 + * rate output clocks. It is expected to be configured once. 188 + */ 189 + static int clk_cmn_pll_set_rate(struct clk_hw *hw, unsigned long rate, 190 + unsigned long parent_rate) 191 + { 192 + struct clk_cmn_pll *cmn_pll = to_clk_cmn_pll(hw); 193 + int ret, index; 194 + u32 val; 195 + 196 + /* 197 + * Configure the reference input clock selection as per the given 198 + * parent clock. The output clock rates are always of fixed value. 199 + */ 200 + index = ipq_cmn_pll_find_freq_index(parent_rate); 201 + if (index < 0) 202 + return index; 203 + 204 + ret = regmap_update_bits(cmn_pll->regmap, CMN_PLL_REFCLK_CONFIG, 205 + CMN_PLL_REFCLK_INDEX, 206 + FIELD_PREP(CMN_PLL_REFCLK_INDEX, index)); 207 + if (ret) 208 + return ret; 209 + 210 + /* 211 + * Update the source clock rate selection and source clock 212 + * divider as 2 when the parent clock rate is 96 MHZ. 213 + */ 214 + if (parent_rate == 96000000) { 215 + ret = regmap_update_bits(cmn_pll->regmap, CMN_PLL_REFCLK_CONFIG, 216 + CMN_PLL_REFCLK_DIV, 217 + FIELD_PREP(CMN_PLL_REFCLK_DIV, 2)); 218 + if (ret) 219 + return ret; 220 + 221 + ret = regmap_update_bits(cmn_pll->regmap, CMN_PLL_REFCLK_SRC_SELECTION, 222 + CMN_PLL_REFCLK_SRC_DIV, 223 + FIELD_PREP(CMN_PLL_REFCLK_SRC_DIV, 0)); 224 + if (ret) 225 + return ret; 226 + } 227 + 228 + /* Enable PLL locked detect. */ 229 + ret = regmap_set_bits(cmn_pll->regmap, CMN_PLL_CTRL, 230 + CMN_PLL_CTRL_LOCK_DETECT_EN); 231 + if (ret) 232 + return ret; 233 + 234 + /* 235 + * Reset the CMN PLL block to ensure the updated configurations 236 + * take effect. 237 + */ 238 + ret = regmap_clear_bits(cmn_pll->regmap, CMN_PLL_POWER_ON_AND_RESET, 239 + CMN_ANA_EN_SW_RSTN); 240 + if (ret) 241 + return ret; 242 + 243 + usleep_range(1000, 1200); 244 + ret = regmap_set_bits(cmn_pll->regmap, CMN_PLL_POWER_ON_AND_RESET, 245 + CMN_ANA_EN_SW_RSTN); 246 + if (ret) 247 + return ret; 248 + 249 + /* Stability check of CMN PLL output clocks. */ 250 + return regmap_read_poll_timeout(cmn_pll->regmap, CMN_PLL_LOCKED, val, 251 + (val & CMN_PLL_CLKS_LOCKED), 252 + 100, 100 * USEC_PER_MSEC); 253 + } 254 + 255 + static const struct clk_ops clk_cmn_pll_ops = { 256 + .recalc_rate = clk_cmn_pll_recalc_rate, 257 + .determine_rate = clk_cmn_pll_determine_rate, 258 + .set_rate = clk_cmn_pll_set_rate, 259 + }; 260 + 261 + static struct clk_hw *ipq_cmn_pll_clk_hw_register(struct platform_device *pdev) 262 + { 263 + struct clk_parent_data pdata = { .index = 0 }; 264 + struct device *dev = &pdev->dev; 265 + struct clk_init_data init = {}; 266 + struct clk_cmn_pll *cmn_pll; 267 + struct regmap *regmap; 268 + void __iomem *base; 269 + int ret; 270 + 271 + base = devm_platform_ioremap_resource(pdev, 0); 272 + if (IS_ERR(base)) 273 + return ERR_CAST(base); 274 + 275 + regmap = devm_regmap_init_mmio(dev, base, &ipq_cmn_pll_regmap_config); 276 + if (IS_ERR(regmap)) 277 + return ERR_CAST(regmap); 278 + 279 + cmn_pll = devm_kzalloc(dev, sizeof(*cmn_pll), GFP_KERNEL); 280 + if (!cmn_pll) 281 + return ERR_PTR(-ENOMEM); 282 + 283 + init.name = "cmn_pll"; 284 + init.parent_data = &pdata; 285 + init.num_parents = 1; 286 + init.ops = &clk_cmn_pll_ops; 287 + 288 + cmn_pll->hw.init = &init; 289 + cmn_pll->regmap = regmap; 290 + 291 + ret = devm_clk_hw_register(dev, &cmn_pll->hw); 292 + if (ret) 293 + return ERR_PTR(ret); 294 + 295 + return &cmn_pll->hw; 296 + } 297 + 298 + static int ipq_cmn_pll_register_clks(struct platform_device *pdev) 299 + { 300 + const struct cmn_pll_fixed_output_clk *fixed_clk; 301 + struct clk_hw_onecell_data *hw_data; 302 + struct device *dev = &pdev->dev; 303 + struct clk_hw *cmn_pll_hw; 304 + unsigned int num_clks; 305 + struct clk_hw *hw; 306 + int ret, i; 307 + 308 + fixed_clk = ipq9574_output_clks; 309 + num_clks = ARRAY_SIZE(ipq9574_output_clks); 310 + 311 + hw_data = devm_kzalloc(dev, struct_size(hw_data, hws, num_clks + 1), 312 + GFP_KERNEL); 313 + if (!hw_data) 314 + return -ENOMEM; 315 + 316 + /* 317 + * Register the CMN PLL clock, which is the parent clock of 318 + * the fixed rate output clocks. 319 + */ 320 + cmn_pll_hw = ipq_cmn_pll_clk_hw_register(pdev); 321 + if (IS_ERR(cmn_pll_hw)) 322 + return PTR_ERR(cmn_pll_hw); 323 + 324 + /* Register the fixed rate output clocks. */ 325 + for (i = 0; i < num_clks; i++) { 326 + hw = clk_hw_register_fixed_rate_parent_hw(dev, fixed_clk[i].name, 327 + cmn_pll_hw, 0, 328 + fixed_clk[i].rate); 329 + if (IS_ERR(hw)) { 330 + ret = PTR_ERR(hw); 331 + goto unregister_fixed_clk; 332 + } 333 + 334 + hw_data->hws[fixed_clk[i].id] = hw; 335 + } 336 + 337 + /* 338 + * Provide the CMN PLL clock. The clock rate of CMN PLL 339 + * is configured to 12 GHZ by DT property assigned-clock-rates-u64. 340 + */ 341 + hw_data->hws[CMN_PLL_CLK] = cmn_pll_hw; 342 + hw_data->num = num_clks + 1; 343 + 344 + ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, hw_data); 345 + if (ret) 346 + goto unregister_fixed_clk; 347 + 348 + platform_set_drvdata(pdev, hw_data); 349 + 350 + return 0; 351 + 352 + unregister_fixed_clk: 353 + while (i > 0) 354 + clk_hw_unregister(hw_data->hws[fixed_clk[--i].id]); 355 + 356 + return ret; 357 + } 358 + 359 + static int ipq_cmn_pll_clk_probe(struct platform_device *pdev) 360 + { 361 + struct device *dev = &pdev->dev; 362 + int ret; 363 + 364 + ret = devm_pm_runtime_enable(dev); 365 + if (ret) 366 + return ret; 367 + 368 + ret = devm_pm_clk_create(dev); 369 + if (ret) 370 + return ret; 371 + 372 + /* 373 + * To access the CMN PLL registers, the GCC AHB & SYS clocks 374 + * of CMN PLL block need to be enabled. 375 + */ 376 + ret = pm_clk_add(dev, "ahb"); 377 + if (ret) 378 + return dev_err_probe(dev, ret, "Fail to add AHB clock\n"); 379 + 380 + ret = pm_clk_add(dev, "sys"); 381 + if (ret) 382 + return dev_err_probe(dev, ret, "Fail to add SYS clock\n"); 383 + 384 + ret = pm_runtime_resume_and_get(dev); 385 + if (ret) 386 + return ret; 387 + 388 + /* Register CMN PLL clock and fixed rate output clocks. */ 389 + ret = ipq_cmn_pll_register_clks(pdev); 390 + pm_runtime_put(dev); 391 + if (ret) 392 + return dev_err_probe(dev, ret, 393 + "Fail to register CMN PLL clocks\n"); 394 + 395 + return 0; 396 + } 397 + 398 + static void ipq_cmn_pll_clk_remove(struct platform_device *pdev) 399 + { 400 + struct clk_hw_onecell_data *hw_data = platform_get_drvdata(pdev); 401 + int i; 402 + 403 + /* 404 + * The clock with index CMN_PLL_CLK is unregistered by 405 + * device management. 406 + */ 407 + for (i = 0; i < hw_data->num; i++) { 408 + if (i != CMN_PLL_CLK) 409 + clk_hw_unregister(hw_data->hws[i]); 410 + } 411 + } 412 + 413 + static const struct dev_pm_ops ipq_cmn_pll_pm_ops = { 414 + SET_RUNTIME_PM_OPS(pm_clk_suspend, pm_clk_resume, NULL) 415 + }; 416 + 417 + static const struct of_device_id ipq_cmn_pll_clk_ids[] = { 418 + { .compatible = "qcom,ipq9574-cmn-pll", }, 419 + { } 420 + }; 421 + MODULE_DEVICE_TABLE(of, ipq_cmn_pll_clk_ids); 422 + 423 + static struct platform_driver ipq_cmn_pll_clk_driver = { 424 + .probe = ipq_cmn_pll_clk_probe, 425 + .remove = ipq_cmn_pll_clk_remove, 426 + .driver = { 427 + .name = "ipq_cmn_pll", 428 + .of_match_table = ipq_cmn_pll_clk_ids, 429 + .pm = &ipq_cmn_pll_pm_ops, 430 + }, 431 + }; 432 + module_platform_driver(ipq_cmn_pll_clk_driver); 433 + 434 + MODULE_DESCRIPTION("Qualcomm Technologies, Inc. IPQ CMN PLL Driver"); 435 + MODULE_LICENSE("GPL");
+85
drivers/clk/qcom/lpasscc-sm6115.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Copyright (c) 2022, 2023 Linaro Limited 4 + */ 5 + 6 + #include <linux/clk-provider.h> 7 + #include <linux/err.h> 8 + #include <linux/kernel.h> 9 + #include <linux/module.h> 10 + #include <linux/mod_devicetable.h> 11 + #include <linux/platform_device.h> 12 + #include <linux/regmap.h> 13 + 14 + #include <dt-bindings/clock/qcom,sm6115-lpasscc.h> 15 + 16 + #include "common.h" 17 + #include "reset.h" 18 + 19 + static const struct qcom_reset_map lpass_audiocc_sm6115_resets[] = { 20 + [LPASS_AUDIO_SWR_RX_CGCR] = { .reg = 0x98, .bit = 1, .udelay = 500 }, 21 + }; 22 + 23 + static struct regmap_config lpass_audiocc_sm6115_regmap_config = { 24 + .reg_bits = 32, 25 + .reg_stride = 4, 26 + .val_bits = 32, 27 + .name = "lpass-audio-csr", 28 + .max_register = 0x1000, 29 + }; 30 + 31 + static const struct qcom_cc_desc lpass_audiocc_sm6115_reset_desc = { 32 + .config = &lpass_audiocc_sm6115_regmap_config, 33 + .resets = lpass_audiocc_sm6115_resets, 34 + .num_resets = ARRAY_SIZE(lpass_audiocc_sm6115_resets), 35 + }; 36 + 37 + static const struct qcom_reset_map lpasscc_sm6115_resets[] = { 38 + [LPASS_SWR_TX_CONFIG_CGCR] = { .reg = 0x100, .bit = 1, .udelay = 500 }, 39 + }; 40 + 41 + static struct regmap_config lpasscc_sm6115_regmap_config = { 42 + .reg_bits = 32, 43 + .reg_stride = 4, 44 + .val_bits = 32, 45 + .name = "lpass-tcsr", 46 + .max_register = 0x1000, 47 + }; 48 + 49 + static const struct qcom_cc_desc lpasscc_sm6115_reset_desc = { 50 + .config = &lpasscc_sm6115_regmap_config, 51 + .resets = lpasscc_sm6115_resets, 52 + .num_resets = ARRAY_SIZE(lpasscc_sm6115_resets), 53 + }; 54 + 55 + static const struct of_device_id lpasscc_sm6115_match_table[] = { 56 + { 57 + .compatible = "qcom,sm6115-lpassaudiocc", 58 + .data = &lpass_audiocc_sm6115_reset_desc, 59 + }, { 60 + .compatible = "qcom,sm6115-lpasscc", 61 + .data = &lpasscc_sm6115_reset_desc, 62 + }, 63 + { }, 64 + }; 65 + MODULE_DEVICE_TABLE(of, lpasscc_sm6115_match_table); 66 + 67 + static int lpasscc_sm6115_probe(struct platform_device *pdev) 68 + { 69 + const struct qcom_cc_desc *desc = of_device_get_match_data(&pdev->dev); 70 + 71 + return qcom_cc_probe_by_index(pdev, 0, desc); 72 + } 73 + 74 + static struct platform_driver lpasscc_sm6115_driver = { 75 + .probe = lpasscc_sm6115_probe, 76 + .driver = { 77 + .name = "lpasscc-sm6115", 78 + .of_match_table = lpasscc_sm6115_match_table, 79 + }, 80 + }; 81 + 82 + module_platform_driver(lpasscc_sm6115_driver); 83 + 84 + MODULE_DESCRIPTION("QTI LPASSCC SM6115 Driver"); 85 + MODULE_LICENSE("GPL");
+57 -4
drivers/clk/qcom/mmcc-msm8960.c
··· 37 37 P_DSI2_PLL_DSICLK, 38 38 P_DSI1_PLL_BYTECLK, 39 39 P_DSI2_PLL_BYTECLK, 40 + P_LVDS_PLL, 40 41 }; 41 42 42 43 #define F_MN(f, s, _m, _n) { .freq = f, .src = s, .m = _m, .n = _n } ··· 141 140 static const struct clk_parent_data mmcc_pxo_dsi2_dsi1[] = { 142 141 { .fw_name = "pxo", .name = "pxo_board" }, 143 142 { .fw_name = "dsi2pll", .name = "dsi2pll" }, 143 + { .fw_name = "dsi1pll", .name = "dsi1pll" }, 144 + }; 145 + 146 + static const struct parent_map mmcc_pxo_dsi2_dsi1_lvds_map[] = { 147 + { P_PXO, 0 }, 148 + { P_DSI2_PLL_DSICLK, 1 }, 149 + { P_LVDS_PLL, 2 }, 150 + { P_DSI1_PLL_DSICLK, 3 }, 151 + }; 152 + 153 + static const struct clk_parent_data mmcc_pxo_dsi2_dsi1_lvds[] = { 154 + { .fw_name = "pxo", .name = "pxo_board" }, 155 + { .fw_name = "dsi2pll", .name = "dsi2pll" }, 156 + { .fw_name = "lvdspll", .name = "mpd4_lvds_pll" }, 144 157 { .fw_name = "dsi1pll", .name = "dsi1pll" }, 145 158 }; 146 159 ··· 2454 2439 }, 2455 2440 .s = { 2456 2441 .src_sel_shift = 0, 2457 - .parent_map = mmcc_pxo_dsi2_dsi1_map, 2442 + .parent_map = mmcc_pxo_dsi2_dsi1_lvds_map, 2458 2443 }, 2459 2444 .clkr = { 2460 2445 .enable_reg = 0x0094, 2461 2446 .enable_mask = BIT(2), 2462 2447 .hw.init = &(struct clk_init_data){ 2463 2448 .name = "dsi2_pixel_src", 2464 - .parent_data = mmcc_pxo_dsi2_dsi1, 2465 - .num_parents = ARRAY_SIZE(mmcc_pxo_dsi2_dsi1), 2449 + .parent_data = mmcc_pxo_dsi2_dsi1_lvds, 2450 + .num_parents = ARRAY_SIZE(mmcc_pxo_dsi2_dsi1_lvds), 2466 2451 .ops = &clk_rcg_pixel_ops, 2452 + }, 2453 + }, 2454 + }; 2455 + 2456 + static struct clk_branch dsi2_pixel_lvds_src = { 2457 + .clkr = { 2458 + .enable_reg = 0x0094, 2459 + .enable_mask = BIT(0), 2460 + .hw.init = &(struct clk_init_data){ 2461 + .name = "dsi2_pixel_lvds_src", 2462 + .parent_hws = (const struct clk_hw*[]){ 2463 + &dsi2_pixel_src.clkr.hw 2464 + }, 2465 + .num_parents = 1, 2466 + .ops = &clk_branch_simple_ops, 2467 + .flags = CLK_SET_RATE_PARENT, 2467 2468 }, 2468 2469 }, 2469 2470 }; ··· 2489 2458 .halt_bit = 19, 2490 2459 .clkr = { 2491 2460 .enable_reg = 0x0094, 2492 - .enable_mask = BIT(0), 2461 + .enable_mask = 0, 2493 2462 .hw.init = &(struct clk_init_data){ 2494 2463 .name = "mdp_pclk2_clk", 2495 2464 .parent_hws = (const struct clk_hw*[]){ 2496 2465 &dsi2_pixel_src.clkr.hw 2466 + }, 2467 + .num_parents = 1, 2468 + .ops = &clk_branch_ops, 2469 + .flags = CLK_SET_RATE_PARENT, 2470 + }, 2471 + }, 2472 + }; 2473 + 2474 + static struct clk_branch lvds_clk = { 2475 + .halt_reg = 0x024c, 2476 + .halt_bit = 6, 2477 + .clkr = { 2478 + .enable_reg = 0x0264, 2479 + .enable_mask = BIT(1), 2480 + .hw.init = &(struct clk_init_data){ 2481 + .name = "mdp_lvds_clk", 2482 + .parent_hws = (const struct clk_hw*[]){ 2483 + &dsi2_pixel_lvds_src.clkr.hw 2497 2484 }, 2498 2485 .num_parents = 1, 2499 2486 .ops = &clk_branch_ops, ··· 2848 2799 [CSIPHY1_TIMER_CLK] = &csiphy1_timer_clk.clkr, 2849 2800 [CSIPHY0_TIMER_CLK] = &csiphy0_timer_clk.clkr, 2850 2801 [PLL2] = &pll2.clkr, 2802 + [DSI2_PIXEL_LVDS_SRC] = &dsi2_pixel_lvds_src.clkr, 2803 + [LVDS_CLK] = &lvds_clk.clkr, 2851 2804 }; 2852 2805 2853 2806 static const struct qcom_reset_map mmcc_msm8960_resets[] = { ··· 3034 2983 [VCAP_CLK] = &vcap_clk.clkr, 3035 2984 [VCAP_NPL_CLK] = &vcap_npl_clk.clkr, 3036 2985 [PLL15] = &pll15.clkr, 2986 + [DSI2_PIXEL_LVDS_SRC] = &dsi2_pixel_lvds_src.clkr, 2987 + [LVDS_CLK] = &lvds_clk.clkr, 3037 2988 }; 3038 2989 3039 2990 static const struct qcom_reset_map mmcc_apq8064_resets[] = {
+141
drivers/clk/qcom/tcsrcc-sm8750.c
··· 1 + // SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + /* 3 + * Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved. 4 + */ 5 + 6 + #include <linux/clk-provider.h> 7 + #include <linux/module.h> 8 + #include <linux/of.h> 9 + #include <linux/platform_device.h> 10 + #include <linux/regmap.h> 11 + 12 + #include <dt-bindings/clock/qcom,sm8750-tcsr.h> 13 + 14 + #include "clk-branch.h" 15 + #include "clk-regmap.h" 16 + #include "clk-regmap-divider.h" 17 + #include "clk-regmap-mux.h" 18 + #include "common.h" 19 + 20 + enum { 21 + DT_BI_TCXO_PAD, 22 + }; 23 + 24 + static struct clk_branch tcsr_pcie_0_clkref_en = { 25 + .halt_reg = 0x0, 26 + .halt_check = BRANCH_HALT_DELAY, 27 + .clkr = { 28 + .enable_reg = 0x0, 29 + .enable_mask = BIT(0), 30 + .hw.init = &(const struct clk_init_data) { 31 + .name = "tcsr_pcie_0_clkref_en", 32 + .ops = &clk_branch2_ops, 33 + }, 34 + }, 35 + }; 36 + 37 + static struct clk_branch tcsr_ufs_clkref_en = { 38 + .halt_reg = 0x1000, 39 + .halt_check = BRANCH_HALT_DELAY, 40 + .clkr = { 41 + .enable_reg = 0x1000, 42 + .enable_mask = BIT(0), 43 + .hw.init = &(const struct clk_init_data) { 44 + .name = "tcsr_ufs_clkref_en", 45 + .parent_data = &(const struct clk_parent_data){ 46 + .index = DT_BI_TCXO_PAD, 47 + }, 48 + .num_parents = 1, 49 + .ops = &clk_branch2_ops, 50 + }, 51 + }, 52 + }; 53 + 54 + static struct clk_branch tcsr_usb2_clkref_en = { 55 + .halt_reg = 0x2000, 56 + .halt_check = BRANCH_HALT_DELAY, 57 + .clkr = { 58 + .enable_reg = 0x2000, 59 + .enable_mask = BIT(0), 60 + .hw.init = &(const struct clk_init_data) { 61 + .name = "tcsr_usb2_clkref_en", 62 + .parent_data = &(const struct clk_parent_data){ 63 + .index = DT_BI_TCXO_PAD, 64 + }, 65 + .num_parents = 1, 66 + .ops = &clk_branch2_ops, 67 + }, 68 + }, 69 + }; 70 + 71 + static struct clk_branch tcsr_usb3_clkref_en = { 72 + .halt_reg = 0x3000, 73 + .halt_check = BRANCH_HALT_DELAY, 74 + .clkr = { 75 + .enable_reg = 0x3000, 76 + .enable_mask = BIT(0), 77 + .hw.init = &(const struct clk_init_data) { 78 + .name = "tcsr_usb3_clkref_en", 79 + .parent_data = &(const struct clk_parent_data){ 80 + .index = DT_BI_TCXO_PAD, 81 + }, 82 + .num_parents = 1, 83 + .ops = &clk_branch2_ops, 84 + }, 85 + }, 86 + }; 87 + 88 + static struct clk_regmap *tcsr_cc_sm8750_clocks[] = { 89 + [TCSR_PCIE_0_CLKREF_EN] = &tcsr_pcie_0_clkref_en.clkr, 90 + [TCSR_UFS_CLKREF_EN] = &tcsr_ufs_clkref_en.clkr, 91 + [TCSR_USB2_CLKREF_EN] = &tcsr_usb2_clkref_en.clkr, 92 + [TCSR_USB3_CLKREF_EN] = &tcsr_usb3_clkref_en.clkr, 93 + }; 94 + 95 + static const struct regmap_config tcsr_cc_sm8750_regmap_config = { 96 + .reg_bits = 32, 97 + .reg_stride = 4, 98 + .val_bits = 32, 99 + .max_register = 0x3000, 100 + .fast_io = true, 101 + }; 102 + 103 + static const struct qcom_cc_desc tcsr_cc_sm8750_desc = { 104 + .config = &tcsr_cc_sm8750_regmap_config, 105 + .clks = tcsr_cc_sm8750_clocks, 106 + .num_clks = ARRAY_SIZE(tcsr_cc_sm8750_clocks), 107 + }; 108 + 109 + static const struct of_device_id tcsr_cc_sm8750_match_table[] = { 110 + { .compatible = "qcom,sm8750-tcsr" }, 111 + { } 112 + }; 113 + MODULE_DEVICE_TABLE(of, tcsr_cc_sm8750_match_table); 114 + 115 + static int tcsr_cc_sm8750_probe(struct platform_device *pdev) 116 + { 117 + return qcom_cc_probe(pdev, &tcsr_cc_sm8750_desc); 118 + } 119 + 120 + static struct platform_driver tcsr_cc_sm8750_driver = { 121 + .probe = tcsr_cc_sm8750_probe, 122 + .driver = { 123 + .name = "tcsr_cc-sm8750", 124 + .of_match_table = tcsr_cc_sm8750_match_table, 125 + }, 126 + }; 127 + 128 + static int __init tcsr_cc_sm8750_init(void) 129 + { 130 + return platform_driver_register(&tcsr_cc_sm8750_driver); 131 + } 132 + subsys_initcall(tcsr_cc_sm8750_init); 133 + 134 + static void __exit tcsr_cc_sm8750_exit(void) 135 + { 136 + platform_driver_unregister(&tcsr_cc_sm8750_driver); 137 + } 138 + module_exit(tcsr_cc_sm8750_exit); 139 + 140 + MODULE_DESCRIPTION("QTI TCSR_CC SM8750 Driver"); 141 + MODULE_LICENSE("GPL");
+4 -9
drivers/clk/sunxi-ng/ccu-sun50i-a64.c
··· 535 535 CLK_SET_RATE_PARENT); 536 536 537 537 /* 538 - * DSI output seems to work only when PLL_MIPI selected. Set it and prevent 539 - * the mux from reparenting. 538 + * Experiments showed that RGB output requires pll-video0-2x, while DSI 539 + * requires pll-mipi. It will not work with incorrect clock, the screen will 540 + * be blank. 541 + * sun50i-a64.dtsi assigns pll-mipi as TCON0 parent by default 540 542 */ 541 - #define SUN50I_A64_TCON0_CLK_REG 0x118 542 - 543 543 static const char * const tcon0_parents[] = { "pll-mipi", "pll-video0-2x" }; 544 544 static const u8 tcon0_table[] = { 0, 2, }; 545 545 static SUNXI_CCU_MUX_TABLE_WITH_GATE_CLOSEST(tcon0_clk, "tcon0", tcon0_parents, ··· 958 958 writel(val | (0 << 16), reg + SUN50I_A64_PLL_AUDIO_REG); 959 959 960 960 writel(0x515, reg + SUN50I_A64_PLL_MIPI_REG); 961 - 962 - /* Set PLL MIPI as parent for TCON0 */ 963 - val = readl(reg + SUN50I_A64_TCON0_CLK_REG); 964 - val &= ~GENMASK(26, 24); 965 - writel(val | (0 << 24), reg + SUN50I_A64_TCON0_CLK_REG); 966 961 967 962 ret = devm_sunxi_ccu_probe(&pdev->dev, reg, &sun50i_a64_ccu_desc); 968 963 if (ret)
-2
drivers/clk/sunxi-ng/ccu-sun50i-a64.h
··· 21 21 22 22 /* PLL_VIDEO0 exported for HDMI PHY */ 23 23 24 - #define CLK_PLL_VIDEO0_2X 8 25 24 #define CLK_PLL_VE 9 26 25 #define CLK_PLL_DDR0 10 27 26 ··· 31 32 #define CLK_PLL_PERIPH1_2X 14 32 33 #define CLK_PLL_VIDEO1 15 33 34 #define CLK_PLL_GPU 16 34 - #define CLK_PLL_MIPI 17 35 35 #define CLK_PLL_HSIC 18 36 36 #define CLK_PLL_DE 19 37 37 #define CLK_PLL_DDR1 20
+26 -2
drivers/clk/sunxi-ng/ccu-sun50i-h616.c
··· 1107 1107 SUN50I_H616_USB3_CLK_REG, 1108 1108 }; 1109 1109 1110 + static struct ccu_mux_nb sun50i_h616_cpu_nb = { 1111 + .common = &cpux_clk.common, 1112 + .cm = &cpux_clk.mux, 1113 + .delay_us = 1, /* manual doesn't really say */ 1114 + .bypass_index = 4, /* PLL_PERI0@600MHz, as recommended by manual */ 1115 + }; 1116 + 1117 + static struct ccu_pll_nb sun50i_h616_pll_cpu_nb = { 1118 + .common = &pll_cpux_clk.common, 1119 + .enable = BIT(29), /* LOCK_ENABLE */ 1120 + .lock = BIT(28), 1121 + }; 1122 + 1110 1123 static int sun50i_h616_ccu_probe(struct platform_device *pdev) 1111 1124 { 1112 1125 void __iomem *reg; 1113 1126 u32 val; 1114 - int i; 1127 + int ret, i; 1115 1128 1116 1129 reg = devm_platform_ioremap_resource(pdev, 0); 1117 1130 if (IS_ERR(reg)) ··· 1179 1166 val |= BIT(24); 1180 1167 writel(val, reg + SUN50I_H616_HDMI_CEC_CLK_REG); 1181 1168 1182 - return devm_sunxi_ccu_probe(&pdev->dev, reg, &sun50i_h616_ccu_desc); 1169 + ret = devm_sunxi_ccu_probe(&pdev->dev, reg, &sun50i_h616_ccu_desc); 1170 + if (ret) 1171 + return ret; 1172 + 1173 + /* Reparent CPU during CPU PLL rate changes */ 1174 + ccu_mux_notifier_register(pll_cpux_clk.common.hw.clk, 1175 + &sun50i_h616_cpu_nb); 1176 + 1177 + /* Re-lock the CPU PLL after any rate changes */ 1178 + ccu_pll_notifier_register(&sun50i_h616_pll_cpu_nb); 1179 + 1180 + return 0; 1183 1181 } 1184 1182 1185 1183 static const struct of_device_id sun50i_h616_ccu_ids[] = {
+69 -52
drivers/clk/xilinx/clk-xlnx-clock-wizard.c
··· 52 52 53 53 #define WZRD_CLKFBOUT_MULT_SHIFT 8 54 54 #define WZRD_CLKFBOUT_MULT_MASK (0xff << WZRD_CLKFBOUT_MULT_SHIFT) 55 + #define WZRD_CLKFBOUT_MULT_FRAC_MASK GENMASK(25, 16) 56 + #define WZRD_CLKFBOUT_O_MASK GENMASK(7, 0) 55 57 #define WZRD_CLKFBOUT_L_SHIFT 0 56 58 #define WZRD_CLKFBOUT_H_SHIFT 8 57 59 #define WZRD_CLKFBOUT_L_MASK GENMASK(7, 0) ··· 89 87 #define DIV_O 0x01 90 88 #define DIV_ALL 0x03 91 89 92 - #define WZRD_M_MIN 2 93 - #define WZRD_M_MAX 128 94 - #define WZRD_D_MIN 1 95 - #define WZRD_D_MAX 106 96 - #define WZRD_VCO_MIN 800000000 97 - #define WZRD_VCO_MAX 1600000000 98 - #define WZRD_O_MIN 1 99 - #define WZRD_O_MAX 128 90 + #define WZRD_M_MIN 2ULL 91 + #define WZRD_M_MAX 128ULL 92 + #define WZRD_D_MIN 1ULL 93 + #define WZRD_D_MAX 106ULL 94 + #define WZRD_VCO_MIN 800000000ULL 95 + #define WZRD_VCO_MAX 1600000000ULL 96 + #define WZRD_O_MIN 2ULL 97 + #define WZRD_O_MAX 128ULL 100 98 #define VER_WZRD_M_MIN 4 101 99 #define VER_WZRD_M_MAX 432 102 100 #define VER_WZRD_D_MIN 1 ··· 155 153 * @flags: clk_wzrd divider flags 156 154 * @table: array of value/divider pairs, last entry should have div = 0 157 155 * @m: value of the multiplier 156 + * @m_frac: fractional value of the multiplier 158 157 * @d: value of the common divider 159 158 * @o: value of the leaf divider 159 + * @o_frac: value of the fractional leaf divider 160 160 * @lock: register lock 161 161 */ 162 162 struct clk_wzrd_divider { ··· 170 166 u8 flags; 171 167 const struct clk_div_table *table; 172 168 u32 m; 169 + u32 m_frac; 173 170 u32 d; 174 171 u32 o; 172 + u32 o_frac; 175 173 spinlock_t *lock; /* divider lock */ 176 174 }; 177 175 ··· 378 372 unsigned long parent_rate) 379 373 { 380 374 struct clk_wzrd_divider *divider = to_clk_wzrd_divider(hw); 381 - u64 vco_freq, freq, diff, vcomin, vcomax; 382 - u32 m, d, o; 383 - u32 mmin, mmax, dmin, dmax, omin, omax; 375 + u64 vco_freq, freq, diff, vcomin, vcomax, best_diff = -1ULL; 376 + u64 m, d, o; 377 + u64 mmin, mmax, dmin, dmax, omin, omax, mdmin, mdmax; 384 378 385 - mmin = WZRD_M_MIN; 386 - mmax = WZRD_M_MAX; 379 + mmin = WZRD_M_MIN << 3; 380 + mmax = WZRD_M_MAX << 3; 387 381 dmin = WZRD_D_MIN; 388 382 dmax = WZRD_D_MAX; 389 - omin = WZRD_O_MIN; 390 - omax = WZRD_O_MAX; 391 - vcomin = WZRD_VCO_MIN; 392 - vcomax = WZRD_VCO_MAX; 383 + omin = WZRD_O_MIN << 3; 384 + omax = WZRD_O_MAX << 3; 385 + vcomin = WZRD_VCO_MIN << 3; 386 + vcomax = WZRD_VCO_MAX << 3; 393 387 394 388 for (m = mmin; m <= mmax; m++) { 395 - for (d = dmin; d <= dmax; d++) { 396 - vco_freq = DIV_ROUND_CLOSEST((parent_rate * m), d); 397 - if (vco_freq >= vcomin && vco_freq <= vcomax) { 398 - for (o = omin; o <= omax; o++) { 399 - freq = DIV_ROUND_CLOSEST_ULL(vco_freq, o); 400 - diff = abs(freq - rate); 401 - 402 - if (diff < WZRD_MIN_ERR) { 403 - divider->m = m; 404 - divider->d = d; 405 - divider->o = o; 406 - return 0; 407 - } 408 - } 389 + mdmin = max(dmin, div64_u64(parent_rate * m + vcomax / 2, vcomax)); 390 + mdmax = min(dmax, div64_u64(parent_rate * m + vcomin / 2, vcomin)); 391 + for (d = mdmin; d <= mdmax; d++) { 392 + vco_freq = DIV_ROUND_CLOSEST_ULL((parent_rate * m), d); 393 + o = DIV_ROUND_CLOSEST_ULL(vco_freq, rate); 394 + if (o < omin || o > omax) 395 + continue; 396 + freq = DIV_ROUND_CLOSEST_ULL(vco_freq, o); 397 + diff = freq - rate; 398 + if (diff < best_diff) { 399 + best_diff = diff; 400 + divider->m = m >> 3; 401 + divider->m_frac = (m - (divider->m << 3)) * 125; 402 + divider->d = d; 403 + divider->o = o >> 3; 404 + divider->o_frac = (o - (divider->o << 3)) * 125; 409 405 } 410 406 } 411 407 } 412 - return -EBUSY; 408 + return best_diff < WZRD_MIN_ERR ? 0 : -EBUSY; 413 409 } 414 410 415 411 static int clk_wzrd_reconfig(struct clk_wzrd_divider *divider, void __iomem *div_addr) ··· 504 496 unsigned long parent_rate) 505 497 { 506 498 struct clk_wzrd_divider *divider = to_clk_wzrd_divider(hw); 507 - unsigned long vco_freq, rate_div, clockout0_div; 508 499 void __iomem *div_addr; 509 - u32 reg, pre, f; 500 + u32 reg; 510 501 int err; 511 502 512 503 err = clk_wzrd_get_divisors(hw, rate, parent_rate); 513 504 if (err) 514 505 return err; 515 506 516 - vco_freq = DIV_ROUND_CLOSEST(parent_rate * divider->m, divider->d); 517 - rate_div = DIV_ROUND_CLOSEST_ULL((vco_freq * WZRD_FRAC_POINTS), rate); 518 - 519 - clockout0_div = div_u64(rate_div, WZRD_FRAC_POINTS); 520 - 521 - pre = DIV_ROUND_CLOSEST_ULL(vco_freq * WZRD_FRAC_POINTS, rate); 522 - f = (pre - (clockout0_div * WZRD_FRAC_POINTS)); 523 - f &= WZRD_CLKOUT_FRAC_MASK; 524 - 525 - reg = FIELD_PREP(WZRD_CLKOUT_DIVIDE_MASK, clockout0_div) | 526 - FIELD_PREP(WZRD_CLKOUT0_FRAC_MASK, f); 507 + reg = FIELD_PREP(WZRD_CLKOUT_DIVIDE_MASK, divider->o) | 508 + FIELD_PREP(WZRD_CLKOUT0_FRAC_MASK, divider->o_frac); 527 509 528 510 writel(reg, divider->base + WZRD_CLK_CFG_REG(0, 2)); 529 - /* Set divisor and clear phase offset */ 530 511 reg = FIELD_PREP(WZRD_CLKFBOUT_MULT_MASK, divider->m) | 512 + FIELD_PREP(WZRD_CLKFBOUT_MULT_FRAC_MASK, divider->m_frac) | 531 513 FIELD_PREP(WZRD_DIVCLK_DIVIDE_MASK, divider->d); 532 514 writel(reg, divider->base + WZRD_CLK_CFG_REG(0, 0)); 533 - writel(divider->o, divider->base + WZRD_CLK_CFG_REG(0, 2)); 534 515 writel(0, divider->base + WZRD_CLK_CFG_REG(0, 3)); 535 516 div_addr = divider->base + WZRD_DR_INIT_REG_OFFSET; 536 517 return clk_wzrd_reconfig(divider, div_addr); ··· 561 564 unsigned long parent_rate) 562 565 { 563 566 struct clk_wzrd_divider *divider = to_clk_wzrd_divider(hw); 564 - u32 m, d, o, div, reg, f; 567 + u32 m, d, o, reg, f, mf; 568 + u64 mul; 565 569 566 570 reg = readl(divider->base + WZRD_CLK_CFG_REG(0, 0)); 567 571 d = FIELD_GET(WZRD_DIVCLK_DIVIDE_MASK, reg); 568 572 m = FIELD_GET(WZRD_CLKFBOUT_MULT_MASK, reg); 573 + mf = FIELD_GET(WZRD_CLKFBOUT_MULT_FRAC_MASK, reg); 569 574 reg = readl(divider->base + WZRD_CLK_CFG_REG(0, 2)); 570 575 o = FIELD_GET(WZRD_DIVCLK_DIVIDE_MASK, reg); 571 576 f = FIELD_GET(WZRD_CLKOUT0_FRAC_MASK, reg); 572 577 573 - div = DIV_ROUND_CLOSEST(d * (WZRD_FRAC_POINTS * o + f), WZRD_FRAC_POINTS); 574 - return divider_recalc_rate(hw, parent_rate * m, div, divider->table, 575 - divider->flags, divider->width); 578 + mul = m * 1000 + mf; 579 + return DIV_ROUND_CLOSEST_ULL(parent_rate * mul, d * (o * 1000 + f)); 576 580 } 577 581 578 582 static unsigned long clk_wzrd_recalc_rate_all_ver(struct clk_hw *hw, ··· 646 648 unsigned long *prate) 647 649 { 648 650 struct clk_wzrd_divider *divider = to_clk_wzrd_divider(hw); 651 + u32 m, d, o; 652 + int err; 653 + 654 + err = clk_wzrd_get_divisors(hw, rate, *prate); 655 + if (err) 656 + return err; 657 + 658 + m = divider->m; 659 + d = divider->d; 660 + o = divider->o; 661 + 662 + rate = div_u64(*prate * (m * 1000 + divider->m_frac), d * (o * 1000 + divider->o_frac)); 663 + return rate; 664 + } 665 + 666 + static long clk_wzrd_ver_round_rate_all(struct clk_hw *hw, unsigned long rate, 667 + unsigned long *prate) 668 + { 669 + struct clk_wzrd_divider *divider = to_clk_wzrd_divider(hw); 649 670 unsigned long int_freq; 650 671 u32 m, d, o, div, f; 651 672 int err; ··· 695 678 }; 696 679 697 680 static const struct clk_ops clk_wzrd_ver_div_all_ops = { 698 - .round_rate = clk_wzrd_round_rate_all, 681 + .round_rate = clk_wzrd_ver_round_rate_all, 699 682 .set_rate = clk_wzrd_dynamic_all_ver, 700 683 .recalc_rate = clk_wzrd_recalc_rate_all_ver, 701 684 };
+8
include/dt-bindings/clock/at91.h
··· 42 42 #define PMC_PLLADIV2 (PMC_MAIN + 11) 43 43 #define PMC_LVDSPLL (PMC_MAIN + 12) 44 44 45 + /* SAMA7D65 */ 46 + #define PMC_MCK3 (PMC_MAIN + 13) 47 + #define PMC_MCK5 (PMC_MAIN + 14) 48 + 45 49 #ifndef AT91_PMC_MOSCS 46 50 #define AT91_PMC_MOSCS 0 /* MOSCS Flag */ 47 51 #define AT91_PMC_LOCKA 1 /* PLLA Lock */ ··· 58 54 #define AT91_PMC_CFDEV 18 /* Clock Failure Detector Event */ 59 55 #define AT91_PMC_GCKRDY 24 /* Generated Clocks */ 60 56 #endif 57 + 58 + /* Slow clock. */ 59 + #define SCKC_MD_SLCK 0 60 + #define SCKC_TD_SLCK 1 61 61 62 62 #endif
+1
include/dt-bindings/clock/imx93-clock.h
··· 209 209 #define IMX91_CLK_ENET2_REGULAR 204 210 210 #define IMX91_CLK_ENET2_REGULAR_GATE 205 211 211 #define IMX91_CLK_ENET1_QOS_TSN_GATE 206 212 + #define IMX93_CLK_SPDIF_IPG 207 212 213 213 214 #endif
+22
include/dt-bindings/clock/qcom,ipq-cmn-pll.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ 2 + /* 3 + * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved. 4 + */ 5 + 6 + #ifndef _DT_BINDINGS_CLK_QCOM_IPQ_CMN_PLL_H 7 + #define _DT_BINDINGS_CLK_QCOM_IPQ_CMN_PLL_H 8 + 9 + /* CMN PLL core clock. */ 10 + #define CMN_PLL_CLK 0 11 + 12 + /* The output clocks from CMN PLL of IPQ9574. */ 13 + #define XO_24MHZ_CLK 1 14 + #define SLEEP_32KHZ_CLK 2 15 + #define PCS_31P25MHZ_CLK 3 16 + #define NSS_1200MHZ_CLK 4 17 + #define PPE_353MHZ_CLK 5 18 + #define ETH0_50MHZ_CLK 6 19 + #define ETH1_50MHZ_CLK 7 20 + #define ETH2_50MHZ_CLK 8 21 + #define ETH_25MHZ_CLK 9 22 + #endif
+1 -1
include/dt-bindings/clock/qcom,ipq5424-gcc.h
··· 12 12 #define GPLL2 2 13 13 #define GPLL2_OUT_MAIN 3 14 14 #define GCC_SLEEP_CLK_SRC 4 15 - #define GCC_APSS_DBG_CLK 5 16 15 #define GCC_USB0_EUD_AT_CLK 6 17 16 #define GCC_PCIE0_AXI_M_CLK_SRC 7 18 17 #define GCC_PCIE0_AXI_M_CLK 8 ··· 151 152 #define GCC_PCIE3_RCHNG_CLK_SRC 142 152 153 #define GCC_PCIE3_RCHNG_CLK 143 153 154 #define GCC_IM_SLEEP_CLK 144 155 + #define GCC_XO_CLK 145 154 156 155 157 #endif
+2
include/dt-bindings/clock/qcom,mmcc-msm8960.h
··· 133 133 #define VCAP_CLK 124 134 134 #define VCAP_NPL_CLK 125 135 135 #define PLL15 126 136 + #define DSI2_PIXEL_LVDS_SRC 127 137 + #define LVDS_CLK 128 136 138 137 139 #endif
+211
include/dt-bindings/clock/qcom,qcs615-gcc.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ 2 + /* 3 + * Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved. 4 + */ 5 + 6 + #ifndef _DT_BINDINGS_CLK_QCOM_GCC_QCS615_H 7 + #define _DT_BINDINGS_CLK_QCOM_GCC_QCS615_H 8 + 9 + /* GCC clocks */ 10 + #define GPLL0_OUT_AUX2_DIV 0 11 + #define GPLL3_OUT_AUX2_DIV 1 12 + #define GPLL0 2 13 + #define GPLL3 3 14 + #define GPLL4 4 15 + #define GPLL6 5 16 + #define GPLL6_OUT_MAIN 6 17 + #define GPLL7 7 18 + #define GPLL8 8 19 + #define GPLL8_OUT_MAIN 9 20 + #define GCC_AGGRE_UFS_PHY_AXI_CLK 10 21 + #define GCC_AGGRE_USB2_SEC_AXI_CLK 11 22 + #define GCC_AGGRE_USB3_PRIM_AXI_CLK 12 23 + #define GCC_AHB2PHY_EAST_CLK 13 24 + #define GCC_AHB2PHY_WEST_CLK 14 25 + #define GCC_BOOT_ROM_AHB_CLK 15 26 + #define GCC_CAMERA_AHB_CLK 16 27 + #define GCC_CAMERA_HF_AXI_CLK 17 28 + #define GCC_CAMERA_XO_CLK 18 29 + #define GCC_CE1_AHB_CLK 19 30 + #define GCC_CE1_AXI_CLK 20 31 + #define GCC_CE1_CLK 21 32 + #define GCC_CFG_NOC_USB2_SEC_AXI_CLK 22 33 + #define GCC_CFG_NOC_USB3_PRIM_AXI_CLK 23 34 + #define GCC_CPUSS_AHB_CLK 24 35 + #define GCC_CPUSS_AHB_CLK_SRC 25 36 + #define GCC_CPUSS_GNOC_CLK 26 37 + #define GCC_DDRSS_GPU_AXI_CLK 27 38 + #define GCC_DISP_AHB_CLK 28 39 + #define GCC_DISP_GPLL0_DIV_CLK_SRC 29 40 + #define GCC_DISP_HF_AXI_CLK 30 41 + #define GCC_DISP_XO_CLK 31 42 + #define GCC_EMAC_AXI_CLK 32 43 + #define GCC_EMAC_PTP_CLK 33 44 + #define GCC_EMAC_PTP_CLK_SRC 34 45 + #define GCC_EMAC_RGMII_CLK 35 46 + #define GCC_EMAC_RGMII_CLK_SRC 36 47 + #define GCC_EMAC_SLV_AHB_CLK 37 48 + #define GCC_GP1_CLK 38 49 + #define GCC_GP1_CLK_SRC 39 50 + #define GCC_GP2_CLK 40 51 + #define GCC_GP2_CLK_SRC 41 52 + #define GCC_GP3_CLK 42 53 + #define GCC_GP3_CLK_SRC 43 54 + #define GCC_GPU_CFG_AHB_CLK 44 55 + #define GCC_GPU_GPLL0_CLK_SRC 45 56 + #define GCC_GPU_GPLL0_DIV_CLK_SRC 46 57 + #define GCC_GPU_IREF_CLK 47 58 + #define GCC_GPU_MEMNOC_GFX_CLK 48 59 + #define GCC_GPU_SNOC_DVM_GFX_CLK 49 60 + #define GCC_PCIE0_PHY_REFGEN_CLK 50 61 + #define GCC_PCIE_0_AUX_CLK 51 62 + #define GCC_PCIE_0_AUX_CLK_SRC 52 63 + #define GCC_PCIE_0_CFG_AHB_CLK 53 64 + #define GCC_PCIE_0_CLKREF_CLK 54 65 + #define GCC_PCIE_0_MSTR_AXI_CLK 55 66 + #define GCC_PCIE_0_PIPE_CLK 56 67 + #define GCC_PCIE_0_SLV_AXI_CLK 57 68 + #define GCC_PCIE_0_SLV_Q2A_AXI_CLK 58 69 + #define GCC_PCIE_PHY_AUX_CLK 59 70 + #define GCC_PCIE_PHY_REFGEN_CLK_SRC 60 71 + #define GCC_PDM2_CLK 61 72 + #define GCC_PDM2_CLK_SRC 62 73 + #define GCC_PDM_AHB_CLK 63 74 + #define GCC_PDM_XO4_CLK 64 75 + #define GCC_PRNG_AHB_CLK 65 76 + #define GCC_QMIP_CAMERA_NRT_AHB_CLK 66 77 + #define GCC_QMIP_DISP_AHB_CLK 67 78 + #define GCC_QMIP_PCIE_AHB_CLK 68 79 + #define GCC_QMIP_VIDEO_VCODEC_AHB_CLK 69 80 + #define GCC_QSPI_CNOC_PERIPH_AHB_CLK 70 81 + #define GCC_QSPI_CORE_CLK 71 82 + #define GCC_QSPI_CORE_CLK_SRC 72 83 + #define GCC_QUPV3_WRAP0_CORE_2X_CLK 73 84 + #define GCC_QUPV3_WRAP0_CORE_CLK 74 85 + #define GCC_QUPV3_WRAP0_S0_CLK 75 86 + #define GCC_QUPV3_WRAP0_S0_CLK_SRC 76 87 + #define GCC_QUPV3_WRAP0_S1_CLK 77 88 + #define GCC_QUPV3_WRAP0_S1_CLK_SRC 78 89 + #define GCC_QUPV3_WRAP0_S2_CLK 79 90 + #define GCC_QUPV3_WRAP0_S2_CLK_SRC 80 91 + #define GCC_QUPV3_WRAP0_S3_CLK 81 92 + #define GCC_QUPV3_WRAP0_S3_CLK_SRC 82 93 + #define GCC_QUPV3_WRAP0_S4_CLK 83 94 + #define GCC_QUPV3_WRAP0_S4_CLK_SRC 84 95 + #define GCC_QUPV3_WRAP0_S5_CLK 85 96 + #define GCC_QUPV3_WRAP0_S5_CLK_SRC 86 97 + #define GCC_QUPV3_WRAP1_CORE_2X_CLK 87 98 + #define GCC_QUPV3_WRAP1_CORE_CLK 88 99 + #define GCC_QUPV3_WRAP1_S0_CLK 89 100 + #define GCC_QUPV3_WRAP1_S0_CLK_SRC 90 101 + #define GCC_QUPV3_WRAP1_S1_CLK 91 102 + #define GCC_QUPV3_WRAP1_S1_CLK_SRC 92 103 + #define GCC_QUPV3_WRAP1_S2_CLK 93 104 + #define GCC_QUPV3_WRAP1_S2_CLK_SRC 94 105 + #define GCC_QUPV3_WRAP1_S3_CLK 95 106 + #define GCC_QUPV3_WRAP1_S3_CLK_SRC 96 107 + #define GCC_QUPV3_WRAP1_S4_CLK 97 108 + #define GCC_QUPV3_WRAP1_S4_CLK_SRC 98 109 + #define GCC_QUPV3_WRAP1_S5_CLK 99 110 + #define GCC_QUPV3_WRAP1_S5_CLK_SRC 100 111 + #define GCC_QUPV3_WRAP_0_M_AHB_CLK 101 112 + #define GCC_QUPV3_WRAP_0_S_AHB_CLK 102 113 + #define GCC_QUPV3_WRAP_1_M_AHB_CLK 103 114 + #define GCC_QUPV3_WRAP_1_S_AHB_CLK 104 115 + #define GCC_RX1_USB2_CLKREF_CLK 105 116 + #define GCC_RX3_USB2_CLKREF_CLK 106 117 + #define GCC_SDCC1_AHB_CLK 107 118 + #define GCC_SDCC1_APPS_CLK 108 119 + #define GCC_SDCC1_APPS_CLK_SRC 109 120 + #define GCC_SDCC1_ICE_CORE_CLK 110 121 + #define GCC_SDCC1_ICE_CORE_CLK_SRC 111 122 + #define GCC_SDCC2_AHB_CLK 112 123 + #define GCC_SDCC2_APPS_CLK 113 124 + #define GCC_SDCC2_APPS_CLK_SRC 114 125 + #define GCC_SDR_CORE_CLK 115 126 + #define GCC_SDR_CSR_HCLK 116 127 + #define GCC_SDR_PRI_MI2S_CLK 117 128 + #define GCC_SDR_SEC_MI2S_CLK 118 129 + #define GCC_SDR_WR0_MEM_CLK 119 130 + #define GCC_SDR_WR1_MEM_CLK 120 131 + #define GCC_SDR_WR2_MEM_CLK 121 132 + #define GCC_SYS_NOC_CPUSS_AHB_CLK 122 133 + #define GCC_UFS_CARD_CLKREF_CLK 123 134 + #define GCC_UFS_MEM_CLKREF_CLK 124 135 + #define GCC_UFS_PHY_AHB_CLK 125 136 + #define GCC_UFS_PHY_AXI_CLK 126 137 + #define GCC_UFS_PHY_AXI_CLK_SRC 127 138 + #define GCC_UFS_PHY_ICE_CORE_CLK 128 139 + #define GCC_UFS_PHY_ICE_CORE_CLK_SRC 129 140 + #define GCC_UFS_PHY_PHY_AUX_CLK 130 141 + #define GCC_UFS_PHY_PHY_AUX_CLK_SRC 131 142 + #define GCC_UFS_PHY_RX_SYMBOL_0_CLK 132 143 + #define GCC_UFS_PHY_TX_SYMBOL_0_CLK 133 144 + #define GCC_UFS_PHY_UNIPRO_CORE_CLK 134 145 + #define GCC_UFS_PHY_UNIPRO_CORE_CLK_SRC 135 146 + #define GCC_USB20_SEC_MASTER_CLK 136 147 + #define GCC_USB20_SEC_MASTER_CLK_SRC 137 148 + #define GCC_USB20_SEC_MOCK_UTMI_CLK 138 149 + #define GCC_USB20_SEC_MOCK_UTMI_CLK_SRC 139 150 + #define GCC_USB20_SEC_SLEEP_CLK 140 151 + #define GCC_USB2_PRIM_CLKREF_CLK 141 152 + #define GCC_USB2_SEC_CLKREF_CLK 142 153 + #define GCC_USB2_SEC_PHY_AUX_CLK 143 154 + #define GCC_USB2_SEC_PHY_AUX_CLK_SRC 144 155 + #define GCC_USB2_SEC_PHY_COM_AUX_CLK 145 156 + #define GCC_USB2_SEC_PHY_PIPE_CLK 146 157 + #define GCC_USB30_PRIM_MASTER_CLK 147 158 + #define GCC_USB30_PRIM_MASTER_CLK_SRC 148 159 + #define GCC_USB30_PRIM_MOCK_UTMI_CLK 149 160 + #define GCC_USB30_PRIM_MOCK_UTMI_CLK_SRC 150 161 + #define GCC_USB30_PRIM_SLEEP_CLK 151 162 + #define GCC_USB3_PRIM_CLKREF_CLK 152 163 + #define GCC_USB3_PRIM_PHY_AUX_CLK 153 164 + #define GCC_USB3_PRIM_PHY_AUX_CLK_SRC 154 165 + #define GCC_USB3_PRIM_PHY_COM_AUX_CLK 155 166 + #define GCC_USB3_PRIM_PHY_PIPE_CLK 156 167 + #define GCC_USB3_SEC_CLKREF_CLK 157 168 + #define GCC_VIDEO_AHB_CLK 158 169 + #define GCC_VIDEO_AXI0_CLK 159 170 + #define GCC_VIDEO_XO_CLK 160 171 + #define GCC_VSENSOR_CLK_SRC 161 172 + #define GCC_AGGRE_UFS_PHY_AXI_HW_CTL_CLK 162 173 + #define GCC_UFS_PHY_AXI_HW_CTL_CLK 163 174 + #define GCC_UFS_PHY_ICE_CORE_HW_CTL_CLK 164 175 + #define GCC_UFS_PHY_PHY_AUX_HW_CTL_CLK 165 176 + #define GCC_UFS_PHY_UNIPRO_CORE_HW_CTL_CLK 166 177 + 178 + /* GCC Resets */ 179 + #define GCC_EMAC_BCR 0 180 + #define GCC_QUSB2PHY_PRIM_BCR 1 181 + #define GCC_QUSB2PHY_SEC_BCR 2 182 + #define GCC_USB30_PRIM_BCR 3 183 + #define GCC_USB2_PHY_SEC_BCR 4 184 + #define GCC_USB3_DP_PHY_SEC_BCR 5 185 + #define GCC_USB3PHY_PHY_SEC_BCR 6 186 + #define GCC_PCIE_0_BCR 7 187 + #define GCC_PCIE_0_PHY_BCR 8 188 + #define GCC_PCIE_PHY_BCR 9 189 + #define GCC_PCIE_PHY_COM_BCR 10 190 + #define GCC_UFS_PHY_BCR 11 191 + #define GCC_USB20_SEC_BCR 12 192 + #define GCC_USB3_PHY_PRIM_SP0_BCR 13 193 + #define GCC_USB3PHY_PHY_PRIM_SP0_BCR 14 194 + #define GCC_SDCC1_BCR 15 195 + #define GCC_SDCC2_BCR 16 196 + 197 + /* GCC power domains */ 198 + #define EMAC_GDSC 0 199 + #define PCIE_0_GDSC 1 200 + #define UFS_PHY_GDSC 2 201 + #define USB20_SEC_GDSC 3 202 + #define USB30_PRIM_GDSC 4 203 + #define HLOS1_VOTE_AGGRE_NOC_MMU_AUDIO_TBU_GDSC 5 204 + #define HLOS1_VOTE_AGGRE_NOC_MMU_TBU1_GDSC 6 205 + #define HLOS1_VOTE_AGGRE_NOC_MMU_TBU2_GDSC 7 206 + #define HLOS1_VOTE_AGGRE_NOC_MMU_PCIE_TBU_GDSC 8 207 + #define HLOS1_VOTE_MMNOC_MMU_TBU_HF0_GDSC 9 208 + #define HLOS1_VOTE_MMNOC_MMU_TBU_SF_GDSC 10 209 + #define HLOS1_VOTE_MMNOC_MMU_TBU_HF1_GDSC 11 210 + 211 + #endif
+15
include/dt-bindings/clock/qcom,sm6115-lpasscc.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ 2 + /* 3 + * Copyright (c) 2023, Linaro Ltd. 4 + */ 5 + 6 + #ifndef _DT_BINDINGS_CLK_QCOM_LPASSCC_SM6115_H 7 + #define _DT_BINDINGS_CLK_QCOM_LPASSCC_SM6115_H 8 + 9 + /* LPASS CC */ 10 + #define LPASS_SWR_TX_CONFIG_CGCR 0 11 + 12 + /* LPASS_AUDIO CC */ 13 + #define LPASS_AUDIO_SWR_RX_CGCR 0 14 + 15 + #endif
+112
include/dt-bindings/clock/qcom,sm8750-dispcc.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ 2 + /* 3 + * Copyright (c) 2022, The Linux Foundation. All rights reserved. 4 + * Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved. 5 + * Copyright (c) 2024, Linaro Ltd. 6 + */ 7 + 8 + #ifndef _DT_BINDINGS_CLK_QCOM_SM8750_DISP_CC_H 9 + #define _DT_BINDINGS_CLK_QCOM_SM8750_DISP_CC_H 10 + 11 + /* DISP_CC clocks */ 12 + #define DISP_CC_ESYNC0_CLK 0 13 + #define DISP_CC_ESYNC0_CLK_SRC 1 14 + #define DISP_CC_ESYNC1_CLK 2 15 + #define DISP_CC_ESYNC1_CLK_SRC 3 16 + #define DISP_CC_MDSS_ACCU_SHIFT_CLK 4 17 + #define DISP_CC_MDSS_AHB1_CLK 5 18 + #define DISP_CC_MDSS_AHB_CLK 6 19 + #define DISP_CC_MDSS_AHB_CLK_SRC 7 20 + #define DISP_CC_MDSS_BYTE0_CLK 8 21 + #define DISP_CC_MDSS_BYTE0_CLK_SRC 9 22 + #define DISP_CC_MDSS_BYTE0_DIV_CLK_SRC 10 23 + #define DISP_CC_MDSS_BYTE0_INTF_CLK 11 24 + #define DISP_CC_MDSS_BYTE1_CLK 12 25 + #define DISP_CC_MDSS_BYTE1_CLK_SRC 13 26 + #define DISP_CC_MDSS_BYTE1_DIV_CLK_SRC 14 27 + #define DISP_CC_MDSS_BYTE1_INTF_CLK 15 28 + #define DISP_CC_MDSS_DPTX0_AUX_CLK 16 29 + #define DISP_CC_MDSS_DPTX0_AUX_CLK_SRC 17 30 + #define DISP_CC_MDSS_DPTX0_CRYPTO_CLK 18 31 + #define DISP_CC_MDSS_DPTX0_LINK_CLK 19 32 + #define DISP_CC_MDSS_DPTX0_LINK_CLK_SRC 20 33 + #define DISP_CC_MDSS_DPTX0_LINK_DIV_CLK_SRC 21 34 + #define DISP_CC_MDSS_DPTX0_LINK_INTF_CLK 22 35 + #define DISP_CC_MDSS_DPTX0_PIXEL0_CLK 23 36 + #define DISP_CC_MDSS_DPTX0_PIXEL0_CLK_SRC 24 37 + #define DISP_CC_MDSS_DPTX0_PIXEL1_CLK 25 38 + #define DISP_CC_MDSS_DPTX0_PIXEL1_CLK_SRC 26 39 + #define DISP_CC_MDSS_DPTX0_USB_ROUTER_LINK_INTF_CLK 27 40 + #define DISP_CC_MDSS_DPTX1_AUX_CLK 28 41 + #define DISP_CC_MDSS_DPTX1_AUX_CLK_SRC 29 42 + #define DISP_CC_MDSS_DPTX1_CRYPTO_CLK 30 43 + #define DISP_CC_MDSS_DPTX1_LINK_CLK 31 44 + #define DISP_CC_MDSS_DPTX1_LINK_CLK_SRC 32 45 + #define DISP_CC_MDSS_DPTX1_LINK_DIV_CLK_SRC 33 46 + #define DISP_CC_MDSS_DPTX1_LINK_INTF_CLK 34 47 + #define DISP_CC_MDSS_DPTX1_PIXEL0_CLK 35 48 + #define DISP_CC_MDSS_DPTX1_PIXEL0_CLK_SRC 36 49 + #define DISP_CC_MDSS_DPTX1_PIXEL1_CLK 37 50 + #define DISP_CC_MDSS_DPTX1_PIXEL1_CLK_SRC 38 51 + #define DISP_CC_MDSS_DPTX1_USB_ROUTER_LINK_INTF_CLK 39 52 + #define DISP_CC_MDSS_DPTX2_AUX_CLK 40 53 + #define DISP_CC_MDSS_DPTX2_AUX_CLK_SRC 41 54 + #define DISP_CC_MDSS_DPTX2_CRYPTO_CLK 42 55 + #define DISP_CC_MDSS_DPTX2_LINK_CLK 43 56 + #define DISP_CC_MDSS_DPTX2_LINK_CLK_SRC 44 57 + #define DISP_CC_MDSS_DPTX2_LINK_DIV_CLK_SRC 45 58 + #define DISP_CC_MDSS_DPTX2_LINK_INTF_CLK 46 59 + #define DISP_CC_MDSS_DPTX2_PIXEL0_CLK 47 60 + #define DISP_CC_MDSS_DPTX2_PIXEL0_CLK_SRC 48 61 + #define DISP_CC_MDSS_DPTX2_PIXEL1_CLK 49 62 + #define DISP_CC_MDSS_DPTX2_PIXEL1_CLK_SRC 50 63 + #define DISP_CC_MDSS_DPTX3_AUX_CLK 51 64 + #define DISP_CC_MDSS_DPTX3_AUX_CLK_SRC 52 65 + #define DISP_CC_MDSS_DPTX3_CRYPTO_CLK 53 66 + #define DISP_CC_MDSS_DPTX3_LINK_CLK 54 67 + #define DISP_CC_MDSS_DPTX3_LINK_CLK_SRC 55 68 + #define DISP_CC_MDSS_DPTX3_LINK_DIV_CLK_SRC 56 69 + #define DISP_CC_MDSS_DPTX3_LINK_INTF_CLK 57 70 + #define DISP_CC_MDSS_DPTX3_PIXEL0_CLK 58 71 + #define DISP_CC_MDSS_DPTX3_PIXEL0_CLK_SRC 59 72 + #define DISP_CC_MDSS_ESC0_CLK 60 73 + #define DISP_CC_MDSS_ESC0_CLK_SRC 61 74 + #define DISP_CC_MDSS_ESC1_CLK 62 75 + #define DISP_CC_MDSS_ESC1_CLK_SRC 63 76 + #define DISP_CC_MDSS_MDP1_CLK 64 77 + #define DISP_CC_MDSS_MDP_CLK 65 78 + #define DISP_CC_MDSS_MDP_CLK_SRC 66 79 + #define DISP_CC_MDSS_MDP_LUT1_CLK 67 80 + #define DISP_CC_MDSS_MDP_LUT_CLK 68 81 + #define DISP_CC_MDSS_NON_GDSC_AHB_CLK 69 82 + #define DISP_CC_MDSS_PCLK0_CLK 70 83 + #define DISP_CC_MDSS_PCLK0_CLK_SRC 71 84 + #define DISP_CC_MDSS_PCLK1_CLK 72 85 + #define DISP_CC_MDSS_PCLK1_CLK_SRC 73 86 + #define DISP_CC_MDSS_PCLK2_CLK 74 87 + #define DISP_CC_MDSS_PCLK2_CLK_SRC 75 88 + #define DISP_CC_MDSS_RSCC_AHB_CLK 76 89 + #define DISP_CC_MDSS_RSCC_VSYNC_CLK 77 90 + #define DISP_CC_MDSS_VSYNC1_CLK 78 91 + #define DISP_CC_MDSS_VSYNC_CLK 79 92 + #define DISP_CC_MDSS_VSYNC_CLK_SRC 80 93 + #define DISP_CC_OSC_CLK 81 94 + #define DISP_CC_OSC_CLK_SRC 82 95 + #define DISP_CC_PLL0 83 96 + #define DISP_CC_PLL1 84 97 + #define DISP_CC_PLL2 85 98 + #define DISP_CC_SLEEP_CLK 86 99 + #define DISP_CC_SLEEP_CLK_SRC 87 100 + #define DISP_CC_XO_CLK 88 101 + #define DISP_CC_XO_CLK_SRC 89 102 + 103 + /* DISP_CC resets */ 104 + #define DISP_CC_MDSS_CORE_BCR 0 105 + #define DISP_CC_MDSS_CORE_INT2_BCR 1 106 + #define DISP_CC_MDSS_RSCC_BCR 2 107 + 108 + /* DISP_CC GDSCR */ 109 + #define MDSS_GDSC 0 110 + #define MDSS_INT2_GDSC 1 111 + 112 + #endif
+226
include/dt-bindings/clock/qcom,sm8750-gcc.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ 2 + /* 3 + * Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved. 4 + */ 5 + 6 + #ifndef _DT_BINDINGS_CLK_QCOM_GCC_SM8750_H 7 + #define _DT_BINDINGS_CLK_QCOM_GCC_SM8750_H 8 + 9 + /* GCC clocks */ 10 + #define GCC_AGGRE_NOC_PCIE_AXI_CLK 0 11 + #define GCC_AGGRE_UFS_PHY_AXI_CLK 1 12 + #define GCC_AGGRE_UFS_PHY_AXI_HW_CTL_CLK 2 13 + #define GCC_AGGRE_USB3_PRIM_AXI_CLK 3 14 + #define GCC_BOOT_ROM_AHB_CLK 4 15 + #define GCC_CAM_BIST_MCLK_AHB_CLK 5 16 + #define GCC_CAMERA_AHB_CLK 6 17 + #define GCC_CAMERA_HF_AXI_CLK 7 18 + #define GCC_CAMERA_SF_AXI_CLK 8 19 + #define GCC_CAMERA_XO_CLK 9 20 + #define GCC_CFG_NOC_PCIE_ANOC_AHB_CLK 10 21 + #define GCC_CFG_NOC_USB3_PRIM_AXI_CLK 11 22 + #define GCC_CNOC_PCIE_SF_AXI_CLK 12 23 + #define GCC_DDRSS_GPU_AXI_CLK 13 24 + #define GCC_DDRSS_PCIE_SF_QTB_CLK 14 25 + #define GCC_DISP_AHB_CLK 15 26 + #define GCC_DISP_HF_AXI_CLK 16 27 + #define GCC_EVA_AHB_CLK 17 28 + #define GCC_EVA_AXI0_CLK 18 29 + #define GCC_EVA_AXI0C_CLK 19 30 + #define GCC_EVA_XO_CLK 20 31 + #define GCC_GP1_CLK 21 32 + #define GCC_GP1_CLK_SRC 22 33 + #define GCC_GP2_CLK 23 34 + #define GCC_GP2_CLK_SRC 24 35 + #define GCC_GP3_CLK 25 36 + #define GCC_GP3_CLK_SRC 26 37 + #define GCC_GPLL0 27 38 + #define GCC_GPLL0_OUT_EVEN 28 39 + #define GCC_GPLL1 29 40 + #define GCC_GPLL4 30 41 + #define GCC_GPLL7 31 42 + #define GCC_GPLL9 32 43 + #define GCC_GPU_CFG_AHB_CLK 33 44 + #define GCC_GPU_GEMNOC_GFX_CLK 34 45 + #define GCC_GPU_GPLL0_CLK_SRC 35 46 + #define GCC_GPU_GPLL0_DIV_CLK_SRC 36 47 + #define GCC_PCIE_0_AUX_CLK 37 48 + #define GCC_PCIE_0_AUX_CLK_SRC 38 49 + #define GCC_PCIE_0_CFG_AHB_CLK 39 50 + #define GCC_PCIE_0_MSTR_AXI_CLK 40 51 + #define GCC_PCIE_0_PHY_RCHNG_CLK 41 52 + #define GCC_PCIE_0_PHY_RCHNG_CLK_SRC 42 53 + #define GCC_PCIE_0_PIPE_CLK 43 54 + #define GCC_PCIE_0_PIPE_CLK_SRC 44 55 + #define GCC_PCIE_0_SLV_AXI_CLK 45 56 + #define GCC_PCIE_0_SLV_Q2A_AXI_CLK 46 57 + #define GCC_PCIE_RSCC_CFG_AHB_CLK 47 58 + #define GCC_PCIE_RSCC_XO_CLK 48 59 + #define GCC_PDM2_CLK 49 60 + #define GCC_PDM2_CLK_SRC 50 61 + #define GCC_PDM_AHB_CLK 51 62 + #define GCC_PDM_XO4_CLK 52 63 + #define GCC_QMIP_CAMERA_CMD_AHB_CLK 53 64 + #define GCC_QMIP_CAMERA_NRT_AHB_CLK 54 65 + #define GCC_QMIP_CAMERA_RT_AHB_CLK 55 66 + #define GCC_QMIP_GPU_AHB_CLK 56 67 + #define GCC_QMIP_PCIE_AHB_CLK 57 68 + #define GCC_QMIP_VIDEO_CV_CPU_AHB_CLK 58 69 + #define GCC_QMIP_VIDEO_CVP_AHB_CLK 59 70 + #define GCC_QMIP_VIDEO_V_CPU_AHB_CLK 60 71 + #define GCC_QMIP_VIDEO_VCODEC_AHB_CLK 61 72 + #define GCC_QUPV3_I2C_CORE_CLK 62 73 + #define GCC_QUPV3_I2C_S0_CLK 63 74 + #define GCC_QUPV3_I2C_S0_CLK_SRC 64 75 + #define GCC_QUPV3_I2C_S1_CLK 65 76 + #define GCC_QUPV3_I2C_S1_CLK_SRC 66 77 + #define GCC_QUPV3_I2C_S2_CLK 67 78 + #define GCC_QUPV3_I2C_S2_CLK_SRC 68 79 + #define GCC_QUPV3_I2C_S3_CLK 69 80 + #define GCC_QUPV3_I2C_S3_CLK_SRC 70 81 + #define GCC_QUPV3_I2C_S4_CLK 71 82 + #define GCC_QUPV3_I2C_S4_CLK_SRC 72 83 + #define GCC_QUPV3_I2C_S5_CLK 73 84 + #define GCC_QUPV3_I2C_S5_CLK_SRC 74 85 + #define GCC_QUPV3_I2C_S6_CLK 75 86 + #define GCC_QUPV3_I2C_S6_CLK_SRC 76 87 + #define GCC_QUPV3_I2C_S7_CLK 77 88 + #define GCC_QUPV3_I2C_S7_CLK_SRC 78 89 + #define GCC_QUPV3_I2C_S8_CLK 79 90 + #define GCC_QUPV3_I2C_S8_CLK_SRC 80 91 + #define GCC_QUPV3_I2C_S9_CLK 81 92 + #define GCC_QUPV3_I2C_S9_CLK_SRC 82 93 + #define GCC_QUPV3_I2C_S_AHB_CLK 83 94 + #define GCC_QUPV3_WRAP1_CORE_2X_CLK 84 95 + #define GCC_QUPV3_WRAP1_CORE_CLK 85 96 + #define GCC_QUPV3_WRAP1_QSPI_REF_CLK 86 97 + #define GCC_QUPV3_WRAP1_QSPI_REF_CLK_SRC 87 98 + #define GCC_QUPV3_WRAP1_S0_CLK 88 99 + #define GCC_QUPV3_WRAP1_S0_CLK_SRC 89 100 + #define GCC_QUPV3_WRAP1_S1_CLK 90 101 + #define GCC_QUPV3_WRAP1_S1_CLK_SRC 91 102 + #define GCC_QUPV3_WRAP1_S2_CLK 92 103 + #define GCC_QUPV3_WRAP1_S2_CLK_SRC 93 104 + #define GCC_QUPV3_WRAP1_S3_CLK 94 105 + #define GCC_QUPV3_WRAP1_S3_CLK_SRC 95 106 + #define GCC_QUPV3_WRAP1_S4_CLK 96 107 + #define GCC_QUPV3_WRAP1_S4_CLK_SRC 97 108 + #define GCC_QUPV3_WRAP1_S5_CLK 98 109 + #define GCC_QUPV3_WRAP1_S5_CLK_SRC 99 110 + #define GCC_QUPV3_WRAP1_S6_CLK 100 111 + #define GCC_QUPV3_WRAP1_S6_CLK_SRC 101 112 + #define GCC_QUPV3_WRAP1_S7_CLK 102 113 + #define GCC_QUPV3_WRAP1_S7_CLK_SRC 103 114 + #define GCC_QUPV3_WRAP2_CORE_2X_CLK 104 115 + #define GCC_QUPV3_WRAP2_CORE_CLK 105 116 + #define GCC_QUPV3_WRAP2_IBI_CTRL_0_CLK_SRC 106 117 + #define GCC_QUPV3_WRAP2_IBI_CTRL_2_CLK 107 118 + #define GCC_QUPV3_WRAP2_IBI_CTRL_3_CLK 108 119 + #define GCC_QUPV3_WRAP2_S0_CLK 109 120 + #define GCC_QUPV3_WRAP2_S0_CLK_SRC 110 121 + #define GCC_QUPV3_WRAP2_S1_CLK 111 122 + #define GCC_QUPV3_WRAP2_S1_CLK_SRC 112 123 + #define GCC_QUPV3_WRAP2_S2_CLK 113 124 + #define GCC_QUPV3_WRAP2_S2_CLK_SRC 114 125 + #define GCC_QUPV3_WRAP2_S3_CLK 115 126 + #define GCC_QUPV3_WRAP2_S3_CLK_SRC 116 127 + #define GCC_QUPV3_WRAP2_S4_CLK 117 128 + #define GCC_QUPV3_WRAP2_S4_CLK_SRC 118 129 + #define GCC_QUPV3_WRAP2_S5_CLK 119 130 + #define GCC_QUPV3_WRAP2_S5_CLK_SRC 120 131 + #define GCC_QUPV3_WRAP2_S6_CLK 121 132 + #define GCC_QUPV3_WRAP2_S6_CLK_SRC 122 133 + #define GCC_QUPV3_WRAP2_S7_CLK 123 134 + #define GCC_QUPV3_WRAP2_S7_CLK_SRC 124 135 + #define GCC_QUPV3_WRAP_1_M_AHB_CLK 125 136 + #define GCC_QUPV3_WRAP_1_S_AHB_CLK 126 137 + #define GCC_QUPV3_WRAP_2_IBI_2_AHB_CLK 127 138 + #define GCC_QUPV3_WRAP_2_IBI_3_AHB_CLK 128 139 + #define GCC_QUPV3_WRAP_2_M_AHB_CLK 129 140 + #define GCC_QUPV3_WRAP_2_S_AHB_CLK 130 141 + #define GCC_SDCC2_AHB_CLK 131 142 + #define GCC_SDCC2_APPS_CLK 132 143 + #define GCC_SDCC2_APPS_CLK_SRC 133 144 + #define GCC_SDCC4_AHB_CLK 134 145 + #define GCC_SDCC4_APPS_CLK 135 146 + #define GCC_SDCC4_APPS_CLK_SRC 136 147 + #define GCC_UFS_PHY_AHB_CLK 137 148 + #define GCC_UFS_PHY_AXI_CLK 138 149 + #define GCC_UFS_PHY_AXI_CLK_SRC 139 150 + #define GCC_UFS_PHY_AXI_HW_CTL_CLK 140 151 + #define GCC_UFS_PHY_ICE_CORE_CLK 141 152 + #define GCC_UFS_PHY_ICE_CORE_CLK_SRC 142 153 + #define GCC_UFS_PHY_ICE_CORE_HW_CTL_CLK 143 154 + #define GCC_UFS_PHY_PHY_AUX_CLK 144 155 + #define GCC_UFS_PHY_PHY_AUX_CLK_SRC 145 156 + #define GCC_UFS_PHY_PHY_AUX_HW_CTL_CLK 146 157 + #define GCC_UFS_PHY_RX_SYMBOL_0_CLK 147 158 + #define GCC_UFS_PHY_RX_SYMBOL_0_CLK_SRC 148 159 + #define GCC_UFS_PHY_RX_SYMBOL_1_CLK 149 160 + #define GCC_UFS_PHY_RX_SYMBOL_1_CLK_SRC 150 161 + #define GCC_UFS_PHY_TX_SYMBOL_0_CLK 151 162 + #define GCC_UFS_PHY_TX_SYMBOL_0_CLK_SRC 152 163 + #define GCC_UFS_PHY_UNIPRO_CORE_CLK 153 164 + #define GCC_UFS_PHY_UNIPRO_CORE_CLK_SRC 154 165 + #define GCC_UFS_PHY_UNIPRO_CORE_HW_CTL_CLK 155 166 + #define GCC_USB30_PRIM_MASTER_CLK 156 167 + #define GCC_USB30_PRIM_MASTER_CLK_SRC 157 168 + #define GCC_USB30_PRIM_MOCK_UTMI_CLK 158 169 + #define GCC_USB30_PRIM_MOCK_UTMI_CLK_SRC 159 170 + #define GCC_USB30_PRIM_MOCK_UTMI_POSTDIV_CLK_SRC 160 171 + #define GCC_USB30_PRIM_SLEEP_CLK 161 172 + #define GCC_USB3_PRIM_PHY_AUX_CLK 162 173 + #define GCC_USB3_PRIM_PHY_AUX_CLK_SRC 163 174 + #define GCC_USB3_PRIM_PHY_COM_AUX_CLK 164 175 + #define GCC_USB3_PRIM_PHY_PIPE_CLK 165 176 + #define GCC_USB3_PRIM_PHY_PIPE_CLK_SRC 166 177 + #define GCC_VIDEO_AHB_CLK 167 178 + #define GCC_VIDEO_AXI0_CLK 168 179 + #define GCC_VIDEO_AXI1_CLK 169 180 + #define GCC_VIDEO_XO_CLK 170 181 + 182 + /* GCC power domains */ 183 + #define GCC_PCIE_0_GDSC 0 184 + #define GCC_PCIE_0_PHY_GDSC 1 185 + #define GCC_UFS_MEM_PHY_GDSC 2 186 + #define GCC_UFS_PHY_GDSC 3 187 + #define GCC_USB30_PRIM_GDSC 4 188 + #define GCC_USB3_PHY_GDSC 5 189 + 190 + /* GCC resets */ 191 + #define GCC_CAMERA_BCR 0 192 + #define GCC_DISPLAY_BCR 1 193 + #define GCC_EVA_BCR 2 194 + #define GCC_GPU_BCR 3 195 + #define GCC_PCIE_0_BCR 4 196 + #define GCC_PCIE_0_LINK_DOWN_BCR 5 197 + #define GCC_PCIE_0_NOCSR_COM_PHY_BCR 6 198 + #define GCC_PCIE_0_PHY_BCR 7 199 + #define GCC_PCIE_0_PHY_NOCSR_COM_PHY_BCR 8 200 + #define GCC_PCIE_PHY_BCR 9 201 + #define GCC_PCIE_PHY_CFG_AHB_BCR 10 202 + #define GCC_PCIE_PHY_COM_BCR 11 203 + #define GCC_PCIE_RSCC_BCR 12 204 + #define GCC_PDM_BCR 13 205 + #define GCC_QUPV3_WRAPPER_1_BCR 14 206 + #define GCC_QUPV3_WRAPPER_2_BCR 15 207 + #define GCC_QUPV3_WRAPPER_I2C_BCR 16 208 + #define GCC_QUSB2PHY_PRIM_BCR 17 209 + #define GCC_QUSB2PHY_SEC_BCR 18 210 + #define GCC_SDCC2_BCR 19 211 + #define GCC_SDCC4_BCR 20 212 + #define GCC_UFS_PHY_BCR 21 213 + #define GCC_USB30_PRIM_BCR 22 214 + #define GCC_USB3_DP_PHY_PRIM_BCR 23 215 + #define GCC_USB3_DP_PHY_SEC_BCR 24 216 + #define GCC_USB3_PHY_PRIM_BCR 25 217 + #define GCC_USB3_PHY_SEC_BCR 26 218 + #define GCC_USB3PHY_PHY_PRIM_BCR 27 219 + #define GCC_USB3PHY_PHY_SEC_BCR 28 220 + #define GCC_VIDEO_AXI0_CLK_ARES 29 221 + #define GCC_VIDEO_AXI1_CLK_ARES 30 222 + #define GCC_VIDEO_BCR 31 223 + #define GCC_EVA_AXI0_CLK_ARES 32 224 + #define GCC_EVA_AXI0C_CLK_ARES 33 225 + 226 + #endif
+15
include/dt-bindings/clock/qcom,sm8750-tcsr.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ 2 + /* 3 + * Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved. 4 + */ 5 + 6 + #ifndef _DT_BINDINGS_CLK_QCOM_TCSR_CC_SM8750_H 7 + #define _DT_BINDINGS_CLK_QCOM_TCSR_CC_SM8750_H 8 + 9 + /* TCSR_CC clocks */ 10 + #define TCSR_PCIE_0_CLKREF_EN 0 11 + #define TCSR_UFS_CLKREF_EN 1 12 + #define TCSR_USB2_CLKREF_EN 2 13 + #define TCSR_USB3_CLKREF_EN 3 14 + 15 + #endif
+13
include/dt-bindings/clock/qcom,x1e80100-gpucc.h
··· 33 33 #define GPU_CC_SLEEP_CLK 23 34 34 #define GPU_CC_XO_CLK_SRC 24 35 35 #define GPU_CC_XO_DIV_CLK_SRC 25 36 + #define GPU_CC_CX_ACCU_SHIFT_CLK 26 37 + #define GPU_CC_GX_ACCU_SHIFT_CLK 27 36 38 37 39 /* GDSCs */ 38 40 #define GPU_CX_GDSC 0 39 41 #define GPU_GX_GDSC 1 42 + 43 + /* GPU_CC resets */ 44 + #define GPU_CC_ACD_BCR 0 45 + #define GPU_CC_CB_BCR 1 46 + #define GPU_CC_CX_BCR 2 47 + #define GPU_CC_FAST_HUB_BCR 3 48 + #define GPU_CC_FF_BCR 4 49 + #define GPU_CC_GFX3D_AON_BCR 5 50 + #define GPU_CC_GMU_BCR 6 51 + #define GPU_CC_GX_BCR 7 52 + #define GPU_CC_XO_BCR 8 40 53 41 54 #endif
+2
include/dt-bindings/clock/sun50i-a64-ccu.h
··· 44 44 #define _DT_BINDINGS_CLK_SUN50I_A64_H_ 45 45 46 46 #define CLK_PLL_VIDEO0 7 47 + #define CLK_PLL_VIDEO0_2X 8 47 48 #define CLK_PLL_PERIPH0 11 49 + #define CLK_PLL_MIPI 17 48 50 49 51 #define CLK_CPUX 21 50 52 #define CLK_BUS_MIPI_DSI 28
+24
include/dt-bindings/interconnect/qcom,ipq5424.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ 2 + #ifndef INTERCONNECT_QCOM_IPQ5424_H 3 + #define INTERCONNECT_QCOM_IPQ5424_H 4 + 5 + #define MASTER_ANOC_PCIE0 0 6 + #define SLAVE_ANOC_PCIE0 1 7 + #define MASTER_CNOC_PCIE0 2 8 + #define SLAVE_CNOC_PCIE0 3 9 + #define MASTER_ANOC_PCIE1 4 10 + #define SLAVE_ANOC_PCIE1 5 11 + #define MASTER_CNOC_PCIE1 6 12 + #define SLAVE_CNOC_PCIE1 7 13 + #define MASTER_ANOC_PCIE2 8 14 + #define SLAVE_ANOC_PCIE2 9 15 + #define MASTER_CNOC_PCIE2 10 16 + #define SLAVE_CNOC_PCIE2 11 17 + #define MASTER_ANOC_PCIE3 12 18 + #define SLAVE_ANOC_PCIE3 13 19 + #define MASTER_CNOC_PCIE3 14 20 + #define SLAVE_CNOC_PCIE3 15 21 + #define MASTER_CNOC_USB 16 22 + #define SLAVE_CNOC_USB 17 23 + 24 + #endif /* INTERCONNECT_QCOM_IPQ5424_H */