Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux

Pull clk updates from Stephen Boyd:
"This merge window we have one small clk provider API in the core
framework and then a bunch of driver updates and a handful of new
drivers. In terms of diffstat the Qualcomm and Amlogic drivers are
high up there because of all the clk data introcued by new drivers.
The Nvidia Tegra driver had a lot of work done this cycle too to
support suspend/resume and memory controllers. And the OMAP clk driver
got proper clk and reset handling in place.

Rounding out the patches are various updates to remove unused data,
mark things static, correct incorrect data in drivers, etc. All the
little things that improve drivers and maintain code health. I will
point out that there's a patch in here for the GPIO clk driver, that
almost nobody uses, which changes behavior and causes clk_set_rate()
to try to change the GPIO gate clk's parent. Other than that things
are fairly well SoC specific here.

Core:
- Add a clk provider API to get current parent index
- Plug a memory leak in clk_unregister() path

New Drivers:
- CGU in Ingenix X1000
- Bitmain BM1880 clks
- Qualcomm MSM8998 GPU clk controllers
- Qualcomm SC7180 GCC and RPMH clk controllers
- Qualcomm QCS404 Q6SSTOP clk controllers
- Add support for the Renesas R-Car M3-W+ (r8a77961) SoC
- Add support for the Renesas RZ/G2N (r8a774b1) SoC
- Add Tegra20/30 External Memory Clock (EMC) support

Updates:
- Make gpio gate clks propagate rate setting up to parent
- Prepare Armada 3700 for suspend to RAM by moving PCIe
suspend/resume priority
- Drop unused variables, enums, etc. in various clk drivers
- Convert various drivers to use devm_platform_ioremap_resource()
- Use struct_size() some more in various clk drivers
- Improve Rockchip px30 clk tree
- Add suspend/resume support to Tegra210 clk driver
- Reimplement SOR clks on earlier Tegra SoCs, helping HDMI and DP
- Allwinner DT exports and H6 clk tree fixes
- Proper clk and reset handling for OMAP SoCs
- Revamped TI divider clk to clamp max divider
- Make 1443X/1416X PLL clock structure common for reusing among i.MX8
SoCs
- Drop IMX7ULP_CLK_MIPI_PLL clock, it shouldn't be used
- Add VIDEO2_PLL clock for imx8mq
- Add missing gate clock for pll1/2 fixed dividers on i.MX8 SoCs
- Add sm1 support in the Amlogic audio clock controller
- Switch some clocks on R-Car Gen2/3 to .determine_rate()
- Remove Renesas R-Car Gen2 legacy DT clock support
- Improve arithmetic divisions on Renesas R-Car Gen2 and Gen3
- Improve Renesas R-Car Gen3 SD clock handling
- Add rate table for Samsung exynos542x GPU and VPLL clks
- Fix potential CPU performance degradation after system
suspend/resume cycle on exynos542x SoCs"

* tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux: (160 commits)
clk: aspeed: Add RMII RCLK gates for both AST2500 MACs
MAINTAINERS: Add entry for BM1880 SoC clock driver
clk: Add common clock driver for BM1880 SoC
dt-bindings: clock: Add devicetree binding for BM1880 SoC
clk: Add clk_hw_unregister_composite helper function definition
clk: Zero init clk_init_data in helpers
clk: ingenic: Allow drivers to be built with COMPILE_TEST
MAINTAINERS: Update section for Ux500 clock drivers
clk: mark clk_disable_unused() as __init
clk: Fix memory leak in clk_unregister()
clk: Ingenic: Add CGU driver for X1000.
dt-bindings: clock: Add X1000 bindings.
clk: tegra: Use match_string() helper to simplify the code
clk: pxa: fix one of the pxa RTC clocks
clk: sprd: Use IS_ERR() to validate the return value of syscon_regmap_lookup_by_phandle()
clk: armada-xp: remove unused code
clk: tegra: Fix build error without CONFIG_PM_SLEEP
clk: tegra: Add missing stubs for the case of !CONFIG_PM_SLEEP
clk: tegra: Optimize PLLX restore on Tegra20/30
clk: tegra: Add suspend and resume support on Tegra210
...

+8931 -2444
+2 -1
Documentation/devicetree/bindings/clock/amlogic,axg-audio-clkc.txt
··· 7 7 Required Properties: 8 8 9 9 - compatible : should be "amlogic,axg-audio-clkc" for the A113X and A113D, 10 - "amlogic,g12a-audio-clkc" for G12A. 10 + "amlogic,g12a-audio-clkc" for G12A, 11 + "amlogic,sm1-audio-clkc" for S905X3. 11 12 - reg : physical base address of the clock controller and length of 12 13 memory mapped region. 13 14 - clocks : a list of phandle + clock-specifier pairs for the clocks listed
+3 -2
Documentation/devicetree/bindings/clock/armada3700-periph-clock.txt
··· 9 9 The peripheral clock consumer should specify the desired clock by 10 10 having the clock ID in its "clocks" phandle cell. 11 11 12 - The following is a list of provided IDs for Armada 370 North bridge clocks: 12 + The following is a list of provided IDs for Armada 3700 North bridge clocks: 13 13 ID Clock name Description 14 14 ----------------------------------- 15 15 0 mmc MMC controller ··· 30 30 15 eip97 EIP 97 31 31 16 cpu CPU 32 32 33 - The following is a list of provided IDs for Armada 370 South bridge clocks: 33 + The following is a list of provided IDs for Armada 3700 South bridge clocks: 34 34 ID Clock name Description 35 35 ----------------------------------- 36 36 0 gbe-50 50 MHz parent clock for Gigabit Ethernet ··· 46 46 10 sdio SDIO 47 47 11 usb32-sub2-sys USB 2 clock 48 48 12 usb32-ss-sys USB 3 clock 49 + 13 pcie PCIe controller 49 50 50 51 Required properties: 51 52
+76
Documentation/devicetree/bindings/clock/bitmain,bm1880-clk.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/bindings/clock/bitmain,bm1880-clk.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Bitmain BM1880 Clock Controller 8 + 9 + maintainers: 10 + - Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 11 + 12 + description: | 13 + The Bitmain BM1880 clock controller generates and supplies clock to 14 + various peripherals within the SoC. 15 + 16 + This binding uses common clock bindings 17 + [1] Documentation/devicetree/bindings/clock/clock-bindings.txt 18 + 19 + properties: 20 + compatible: 21 + const: bitmain,bm1880-clk 22 + 23 + reg: 24 + items: 25 + - description: pll registers 26 + - description: system registers 27 + 28 + reg-names: 29 + items: 30 + - const: pll 31 + - const: sys 32 + 33 + clocks: 34 + maxItems: 1 35 + 36 + clock-names: 37 + const: osc 38 + 39 + '#clock-cells': 40 + const: 1 41 + 42 + required: 43 + - compatible 44 + - reg 45 + - reg-names 46 + - clocks 47 + - clock-names 48 + - '#clock-cells' 49 + 50 + additionalProperties: false 51 + 52 + examples: 53 + # Clock controller node: 54 + - | 55 + clk: clock-controller@e8 { 56 + compatible = "bitmain,bm1880-clk"; 57 + reg = <0xe8 0x0c>, <0x800 0xb0>; 58 + reg-names = "pll", "sys"; 59 + clocks = <&osc>; 60 + clock-names = "osc"; 61 + #clock-cells = <1>; 62 + }; 63 + 64 + # Example UART controller node that consumes clock generated by the clock controller: 65 + - | 66 + uart0: serial@58018000 { 67 + compatible = "snps,dw-apb-uart"; 68 + reg = <0x0 0x58018000 0x0 0x2000>; 69 + clocks = <&clk 45>, <&clk 46>; 70 + clock-names = "baudclk", "apb_pclk"; 71 + interrupts = <0 9 4>; 72 + reg-shift = <2>; 73 + reg-io-width = <4>; 74 + }; 75 + 76 + ...
-1
Documentation/devicetree/bindings/clock/imx7ulp-clock.txt
··· 82 82 <&scg1 IMX7ULP_CLK_APLL_PFD0>, 83 83 <&scg1 IMX7ULP_CLK_UPLL>, 84 84 <&scg1 IMX7ULP_CLK_SOSC_BUS_CLK>, 85 - <&scg1 IMX7ULP_CLK_MIPI_PLL>, 86 85 <&scg1 IMX7ULP_CLK_FIRC_BUS_CLK>, 87 86 <&scg1 IMX7ULP_CLK_ROSC>, 88 87 <&scg1 IMX7ULP_CLK_SPLL_BUS_CLK>;
+1
Documentation/devicetree/bindings/clock/ingenic,cgu.txt
··· 11 11 * ingenic,jz4725b-cgu 12 12 * ingenic,jz4770-cgu 13 13 * ingenic,jz4780-cgu 14 + * ingenic,x1000-cgu 14 15 - reg : The address & length of the CGU registers. 15 16 - clocks : List of phandle & clock specifiers for clocks external to the CGU. 16 17 Two such external clocks should be specified - first the external crystal
-94
Documentation/devicetree/bindings/clock/qcom,gcc.txt
··· 1 - Qualcomm Global Clock & Reset Controller Binding 2 - ------------------------------------------------ 3 - 4 - Required properties : 5 - - compatible : shall contain only one of the following: 6 - 7 - "qcom,gcc-apq8064" 8 - "qcom,gcc-apq8084" 9 - "qcom,gcc-ipq8064" 10 - "qcom,gcc-ipq4019" 11 - "qcom,gcc-ipq8074" 12 - "qcom,gcc-msm8660" 13 - "qcom,gcc-msm8916" 14 - "qcom,gcc-msm8960" 15 - "qcom,gcc-msm8974" 16 - "qcom,gcc-msm8974pro" 17 - "qcom,gcc-msm8974pro-ac" 18 - "qcom,gcc-msm8994" 19 - "qcom,gcc-msm8996" 20 - "qcom,gcc-msm8998" 21 - "qcom,gcc-mdm9615" 22 - "qcom,gcc-qcs404" 23 - "qcom,gcc-sdm630" 24 - "qcom,gcc-sdm660" 25 - "qcom,gcc-sdm845" 26 - "qcom,gcc-sm8150" 27 - 28 - - reg : shall contain base register location and length 29 - - #clock-cells : shall contain 1 30 - - #reset-cells : shall contain 1 31 - 32 - Optional properties : 33 - - #power-domain-cells : shall contain 1 34 - - Qualcomm TSENS (thermal sensor device) on some devices can 35 - be part of GCC and hence the TSENS properties can also be 36 - part of the GCC/clock-controller node. 37 - For more details on the TSENS properties please refer 38 - Documentation/devicetree/bindings/thermal/qcom-tsens.txt 39 - - protected-clocks : Protected clock specifier list as per common clock 40 - binding. 41 - 42 - For SM8150 only: 43 - - clocks: a list of phandles and clock-specifier pairs, 44 - one for each entry in clock-names. 45 - - clock-names: "bi_tcxo" (required) 46 - "sleep_clk" (optional) 47 - "aud_ref_clock" (optional) 48 - 49 - Example: 50 - clock-controller@900000 { 51 - compatible = "qcom,gcc-msm8960"; 52 - reg = <0x900000 0x4000>; 53 - #clock-cells = <1>; 54 - #reset-cells = <1>; 55 - #power-domain-cells = <1>; 56 - }; 57 - 58 - Example of GCC with TSENS properties: 59 - clock-controller@900000 { 60 - compatible = "qcom,gcc-apq8064"; 61 - reg = <0x00900000 0x4000>; 62 - nvmem-cells = <&tsens_calib>, <&tsens_backup>; 63 - nvmem-cell-names = "calib", "calib_backup"; 64 - #clock-cells = <1>; 65 - #reset-cells = <1>; 66 - #thermal-sensor-cells = <1>; 67 - }; 68 - 69 - Example of GCC with protected-clocks properties: 70 - clock-controller@100000 { 71 - compatible = "qcom,gcc-sdm845"; 72 - reg = <0x100000 0x1f0000>; 73 - #clock-cells = <1>; 74 - #reset-cells = <1>; 75 - #power-domain-cells = <1>; 76 - protected-clocks = <GCC_QSPI_CORE_CLK>, 77 - <GCC_QSPI_CORE_CLK_SRC>, 78 - <GCC_QSPI_CNOC_PERIPH_AHB_CLK>, 79 - <GCC_LPASS_Q6_AXI_CLK>, 80 - <GCC_LPASS_SWAY_CLK>; 81 - }; 82 - 83 - Example of GCC with clocks 84 - gcc: clock-controller@100000 { 85 - compatible = "qcom,gcc-sm8150"; 86 - reg = <0x00100000 0x1f0000>; 87 - #clock-cells = <1>; 88 - #reset-cells = <1>; 89 - #power-domain-cells = <1>; 90 - clock-names = "bi_tcxo", 91 - "sleep_clk"; 92 - clocks = <&rpmcc RPM_SMD_XO_CLK_SRC>, 93 - <&sleep_clk>; 94 - };
+188
Documentation/devicetree/bindings/clock/qcom,gcc.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/bindings/clock/qcom,gcc.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm Global Clock & Reset Controller Binding 8 + 9 + maintainers: 10 + - Stephen Boyd <sboyd@kernel.org> 11 + - Taniya Das <tdas@codeaurora.org> 12 + 13 + description: | 14 + Qualcomm global clock control module which supports the clocks, resets and 15 + power domains. 16 + 17 + properties: 18 + compatible : 19 + enum: 20 + - qcom,gcc-apq8064 21 + - qcom,gcc-apq8084 22 + - qcom,gcc-ipq8064 23 + - qcom,gcc-ipq4019 24 + - qcom,gcc-ipq8074 25 + - qcom,gcc-msm8660 26 + - qcom,gcc-msm8916 27 + - qcom,gcc-msm8960 28 + - qcom,gcc-msm8974 29 + - qcom,gcc-msm8974pro 30 + - qcom,gcc-msm8974pro-ac 31 + - qcom,gcc-msm8994 32 + - qcom,gcc-msm8996 33 + - qcom,gcc-msm8998 34 + - qcom,gcc-mdm9615 35 + - qcom,gcc-qcs404 36 + - qcom,gcc-sc7180 37 + - qcom,gcc-sdm630 38 + - qcom,gcc-sdm660 39 + - qcom,gcc-sdm845 40 + - qcom,gcc-sm8150 41 + 42 + clocks: 43 + minItems: 1 44 + maxItems: 3 45 + items: 46 + - description: Board XO source 47 + - description: Board active XO source 48 + - description: Sleep clock source 49 + 50 + clock-names: 51 + minItems: 1 52 + maxItems: 3 53 + items: 54 + - const: bi_tcxo 55 + - const: bi_tcxo_ao 56 + - const: sleep_clk 57 + 58 + '#clock-cells': 59 + const: 1 60 + 61 + '#reset-cells': 62 + const: 1 63 + 64 + '#power-domain-cells': 65 + const: 1 66 + 67 + reg: 68 + maxItems: 1 69 + 70 + nvmem-cells: 71 + minItems: 1 72 + maxItems: 2 73 + description: 74 + Qualcomm TSENS (thermal sensor device) on some devices can 75 + be part of GCC and hence the TSENS properties can also be part 76 + of the GCC/clock-controller node. 77 + For more details on the TSENS properties please refer 78 + Documentation/devicetree/bindings/thermal/qcom-tsens.txt 79 + 80 + nvmem-cell-names: 81 + minItems: 1 82 + maxItems: 2 83 + description: 84 + Names for each nvmem-cells specified. 85 + items: 86 + - const: calib 87 + - const: calib_backup 88 + 89 + 'thermal-sensor-cells': 90 + const: 1 91 + 92 + protected-clocks: 93 + description: 94 + Protected clock specifier list as per common clock binding 95 + 96 + required: 97 + - compatible 98 + - reg 99 + - '#clock-cells' 100 + - '#reset-cells' 101 + - '#power-domain-cells' 102 + 103 + if: 104 + properties: 105 + compatible: 106 + contains: 107 + const: qcom,gcc-apq8064 108 + 109 + then: 110 + required: 111 + - nvmem-cells 112 + - nvmem-cell-names 113 + - '#thermal-sensor-cells' 114 + 115 + else: 116 + if: 117 + properties: 118 + compatible: 119 + contains: 120 + enum: 121 + - qcom,gcc-sm8150 122 + - qcom,gcc-sc7180 123 + then: 124 + required: 125 + - clocks 126 + - clock-names 127 + 128 + 129 + examples: 130 + # Example for GCC for MSM8960: 131 + - | 132 + clock-controller@900000 { 133 + compatible = "qcom,gcc-msm8960"; 134 + reg = <0x900000 0x4000>; 135 + #clock-cells = <1>; 136 + #reset-cells = <1>; 137 + #power-domain-cells = <1>; 138 + }; 139 + 140 + 141 + # Example of GCC with TSENS properties: 142 + - | 143 + clock-controller@900000 { 144 + compatible = "qcom,gcc-apq8064"; 145 + reg = <0x00900000 0x4000>; 146 + nvmem-cells = <&tsens_calib>, <&tsens_backup>; 147 + nvmem-cell-names = "calib", "calib_backup"; 148 + #clock-cells = <1>; 149 + #reset-cells = <1>; 150 + #power-domain-cells = <1>; 151 + #thermal-sensor-cells = <1>; 152 + }; 153 + 154 + # Example of GCC with protected-clocks properties: 155 + - | 156 + clock-controller@100000 { 157 + compatible = "qcom,gcc-sdm845"; 158 + reg = <0x100000 0x1f0000>; 159 + protected-clocks = <187>, <188>, <189>, <190>, <191>; 160 + #clock-cells = <1>; 161 + #reset-cells = <1>; 162 + #power-domain-cells = <1>; 163 + }; 164 + 165 + # Example of GCC with clock node properties for SM8150: 166 + - | 167 + clock-controller@100000 { 168 + compatible = "qcom,gcc-sm8150"; 169 + reg = <0x00100000 0x1f0000>; 170 + clocks = <&rpmhcc 0>, <&rpmhcc 1>, <&sleep_clk>; 171 + clock-names = "bi_tcxo", "bi_tcxo_ao", "sleep_clk"; 172 + #clock-cells = <1>; 173 + #reset-cells = <1>; 174 + #power-domain-cells = <1>; 175 + }; 176 + 177 + # Example of GCC with clock nodes properties for SC7180: 178 + - | 179 + clock-controller@100000 { 180 + compatible = "qcom,gcc-sc7180"; 181 + reg = <0x100000 0x1f0000>; 182 + clocks = <&rpmhcc 0>, <&rpmhcc 1>; 183 + clock-names = "bi_tcxo", "bi_tcxo_ao"; 184 + #clock-cells = <1>; 185 + #reset-cells = <1>; 186 + #power-domain-cells = <1>; 187 + }; 188 + ...
+43
Documentation/devicetree/bindings/clock/qcom,q6sstopcc.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,q6sstopcc.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Q6SSTOP clock Controller 8 + 9 + maintainers: 10 + - Govind Singh <govinds@codeaurora.org> 11 + 12 + properties: 13 + compatible: 14 + const: "qcom,qcs404-q6sstopcc" 15 + 16 + reg: 17 + items: 18 + - description: Q6SSTOP clocks register region 19 + - description: Q6SSTOP_TCSR register region 20 + 21 + clocks: 22 + items: 23 + - description: ahb clock for the q6sstopCC 24 + 25 + '#clock-cells': 26 + const: 1 27 + 28 + required: 29 + - compatible 30 + - reg 31 + - clocks 32 + - '#clock-cells' 33 + 34 + additionalProperties: false 35 + 36 + examples: 37 + - | 38 + q6sstopcc: clock-controller@7500000 { 39 + compatible = "qcom,qcs404-q6sstopcc"; 40 + reg = <0x07500000 0x4e000>, <0x07550000 0x10000>; 41 + clocks = <&gcc 141>; 42 + #clock-cells = <1>; 43 + };
-27
Documentation/devicetree/bindings/clock/qcom,rpmh-clk.txt
··· 1 - Qualcomm Technologies, Inc. RPMh Clocks 2 - ------------------------------------------------------- 3 - 4 - Resource Power Manager Hardened (RPMh) manages shared resources on 5 - some Qualcomm Technologies Inc. SoCs. It accepts clock requests from 6 - other hardware subsystems via RSC to control clocks. 7 - 8 - Required properties : 9 - - compatible : must be one of: 10 - "qcom,sdm845-rpmh-clk" 11 - "qcom,sm8150-rpmh-clk" 12 - 13 - - #clock-cells : must contain 1 14 - - clocks: a list of phandles and clock-specifier pairs, 15 - one for each entry in clock-names. 16 - - clock-names: Parent board clock: "xo". 17 - 18 - Example : 19 - 20 - #include <dt-bindings/clock/qcom,rpmh.h> 21 - 22 - &apps_rsc { 23 - rpmhcc: clock-controller { 24 - compatible = "qcom,sdm845-rpmh-clk"; 25 - #clock-cells = <1>; 26 - }; 27 - };
+49
Documentation/devicetree/bindings/clock/qcom,rpmhcc.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/bindings/clock/qcom,rpmhcc.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm Technologies, Inc. RPMh Clocks Bindings 8 + 9 + maintainers: 10 + - Taniya Das <tdas@codeaurora.org> 11 + 12 + description: | 13 + Resource Power Manager Hardened (RPMh) manages shared resources on 14 + some Qualcomm Technologies Inc. SoCs. It accepts clock requests from 15 + other hardware subsystems via RSC to control clocks. 16 + 17 + properties: 18 + compatible: 19 + enum: 20 + - qcom,sc7180-rpmh-clk 21 + - qcom,sdm845-rpmh-clk 22 + - qcom,sm8150-rpmh-clk 23 + 24 + clocks: 25 + maxItems: 1 26 + 27 + clock-names: 28 + items: 29 + - const: xo 30 + 31 + '#clock-cells': 32 + const: 1 33 + 34 + required: 35 + - compatible 36 + - '#clock-cells' 37 + 38 + examples: 39 + # Example for GCC for SDM845: The below node should be defined inside 40 + # &apps_rsc node. 41 + - | 42 + #include <dt-bindings/clock/qcom,rpmh.h> 43 + rpmhcc: clock-controller { 44 + compatible = "qcom,sdm845-rpmh-clk"; 45 + clocks = <&xo_board>; 46 + clock-names = "xo"; 47 + #clock-cells = <1>; 48 + }; 49 + ...
+8 -5
Documentation/devicetree/bindings/clock/renesas,cpg-mssr.txt
··· 19 19 - "renesas,r8a7745-cpg-mssr" for the r8a7745 SoC (RZ/G1E) 20 20 - "renesas,r8a77470-cpg-mssr" for the r8a77470 SoC (RZ/G1C) 21 21 - "renesas,r8a774a1-cpg-mssr" for the r8a774a1 SoC (RZ/G2M) 22 + - "renesas,r8a774b1-cpg-mssr" for the r8a774a1 SoC (RZ/G2N) 22 23 - "renesas,r8a774c0-cpg-mssr" for the r8a774c0 SoC (RZ/G2E) 23 24 - "renesas,r8a7790-cpg-mssr" for the r8a7790 SoC (R-Car H2) 24 25 - "renesas,r8a7791-cpg-mssr" for the r8a7791 SoC (R-Car M2-W) ··· 27 26 - "renesas,r8a7793-cpg-mssr" for the r8a7793 SoC (R-Car M2-N) 28 27 - "renesas,r8a7794-cpg-mssr" for the r8a7794 SoC (R-Car E2) 29 28 - "renesas,r8a7795-cpg-mssr" for the r8a7795 SoC (R-Car H3) 30 - - "renesas,r8a7796-cpg-mssr" for the r8a7796 SoC (R-Car M3-W) 29 + - "renesas,r8a7796-cpg-mssr" for the r8a77960 SoC (R-Car M3-W) 30 + - "renesas,r8a77961-cpg-mssr" for the r8a77961 SoC (R-Car M3-W+) 31 31 - "renesas,r8a77965-cpg-mssr" for the r8a77965 SoC (R-Car M3-N) 32 32 - "renesas,r8a77970-cpg-mssr" for the r8a77970 SoC (R-Car V3M) 33 33 - "renesas,r8a77980-cpg-mssr" for the r8a77980 SoC (R-Car V3H) ··· 42 40 clock-names 43 41 - clock-names: List of external parent clock names. Valid names are: 44 42 - "extal" (r7s9210, r8a7743, r8a7744, r8a7745, r8a77470, r8a774a1, 45 - r8a774c0, r8a7790, r8a7791, r8a7792, r8a7793, r8a7794, 46 - r8a7795, r8a7796, r8a77965, r8a77970, r8a77980, r8a77990, 47 - r8a77995) 48 - - "extalr" (r8a774a1, r8a7795, r8a7796, r8a77965, r8a77970, r8a77980) 43 + r8a774b1, r8a774c0, r8a7790, r8a7791, r8a7792, r8a7793, 44 + r8a7794, r8a7795, r8a77960, r8a77961, r8a77965, r8a77970, 45 + r8a77980, r8a77990, r8a77995) 46 + - "extalr" (r8a774a1, r8a774b1, r8a7795, r8a77960, r8a77961, r8a77965, 47 + r8a77970, r8a77980) 49 48 - "usb_extal" (r8a7743, r8a7744, r8a7745, r8a77470, r8a7790, r8a7791, 50 49 r8a7793, r8a7794) 51 50
-60
Documentation/devicetree/bindings/clock/renesas,rcar-gen2-cpg-clocks.txt
··· 1 - * Renesas R-Car Gen2 Clock Pulse Generator (CPG) 2 - 3 - The CPG generates core clocks for the R-Car Gen2 SoCs. It includes three PLLs 4 - and several fixed ratio dividers. 5 - The CPG also provides a Clock Domain for SoC devices, in combination with the 6 - CPG Module Stop (MSTP) Clocks. 7 - 8 - Required Properties: 9 - 10 - - compatible: Must be one of 11 - - "renesas,r8a7790-cpg-clocks" for the r8a7790 CPG 12 - - "renesas,r8a7791-cpg-clocks" for the r8a7791 CPG 13 - - "renesas,r8a7792-cpg-clocks" for the r8a7792 CPG 14 - - "renesas,r8a7793-cpg-clocks" for the r8a7793 CPG 15 - - "renesas,r8a7794-cpg-clocks" for the r8a7794 CPG 16 - and "renesas,rcar-gen2-cpg-clocks" as a fallback. 17 - 18 - - reg: Base address and length of the memory resource used by the CPG 19 - 20 - - clocks: References to the parent clocks: first to the EXTAL clock, second 21 - to the USB_EXTAL clock 22 - - #clock-cells: Must be 1 23 - - clock-output-names: The names of the clocks. Supported clocks are "main", 24 - "pll0", "pll1", "pll3", "lb", "qspi", "sdh", "sd0", "sd1", "z", "rcan", and 25 - "adsp" 26 - - #power-domain-cells: Must be 0 27 - 28 - SoC devices that are part of the CPG/MSTP Clock Domain and can be power-managed 29 - through an MSTP clock should refer to the CPG device node in their 30 - "power-domains" property, as documented by the generic PM domain bindings in 31 - Documentation/devicetree/bindings/power/power_domain.txt. 32 - 33 - 34 - Examples 35 - -------- 36 - 37 - - CPG device node: 38 - 39 - cpg_clocks: cpg_clocks@e6150000 { 40 - compatible = "renesas,r8a7790-cpg-clocks", 41 - "renesas,rcar-gen2-cpg-clocks"; 42 - reg = <0 0xe6150000 0 0x1000>; 43 - clocks = <&extal_clk &usb_extal_clk>; 44 - #clock-cells = <1>; 45 - clock-output-names = "main", "pll0, "pll1", "pll3", 46 - "lb", "qspi", "sdh", "sd0", "sd1", "z", 47 - "rcan", "adsp"; 48 - #power-domain-cells = <0>; 49 - }; 50 - 51 - 52 - - CPG/MSTP Clock Domain member device node: 53 - 54 - thermal@e61f0000 { 55 - compatible = "renesas,thermal-r8a7790", "renesas,rcar-thermal"; 56 - reg = <0 0xe61f0000 0 0x14>, <0 0xe61f0100 0 0x38>; 57 - interrupts = <0 69 IRQ_TYPE_LEVEL_HIGH>; 58 - clocks = <&mstp5_clks R8A7790_CLK_THERMAL>; 59 - power-domains = <&cpg_clocks>; 60 - };
+1 -1
Documentation/devicetree/bindings/clock/renesas,rcar-usb2-clock-sel.txt
··· 46 46 Example (R-Car H3): 47 47 48 48 usb2_clksel: clock-controller@e6590630 { 49 - compatible = "renesas,r8a77950-rcar-usb2-clock-sel", 49 + compatible = "renesas,r8a7795-rcar-usb2-clock-sel", 50 50 "renesas,rcar-gen3-usb2-clock-sel"; 51 51 reg = <0 0xe6590630 0 0x02>; 52 52 clocks = <&cpg CPG_MOD 703>, <&usb_extal>, <&usb_xtal>;
+4 -2
MAINTAINERS
··· 1559 1559 L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) 1560 1560 S: Maintained 1561 1561 F: arch/arm64/boot/dts/bitmain/ 1562 + F: drivers/clk/clk-bm1880.c 1562 1563 F: drivers/pinctrl/pinctrl-bm1880.c 1563 1564 F: Documentation/devicetree/bindings/arm/bitmain.yaml 1565 + F: Documentation/devicetree/bindings/clock/bitmain,bm1880-clk.yaml 1564 1566 F: Documentation/devicetree/bindings/pinctrl/bitmain,bm1880-pinctrl.txt 1565 1567 1566 1568 ARM/CALXEDA HIGHBANK ARCHITECTURE ··· 2521 2519 F: drivers/tty/serial/8250/8250_uniphier.c 2522 2520 N: uniphier 2523 2521 2524 - ARM/Ux500 CLOCK FRAMEWORK SUPPORT 2522 + Ux500 CLOCK DRIVERS 2525 2523 M: Ulf Hansson <ulf.hansson@linaro.org> 2524 + L: linux-clk@vger.kernel.org 2526 2525 L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) 2527 - T: git git://git.linaro.org/people/ulfh/clk.git 2528 2526 S: Maintained 2529 2527 F: drivers/clk/ux500/ 2530 2528
+4
arch/arm/boot/dts/omap36xx-clocks.dtsi
··· 105 105 <&mcbsp4_ick>, <&uart4_fck>; 106 106 }; 107 107 }; 108 + 109 + &dpll4_m4_ck { 110 + ti,max-div = <31>; 111 + };
+1 -1
arch/arm/boot/dts/omap3xxx-clocks.dtsi
··· 416 416 #clock-cells = <0>; 417 417 compatible = "ti,divider-clock"; 418 418 clocks = <&dpll4_ck>; 419 - ti,max-div = <32>; 419 + ti,max-div = <16>; 420 420 reg = <0x0e40>; 421 421 ti,index-starts-at-one; 422 422 };
+7
drivers/clk/Kconfig
··· 136 136 This driver supports Silicon Labs 570/571/598/599 programmable 137 137 clock generators. 138 138 139 + config COMMON_CLK_BM1880 140 + bool "Clock driver for Bitmain BM1880 SoC" 141 + depends on ARCH_BITMAIN || COMPILE_TEST 142 + default ARCH_BITMAIN 143 + help 144 + This driver supports the clocks on Bitmain BM1880 SoC. 145 + 139 146 config COMMON_CLK_CDCE706 140 147 tristate "Clock driver for TI CDCE706 clock synthesizer" 141 148 depends on I2C
+1
drivers/clk/Makefile
··· 22 22 obj-$(CONFIG_COMMON_CLK_AXI_CLKGEN) += clk-axi-clkgen.o 23 23 obj-$(CONFIG_ARCH_AXXIA) += clk-axm5516.o 24 24 obj-$(CONFIG_COMMON_CLK_BD718XX) += clk-bd718x7.o 25 + obj-$(CONFIG_COMMON_CLK_BM1880) += clk-bm1880.o 25 26 obj-$(CONFIG_COMMON_CLK_CDCE706) += clk-cdce706.o 26 27 obj-$(CONFIG_COMMON_CLK_CDCE925) += clk-cdce925.o 27 28 obj-$(CONFIG_ARCH_CLPS711X) += clk-clps711x.o
+1 -2
drivers/clk/at91/sckc.c
··· 487 487 if (IS_ERR(slow_osc)) 488 488 goto unregister_slow_rc; 489 489 490 - clk_data = kzalloc(sizeof(*clk_data) + (2 * sizeof(struct clk_hw *)), 491 - GFP_KERNEL); 490 + clk_data = kzalloc(struct_size(clk_data, hws, 2), GFP_KERNEL); 492 491 if (!clk_data) 493 492 goto unregister_slow_osc; 494 493
+1 -3
drivers/clk/axs10x/i2s_pll_clock.c
··· 172 172 struct clk *clk; 173 173 struct i2s_pll_clk *pll_clk; 174 174 struct clk_init_data init; 175 - struct resource *mem; 176 175 177 176 pll_clk = devm_kzalloc(dev, sizeof(*pll_clk), GFP_KERNEL); 178 177 if (!pll_clk) 179 178 return -ENOMEM; 180 179 181 - mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 182 - pll_clk->base = devm_ioremap_resource(dev, mem); 180 + pll_clk->base = devm_platform_ioremap_resource(pdev, 0); 183 181 if (IS_ERR(pll_clk->base)) 184 182 return PTR_ERR(pll_clk->base); 185 183
+2 -5
drivers/clk/axs10x/pll_clock.c
··· 221 221 struct device *dev = &pdev->dev; 222 222 const char *parent_name; 223 223 struct axs10x_pll_clk *pll_clk; 224 - struct resource *mem; 225 224 struct clk_init_data init = { }; 226 225 int ret; 227 226 ··· 228 229 if (!pll_clk) 229 230 return -ENOMEM; 230 231 231 - mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 232 - pll_clk->base = devm_ioremap_resource(dev, mem); 232 + pll_clk->base = devm_platform_ioremap_resource(pdev, 0); 233 233 if (IS_ERR(pll_clk->base)) 234 234 return PTR_ERR(pll_clk->base); 235 235 236 - mem = platform_get_resource(pdev, IORESOURCE_MEM, 1); 237 - pll_clk->lock = devm_ioremap_resource(dev, mem); 236 + pll_clk->lock = devm_platform_ioremap_resource(pdev, 1); 238 237 if (IS_ERR(pll_clk->lock)) 239 238 return PTR_ERR(pll_clk->lock); 240 239
+1 -3
drivers/clk/bcm/clk-bcm2835-aux.c
··· 19 19 struct clk_hw_onecell_data *onecell; 20 20 const char *parent; 21 21 struct clk *parent_clk; 22 - struct resource *res; 23 22 void __iomem *reg, *gate; 24 23 25 24 parent_clk = devm_clk_get(dev, NULL); ··· 26 27 return PTR_ERR(parent_clk); 27 28 parent = __clk_get_name(parent_clk); 28 29 29 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 30 - reg = devm_ioremap_resource(dev, res); 30 + reg = devm_platform_ioremap_resource(pdev, 0); 31 31 if (IS_ERR(reg)) 32 32 return PTR_ERR(reg); 33 33
+1 -3
drivers/clk/bcm/clk-bcm2835.c
··· 2192 2192 struct device *dev = &pdev->dev; 2193 2193 struct clk_hw **hws; 2194 2194 struct bcm2835_cprman *cprman; 2195 - struct resource *res; 2196 2195 const struct bcm2835_clk_desc *desc; 2197 2196 const size_t asize = ARRAY_SIZE(clk_desc_array); 2198 2197 const struct cprman_plat_data *pdata; ··· 2210 2211 2211 2212 spin_lock_init(&cprman->regs_lock); 2212 2213 cprman->dev = dev; 2213 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 2214 - cprman->regs = devm_ioremap_resource(dev, res); 2214 + cprman->regs = devm_platform_ioremap_resource(pdev, 0); 2215 2215 if (IS_ERR(cprman->regs)) 2216 2216 return PTR_ERR(cprman->regs); 2217 2217
+26 -1
drivers/clk/clk-aspeed.c
··· 14 14 15 15 #include "clk-aspeed.h" 16 16 17 - #define ASPEED_NUM_CLKS 36 17 + #define ASPEED_NUM_CLKS 38 18 18 19 19 #define ASPEED_RESET2_OFFSET 32 20 20 ··· 28 28 #define AST2400_HPLL_BYPASS_EN BIT(17) 29 29 #define ASPEED_MISC_CTRL 0x2c 30 30 #define UART_DIV13_EN BIT(12) 31 + #define ASPEED_MAC_CLK_DLY 0x48 31 32 #define ASPEED_STRAP 0x70 32 33 #define CLKIN_25MHZ_EN BIT(23) 33 34 #define AST2400_CLK_SOURCE_SEL BIT(18) ··· 462 461 if (IS_ERR(hw)) 463 462 return PTR_ERR(hw); 464 463 aspeed_clk_data->hws[ASPEED_CLK_MAC] = hw; 464 + 465 + if (of_device_is_compatible(pdev->dev.of_node, "aspeed,ast2500-scu")) { 466 + /* RMII 50MHz RCLK */ 467 + hw = clk_hw_register_fixed_rate(dev, "mac12rclk", "hpll", 0, 468 + 50000000); 469 + if (IS_ERR(hw)) 470 + return PTR_ERR(hw); 471 + 472 + /* RMII1 50MHz (RCLK) output enable */ 473 + hw = clk_hw_register_gate(dev, "mac1rclk", "mac12rclk", 0, 474 + scu_base + ASPEED_MAC_CLK_DLY, 29, 0, 475 + &aspeed_clk_lock); 476 + if (IS_ERR(hw)) 477 + return PTR_ERR(hw); 478 + aspeed_clk_data->hws[ASPEED_CLK_MAC1RCLK] = hw; 479 + 480 + /* RMII2 50MHz (RCLK) output enable */ 481 + hw = clk_hw_register_gate(dev, "mac2rclk", "mac12rclk", 0, 482 + scu_base + ASPEED_MAC_CLK_DLY, 30, 0, 483 + &aspeed_clk_lock); 484 + if (IS_ERR(hw)) 485 + return PTR_ERR(hw); 486 + aspeed_clk_data->hws[ASPEED_CLK_MAC2RCLK] = hw; 487 + } 465 488 466 489 /* LPC Host (LHCLK) clock divider */ 467 490 hw = clk_hw_register_divider_table(dev, "lhclk", "hpll", 0,
+46 -3
drivers/clk/clk-ast2600.c
··· 15 15 16 16 #include "clk-aspeed.h" 17 17 18 - #define ASPEED_G6_NUM_CLKS 67 18 + #define ASPEED_G6_NUM_CLKS 71 19 19 20 20 #define ASPEED_G6_SILICON_REV 0x004 21 21 ··· 39 39 #define ASPEED_DPLL_PARAM 0x260 40 40 41 41 #define ASPEED_G6_STRAP1 0x500 42 + 43 + #define ASPEED_MAC12_CLK_DLY 0x340 44 + #define ASPEED_MAC34_CLK_DLY 0x350 42 45 43 46 /* Globally visible clocks */ 44 47 static DEFINE_SPINLOCK(aspeed_g6_clk_lock); ··· 118 115 [ASPEED_CLK_GATE_UART13CLK] = { 61, -1, "uart13clk-gate", "uartx", 0 }, /* UART13 */ 119 116 [ASPEED_CLK_GATE_FSICLK] = { 62, 59, "fsiclk-gate", NULL, 0 }, /* FSI */ 120 117 }; 121 - 122 - static const char * const eclk_parent_names[] = { "mpll", "hpll", "dpll" }; 123 118 124 119 static const struct clk_div_table ast2600_eclk_div_table[] = { 125 120 { 0x0, 2 }, ··· 487 486 return PTR_ERR(hw); 488 487 aspeed_g6_clk_data->hws[ASPEED_CLK_SDIO] = hw; 489 488 489 + /* MAC1/2 RMII 50MHz RCLK */ 490 + hw = clk_hw_register_fixed_rate(dev, "mac12rclk", "hpll", 0, 50000000); 491 + if (IS_ERR(hw)) 492 + return PTR_ERR(hw); 493 + 490 494 /* MAC1/2 AHB bus clock divider */ 491 495 hw = clk_hw_register_divider_table(dev, "mac12", "hpll", 0, 492 496 scu_g6_base + ASPEED_G6_CLK_SELECTION1, 16, 3, 0, ··· 501 495 return PTR_ERR(hw); 502 496 aspeed_g6_clk_data->hws[ASPEED_CLK_MAC12] = hw; 503 497 498 + /* RMII1 50MHz (RCLK) output enable */ 499 + hw = clk_hw_register_gate(dev, "mac1rclk", "mac12rclk", 0, 500 + scu_g6_base + ASPEED_MAC12_CLK_DLY, 29, 0, 501 + &aspeed_g6_clk_lock); 502 + if (IS_ERR(hw)) 503 + return PTR_ERR(hw); 504 + aspeed_g6_clk_data->hws[ASPEED_CLK_MAC1RCLK] = hw; 505 + 506 + /* RMII2 50MHz (RCLK) output enable */ 507 + hw = clk_hw_register_gate(dev, "mac2rclk", "mac12rclk", 0, 508 + scu_g6_base + ASPEED_MAC12_CLK_DLY, 30, 0, 509 + &aspeed_g6_clk_lock); 510 + if (IS_ERR(hw)) 511 + return PTR_ERR(hw); 512 + aspeed_g6_clk_data->hws[ASPEED_CLK_MAC2RCLK] = hw; 513 + 514 + /* MAC1/2 RMII 50MHz RCLK */ 515 + hw = clk_hw_register_fixed_rate(dev, "mac34rclk", "hclk", 0, 50000000); 516 + if (IS_ERR(hw)) 517 + return PTR_ERR(hw); 518 + 504 519 /* MAC3/4 AHB bus clock divider */ 505 520 hw = clk_hw_register_divider_table(dev, "mac34", "hpll", 0, 506 521 scu_g6_base + 0x310, 24, 3, 0, ··· 530 503 if (IS_ERR(hw)) 531 504 return PTR_ERR(hw); 532 505 aspeed_g6_clk_data->hws[ASPEED_CLK_MAC34] = hw; 506 + 507 + /* RMII3 50MHz (RCLK) output enable */ 508 + hw = clk_hw_register_gate(dev, "mac3rclk", "mac34rclk", 0, 509 + scu_g6_base + ASPEED_MAC34_CLK_DLY, 29, 0, 510 + &aspeed_g6_clk_lock); 511 + if (IS_ERR(hw)) 512 + return PTR_ERR(hw); 513 + aspeed_g6_clk_data->hws[ASPEED_CLK_MAC3RCLK] = hw; 514 + 515 + /* RMII4 50MHz (RCLK) output enable */ 516 + hw = clk_hw_register_gate(dev, "mac4rclk", "mac34rclk", 0, 517 + scu_g6_base + ASPEED_MAC34_CLK_DLY, 30, 0, 518 + &aspeed_g6_clk_lock); 519 + if (IS_ERR(hw)) 520 + return PTR_ERR(hw); 521 + aspeed_g6_clk_data->hws[ASPEED_CLK_MAC4RCLK] = hw; 533 522 534 523 /* LPC Host (LHCLK) clock divider */ 535 524 hw = clk_hw_register_divider_table(dev, "lhclk", "hpll", 0,
+1
drivers/clk/clk-bd718x7.c
··· 133 133 MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>"); 134 134 MODULE_DESCRIPTION("BD71837/BD71847/BD70528 chip clk driver"); 135 135 MODULE_LICENSE("GPL"); 136 + MODULE_ALIAS("platform:bd718xx-clk");
+969
drivers/clk/clk-bm1880.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* 3 + * Bitmain BM1880 SoC clock driver 4 + * 5 + * Copyright (c) 2019 Linaro Ltd. 6 + * Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 7 + */ 8 + 9 + #include <linux/clk-provider.h> 10 + #include <linux/kernel.h> 11 + #include <linux/module.h> 12 + #include <linux/of_address.h> 13 + #include <linux/of_device.h> 14 + #include <linux/platform_device.h> 15 + #include <linux/slab.h> 16 + 17 + #include <dt-bindings/clock/bm1880-clock.h> 18 + 19 + #define BM1880_CLK_MPLL_CTL 0x00 20 + #define BM1880_CLK_SPLL_CTL 0x04 21 + #define BM1880_CLK_FPLL_CTL 0x08 22 + #define BM1880_CLK_DDRPLL_CTL 0x0c 23 + 24 + #define BM1880_CLK_ENABLE0 0x00 25 + #define BM1880_CLK_ENABLE1 0x04 26 + #define BM1880_CLK_SELECT 0x20 27 + #define BM1880_CLK_DIV0 0x40 28 + #define BM1880_CLK_DIV1 0x44 29 + #define BM1880_CLK_DIV2 0x48 30 + #define BM1880_CLK_DIV3 0x4c 31 + #define BM1880_CLK_DIV4 0x50 32 + #define BM1880_CLK_DIV5 0x54 33 + #define BM1880_CLK_DIV6 0x58 34 + #define BM1880_CLK_DIV7 0x5c 35 + #define BM1880_CLK_DIV8 0x60 36 + #define BM1880_CLK_DIV9 0x64 37 + #define BM1880_CLK_DIV10 0x68 38 + #define BM1880_CLK_DIV11 0x6c 39 + #define BM1880_CLK_DIV12 0x70 40 + #define BM1880_CLK_DIV13 0x74 41 + #define BM1880_CLK_DIV14 0x78 42 + #define BM1880_CLK_DIV15 0x7c 43 + #define BM1880_CLK_DIV16 0x80 44 + #define BM1880_CLK_DIV17 0x84 45 + #define BM1880_CLK_DIV18 0x88 46 + #define BM1880_CLK_DIV19 0x8c 47 + #define BM1880_CLK_DIV20 0x90 48 + #define BM1880_CLK_DIV21 0x94 49 + #define BM1880_CLK_DIV22 0x98 50 + #define BM1880_CLK_DIV23 0x9c 51 + #define BM1880_CLK_DIV24 0xa0 52 + #define BM1880_CLK_DIV25 0xa4 53 + #define BM1880_CLK_DIV26 0xa8 54 + #define BM1880_CLK_DIV27 0xac 55 + #define BM1880_CLK_DIV28 0xb0 56 + 57 + #define to_bm1880_pll_clk(_hw) container_of(_hw, struct bm1880_pll_hw_clock, hw) 58 + #define to_bm1880_div_clk(_hw) container_of(_hw, struct bm1880_div_hw_clock, hw) 59 + 60 + static DEFINE_SPINLOCK(bm1880_clk_lock); 61 + 62 + struct bm1880_clock_data { 63 + void __iomem *pll_base; 64 + void __iomem *sys_base; 65 + struct clk_hw_onecell_data hw_data; 66 + }; 67 + 68 + struct bm1880_gate_clock { 69 + unsigned int id; 70 + const char *name; 71 + const char *parent; 72 + u32 gate_reg; 73 + s8 gate_shift; 74 + unsigned long flags; 75 + }; 76 + 77 + struct bm1880_mux_clock { 78 + unsigned int id; 79 + const char *name; 80 + const char * const *parents; 81 + s8 num_parents; 82 + u32 reg; 83 + s8 shift; 84 + unsigned long flags; 85 + }; 86 + 87 + struct bm1880_div_clock { 88 + unsigned int id; 89 + const char *name; 90 + u32 reg; 91 + u8 shift; 92 + u8 width; 93 + u32 initval; 94 + const struct clk_div_table *table; 95 + unsigned long flags; 96 + }; 97 + 98 + struct bm1880_div_hw_clock { 99 + struct bm1880_div_clock div; 100 + void __iomem *base; 101 + spinlock_t *lock; 102 + struct clk_hw hw; 103 + struct clk_init_data init; 104 + }; 105 + 106 + struct bm1880_composite_clock { 107 + unsigned int id; 108 + const char *name; 109 + const char *parent; 110 + const char * const *parents; 111 + unsigned int num_parents; 112 + unsigned long flags; 113 + 114 + u32 gate_reg; 115 + u32 mux_reg; 116 + u32 div_reg; 117 + 118 + s8 gate_shift; 119 + s8 mux_shift; 120 + s8 div_shift; 121 + s8 div_width; 122 + s16 div_initval; 123 + const struct clk_div_table *table; 124 + }; 125 + 126 + struct bm1880_pll_clock { 127 + unsigned int id; 128 + const char *name; 129 + u32 reg; 130 + unsigned long flags; 131 + }; 132 + 133 + struct bm1880_pll_hw_clock { 134 + struct bm1880_pll_clock pll; 135 + void __iomem *base; 136 + struct clk_hw hw; 137 + struct clk_init_data init; 138 + }; 139 + 140 + static const struct clk_ops bm1880_pll_ops; 141 + static const struct clk_ops bm1880_clk_div_ops; 142 + 143 + #define GATE_DIV(_id, _name, _parent, _gate_reg, _gate_shift, _div_reg, \ 144 + _div_shift, _div_width, _div_initval, _table, \ 145 + _flags) { \ 146 + .id = _id, \ 147 + .parent = _parent, \ 148 + .name = _name, \ 149 + .gate_reg = _gate_reg, \ 150 + .gate_shift = _gate_shift, \ 151 + .div_reg = _div_reg, \ 152 + .div_shift = _div_shift, \ 153 + .div_width = _div_width, \ 154 + .div_initval = _div_initval, \ 155 + .table = _table, \ 156 + .mux_shift = -1, \ 157 + .flags = _flags, \ 158 + } 159 + 160 + #define GATE_MUX(_id, _name, _parents, _gate_reg, _gate_shift, \ 161 + _mux_reg, _mux_shift, _flags) { \ 162 + .id = _id, \ 163 + .parents = _parents, \ 164 + .num_parents = ARRAY_SIZE(_parents), \ 165 + .name = _name, \ 166 + .gate_reg = _gate_reg, \ 167 + .gate_shift = _gate_shift, \ 168 + .div_shift = -1, \ 169 + .mux_reg = _mux_reg, \ 170 + .mux_shift = _mux_shift, \ 171 + .flags = _flags, \ 172 + } 173 + 174 + #define CLK_PLL(_id, _name, _parent, _reg, _flags) { \ 175 + .pll.id = _id, \ 176 + .pll.name = _name, \ 177 + .pll.reg = _reg, \ 178 + .hw.init = CLK_HW_INIT_PARENTS_DATA(_name, _parent, \ 179 + &bm1880_pll_ops, \ 180 + _flags), \ 181 + } 182 + 183 + #define CLK_DIV(_id, _name, _parent, _reg, _shift, _width, _initval, \ 184 + _table, _flags) { \ 185 + .div.id = _id, \ 186 + .div.name = _name, \ 187 + .div.reg = _reg, \ 188 + .div.shift = _shift, \ 189 + .div.width = _width, \ 190 + .div.initval = _initval, \ 191 + .div.table = _table, \ 192 + .hw.init = CLK_HW_INIT_HW(_name, _parent, \ 193 + &bm1880_clk_div_ops, \ 194 + _flags), \ 195 + } 196 + 197 + static struct clk_parent_data bm1880_pll_parent[] = { 198 + { .fw_name = "osc", .name = "osc" }, 199 + }; 200 + 201 + /* 202 + * All PLL clocks are marked as CRITICAL, hence they are very crucial 203 + * for the functioning of the SoC 204 + */ 205 + static struct bm1880_pll_hw_clock bm1880_pll_clks[] = { 206 + CLK_PLL(BM1880_CLK_MPLL, "clk_mpll", bm1880_pll_parent, 207 + BM1880_CLK_MPLL_CTL, 0), 208 + CLK_PLL(BM1880_CLK_SPLL, "clk_spll", bm1880_pll_parent, 209 + BM1880_CLK_SPLL_CTL, 0), 210 + CLK_PLL(BM1880_CLK_FPLL, "clk_fpll", bm1880_pll_parent, 211 + BM1880_CLK_FPLL_CTL, 0), 212 + CLK_PLL(BM1880_CLK_DDRPLL, "clk_ddrpll", bm1880_pll_parent, 213 + BM1880_CLK_DDRPLL_CTL, 0), 214 + }; 215 + 216 + /* 217 + * Clocks marked as CRITICAL are needed for the proper functioning 218 + * of the SoC. 219 + */ 220 + static const struct bm1880_gate_clock bm1880_gate_clks[] = { 221 + { BM1880_CLK_AHB_ROM, "clk_ahb_rom", "clk_mux_axi6", 222 + BM1880_CLK_ENABLE0, 2, 0 }, 223 + { BM1880_CLK_AXI_SRAM, "clk_axi_sram", "clk_axi1", 224 + BM1880_CLK_ENABLE0, 3, 0 }, 225 + /* 226 + * Since this clock is sourcing the DDR memory, let's mark it as 227 + * critical to avoid gating. 228 + */ 229 + { BM1880_CLK_DDR_AXI, "clk_ddr_axi", "clk_mux_axi6", 230 + BM1880_CLK_ENABLE0, 4, CLK_IS_CRITICAL }, 231 + { BM1880_CLK_APB_EFUSE, "clk_apb_efuse", "clk_mux_axi6", 232 + BM1880_CLK_ENABLE0, 6, 0 }, 233 + { BM1880_CLK_AXI5_EMMC, "clk_axi5_emmc", "clk_axi5", 234 + BM1880_CLK_ENABLE0, 7, 0 }, 235 + { BM1880_CLK_AXI5_SD, "clk_axi5_sd", "clk_axi5", 236 + BM1880_CLK_ENABLE0, 10, 0 }, 237 + { BM1880_CLK_AXI4_ETH0, "clk_axi4_eth0", "clk_axi4", 238 + BM1880_CLK_ENABLE0, 14, 0 }, 239 + { BM1880_CLK_AXI4_ETH1, "clk_axi4_eth1", "clk_axi4", 240 + BM1880_CLK_ENABLE0, 16, 0 }, 241 + { BM1880_CLK_AXI1_GDMA, "clk_axi1_gdma", "clk_axi1", 242 + BM1880_CLK_ENABLE0, 17, 0 }, 243 + /* Don't gate GPIO clocks as it is not owned by the GPIO driver */ 244 + { BM1880_CLK_APB_GPIO, "clk_apb_gpio", "clk_mux_axi6", 245 + BM1880_CLK_ENABLE0, 18, CLK_IGNORE_UNUSED }, 246 + { BM1880_CLK_APB_GPIO_INTR, "clk_apb_gpio_intr", "clk_mux_axi6", 247 + BM1880_CLK_ENABLE0, 19, CLK_IGNORE_UNUSED }, 248 + { BM1880_CLK_AXI1_MINER, "clk_axi1_miner", "clk_axi1", 249 + BM1880_CLK_ENABLE0, 21, 0 }, 250 + { BM1880_CLK_AHB_SF, "clk_ahb_sf", "clk_mux_axi6", 251 + BM1880_CLK_ENABLE0, 22, 0 }, 252 + /* 253 + * Not sure which module this clock is sourcing but gating this clock 254 + * prevents the system from booting. So, let's mark it as critical. 255 + */ 256 + { BM1880_CLK_SDMA_AXI, "clk_sdma_axi", "clk_axi5", 257 + BM1880_CLK_ENABLE0, 23, CLK_IS_CRITICAL }, 258 + { BM1880_CLK_APB_I2C, "clk_apb_i2c", "clk_mux_axi6", 259 + BM1880_CLK_ENABLE0, 25, 0 }, 260 + { BM1880_CLK_APB_WDT, "clk_apb_wdt", "clk_mux_axi6", 261 + BM1880_CLK_ENABLE0, 26, 0 }, 262 + { BM1880_CLK_APB_JPEG, "clk_apb_jpeg", "clk_axi6", 263 + BM1880_CLK_ENABLE0, 27, 0 }, 264 + { BM1880_CLK_AXI5_NF, "clk_axi5_nf", "clk_axi5", 265 + BM1880_CLK_ENABLE0, 29, 0 }, 266 + { BM1880_CLK_APB_NF, "clk_apb_nf", "clk_axi6", 267 + BM1880_CLK_ENABLE0, 30, 0 }, 268 + { BM1880_CLK_APB_PWM, "clk_apb_pwm", "clk_mux_axi6", 269 + BM1880_CLK_ENABLE1, 0, 0 }, 270 + { BM1880_CLK_RV, "clk_rv", "clk_mux_rv", 271 + BM1880_CLK_ENABLE1, 1, 0 }, 272 + { BM1880_CLK_APB_SPI, "clk_apb_spi", "clk_mux_axi6", 273 + BM1880_CLK_ENABLE1, 2, 0 }, 274 + { BM1880_CLK_UART_500M, "clk_uart_500m", "clk_div_uart_500m", 275 + BM1880_CLK_ENABLE1, 4, 0 }, 276 + { BM1880_CLK_APB_UART, "clk_apb_uart", "clk_axi6", 277 + BM1880_CLK_ENABLE1, 5, 0 }, 278 + { BM1880_CLK_APB_I2S, "clk_apb_i2s", "clk_axi6", 279 + BM1880_CLK_ENABLE1, 6, 0 }, 280 + { BM1880_CLK_AXI4_USB, "clk_axi4_usb", "clk_axi4", 281 + BM1880_CLK_ENABLE1, 7, 0 }, 282 + { BM1880_CLK_APB_USB, "clk_apb_usb", "clk_axi6", 283 + BM1880_CLK_ENABLE1, 8, 0 }, 284 + { BM1880_CLK_12M_USB, "clk_12m_usb", "clk_div_12m_usb", 285 + BM1880_CLK_ENABLE1, 11, 0 }, 286 + { BM1880_CLK_APB_VIDEO, "clk_apb_video", "clk_axi6", 287 + BM1880_CLK_ENABLE1, 12, 0 }, 288 + { BM1880_CLK_APB_VPP, "clk_apb_vpp", "clk_axi6", 289 + BM1880_CLK_ENABLE1, 15, 0 }, 290 + { BM1880_CLK_AXI6, "clk_axi6", "clk_mux_axi6", 291 + BM1880_CLK_ENABLE1, 21, 0 }, 292 + }; 293 + 294 + static const char * const clk_a53_parents[] = { "clk_spll", "clk_mpll" }; 295 + static const char * const clk_rv_parents[] = { "clk_div_1_rv", "clk_div_0_rv" }; 296 + static const char * const clk_axi1_parents[] = { "clk_div_1_axi1", "clk_div_0_axi1" }; 297 + static const char * const clk_axi6_parents[] = { "clk_div_1_axi6", "clk_div_0_axi6" }; 298 + 299 + static const struct bm1880_mux_clock bm1880_mux_clks[] = { 300 + { BM1880_CLK_MUX_RV, "clk_mux_rv", clk_rv_parents, 2, 301 + BM1880_CLK_SELECT, 1, 0 }, 302 + { BM1880_CLK_MUX_AXI6, "clk_mux_axi6", clk_axi6_parents, 2, 303 + BM1880_CLK_SELECT, 3, 0 }, 304 + }; 305 + 306 + static const struct clk_div_table bm1880_div_table_0[] = { 307 + { 0, 1 }, { 1, 2 }, { 2, 3 }, { 3, 4 }, 308 + { 4, 5 }, { 5, 6 }, { 6, 7 }, { 7, 8 }, 309 + { 8, 9 }, { 9, 10 }, { 10, 11 }, { 11, 12 }, 310 + { 12, 13 }, { 13, 14 }, { 14, 15 }, { 15, 16 }, 311 + { 16, 17 }, { 17, 18 }, { 18, 19 }, { 19, 20 }, 312 + { 20, 21 }, { 21, 22 }, { 22, 23 }, { 23, 24 }, 313 + { 24, 25 }, { 25, 26 }, { 26, 27 }, { 27, 28 }, 314 + { 28, 29 }, { 29, 30 }, { 30, 31 }, { 31, 32 }, 315 + { 0, 0 } 316 + }; 317 + 318 + static const struct clk_div_table bm1880_div_table_1[] = { 319 + { 0, 1 }, { 1, 2 }, { 2, 3 }, { 3, 4 }, 320 + { 4, 5 }, { 5, 6 }, { 6, 7 }, { 7, 8 }, 321 + { 8, 9 }, { 9, 10 }, { 10, 11 }, { 11, 12 }, 322 + { 12, 13 }, { 13, 14 }, { 14, 15 }, { 15, 16 }, 323 + { 16, 17 }, { 17, 18 }, { 18, 19 }, { 19, 20 }, 324 + { 20, 21 }, { 21, 22 }, { 22, 23 }, { 23, 24 }, 325 + { 24, 25 }, { 25, 26 }, { 26, 27 }, { 27, 28 }, 326 + { 28, 29 }, { 29, 30 }, { 30, 31 }, { 31, 32 }, 327 + { 127, 128 }, { 0, 0 } 328 + }; 329 + 330 + static const struct clk_div_table bm1880_div_table_2[] = { 331 + { 0, 1 }, { 1, 2 }, { 2, 3 }, { 3, 4 }, 332 + { 4, 5 }, { 5, 6 }, { 6, 7 }, { 7, 8 }, 333 + { 8, 9 }, { 9, 10 }, { 10, 11 }, { 11, 12 }, 334 + { 12, 13 }, { 13, 14 }, { 14, 15 }, { 15, 16 }, 335 + { 16, 17 }, { 17, 18 }, { 18, 19 }, { 19, 20 }, 336 + { 20, 21 }, { 21, 22 }, { 22, 23 }, { 23, 24 }, 337 + { 24, 25 }, { 25, 26 }, { 26, 27 }, { 27, 28 }, 338 + { 28, 29 }, { 29, 30 }, { 30, 31 }, { 31, 32 }, 339 + { 127, 128 }, { 255, 256 }, { 0, 0 } 340 + }; 341 + 342 + static const struct clk_div_table bm1880_div_table_3[] = { 343 + { 0, 1 }, { 1, 2 }, { 2, 3 }, { 3, 4 }, 344 + { 4, 5 }, { 5, 6 }, { 6, 7 }, { 7, 8 }, 345 + { 8, 9 }, { 9, 10 }, { 10, 11 }, { 11, 12 }, 346 + { 12, 13 }, { 13, 14 }, { 14, 15 }, { 15, 16 }, 347 + { 16, 17 }, { 17, 18 }, { 18, 19 }, { 19, 20 }, 348 + { 20, 21 }, { 21, 22 }, { 22, 23 }, { 23, 24 }, 349 + { 24, 25 }, { 25, 26 }, { 26, 27 }, { 27, 28 }, 350 + { 28, 29 }, { 29, 30 }, { 30, 31 }, { 31, 32 }, 351 + { 127, 128 }, { 255, 256 }, { 511, 512 }, { 0, 0 } 352 + }; 353 + 354 + static const struct clk_div_table bm1880_div_table_4[] = { 355 + { 0, 1 }, { 1, 2 }, { 2, 3 }, { 3, 4 }, 356 + { 4, 5 }, { 5, 6 }, { 6, 7 }, { 7, 8 }, 357 + { 8, 9 }, { 9, 10 }, { 10, 11 }, { 11, 12 }, 358 + { 12, 13 }, { 13, 14 }, { 14, 15 }, { 15, 16 }, 359 + { 16, 17 }, { 17, 18 }, { 18, 19 }, { 19, 20 }, 360 + { 20, 21 }, { 21, 22 }, { 22, 23 }, { 23, 24 }, 361 + { 24, 25 }, { 25, 26 }, { 26, 27 }, { 27, 28 }, 362 + { 28, 29 }, { 29, 30 }, { 30, 31 }, { 31, 32 }, 363 + { 127, 128 }, { 255, 256 }, { 511, 512 }, { 65535, 65536 }, 364 + { 0, 0 } 365 + }; 366 + 367 + /* 368 + * Clocks marked as CRITICAL are needed for the proper functioning 369 + * of the SoC. 370 + */ 371 + static struct bm1880_div_hw_clock bm1880_div_clks[] = { 372 + CLK_DIV(BM1880_CLK_DIV_0_RV, "clk_div_0_rv", &bm1880_pll_clks[1].hw, 373 + BM1880_CLK_DIV12, 16, 5, 1, bm1880_div_table_0, 0), 374 + CLK_DIV(BM1880_CLK_DIV_1_RV, "clk_div_1_rv", &bm1880_pll_clks[2].hw, 375 + BM1880_CLK_DIV13, 16, 5, 1, bm1880_div_table_0, 0), 376 + CLK_DIV(BM1880_CLK_DIV_UART_500M, "clk_div_uart_500m", &bm1880_pll_clks[2].hw, 377 + BM1880_CLK_DIV15, 16, 7, 3, bm1880_div_table_1, 0), 378 + CLK_DIV(BM1880_CLK_DIV_0_AXI1, "clk_div_0_axi1", &bm1880_pll_clks[0].hw, 379 + BM1880_CLK_DIV21, 16, 5, 2, bm1880_div_table_0, 380 + 0), 381 + CLK_DIV(BM1880_CLK_DIV_1_AXI1, "clk_div_1_axi1", &bm1880_pll_clks[2].hw, 382 + BM1880_CLK_DIV22, 16, 5, 3, bm1880_div_table_0, 383 + 0), 384 + CLK_DIV(BM1880_CLK_DIV_0_AXI6, "clk_div_0_axi6", &bm1880_pll_clks[2].hw, 385 + BM1880_CLK_DIV27, 16, 5, 15, bm1880_div_table_0, 386 + 0), 387 + CLK_DIV(BM1880_CLK_DIV_1_AXI6, "clk_div_1_axi6", &bm1880_pll_clks[0].hw, 388 + BM1880_CLK_DIV28, 16, 5, 11, bm1880_div_table_0, 389 + 0), 390 + CLK_DIV(BM1880_CLK_DIV_12M_USB, "clk_div_12m_usb", &bm1880_pll_clks[2].hw, 391 + BM1880_CLK_DIV18, 16, 7, 125, bm1880_div_table_1, 0), 392 + }; 393 + 394 + /* 395 + * Clocks marked as CRITICAL are all needed for the proper functioning 396 + * of the SoC. 397 + */ 398 + static struct bm1880_composite_clock bm1880_composite_clks[] = { 399 + /* 400 + * Since clk_a53 and clk_50m_a53 clocks are sourcing the CPU core, 401 + * let's mark them as critical to avoid gating. 402 + */ 403 + GATE_MUX(BM1880_CLK_A53, "clk_a53", clk_a53_parents, 404 + BM1880_CLK_ENABLE0, 0, BM1880_CLK_SELECT, 0, 405 + CLK_IS_CRITICAL), 406 + GATE_DIV(BM1880_CLK_50M_A53, "clk_50m_a53", "clk_fpll", 407 + BM1880_CLK_ENABLE0, 1, BM1880_CLK_DIV0, 16, 5, 30, 408 + bm1880_div_table_0, CLK_IS_CRITICAL), 409 + GATE_DIV(BM1880_CLK_EFUSE, "clk_efuse", "clk_fpll", 410 + BM1880_CLK_ENABLE0, 5, BM1880_CLK_DIV1, 16, 7, 60, 411 + bm1880_div_table_1, 0), 412 + GATE_DIV(BM1880_CLK_EMMC, "clk_emmc", "clk_fpll", 413 + BM1880_CLK_ENABLE0, 8, BM1880_CLK_DIV2, 16, 5, 15, 414 + bm1880_div_table_0, 0), 415 + GATE_DIV(BM1880_CLK_100K_EMMC, "clk_100k_emmc", "clk_div_12m_usb", 416 + BM1880_CLK_ENABLE0, 9, BM1880_CLK_DIV3, 16, 8, 120, 417 + bm1880_div_table_2, 0), 418 + GATE_DIV(BM1880_CLK_SD, "clk_sd", "clk_fpll", 419 + BM1880_CLK_ENABLE0, 11, BM1880_CLK_DIV4, 16, 5, 15, 420 + bm1880_div_table_0, 0), 421 + GATE_DIV(BM1880_CLK_100K_SD, "clk_100k_sd", "clk_div_12m_usb", 422 + BM1880_CLK_ENABLE0, 12, BM1880_CLK_DIV5, 16, 8, 120, 423 + bm1880_div_table_2, 0), 424 + GATE_DIV(BM1880_CLK_500M_ETH0, "clk_500m_eth0", "clk_fpll", 425 + BM1880_CLK_ENABLE0, 13, BM1880_CLK_DIV6, 16, 5, 3, 426 + bm1880_div_table_0, 0), 427 + GATE_DIV(BM1880_CLK_500M_ETH1, "clk_500m_eth1", "clk_fpll", 428 + BM1880_CLK_ENABLE0, 15, BM1880_CLK_DIV7, 16, 5, 3, 429 + bm1880_div_table_0, 0), 430 + /* Don't gate GPIO clocks as it is not owned by the GPIO driver */ 431 + GATE_DIV(BM1880_CLK_GPIO_DB, "clk_gpio_db", "clk_div_12m_usb", 432 + BM1880_CLK_ENABLE0, 20, BM1880_CLK_DIV8, 16, 16, 120, 433 + bm1880_div_table_4, CLK_IGNORE_UNUSED), 434 + GATE_DIV(BM1880_CLK_SDMA_AUD, "clk_sdma_aud", "clk_fpll", 435 + BM1880_CLK_ENABLE0, 24, BM1880_CLK_DIV9, 16, 7, 61, 436 + bm1880_div_table_1, 0), 437 + GATE_DIV(BM1880_CLK_JPEG_AXI, "clk_jpeg_axi", "clk_fpll", 438 + BM1880_CLK_ENABLE0, 28, BM1880_CLK_DIV10, 16, 5, 4, 439 + bm1880_div_table_0, 0), 440 + GATE_DIV(BM1880_CLK_NF, "clk_nf", "clk_fpll", 441 + BM1880_CLK_ENABLE0, 31, BM1880_CLK_DIV11, 16, 5, 30, 442 + bm1880_div_table_0, 0), 443 + GATE_DIV(BM1880_CLK_TPU_AXI, "clk_tpu_axi", "clk_spll", 444 + BM1880_CLK_ENABLE1, 3, BM1880_CLK_DIV14, 16, 5, 1, 445 + bm1880_div_table_0, 0), 446 + GATE_DIV(BM1880_CLK_125M_USB, "clk_125m_usb", "clk_fpll", 447 + BM1880_CLK_ENABLE1, 9, BM1880_CLK_DIV16, 16, 5, 12, 448 + bm1880_div_table_0, 0), 449 + GATE_DIV(BM1880_CLK_33K_USB, "clk_33k_usb", "clk_div_12m_usb", 450 + BM1880_CLK_ENABLE1, 10, BM1880_CLK_DIV17, 16, 9, 363, 451 + bm1880_div_table_3, 0), 452 + GATE_DIV(BM1880_CLK_VIDEO_AXI, "clk_video_axi", "clk_fpll", 453 + BM1880_CLK_ENABLE1, 13, BM1880_CLK_DIV19, 16, 5, 4, 454 + bm1880_div_table_0, 0), 455 + GATE_DIV(BM1880_CLK_VPP_AXI, "clk_vpp_axi", "clk_fpll", 456 + BM1880_CLK_ENABLE1, 14, BM1880_CLK_DIV20, 16, 5, 4, 457 + bm1880_div_table_0, 0), 458 + GATE_MUX(BM1880_CLK_AXI1, "clk_axi1", clk_axi1_parents, 459 + BM1880_CLK_ENABLE1, 15, BM1880_CLK_SELECT, 2, 0), 460 + GATE_DIV(BM1880_CLK_AXI2, "clk_axi2", "clk_fpll", 461 + BM1880_CLK_ENABLE1, 17, BM1880_CLK_DIV23, 16, 5, 3, 462 + bm1880_div_table_0, 0), 463 + GATE_DIV(BM1880_CLK_AXI3, "clk_axi3", "clk_mux_rv", 464 + BM1880_CLK_ENABLE1, 18, BM1880_CLK_DIV24, 16, 5, 2, 465 + bm1880_div_table_0, 0), 466 + GATE_DIV(BM1880_CLK_AXI4, "clk_axi4", "clk_fpll", 467 + BM1880_CLK_ENABLE1, 19, BM1880_CLK_DIV25, 16, 5, 6, 468 + bm1880_div_table_0, 0), 469 + GATE_DIV(BM1880_CLK_AXI5, "clk_axi5", "clk_fpll", 470 + BM1880_CLK_ENABLE1, 20, BM1880_CLK_DIV26, 16, 5, 15, 471 + bm1880_div_table_0, 0), 472 + }; 473 + 474 + static unsigned long bm1880_pll_rate_calc(u32 regval, unsigned long parent_rate) 475 + { 476 + u64 numerator; 477 + u32 fbdiv, fref, refdiv; 478 + u32 postdiv1, postdiv2, denominator; 479 + 480 + fbdiv = (regval >> 16) & 0xfff; 481 + fref = parent_rate; 482 + refdiv = regval & 0x1f; 483 + postdiv1 = (regval >> 8) & 0x7; 484 + postdiv2 = (regval >> 12) & 0x7; 485 + 486 + numerator = parent_rate * fbdiv; 487 + denominator = refdiv * postdiv1 * postdiv2; 488 + do_div(numerator, denominator); 489 + 490 + return (unsigned long)numerator; 491 + } 492 + 493 + static unsigned long bm1880_pll_recalc_rate(struct clk_hw *hw, 494 + unsigned long parent_rate) 495 + { 496 + struct bm1880_pll_hw_clock *pll_hw = to_bm1880_pll_clk(hw); 497 + unsigned long rate; 498 + u32 regval; 499 + 500 + regval = readl(pll_hw->base + pll_hw->pll.reg); 501 + rate = bm1880_pll_rate_calc(regval, parent_rate); 502 + 503 + return rate; 504 + } 505 + 506 + static const struct clk_ops bm1880_pll_ops = { 507 + .recalc_rate = bm1880_pll_recalc_rate, 508 + }; 509 + 510 + static struct clk_hw *bm1880_clk_register_pll(struct bm1880_pll_hw_clock *pll_clk, 511 + void __iomem *sys_base) 512 + { 513 + struct clk_hw *hw; 514 + int err; 515 + 516 + pll_clk->base = sys_base; 517 + hw = &pll_clk->hw; 518 + 519 + err = clk_hw_register(NULL, hw); 520 + if (err) 521 + return ERR_PTR(err); 522 + 523 + return hw; 524 + } 525 + 526 + static void bm1880_clk_unregister_pll(struct clk_hw *hw) 527 + { 528 + struct bm1880_pll_hw_clock *pll_hw = to_bm1880_pll_clk(hw); 529 + 530 + clk_hw_unregister(hw); 531 + kfree(pll_hw); 532 + } 533 + 534 + static int bm1880_clk_register_plls(struct bm1880_pll_hw_clock *clks, 535 + int num_clks, 536 + struct bm1880_clock_data *data) 537 + { 538 + struct clk_hw *hw; 539 + void __iomem *pll_base = data->pll_base; 540 + int i; 541 + 542 + for (i = 0; i < num_clks; i++) { 543 + struct bm1880_pll_hw_clock *bm1880_clk = &clks[i]; 544 + 545 + hw = bm1880_clk_register_pll(bm1880_clk, pll_base); 546 + if (IS_ERR(hw)) { 547 + pr_err("%s: failed to register clock %s\n", 548 + __func__, bm1880_clk->pll.name); 549 + goto err_clk; 550 + } 551 + 552 + data->hw_data.hws[clks[i].pll.id] = hw; 553 + } 554 + 555 + return 0; 556 + 557 + err_clk: 558 + while (i--) 559 + bm1880_clk_unregister_pll(data->hw_data.hws[clks[i].pll.id]); 560 + 561 + return PTR_ERR(hw); 562 + } 563 + 564 + static int bm1880_clk_register_mux(const struct bm1880_mux_clock *clks, 565 + int num_clks, 566 + struct bm1880_clock_data *data) 567 + { 568 + struct clk_hw *hw; 569 + void __iomem *sys_base = data->sys_base; 570 + int i; 571 + 572 + for (i = 0; i < num_clks; i++) { 573 + hw = clk_hw_register_mux(NULL, clks[i].name, 574 + clks[i].parents, 575 + clks[i].num_parents, 576 + clks[i].flags, 577 + sys_base + clks[i].reg, 578 + clks[i].shift, 1, 0, 579 + &bm1880_clk_lock); 580 + if (IS_ERR(hw)) { 581 + pr_err("%s: failed to register clock %s\n", 582 + __func__, clks[i].name); 583 + goto err_clk; 584 + } 585 + 586 + data->hw_data.hws[clks[i].id] = hw; 587 + } 588 + 589 + return 0; 590 + 591 + err_clk: 592 + while (i--) 593 + clk_hw_unregister_mux(data->hw_data.hws[clks[i].id]); 594 + 595 + return PTR_ERR(hw); 596 + } 597 + 598 + static unsigned long bm1880_clk_div_recalc_rate(struct clk_hw *hw, 599 + unsigned long parent_rate) 600 + { 601 + struct bm1880_div_hw_clock *div_hw = to_bm1880_div_clk(hw); 602 + struct bm1880_div_clock *div = &div_hw->div; 603 + void __iomem *reg_addr = div_hw->base + div->reg; 604 + unsigned int val; 605 + unsigned long rate; 606 + 607 + if (!(readl(reg_addr) & BIT(3))) { 608 + val = div->initval; 609 + } else { 610 + val = readl(reg_addr) >> div->shift; 611 + val &= clk_div_mask(div->width); 612 + } 613 + 614 + rate = divider_recalc_rate(hw, parent_rate, val, div->table, 615 + div->flags, div->width); 616 + 617 + return rate; 618 + } 619 + 620 + static long bm1880_clk_div_round_rate(struct clk_hw *hw, unsigned long rate, 621 + unsigned long *prate) 622 + { 623 + struct bm1880_div_hw_clock *div_hw = to_bm1880_div_clk(hw); 624 + struct bm1880_div_clock *div = &div_hw->div; 625 + void __iomem *reg_addr = div_hw->base + div->reg; 626 + 627 + if (div->flags & CLK_DIVIDER_READ_ONLY) { 628 + u32 val; 629 + 630 + val = readl(reg_addr) >> div->shift; 631 + val &= clk_div_mask(div->width); 632 + 633 + return divider_ro_round_rate(hw, rate, prate, div->table, 634 + div->width, div->flags, 635 + val); 636 + } 637 + 638 + return divider_round_rate(hw, rate, prate, div->table, 639 + div->width, div->flags); 640 + } 641 + 642 + static int bm1880_clk_div_set_rate(struct clk_hw *hw, unsigned long rate, 643 + unsigned long parent_rate) 644 + { 645 + struct bm1880_div_hw_clock *div_hw = to_bm1880_div_clk(hw); 646 + struct bm1880_div_clock *div = &div_hw->div; 647 + void __iomem *reg_addr = div_hw->base + div->reg; 648 + unsigned long flags = 0; 649 + int value; 650 + u32 val; 651 + 652 + value = divider_get_val(rate, parent_rate, div->table, 653 + div->width, div_hw->div.flags); 654 + if (value < 0) 655 + return value; 656 + 657 + if (div_hw->lock) 658 + spin_lock_irqsave(div_hw->lock, flags); 659 + else 660 + __acquire(div_hw->lock); 661 + 662 + val = readl(reg_addr); 663 + val &= ~(clk_div_mask(div->width) << div_hw->div.shift); 664 + val |= (u32)value << div->shift; 665 + writel(val, reg_addr); 666 + 667 + if (div_hw->lock) 668 + spin_unlock_irqrestore(div_hw->lock, flags); 669 + else 670 + __release(div_hw->lock); 671 + 672 + return 0; 673 + } 674 + 675 + static const struct clk_ops bm1880_clk_div_ops = { 676 + .recalc_rate = bm1880_clk_div_recalc_rate, 677 + .round_rate = bm1880_clk_div_round_rate, 678 + .set_rate = bm1880_clk_div_set_rate, 679 + }; 680 + 681 + static struct clk_hw *bm1880_clk_register_div(struct bm1880_div_hw_clock *div_clk, 682 + void __iomem *sys_base) 683 + { 684 + struct clk_hw *hw; 685 + int err; 686 + 687 + div_clk->div.flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO; 688 + div_clk->base = sys_base; 689 + div_clk->lock = &bm1880_clk_lock; 690 + 691 + hw = &div_clk->hw; 692 + err = clk_hw_register(NULL, hw); 693 + if (err) 694 + return ERR_PTR(err); 695 + 696 + return hw; 697 + } 698 + 699 + static void bm1880_clk_unregister_div(struct clk_hw *hw) 700 + { 701 + struct bm1880_div_hw_clock *div_hw = to_bm1880_div_clk(hw); 702 + 703 + clk_hw_unregister(hw); 704 + kfree(div_hw); 705 + } 706 + 707 + static int bm1880_clk_register_divs(struct bm1880_div_hw_clock *clks, 708 + int num_clks, 709 + struct bm1880_clock_data *data) 710 + { 711 + struct clk_hw *hw; 712 + void __iomem *sys_base = data->sys_base; 713 + unsigned int i, id; 714 + 715 + for (i = 0; i < num_clks; i++) { 716 + struct bm1880_div_hw_clock *bm1880_clk = &clks[i]; 717 + 718 + hw = bm1880_clk_register_div(bm1880_clk, sys_base); 719 + if (IS_ERR(hw)) { 720 + pr_err("%s: failed to register clock %s\n", 721 + __func__, bm1880_clk->div.name); 722 + goto err_clk; 723 + } 724 + 725 + id = clks[i].div.id; 726 + data->hw_data.hws[id] = hw; 727 + } 728 + 729 + return 0; 730 + 731 + err_clk: 732 + while (i--) 733 + bm1880_clk_unregister_div(data->hw_data.hws[clks[i].div.id]); 734 + 735 + return PTR_ERR(hw); 736 + } 737 + 738 + static int bm1880_clk_register_gate(const struct bm1880_gate_clock *clks, 739 + int num_clks, 740 + struct bm1880_clock_data *data) 741 + { 742 + struct clk_hw *hw; 743 + void __iomem *sys_base = data->sys_base; 744 + int i; 745 + 746 + for (i = 0; i < num_clks; i++) { 747 + hw = clk_hw_register_gate(NULL, clks[i].name, 748 + clks[i].parent, 749 + clks[i].flags, 750 + sys_base + clks[i].gate_reg, 751 + clks[i].gate_shift, 0, 752 + &bm1880_clk_lock); 753 + if (IS_ERR(hw)) { 754 + pr_err("%s: failed to register clock %s\n", 755 + __func__, clks[i].name); 756 + goto err_clk; 757 + } 758 + 759 + data->hw_data.hws[clks[i].id] = hw; 760 + } 761 + 762 + return 0; 763 + 764 + err_clk: 765 + while (i--) 766 + clk_hw_unregister_gate(data->hw_data.hws[clks[i].id]); 767 + 768 + return PTR_ERR(hw); 769 + } 770 + 771 + static struct clk_hw *bm1880_clk_register_composite(struct bm1880_composite_clock *clks, 772 + void __iomem *sys_base) 773 + { 774 + struct clk_hw *hw; 775 + struct clk_mux *mux = NULL; 776 + struct clk_gate *gate = NULL; 777 + struct bm1880_div_hw_clock *div_hws = NULL; 778 + struct clk_hw *mux_hw = NULL, *gate_hw = NULL, *div_hw = NULL; 779 + const struct clk_ops *mux_ops = NULL, *gate_ops = NULL, *div_ops = NULL; 780 + const char * const *parent_names; 781 + const char *parent; 782 + int num_parents; 783 + int ret; 784 + 785 + if (clks->mux_shift >= 0) { 786 + mux = kzalloc(sizeof(*mux), GFP_KERNEL); 787 + if (!mux) 788 + return ERR_PTR(-ENOMEM); 789 + 790 + mux->reg = sys_base + clks->mux_reg; 791 + mux->mask = 1; 792 + mux->shift = clks->mux_shift; 793 + mux_hw = &mux->hw; 794 + mux_ops = &clk_mux_ops; 795 + mux->lock = &bm1880_clk_lock; 796 + 797 + parent_names = clks->parents; 798 + num_parents = clks->num_parents; 799 + } else { 800 + parent = clks->parent; 801 + parent_names = &parent; 802 + num_parents = 1; 803 + } 804 + 805 + if (clks->gate_shift >= 0) { 806 + gate = kzalloc(sizeof(*gate), GFP_KERNEL); 807 + if (!gate) { 808 + ret = -ENOMEM; 809 + goto err_out; 810 + } 811 + 812 + gate->reg = sys_base + clks->gate_reg; 813 + gate->bit_idx = clks->gate_shift; 814 + gate->lock = &bm1880_clk_lock; 815 + 816 + gate_hw = &gate->hw; 817 + gate_ops = &clk_gate_ops; 818 + } 819 + 820 + if (clks->div_shift >= 0) { 821 + div_hws = kzalloc(sizeof(*div_hws), GFP_KERNEL); 822 + if (!div_hws) { 823 + ret = -ENOMEM; 824 + goto err_out; 825 + } 826 + 827 + div_hws->base = sys_base; 828 + div_hws->div.reg = clks->div_reg; 829 + div_hws->div.shift = clks->div_shift; 830 + div_hws->div.width = clks->div_width; 831 + div_hws->div.table = clks->table; 832 + div_hws->div.initval = clks->div_initval; 833 + div_hws->lock = &bm1880_clk_lock; 834 + div_hws->div.flags = CLK_DIVIDER_ONE_BASED | 835 + CLK_DIVIDER_ALLOW_ZERO; 836 + 837 + div_hw = &div_hws->hw; 838 + div_ops = &bm1880_clk_div_ops; 839 + } 840 + 841 + hw = clk_hw_register_composite(NULL, clks->name, parent_names, 842 + num_parents, mux_hw, mux_ops, div_hw, 843 + div_ops, gate_hw, gate_ops, 844 + clks->flags); 845 + 846 + if (IS_ERR(hw)) { 847 + ret = PTR_ERR(hw); 848 + goto err_out; 849 + } 850 + 851 + return hw; 852 + 853 + err_out: 854 + kfree(div_hws); 855 + kfree(gate); 856 + kfree(mux); 857 + 858 + return ERR_PTR(ret); 859 + } 860 + 861 + static int bm1880_clk_register_composites(struct bm1880_composite_clock *clks, 862 + int num_clks, 863 + struct bm1880_clock_data *data) 864 + { 865 + struct clk_hw *hw; 866 + void __iomem *sys_base = data->sys_base; 867 + int i; 868 + 869 + for (i = 0; i < num_clks; i++) { 870 + struct bm1880_composite_clock *bm1880_clk = &clks[i]; 871 + 872 + hw = bm1880_clk_register_composite(bm1880_clk, sys_base); 873 + if (IS_ERR(hw)) { 874 + pr_err("%s: failed to register clock %s\n", 875 + __func__, bm1880_clk->name); 876 + goto err_clk; 877 + } 878 + 879 + data->hw_data.hws[clks[i].id] = hw; 880 + } 881 + 882 + return 0; 883 + 884 + err_clk: 885 + while (i--) 886 + clk_hw_unregister_composite(data->hw_data.hws[clks[i].id]); 887 + 888 + return PTR_ERR(hw); 889 + } 890 + 891 + static int bm1880_clk_probe(struct platform_device *pdev) 892 + { 893 + struct bm1880_clock_data *clk_data; 894 + void __iomem *pll_base, *sys_base; 895 + struct device *dev = &pdev->dev; 896 + struct resource *res; 897 + int num_clks, i; 898 + 899 + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 900 + pll_base = devm_ioremap_resource(&pdev->dev, res); 901 + if (IS_ERR(pll_base)) 902 + return PTR_ERR(pll_base); 903 + 904 + res = platform_get_resource(pdev, IORESOURCE_MEM, 1); 905 + sys_base = devm_ioremap_resource(&pdev->dev, res); 906 + if (IS_ERR(sys_base)) 907 + return PTR_ERR(sys_base); 908 + 909 + num_clks = ARRAY_SIZE(bm1880_pll_clks) + 910 + ARRAY_SIZE(bm1880_div_clks) + 911 + ARRAY_SIZE(bm1880_mux_clks) + 912 + ARRAY_SIZE(bm1880_composite_clks) + 913 + ARRAY_SIZE(bm1880_gate_clks); 914 + 915 + clk_data = devm_kzalloc(dev, struct_size(clk_data, hw_data.hws, 916 + num_clks), GFP_KERNEL); 917 + if (!clk_data) 918 + return -ENOMEM; 919 + 920 + clk_data->pll_base = pll_base; 921 + clk_data->sys_base = sys_base; 922 + 923 + for (i = 0; i < num_clks; i++) 924 + clk_data->hw_data.hws[i] = ERR_PTR(-ENOENT); 925 + 926 + clk_data->hw_data.num = num_clks; 927 + 928 + bm1880_clk_register_plls(bm1880_pll_clks, 929 + ARRAY_SIZE(bm1880_pll_clks), 930 + clk_data); 931 + 932 + bm1880_clk_register_divs(bm1880_div_clks, 933 + ARRAY_SIZE(bm1880_div_clks), 934 + clk_data); 935 + 936 + bm1880_clk_register_mux(bm1880_mux_clks, 937 + ARRAY_SIZE(bm1880_mux_clks), 938 + clk_data); 939 + 940 + bm1880_clk_register_composites(bm1880_composite_clks, 941 + ARRAY_SIZE(bm1880_composite_clks), 942 + clk_data); 943 + 944 + bm1880_clk_register_gate(bm1880_gate_clks, 945 + ARRAY_SIZE(bm1880_gate_clks), 946 + clk_data); 947 + 948 + return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, 949 + &clk_data->hw_data); 950 + } 951 + 952 + static const struct of_device_id bm1880_of_match[] = { 953 + { .compatible = "bitmain,bm1880-clk", }, 954 + {} 955 + }; 956 + MODULE_DEVICE_TABLE(of, bm1880_of_match); 957 + 958 + static struct platform_driver bm1880_clk_driver = { 959 + .driver = { 960 + .name = "bm1880-clk", 961 + .of_match_table = bm1880_of_match, 962 + }, 963 + .probe = bm1880_clk_probe, 964 + }; 965 + module_platform_driver(bm1880_clk_driver); 966 + 967 + MODULE_AUTHOR("Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>"); 968 + MODULE_DESCRIPTION("Clock driver for Bitmain BM1880 SoC"); 969 + MODULE_LICENSE("GPL v2");
+12 -1
drivers/clk/clk-composite.c
··· 207 207 unsigned long flags) 208 208 { 209 209 struct clk_hw *hw; 210 - struct clk_init_data init; 210 + struct clk_init_data init = {}; 211 211 struct clk_composite *composite; 212 212 struct clk_ops *clk_composite_ops; 213 213 int ret; ··· 343 343 clk_unregister(clk); 344 344 kfree(composite); 345 345 } 346 + 347 + void clk_hw_unregister_composite(struct clk_hw *hw) 348 + { 349 + struct clk_composite *composite; 350 + 351 + composite = to_clk_composite(hw); 352 + 353 + clk_hw_unregister(hw); 354 + kfree(composite); 355 + } 356 + EXPORT_SYMBOL_GPL(clk_hw_unregister_composite);
+1 -1
drivers/clk/clk-divider.c
··· 471 471 { 472 472 struct clk_divider *div; 473 473 struct clk_hw *hw; 474 - struct clk_init_data init; 474 + struct clk_init_data init = {}; 475 475 int ret; 476 476 477 477 if (clk_divider_flags & CLK_DIVIDER_HIWORD_MASK) {
+1 -1
drivers/clk/clk-fixed-rate.c
··· 58 58 { 59 59 struct clk_fixed_rate *fixed; 60 60 struct clk_hw *hw; 61 - struct clk_init_data init; 61 + struct clk_init_data init = {}; 62 62 int ret; 63 63 64 64 /* allocate fixed-rate clock */
+1 -1
drivers/clk/clk-gate.c
··· 141 141 { 142 142 struct clk_gate *gate; 143 143 struct clk_hw *hw; 144 - struct clk_init_data init; 144 + struct clk_init_data init = {}; 145 145 int ret; 146 146 147 147 if (clk_gate_flags & CLK_GATE_HIWORD_MASK) {
+1 -1
drivers/clk/clk-gpio.c
··· 280 280 else 281 281 clk = clk_register_gpio_gate(&pdev->dev, node->name, 282 282 parent_names ? parent_names[0] : NULL, gpiod, 283 - 0); 283 + CLK_SET_RATE_PARENT); 284 284 if (IS_ERR(clk)) 285 285 return PTR_ERR(clk); 286 286
+1 -1
drivers/clk/clk-mux.c
··· 153 153 { 154 154 struct clk_mux *mux; 155 155 struct clk_hw *hw; 156 - struct clk_init_data init; 156 + struct clk_init_data init = {}; 157 157 u8 width = 0; 158 158 int ret; 159 159
+23 -4
drivers/clk/clk.c
··· 1187 1187 clk_core_unprepare_lock(core); 1188 1188 } 1189 1189 1190 - static void clk_unprepare_unused_subtree(struct clk_core *core) 1190 + static void __init clk_unprepare_unused_subtree(struct clk_core *core) 1191 1191 { 1192 1192 struct clk_core *child; 1193 1193 ··· 1217 1217 clk_pm_runtime_put(core); 1218 1218 } 1219 1219 1220 - static void clk_disable_unused_subtree(struct clk_core *core) 1220 + static void __init clk_disable_unused_subtree(struct clk_core *core) 1221 1221 { 1222 1222 struct clk_core *child; 1223 1223 unsigned long flags; ··· 1263 1263 clk_core_disable_unprepare(core->parent); 1264 1264 } 1265 1265 1266 - static bool clk_ignore_unused; 1266 + static bool clk_ignore_unused __initdata; 1267 1267 static int __init clk_ignore_unused_setup(char *__unused) 1268 1268 { 1269 1269 clk_ignore_unused = true; ··· 1271 1271 } 1272 1272 __setup("clk_ignore_unused", clk_ignore_unused_setup); 1273 1273 1274 - static int clk_disable_unused(void) 1274 + static int __init clk_disable_unused(void) 1275 1275 { 1276 1276 struct clk_core *core; 1277 1277 ··· 1673 1673 core->parents[i].core = parent; 1674 1674 return i; 1675 1675 } 1676 + 1677 + /** 1678 + * clk_hw_get_parent_index - return the index of the parent clock 1679 + * @hw: clk_hw associated with the clk being consumed 1680 + * 1681 + * Fetches and returns the index of parent clock. Returns -EINVAL if the given 1682 + * clock does not have a current parent. 1683 + */ 1684 + int clk_hw_get_parent_index(struct clk_hw *hw) 1685 + { 1686 + struct clk_hw *parent = clk_hw_get_parent(hw); 1687 + 1688 + if (WARN_ON(parent == NULL)) 1689 + return -EINVAL; 1690 + 1691 + return clk_fetch_parent_index(hw->core, parent->core); 1692 + } 1693 + EXPORT_SYMBOL_GPL(clk_hw_get_parent_index); 1676 1694 1677 1695 /* 1678 1696 * Update the orphan status of @core and all its children. ··· 3897 3879 __func__, clk->core->name); 3898 3880 3899 3881 kref_put(&clk->core->ref, __clk_release); 3882 + free_clk(clk); 3900 3883 unlock: 3901 3884 clk_prepare_unlock(); 3902 3885 }
+1 -3
drivers/clk/davinci/pll.c
··· 910 910 struct davinci_pll_platform_data *pdata; 911 911 const struct of_device_id *of_id; 912 912 davinci_pll_init pll_init = NULL; 913 - struct resource *res; 914 913 void __iomem *base; 915 914 916 915 of_id = of_match_device(davinci_pll_of_match, dev); ··· 929 930 return -EINVAL; 930 931 } 931 932 932 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 933 - base = devm_ioremap_resource(dev, res); 933 + base = devm_platform_ioremap_resource(pdev, 0); 934 934 if (IS_ERR(base)) 935 935 return PTR_ERR(base); 936 936
+1 -3
drivers/clk/davinci/psc.c
··· 531 531 struct device *dev = &pdev->dev; 532 532 const struct of_device_id *of_id; 533 533 const struct davinci_psc_init_data *init_data = NULL; 534 - struct resource *res; 535 534 void __iomem *base; 536 535 int ret; 537 536 ··· 545 546 return -EINVAL; 546 547 } 547 548 548 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 549 - base = devm_ioremap_resource(dev, res); 549 + base = devm_platform_ioremap_resource(pdev, 0); 550 550 if (IS_ERR(base)) 551 551 return PTR_ERR(base); 552 552
+30 -30
drivers/clk/hisilicon/clk-hi3660.c
··· 333 333 334 334 static const struct hisi_divider_clock hi3660_crgctrl_divider_clks[] = { 335 335 { HI3660_CLK_DIV_UART0, "clk_div_uart0", "clk_andgt_uart0", 336 - CLK_SET_RATE_PARENT, 0xb0, 4, 4, CLK_DIVIDER_HIWORD_MASK, 0, }, 336 + CLK_SET_RATE_PARENT, 0xb0, 4, 4, CLK_DIVIDER_HIWORD_MASK, }, 337 337 { HI3660_CLK_DIV_UART1, "clk_div_uart1", "clk_andgt_uart1", 338 - CLK_SET_RATE_PARENT, 0xb0, 8, 4, CLK_DIVIDER_HIWORD_MASK, 0, }, 338 + CLK_SET_RATE_PARENT, 0xb0, 8, 4, CLK_DIVIDER_HIWORD_MASK, }, 339 339 { HI3660_CLK_DIV_UARTH, "clk_div_uarth", "clk_andgt_uarth", 340 - CLK_SET_RATE_PARENT, 0xb0, 12, 4, CLK_DIVIDER_HIWORD_MASK, 0, }, 340 + CLK_SET_RATE_PARENT, 0xb0, 12, 4, CLK_DIVIDER_HIWORD_MASK, }, 341 341 { HI3660_CLK_DIV_MMC, "clk_div_mmc", "clk_andgt_mmc", 342 - CLK_SET_RATE_PARENT, 0xb4, 3, 4, CLK_DIVIDER_HIWORD_MASK, 0, }, 342 + CLK_SET_RATE_PARENT, 0xb4, 3, 4, CLK_DIVIDER_HIWORD_MASK, }, 343 343 { HI3660_CLK_DIV_SD, "clk_div_sd", "clk_andgt_sd", 344 - CLK_SET_RATE_PARENT, 0xb8, 0, 4, CLK_DIVIDER_HIWORD_MASK, 0, }, 344 + CLK_SET_RATE_PARENT, 0xb8, 0, 4, CLK_DIVIDER_HIWORD_MASK, }, 345 345 { HI3660_CLK_DIV_EDC0, "clk_div_edc0", "clk_andgt_edc0", 346 - CLK_SET_RATE_PARENT, 0xbc, 0, 6, CLK_DIVIDER_HIWORD_MASK, 0, }, 346 + CLK_SET_RATE_PARENT, 0xbc, 0, 6, CLK_DIVIDER_HIWORD_MASK, }, 347 347 { HI3660_CLK_DIV_LDI0, "clk_div_ldi0", "clk_andgt_ldi0", 348 - CLK_SET_RATE_PARENT, 0xbc, 10, 6, CLK_DIVIDER_HIWORD_MASK, 0, }, 348 + CLK_SET_RATE_PARENT, 0xbc, 10, 6, CLK_DIVIDER_HIWORD_MASK, }, 349 349 { HI3660_CLK_DIV_SDIO, "clk_div_sdio", "clk_andgt_sdio", 350 - CLK_SET_RATE_PARENT, 0xc0, 0, 4, CLK_DIVIDER_HIWORD_MASK, 0, }, 350 + CLK_SET_RATE_PARENT, 0xc0, 0, 4, CLK_DIVIDER_HIWORD_MASK, }, 351 351 { HI3660_CLK_DIV_LDI1, "clk_div_ldi1", "clk_andgt_ldi1", 352 - CLK_SET_RATE_PARENT, 0xc0, 8, 6, CLK_DIVIDER_HIWORD_MASK, 0, }, 352 + CLK_SET_RATE_PARENT, 0xc0, 8, 6, CLK_DIVIDER_HIWORD_MASK, }, 353 353 { HI3660_CLK_DIV_SPI, "clk_div_spi", "clk_andgt_spi", 354 - CLK_SET_RATE_PARENT, 0xc4, 12, 4, CLK_DIVIDER_HIWORD_MASK, 0, }, 354 + CLK_SET_RATE_PARENT, 0xc4, 12, 4, CLK_DIVIDER_HIWORD_MASK, }, 355 355 { HI3660_CLK_DIV_VENC, "clk_div_venc", "clk_andgt_venc", 356 - CLK_SET_RATE_PARENT, 0xc8, 6, 5, CLK_DIVIDER_HIWORD_MASK, 0, }, 356 + CLK_SET_RATE_PARENT, 0xc8, 6, 5, CLK_DIVIDER_HIWORD_MASK, }, 357 357 { HI3660_CLK_DIV_VDEC, "clk_div_vdec", "clk_andgt_vdec", 358 - CLK_SET_RATE_PARENT, 0xcc, 0, 5, CLK_DIVIDER_HIWORD_MASK, 0, }, 358 + CLK_SET_RATE_PARENT, 0xcc, 0, 5, CLK_DIVIDER_HIWORD_MASK, }, 359 359 { HI3660_CLK_DIV_VIVOBUS, "clk_div_vivobus", "clk_vivobus_andgt", 360 - CLK_SET_RATE_PARENT, 0xd0, 7, 5, CLK_DIVIDER_HIWORD_MASK, 0, }, 360 + CLK_SET_RATE_PARENT, 0xd0, 7, 5, CLK_DIVIDER_HIWORD_MASK, }, 361 361 { HI3660_CLK_DIV_I2C, "clk_div_i2c", "clk_div_320m", 362 - CLK_SET_RATE_PARENT, 0xe8, 4, 4, CLK_DIVIDER_HIWORD_MASK, 0, }, 362 + CLK_SET_RATE_PARENT, 0xe8, 4, 4, CLK_DIVIDER_HIWORD_MASK, }, 363 363 { HI3660_CLK_DIV_UFSPHY, "clk_div_ufsphy_cfg", "clk_gate_ufsphy_gt", 364 - CLK_SET_RATE_PARENT, 0xe8, 9, 2, CLK_DIVIDER_HIWORD_MASK, 0, }, 364 + CLK_SET_RATE_PARENT, 0xe8, 9, 2, CLK_DIVIDER_HIWORD_MASK, }, 365 365 { HI3660_CLK_DIV_CFGBUS, "clk_div_cfgbus", "clk_div_sysbus", 366 - CLK_SET_RATE_PARENT, 0xec, 0, 2, CLK_DIVIDER_HIWORD_MASK, 0, }, 366 + CLK_SET_RATE_PARENT, 0xec, 0, 2, CLK_DIVIDER_HIWORD_MASK, }, 367 367 { HI3660_CLK_DIV_MMC0BUS, "clk_div_mmc0bus", "autodiv_emmc0bus", 368 - CLK_SET_RATE_PARENT, 0xec, 2, 1, CLK_DIVIDER_HIWORD_MASK, 0, }, 368 + CLK_SET_RATE_PARENT, 0xec, 2, 1, CLK_DIVIDER_HIWORD_MASK, }, 369 369 { HI3660_CLK_DIV_MMC1BUS, "clk_div_mmc1bus", "clk_div_sysbus", 370 - CLK_SET_RATE_PARENT, 0xec, 3, 1, CLK_DIVIDER_HIWORD_MASK, 0, }, 370 + CLK_SET_RATE_PARENT, 0xec, 3, 1, CLK_DIVIDER_HIWORD_MASK, }, 371 371 { HI3660_CLK_DIV_UFSPERI, "clk_div_ufsperi", "clk_gate_ufs_subsys", 372 - CLK_SET_RATE_PARENT, 0xec, 14, 1, CLK_DIVIDER_HIWORD_MASK, 0, }, 372 + CLK_SET_RATE_PARENT, 0xec, 14, 1, CLK_DIVIDER_HIWORD_MASK, }, 373 373 { HI3660_CLK_DIV_AOMM, "clk_div_aomm", "clk_aomm_andgt", 374 - CLK_SET_RATE_PARENT, 0x100, 7, 4, CLK_DIVIDER_HIWORD_MASK, 0, }, 374 + CLK_SET_RATE_PARENT, 0x100, 7, 4, CLK_DIVIDER_HIWORD_MASK, }, 375 375 { HI3660_CLK_DIV_ISP_SNCLK, "clk_isp_snclk_div", "clk_isp_snclk_fac", 376 - CLK_SET_RATE_PARENT, 0x108, 0, 2, CLK_DIVIDER_HIWORD_MASK, 0, }, 376 + CLK_SET_RATE_PARENT, 0x108, 0, 2, CLK_DIVIDER_HIWORD_MASK, }, 377 377 { HI3660_CLK_DIV_IOPERI, "clk_div_ioperi", "clk_mux_ioperi", 378 - CLK_SET_RATE_PARENT, 0x108, 11, 4, CLK_DIVIDER_HIWORD_MASK, 0, }, 378 + CLK_SET_RATE_PARENT, 0x108, 11, 4, CLK_DIVIDER_HIWORD_MASK, }, 379 379 }; 380 380 381 381 /* clk_pmuctrl */ ··· 420 420 { HI3660_PCLK_MMBUF_ANDGT, "pclk_mmbuf_andgt", "clk_sw_mmbuf", 421 421 CLK_SET_RATE_PARENT, 0x258, 7, CLK_GATE_HIWORD_MASK, }, 422 422 { HI3660_CLK_MMBUF_PLL_ANDGT, "clk_mmbuf_pll_andgt", "clk_ppll0", 423 - CLK_SET_RATE_PARENT, 0x260, 11, CLK_DIVIDER_HIWORD_MASK, 0, }, 423 + CLK_SET_RATE_PARENT, 0x260, 11, CLK_DIVIDER_HIWORD_MASK, }, 424 424 { HI3660_CLK_FLL_MMBUF_ANDGT, "clk_fll_mmbuf_andgt", "clk_fll_src", 425 - CLK_SET_RATE_PARENT, 0x260, 12, CLK_DIVIDER_HIWORD_MASK, 0, }, 425 + CLK_SET_RATE_PARENT, 0x260, 12, CLK_DIVIDER_HIWORD_MASK, }, 426 426 { HI3660_CLK_SYS_MMBUF_ANDGT, "clk_sys_mmbuf_andgt", "clkin_sys", 427 - CLK_SET_RATE_PARENT, 0x260, 13, CLK_DIVIDER_HIWORD_MASK, 0, }, 427 + CLK_SET_RATE_PARENT, 0x260, 13, CLK_DIVIDER_HIWORD_MASK, }, 428 428 { HI3660_CLK_GATE_PCIEPHY_GT, "clk_gate_pciephy_gt", "clk_ppll0", 429 - CLK_SET_RATE_PARENT, 0x268, 11, CLK_DIVIDER_HIWORD_MASK, 0, }, 429 + CLK_SET_RATE_PARENT, 0x268, 11, CLK_DIVIDER_HIWORD_MASK, }, 430 430 }; 431 431 432 432 static const char *const ··· 446 446 447 447 static const struct hisi_divider_clock hi3660_sctrl_divider_clks[] = { 448 448 { HI3660_CLK_DIV_AOBUS, "clk_div_aobus", "clk_ppll0", 449 - CLK_SET_RATE_PARENT, 0x254, 0, 6, CLK_DIVIDER_HIWORD_MASK, 0, }, 449 + CLK_SET_RATE_PARENT, 0x254, 0, 6, CLK_DIVIDER_HIWORD_MASK, }, 450 450 { HI3660_PCLK_DIV_MMBUF, "pclk_div_mmbuf", "pclk_mmbuf_andgt", 451 - CLK_SET_RATE_PARENT, 0x258, 10, 2, CLK_DIVIDER_HIWORD_MASK, 0, }, 451 + CLK_SET_RATE_PARENT, 0x258, 10, 2, CLK_DIVIDER_HIWORD_MASK, }, 452 452 { HI3660_ACLK_DIV_MMBUF, "aclk_div_mmbuf", "clk_mmbuf_pll_andgt", 453 - CLK_SET_RATE_PARENT, 0x258, 12, 4, CLK_DIVIDER_HIWORD_MASK, 0, }, 453 + CLK_SET_RATE_PARENT, 0x258, 12, 4, CLK_DIVIDER_HIWORD_MASK, }, 454 454 { HI3660_CLK_DIV_PCIEPHY, "clk_div_pciephy", "clk_gate_pciephy_gt", 455 - CLK_SET_RATE_PARENT, 0x268, 12, 4, CLK_DIVIDER_HIWORD_MASK, 0, }, 455 + CLK_SET_RATE_PARENT, 0x268, 12, 4, CLK_DIVIDER_HIWORD_MASK, }, 456 456 }; 457 457 458 458 /* clk_iomcu */
+76 -76
drivers/clk/hisilicon/clk-hi3670.c
··· 295 295 296 296 static const struct hisi_gate_clock hi3670_crgctrl_gate_clks[] = { 297 297 { HI3670_AUTODIV_SYSBUS, "autodiv_sysbus", "clk_div_sysbus", 298 - CLK_SET_RATE_PARENT, 0x404, 5, CLK_GATE_HIWORD_MASK, 0, }, 298 + CLK_SET_RATE_PARENT, 0x404, 5, CLK_GATE_HIWORD_MASK, }, 299 299 { HI3670_AUTODIV_EMMC0BUS, "autodiv_emmc0bus", "autodiv_sysbus", 300 - CLK_SET_RATE_PARENT, 0x404, 1, CLK_GATE_HIWORD_MASK, 0, }, 300 + CLK_SET_RATE_PARENT, 0x404, 1, CLK_GATE_HIWORD_MASK, }, 301 301 { HI3670_PCLK_ANDGT_MMC1_PCIE, "pclk_andgt_mmc1_pcie", "clk_div_320m", 302 - CLK_SET_RATE_PARENT, 0xf8, 13, CLK_GATE_HIWORD_MASK, 0, }, 302 + CLK_SET_RATE_PARENT, 0xf8, 13, CLK_GATE_HIWORD_MASK, }, 303 303 { HI3670_CLK_GATE_VCODECBUS_GT, "clk_gate_vcodecbus_gt", "clk_mux_vcodecbus", 304 - CLK_SET_RATE_PARENT, 0x0F0, 8, CLK_GATE_HIWORD_MASK, 0, }, 304 + CLK_SET_RATE_PARENT, 0x0F0, 8, CLK_GATE_HIWORD_MASK, }, 305 305 { HI3670_CLK_ANDGT_SD, "clk_andgt_sd", "clk_mux_sd_pll", 306 - CLK_SET_RATE_PARENT, 0xF4, 3, CLK_GATE_HIWORD_MASK, 0, }, 306 + CLK_SET_RATE_PARENT, 0xF4, 3, CLK_GATE_HIWORD_MASK, }, 307 307 { HI3670_CLK_SD_SYS_GT, "clk_sd_sys_gt", "clkin_sys", 308 - CLK_SET_RATE_PARENT, 0xF4, 5, CLK_GATE_HIWORD_MASK, 0, }, 308 + CLK_SET_RATE_PARENT, 0xF4, 5, CLK_GATE_HIWORD_MASK, }, 309 309 { HI3670_CLK_ANDGT_SDIO, "clk_andgt_sdio", "clk_mux_sdio_pll", 310 - CLK_SET_RATE_PARENT, 0xF4, 8, CLK_GATE_HIWORD_MASK, 0, }, 310 + CLK_SET_RATE_PARENT, 0xF4, 8, CLK_GATE_HIWORD_MASK, }, 311 311 { HI3670_CLK_SDIO_SYS_GT, "clk_sdio_sys_gt", "clkin_sys", 312 - CLK_SET_RATE_PARENT, 0xF4, 6, CLK_GATE_HIWORD_MASK, 0, }, 312 + CLK_SET_RATE_PARENT, 0xF4, 6, CLK_GATE_HIWORD_MASK, }, 313 313 { HI3670_CLK_A53HPM_ANDGT, "clk_a53hpm_andgt", "clk_mux_a53hpm", 314 - CLK_SET_RATE_PARENT, 0x0F4, 7, CLK_GATE_HIWORD_MASK, 0, }, 314 + CLK_SET_RATE_PARENT, 0x0F4, 7, CLK_GATE_HIWORD_MASK, }, 315 315 { HI3670_CLK_320M_PLL_GT, "clk_320m_pll_gt", "clk_mux_320m", 316 - CLK_SET_RATE_PARENT, 0xF8, 10, CLK_GATE_HIWORD_MASK, 0, }, 316 + CLK_SET_RATE_PARENT, 0xF8, 10, CLK_GATE_HIWORD_MASK, }, 317 317 { HI3670_CLK_ANDGT_UARTH, "clk_andgt_uarth", "clk_div_320m", 318 - CLK_SET_RATE_PARENT, 0xF4, 11, CLK_GATE_HIWORD_MASK, 0, }, 318 + CLK_SET_RATE_PARENT, 0xF4, 11, CLK_GATE_HIWORD_MASK, }, 319 319 { HI3670_CLK_ANDGT_UARTL, "clk_andgt_uartl", "clk_div_320m", 320 - CLK_SET_RATE_PARENT, 0xF4, 10, CLK_GATE_HIWORD_MASK, 0, }, 320 + CLK_SET_RATE_PARENT, 0xF4, 10, CLK_GATE_HIWORD_MASK, }, 321 321 { HI3670_CLK_ANDGT_UART0, "clk_andgt_uart0", "clk_div_320m", 322 - CLK_SET_RATE_PARENT, 0xF4, 9, CLK_GATE_HIWORD_MASK, 0, }, 322 + CLK_SET_RATE_PARENT, 0xF4, 9, CLK_GATE_HIWORD_MASK, }, 323 323 { HI3670_CLK_ANDGT_SPI, "clk_andgt_spi", "clk_div_320m", 324 - CLK_SET_RATE_PARENT, 0xF4, 13, CLK_GATE_HIWORD_MASK, 0, }, 324 + CLK_SET_RATE_PARENT, 0xF4, 13, CLK_GATE_HIWORD_MASK, }, 325 325 { HI3670_CLK_ANDGT_PCIEAXI, "clk_andgt_pcieaxi", "clk_mux_pcieaxi", 326 - CLK_SET_RATE_PARENT, 0xfc, 15, CLK_GATE_HIWORD_MASK, 0, }, 326 + CLK_SET_RATE_PARENT, 0xfc, 15, CLK_GATE_HIWORD_MASK, }, 327 327 { HI3670_CLK_DIV_AO_ASP_GT, "clk_div_ao_asp_gt", "clk_mux_ao_asp", 328 - CLK_SET_RATE_PARENT, 0xF4, 4, CLK_GATE_HIWORD_MASK, 0, }, 328 + CLK_SET_RATE_PARENT, 0xF4, 4, CLK_GATE_HIWORD_MASK, }, 329 329 { HI3670_CLK_GATE_CSI_TRANS, "clk_gate_csi_trans", "clk_ppll2", 330 - CLK_SET_RATE_PARENT, 0xF4, 14, CLK_GATE_HIWORD_MASK, 0, }, 330 + CLK_SET_RATE_PARENT, 0xF4, 14, CLK_GATE_HIWORD_MASK, }, 331 331 { HI3670_CLK_GATE_DSI_TRANS, "clk_gate_dsi_trans", "clk_ppll2", 332 - CLK_SET_RATE_PARENT, 0xF4, 1, CLK_GATE_HIWORD_MASK, 0, }, 332 + CLK_SET_RATE_PARENT, 0xF4, 1, CLK_GATE_HIWORD_MASK, }, 333 333 { HI3670_CLK_ANDGT_PTP, "clk_andgt_ptp", "clk_div_320m", 334 - CLK_SET_RATE_PARENT, 0xF8, 5, CLK_GATE_HIWORD_MASK, 0, }, 334 + CLK_SET_RATE_PARENT, 0xF8, 5, CLK_GATE_HIWORD_MASK, }, 335 335 { HI3670_CLK_ANDGT_OUT0, "clk_andgt_out0", "clk_ppll0", 336 - CLK_SET_RATE_PARENT, 0xF0, 10, CLK_GATE_HIWORD_MASK, 0, }, 336 + CLK_SET_RATE_PARENT, 0xF0, 10, CLK_GATE_HIWORD_MASK, }, 337 337 { HI3670_CLK_ANDGT_OUT1, "clk_andgt_out1", "clk_ppll0", 338 - CLK_SET_RATE_PARENT, 0xF0, 11, CLK_GATE_HIWORD_MASK, 0, }, 338 + CLK_SET_RATE_PARENT, 0xF0, 11, CLK_GATE_HIWORD_MASK, }, 339 339 { HI3670_CLKGT_DP_AUDIO_PLL_AO, "clkgt_dp_audio_pll_ao", "clk_ppll6", 340 - CLK_SET_RATE_PARENT, 0xF8, 15, CLK_GATE_HIWORD_MASK, 0, }, 340 + CLK_SET_RATE_PARENT, 0xF8, 15, CLK_GATE_HIWORD_MASK, }, 341 341 { HI3670_CLK_ANDGT_VDEC, "clk_andgt_vdec", "clk_mux_vdec", 342 - CLK_SET_RATE_PARENT, 0xF0, 13, CLK_GATE_HIWORD_MASK, 0, }, 342 + CLK_SET_RATE_PARENT, 0xF0, 13, CLK_GATE_HIWORD_MASK, }, 343 343 { HI3670_CLK_ANDGT_VENC, "clk_andgt_venc", "clk_mux_venc", 344 - CLK_SET_RATE_PARENT, 0xF0, 9, CLK_GATE_HIWORD_MASK, 0, }, 344 + CLK_SET_RATE_PARENT, 0xF0, 9, CLK_GATE_HIWORD_MASK, }, 345 345 { HI3670_CLK_ISP_SNCLK_ANGT, "clk_isp_snclk_angt", "clk_div_a53hpm", 346 - CLK_SET_RATE_PARENT, 0x108, 2, CLK_GATE_HIWORD_MASK, 0, }, 346 + CLK_SET_RATE_PARENT, 0x108, 2, CLK_GATE_HIWORD_MASK, }, 347 347 { HI3670_CLK_ANDGT_RXDPHY, "clk_andgt_rxdphy", "clk_div_a53hpm", 348 - CLK_SET_RATE_PARENT, 0x0F0, 12, CLK_GATE_HIWORD_MASK, 0, }, 348 + CLK_SET_RATE_PARENT, 0x0F0, 12, CLK_GATE_HIWORD_MASK, }, 349 349 { HI3670_CLK_ANDGT_ICS, "clk_andgt_ics", "clk_mux_ics", 350 - CLK_SET_RATE_PARENT, 0xf0, 14, CLK_GATE_HIWORD_MASK, 0, }, 350 + CLK_SET_RATE_PARENT, 0xf0, 14, CLK_GATE_HIWORD_MASK, }, 351 351 { HI3670_AUTODIV_DMABUS, "autodiv_dmabus", "autodiv_sysbus", 352 - CLK_SET_RATE_PARENT, 0x404, 3, CLK_GATE_HIWORD_MASK, 0, }, 352 + CLK_SET_RATE_PARENT, 0x404, 3, CLK_GATE_HIWORD_MASK, }, 353 353 }; 354 354 355 355 static const char *const ··· 485 485 486 486 static const struct hisi_divider_clock hi3670_crgctrl_divider_clks[] = { 487 487 { HI3670_CLK_DIV_CFGBUS, "clk_div_cfgbus", "clk_div_sysbus", 488 - CLK_SET_RATE_PARENT, 0xEC, 0, 2, CLK_DIVIDER_HIWORD_MASK, 0, }, 488 + CLK_SET_RATE_PARENT, 0xEC, 0, 2, CLK_DIVIDER_HIWORD_MASK, }, 489 489 { HI3670_CLK_DIV_MMC0BUS, "clk_div_mmc0bus", "autodiv_emmc0bus", 490 - CLK_SET_RATE_PARENT, 0x0EC, 2, 1, CLK_DIVIDER_HIWORD_MASK, 0, }, 490 + CLK_SET_RATE_PARENT, 0x0EC, 2, 1, CLK_DIVIDER_HIWORD_MASK, }, 491 491 { HI3670_CLK_DIV_MMC1BUS, "clk_div_mmc1bus", "clk_div_sysbus", 492 - CLK_SET_RATE_PARENT, 0x0EC, 3, 1, CLK_DIVIDER_HIWORD_MASK, 0, }, 492 + CLK_SET_RATE_PARENT, 0x0EC, 3, 1, CLK_DIVIDER_HIWORD_MASK, }, 493 493 { HI3670_PCLK_DIV_MMC1_PCIE, "pclk_div_mmc1_pcie", "pclk_andgt_mmc1_pcie", 494 - CLK_SET_RATE_PARENT, 0xb4, 6, 4, CLK_DIVIDER_HIWORD_MASK, 0, }, 494 + CLK_SET_RATE_PARENT, 0xb4, 6, 4, CLK_DIVIDER_HIWORD_MASK, }, 495 495 { HI3670_CLK_DIV_VCODECBUS, "clk_div_vcodecbus", "clk_gate_vcodecbus_gt", 496 - CLK_SET_RATE_PARENT, 0x0BC, 0, 6, CLK_DIVIDER_HIWORD_MASK, 0, }, 496 + CLK_SET_RATE_PARENT, 0x0BC, 0, 6, CLK_DIVIDER_HIWORD_MASK, }, 497 497 { HI3670_CLK_DIV_SD, "clk_div_sd", "clk_andgt_sd", 498 - CLK_SET_RATE_PARENT, 0xB8, 0, 4, CLK_DIVIDER_HIWORD_MASK, 0, }, 498 + CLK_SET_RATE_PARENT, 0xB8, 0, 4, CLK_DIVIDER_HIWORD_MASK, }, 499 499 { HI3670_CLK_DIV_SDIO, "clk_div_sdio", "clk_andgt_sdio", 500 - CLK_SET_RATE_PARENT, 0xC0, 0, 4, CLK_DIVIDER_HIWORD_MASK, 0, }, 500 + CLK_SET_RATE_PARENT, 0xC0, 0, 4, CLK_DIVIDER_HIWORD_MASK, }, 501 501 { HI3670_CLK_DIV_UARTH, "clk_div_uarth", "clk_andgt_uarth", 502 - CLK_SET_RATE_PARENT, 0xB0, 12, 4, CLK_DIVIDER_HIWORD_MASK, 0, }, 502 + CLK_SET_RATE_PARENT, 0xB0, 12, 4, CLK_DIVIDER_HIWORD_MASK, }, 503 503 { HI3670_CLK_DIV_UARTL, "clk_div_uartl", "clk_andgt_uartl", 504 - CLK_SET_RATE_PARENT, 0xB0, 8, 4, CLK_DIVIDER_HIWORD_MASK, 0, }, 504 + CLK_SET_RATE_PARENT, 0xB0, 8, 4, CLK_DIVIDER_HIWORD_MASK, }, 505 505 { HI3670_CLK_DIV_UART0, "clk_div_uart0", "clk_andgt_uart0", 506 - CLK_SET_RATE_PARENT, 0xB0, 4, 4, CLK_DIVIDER_HIWORD_MASK, 0, }, 506 + CLK_SET_RATE_PARENT, 0xB0, 4, 4, CLK_DIVIDER_HIWORD_MASK, }, 507 507 { HI3670_CLK_DIV_I2C, "clk_div_i2c", "clk_div_320m", 508 - CLK_SET_RATE_PARENT, 0xE8, 4, 4, CLK_DIVIDER_HIWORD_MASK, 0, }, 508 + CLK_SET_RATE_PARENT, 0xE8, 4, 4, CLK_DIVIDER_HIWORD_MASK, }, 509 509 { HI3670_CLK_DIV_SPI, "clk_div_spi", "clk_andgt_spi", 510 - CLK_SET_RATE_PARENT, 0xC4, 12, 4, CLK_DIVIDER_HIWORD_MASK, 0, }, 510 + CLK_SET_RATE_PARENT, 0xC4, 12, 4, CLK_DIVIDER_HIWORD_MASK, }, 511 511 { HI3670_CLK_DIV_PCIEAXI, "clk_div_pcieaxi", "clk_andgt_pcieaxi", 512 - CLK_SET_RATE_PARENT, 0xb4, 0, 5, CLK_DIVIDER_HIWORD_MASK, 0, }, 512 + CLK_SET_RATE_PARENT, 0xb4, 0, 5, CLK_DIVIDER_HIWORD_MASK, }, 513 513 { HI3670_CLK_DIV_AO_ASP, "clk_div_ao_asp", "clk_div_ao_asp_gt", 514 - CLK_SET_RATE_PARENT, 0x108, 6, 4, CLK_DIVIDER_HIWORD_MASK, 0, }, 514 + CLK_SET_RATE_PARENT, 0x108, 6, 4, CLK_DIVIDER_HIWORD_MASK, }, 515 515 { HI3670_CLK_DIV_CSI_TRANS, "clk_div_csi_trans", "clk_gate_csi_trans", 516 - CLK_SET_RATE_PARENT, 0xD4, 0, 5, CLK_DIVIDER_HIWORD_MASK, 0, }, 516 + CLK_SET_RATE_PARENT, 0xD4, 0, 5, CLK_DIVIDER_HIWORD_MASK, }, 517 517 { HI3670_CLK_DIV_DSI_TRANS, "clk_div_dsi_trans", "clk_gate_dsi_trans", 518 - CLK_SET_RATE_PARENT, 0xD4, 10, 5, CLK_DIVIDER_HIWORD_MASK, 0, }, 518 + CLK_SET_RATE_PARENT, 0xD4, 10, 5, CLK_DIVIDER_HIWORD_MASK, }, 519 519 { HI3670_CLK_DIV_PTP, "clk_div_ptp", "clk_andgt_ptp", 520 - CLK_SET_RATE_PARENT, 0xD8, 0, 4, CLK_DIVIDER_HIWORD_MASK, 0, }, 520 + CLK_SET_RATE_PARENT, 0xD8, 0, 4, CLK_DIVIDER_HIWORD_MASK, }, 521 521 { HI3670_CLK_DIV_CLKOUT0_PLL, "clk_div_clkout0_pll", "clk_andgt_out0", 522 - CLK_SET_RATE_PARENT, 0xe0, 4, 6, CLK_DIVIDER_HIWORD_MASK, 0, }, 522 + CLK_SET_RATE_PARENT, 0xe0, 4, 6, CLK_DIVIDER_HIWORD_MASK, }, 523 523 { HI3670_CLK_DIV_CLKOUT1_PLL, "clk_div_clkout1_pll", "clk_andgt_out1", 524 - CLK_SET_RATE_PARENT, 0xe0, 10, 6, CLK_DIVIDER_HIWORD_MASK, 0, }, 524 + CLK_SET_RATE_PARENT, 0xe0, 10, 6, CLK_DIVIDER_HIWORD_MASK, }, 525 525 { HI3670_CLKDIV_DP_AUDIO_PLL_AO, "clkdiv_dp_audio_pll_ao", "clkgt_dp_audio_pll_ao", 526 - CLK_SET_RATE_PARENT, 0xBC, 11, 4, CLK_DIVIDER_HIWORD_MASK, 0, }, 526 + CLK_SET_RATE_PARENT, 0xBC, 11, 4, CLK_DIVIDER_HIWORD_MASK, }, 527 527 { HI3670_CLK_DIV_VDEC, "clk_div_vdec", "clk_andgt_vdec", 528 - CLK_SET_RATE_PARENT, 0xC4, 0, 6, CLK_DIVIDER_HIWORD_MASK, 0, }, 528 + CLK_SET_RATE_PARENT, 0xC4, 0, 6, CLK_DIVIDER_HIWORD_MASK, }, 529 529 { HI3670_CLK_DIV_VENC, "clk_div_venc", "clk_andgt_venc", 530 - CLK_SET_RATE_PARENT, 0xC0, 8, 6, CLK_DIVIDER_HIWORD_MASK, 0, }, 530 + CLK_SET_RATE_PARENT, 0xC0, 8, 6, CLK_DIVIDER_HIWORD_MASK, }, 531 531 { HI3670_CLK_ISP_SNCLK_DIV0, "clk_isp_snclk_div0", "clk_isp_snclk_fac", 532 - CLK_SET_RATE_PARENT, 0x108, 0, 2, CLK_DIVIDER_HIWORD_MASK, 0, }, 532 + CLK_SET_RATE_PARENT, 0x108, 0, 2, CLK_DIVIDER_HIWORD_MASK, }, 533 533 { HI3670_CLK_ISP_SNCLK_DIV1, "clk_isp_snclk_div1", "clk_isp_snclk_fac", 534 - CLK_SET_RATE_PARENT, 0x10C, 14, 2, CLK_DIVIDER_HIWORD_MASK, 0, }, 534 + CLK_SET_RATE_PARENT, 0x10C, 14, 2, CLK_DIVIDER_HIWORD_MASK, }, 535 535 { HI3670_CLK_ISP_SNCLK_DIV2, "clk_isp_snclk_div2", "clk_isp_snclk_fac", 536 - CLK_SET_RATE_PARENT, 0x10C, 11, 2, CLK_DIVIDER_HIWORD_MASK, 0, }, 536 + CLK_SET_RATE_PARENT, 0x10C, 11, 2, CLK_DIVIDER_HIWORD_MASK, }, 537 537 { HI3670_CLK_DIV_ICS, "clk_div_ics", "clk_andgt_ics", 538 - CLK_SET_RATE_PARENT, 0xE4, 9, 6, CLK_DIVIDER_HIWORD_MASK, 0, }, 538 + CLK_SET_RATE_PARENT, 0xE4, 9, 6, CLK_DIVIDER_HIWORD_MASK, }, 539 539 }; 540 540 541 541 /* clk_pmuctrl */ ··· 608 608 609 609 static const struct hisi_gate_clock hi3670_sctrl_gate_clks[] = { 610 610 { HI3670_CLK_ANDGT_IOPERI, "clk_andgt_ioperi", "clk_ppll0", 611 - CLK_SET_RATE_PARENT, 0x270, 6, CLK_GATE_HIWORD_MASK, 0, }, 611 + CLK_SET_RATE_PARENT, 0x270, 6, CLK_GATE_HIWORD_MASK, }, 612 612 { HI3670_CLKANDGT_ASP_SUBSYS_PERI, "clkandgt_asp_subsys_peri", 613 613 "clk_ppll0", 614 - CLK_SET_RATE_PARENT, 0x268, 3, CLK_GATE_HIWORD_MASK, 0, }, 614 + CLK_SET_RATE_PARENT, 0x268, 3, CLK_GATE_HIWORD_MASK, }, 615 615 { HI3670_CLK_ANGT_ASP_SUBSYS, "clk_angt_asp_subsys", "clk_ppll0", 616 - CLK_SET_RATE_PARENT, 0x258, 0, CLK_GATE_HIWORD_MASK, 0, }, 616 + CLK_SET_RATE_PARENT, 0x258, 0, CLK_GATE_HIWORD_MASK, }, 617 617 }; 618 618 619 619 static const char *const ··· 650 650 651 651 static const struct hisi_divider_clock hi3670_sctrl_divider_clks[] = { 652 652 { HI3670_CLK_DIV_AOBUS, "clk_div_aobus", "clk_ppll0", 653 - CLK_SET_RATE_PARENT, 0x254, 0, 6, CLK_DIVIDER_HIWORD_MASK, 0, }, 653 + CLK_SET_RATE_PARENT, 0x254, 0, 6, CLK_DIVIDER_HIWORD_MASK, }, 654 654 { HI3670_CLK_DIV_UFS_SUBSYS, "clk_div_ufs_subsys", "clk_mux_ufs_subsys", 655 - CLK_SET_RATE_PARENT, 0x274, 0, 6, CLK_DIVIDER_HIWORD_MASK, 0, }, 655 + CLK_SET_RATE_PARENT, 0x274, 0, 6, CLK_DIVIDER_HIWORD_MASK, }, 656 656 { HI3670_CLK_DIV_IOPERI, "clk_div_ioperi", "clk_andgt_ioperi", 657 - CLK_SET_RATE_PARENT, 0x270, 0, 6, CLK_DIVIDER_HIWORD_MASK, 0, }, 657 + CLK_SET_RATE_PARENT, 0x270, 0, 6, CLK_DIVIDER_HIWORD_MASK, }, 658 658 { HI3670_CLK_DIV_CLKOUT0_TCXO, "clk_div_clkout0_tcxo", "clkin_sys", 659 - CLK_SET_RATE_PARENT, 0x254, 6, 3, CLK_DIVIDER_HIWORD_MASK, 0, }, 659 + CLK_SET_RATE_PARENT, 0x254, 6, 3, CLK_DIVIDER_HIWORD_MASK, }, 660 660 { HI3670_CLK_DIV_CLKOUT1_TCXO, "clk_div_clkout1_tcxo", "clkin_sys", 661 - CLK_SET_RATE_PARENT, 0x254, 9, 3, CLK_DIVIDER_HIWORD_MASK, 0, }, 661 + CLK_SET_RATE_PARENT, 0x254, 9, 3, CLK_DIVIDER_HIWORD_MASK, }, 662 662 { HI3670_CLK_ASP_SUBSYS_PERI_DIV, "clk_asp_subsys_peri_div", "clkandgt_asp_subsys_peri", 663 - CLK_SET_RATE_PARENT, 0x268, 0, 3, CLK_DIVIDER_HIWORD_MASK, 0, }, 663 + CLK_SET_RATE_PARENT, 0x268, 0, 3, CLK_DIVIDER_HIWORD_MASK, }, 664 664 { HI3670_CLK_DIV_ASP_SUBSYS, "clk_div_asp_subsys", "clk_angt_asp_subsys", 665 - CLK_SET_RATE_PARENT, 0x250, 0, 3, CLK_DIVIDER_HIWORD_MASK, 0, }, 665 + CLK_SET_RATE_PARENT, 0x250, 0, 3, CLK_DIVIDER_HIWORD_MASK, }, 666 666 }; 667 667 668 668 /* clk_iomcu */ ··· 732 732 733 733 static const struct hisi_gate_clock hi3670_media1_gate_clks[] = { 734 734 { HI3670_CLK_GATE_VIVOBUS_ANDGT, "clk_gate_vivobus_andgt", "clk_mux_vivobus", 735 - CLK_SET_RATE_PARENT, 0x84, 3, CLK_GATE_HIWORD_MASK, 0, }, 735 + CLK_SET_RATE_PARENT, 0x84, 3, CLK_GATE_HIWORD_MASK, }, 736 736 { HI3670_CLK_ANDGT_EDC0, "clk_andgt_edc0", "clk_mux_edc0", 737 - CLK_SET_RATE_PARENT, 0x84, 7, CLK_GATE_HIWORD_MASK, 0, }, 737 + CLK_SET_RATE_PARENT, 0x84, 7, CLK_GATE_HIWORD_MASK, }, 738 738 { HI3670_CLK_ANDGT_LDI0, "clk_andgt_ldi0", "clk_mux_ldi0", 739 - CLK_SET_RATE_PARENT, 0x84, 9, CLK_GATE_HIWORD_MASK, 0, }, 739 + CLK_SET_RATE_PARENT, 0x84, 9, CLK_GATE_HIWORD_MASK, }, 740 740 { HI3670_CLK_ANDGT_LDI1, "clk_andgt_ldi1", "clk_mux_ldi1", 741 - CLK_SET_RATE_PARENT, 0x84, 8, CLK_GATE_HIWORD_MASK, 0, }, 741 + CLK_SET_RATE_PARENT, 0x84, 8, CLK_GATE_HIWORD_MASK, }, 742 742 { HI3670_CLK_MMBUF_PLL_ANDGT, "clk_mmbuf_pll_andgt", "clk_sw_mmbuf", 743 - CLK_SET_RATE_PARENT, 0x84, 14, CLK_GATE_HIWORD_MASK, 0, }, 743 + CLK_SET_RATE_PARENT, 0x84, 14, CLK_GATE_HIWORD_MASK, }, 744 744 { HI3670_PCLK_MMBUF_ANDGT, "pclk_mmbuf_andgt", "aclk_div_mmbuf", 745 - CLK_SET_RATE_PARENT, 0x84, 15, CLK_GATE_HIWORD_MASK, 0, }, 745 + CLK_SET_RATE_PARENT, 0x84, 15, CLK_GATE_HIWORD_MASK, }, 746 746 }; 747 747 748 748 static const char *const ··· 799 799 800 800 static const struct hisi_divider_clock hi3670_media1_divider_clks[] = { 801 801 { HI3670_CLK_DIV_VIVOBUS, "clk_div_vivobus", "clk_gate_vivobus_andgt", 802 - CLK_SET_RATE_PARENT, 0x74, 0, 6, CLK_DIVIDER_HIWORD_MASK, 0, }, 802 + CLK_SET_RATE_PARENT, 0x74, 0, 6, CLK_DIVIDER_HIWORD_MASK, }, 803 803 { HI3670_CLK_DIV_EDC0, "clk_div_edc0", "clk_andgt_edc0", 804 - CLK_SET_RATE_PARENT, 0x68, 0, 6, CLK_DIVIDER_HIWORD_MASK, 0, }, 804 + CLK_SET_RATE_PARENT, 0x68, 0, 6, CLK_DIVIDER_HIWORD_MASK, }, 805 805 { HI3670_CLK_DIV_LDI0, "clk_div_ldi0", "clk_andgt_ldi0", 806 - CLK_SET_RATE_PARENT, 0x60, 0, 6, CLK_DIVIDER_HIWORD_MASK, 0, }, 806 + CLK_SET_RATE_PARENT, 0x60, 0, 6, CLK_DIVIDER_HIWORD_MASK, }, 807 807 { HI3670_CLK_DIV_LDI1, "clk_div_ldi1", "clk_andgt_ldi1", 808 - CLK_SET_RATE_PARENT, 0x64, 0, 6, CLK_DIVIDER_HIWORD_MASK, 0, }, 808 + CLK_SET_RATE_PARENT, 0x64, 0, 6, CLK_DIVIDER_HIWORD_MASK, }, 809 809 { HI3670_ACLK_DIV_MMBUF, "aclk_div_mmbuf", "clk_mmbuf_pll_andgt", 810 - CLK_SET_RATE_PARENT, 0x7C, 10, 6, CLK_DIVIDER_HIWORD_MASK, 0, }, 810 + CLK_SET_RATE_PARENT, 0x7C, 10, 6, CLK_DIVIDER_HIWORD_MASK, }, 811 811 { HI3670_PCLK_DIV_MMBUF, "pclk_div_mmbuf", "pclk_mmbuf_andgt", 812 - CLK_SET_RATE_PARENT, 0x78, 0, 2, CLK_DIVIDER_HIWORD_MASK, 0, }, 812 + CLK_SET_RATE_PARENT, 0x78, 0, 2, CLK_DIVIDER_HIWORD_MASK, }, 813 813 }; 814 814 815 815 /* clk_media2 */
+2 -1
drivers/clk/hisilicon/clk-hi6220.c
··· 86 86 hisi_clk_register_gate_sep(hi6220_separated_gate_clks_ao, 87 87 ARRAY_SIZE(hi6220_separated_gate_clks_ao), clk_data_ao); 88 88 } 89 - CLK_OF_DECLARE(hi6220_clk_ao, "hisilicon,hi6220-aoctrl", hi6220_clk_ao_init); 89 + /* Allow reset driver to probe as well */ 90 + CLK_OF_DECLARE_DRIVER(hi6220_clk_ao, "hisilicon,hi6220-aoctrl", hi6220_clk_ao_init); 90 91 91 92 92 93 /* clocks in sysctrl */
+1 -3
drivers/clk/hisilicon/reset.c
··· 90 90 struct hisi_reset_controller *hisi_reset_init(struct platform_device *pdev) 91 91 { 92 92 struct hisi_reset_controller *rstc; 93 - struct resource *res; 94 93 95 94 rstc = devm_kmalloc(&pdev->dev, sizeof(*rstc), GFP_KERNEL); 96 95 if (!rstc) 97 96 return NULL; 98 97 99 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 100 - rstc->membase = devm_ioremap_resource(&pdev->dev, res); 98 + rstc->membase = devm_platform_ioremap_resource(pdev, 0); 101 99 if (IS_ERR(rstc->membase)) 102 100 return NULL; 103 101
+1 -2
drivers/clk/imgtec/clk-boston.c
··· 58 58 cpu_div = ext_field(mmcmdiv, BOSTON_PLAT_MMCMDIV_CLK1DIV); 59 59 cpu_freq = mult_frac(in_freq, mul, cpu_div); 60 60 61 - onecell = kzalloc(sizeof(*onecell) + 62 - (BOSTON_CLK_COUNT * sizeof(struct clk_hw *)), 61 + onecell = kzalloc(struct_size(onecell, hws, BOSTON_CLK_COUNT), 63 62 GFP_KERNEL); 64 63 if (!onecell) 65 64 return;
+4 -4
drivers/clk/imx/clk-imx6sll.c
··· 107 107 108 108 hws[IMX6SLL_CLK_DUMMY] = imx_clk_hw_fixed("dummy", 0); 109 109 110 - hws[IMX6SLL_CLK_CKIL] = __clk_get_hw(of_clk_get_by_name(ccm_node, "ckil")); 111 - hws[IMX6SLL_CLK_OSC] = __clk_get_hw(of_clk_get_by_name(ccm_node, "osc")); 110 + hws[IMX6SLL_CLK_CKIL] = imx_obtain_fixed_clk_hw(ccm_node, "ckil"); 111 + hws[IMX6SLL_CLK_OSC] = imx_obtain_fixed_clk_hw(ccm_node, "osc"); 112 112 113 113 /* ipp_di clock is external input */ 114 - hws[IMX6SLL_CLK_IPP_DI0] = __clk_get_hw(of_clk_get_by_name(ccm_node, "ipp_di0")); 115 - hws[IMX6SLL_CLK_IPP_DI1] = __clk_get_hw(of_clk_get_by_name(ccm_node, "ipp_di1")); 114 + hws[IMX6SLL_CLK_IPP_DI0] = imx_obtain_fixed_clk_hw(ccm_node, "ipp_di0"); 115 + hws[IMX6SLL_CLK_IPP_DI1] = imx_obtain_fixed_clk_hw(ccm_node, "ipp_di1"); 116 116 117 117 np = of_find_compatible_node(NULL, NULL, "fsl,imx6sll-anatop"); 118 118 base = of_iomap(np, 0);
+6 -6
drivers/clk/imx/clk-imx6sx.c
··· 139 139 140 140 hws[IMX6SX_CLK_DUMMY] = imx_clk_hw_fixed("dummy", 0); 141 141 142 - hws[IMX6SX_CLK_CKIL] = __clk_get_hw(of_clk_get_by_name(ccm_node, "ckil")); 143 - hws[IMX6SX_CLK_OSC] = __clk_get_hw(of_clk_get_by_name(ccm_node, "osc")); 142 + hws[IMX6SX_CLK_CKIL] = imx_obtain_fixed_clk_hw(ccm_node, "ckil"); 143 + hws[IMX6SX_CLK_OSC] = imx_obtain_fixed_clk_hw(ccm_node, "osc"); 144 144 145 145 /* ipp_di clock is external input */ 146 - hws[IMX6SX_CLK_IPP_DI0] = __clk_get_hw(of_clk_get_by_name(ccm_node, "ipp_di0")); 147 - hws[IMX6SX_CLK_IPP_DI1] = __clk_get_hw(of_clk_get_by_name(ccm_node, "ipp_di1")); 146 + hws[IMX6SX_CLK_IPP_DI0] = imx_obtain_fixed_clk_hw(ccm_node, "ipp_di0"); 147 + hws[IMX6SX_CLK_IPP_DI1] = imx_obtain_fixed_clk_hw(ccm_node, "ipp_di1"); 148 148 149 149 /* Clock source from external clock via CLK1/2 PAD */ 150 - hws[IMX6SX_CLK_ANACLK1] = __clk_get_hw(of_clk_get_by_name(ccm_node, "anaclk1")); 151 - hws[IMX6SX_CLK_ANACLK2] = __clk_get_hw(of_clk_get_by_name(ccm_node, "anaclk2")); 150 + hws[IMX6SX_CLK_ANACLK1] = imx_obtain_fixed_clk_hw(ccm_node, "anaclk1"); 151 + hws[IMX6SX_CLK_ANACLK2] = imx_obtain_fixed_clk_hw(ccm_node, "anaclk2"); 152 152 153 153 np = of_find_compatible_node(NULL, NULL, "fsl,imx6sx-anatop"); 154 154 base = of_iomap(np, 0);
+4 -4
drivers/clk/imx/clk-imx6ul.c
··· 126 126 127 127 hws[IMX6UL_CLK_DUMMY] = imx_clk_hw_fixed("dummy", 0); 128 128 129 - hws[IMX6UL_CLK_CKIL] = __clk_get_hw(of_clk_get_by_name(ccm_node, "ckil")); 130 - hws[IMX6UL_CLK_OSC] = __clk_get_hw(of_clk_get_by_name(ccm_node, "osc")); 129 + hws[IMX6UL_CLK_CKIL] = imx_obtain_fixed_clk_hw(ccm_node, "ckil"); 130 + hws[IMX6UL_CLK_OSC] = imx_obtain_fixed_clk_hw(ccm_node, "osc"); 131 131 132 132 /* ipp_di clock is external input */ 133 - hws[IMX6UL_CLK_IPP_DI0] = __clk_get_hw(of_clk_get_by_name(ccm_node, "ipp_di0")); 134 - hws[IMX6UL_CLK_IPP_DI1] = __clk_get_hw(of_clk_get_by_name(ccm_node, "ipp_di1")); 133 + hws[IMX6UL_CLK_IPP_DI0] = imx_obtain_fixed_clk_hw(ccm_node, "ipp_di0"); 134 + hws[IMX6UL_CLK_IPP_DI1] = imx_obtain_fixed_clk_hw(ccm_node, "ipp_di1"); 135 135 136 136 np = of_find_compatible_node(NULL, NULL, "fsl,imx6ul-anatop"); 137 137 base = of_iomap(np, 0);
+2 -2
drivers/clk/imx/clk-imx7d.c
··· 403 403 hws = clk_hw_data->hws; 404 404 405 405 hws[IMX7D_CLK_DUMMY] = imx_clk_hw_fixed("dummy", 0); 406 - hws[IMX7D_OSC_24M_CLK] = __clk_get_hw(of_clk_get_by_name(ccm_node, "osc")); 407 - hws[IMX7D_CKIL] = __clk_get_hw(of_clk_get_by_name(ccm_node, "ckil")); 406 + hws[IMX7D_OSC_24M_CLK] = imx_obtain_fixed_clk_hw(ccm_node, "osc"); 407 + hws[IMX7D_CKIL] = imx_obtain_fixed_clk_hw(ccm_node, "ckil"); 408 408 409 409 np = of_find_compatible_node(NULL, NULL, "fsl,imx7d-anatop"); 410 410 base = of_iomap(np, 0);
+4 -5
drivers/clk/imx/clk-imx7ulp.c
··· 24 24 static const char * const spll_sels[] = { "spll", "spll_pfd_sel", }; 25 25 static const char * const apll_pfd_sels[] = { "apll_pfd0", "apll_pfd1", "apll_pfd2", "apll_pfd3", }; 26 26 static const char * const apll_sels[] = { "apll", "apll_pfd_sel", }; 27 - static const char * const scs_sels[] = { "dummy", "sosc", "sirc", "firc", "dummy", "apll_sel", "spll_sel", "upll", }; 28 - static const char * const ddr_sels[] = { "apll_pfd_sel", "upll", }; 27 + static const char * const scs_sels[] = { "dummy", "sosc", "sirc", "firc", "dummy", "apll_sel", "spll_sel", "dummy", }; 28 + static const char * const ddr_sels[] = { "apll_pfd_sel", "dummy", "dummy", "dummy", }; 29 29 static const char * const nic_sels[] = { "firc", "ddr_clk", }; 30 30 static const char * const periph_plat_sels[] = { "dummy", "nic1_bus_clk", "nic1_clk", "ddr_clk", "apll_pfd2", "apll_pfd1", "apll_pfd0", "upll", }; 31 - static const char * const periph_bus_sels[] = { "dummy", "sosc_bus_clk", "mpll", "firc_bus_clk", "rosc", "nic1_bus_clk", "nic1_clk", "spll_bus_clk", }; 31 + static const char * const periph_bus_sels[] = { "dummy", "sosc_bus_clk", "dummy", "firc_bus_clk", "rosc", "nic1_bus_clk", "nic1_clk", "spll_bus_clk", }; 32 32 static const char * const arm_sels[] = { "divcore", "dummy", "dummy", "hsrun_divcore", }; 33 33 34 34 /* used by sosc/sirc/firc/ddr/spll/apll dividers */ ··· 75 75 clks[IMX7ULP_CLK_SOSC] = imx_obtain_fixed_clk_hw(np, "sosc"); 76 76 clks[IMX7ULP_CLK_SIRC] = imx_obtain_fixed_clk_hw(np, "sirc"); 77 77 clks[IMX7ULP_CLK_FIRC] = imx_obtain_fixed_clk_hw(np, "firc"); 78 - clks[IMX7ULP_CLK_MIPI_PLL] = imx_obtain_fixed_clk_hw(np, "mpll"); 79 78 clks[IMX7ULP_CLK_UPLL] = imx_obtain_fixed_clk_hw(np, "upll"); 80 79 81 80 /* SCG1 */ ··· 117 118 clks[IMX7ULP_CLK_SYS_SEL] = imx_clk_hw_mux2("scs_sel", base + 0x14, 24, 4, scs_sels, ARRAY_SIZE(scs_sels)); 118 119 clks[IMX7ULP_CLK_HSRUN_SYS_SEL] = imx_clk_hw_mux2("hsrun_scs_sel", base + 0x1c, 24, 4, scs_sels, ARRAY_SIZE(scs_sels)); 119 120 clks[IMX7ULP_CLK_NIC_SEL] = imx_clk_hw_mux2("nic_sel", base + 0x40, 28, 1, nic_sels, ARRAY_SIZE(nic_sels)); 120 - clks[IMX7ULP_CLK_DDR_SEL] = imx_clk_hw_mux_flags("ddr_sel", base + 0x30, 24, 1, ddr_sels, ARRAY_SIZE(ddr_sels), CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE); 121 + clks[IMX7ULP_CLK_DDR_SEL] = imx_clk_hw_mux_flags("ddr_sel", base + 0x30, 24, 2, ddr_sels, ARRAY_SIZE(ddr_sels), CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE); 121 122 122 123 clks[IMX7ULP_CLK_CORE_DIV] = imx_clk_hw_divider_flags("divcore", "scs_sel", base + 0x14, 16, 4, CLK_SET_RATE_PARENT); 123 124 clks[IMX7ULP_CLK_HSRUN_CORE_DIV] = imx_clk_hw_divider_flags("hsrun_divcore", "hsrun_scs_sel", base + 0x1c, 16, 4, CLK_SET_RATE_PARENT);
+48 -102
drivers/clk/imx/clk-imx8mm.c
··· 26 26 static u32 share_count_pdm; 27 27 static u32 share_count_nand; 28 28 29 - static const struct imx_pll14xx_rate_table imx8mm_pll1416x_tbl[] = { 30 - PLL_1416X_RATE(1800000000U, 225, 3, 0), 31 - PLL_1416X_RATE(1600000000U, 200, 3, 0), 32 - PLL_1416X_RATE(1200000000U, 300, 3, 1), 33 - PLL_1416X_RATE(1000000000U, 250, 3, 1), 34 - PLL_1416X_RATE(800000000U, 200, 3, 1), 35 - PLL_1416X_RATE(750000000U, 250, 2, 2), 36 - PLL_1416X_RATE(700000000U, 350, 3, 2), 37 - PLL_1416X_RATE(600000000U, 300, 3, 2), 38 - }; 39 - 40 - static const struct imx_pll14xx_rate_table imx8mm_audiopll_tbl[] = { 41 - PLL_1443X_RATE(393216000U, 262, 2, 3, 9437), 42 - PLL_1443X_RATE(361267200U, 361, 3, 3, 17511), 43 - }; 44 - 45 - static const struct imx_pll14xx_rate_table imx8mm_videopll_tbl[] = { 46 - PLL_1443X_RATE(650000000U, 325, 3, 2, 0), 47 - PLL_1443X_RATE(594000000U, 198, 2, 2, 0), 48 - }; 49 - 50 - static const struct imx_pll14xx_rate_table imx8mm_drampll_tbl[] = { 51 - PLL_1443X_RATE(650000000U, 325, 3, 2, 0), 52 - }; 53 - 54 - static struct imx_pll14xx_clk imx8mm_audio_pll = { 55 - .type = PLL_1443X, 56 - .rate_table = imx8mm_audiopll_tbl, 57 - .rate_count = ARRAY_SIZE(imx8mm_audiopll_tbl), 58 - }; 59 - 60 - static struct imx_pll14xx_clk imx8mm_video_pll = { 61 - .type = PLL_1443X, 62 - .rate_table = imx8mm_videopll_tbl, 63 - .rate_count = ARRAY_SIZE(imx8mm_videopll_tbl), 64 - }; 65 - 66 - static struct imx_pll14xx_clk imx8mm_dram_pll = { 67 - .type = PLL_1443X, 68 - .rate_table = imx8mm_drampll_tbl, 69 - .rate_count = ARRAY_SIZE(imx8mm_drampll_tbl), 70 - }; 71 - 72 - static struct imx_pll14xx_clk imx8mm_arm_pll = { 73 - .type = PLL_1416X, 74 - .rate_table = imx8mm_pll1416x_tbl, 75 - .rate_count = ARRAY_SIZE(imx8mm_pll1416x_tbl), 76 - }; 77 - 78 - static struct imx_pll14xx_clk imx8mm_gpu_pll = { 79 - .type = PLL_1416X, 80 - .rate_table = imx8mm_pll1416x_tbl, 81 - .rate_count = ARRAY_SIZE(imx8mm_pll1416x_tbl), 82 - }; 83 - 84 - static struct imx_pll14xx_clk imx8mm_vpu_pll = { 85 - .type = PLL_1416X, 86 - .rate_table = imx8mm_pll1416x_tbl, 87 - .rate_count = ARRAY_SIZE(imx8mm_pll1416x_tbl), 88 - }; 89 - 90 - static struct imx_pll14xx_clk imx8mm_sys_pll = { 91 - .type = PLL_1416X, 92 - .rate_table = imx8mm_pll1416x_tbl, 93 - .rate_count = ARRAY_SIZE(imx8mm_pll1416x_tbl), 94 - }; 95 - 96 29 static const char *pll_ref_sels[] = { "osc_24m", "dummy", "dummy", "dummy", }; 97 30 static const char *audio_pll1_bypass_sels[] = {"audio_pll1", "audio_pll1_ref_sel", }; 98 31 static const char *audio_pll2_bypass_sels[] = {"audio_pll2", "audio_pll2_ref_sel", }; ··· 34 101 static const char *gpu_pll_bypass_sels[] = {"gpu_pll", "gpu_pll_ref_sel", }; 35 102 static const char *vpu_pll_bypass_sels[] = {"vpu_pll", "vpu_pll_ref_sel", }; 36 103 static const char *arm_pll_bypass_sels[] = {"arm_pll", "arm_pll_ref_sel", }; 37 - static const char *sys_pll1_bypass_sels[] = {"sys_pll1", "sys_pll1_ref_sel", }; 38 - static const char *sys_pll2_bypass_sels[] = {"sys_pll2", "sys_pll2_ref_sel", }; 39 104 static const char *sys_pll3_bypass_sels[] = {"sys_pll3", "sys_pll3_ref_sel", }; 40 105 41 106 /* CCM ROOT */ ··· 323 392 clks[IMX8MM_GPU_PLL_REF_SEL] = imx_clk_mux("gpu_pll_ref_sel", base + 0x64, 0, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)); 324 393 clks[IMX8MM_VPU_PLL_REF_SEL] = imx_clk_mux("vpu_pll_ref_sel", base + 0x74, 0, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)); 325 394 clks[IMX8MM_ARM_PLL_REF_SEL] = imx_clk_mux("arm_pll_ref_sel", base + 0x84, 0, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)); 326 - clks[IMX8MM_SYS_PLL1_REF_SEL] = imx_clk_mux("sys_pll1_ref_sel", base + 0x94, 0, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)); 327 - clks[IMX8MM_SYS_PLL2_REF_SEL] = imx_clk_mux("sys_pll2_ref_sel", base + 0x104, 0, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)); 328 395 clks[IMX8MM_SYS_PLL3_REF_SEL] = imx_clk_mux("sys_pll3_ref_sel", base + 0x114, 0, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)); 329 396 330 - clks[IMX8MM_AUDIO_PLL1] = imx_clk_pll14xx("audio_pll1", "audio_pll1_ref_sel", base, &imx8mm_audio_pll); 331 - clks[IMX8MM_AUDIO_PLL2] = imx_clk_pll14xx("audio_pll2", "audio_pll2_ref_sel", base + 0x14, &imx8mm_audio_pll); 332 - clks[IMX8MM_VIDEO_PLL1] = imx_clk_pll14xx("video_pll1", "video_pll1_ref_sel", base + 0x28, &imx8mm_video_pll); 333 - clks[IMX8MM_DRAM_PLL] = imx_clk_pll14xx("dram_pll", "dram_pll_ref_sel", base + 0x50, &imx8mm_dram_pll); 334 - clks[IMX8MM_GPU_PLL] = imx_clk_pll14xx("gpu_pll", "gpu_pll_ref_sel", base + 0x64, &imx8mm_gpu_pll); 335 - clks[IMX8MM_VPU_PLL] = imx_clk_pll14xx("vpu_pll", "vpu_pll_ref_sel", base + 0x74, &imx8mm_vpu_pll); 336 - clks[IMX8MM_ARM_PLL] = imx_clk_pll14xx("arm_pll", "arm_pll_ref_sel", base + 0x84, &imx8mm_arm_pll); 337 - clks[IMX8MM_SYS_PLL1] = imx_clk_pll14xx("sys_pll1", "sys_pll1_ref_sel", base + 0x94, &imx8mm_sys_pll); 338 - clks[IMX8MM_SYS_PLL2] = imx_clk_pll14xx("sys_pll2", "sys_pll2_ref_sel", base + 0x104, &imx8mm_sys_pll); 339 - clks[IMX8MM_SYS_PLL3] = imx_clk_pll14xx("sys_pll3", "sys_pll3_ref_sel", base + 0x114, &imx8mm_sys_pll); 397 + clks[IMX8MM_AUDIO_PLL1] = imx_clk_pll14xx("audio_pll1", "audio_pll1_ref_sel", base, &imx_1443x_pll); 398 + clks[IMX8MM_AUDIO_PLL2] = imx_clk_pll14xx("audio_pll2", "audio_pll2_ref_sel", base + 0x14, &imx_1443x_pll); 399 + clks[IMX8MM_VIDEO_PLL1] = imx_clk_pll14xx("video_pll1", "video_pll1_ref_sel", base + 0x28, &imx_1443x_pll); 400 + clks[IMX8MM_DRAM_PLL] = imx_clk_pll14xx("dram_pll", "dram_pll_ref_sel", base + 0x50, &imx_1443x_pll); 401 + clks[IMX8MM_GPU_PLL] = imx_clk_pll14xx("gpu_pll", "gpu_pll_ref_sel", base + 0x64, &imx_1416x_pll); 402 + clks[IMX8MM_VPU_PLL] = imx_clk_pll14xx("vpu_pll", "vpu_pll_ref_sel", base + 0x74, &imx_1416x_pll); 403 + clks[IMX8MM_ARM_PLL] = imx_clk_pll14xx("arm_pll", "arm_pll_ref_sel", base + 0x84, &imx_1416x_pll); 404 + clks[IMX8MM_SYS_PLL1] = imx_clk_fixed("sys_pll1", 800000000); 405 + clks[IMX8MM_SYS_PLL2] = imx_clk_fixed("sys_pll2", 1000000000); 406 + clks[IMX8MM_SYS_PLL3] = imx_clk_pll14xx("sys_pll3", "sys_pll3_ref_sel", base + 0x114, &imx_1416x_pll); 340 407 341 408 /* PLL bypass out */ 342 409 clks[IMX8MM_AUDIO_PLL1_BYPASS] = imx_clk_mux_flags("audio_pll1_bypass", base, 16, 1, audio_pll1_bypass_sels, ARRAY_SIZE(audio_pll1_bypass_sels), CLK_SET_RATE_PARENT); ··· 344 415 clks[IMX8MM_GPU_PLL_BYPASS] = imx_clk_mux_flags("gpu_pll_bypass", base + 0x64, 28, 1, gpu_pll_bypass_sels, ARRAY_SIZE(gpu_pll_bypass_sels), CLK_SET_RATE_PARENT); 345 416 clks[IMX8MM_VPU_PLL_BYPASS] = imx_clk_mux_flags("vpu_pll_bypass", base + 0x74, 28, 1, vpu_pll_bypass_sels, ARRAY_SIZE(vpu_pll_bypass_sels), CLK_SET_RATE_PARENT); 346 417 clks[IMX8MM_ARM_PLL_BYPASS] = imx_clk_mux_flags("arm_pll_bypass", base + 0x84, 28, 1, arm_pll_bypass_sels, ARRAY_SIZE(arm_pll_bypass_sels), CLK_SET_RATE_PARENT); 347 - clks[IMX8MM_SYS_PLL1_BYPASS] = imx_clk_mux_flags("sys_pll1_bypass", base + 0x94, 28, 1, sys_pll1_bypass_sels, ARRAY_SIZE(sys_pll1_bypass_sels), CLK_SET_RATE_PARENT); 348 - clks[IMX8MM_SYS_PLL2_BYPASS] = imx_clk_mux_flags("sys_pll2_bypass", base + 0x104, 28, 1, sys_pll2_bypass_sels, ARRAY_SIZE(sys_pll2_bypass_sels), CLK_SET_RATE_PARENT); 349 418 clks[IMX8MM_SYS_PLL3_BYPASS] = imx_clk_mux_flags("sys_pll3_bypass", base + 0x114, 28, 1, sys_pll3_bypass_sels, ARRAY_SIZE(sys_pll3_bypass_sels), CLK_SET_RATE_PARENT); 350 419 351 420 /* PLL out gate */ ··· 354 427 clks[IMX8MM_GPU_PLL_OUT] = imx_clk_gate("gpu_pll_out", "gpu_pll_bypass", base + 0x64, 11); 355 428 clks[IMX8MM_VPU_PLL_OUT] = imx_clk_gate("vpu_pll_out", "vpu_pll_bypass", base + 0x74, 11); 356 429 clks[IMX8MM_ARM_PLL_OUT] = imx_clk_gate("arm_pll_out", "arm_pll_bypass", base + 0x84, 11); 357 - clks[IMX8MM_SYS_PLL1_OUT] = imx_clk_gate("sys_pll1_out", "sys_pll1_bypass", base + 0x94, 11); 358 - clks[IMX8MM_SYS_PLL2_OUT] = imx_clk_gate("sys_pll2_out", "sys_pll2_bypass", base + 0x104, 11); 359 430 clks[IMX8MM_SYS_PLL3_OUT] = imx_clk_gate("sys_pll3_out", "sys_pll3_bypass", base + 0x114, 11); 360 431 361 - /* SYS PLL fixed output */ 362 - clks[IMX8MM_SYS_PLL1_40M] = imx_clk_fixed_factor("sys_pll1_40m", "sys_pll1_out", 1, 20); 363 - clks[IMX8MM_SYS_PLL1_80M] = imx_clk_fixed_factor("sys_pll1_80m", "sys_pll1_out", 1, 10); 364 - clks[IMX8MM_SYS_PLL1_100M] = imx_clk_fixed_factor("sys_pll1_100m", "sys_pll1_out", 1, 8); 365 - clks[IMX8MM_SYS_PLL1_133M] = imx_clk_fixed_factor("sys_pll1_133m", "sys_pll1_out", 1, 6); 366 - clks[IMX8MM_SYS_PLL1_160M] = imx_clk_fixed_factor("sys_pll1_160m", "sys_pll1_out", 1, 5); 367 - clks[IMX8MM_SYS_PLL1_200M] = imx_clk_fixed_factor("sys_pll1_200m", "sys_pll1_out", 1, 4); 368 - clks[IMX8MM_SYS_PLL1_266M] = imx_clk_fixed_factor("sys_pll1_266m", "sys_pll1_out", 1, 3); 369 - clks[IMX8MM_SYS_PLL1_400M] = imx_clk_fixed_factor("sys_pll1_400m", "sys_pll1_out", 1, 2); 432 + /* SYS PLL1 fixed output */ 433 + clks[IMX8MM_SYS_PLL1_40M_CG] = imx_clk_gate("sys_pll1_40m_cg", "sys_pll1", base + 0x94, 27); 434 + clks[IMX8MM_SYS_PLL1_80M_CG] = imx_clk_gate("sys_pll1_80m_cg", "sys_pll1", base + 0x94, 25); 435 + clks[IMX8MM_SYS_PLL1_100M_CG] = imx_clk_gate("sys_pll1_100m_cg", "sys_pll1", base + 0x94, 23); 436 + clks[IMX8MM_SYS_PLL1_133M_CG] = imx_clk_gate("sys_pll1_133m_cg", "sys_pll1", base + 0x94, 21); 437 + clks[IMX8MM_SYS_PLL1_160M_CG] = imx_clk_gate("sys_pll1_160m_cg", "sys_pll1", base + 0x94, 19); 438 + clks[IMX8MM_SYS_PLL1_200M_CG] = imx_clk_gate("sys_pll1_200m_cg", "sys_pll1", base + 0x94, 17); 439 + clks[IMX8MM_SYS_PLL1_266M_CG] = imx_clk_gate("sys_pll1_266m_cg", "sys_pll1", base + 0x94, 15); 440 + clks[IMX8MM_SYS_PLL1_400M_CG] = imx_clk_gate("sys_pll1_400m_cg", "sys_pll1", base + 0x94, 13); 441 + clks[IMX8MM_SYS_PLL1_OUT] = imx_clk_gate("sys_pll1_out", "sys_pll1", base + 0x94, 11); 442 + 443 + clks[IMX8MM_SYS_PLL1_40M] = imx_clk_fixed_factor("sys_pll1_40m", "sys_pll1_40m_cg", 1, 20); 444 + clks[IMX8MM_SYS_PLL1_80M] = imx_clk_fixed_factor("sys_pll1_80m", "sys_pll1_80m_cg", 1, 10); 445 + clks[IMX8MM_SYS_PLL1_100M] = imx_clk_fixed_factor("sys_pll1_100m", "sys_pll1_100m_cg", 1, 8); 446 + clks[IMX8MM_SYS_PLL1_133M] = imx_clk_fixed_factor("sys_pll1_133m", "sys_pll1_133m_cg", 1, 6); 447 + clks[IMX8MM_SYS_PLL1_160M] = imx_clk_fixed_factor("sys_pll1_160m", "sys_pll1_160m_cg", 1, 5); 448 + clks[IMX8MM_SYS_PLL1_200M] = imx_clk_fixed_factor("sys_pll1_200m", "sys_pll1_200m_cg", 1, 4); 449 + clks[IMX8MM_SYS_PLL1_266M] = imx_clk_fixed_factor("sys_pll1_266m", "sys_pll1_266m_cg", 1, 3); 450 + clks[IMX8MM_SYS_PLL1_400M] = imx_clk_fixed_factor("sys_pll1_400m", "sys_pll1_400m_cg", 1, 2); 370 451 clks[IMX8MM_SYS_PLL1_800M] = imx_clk_fixed_factor("sys_pll1_800m", "sys_pll1_out", 1, 1); 371 452 372 - clks[IMX8MM_SYS_PLL2_50M] = imx_clk_fixed_factor("sys_pll2_50m", "sys_pll2_out", 1, 20); 373 - clks[IMX8MM_SYS_PLL2_100M] = imx_clk_fixed_factor("sys_pll2_100m", "sys_pll2_out", 1, 10); 374 - clks[IMX8MM_SYS_PLL2_125M] = imx_clk_fixed_factor("sys_pll2_125m", "sys_pll2_out", 1, 8); 375 - clks[IMX8MM_SYS_PLL2_166M] = imx_clk_fixed_factor("sys_pll2_166m", "sys_pll2_out", 1, 6); 376 - clks[IMX8MM_SYS_PLL2_200M] = imx_clk_fixed_factor("sys_pll2_200m", "sys_pll2_out", 1, 5); 377 - clks[IMX8MM_SYS_PLL2_250M] = imx_clk_fixed_factor("sys_pll2_250m", "sys_pll2_out", 1, 4); 378 - clks[IMX8MM_SYS_PLL2_333M] = imx_clk_fixed_factor("sys_pll2_333m", "sys_pll2_out", 1, 3); 379 - clks[IMX8MM_SYS_PLL2_500M] = imx_clk_fixed_factor("sys_pll2_500m", "sys_pll2_out", 1, 2); 453 + /* SYS PLL2 fixed output */ 454 + clks[IMX8MM_SYS_PLL2_50M_CG] = imx_clk_gate("sys_pll2_50m_cg", "sys_pll2", base + 0x104, 27); 455 + clks[IMX8MM_SYS_PLL2_100M_CG] = imx_clk_gate("sys_pll2_100m_cg", "sys_pll2", base + 0x104, 25); 456 + clks[IMX8MM_SYS_PLL2_125M_CG] = imx_clk_gate("sys_pll2_125m_cg", "sys_pll2", base + 0x104, 23); 457 + clks[IMX8MM_SYS_PLL2_166M_CG] = imx_clk_gate("sys_pll2_166m_cg", "sys_pll2", base + 0x104, 21); 458 + clks[IMX8MM_SYS_PLL2_200M_CG] = imx_clk_gate("sys_pll2_200m_cg", "sys_pll2", base + 0x104, 19); 459 + clks[IMX8MM_SYS_PLL2_250M_CG] = imx_clk_gate("sys_pll2_250m_cg", "sys_pll2", base + 0x104, 17); 460 + clks[IMX8MM_SYS_PLL2_333M_CG] = imx_clk_gate("sys_pll2_333m_cg", "sys_pll2", base + 0x104, 15); 461 + clks[IMX8MM_SYS_PLL2_500M_CG] = imx_clk_gate("sys_pll2_500m_cg", "sys_pll2", base + 0x104, 13); 462 + clks[IMX8MM_SYS_PLL2_OUT] = imx_clk_gate("sys_pll2_out", "sys_pll2", base + 0x104, 11); 463 + 464 + clks[IMX8MM_SYS_PLL2_50M] = imx_clk_fixed_factor("sys_pll2_50m", "sys_pll2_50m_cg", 1, 20); 465 + clks[IMX8MM_SYS_PLL2_100M] = imx_clk_fixed_factor("sys_pll2_100m", "sys_pll2_100m_cg", 1, 10); 466 + clks[IMX8MM_SYS_PLL2_125M] = imx_clk_fixed_factor("sys_pll2_125m", "sys_pll2_125m_cg", 1, 8); 467 + clks[IMX8MM_SYS_PLL2_166M] = imx_clk_fixed_factor("sys_pll2_166m", "sys_pll2_166m_cg", 1, 6); 468 + clks[IMX8MM_SYS_PLL2_200M] = imx_clk_fixed_factor("sys_pll2_200m", "sys_pll2_200m_cg", 1, 5); 469 + clks[IMX8MM_SYS_PLL2_250M] = imx_clk_fixed_factor("sys_pll2_250m", "sys_pll2_250m_cg", 1, 4); 470 + clks[IMX8MM_SYS_PLL2_333M] = imx_clk_fixed_factor("sys_pll2_333m", "sys_pll2_333m_cg", 1, 3); 471 + clks[IMX8MM_SYS_PLL2_500M] = imx_clk_fixed_factor("sys_pll2_500m", "sys_pll2_500m_cg", 1, 2); 380 472 clks[IMX8MM_SYS_PLL2_1000M] = imx_clk_fixed_factor("sys_pll2_1000m", "sys_pll2_out", 1, 1); 381 473 382 474 np = dev->of_node;
+48 -118
drivers/clk/imx/clk-imx8mn.c
··· 25 25 static u32 share_count_pdm; 26 26 static u32 share_count_nand; 27 27 28 - enum { 29 - ARM_PLL, 30 - GPU_PLL, 31 - VPU_PLL, 32 - SYS_PLL1, 33 - SYS_PLL2, 34 - SYS_PLL3, 35 - DRAM_PLL, 36 - AUDIO_PLL1, 37 - AUDIO_PLL2, 38 - VIDEO_PLL2, 39 - NR_PLLS, 40 - }; 41 - 42 - static const struct imx_pll14xx_rate_table imx8mn_pll1416x_tbl[] = { 43 - PLL_1416X_RATE(1800000000U, 225, 3, 0), 44 - PLL_1416X_RATE(1600000000U, 200, 3, 0), 45 - PLL_1416X_RATE(1500000000U, 375, 3, 1), 46 - PLL_1416X_RATE(1400000000U, 350, 3, 1), 47 - PLL_1416X_RATE(1200000000U, 300, 3, 1), 48 - PLL_1416X_RATE(1000000000U, 250, 3, 1), 49 - PLL_1416X_RATE(800000000U, 200, 3, 1), 50 - PLL_1416X_RATE(750000000U, 250, 2, 2), 51 - PLL_1416X_RATE(700000000U, 350, 3, 2), 52 - PLL_1416X_RATE(600000000U, 300, 3, 2), 53 - }; 54 - 55 - static const struct imx_pll14xx_rate_table imx8mn_audiopll_tbl[] = { 56 - PLL_1443X_RATE(393216000U, 262, 2, 3, 9437), 57 - PLL_1443X_RATE(361267200U, 361, 3, 3, 17511), 58 - }; 59 - 60 - static const struct imx_pll14xx_rate_table imx8mn_videopll_tbl[] = { 61 - PLL_1443X_RATE(650000000U, 325, 3, 2, 0), 62 - PLL_1443X_RATE(594000000U, 198, 2, 2, 0), 63 - }; 64 - 65 - static const struct imx_pll14xx_rate_table imx8mn_drampll_tbl[] = { 66 - PLL_1443X_RATE(650000000U, 325, 3, 2, 0), 67 - }; 68 - 69 - static struct imx_pll14xx_clk imx8mn_audio_pll = { 70 - .type = PLL_1443X, 71 - .rate_table = imx8mn_audiopll_tbl, 72 - .rate_count = ARRAY_SIZE(imx8mn_audiopll_tbl), 73 - }; 74 - 75 - static struct imx_pll14xx_clk imx8mn_video_pll = { 76 - .type = PLL_1443X, 77 - .rate_table = imx8mn_videopll_tbl, 78 - .rate_count = ARRAY_SIZE(imx8mn_videopll_tbl), 79 - }; 80 - 81 - static struct imx_pll14xx_clk imx8mn_dram_pll = { 82 - .type = PLL_1443X, 83 - .rate_table = imx8mn_drampll_tbl, 84 - .rate_count = ARRAY_SIZE(imx8mn_drampll_tbl), 85 - }; 86 - 87 - static struct imx_pll14xx_clk imx8mn_arm_pll = { 88 - .type = PLL_1416X, 89 - .rate_table = imx8mn_pll1416x_tbl, 90 - .rate_count = ARRAY_SIZE(imx8mn_pll1416x_tbl), 91 - }; 92 - 93 - static struct imx_pll14xx_clk imx8mn_gpu_pll = { 94 - .type = PLL_1416X, 95 - .rate_table = imx8mn_pll1416x_tbl, 96 - .rate_count = ARRAY_SIZE(imx8mn_pll1416x_tbl), 97 - }; 98 - 99 - static struct imx_pll14xx_clk imx8mn_vpu_pll = { 100 - .type = PLL_1416X, 101 - .rate_table = imx8mn_pll1416x_tbl, 102 - .rate_count = ARRAY_SIZE(imx8mn_pll1416x_tbl), 103 - }; 104 - 105 - static struct imx_pll14xx_clk imx8mn_sys_pll = { 106 - .type = PLL_1416X, 107 - .rate_table = imx8mn_pll1416x_tbl, 108 - .rate_count = ARRAY_SIZE(imx8mn_pll1416x_tbl), 109 - }; 110 - 111 28 static const char * const pll_ref_sels[] = { "osc_24m", "dummy", "dummy", "dummy", }; 112 29 static const char * const audio_pll1_bypass_sels[] = {"audio_pll1", "audio_pll1_ref_sel", }; 113 30 static const char * const audio_pll2_bypass_sels[] = {"audio_pll2", "audio_pll2_ref_sel", }; ··· 33 116 static const char * const gpu_pll_bypass_sels[] = {"gpu_pll", "gpu_pll_ref_sel", }; 34 117 static const char * const vpu_pll_bypass_sels[] = {"vpu_pll", "vpu_pll_ref_sel", }; 35 118 static const char * const arm_pll_bypass_sels[] = {"arm_pll", "arm_pll_ref_sel", }; 36 - static const char * const sys_pll1_bypass_sels[] = {"sys_pll1", "sys_pll1_ref_sel", }; 37 - static const char * const sys_pll2_bypass_sels[] = {"sys_pll2", "sys_pll2_ref_sel", }; 38 119 static const char * const sys_pll3_bypass_sels[] = {"sys_pll3", "sys_pll3_ref_sel", }; 39 120 40 121 static const char * const imx8mn_a53_sels[] = {"osc_24m", "arm_pll_out", "sys_pll2_500m", ··· 320 405 clks[IMX8MN_GPU_PLL_REF_SEL] = imx_clk_mux("gpu_pll_ref_sel", base + 0x64, 0, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)); 321 406 clks[IMX8MN_VPU_PLL_REF_SEL] = imx_clk_mux("vpu_pll_ref_sel", base + 0x74, 0, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)); 322 407 clks[IMX8MN_ARM_PLL_REF_SEL] = imx_clk_mux("arm_pll_ref_sel", base + 0x84, 0, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)); 323 - clks[IMX8MN_SYS_PLL1_REF_SEL] = imx_clk_mux("sys_pll1_ref_sel", base + 0x94, 0, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)); 324 - clks[IMX8MN_SYS_PLL2_REF_SEL] = imx_clk_mux("sys_pll2_ref_sel", base + 0x104, 0, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)); 325 408 clks[IMX8MN_SYS_PLL3_REF_SEL] = imx_clk_mux("sys_pll3_ref_sel", base + 0x114, 0, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)); 326 409 327 - clks[IMX8MN_AUDIO_PLL1] = imx_clk_pll14xx("audio_pll1", "audio_pll1_ref_sel", base, &imx8mn_audio_pll); 328 - clks[IMX8MN_AUDIO_PLL2] = imx_clk_pll14xx("audio_pll2", "audio_pll2_ref_sel", base + 0x14, &imx8mn_audio_pll); 329 - clks[IMX8MN_VIDEO_PLL1] = imx_clk_pll14xx("video_pll1", "video_pll1_ref_sel", base + 0x28, &imx8mn_video_pll); 330 - clks[IMX8MN_DRAM_PLL] = imx_clk_pll14xx("dram_pll", "dram_pll_ref_sel", base + 0x50, &imx8mn_dram_pll); 331 - clks[IMX8MN_GPU_PLL] = imx_clk_pll14xx("gpu_pll", "gpu_pll_ref_sel", base + 0x64, &imx8mn_gpu_pll); 332 - clks[IMX8MN_VPU_PLL] = imx_clk_pll14xx("vpu_pll", "vpu_pll_ref_sel", base + 0x74, &imx8mn_vpu_pll); 333 - clks[IMX8MN_ARM_PLL] = imx_clk_pll14xx("arm_pll", "arm_pll_ref_sel", base + 0x84, &imx8mn_arm_pll); 334 - clks[IMX8MN_SYS_PLL1] = imx_clk_pll14xx("sys_pll1", "sys_pll1_ref_sel", base + 0x94, &imx8mn_sys_pll); 335 - clks[IMX8MN_SYS_PLL2] = imx_clk_pll14xx("sys_pll2", "sys_pll2_ref_sel", base + 0x104, &imx8mn_sys_pll); 336 - clks[IMX8MN_SYS_PLL3] = imx_clk_pll14xx("sys_pll3", "sys_pll3_ref_sel", base + 0x114, &imx8mn_sys_pll); 410 + clks[IMX8MN_AUDIO_PLL1] = imx_clk_pll14xx("audio_pll1", "audio_pll1_ref_sel", base, &imx_1443x_pll); 411 + clks[IMX8MN_AUDIO_PLL2] = imx_clk_pll14xx("audio_pll2", "audio_pll2_ref_sel", base + 0x14, &imx_1443x_pll); 412 + clks[IMX8MN_VIDEO_PLL1] = imx_clk_pll14xx("video_pll1", "video_pll1_ref_sel", base + 0x28, &imx_1443x_pll); 413 + clks[IMX8MN_DRAM_PLL] = imx_clk_pll14xx("dram_pll", "dram_pll_ref_sel", base + 0x50, &imx_1443x_pll); 414 + clks[IMX8MN_GPU_PLL] = imx_clk_pll14xx("gpu_pll", "gpu_pll_ref_sel", base + 0x64, &imx_1416x_pll); 415 + clks[IMX8MN_VPU_PLL] = imx_clk_pll14xx("vpu_pll", "vpu_pll_ref_sel", base + 0x74, &imx_1416x_pll); 416 + clks[IMX8MN_ARM_PLL] = imx_clk_pll14xx("arm_pll", "arm_pll_ref_sel", base + 0x84, &imx_1416x_pll); 417 + clks[IMX8MN_SYS_PLL1] = imx_clk_fixed("sys_pll1", 800000000); 418 + clks[IMX8MN_SYS_PLL2] = imx_clk_fixed("sys_pll2", 1000000000); 419 + clks[IMX8MN_SYS_PLL3] = imx_clk_pll14xx("sys_pll3", "sys_pll3_ref_sel", base + 0x114, &imx_1416x_pll); 337 420 338 421 /* PLL bypass out */ 339 422 clks[IMX8MN_AUDIO_PLL1_BYPASS] = imx_clk_mux_flags("audio_pll1_bypass", base, 16, 1, audio_pll1_bypass_sels, ARRAY_SIZE(audio_pll1_bypass_sels), CLK_SET_RATE_PARENT); ··· 341 428 clks[IMX8MN_GPU_PLL_BYPASS] = imx_clk_mux_flags("gpu_pll_bypass", base + 0x64, 28, 1, gpu_pll_bypass_sels, ARRAY_SIZE(gpu_pll_bypass_sels), CLK_SET_RATE_PARENT); 342 429 clks[IMX8MN_VPU_PLL_BYPASS] = imx_clk_mux_flags("vpu_pll_bypass", base + 0x74, 28, 1, vpu_pll_bypass_sels, ARRAY_SIZE(vpu_pll_bypass_sels), CLK_SET_RATE_PARENT); 343 430 clks[IMX8MN_ARM_PLL_BYPASS] = imx_clk_mux_flags("arm_pll_bypass", base + 0x84, 28, 1, arm_pll_bypass_sels, ARRAY_SIZE(arm_pll_bypass_sels), CLK_SET_RATE_PARENT); 344 - clks[IMX8MN_SYS_PLL1_BYPASS] = imx_clk_mux_flags("sys_pll1_bypass", base + 0x94, 28, 1, sys_pll1_bypass_sels, ARRAY_SIZE(sys_pll1_bypass_sels), CLK_SET_RATE_PARENT); 345 - clks[IMX8MN_SYS_PLL2_BYPASS] = imx_clk_mux_flags("sys_pll2_bypass", base + 0x104, 28, 1, sys_pll2_bypass_sels, ARRAY_SIZE(sys_pll2_bypass_sels), CLK_SET_RATE_PARENT); 346 431 clks[IMX8MN_SYS_PLL3_BYPASS] = imx_clk_mux_flags("sys_pll3_bypass", base + 0x114, 28, 1, sys_pll3_bypass_sels, ARRAY_SIZE(sys_pll3_bypass_sels), CLK_SET_RATE_PARENT); 347 432 348 433 /* PLL out gate */ ··· 351 440 clks[IMX8MN_GPU_PLL_OUT] = imx_clk_gate("gpu_pll_out", "gpu_pll_bypass", base + 0x64, 11); 352 441 clks[IMX8MN_VPU_PLL_OUT] = imx_clk_gate("vpu_pll_out", "vpu_pll_bypass", base + 0x74, 11); 353 442 clks[IMX8MN_ARM_PLL_OUT] = imx_clk_gate("arm_pll_out", "arm_pll_bypass", base + 0x84, 11); 354 - clks[IMX8MN_SYS_PLL1_OUT] = imx_clk_gate("sys_pll1_out", "sys_pll1_bypass", base + 0x94, 11); 355 - clks[IMX8MN_SYS_PLL2_OUT] = imx_clk_gate("sys_pll2_out", "sys_pll2_bypass", base + 0x104, 11); 356 443 clks[IMX8MN_SYS_PLL3_OUT] = imx_clk_gate("sys_pll3_out", "sys_pll3_bypass", base + 0x114, 11); 357 444 358 - /* SYS PLL fixed output */ 359 - clks[IMX8MN_SYS_PLL1_40M] = imx_clk_fixed_factor("sys_pll1_40m", "sys_pll1_out", 1, 20); 360 - clks[IMX8MN_SYS_PLL1_80M] = imx_clk_fixed_factor("sys_pll1_80m", "sys_pll1_out", 1, 10); 361 - clks[IMX8MN_SYS_PLL1_100M] = imx_clk_fixed_factor("sys_pll1_100m", "sys_pll1_out", 1, 8); 362 - clks[IMX8MN_SYS_PLL1_133M] = imx_clk_fixed_factor("sys_pll1_133m", "sys_pll1_out", 1, 6); 363 - clks[IMX8MN_SYS_PLL1_160M] = imx_clk_fixed_factor("sys_pll1_160m", "sys_pll1_out", 1, 5); 364 - clks[IMX8MN_SYS_PLL1_200M] = imx_clk_fixed_factor("sys_pll1_200m", "sys_pll1_out", 1, 4); 365 - clks[IMX8MN_SYS_PLL1_266M] = imx_clk_fixed_factor("sys_pll1_266m", "sys_pll1_out", 1, 3); 366 - clks[IMX8MN_SYS_PLL1_400M] = imx_clk_fixed_factor("sys_pll1_400m", "sys_pll1_out", 1, 2); 445 + /* SYS PLL1 fixed output */ 446 + clks[IMX8MN_SYS_PLL1_40M_CG] = imx_clk_gate("sys_pll1_40m_cg", "sys_pll1", base + 0x94, 27); 447 + clks[IMX8MN_SYS_PLL1_80M_CG] = imx_clk_gate("sys_pll1_80m_cg", "sys_pll1", base + 0x94, 25); 448 + clks[IMX8MN_SYS_PLL1_100M_CG] = imx_clk_gate("sys_pll1_100m_cg", "sys_pll1", base + 0x94, 23); 449 + clks[IMX8MN_SYS_PLL1_133M_CG] = imx_clk_gate("sys_pll1_133m_cg", "sys_pll1", base + 0x94, 21); 450 + clks[IMX8MN_SYS_PLL1_160M_CG] = imx_clk_gate("sys_pll1_160m_cg", "sys_pll1", base + 0x94, 19); 451 + clks[IMX8MN_SYS_PLL1_200M_CG] = imx_clk_gate("sys_pll1_200m_cg", "sys_pll1", base + 0x94, 17); 452 + clks[IMX8MN_SYS_PLL1_266M_CG] = imx_clk_gate("sys_pll1_266m_cg", "sys_pll1", base + 0x94, 15); 453 + clks[IMX8MN_SYS_PLL1_400M_CG] = imx_clk_gate("sys_pll1_400m_cg", "sys_pll1", base + 0x94, 13); 454 + clks[IMX8MN_SYS_PLL1_OUT] = imx_clk_gate("sys_pll1_out", "sys_pll1", base + 0x94, 11); 455 + 456 + clks[IMX8MN_SYS_PLL1_40M] = imx_clk_fixed_factor("sys_pll1_40m", "sys_pll1_40m_cg", 1, 20); 457 + clks[IMX8MN_SYS_PLL1_80M] = imx_clk_fixed_factor("sys_pll1_80m", "sys_pll1_80m_cg", 1, 10); 458 + clks[IMX8MN_SYS_PLL1_100M] = imx_clk_fixed_factor("sys_pll1_100m", "sys_pll1_100m_cg", 1, 8); 459 + clks[IMX8MN_SYS_PLL1_133M] = imx_clk_fixed_factor("sys_pll1_133m", "sys_pll1_133m_cg", 1, 6); 460 + clks[IMX8MN_SYS_PLL1_160M] = imx_clk_fixed_factor("sys_pll1_160m", "sys_pll1_160m_cg", 1, 5); 461 + clks[IMX8MN_SYS_PLL1_200M] = imx_clk_fixed_factor("sys_pll1_200m", "sys_pll1_200m_cg", 1, 4); 462 + clks[IMX8MN_SYS_PLL1_266M] = imx_clk_fixed_factor("sys_pll1_266m", "sys_pll1_266m_cg", 1, 3); 463 + clks[IMX8MN_SYS_PLL1_400M] = imx_clk_fixed_factor("sys_pll1_400m", "sys_pll1_400m_cg", 1, 2); 367 464 clks[IMX8MN_SYS_PLL1_800M] = imx_clk_fixed_factor("sys_pll1_800m", "sys_pll1_out", 1, 1); 368 465 369 - clks[IMX8MN_SYS_PLL2_50M] = imx_clk_fixed_factor("sys_pll2_50m", "sys_pll2_out", 1, 20); 370 - clks[IMX8MN_SYS_PLL2_100M] = imx_clk_fixed_factor("sys_pll2_100m", "sys_pll2_out", 1, 10); 371 - clks[IMX8MN_SYS_PLL2_125M] = imx_clk_fixed_factor("sys_pll2_125m", "sys_pll2_out", 1, 8); 372 - clks[IMX8MN_SYS_PLL2_166M] = imx_clk_fixed_factor("sys_pll2_166m", "sys_pll2_out", 1, 6); 373 - clks[IMX8MN_SYS_PLL2_200M] = imx_clk_fixed_factor("sys_pll2_200m", "sys_pll2_out", 1, 5); 374 - clks[IMX8MN_SYS_PLL2_250M] = imx_clk_fixed_factor("sys_pll2_250m", "sys_pll2_out", 1, 4); 375 - clks[IMX8MN_SYS_PLL2_333M] = imx_clk_fixed_factor("sys_pll2_333m", "sys_pll2_out", 1, 3); 376 - clks[IMX8MN_SYS_PLL2_500M] = imx_clk_fixed_factor("sys_pll2_500m", "sys_pll2_out", 1, 2); 466 + /* SYS PLL2 fixed output */ 467 + clks[IMX8MN_SYS_PLL2_50M_CG] = imx_clk_gate("sys_pll2_50m_cg", "sys_pll2", base + 0x104, 27); 468 + clks[IMX8MN_SYS_PLL2_100M_CG] = imx_clk_gate("sys_pll2_100m_cg", "sys_pll2", base + 0x104, 25); 469 + clks[IMX8MN_SYS_PLL2_125M_CG] = imx_clk_gate("sys_pll2_125m_cg", "sys_pll2", base + 0x104, 23); 470 + clks[IMX8MN_SYS_PLL2_166M_CG] = imx_clk_gate("sys_pll2_166m_cg", "sys_pll2", base + 0x104, 21); 471 + clks[IMX8MN_SYS_PLL2_200M_CG] = imx_clk_gate("sys_pll2_200m_cg", "sys_pll2", base + 0x104, 19); 472 + clks[IMX8MN_SYS_PLL2_250M_CG] = imx_clk_gate("sys_pll2_250m_cg", "sys_pll2", base + 0x104, 17); 473 + clks[IMX8MN_SYS_PLL2_333M_CG] = imx_clk_gate("sys_pll2_333m_cg", "sys_pll2", base + 0x104, 15); 474 + clks[IMX8MN_SYS_PLL2_500M_CG] = imx_clk_gate("sys_pll2_500m_cg", "sys_pll2", base + 0x104, 13); 475 + clks[IMX8MN_SYS_PLL2_OUT] = imx_clk_gate("sys_pll2_out", "sys_pll2", base + 0x104, 11); 476 + 477 + clks[IMX8MN_SYS_PLL2_50M] = imx_clk_fixed_factor("sys_pll2_50m", "sys_pll2_50m_cg", 1, 20); 478 + clks[IMX8MN_SYS_PLL2_100M] = imx_clk_fixed_factor("sys_pll2_100m", "sys_pll2_100m_cg", 1, 10); 479 + clks[IMX8MN_SYS_PLL2_125M] = imx_clk_fixed_factor("sys_pll2_125m", "sys_pll2_125m_cg", 1, 8); 480 + clks[IMX8MN_SYS_PLL2_166M] = imx_clk_fixed_factor("sys_pll2_166m", "sys_pll2_166m_cg", 1, 6); 481 + clks[IMX8MN_SYS_PLL2_200M] = imx_clk_fixed_factor("sys_pll2_200m", "sys_pll2_200m_cg", 1, 5); 482 + clks[IMX8MN_SYS_PLL2_250M] = imx_clk_fixed_factor("sys_pll2_250m", "sys_pll2_250m_cg", 1, 4); 483 + clks[IMX8MN_SYS_PLL2_333M] = imx_clk_fixed_factor("sys_pll2_333m", "sys_pll2_333m_cg", 1, 3); 484 + clks[IMX8MN_SYS_PLL2_500M] = imx_clk_fixed_factor("sys_pll2_500m", "sys_pll2_500m_cg", 1, 2); 377 485 clks[IMX8MN_SYS_PLL2_1000M] = imx_clk_fixed_factor("sys_pll2_1000m", "sys_pll2_out", 1, 1); 378 486 379 487 np = dev->of_node;
+48 -27
drivers/clk/imx/clk-imx8mq.c
··· 34 34 static const char * const audio_pll2_bypass_sels[] = {"audio_pll2", "audio_pll2_ref_sel", }; 35 35 static const char * const video_pll1_bypass_sels[] = {"video_pll1", "video_pll1_ref_sel", }; 36 36 37 - static const char * const sys1_pll_out_sels[] = {"sys1_pll1_ref_sel", }; 38 - static const char * const sys2_pll_out_sels[] = {"sys1_pll1_ref_sel", "sys2_pll1_ref_sel", }; 39 - static const char * const sys3_pll_out_sels[] = {"sys3_pll1_ref_sel", "sys2_pll1_ref_sel", }; 37 + static const char * const sys3_pll_out_sels[] = {"sys3_pll1_ref_sel", }; 40 38 static const char * const dram_pll_out_sels[] = {"dram_pll1_ref_sel", }; 39 + static const char * const video2_pll_out_sels[] = {"video2_pll1_ref_sel", }; 41 40 42 41 /* CCM ROOT */ 43 42 static const char * const imx8mq_a53_sels[] = {"osc_25m", "arm_pll_out", "sys2_pll_500m", "sys2_pll_1000m", ··· 306 307 clks[IMX8MQ_AUDIO_PLL1_REF_SEL] = imx_clk_mux("audio_pll1_ref_sel", base + 0x0, 16, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)); 307 308 clks[IMX8MQ_AUDIO_PLL2_REF_SEL] = imx_clk_mux("audio_pll2_ref_sel", base + 0x8, 16, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)); 308 309 clks[IMX8MQ_VIDEO_PLL1_REF_SEL] = imx_clk_mux("video_pll1_ref_sel", base + 0x10, 16, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)); 309 - clks[IMX8MQ_SYS1_PLL1_REF_SEL] = imx_clk_mux("sys1_pll1_ref_sel", base + 0x30, 0, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)); 310 - clks[IMX8MQ_SYS2_PLL1_REF_SEL] = imx_clk_mux("sys2_pll1_ref_sel", base + 0x3c, 0, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)); 311 310 clks[IMX8MQ_SYS3_PLL1_REF_SEL] = imx_clk_mux("sys3_pll1_ref_sel", base + 0x48, 0, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)); 312 311 clks[IMX8MQ_DRAM_PLL1_REF_SEL] = imx_clk_mux("dram_pll1_ref_sel", base + 0x60, 0, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)); 312 + clks[IMX8MQ_VIDEO2_PLL1_REF_SEL] = imx_clk_mux("video2_pll1_ref_sel", base + 0x54, 0, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)); 313 313 314 314 clks[IMX8MQ_ARM_PLL_REF_DIV] = imx_clk_divider("arm_pll_ref_div", "arm_pll_ref_sel", base + 0x28, 5, 6); 315 315 clks[IMX8MQ_GPU_PLL_REF_DIV] = imx_clk_divider("gpu_pll_ref_div", "gpu_pll_ref_sel", base + 0x18, 5, 6); ··· 340 342 clks[IMX8MQ_AUDIO_PLL2_OUT] = imx_clk_gate("audio_pll2_out", "audio_pll2_bypass", base + 0x8, 21); 341 343 clks[IMX8MQ_VIDEO_PLL1_OUT] = imx_clk_gate("video_pll1_out", "video_pll1_bypass", base + 0x10, 21); 342 344 343 - clks[IMX8MQ_SYS1_PLL_OUT] = imx_clk_sccg_pll("sys1_pll_out", sys1_pll_out_sels, ARRAY_SIZE(sys1_pll_out_sels), 0, 0, 0, base + 0x30, CLK_IS_CRITICAL); 344 - clks[IMX8MQ_SYS2_PLL_OUT] = imx_clk_sccg_pll("sys2_pll_out", sys2_pll_out_sels, ARRAY_SIZE(sys2_pll_out_sels), 0, 0, 1, base + 0x3c, CLK_IS_CRITICAL); 345 - clks[IMX8MQ_SYS3_PLL_OUT] = imx_clk_sccg_pll("sys3_pll_out", sys3_pll_out_sels, ARRAY_SIZE(sys3_pll_out_sels), 0, 0, 1, base + 0x48, CLK_IS_CRITICAL); 345 + clks[IMX8MQ_SYS1_PLL_OUT] = imx_clk_fixed("sys1_pll_out", 800000000); 346 + clks[IMX8MQ_SYS2_PLL_OUT] = imx_clk_fixed("sys2_pll_out", 1000000000); 347 + clks[IMX8MQ_SYS3_PLL_OUT] = imx_clk_sccg_pll("sys3_pll_out", sys3_pll_out_sels, ARRAY_SIZE(sys3_pll_out_sels), 0, 0, 0, base + 0x48, CLK_IS_CRITICAL); 346 348 clks[IMX8MQ_DRAM_PLL_OUT] = imx_clk_sccg_pll("dram_pll_out", dram_pll_out_sels, ARRAY_SIZE(dram_pll_out_sels), 0, 0, 0, base + 0x60, CLK_IS_CRITICAL); 347 - /* SYS PLL fixed output */ 348 - clks[IMX8MQ_SYS1_PLL_40M] = imx_clk_fixed_factor("sys1_pll_40m", "sys1_pll_out", 1, 20); 349 - clks[IMX8MQ_SYS1_PLL_80M] = imx_clk_fixed_factor("sys1_pll_80m", "sys1_pll_out", 1, 10); 350 - clks[IMX8MQ_SYS1_PLL_100M] = imx_clk_fixed_factor("sys1_pll_100m", "sys1_pll_out", 1, 8); 351 - clks[IMX8MQ_SYS1_PLL_133M] = imx_clk_fixed_factor("sys1_pll_133m", "sys1_pll_out", 1, 6); 352 - clks[IMX8MQ_SYS1_PLL_160M] = imx_clk_fixed_factor("sys1_pll_160m", "sys1_pll_out", 1, 5); 353 - clks[IMX8MQ_SYS1_PLL_200M] = imx_clk_fixed_factor("sys1_pll_200m", "sys1_pll_out", 1, 4); 354 - clks[IMX8MQ_SYS1_PLL_266M] = imx_clk_fixed_factor("sys1_pll_266m", "sys1_pll_out", 1, 3); 355 - clks[IMX8MQ_SYS1_PLL_400M] = imx_clk_fixed_factor("sys1_pll_400m", "sys1_pll_out", 1, 2); 356 - clks[IMX8MQ_SYS1_PLL_800M] = imx_clk_fixed_factor("sys1_pll_800m", "sys1_pll_out", 1, 1); 349 + clks[IMX8MQ_VIDEO2_PLL_OUT] = imx_clk_sccg_pll("video2_pll_out", video2_pll_out_sels, ARRAY_SIZE(video2_pll_out_sels), 0, 0, 0, base + 0x54, 0); 357 350 358 - clks[IMX8MQ_SYS2_PLL_50M] = imx_clk_fixed_factor("sys2_pll_50m", "sys2_pll_out", 1, 20); 359 - clks[IMX8MQ_SYS2_PLL_100M] = imx_clk_fixed_factor("sys2_pll_100m", "sys2_pll_out", 1, 10); 360 - clks[IMX8MQ_SYS2_PLL_125M] = imx_clk_fixed_factor("sys2_pll_125m", "sys2_pll_out", 1, 8); 361 - clks[IMX8MQ_SYS2_PLL_166M] = imx_clk_fixed_factor("sys2_pll_166m", "sys2_pll_out", 1, 6); 362 - clks[IMX8MQ_SYS2_PLL_200M] = imx_clk_fixed_factor("sys2_pll_200m", "sys2_pll_out", 1, 5); 363 - clks[IMX8MQ_SYS2_PLL_250M] = imx_clk_fixed_factor("sys2_pll_250m", "sys2_pll_out", 1, 4); 364 - clks[IMX8MQ_SYS2_PLL_333M] = imx_clk_fixed_factor("sys2_pll_333m", "sys2_pll_out", 1, 3); 365 - clks[IMX8MQ_SYS2_PLL_500M] = imx_clk_fixed_factor("sys2_pll_500m", "sys2_pll_out", 1, 2); 366 - clks[IMX8MQ_SYS2_PLL_1000M] = imx_clk_fixed_factor("sys2_pll_1000m", "sys2_pll_out", 1, 1); 351 + /* SYS PLL1 fixed output */ 352 + clks[IMX8MQ_SYS1_PLL_40M_CG] = imx_clk_gate("sys1_pll_40m_cg", "sys1_pll_out", base + 0x30, 9); 353 + clks[IMX8MQ_SYS1_PLL_80M_CG] = imx_clk_gate("sys1_pll_80m_cg", "sys1_pll_out", base + 0x30, 11); 354 + clks[IMX8MQ_SYS1_PLL_100M_CG] = imx_clk_gate("sys1_pll_100m_cg", "sys1_pll_out", base + 0x30, 13); 355 + clks[IMX8MQ_SYS1_PLL_133M_CG] = imx_clk_gate("sys1_pll_133m_cg", "sys1_pll_out", base + 0x30, 15); 356 + clks[IMX8MQ_SYS1_PLL_160M_CG] = imx_clk_gate("sys1_pll_160m_cg", "sys1_pll_out", base + 0x30, 17); 357 + clks[IMX8MQ_SYS1_PLL_200M_CG] = imx_clk_gate("sys1_pll_200m_cg", "sys1_pll_out", base + 0x30, 19); 358 + clks[IMX8MQ_SYS1_PLL_266M_CG] = imx_clk_gate("sys1_pll_266m_cg", "sys1_pll_out", base + 0x30, 21); 359 + clks[IMX8MQ_SYS1_PLL_400M_CG] = imx_clk_gate("sys1_pll_400m_cg", "sys1_pll_out", base + 0x30, 23); 360 + clks[IMX8MQ_SYS1_PLL_800M_CG] = imx_clk_gate("sys1_pll_800m_cg", "sys1_pll_out", base + 0x30, 25); 361 + 362 + clks[IMX8MQ_SYS1_PLL_40M] = imx_clk_fixed_factor("sys1_pll_40m", "sys1_pll_40m_cg", 1, 20); 363 + clks[IMX8MQ_SYS1_PLL_80M] = imx_clk_fixed_factor("sys1_pll_80m", "sys1_pll_80m_cg", 1, 10); 364 + clks[IMX8MQ_SYS1_PLL_100M] = imx_clk_fixed_factor("sys1_pll_100m", "sys1_pll_100m_cg", 1, 8); 365 + clks[IMX8MQ_SYS1_PLL_133M] = imx_clk_fixed_factor("sys1_pll_133m", "sys1_pll_133m_cg", 1, 6); 366 + clks[IMX8MQ_SYS1_PLL_160M] = imx_clk_fixed_factor("sys1_pll_160m", "sys1_pll_160m_cg", 1, 5); 367 + clks[IMX8MQ_SYS1_PLL_200M] = imx_clk_fixed_factor("sys1_pll_200m", "sys1_pll_200m_cg", 1, 4); 368 + clks[IMX8MQ_SYS1_PLL_266M] = imx_clk_fixed_factor("sys1_pll_266m", "sys1_pll_266m_cg", 1, 3); 369 + clks[IMX8MQ_SYS1_PLL_400M] = imx_clk_fixed_factor("sys1_pll_400m", "sys1_pll_400m_cg", 1, 2); 370 + clks[IMX8MQ_SYS1_PLL_800M] = imx_clk_fixed_factor("sys1_pll_800m", "sys1_pll_800m_cg", 1, 1); 371 + 372 + /* SYS PLL2 fixed output */ 373 + clks[IMX8MQ_SYS2_PLL_50M_CG] = imx_clk_gate("sys2_pll_50m_cg", "sys2_pll_out", base + 0x3c, 9); 374 + clks[IMX8MQ_SYS2_PLL_100M_CG] = imx_clk_gate("sys2_pll_100m_cg", "sys2_pll_out", base + 0x3c, 11); 375 + clks[IMX8MQ_SYS2_PLL_125M_CG] = imx_clk_gate("sys2_pll_125m_cg", "sys2_pll_out", base + 0x3c, 13); 376 + clks[IMX8MQ_SYS2_PLL_166M_CG] = imx_clk_gate("sys2_pll_166m_cg", "sys2_pll_out", base + 0x3c, 15); 377 + clks[IMX8MQ_SYS2_PLL_200M_CG] = imx_clk_gate("sys2_pll_200m_cg", "sys2_pll_out", base + 0x3c, 17); 378 + clks[IMX8MQ_SYS2_PLL_250M_CG] = imx_clk_gate("sys2_pll_250m_cg", "sys2_pll_out", base + 0x3c, 19); 379 + clks[IMX8MQ_SYS2_PLL_333M_CG] = imx_clk_gate("sys2_pll_333m_cg", "sys2_pll_out", base + 0x3c, 21); 380 + clks[IMX8MQ_SYS2_PLL_500M_CG] = imx_clk_gate("sys2_pll_500m_cg", "sys2_pll_out", base + 0x3c, 23); 381 + clks[IMX8MQ_SYS2_PLL_1000M_CG] = imx_clk_gate("sys2_pll_1000m_cg", "sys2_pll_out", base + 0x3c, 25); 382 + 383 + clks[IMX8MQ_SYS2_PLL_50M] = imx_clk_fixed_factor("sys2_pll_50m", "sys2_pll_50m_cg", 1, 20); 384 + clks[IMX8MQ_SYS2_PLL_100M] = imx_clk_fixed_factor("sys2_pll_100m", "sys2_pll_100m_cg", 1, 10); 385 + clks[IMX8MQ_SYS2_PLL_125M] = imx_clk_fixed_factor("sys2_pll_125m", "sys2_pll_125m_cg", 1, 8); 386 + clks[IMX8MQ_SYS2_PLL_166M] = imx_clk_fixed_factor("sys2_pll_166m", "sys2_pll_166m_cg", 1, 6); 387 + clks[IMX8MQ_SYS2_PLL_200M] = imx_clk_fixed_factor("sys2_pll_200m", "sys2_pll_200m_cg", 1, 5); 388 + clks[IMX8MQ_SYS2_PLL_250M] = imx_clk_fixed_factor("sys2_pll_250m", "sys2_pll_250m_cg", 1, 4); 389 + clks[IMX8MQ_SYS2_PLL_333M] = imx_clk_fixed_factor("sys2_pll_333m", "sys2_pll_333m_cg", 1, 3); 390 + clks[IMX8MQ_SYS2_PLL_500M] = imx_clk_fixed_factor("sys2_pll_500m", "sys2_pll_500m_cg", 1, 2); 391 + clks[IMX8MQ_SYS2_PLL_1000M] = imx_clk_fixed_factor("sys2_pll_1000m", "sys2_pll_1000m_cg", 1, 1); 367 392 368 393 np = dev->of_node; 369 394 base = devm_platform_ioremap_resource(pdev, 0);
+40 -32
drivers/clk/imx/clk-pll14xx.c
··· 41 41 42 42 #define to_clk_pll14xx(_hw) container_of(_hw, struct clk_pll14xx, hw) 43 43 44 + static const struct imx_pll14xx_rate_table imx_pll1416x_tbl[] = { 45 + PLL_1416X_RATE(1800000000U, 225, 3, 0), 46 + PLL_1416X_RATE(1600000000U, 200, 3, 0), 47 + PLL_1416X_RATE(1500000000U, 375, 3, 1), 48 + PLL_1416X_RATE(1400000000U, 350, 3, 1), 49 + PLL_1416X_RATE(1200000000U, 300, 3, 1), 50 + PLL_1416X_RATE(1000000000U, 250, 3, 1), 51 + PLL_1416X_RATE(800000000U, 200, 3, 1), 52 + PLL_1416X_RATE(750000000U, 250, 2, 2), 53 + PLL_1416X_RATE(700000000U, 350, 3, 2), 54 + PLL_1416X_RATE(600000000U, 300, 3, 2), 55 + }; 56 + 57 + static const struct imx_pll14xx_rate_table imx_pll1443x_tbl[] = { 58 + PLL_1443X_RATE(650000000U, 325, 3, 2, 0), 59 + PLL_1443X_RATE(594000000U, 198, 2, 2, 0), 60 + PLL_1443X_RATE(393216000U, 262, 2, 3, 9437), 61 + PLL_1443X_RATE(361267200U, 361, 3, 3, 17511), 62 + }; 63 + 64 + struct imx_pll14xx_clk imx_1443x_pll = { 65 + .type = PLL_1443X, 66 + .rate_table = imx_pll1443x_tbl, 67 + .rate_count = ARRAY_SIZE(imx_pll1443x_tbl), 68 + }; 69 + 70 + struct imx_pll14xx_clk imx_1416x_pll = { 71 + .type = PLL_1416X, 72 + .rate_table = imx_pll1416x_tbl, 73 + .rate_count = ARRAY_SIZE(imx_pll1416x_tbl), 74 + }; 75 + 44 76 static const struct imx_pll14xx_rate_table *imx_get_pll_settings( 45 77 struct clk_pll14xx *pll, unsigned long rate) 46 78 { ··· 144 112 return fvco; 145 113 } 146 114 147 - static inline bool clk_pll1416x_mp_change(const struct imx_pll14xx_rate_table *rate, 115 + static inline bool clk_pll14xx_mp_change(const struct imx_pll14xx_rate_table *rate, 148 116 u32 pll_div) 149 117 { 150 118 u32 old_mdiv, old_pdiv; 151 119 152 - old_mdiv = (pll_div >> MDIV_SHIFT) & MDIV_MASK; 153 - old_pdiv = (pll_div >> PDIV_SHIFT) & PDIV_MASK; 120 + old_mdiv = (pll_div & MDIV_MASK) >> MDIV_SHIFT; 121 + old_pdiv = (pll_div & PDIV_MASK) >> PDIV_SHIFT; 154 122 155 123 return rate->mdiv != old_mdiv || rate->pdiv != old_pdiv; 156 - } 157 - 158 - static inline bool clk_pll1443x_mpk_change(const struct imx_pll14xx_rate_table *rate, 159 - u32 pll_div_ctl0, u32 pll_div_ctl1) 160 - { 161 - u32 old_mdiv, old_pdiv, old_kdiv; 162 - 163 - old_mdiv = (pll_div_ctl0 >> MDIV_SHIFT) & MDIV_MASK; 164 - old_pdiv = (pll_div_ctl0 >> PDIV_SHIFT) & PDIV_MASK; 165 - old_kdiv = (pll_div_ctl1 >> KDIV_SHIFT) & KDIV_MASK; 166 - 167 - return rate->mdiv != old_mdiv || rate->pdiv != old_pdiv || 168 - rate->kdiv != old_kdiv; 169 - } 170 - 171 - static inline bool clk_pll1443x_mp_change(const struct imx_pll14xx_rate_table *rate, 172 - u32 pll_div_ctl0, u32 pll_div_ctl1) 173 - { 174 - u32 old_mdiv, old_pdiv, old_kdiv; 175 - 176 - old_mdiv = (pll_div_ctl0 >> MDIV_SHIFT) & MDIV_MASK; 177 - old_pdiv = (pll_div_ctl0 >> PDIV_SHIFT) & PDIV_MASK; 178 - old_kdiv = (pll_div_ctl1 >> KDIV_SHIFT) & KDIV_MASK; 179 - 180 - return rate->mdiv != old_mdiv || rate->pdiv != old_pdiv || 181 - rate->kdiv != old_kdiv; 182 124 } 183 125 184 126 static int clk_pll14xx_wait_lock(struct clk_pll14xx *pll) ··· 180 174 181 175 tmp = readl_relaxed(pll->base + 4); 182 176 183 - if (!clk_pll1416x_mp_change(rate, tmp)) { 177 + if (!clk_pll14xx_mp_change(rate, tmp)) { 184 178 tmp &= ~(SDIV_MASK) << SDIV_SHIFT; 185 179 tmp |= rate->sdiv << SDIV_SHIFT; 186 180 writel_relaxed(tmp, pll->base + 4); ··· 245 239 } 246 240 247 241 tmp = readl_relaxed(pll->base + 4); 248 - div_val = readl_relaxed(pll->base + 8); 249 242 250 - if (!clk_pll1443x_mpk_change(rate, tmp, div_val)) { 243 + if (!clk_pll14xx_mp_change(rate, tmp)) { 251 244 tmp &= ~(SDIV_MASK) << SDIV_SHIFT; 252 245 tmp |= rate->sdiv << SDIV_SHIFT; 253 246 writel_relaxed(tmp, pll->base + 4); 247 + 248 + tmp = rate->kdiv << KDIV_SHIFT; 249 + writel_relaxed(tmp, pll->base + 8); 254 250 255 251 return 0; 256 252 }
+3
drivers/clk/imx/clk.h
··· 50 50 int flags; 51 51 }; 52 52 53 + extern struct imx_pll14xx_clk imx_1416x_pll; 54 + extern struct imx_pll14xx_clk imx_1443x_pll; 55 + 53 56 #define imx_clk_cpu(name, parent_name, div, mux, pll, step) \ 54 57 imx_clk_hw_cpu(name, parent_name, div, mux, pll, step)->clk 55 58
+11 -1
drivers/clk/ingenic/Kconfig
··· 1 1 # SPDX-License-Identifier: GPL-2.0-only 2 2 menu "Ingenic SoCs drivers" 3 - depends on MIPS 3 + depends on MIPS || COMPILE_TEST 4 4 5 5 config INGENIC_CGU_COMMON 6 6 bool ··· 44 44 and compatible SoCs. 45 45 46 46 If building for a JZ4780 SoC, you want to say Y here. 47 + 48 + config INGENIC_CGU_X1000 49 + bool "Ingenic X1000 CGU driver" 50 + default MACH_X1000 51 + select INGENIC_CGU_COMMON 52 + help 53 + Support the clocks provided by the CGU hardware on Ingenic X1000 54 + and compatible SoCs. 55 + 56 + If building for a X1000 SoC, you want to say Y here. 47 57 48 58 config INGENIC_TCU_CLK 49 59 bool "Ingenic JZ47xx TCU clocks driver"
+1
drivers/clk/ingenic/Makefile
··· 4 4 obj-$(CONFIG_INGENIC_CGU_JZ4725B) += jz4725b-cgu.o 5 5 obj-$(CONFIG_INGENIC_CGU_JZ4770) += jz4770-cgu.o 6 6 obj-$(CONFIG_INGENIC_CGU_JZ4780) += jz4780-cgu.o 7 + obj-$(CONFIG_INGENIC_CGU_X1000) += x1000-cgu.o 7 8 obj-$(CONFIG_INGENIC_TCU_CLK) += tcu.o
+1 -2
drivers/clk/ingenic/tcu.c
··· 358 358 } 359 359 } 360 360 361 - tcu->clocks = kzalloc(sizeof(*tcu->clocks) + 362 - sizeof(*tcu->clocks->hws) * TCU_CLK_COUNT, 361 + tcu->clocks = kzalloc(struct_size(tcu->clocks, hws, TCU_CLK_COUNT), 363 362 GFP_KERNEL); 364 363 if (!tcu->clocks) { 365 364 ret = -ENOMEM;
+274
drivers/clk/ingenic/x1000-cgu.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * X1000 SoC CGU driver 4 + * Copyright (c) 2019 Zhou Yanjie <zhouyanjie@zoho.com> 5 + */ 6 + 7 + #include <linux/clk-provider.h> 8 + #include <linux/delay.h> 9 + #include <linux/of.h> 10 + #include <dt-bindings/clock/x1000-cgu.h> 11 + #include "cgu.h" 12 + #include "pm.h" 13 + 14 + /* CGU register offsets */ 15 + #define CGU_REG_CPCCR 0x00 16 + #define CGU_REG_APLL 0x10 17 + #define CGU_REG_MPLL 0x14 18 + #define CGU_REG_CLKGR 0x20 19 + #define CGU_REG_OPCR 0x24 20 + #define CGU_REG_DDRCDR 0x2c 21 + #define CGU_REG_MACCDR 0x54 22 + #define CGU_REG_I2SCDR 0x60 23 + #define CGU_REG_LPCDR 0x64 24 + #define CGU_REG_MSC0CDR 0x68 25 + #define CGU_REG_I2SCDR1 0x70 26 + #define CGU_REG_SSICDR 0x74 27 + #define CGU_REG_CIMCDR 0x7c 28 + #define CGU_REG_PCMCDR 0x84 29 + #define CGU_REG_MSC1CDR 0xa4 30 + #define CGU_REG_CMP_INTR 0xb0 31 + #define CGU_REG_CMP_INTRE 0xb4 32 + #define CGU_REG_DRCG 0xd0 33 + #define CGU_REG_CPCSR 0xd4 34 + #define CGU_REG_PCMCDR1 0xe0 35 + #define CGU_REG_MACPHYC 0xe8 36 + 37 + /* bits within the OPCR register */ 38 + #define OPCR_SPENDN0 BIT(7) 39 + #define OPCR_SPENDN1 BIT(6) 40 + 41 + static struct ingenic_cgu *cgu; 42 + 43 + static const s8 pll_od_encoding[8] = { 44 + 0x0, 0x1, -1, 0x2, -1, -1, -1, 0x3, 45 + }; 46 + 47 + static const struct ingenic_cgu_clk_info x1000_cgu_clocks[] = { 48 + 49 + /* External clocks */ 50 + 51 + [X1000_CLK_EXCLK] = { "ext", CGU_CLK_EXT }, 52 + [X1000_CLK_RTCLK] = { "rtc", CGU_CLK_EXT }, 53 + 54 + /* PLLs */ 55 + 56 + [X1000_CLK_APLL] = { 57 + "apll", CGU_CLK_PLL, 58 + .parents = { X1000_CLK_EXCLK, -1, -1, -1 }, 59 + .pll = { 60 + .reg = CGU_REG_APLL, 61 + .m_shift = 24, 62 + .m_bits = 7, 63 + .m_offset = 1, 64 + .n_shift = 18, 65 + .n_bits = 5, 66 + .n_offset = 1, 67 + .od_shift = 16, 68 + .od_bits = 2, 69 + .od_max = 8, 70 + .od_encoding = pll_od_encoding, 71 + .bypass_bit = 9, 72 + .enable_bit = 8, 73 + .stable_bit = 10, 74 + }, 75 + }, 76 + 77 + [X1000_CLK_MPLL] = { 78 + "mpll", CGU_CLK_PLL, 79 + .parents = { X1000_CLK_EXCLK, -1, -1, -1 }, 80 + .pll = { 81 + .reg = CGU_REG_MPLL, 82 + .m_shift = 24, 83 + .m_bits = 7, 84 + .m_offset = 1, 85 + .n_shift = 18, 86 + .n_bits = 5, 87 + .n_offset = 1, 88 + .od_shift = 16, 89 + .od_bits = 2, 90 + .od_max = 8, 91 + .od_encoding = pll_od_encoding, 92 + .bypass_bit = 6, 93 + .enable_bit = 7, 94 + .stable_bit = 0, 95 + }, 96 + }, 97 + 98 + /* Muxes & dividers */ 99 + 100 + [X1000_CLK_SCLKA] = { 101 + "sclk_a", CGU_CLK_MUX, 102 + .parents = { -1, X1000_CLK_EXCLK, X1000_CLK_APLL, -1 }, 103 + .mux = { CGU_REG_CPCCR, 30, 2 }, 104 + }, 105 + 106 + [X1000_CLK_CPUMUX] = { 107 + "cpu_mux", CGU_CLK_MUX, 108 + .parents = { -1, X1000_CLK_SCLKA, X1000_CLK_MPLL, -1 }, 109 + .mux = { CGU_REG_CPCCR, 28, 2 }, 110 + }, 111 + 112 + [X1000_CLK_CPU] = { 113 + "cpu", CGU_CLK_DIV, 114 + .parents = { X1000_CLK_CPUMUX, -1, -1, -1 }, 115 + .div = { CGU_REG_CPCCR, 0, 1, 4, 22, -1, -1 }, 116 + }, 117 + 118 + [X1000_CLK_L2CACHE] = { 119 + "l2cache", CGU_CLK_DIV, 120 + .parents = { X1000_CLK_CPUMUX, -1, -1, -1 }, 121 + .div = { CGU_REG_CPCCR, 4, 1, 4, 22, -1, -1 }, 122 + }, 123 + 124 + [X1000_CLK_AHB0] = { 125 + "ahb0", CGU_CLK_MUX | CGU_CLK_DIV, 126 + .parents = { -1, X1000_CLK_SCLKA, X1000_CLK_MPLL, -1 }, 127 + .mux = { CGU_REG_CPCCR, 26, 2 }, 128 + .div = { CGU_REG_CPCCR, 8, 1, 4, 21, -1, -1 }, 129 + }, 130 + 131 + [X1000_CLK_AHB2PMUX] = { 132 + "ahb2_apb_mux", CGU_CLK_MUX, 133 + .parents = { -1, X1000_CLK_SCLKA, X1000_CLK_MPLL, -1 }, 134 + .mux = { CGU_REG_CPCCR, 24, 2 }, 135 + }, 136 + 137 + [X1000_CLK_AHB2] = { 138 + "ahb2", CGU_CLK_DIV, 139 + .parents = { X1000_CLK_AHB2PMUX, -1, -1, -1 }, 140 + .div = { CGU_REG_CPCCR, 12, 1, 4, 20, -1, -1 }, 141 + }, 142 + 143 + [X1000_CLK_PCLK] = { 144 + "pclk", CGU_CLK_DIV, 145 + .parents = { X1000_CLK_AHB2PMUX, -1, -1, -1 }, 146 + .div = { CGU_REG_CPCCR, 16, 1, 4, 20, -1, -1 }, 147 + }, 148 + 149 + [X1000_CLK_DDR] = { 150 + "ddr", CGU_CLK_MUX | CGU_CLK_DIV | CGU_CLK_GATE, 151 + .parents = { -1, X1000_CLK_SCLKA, X1000_CLK_MPLL, -1 }, 152 + .mux = { CGU_REG_DDRCDR, 30, 2 }, 153 + .div = { CGU_REG_DDRCDR, 0, 1, 4, 29, 28, 27 }, 154 + .gate = { CGU_REG_CLKGR, 31 }, 155 + }, 156 + 157 + [X1000_CLK_MAC] = { 158 + "mac", CGU_CLK_MUX | CGU_CLK_DIV | CGU_CLK_GATE, 159 + .parents = { X1000_CLK_SCLKA, X1000_CLK_MPLL}, 160 + .mux = { CGU_REG_MACCDR, 31, 1 }, 161 + .div = { CGU_REG_MACCDR, 0, 1, 8, 29, 28, 27 }, 162 + .gate = { CGU_REG_CLKGR, 25 }, 163 + }, 164 + 165 + [X1000_CLK_MSCMUX] = { 166 + "msc_mux", CGU_CLK_MUX, 167 + .parents = { X1000_CLK_SCLKA, X1000_CLK_MPLL}, 168 + .mux = { CGU_REG_MSC0CDR, 31, 1 }, 169 + }, 170 + 171 + [X1000_CLK_MSC0] = { 172 + "msc0", CGU_CLK_DIV | CGU_CLK_GATE, 173 + .parents = { X1000_CLK_MSCMUX, -1, -1, -1 }, 174 + .div = { CGU_REG_MSC0CDR, 0, 2, 8, 29, 28, 27 }, 175 + .gate = { CGU_REG_CLKGR, 4 }, 176 + }, 177 + 178 + [X1000_CLK_MSC1] = { 179 + "msc1", CGU_CLK_DIV | CGU_CLK_GATE, 180 + .parents = { X1000_CLK_MSCMUX, -1, -1, -1 }, 181 + .div = { CGU_REG_MSC1CDR, 0, 2, 8, 29, 28, 27 }, 182 + .gate = { CGU_REG_CLKGR, 5 }, 183 + }, 184 + 185 + [X1000_CLK_SSIPLL] = { 186 + "ssi_pll", CGU_CLK_MUX | CGU_CLK_DIV, 187 + .parents = { X1000_CLK_SCLKA, X1000_CLK_MPLL, -1, -1 }, 188 + .mux = { CGU_REG_SSICDR, 31, 1 }, 189 + .div = { CGU_REG_SSICDR, 0, 1, 8, 29, 28, 27 }, 190 + }, 191 + 192 + [X1000_CLK_SSIMUX] = { 193 + "ssi_mux", CGU_CLK_MUX, 194 + .parents = { X1000_CLK_EXCLK, X1000_CLK_SSIPLL, -1, -1 }, 195 + .mux = { CGU_REG_SSICDR, 30, 1 }, 196 + }, 197 + 198 + /* Gate-only clocks */ 199 + 200 + [X1000_CLK_SFC] = { 201 + "sfc", CGU_CLK_GATE, 202 + .parents = { X1000_CLK_SSIPLL, -1, -1, -1 }, 203 + .gate = { CGU_REG_CLKGR, 2 }, 204 + }, 205 + 206 + [X1000_CLK_I2C0] = { 207 + "i2c0", CGU_CLK_GATE, 208 + .parents = { X1000_CLK_PCLK, -1, -1, -1 }, 209 + .gate = { CGU_REG_CLKGR, 7 }, 210 + }, 211 + 212 + [X1000_CLK_I2C1] = { 213 + "i2c1", CGU_CLK_GATE, 214 + .parents = { X1000_CLK_PCLK, -1, -1, -1 }, 215 + .gate = { CGU_REG_CLKGR, 8 }, 216 + }, 217 + 218 + [X1000_CLK_I2C2] = { 219 + "i2c2", CGU_CLK_GATE, 220 + .parents = { X1000_CLK_PCLK, -1, -1, -1 }, 221 + .gate = { CGU_REG_CLKGR, 9 }, 222 + }, 223 + 224 + [X1000_CLK_UART0] = { 225 + "uart0", CGU_CLK_GATE, 226 + .parents = { X1000_CLK_EXCLK, -1, -1, -1 }, 227 + .gate = { CGU_REG_CLKGR, 14 }, 228 + }, 229 + 230 + [X1000_CLK_UART1] = { 231 + "uart1", CGU_CLK_GATE, 232 + .parents = { X1000_CLK_EXCLK, -1, -1, -1 }, 233 + .gate = { CGU_REG_CLKGR, 15 }, 234 + }, 235 + 236 + [X1000_CLK_UART2] = { 237 + "uart2", CGU_CLK_GATE, 238 + .parents = { X1000_CLK_EXCLK, -1, -1, -1 }, 239 + .gate = { CGU_REG_CLKGR, 16 }, 240 + }, 241 + 242 + [X1000_CLK_SSI] = { 243 + "ssi", CGU_CLK_GATE, 244 + .parents = { X1000_CLK_SSIMUX, -1, -1, -1 }, 245 + .gate = { CGU_REG_CLKGR, 19 }, 246 + }, 247 + 248 + [X1000_CLK_PDMA] = { 249 + "pdma", CGU_CLK_GATE, 250 + .parents = { X1000_CLK_EXCLK, -1, -1, -1 }, 251 + .gate = { CGU_REG_CLKGR, 21 }, 252 + }, 253 + }; 254 + 255 + static void __init x1000_cgu_init(struct device_node *np) 256 + { 257 + int retval; 258 + 259 + cgu = ingenic_cgu_new(x1000_cgu_clocks, 260 + ARRAY_SIZE(x1000_cgu_clocks), np); 261 + if (!cgu) { 262 + pr_err("%s: failed to initialise CGU\n", __func__); 263 + return; 264 + } 265 + 266 + retval = ingenic_cgu_register_clocks(cgu); 267 + if (retval) { 268 + pr_err("%s: failed to register CGU Clocks\n", __func__); 269 + return; 270 + } 271 + 272 + ingenic_cgu_register_syscore_ops(cgu); 273 + } 274 + CLK_OF_DECLARE(x1000_cgu, "ingenic,x1000-cgu", x1000_cgu_init);
+2 -4
drivers/clk/mediatek/clk-mt2712.c
··· 1306 1306 int r, i; 1307 1307 struct device_node *node = pdev->dev.of_node; 1308 1308 void __iomem *base; 1309 - struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1310 1309 1311 - base = devm_ioremap_resource(&pdev->dev, res); 1310 + base = devm_platform_ioremap_resource(pdev, 0); 1312 1311 if (IS_ERR(base)) { 1313 1312 pr_err("%s(): ioremap failed\n", __func__); 1314 1313 return PTR_ERR(base); ··· 1393 1394 int r; 1394 1395 struct device_node *node = pdev->dev.of_node; 1395 1396 void __iomem *base; 1396 - struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1397 1397 1398 - base = devm_ioremap_resource(&pdev->dev, res); 1398 + base = devm_platform_ioremap_resource(pdev, 0); 1399 1399 if (IS_ERR(base)) { 1400 1400 pr_err("%s(): ioremap failed\n", __func__); 1401 1401 return PTR_ERR(base);
+1 -2
drivers/clk/mediatek/clk-mt6779.c
··· 1225 1225 1226 1226 static int clk_mt6779_top_probe(struct platform_device *pdev) 1227 1227 { 1228 - struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1229 1228 void __iomem *base; 1230 1229 struct clk_onecell_data *clk_data; 1231 1230 struct device_node *node = pdev->dev.of_node; 1232 1231 1233 - base = devm_ioremap_resource(&pdev->dev, res); 1232 + base = devm_platform_ioremap_resource(pdev, 0); 1234 1233 if (IS_ERR(base)) 1235 1234 return PTR_ERR(base); 1236 1235
+1 -2
drivers/clk/mediatek/clk-mt6797.c
··· 385 385 struct clk_onecell_data *clk_data; 386 386 void __iomem *base; 387 387 struct device_node *node = pdev->dev.of_node; 388 - struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 389 388 390 - base = devm_ioremap_resource(&pdev->dev, res); 389 + base = devm_platform_ioremap_resource(pdev, 0); 391 390 if (IS_ERR(base)) 392 391 return PTR_ERR(base); 393 392
+2 -4
drivers/clk/mediatek/clk-mt7622.c
··· 614 614 struct clk_onecell_data *clk_data; 615 615 void __iomem *base; 616 616 struct device_node *node = pdev->dev.of_node; 617 - struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 618 617 619 - base = devm_ioremap_resource(&pdev->dev, res); 618 + base = devm_platform_ioremap_resource(pdev, 0); 620 619 if (IS_ERR(base)) 621 620 return PTR_ERR(base); 622 621 ··· 694 695 void __iomem *base; 695 696 int r; 696 697 struct device_node *node = pdev->dev.of_node; 697 - struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 698 698 699 - base = devm_ioremap_resource(&pdev->dev, res); 699 + base = devm_platform_ioremap_resource(pdev, 0); 700 700 if (IS_ERR(base)) 701 701 return PTR_ERR(base); 702 702
+2 -4
drivers/clk/mediatek/clk-mt7629.c
··· 574 574 struct clk_onecell_data *clk_data; 575 575 void __iomem *base; 576 576 struct device_node *node = pdev->dev.of_node; 577 - struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 578 577 579 - base = devm_ioremap_resource(&pdev->dev, res); 578 + base = devm_platform_ioremap_resource(pdev, 0); 580 579 if (IS_ERR(base)) 581 580 return PTR_ERR(base); 582 581 ··· 625 626 void __iomem *base; 626 627 int r; 627 628 struct device_node *node = pdev->dev.of_node; 628 - struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 629 629 630 - base = devm_ioremap_resource(&pdev->dev, res); 630 + base = devm_platform_ioremap_resource(pdev, 0); 631 631 if (IS_ERR(base)) 632 632 return PTR_ERR(base); 633 633
+2 -4
drivers/clk/mediatek/clk-mt8183.c
··· 1189 1189 1190 1190 static int clk_mt8183_top_probe(struct platform_device *pdev) 1191 1191 { 1192 - struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1193 1192 void __iomem *base; 1194 1193 struct device_node *node = pdev->dev.of_node; 1195 1194 1196 - base = devm_ioremap_resource(&pdev->dev, res); 1195 + base = devm_platform_ioremap_resource(pdev, 0); 1197 1196 if (IS_ERR(base)) 1198 1197 return PTR_ERR(base); 1199 1198 ··· 1261 1262 struct clk_onecell_data *clk_data; 1262 1263 struct device_node *node = pdev->dev.of_node; 1263 1264 void __iomem *base; 1264 - struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1265 1265 1266 - base = devm_ioremap_resource(&pdev->dev, res); 1266 + base = devm_platform_ioremap_resource(pdev, 0); 1267 1267 if (IS_ERR(base)) 1268 1268 return PTR_ERR(base); 1269 1269
+1328 -699
drivers/clk/meson/axg-audio.c
··· 20 20 #include "clk-phase.h" 21 21 #include "sclk-div.h" 22 22 23 - #define AUD_MST_IN_COUNT 8 24 - #define AUD_SLV_SCLK_COUNT 10 25 - #define AUD_SLV_LRCLK_COUNT 10 26 - 27 - #define AUD_GATE(_name, _reg, _bit, _phws, _iflags) \ 28 - struct clk_regmap aud_##_name = { \ 23 + #define AUD_GATE(_name, _reg, _bit, _pname, _iflags) { \ 29 24 .data = &(struct clk_regmap_gate_data){ \ 30 25 .offset = (_reg), \ 31 26 .bit_idx = (_bit), \ ··· 28 33 .hw.init = &(struct clk_init_data) { \ 29 34 .name = "aud_"#_name, \ 30 35 .ops = &clk_regmap_gate_ops, \ 31 - .parent_hws = (const struct clk_hw *[]) { &_phws.hw }, \ 36 + .parent_names = (const char *[]){ #_pname }, \ 32 37 .num_parents = 1, \ 33 38 .flags = CLK_DUTY_CYCLE_PARENT | (_iflags), \ 34 39 }, \ 35 40 } 36 41 37 - #define AUD_MUX(_name, _reg, _mask, _shift, _dflags, _pdata, _iflags) \ 38 - struct clk_regmap aud_##_name = { \ 42 + #define AUD_MUX(_name, _reg, _mask, _shift, _dflags, _pdata, _iflags) { \ 39 43 .data = &(struct clk_regmap_mux_data){ \ 40 44 .offset = (_reg), \ 41 45 .mask = (_mask), \ ··· 50 56 }, \ 51 57 } 52 58 53 - #define AUD_DIV(_name, _reg, _shift, _width, _dflags, _phws, _iflags) \ 54 - struct clk_regmap aud_##_name = { \ 59 + #define AUD_DIV(_name, _reg, _shift, _width, _dflags, _pname, _iflags) { \ 55 60 .data = &(struct clk_regmap_div_data){ \ 56 61 .offset = (_reg), \ 57 62 .shift = (_shift), \ ··· 60 67 .hw.init = &(struct clk_init_data){ \ 61 68 .name = "aud_"#_name, \ 62 69 .ops = &clk_regmap_divider_ops, \ 63 - .parent_hws = (const struct clk_hw *[]) { &_phws.hw }, \ 70 + .parent_names = (const char *[]){ #_pname }, \ 64 71 .num_parents = 1, \ 65 72 .flags = (_iflags), \ 66 73 }, \ 67 74 } 68 75 69 - #define AUD_PCLK_GATE(_name, _bit) \ 70 - struct clk_regmap aud_##_name = { \ 76 + #define AUD_PCLK_GATE(_name, _reg, _bit) { \ 71 77 .data = &(struct clk_regmap_gate_data){ \ 72 - .offset = (AUDIO_CLK_GATE_EN), \ 78 + .offset = (_reg), \ 73 79 .bit_idx = (_bit), \ 74 80 }, \ 75 81 .hw.init = &(struct clk_init_data) { \ 76 82 .name = "aud_"#_name, \ 77 83 .ops = &clk_regmap_gate_ops, \ 78 - .parent_data = &(const struct clk_parent_data) { \ 79 - .fw_name = "pclk", \ 80 - }, \ 84 + .parent_names = (const char *[]){ "aud_top" }, \ 81 85 .num_parents = 1, \ 82 86 }, \ 83 87 } 84 - /* Audio peripheral clocks */ 85 - static AUD_PCLK_GATE(ddr_arb, 0); 86 - static AUD_PCLK_GATE(pdm, 1); 87 - static AUD_PCLK_GATE(tdmin_a, 2); 88 - static AUD_PCLK_GATE(tdmin_b, 3); 89 - static AUD_PCLK_GATE(tdmin_c, 4); 90 - static AUD_PCLK_GATE(tdmin_lb, 5); 91 - static AUD_PCLK_GATE(tdmout_a, 6); 92 - static AUD_PCLK_GATE(tdmout_b, 7); 93 - static AUD_PCLK_GATE(tdmout_c, 8); 94 - static AUD_PCLK_GATE(frddr_a, 9); 95 - static AUD_PCLK_GATE(frddr_b, 10); 96 - static AUD_PCLK_GATE(frddr_c, 11); 97 - static AUD_PCLK_GATE(toddr_a, 12); 98 - static AUD_PCLK_GATE(toddr_b, 13); 99 - static AUD_PCLK_GATE(toddr_c, 14); 100 - static AUD_PCLK_GATE(loopback, 15); 101 - static AUD_PCLK_GATE(spdifin, 16); 102 - static AUD_PCLK_GATE(spdifout, 17); 103 - static AUD_PCLK_GATE(resample, 18); 104 - static AUD_PCLK_GATE(power_detect, 19); 105 - static AUD_PCLK_GATE(spdifout_b, 21); 106 - 107 - /* Audio Master Clocks */ 108 - static const struct clk_parent_data mst_mux_parent_data[] = { 109 - { .fw_name = "mst_in0", }, 110 - { .fw_name = "mst_in1", }, 111 - { .fw_name = "mst_in2", }, 112 - { .fw_name = "mst_in3", }, 113 - { .fw_name = "mst_in4", }, 114 - { .fw_name = "mst_in5", }, 115 - { .fw_name = "mst_in6", }, 116 - { .fw_name = "mst_in7", }, 117 - }; 118 - 119 - #define AUD_MST_MUX(_name, _reg, _flag) \ 120 - AUD_MUX(_name##_sel, _reg, 0x7, 24, _flag, \ 121 - mst_mux_parent_data, 0) 122 - 123 - #define AUD_MST_MCLK_MUX(_name, _reg) \ 124 - AUD_MST_MUX(_name, _reg, CLK_MUX_ROUND_CLOSEST) 125 - 126 - #define AUD_MST_SYS_MUX(_name, _reg) \ 127 - AUD_MST_MUX(_name, _reg, 0) 128 - 129 - static AUD_MST_MCLK_MUX(mst_a_mclk, AUDIO_MCLK_A_CTRL); 130 - static AUD_MST_MCLK_MUX(mst_b_mclk, AUDIO_MCLK_B_CTRL); 131 - static AUD_MST_MCLK_MUX(mst_c_mclk, AUDIO_MCLK_C_CTRL); 132 - static AUD_MST_MCLK_MUX(mst_d_mclk, AUDIO_MCLK_D_CTRL); 133 - static AUD_MST_MCLK_MUX(mst_e_mclk, AUDIO_MCLK_E_CTRL); 134 - static AUD_MST_MCLK_MUX(mst_f_mclk, AUDIO_MCLK_F_CTRL); 135 - static AUD_MST_MCLK_MUX(spdifout_clk, AUDIO_CLK_SPDIFOUT_CTRL); 136 - static AUD_MST_MCLK_MUX(pdm_dclk, AUDIO_CLK_PDMIN_CTRL0); 137 - static AUD_MST_SYS_MUX(spdifin_clk, AUDIO_CLK_SPDIFIN_CTRL); 138 - static AUD_MST_SYS_MUX(pdm_sysclk, AUDIO_CLK_PDMIN_CTRL1); 139 - static AUD_MST_MCLK_MUX(spdifout_b_clk, AUDIO_CLK_SPDIFOUT_B_CTRL); 140 - 141 - #define AUD_MST_DIV(_name, _reg, _flag) \ 142 - AUD_DIV(_name##_div, _reg, 0, 16, _flag, \ 143 - aud_##_name##_sel, CLK_SET_RATE_PARENT) \ 144 - 145 - #define AUD_MST_MCLK_DIV(_name, _reg) \ 146 - AUD_MST_DIV(_name, _reg, CLK_DIVIDER_ROUND_CLOSEST) 147 - 148 - #define AUD_MST_SYS_DIV(_name, _reg) \ 149 - AUD_MST_DIV(_name, _reg, 0) 150 - 151 - static AUD_MST_MCLK_DIV(mst_a_mclk, AUDIO_MCLK_A_CTRL); 152 - static AUD_MST_MCLK_DIV(mst_b_mclk, AUDIO_MCLK_B_CTRL); 153 - static AUD_MST_MCLK_DIV(mst_c_mclk, AUDIO_MCLK_C_CTRL); 154 - static AUD_MST_MCLK_DIV(mst_d_mclk, AUDIO_MCLK_D_CTRL); 155 - static AUD_MST_MCLK_DIV(mst_e_mclk, AUDIO_MCLK_E_CTRL); 156 - static AUD_MST_MCLK_DIV(mst_f_mclk, AUDIO_MCLK_F_CTRL); 157 - static AUD_MST_MCLK_DIV(spdifout_clk, AUDIO_CLK_SPDIFOUT_CTRL); 158 - static AUD_MST_MCLK_DIV(pdm_dclk, AUDIO_CLK_PDMIN_CTRL0); 159 - static AUD_MST_SYS_DIV(spdifin_clk, AUDIO_CLK_SPDIFIN_CTRL); 160 - static AUD_MST_SYS_DIV(pdm_sysclk, AUDIO_CLK_PDMIN_CTRL1); 161 - static AUD_MST_MCLK_DIV(spdifout_b_clk, AUDIO_CLK_SPDIFOUT_B_CTRL); 162 - 163 - #define AUD_MST_MCLK_GATE(_name, _reg) \ 164 - AUD_GATE(_name, _reg, 31, aud_##_name##_div, \ 165 - CLK_SET_RATE_PARENT) 166 - 167 - static AUD_MST_MCLK_GATE(mst_a_mclk, AUDIO_MCLK_A_CTRL); 168 - static AUD_MST_MCLK_GATE(mst_b_mclk, AUDIO_MCLK_B_CTRL); 169 - static AUD_MST_MCLK_GATE(mst_c_mclk, AUDIO_MCLK_C_CTRL); 170 - static AUD_MST_MCLK_GATE(mst_d_mclk, AUDIO_MCLK_D_CTRL); 171 - static AUD_MST_MCLK_GATE(mst_e_mclk, AUDIO_MCLK_E_CTRL); 172 - static AUD_MST_MCLK_GATE(mst_f_mclk, AUDIO_MCLK_F_CTRL); 173 - static AUD_MST_MCLK_GATE(spdifout_clk, AUDIO_CLK_SPDIFOUT_CTRL); 174 - static AUD_MST_MCLK_GATE(spdifin_clk, AUDIO_CLK_SPDIFIN_CTRL); 175 - static AUD_MST_MCLK_GATE(pdm_dclk, AUDIO_CLK_PDMIN_CTRL0); 176 - static AUD_MST_MCLK_GATE(pdm_sysclk, AUDIO_CLK_PDMIN_CTRL1); 177 - static AUD_MST_MCLK_GATE(spdifout_b_clk, AUDIO_CLK_SPDIFOUT_B_CTRL); 178 - 179 - /* Sample Clocks */ 180 - #define AUD_MST_SCLK_PRE_EN(_name, _reg) \ 181 - AUD_GATE(mst_##_name##_sclk_pre_en, _reg, 31, \ 182 - aud_mst_##_name##_mclk, 0) 183 - 184 - static AUD_MST_SCLK_PRE_EN(a, AUDIO_MST_A_SCLK_CTRL0); 185 - static AUD_MST_SCLK_PRE_EN(b, AUDIO_MST_B_SCLK_CTRL0); 186 - static AUD_MST_SCLK_PRE_EN(c, AUDIO_MST_C_SCLK_CTRL0); 187 - static AUD_MST_SCLK_PRE_EN(d, AUDIO_MST_D_SCLK_CTRL0); 188 - static AUD_MST_SCLK_PRE_EN(e, AUDIO_MST_E_SCLK_CTRL0); 189 - static AUD_MST_SCLK_PRE_EN(f, AUDIO_MST_F_SCLK_CTRL0); 190 88 191 89 #define AUD_SCLK_DIV(_name, _reg, _div_shift, _div_width, \ 192 - _hi_shift, _hi_width, _phws, _iflags) \ 193 - struct clk_regmap aud_##_name = { \ 90 + _hi_shift, _hi_width, _pname, _iflags) { \ 194 91 .data = &(struct meson_sclk_div_data) { \ 195 92 .div = { \ 196 93 .reg_off = (_reg), \ ··· 96 213 .hw.init = &(struct clk_init_data) { \ 97 214 .name = "aud_"#_name, \ 98 215 .ops = &meson_sclk_div_ops, \ 99 - .parent_hws = (const struct clk_hw *[]) { &_phws.hw }, \ 216 + .parent_names = (const char *[]){ #_pname }, \ 100 217 .num_parents = 1, \ 101 218 .flags = (_iflags), \ 102 219 }, \ 103 220 } 104 221 105 - #define AUD_MST_SCLK_DIV(_name, _reg) \ 106 - AUD_SCLK_DIV(mst_##_name##_sclk_div, _reg, 20, 10, 0, 0, \ 107 - aud_mst_##_name##_sclk_pre_en, \ 108 - CLK_SET_RATE_PARENT) 109 - 110 - static AUD_MST_SCLK_DIV(a, AUDIO_MST_A_SCLK_CTRL0); 111 - static AUD_MST_SCLK_DIV(b, AUDIO_MST_B_SCLK_CTRL0); 112 - static AUD_MST_SCLK_DIV(c, AUDIO_MST_C_SCLK_CTRL0); 113 - static AUD_MST_SCLK_DIV(d, AUDIO_MST_D_SCLK_CTRL0); 114 - static AUD_MST_SCLK_DIV(e, AUDIO_MST_E_SCLK_CTRL0); 115 - static AUD_MST_SCLK_DIV(f, AUDIO_MST_F_SCLK_CTRL0); 116 - 117 - #define AUD_MST_SCLK_POST_EN(_name, _reg) \ 118 - AUD_GATE(mst_##_name##_sclk_post_en, _reg, 30, \ 119 - aud_mst_##_name##_sclk_div, CLK_SET_RATE_PARENT) 120 - 121 - static AUD_MST_SCLK_POST_EN(a, AUDIO_MST_A_SCLK_CTRL0); 122 - static AUD_MST_SCLK_POST_EN(b, AUDIO_MST_B_SCLK_CTRL0); 123 - static AUD_MST_SCLK_POST_EN(c, AUDIO_MST_C_SCLK_CTRL0); 124 - static AUD_MST_SCLK_POST_EN(d, AUDIO_MST_D_SCLK_CTRL0); 125 - static AUD_MST_SCLK_POST_EN(e, AUDIO_MST_E_SCLK_CTRL0); 126 - static AUD_MST_SCLK_POST_EN(f, AUDIO_MST_F_SCLK_CTRL0); 127 - 128 222 #define AUD_TRIPHASE(_name, _reg, _width, _shift0, _shift1, _shift2, \ 129 - _phws, _iflags) \ 130 - struct clk_regmap aud_##_name = { \ 223 + _pname, _iflags) { \ 131 224 .data = &(struct meson_clk_triphase_data) { \ 132 225 .ph0 = { \ 133 226 .reg_off = (_reg), \ ··· 124 265 .hw.init = &(struct clk_init_data) { \ 125 266 .name = "aud_"#_name, \ 126 267 .ops = &meson_clk_triphase_ops, \ 127 - .parent_hws = (const struct clk_hw *[]) { &_phws.hw }, \ 268 + .parent_names = (const char *[]){ #_pname }, \ 128 269 .num_parents = 1, \ 129 270 .flags = CLK_DUTY_CYCLE_PARENT | (_iflags), \ 130 271 }, \ 131 272 } 132 273 274 + #define AUD_PHASE(_name, _reg, _width, _shift, _pname, _iflags) { \ 275 + .data = &(struct meson_clk_phase_data) { \ 276 + .ph = { \ 277 + .reg_off = (_reg), \ 278 + .shift = (_shift), \ 279 + .width = (_width), \ 280 + }, \ 281 + }, \ 282 + .hw.init = &(struct clk_init_data) { \ 283 + .name = "aud_"#_name, \ 284 + .ops = &meson_clk_phase_ops, \ 285 + .parent_names = (const char *[]){ #_pname }, \ 286 + .num_parents = 1, \ 287 + .flags = (_iflags), \ 288 + }, \ 289 + } 290 + 291 + /* Audio Master Clocks */ 292 + static const struct clk_parent_data mst_mux_parent_data[] = { 293 + { .fw_name = "mst_in0", }, 294 + { .fw_name = "mst_in1", }, 295 + { .fw_name = "mst_in2", }, 296 + { .fw_name = "mst_in3", }, 297 + { .fw_name = "mst_in4", }, 298 + { .fw_name = "mst_in5", }, 299 + { .fw_name = "mst_in6", }, 300 + { .fw_name = "mst_in7", }, 301 + }; 302 + 303 + #define AUD_MST_MUX(_name, _reg, _flag) \ 304 + AUD_MUX(_name##_sel, _reg, 0x7, 24, _flag, \ 305 + mst_mux_parent_data, 0) 306 + #define AUD_MST_DIV(_name, _reg, _flag) \ 307 + AUD_DIV(_name##_div, _reg, 0, 16, _flag, \ 308 + aud_##_name##_sel, CLK_SET_RATE_PARENT) 309 + #define AUD_MST_MCLK_GATE(_name, _reg) \ 310 + AUD_GATE(_name, _reg, 31, aud_##_name##_div, \ 311 + CLK_SET_RATE_PARENT) 312 + 313 + #define AUD_MST_MCLK_MUX(_name, _reg) \ 314 + AUD_MST_MUX(_name, _reg, CLK_MUX_ROUND_CLOSEST) 315 + #define AUD_MST_MCLK_DIV(_name, _reg) \ 316 + AUD_MST_DIV(_name, _reg, CLK_DIVIDER_ROUND_CLOSEST) 317 + 318 + #define AUD_MST_SYS_MUX(_name, _reg) \ 319 + AUD_MST_MUX(_name, _reg, 0) 320 + #define AUD_MST_SYS_DIV(_name, _reg) \ 321 + AUD_MST_DIV(_name, _reg, 0) 322 + 323 + /* Sample Clocks */ 324 + #define AUD_MST_SCLK_PRE_EN(_name, _reg) \ 325 + AUD_GATE(mst_##_name##_sclk_pre_en, _reg, 31, \ 326 + aud_mst_##_name##_mclk, 0) 327 + #define AUD_MST_SCLK_DIV(_name, _reg) \ 328 + AUD_SCLK_DIV(mst_##_name##_sclk_div, _reg, 20, 10, 0, 0, \ 329 + aud_mst_##_name##_sclk_pre_en, \ 330 + CLK_SET_RATE_PARENT) 331 + #define AUD_MST_SCLK_POST_EN(_name, _reg) \ 332 + AUD_GATE(mst_##_name##_sclk_post_en, _reg, 30, \ 333 + aud_mst_##_name##_sclk_div, CLK_SET_RATE_PARENT) 133 334 #define AUD_MST_SCLK(_name, _reg) \ 134 335 AUD_TRIPHASE(mst_##_name##_sclk, _reg, 1, 0, 2, 4, \ 135 336 aud_mst_##_name##_sclk_post_en, CLK_SET_RATE_PARENT) 136 337 137 - static AUD_MST_SCLK(a, AUDIO_MST_A_SCLK_CTRL1); 138 - static AUD_MST_SCLK(b, AUDIO_MST_B_SCLK_CTRL1); 139 - static AUD_MST_SCLK(c, AUDIO_MST_C_SCLK_CTRL1); 140 - static AUD_MST_SCLK(d, AUDIO_MST_D_SCLK_CTRL1); 141 - static AUD_MST_SCLK(e, AUDIO_MST_E_SCLK_CTRL1); 142 - static AUD_MST_SCLK(f, AUDIO_MST_F_SCLK_CTRL1); 143 - 144 338 #define AUD_MST_LRCLK_DIV(_name, _reg) \ 145 339 AUD_SCLK_DIV(mst_##_name##_lrclk_div, _reg, 0, 10, 10, 10, \ 146 - aud_mst_##_name##_sclk_post_en, 0) \ 147 - 148 - static AUD_MST_LRCLK_DIV(a, AUDIO_MST_A_SCLK_CTRL0); 149 - static AUD_MST_LRCLK_DIV(b, AUDIO_MST_B_SCLK_CTRL0); 150 - static AUD_MST_LRCLK_DIV(c, AUDIO_MST_C_SCLK_CTRL0); 151 - static AUD_MST_LRCLK_DIV(d, AUDIO_MST_D_SCLK_CTRL0); 152 - static AUD_MST_LRCLK_DIV(e, AUDIO_MST_E_SCLK_CTRL0); 153 - static AUD_MST_LRCLK_DIV(f, AUDIO_MST_F_SCLK_CTRL0); 154 - 340 + aud_mst_##_name##_sclk_post_en, 0) 155 341 #define AUD_MST_LRCLK(_name, _reg) \ 156 342 AUD_TRIPHASE(mst_##_name##_lrclk, _reg, 1, 1, 3, 5, \ 157 343 aud_mst_##_name##_lrclk_div, CLK_SET_RATE_PARENT) 158 344 159 - static AUD_MST_LRCLK(a, AUDIO_MST_A_SCLK_CTRL1); 160 - static AUD_MST_LRCLK(b, AUDIO_MST_B_SCLK_CTRL1); 161 - static AUD_MST_LRCLK(c, AUDIO_MST_C_SCLK_CTRL1); 162 - static AUD_MST_LRCLK(d, AUDIO_MST_D_SCLK_CTRL1); 163 - static AUD_MST_LRCLK(e, AUDIO_MST_E_SCLK_CTRL1); 164 - static AUD_MST_LRCLK(f, AUDIO_MST_F_SCLK_CTRL1); 165 - 345 + /* TDM bit clock sources */ 166 346 static const struct clk_parent_data tdm_sclk_parent_data[] = { 167 - { .hw = &aud_mst_a_sclk.hw, }, 168 - { .hw = &aud_mst_b_sclk.hw, }, 169 - { .hw = &aud_mst_c_sclk.hw, }, 170 - { .hw = &aud_mst_d_sclk.hw, }, 171 - { .hw = &aud_mst_e_sclk.hw, }, 172 - { .hw = &aud_mst_f_sclk.hw, }, 347 + { .name = "aud_mst_a_sclk", .index = -1, }, 348 + { .name = "aud_mst_b_sclk", .index = -1, }, 349 + { .name = "aud_mst_c_sclk", .index = -1, }, 350 + { .name = "aud_mst_d_sclk", .index = -1, }, 351 + { .name = "aud_mst_e_sclk", .index = -1, }, 352 + { .name = "aud_mst_f_sclk", .index = -1, }, 173 353 { .fw_name = "slv_sclk0", }, 174 354 { .fw_name = "slv_sclk1", }, 175 355 { .fw_name = "slv_sclk2", }, ··· 221 323 { .fw_name = "slv_sclk9", }, 222 324 }; 223 325 224 - #define AUD_TDM_SCLK_MUX(_name, _reg) \ 225 - AUD_MUX(tdm##_name##_sclk_sel, _reg, 0xf, 24, \ 226 - CLK_MUX_ROUND_CLOSEST, \ 227 - tdm_sclk_parent_data, 0) 228 - 229 - static AUD_TDM_SCLK_MUX(in_a, AUDIO_CLK_TDMIN_A_CTRL); 230 - static AUD_TDM_SCLK_MUX(in_b, AUDIO_CLK_TDMIN_B_CTRL); 231 - static AUD_TDM_SCLK_MUX(in_c, AUDIO_CLK_TDMIN_C_CTRL); 232 - static AUD_TDM_SCLK_MUX(in_lb, AUDIO_CLK_TDMIN_LB_CTRL); 233 - static AUD_TDM_SCLK_MUX(out_a, AUDIO_CLK_TDMOUT_A_CTRL); 234 - static AUD_TDM_SCLK_MUX(out_b, AUDIO_CLK_TDMOUT_B_CTRL); 235 - static AUD_TDM_SCLK_MUX(out_c, AUDIO_CLK_TDMOUT_C_CTRL); 236 - 237 - #define AUD_TDM_SCLK_PRE_EN(_name, _reg) \ 238 - AUD_GATE(tdm##_name##_sclk_pre_en, _reg, 31, \ 239 - aud_tdm##_name##_sclk_sel, CLK_SET_RATE_PARENT) 240 - 241 - static AUD_TDM_SCLK_PRE_EN(in_a, AUDIO_CLK_TDMIN_A_CTRL); 242 - static AUD_TDM_SCLK_PRE_EN(in_b, AUDIO_CLK_TDMIN_B_CTRL); 243 - static AUD_TDM_SCLK_PRE_EN(in_c, AUDIO_CLK_TDMIN_C_CTRL); 244 - static AUD_TDM_SCLK_PRE_EN(in_lb, AUDIO_CLK_TDMIN_LB_CTRL); 245 - static AUD_TDM_SCLK_PRE_EN(out_a, AUDIO_CLK_TDMOUT_A_CTRL); 246 - static AUD_TDM_SCLK_PRE_EN(out_b, AUDIO_CLK_TDMOUT_B_CTRL); 247 - static AUD_TDM_SCLK_PRE_EN(out_c, AUDIO_CLK_TDMOUT_C_CTRL); 248 - 249 - #define AUD_TDM_SCLK_POST_EN(_name, _reg) \ 250 - AUD_GATE(tdm##_name##_sclk_post_en, _reg, 30, \ 251 - aud_tdm##_name##_sclk_pre_en, CLK_SET_RATE_PARENT) 252 - 253 - static AUD_TDM_SCLK_POST_EN(in_a, AUDIO_CLK_TDMIN_A_CTRL); 254 - static AUD_TDM_SCLK_POST_EN(in_b, AUDIO_CLK_TDMIN_B_CTRL); 255 - static AUD_TDM_SCLK_POST_EN(in_c, AUDIO_CLK_TDMIN_C_CTRL); 256 - static AUD_TDM_SCLK_POST_EN(in_lb, AUDIO_CLK_TDMIN_LB_CTRL); 257 - static AUD_TDM_SCLK_POST_EN(out_a, AUDIO_CLK_TDMOUT_A_CTRL); 258 - static AUD_TDM_SCLK_POST_EN(out_b, AUDIO_CLK_TDMOUT_B_CTRL); 259 - static AUD_TDM_SCLK_POST_EN(out_c, AUDIO_CLK_TDMOUT_C_CTRL); 260 - 261 - #define AUD_TDM_SCLK(_name, _reg) \ 262 - struct clk_regmap aud_tdm##_name##_sclk = { \ 263 - .data = &(struct meson_clk_phase_data) { \ 264 - .ph = { \ 265 - .reg_off = (_reg), \ 266 - .shift = 29, \ 267 - .width = 1, \ 268 - }, \ 269 - }, \ 270 - .hw.init = &(struct clk_init_data) { \ 271 - .name = "aud_tdm"#_name"_sclk", \ 272 - .ops = &meson_clk_phase_ops, \ 273 - .parent_hws = (const struct clk_hw *[]) { \ 274 - &aud_tdm##_name##_sclk_post_en.hw \ 275 - }, \ 276 - .num_parents = 1, \ 277 - .flags = CLK_DUTY_CYCLE_PARENT | CLK_SET_RATE_PARENT, \ 278 - }, \ 279 - } 280 - 281 - static AUD_TDM_SCLK(in_a, AUDIO_CLK_TDMIN_A_CTRL); 282 - static AUD_TDM_SCLK(in_b, AUDIO_CLK_TDMIN_B_CTRL); 283 - static AUD_TDM_SCLK(in_c, AUDIO_CLK_TDMIN_C_CTRL); 284 - static AUD_TDM_SCLK(in_lb, AUDIO_CLK_TDMIN_LB_CTRL); 285 - static AUD_TDM_SCLK(out_a, AUDIO_CLK_TDMOUT_A_CTRL); 286 - static AUD_TDM_SCLK(out_b, AUDIO_CLK_TDMOUT_B_CTRL); 287 - static AUD_TDM_SCLK(out_c, AUDIO_CLK_TDMOUT_C_CTRL); 288 - 326 + /* TDM sample clock sources */ 289 327 static const struct clk_parent_data tdm_lrclk_parent_data[] = { 290 - { .hw = &aud_mst_a_lrclk.hw, }, 291 - { .hw = &aud_mst_b_lrclk.hw, }, 292 - { .hw = &aud_mst_c_lrclk.hw, }, 293 - { .hw = &aud_mst_d_lrclk.hw, }, 294 - { .hw = &aud_mst_e_lrclk.hw, }, 295 - { .hw = &aud_mst_f_lrclk.hw, }, 328 + { .name = "aud_mst_a_lrclk", .index = -1, }, 329 + { .name = "aud_mst_b_lrclk", .index = -1, }, 330 + { .name = "aud_mst_c_lrclk", .index = -1, }, 331 + { .name = "aud_mst_d_lrclk", .index = -1, }, 332 + { .name = "aud_mst_e_lrclk", .index = -1, }, 333 + { .name = "aud_mst_f_lrclk", .index = -1, }, 296 334 { .fw_name = "slv_lrclk0", }, 297 335 { .fw_name = "slv_lrclk1", }, 298 336 { .fw_name = "slv_lrclk2", }, ··· 241 407 { .fw_name = "slv_lrclk9", }, 242 408 }; 243 409 244 - #define AUD_TDM_LRLCK(_name, _reg) \ 245 - AUD_MUX(tdm##_name##_lrclk, _reg, 0xf, 20, \ 246 - CLK_MUX_ROUND_CLOSEST, \ 247 - tdm_lrclk_parent_data, 0) 410 + #define AUD_TDM_SCLK_MUX(_name, _reg) \ 411 + AUD_MUX(tdm##_name##_sclk_sel, _reg, 0xf, 24, \ 412 + CLK_MUX_ROUND_CLOSEST, tdm_sclk_parent_data, 0) 413 + #define AUD_TDM_SCLK_PRE_EN(_name, _reg) \ 414 + AUD_GATE(tdm##_name##_sclk_pre_en, _reg, 31, \ 415 + aud_tdm##_name##_sclk_sel, CLK_SET_RATE_PARENT) 416 + #define AUD_TDM_SCLK_POST_EN(_name, _reg) \ 417 + AUD_GATE(tdm##_name##_sclk_post_en, _reg, 30, \ 418 + aud_tdm##_name##_sclk_pre_en, CLK_SET_RATE_PARENT) 419 + #define AUD_TDM_SCLK(_name, _reg) \ 420 + AUD_PHASE(tdm##_name##_sclk, _reg, 1, 29, \ 421 + aud_tdm##_name##_sclk_post_en, \ 422 + CLK_DUTY_CYCLE_PARENT | CLK_SET_RATE_PARENT) 248 423 249 - static AUD_TDM_LRLCK(in_a, AUDIO_CLK_TDMIN_A_CTRL); 250 - static AUD_TDM_LRLCK(in_b, AUDIO_CLK_TDMIN_B_CTRL); 251 - static AUD_TDM_LRLCK(in_c, AUDIO_CLK_TDMIN_C_CTRL); 252 - static AUD_TDM_LRLCK(in_lb, AUDIO_CLK_TDMIN_LB_CTRL); 253 - static AUD_TDM_LRLCK(out_a, AUDIO_CLK_TDMOUT_A_CTRL); 254 - static AUD_TDM_LRLCK(out_b, AUDIO_CLK_TDMOUT_B_CTRL); 255 - static AUD_TDM_LRLCK(out_c, AUDIO_CLK_TDMOUT_C_CTRL); 424 + #define AUD_TDM_LRLCK(_name, _reg) \ 425 + AUD_MUX(tdm##_name##_lrclk, _reg, 0xf, 20, \ 426 + CLK_MUX_ROUND_CLOSEST, tdm_lrclk_parent_data, 0) 256 427 257 - /* G12a Pad control */ 428 + /* Pad master clock sources */ 429 + static const struct clk_parent_data mclk_pad_ctrl_parent_data[] = { 430 + { .name = "aud_mst_a_mclk", .index = -1, }, 431 + { .name = "aud_mst_b_mclk", .index = -1, }, 432 + { .name = "aud_mst_c_mclk", .index = -1, }, 433 + { .name = "aud_mst_d_mclk", .index = -1, }, 434 + { .name = "aud_mst_e_mclk", .index = -1, }, 435 + { .name = "aud_mst_f_mclk", .index = -1, }, 436 + }; 437 + 438 + /* Pad bit clock sources */ 439 + static const struct clk_parent_data sclk_pad_ctrl_parent_data[] = { 440 + { .name = "aud_mst_a_sclk", .index = -1, }, 441 + { .name = "aud_mst_b_sclk", .index = -1, }, 442 + { .name = "aud_mst_c_sclk", .index = -1, }, 443 + { .name = "aud_mst_d_sclk", .index = -1, }, 444 + { .name = "aud_mst_e_sclk", .index = -1, }, 445 + { .name = "aud_mst_f_sclk", .index = -1, }, 446 + }; 447 + 448 + /* Pad sample clock sources */ 449 + static const struct clk_parent_data lrclk_pad_ctrl_parent_data[] = { 450 + { .name = "aud_mst_a_lrclk", .index = -1, }, 451 + { .name = "aud_mst_b_lrclk", .index = -1, }, 452 + { .name = "aud_mst_c_lrclk", .index = -1, }, 453 + { .name = "aud_mst_d_lrclk", .index = -1, }, 454 + { .name = "aud_mst_e_lrclk", .index = -1, }, 455 + { .name = "aud_mst_f_lrclk", .index = -1, }, 456 + }; 457 + 258 458 #define AUD_TDM_PAD_CTRL(_name, _reg, _shift, _parents) \ 259 - AUD_MUX(tdm_##_name, _reg, 0x7, _shift, 0, _parents, \ 459 + AUD_MUX(_name, _reg, 0x7, _shift, 0, _parents, \ 260 460 CLK_SET_RATE_NO_REPARENT) 261 461 262 - static const struct clk_parent_data mclk_pad_ctrl_parent_data[] = { 263 - { .hw = &aud_mst_a_mclk.hw }, 264 - { .hw = &aud_mst_b_mclk.hw }, 265 - { .hw = &aud_mst_c_mclk.hw }, 266 - { .hw = &aud_mst_d_mclk.hw }, 267 - { .hw = &aud_mst_e_mclk.hw }, 268 - { .hw = &aud_mst_f_mclk.hw }, 462 + /* Common Clocks */ 463 + static struct clk_regmap ddr_arb = 464 + AUD_PCLK_GATE(ddr_arb, AUDIO_CLK_GATE_EN, 0); 465 + static struct clk_regmap pdm = 466 + AUD_PCLK_GATE(pdm, AUDIO_CLK_GATE_EN, 1); 467 + static struct clk_regmap tdmin_a = 468 + AUD_PCLK_GATE(tdmin_a, AUDIO_CLK_GATE_EN, 2); 469 + static struct clk_regmap tdmin_b = 470 + AUD_PCLK_GATE(tdmin_b, AUDIO_CLK_GATE_EN, 3); 471 + static struct clk_regmap tdmin_c = 472 + AUD_PCLK_GATE(tdmin_c, AUDIO_CLK_GATE_EN, 4); 473 + static struct clk_regmap tdmin_lb = 474 + AUD_PCLK_GATE(tdmin_lb, AUDIO_CLK_GATE_EN, 5); 475 + static struct clk_regmap tdmout_a = 476 + AUD_PCLK_GATE(tdmout_a, AUDIO_CLK_GATE_EN, 6); 477 + static struct clk_regmap tdmout_b = 478 + AUD_PCLK_GATE(tdmout_b, AUDIO_CLK_GATE_EN, 7); 479 + static struct clk_regmap tdmout_c = 480 + AUD_PCLK_GATE(tdmout_c, AUDIO_CLK_GATE_EN, 8); 481 + static struct clk_regmap frddr_a = 482 + AUD_PCLK_GATE(frddr_a, AUDIO_CLK_GATE_EN, 9); 483 + static struct clk_regmap frddr_b = 484 + AUD_PCLK_GATE(frddr_b, AUDIO_CLK_GATE_EN, 10); 485 + static struct clk_regmap frddr_c = 486 + AUD_PCLK_GATE(frddr_c, AUDIO_CLK_GATE_EN, 11); 487 + static struct clk_regmap toddr_a = 488 + AUD_PCLK_GATE(toddr_a, AUDIO_CLK_GATE_EN, 12); 489 + static struct clk_regmap toddr_b = 490 + AUD_PCLK_GATE(toddr_b, AUDIO_CLK_GATE_EN, 13); 491 + static struct clk_regmap toddr_c = 492 + AUD_PCLK_GATE(toddr_c, AUDIO_CLK_GATE_EN, 14); 493 + static struct clk_regmap loopback = 494 + AUD_PCLK_GATE(loopback, AUDIO_CLK_GATE_EN, 15); 495 + static struct clk_regmap spdifin = 496 + AUD_PCLK_GATE(spdifin, AUDIO_CLK_GATE_EN, 16); 497 + static struct clk_regmap spdifout = 498 + AUD_PCLK_GATE(spdifout, AUDIO_CLK_GATE_EN, 17); 499 + static struct clk_regmap resample = 500 + AUD_PCLK_GATE(resample, AUDIO_CLK_GATE_EN, 18); 501 + static struct clk_regmap power_detect = 502 + AUD_PCLK_GATE(power_detect, AUDIO_CLK_GATE_EN, 19); 503 + 504 + static struct clk_regmap spdifout_clk_sel = 505 + AUD_MST_MCLK_MUX(spdifout_clk, AUDIO_CLK_SPDIFOUT_CTRL); 506 + static struct clk_regmap pdm_dclk_sel = 507 + AUD_MST_MCLK_MUX(pdm_dclk, AUDIO_CLK_PDMIN_CTRL0); 508 + static struct clk_regmap spdifin_clk_sel = 509 + AUD_MST_SYS_MUX(spdifin_clk, AUDIO_CLK_SPDIFIN_CTRL); 510 + static struct clk_regmap pdm_sysclk_sel = 511 + AUD_MST_SYS_MUX(pdm_sysclk, AUDIO_CLK_PDMIN_CTRL1); 512 + static struct clk_regmap spdifout_b_clk_sel = 513 + AUD_MST_MCLK_MUX(spdifout_b_clk, AUDIO_CLK_SPDIFOUT_B_CTRL); 514 + 515 + static struct clk_regmap spdifout_clk_div = 516 + AUD_MST_MCLK_DIV(spdifout_clk, AUDIO_CLK_SPDIFOUT_CTRL); 517 + static struct clk_regmap pdm_dclk_div = 518 + AUD_MST_MCLK_DIV(pdm_dclk, AUDIO_CLK_PDMIN_CTRL0); 519 + static struct clk_regmap spdifin_clk_div = 520 + AUD_MST_SYS_DIV(spdifin_clk, AUDIO_CLK_SPDIFIN_CTRL); 521 + static struct clk_regmap pdm_sysclk_div = 522 + AUD_MST_SYS_DIV(pdm_sysclk, AUDIO_CLK_PDMIN_CTRL1); 523 + static struct clk_regmap spdifout_b_clk_div = 524 + AUD_MST_MCLK_DIV(spdifout_b_clk, AUDIO_CLK_SPDIFOUT_B_CTRL); 525 + 526 + static struct clk_regmap spdifout_clk = 527 + AUD_MST_MCLK_GATE(spdifout_clk, AUDIO_CLK_SPDIFOUT_CTRL); 528 + static struct clk_regmap spdifin_clk = 529 + AUD_MST_MCLK_GATE(spdifin_clk, AUDIO_CLK_SPDIFIN_CTRL); 530 + static struct clk_regmap pdm_dclk = 531 + AUD_MST_MCLK_GATE(pdm_dclk, AUDIO_CLK_PDMIN_CTRL0); 532 + static struct clk_regmap pdm_sysclk = 533 + AUD_MST_MCLK_GATE(pdm_sysclk, AUDIO_CLK_PDMIN_CTRL1); 534 + static struct clk_regmap spdifout_b_clk = 535 + AUD_MST_MCLK_GATE(spdifout_b_clk, AUDIO_CLK_SPDIFOUT_B_CTRL); 536 + 537 + static struct clk_regmap mst_a_sclk_pre_en = 538 + AUD_MST_SCLK_PRE_EN(a, AUDIO_MST_A_SCLK_CTRL0); 539 + static struct clk_regmap mst_b_sclk_pre_en = 540 + AUD_MST_SCLK_PRE_EN(b, AUDIO_MST_B_SCLK_CTRL0); 541 + static struct clk_regmap mst_c_sclk_pre_en = 542 + AUD_MST_SCLK_PRE_EN(c, AUDIO_MST_C_SCLK_CTRL0); 543 + static struct clk_regmap mst_d_sclk_pre_en = 544 + AUD_MST_SCLK_PRE_EN(d, AUDIO_MST_D_SCLK_CTRL0); 545 + static struct clk_regmap mst_e_sclk_pre_en = 546 + AUD_MST_SCLK_PRE_EN(e, AUDIO_MST_E_SCLK_CTRL0); 547 + static struct clk_regmap mst_f_sclk_pre_en = 548 + AUD_MST_SCLK_PRE_EN(f, AUDIO_MST_F_SCLK_CTRL0); 549 + 550 + static struct clk_regmap mst_a_sclk_div = 551 + AUD_MST_SCLK_DIV(a, AUDIO_MST_A_SCLK_CTRL0); 552 + static struct clk_regmap mst_b_sclk_div = 553 + AUD_MST_SCLK_DIV(b, AUDIO_MST_B_SCLK_CTRL0); 554 + static struct clk_regmap mst_c_sclk_div = 555 + AUD_MST_SCLK_DIV(c, AUDIO_MST_C_SCLK_CTRL0); 556 + static struct clk_regmap mst_d_sclk_div = 557 + AUD_MST_SCLK_DIV(d, AUDIO_MST_D_SCLK_CTRL0); 558 + static struct clk_regmap mst_e_sclk_div = 559 + AUD_MST_SCLK_DIV(e, AUDIO_MST_E_SCLK_CTRL0); 560 + static struct clk_regmap mst_f_sclk_div = 561 + AUD_MST_SCLK_DIV(f, AUDIO_MST_F_SCLK_CTRL0); 562 + 563 + static struct clk_regmap mst_a_sclk_post_en = 564 + AUD_MST_SCLK_POST_EN(a, AUDIO_MST_A_SCLK_CTRL0); 565 + static struct clk_regmap mst_b_sclk_post_en = 566 + AUD_MST_SCLK_POST_EN(b, AUDIO_MST_B_SCLK_CTRL0); 567 + static struct clk_regmap mst_c_sclk_post_en = 568 + AUD_MST_SCLK_POST_EN(c, AUDIO_MST_C_SCLK_CTRL0); 569 + static struct clk_regmap mst_d_sclk_post_en = 570 + AUD_MST_SCLK_POST_EN(d, AUDIO_MST_D_SCLK_CTRL0); 571 + static struct clk_regmap mst_e_sclk_post_en = 572 + AUD_MST_SCLK_POST_EN(e, AUDIO_MST_E_SCLK_CTRL0); 573 + static struct clk_regmap mst_f_sclk_post_en = 574 + AUD_MST_SCLK_POST_EN(f, AUDIO_MST_F_SCLK_CTRL0); 575 + 576 + static struct clk_regmap mst_a_sclk = 577 + AUD_MST_SCLK(a, AUDIO_MST_A_SCLK_CTRL1); 578 + static struct clk_regmap mst_b_sclk = 579 + AUD_MST_SCLK(b, AUDIO_MST_B_SCLK_CTRL1); 580 + static struct clk_regmap mst_c_sclk = 581 + AUD_MST_SCLK(c, AUDIO_MST_C_SCLK_CTRL1); 582 + static struct clk_regmap mst_d_sclk = 583 + AUD_MST_SCLK(d, AUDIO_MST_D_SCLK_CTRL1); 584 + static struct clk_regmap mst_e_sclk = 585 + AUD_MST_SCLK(e, AUDIO_MST_E_SCLK_CTRL1); 586 + static struct clk_regmap mst_f_sclk = 587 + AUD_MST_SCLK(f, AUDIO_MST_F_SCLK_CTRL1); 588 + 589 + static struct clk_regmap mst_a_lrclk_div = 590 + AUD_MST_LRCLK_DIV(a, AUDIO_MST_A_SCLK_CTRL0); 591 + static struct clk_regmap mst_b_lrclk_div = 592 + AUD_MST_LRCLK_DIV(b, AUDIO_MST_B_SCLK_CTRL0); 593 + static struct clk_regmap mst_c_lrclk_div = 594 + AUD_MST_LRCLK_DIV(c, AUDIO_MST_C_SCLK_CTRL0); 595 + static struct clk_regmap mst_d_lrclk_div = 596 + AUD_MST_LRCLK_DIV(d, AUDIO_MST_D_SCLK_CTRL0); 597 + static struct clk_regmap mst_e_lrclk_div = 598 + AUD_MST_LRCLK_DIV(e, AUDIO_MST_E_SCLK_CTRL0); 599 + static struct clk_regmap mst_f_lrclk_div = 600 + AUD_MST_LRCLK_DIV(f, AUDIO_MST_F_SCLK_CTRL0); 601 + 602 + static struct clk_regmap mst_a_lrclk = 603 + AUD_MST_LRCLK(a, AUDIO_MST_A_SCLK_CTRL1); 604 + static struct clk_regmap mst_b_lrclk = 605 + AUD_MST_LRCLK(b, AUDIO_MST_B_SCLK_CTRL1); 606 + static struct clk_regmap mst_c_lrclk = 607 + AUD_MST_LRCLK(c, AUDIO_MST_C_SCLK_CTRL1); 608 + static struct clk_regmap mst_d_lrclk = 609 + AUD_MST_LRCLK(d, AUDIO_MST_D_SCLK_CTRL1); 610 + static struct clk_regmap mst_e_lrclk = 611 + AUD_MST_LRCLK(e, AUDIO_MST_E_SCLK_CTRL1); 612 + static struct clk_regmap mst_f_lrclk = 613 + AUD_MST_LRCLK(f, AUDIO_MST_F_SCLK_CTRL1); 614 + 615 + static struct clk_regmap tdmin_a_sclk_sel = 616 + AUD_TDM_SCLK_MUX(in_a, AUDIO_CLK_TDMIN_A_CTRL); 617 + static struct clk_regmap tdmin_b_sclk_sel = 618 + AUD_TDM_SCLK_MUX(in_b, AUDIO_CLK_TDMIN_B_CTRL); 619 + static struct clk_regmap tdmin_c_sclk_sel = 620 + AUD_TDM_SCLK_MUX(in_c, AUDIO_CLK_TDMIN_C_CTRL); 621 + static struct clk_regmap tdmin_lb_sclk_sel = 622 + AUD_TDM_SCLK_MUX(in_lb, AUDIO_CLK_TDMIN_LB_CTRL); 623 + static struct clk_regmap tdmout_a_sclk_sel = 624 + AUD_TDM_SCLK_MUX(out_a, AUDIO_CLK_TDMOUT_A_CTRL); 625 + static struct clk_regmap tdmout_b_sclk_sel = 626 + AUD_TDM_SCLK_MUX(out_b, AUDIO_CLK_TDMOUT_B_CTRL); 627 + static struct clk_regmap tdmout_c_sclk_sel = 628 + AUD_TDM_SCLK_MUX(out_c, AUDIO_CLK_TDMOUT_C_CTRL); 629 + 630 + static struct clk_regmap tdmin_a_sclk_pre_en = 631 + AUD_TDM_SCLK_PRE_EN(in_a, AUDIO_CLK_TDMIN_A_CTRL); 632 + static struct clk_regmap tdmin_b_sclk_pre_en = 633 + AUD_TDM_SCLK_PRE_EN(in_b, AUDIO_CLK_TDMIN_B_CTRL); 634 + static struct clk_regmap tdmin_c_sclk_pre_en = 635 + AUD_TDM_SCLK_PRE_EN(in_c, AUDIO_CLK_TDMIN_C_CTRL); 636 + static struct clk_regmap tdmin_lb_sclk_pre_en = 637 + AUD_TDM_SCLK_PRE_EN(in_lb, AUDIO_CLK_TDMIN_LB_CTRL); 638 + static struct clk_regmap tdmout_a_sclk_pre_en = 639 + AUD_TDM_SCLK_PRE_EN(out_a, AUDIO_CLK_TDMOUT_A_CTRL); 640 + static struct clk_regmap tdmout_b_sclk_pre_en = 641 + AUD_TDM_SCLK_PRE_EN(out_b, AUDIO_CLK_TDMOUT_B_CTRL); 642 + static struct clk_regmap tdmout_c_sclk_pre_en = 643 + AUD_TDM_SCLK_PRE_EN(out_c, AUDIO_CLK_TDMOUT_C_CTRL); 644 + 645 + static struct clk_regmap tdmin_a_sclk_post_en = 646 + AUD_TDM_SCLK_POST_EN(in_a, AUDIO_CLK_TDMIN_A_CTRL); 647 + static struct clk_regmap tdmin_b_sclk_post_en = 648 + AUD_TDM_SCLK_POST_EN(in_b, AUDIO_CLK_TDMIN_B_CTRL); 649 + static struct clk_regmap tdmin_c_sclk_post_en = 650 + AUD_TDM_SCLK_POST_EN(in_c, AUDIO_CLK_TDMIN_C_CTRL); 651 + static struct clk_regmap tdmin_lb_sclk_post_en = 652 + AUD_TDM_SCLK_POST_EN(in_lb, AUDIO_CLK_TDMIN_LB_CTRL); 653 + static struct clk_regmap tdmout_a_sclk_post_en = 654 + AUD_TDM_SCLK_POST_EN(out_a, AUDIO_CLK_TDMOUT_A_CTRL); 655 + static struct clk_regmap tdmout_b_sclk_post_en = 656 + AUD_TDM_SCLK_POST_EN(out_b, AUDIO_CLK_TDMOUT_B_CTRL); 657 + static struct clk_regmap tdmout_c_sclk_post_en = 658 + AUD_TDM_SCLK_POST_EN(out_c, AUDIO_CLK_TDMOUT_C_CTRL); 659 + 660 + static struct clk_regmap tdmin_a_sclk = 661 + AUD_TDM_SCLK(in_a, AUDIO_CLK_TDMIN_A_CTRL); 662 + static struct clk_regmap tdmin_b_sclk = 663 + AUD_TDM_SCLK(in_b, AUDIO_CLK_TDMIN_B_CTRL); 664 + static struct clk_regmap tdmin_c_sclk = 665 + AUD_TDM_SCLK(in_c, AUDIO_CLK_TDMIN_C_CTRL); 666 + static struct clk_regmap tdmin_lb_sclk = 667 + AUD_TDM_SCLK(in_lb, AUDIO_CLK_TDMIN_LB_CTRL); 668 + static struct clk_regmap tdmout_a_sclk = 669 + AUD_TDM_SCLK(out_a, AUDIO_CLK_TDMOUT_A_CTRL); 670 + static struct clk_regmap tdmout_b_sclk = 671 + AUD_TDM_SCLK(out_b, AUDIO_CLK_TDMOUT_B_CTRL); 672 + static struct clk_regmap tdmout_c_sclk = 673 + AUD_TDM_SCLK(out_c, AUDIO_CLK_TDMOUT_C_CTRL); 674 + 675 + static struct clk_regmap tdmin_a_lrclk = 676 + AUD_TDM_LRLCK(in_a, AUDIO_CLK_TDMIN_A_CTRL); 677 + static struct clk_regmap tdmin_b_lrclk = 678 + AUD_TDM_LRLCK(in_b, AUDIO_CLK_TDMIN_B_CTRL); 679 + static struct clk_regmap tdmin_c_lrclk = 680 + AUD_TDM_LRLCK(in_c, AUDIO_CLK_TDMIN_C_CTRL); 681 + static struct clk_regmap tdmin_lb_lrclk = 682 + AUD_TDM_LRLCK(in_lb, AUDIO_CLK_TDMIN_LB_CTRL); 683 + static struct clk_regmap tdmout_a_lrclk = 684 + AUD_TDM_LRLCK(out_a, AUDIO_CLK_TDMOUT_A_CTRL); 685 + static struct clk_regmap tdmout_b_lrclk = 686 + AUD_TDM_LRLCK(out_b, AUDIO_CLK_TDMOUT_B_CTRL); 687 + static struct clk_regmap tdmout_c_lrclk = 688 + AUD_TDM_LRLCK(out_c, AUDIO_CLK_TDMOUT_C_CTRL); 689 + 690 + /* AXG/G12A Clocks */ 691 + static struct clk_hw axg_aud_top = { 692 + .init = &(struct clk_init_data) { 693 + /* Provide aud_top signal name on axg and g12a */ 694 + .name = "aud_top", 695 + .ops = &(const struct clk_ops) {}, 696 + .parent_data = &(const struct clk_parent_data) { 697 + .fw_name = "pclk", 698 + }, 699 + .num_parents = 1, 700 + }, 269 701 }; 270 702 271 - static AUD_TDM_PAD_CTRL(mclk_pad_0, AUDIO_MST_PAD_CTRL0, 0, 272 - mclk_pad_ctrl_parent_data); 273 - static AUD_TDM_PAD_CTRL(mclk_pad_1, AUDIO_MST_PAD_CTRL0, 4, 274 - mclk_pad_ctrl_parent_data); 703 + static struct clk_regmap mst_a_mclk_sel = 704 + AUD_MST_MCLK_MUX(mst_a_mclk, AUDIO_MCLK_A_CTRL); 705 + static struct clk_regmap mst_b_mclk_sel = 706 + AUD_MST_MCLK_MUX(mst_b_mclk, AUDIO_MCLK_B_CTRL); 707 + static struct clk_regmap mst_c_mclk_sel = 708 + AUD_MST_MCLK_MUX(mst_c_mclk, AUDIO_MCLK_C_CTRL); 709 + static struct clk_regmap mst_d_mclk_sel = 710 + AUD_MST_MCLK_MUX(mst_d_mclk, AUDIO_MCLK_D_CTRL); 711 + static struct clk_regmap mst_e_mclk_sel = 712 + AUD_MST_MCLK_MUX(mst_e_mclk, AUDIO_MCLK_E_CTRL); 713 + static struct clk_regmap mst_f_mclk_sel = 714 + AUD_MST_MCLK_MUX(mst_f_mclk, AUDIO_MCLK_F_CTRL); 275 715 276 - static const struct clk_parent_data lrclk_pad_ctrl_parent_data[] = { 277 - { .hw = &aud_mst_a_lrclk.hw }, 278 - { .hw = &aud_mst_b_lrclk.hw }, 279 - { .hw = &aud_mst_c_lrclk.hw }, 280 - { .hw = &aud_mst_d_lrclk.hw }, 281 - { .hw = &aud_mst_e_lrclk.hw }, 282 - { .hw = &aud_mst_f_lrclk.hw }, 716 + static struct clk_regmap mst_a_mclk_div = 717 + AUD_MST_MCLK_DIV(mst_a_mclk, AUDIO_MCLK_A_CTRL); 718 + static struct clk_regmap mst_b_mclk_div = 719 + AUD_MST_MCLK_DIV(mst_b_mclk, AUDIO_MCLK_B_CTRL); 720 + static struct clk_regmap mst_c_mclk_div = 721 + AUD_MST_MCLK_DIV(mst_c_mclk, AUDIO_MCLK_C_CTRL); 722 + static struct clk_regmap mst_d_mclk_div = 723 + AUD_MST_MCLK_DIV(mst_d_mclk, AUDIO_MCLK_D_CTRL); 724 + static struct clk_regmap mst_e_mclk_div = 725 + AUD_MST_MCLK_DIV(mst_e_mclk, AUDIO_MCLK_E_CTRL); 726 + static struct clk_regmap mst_f_mclk_div = 727 + AUD_MST_MCLK_DIV(mst_f_mclk, AUDIO_MCLK_F_CTRL); 728 + 729 + static struct clk_regmap mst_a_mclk = 730 + AUD_MST_MCLK_GATE(mst_a_mclk, AUDIO_MCLK_A_CTRL); 731 + static struct clk_regmap mst_b_mclk = 732 + AUD_MST_MCLK_GATE(mst_b_mclk, AUDIO_MCLK_B_CTRL); 733 + static struct clk_regmap mst_c_mclk = 734 + AUD_MST_MCLK_GATE(mst_c_mclk, AUDIO_MCLK_C_CTRL); 735 + static struct clk_regmap mst_d_mclk = 736 + AUD_MST_MCLK_GATE(mst_d_mclk, AUDIO_MCLK_D_CTRL); 737 + static struct clk_regmap mst_e_mclk = 738 + AUD_MST_MCLK_GATE(mst_e_mclk, AUDIO_MCLK_E_CTRL); 739 + static struct clk_regmap mst_f_mclk = 740 + AUD_MST_MCLK_GATE(mst_f_mclk, AUDIO_MCLK_F_CTRL); 741 + 742 + /* G12a clocks */ 743 + static struct clk_regmap g12a_tdm_mclk_pad_0 = AUD_TDM_PAD_CTRL( 744 + mclk_pad_0, AUDIO_MST_PAD_CTRL0, 0, mclk_pad_ctrl_parent_data); 745 + static struct clk_regmap g12a_tdm_mclk_pad_1 = AUD_TDM_PAD_CTRL( 746 + mclk_pad_1, AUDIO_MST_PAD_CTRL0, 4, mclk_pad_ctrl_parent_data); 747 + static struct clk_regmap g12a_tdm_lrclk_pad_0 = AUD_TDM_PAD_CTRL( 748 + lrclk_pad_0, AUDIO_MST_PAD_CTRL1, 16, lrclk_pad_ctrl_parent_data); 749 + static struct clk_regmap g12a_tdm_lrclk_pad_1 = AUD_TDM_PAD_CTRL( 750 + lrclk_pad_1, AUDIO_MST_PAD_CTRL1, 20, lrclk_pad_ctrl_parent_data); 751 + static struct clk_regmap g12a_tdm_lrclk_pad_2 = AUD_TDM_PAD_CTRL( 752 + lrclk_pad_2, AUDIO_MST_PAD_CTRL1, 24, lrclk_pad_ctrl_parent_data); 753 + static struct clk_regmap g12a_tdm_sclk_pad_0 = AUD_TDM_PAD_CTRL( 754 + sclk_pad_0, AUDIO_MST_PAD_CTRL1, 0, sclk_pad_ctrl_parent_data); 755 + static struct clk_regmap g12a_tdm_sclk_pad_1 = AUD_TDM_PAD_CTRL( 756 + sclk_pad_1, AUDIO_MST_PAD_CTRL1, 4, sclk_pad_ctrl_parent_data); 757 + static struct clk_regmap g12a_tdm_sclk_pad_2 = AUD_TDM_PAD_CTRL( 758 + sclk_pad_2, AUDIO_MST_PAD_CTRL1, 8, sclk_pad_ctrl_parent_data); 759 + 760 + /* G12a/SM1 clocks */ 761 + static struct clk_regmap toram = 762 + AUD_PCLK_GATE(toram, AUDIO_CLK_GATE_EN, 20); 763 + static struct clk_regmap spdifout_b = 764 + AUD_PCLK_GATE(spdifout_b, AUDIO_CLK_GATE_EN, 21); 765 + static struct clk_regmap eqdrc = 766 + AUD_PCLK_GATE(eqdrc, AUDIO_CLK_GATE_EN, 22); 767 + 768 + /* SM1 Clocks */ 769 + static struct clk_regmap sm1_clk81_en = { 770 + .data = &(struct clk_regmap_gate_data){ 771 + .offset = AUDIO_CLK81_EN, 772 + .bit_idx = 31, 773 + }, 774 + .hw.init = &(struct clk_init_data) { 775 + .name = "aud_clk81_en", 776 + .ops = &clk_regmap_gate_ops, 777 + .parent_data = &(const struct clk_parent_data) { 778 + .fw_name = "pclk", 779 + }, 780 + .num_parents = 1, 781 + }, 283 782 }; 284 783 285 - static AUD_TDM_PAD_CTRL(lrclk_pad_0, AUDIO_MST_PAD_CTRL1, 16, 286 - lrclk_pad_ctrl_parent_data); 287 - static AUD_TDM_PAD_CTRL(lrclk_pad_1, AUDIO_MST_PAD_CTRL1, 20, 288 - lrclk_pad_ctrl_parent_data); 289 - static AUD_TDM_PAD_CTRL(lrclk_pad_2, AUDIO_MST_PAD_CTRL1, 24, 290 - lrclk_pad_ctrl_parent_data); 291 - 292 - static const struct clk_parent_data sclk_pad_ctrl_parent_data[] = { 293 - { .hw = &aud_mst_a_sclk.hw }, 294 - { .hw = &aud_mst_b_sclk.hw }, 295 - { .hw = &aud_mst_c_sclk.hw }, 296 - { .hw = &aud_mst_d_sclk.hw }, 297 - { .hw = &aud_mst_e_sclk.hw }, 298 - { .hw = &aud_mst_f_sclk.hw }, 784 + static struct clk_regmap sm1_sysclk_a_div = { 785 + .data = &(struct clk_regmap_div_data){ 786 + .offset = AUDIO_CLK81_CTRL, 787 + .shift = 0, 788 + .width = 8, 789 + }, 790 + .hw.init = &(struct clk_init_data) { 791 + .name = "aud_sysclk_a_div", 792 + .ops = &clk_regmap_divider_ops, 793 + .parent_hws = (const struct clk_hw *[]) { 794 + &sm1_clk81_en.hw, 795 + }, 796 + .num_parents = 1, 797 + .flags = CLK_SET_RATE_PARENT, 798 + }, 299 799 }; 300 800 301 - static AUD_TDM_PAD_CTRL(sclk_pad_0, AUDIO_MST_PAD_CTRL1, 0, 302 - sclk_pad_ctrl_parent_data); 303 - static AUD_TDM_PAD_CTRL(sclk_pad_1, AUDIO_MST_PAD_CTRL1, 4, 304 - sclk_pad_ctrl_parent_data); 305 - static AUD_TDM_PAD_CTRL(sclk_pad_2, AUDIO_MST_PAD_CTRL1, 8, 306 - sclk_pad_ctrl_parent_data); 801 + static struct clk_regmap sm1_sysclk_a_en = { 802 + .data = &(struct clk_regmap_gate_data){ 803 + .offset = AUDIO_CLK81_CTRL, 804 + .bit_idx = 8, 805 + }, 806 + .hw.init = &(struct clk_init_data) { 807 + .name = "aud_sysclk_a_en", 808 + .ops = &clk_regmap_gate_ops, 809 + .parent_hws = (const struct clk_hw *[]) { 810 + &sm1_sysclk_a_div.hw, 811 + }, 812 + .num_parents = 1, 813 + .flags = CLK_SET_RATE_PARENT, 814 + }, 815 + }; 816 + 817 + static struct clk_regmap sm1_sysclk_b_div = { 818 + .data = &(struct clk_regmap_div_data){ 819 + .offset = AUDIO_CLK81_CTRL, 820 + .shift = 16, 821 + .width = 8, 822 + }, 823 + .hw.init = &(struct clk_init_data) { 824 + .name = "aud_sysclk_b_div", 825 + .ops = &clk_regmap_divider_ops, 826 + .parent_hws = (const struct clk_hw *[]) { 827 + &sm1_clk81_en.hw, 828 + }, 829 + .num_parents = 1, 830 + .flags = CLK_SET_RATE_PARENT, 831 + }, 832 + }; 833 + 834 + static struct clk_regmap sm1_sysclk_b_en = { 835 + .data = &(struct clk_regmap_gate_data){ 836 + .offset = AUDIO_CLK81_CTRL, 837 + .bit_idx = 24, 838 + }, 839 + .hw.init = &(struct clk_init_data) { 840 + .name = "aud_sysclk_b_en", 841 + .ops = &clk_regmap_gate_ops, 842 + .parent_hws = (const struct clk_hw *[]) { 843 + &sm1_sysclk_b_div.hw, 844 + }, 845 + .num_parents = 1, 846 + .flags = CLK_SET_RATE_PARENT, 847 + }, 848 + }; 849 + 850 + static const struct clk_hw *sm1_aud_top_parents[] = { 851 + &sm1_sysclk_a_en.hw, 852 + &sm1_sysclk_b_en.hw, 853 + }; 854 + 855 + static struct clk_regmap sm1_aud_top = { 856 + .data = &(struct clk_regmap_mux_data){ 857 + .offset = AUDIO_CLK81_CTRL, 858 + .mask = 0x1, 859 + .shift = 31, 860 + }, 861 + .hw.init = &(struct clk_init_data){ 862 + .name = "aud_top", 863 + .ops = &clk_regmap_mux_ops, 864 + .parent_hws = sm1_aud_top_parents, 865 + .num_parents = ARRAY_SIZE(sm1_aud_top_parents), 866 + .flags = CLK_SET_RATE_NO_REPARENT, 867 + }, 868 + }; 869 + 870 + static struct clk_regmap resample_b = 871 + AUD_PCLK_GATE(resample_b, AUDIO_CLK_GATE_EN, 26); 872 + static struct clk_regmap tovad = 873 + AUD_PCLK_GATE(tovad, AUDIO_CLK_GATE_EN, 27); 874 + static struct clk_regmap locker = 875 + AUD_PCLK_GATE(locker, AUDIO_CLK_GATE_EN, 28); 876 + static struct clk_regmap spdifin_lb = 877 + AUD_PCLK_GATE(spdifin_lb, AUDIO_CLK_GATE_EN, 29); 878 + static struct clk_regmap frddr_d = 879 + AUD_PCLK_GATE(frddr_d, AUDIO_CLK_GATE_EN1, 0); 880 + static struct clk_regmap toddr_d = 881 + AUD_PCLK_GATE(toddr_d, AUDIO_CLK_GATE_EN1, 1); 882 + static struct clk_regmap loopback_b = 883 + AUD_PCLK_GATE(loopback_b, AUDIO_CLK_GATE_EN1, 2); 884 + 885 + static struct clk_regmap sm1_mst_a_mclk_sel = 886 + AUD_MST_MCLK_MUX(mst_a_mclk, AUDIO_SM1_MCLK_A_CTRL); 887 + static struct clk_regmap sm1_mst_b_mclk_sel = 888 + AUD_MST_MCLK_MUX(mst_b_mclk, AUDIO_SM1_MCLK_B_CTRL); 889 + static struct clk_regmap sm1_mst_c_mclk_sel = 890 + AUD_MST_MCLK_MUX(mst_c_mclk, AUDIO_SM1_MCLK_C_CTRL); 891 + static struct clk_regmap sm1_mst_d_mclk_sel = 892 + AUD_MST_MCLK_MUX(mst_d_mclk, AUDIO_SM1_MCLK_D_CTRL); 893 + static struct clk_regmap sm1_mst_e_mclk_sel = 894 + AUD_MST_MCLK_MUX(mst_e_mclk, AUDIO_SM1_MCLK_E_CTRL); 895 + static struct clk_regmap sm1_mst_f_mclk_sel = 896 + AUD_MST_MCLK_MUX(mst_f_mclk, AUDIO_SM1_MCLK_F_CTRL); 897 + 898 + static struct clk_regmap sm1_mst_a_mclk_div = 899 + AUD_MST_MCLK_DIV(mst_a_mclk, AUDIO_SM1_MCLK_A_CTRL); 900 + static struct clk_regmap sm1_mst_b_mclk_div = 901 + AUD_MST_MCLK_DIV(mst_b_mclk, AUDIO_SM1_MCLK_B_CTRL); 902 + static struct clk_regmap sm1_mst_c_mclk_div = 903 + AUD_MST_MCLK_DIV(mst_c_mclk, AUDIO_SM1_MCLK_C_CTRL); 904 + static struct clk_regmap sm1_mst_d_mclk_div = 905 + AUD_MST_MCLK_DIV(mst_d_mclk, AUDIO_SM1_MCLK_D_CTRL); 906 + static struct clk_regmap sm1_mst_e_mclk_div = 907 + AUD_MST_MCLK_DIV(mst_e_mclk, AUDIO_SM1_MCLK_E_CTRL); 908 + static struct clk_regmap sm1_mst_f_mclk_div = 909 + AUD_MST_MCLK_DIV(mst_f_mclk, AUDIO_SM1_MCLK_F_CTRL); 910 + 911 + static struct clk_regmap sm1_mst_a_mclk = 912 + AUD_MST_MCLK_GATE(mst_a_mclk, AUDIO_SM1_MCLK_A_CTRL); 913 + static struct clk_regmap sm1_mst_b_mclk = 914 + AUD_MST_MCLK_GATE(mst_b_mclk, AUDIO_SM1_MCLK_B_CTRL); 915 + static struct clk_regmap sm1_mst_c_mclk = 916 + AUD_MST_MCLK_GATE(mst_c_mclk, AUDIO_SM1_MCLK_C_CTRL); 917 + static struct clk_regmap sm1_mst_d_mclk = 918 + AUD_MST_MCLK_GATE(mst_d_mclk, AUDIO_SM1_MCLK_D_CTRL); 919 + static struct clk_regmap sm1_mst_e_mclk = 920 + AUD_MST_MCLK_GATE(mst_e_mclk, AUDIO_SM1_MCLK_E_CTRL); 921 + static struct clk_regmap sm1_mst_f_mclk = 922 + AUD_MST_MCLK_GATE(mst_f_mclk, AUDIO_SM1_MCLK_F_CTRL); 923 + 924 + static struct clk_regmap sm1_tdm_mclk_pad_0 = AUD_TDM_PAD_CTRL( 925 + tdm_mclk_pad_0, AUDIO_SM1_MST_PAD_CTRL0, 0, mclk_pad_ctrl_parent_data); 926 + static struct clk_regmap sm1_tdm_mclk_pad_1 = AUD_TDM_PAD_CTRL( 927 + tdm_mclk_pad_1, AUDIO_SM1_MST_PAD_CTRL0, 4, mclk_pad_ctrl_parent_data); 928 + static struct clk_regmap sm1_tdm_lrclk_pad_0 = AUD_TDM_PAD_CTRL( 929 + tdm_lrclk_pad_0, AUDIO_SM1_MST_PAD_CTRL1, 16, lrclk_pad_ctrl_parent_data); 930 + static struct clk_regmap sm1_tdm_lrclk_pad_1 = AUD_TDM_PAD_CTRL( 931 + tdm_lrclk_pad_1, AUDIO_SM1_MST_PAD_CTRL1, 20, lrclk_pad_ctrl_parent_data); 932 + static struct clk_regmap sm1_tdm_lrclk_pad_2 = AUD_TDM_PAD_CTRL( 933 + tdm_lrclk_pad_2, AUDIO_SM1_MST_PAD_CTRL1, 24, lrclk_pad_ctrl_parent_data); 934 + static struct clk_regmap sm1_tdm_sclk_pad_0 = AUD_TDM_PAD_CTRL( 935 + tdm_sclk_pad_0, AUDIO_SM1_MST_PAD_CTRL1, 0, sclk_pad_ctrl_parent_data); 936 + static struct clk_regmap sm1_tdm_sclk_pad_1 = AUD_TDM_PAD_CTRL( 937 + tdm_sclk_pad_1, AUDIO_SM1_MST_PAD_CTRL1, 4, sclk_pad_ctrl_parent_data); 938 + static struct clk_regmap sm1_tdm_sclk_pad_2 = AUD_TDM_PAD_CTRL( 939 + tdm_sclk_pad_2, AUDIO_SM1_MST_PAD_CTRL1, 8, sclk_pad_ctrl_parent_data); 307 940 308 941 /* 309 942 * Array of all clocks provided by this provider ··· 778 477 */ 779 478 static struct clk_hw_onecell_data axg_audio_hw_onecell_data = { 780 479 .hws = { 781 - [AUD_CLKID_DDR_ARB] = &aud_ddr_arb.hw, 782 - [AUD_CLKID_PDM] = &aud_pdm.hw, 783 - [AUD_CLKID_TDMIN_A] = &aud_tdmin_a.hw, 784 - [AUD_CLKID_TDMIN_B] = &aud_tdmin_b.hw, 785 - [AUD_CLKID_TDMIN_C] = &aud_tdmin_c.hw, 786 - [AUD_CLKID_TDMIN_LB] = &aud_tdmin_lb.hw, 787 - [AUD_CLKID_TDMOUT_A] = &aud_tdmout_a.hw, 788 - [AUD_CLKID_TDMOUT_B] = &aud_tdmout_b.hw, 789 - [AUD_CLKID_TDMOUT_C] = &aud_tdmout_c.hw, 790 - [AUD_CLKID_FRDDR_A] = &aud_frddr_a.hw, 791 - [AUD_CLKID_FRDDR_B] = &aud_frddr_b.hw, 792 - [AUD_CLKID_FRDDR_C] = &aud_frddr_c.hw, 793 - [AUD_CLKID_TODDR_A] = &aud_toddr_a.hw, 794 - [AUD_CLKID_TODDR_B] = &aud_toddr_b.hw, 795 - [AUD_CLKID_TODDR_C] = &aud_toddr_c.hw, 796 - [AUD_CLKID_LOOPBACK] = &aud_loopback.hw, 797 - [AUD_CLKID_SPDIFIN] = &aud_spdifin.hw, 798 - [AUD_CLKID_SPDIFOUT] = &aud_spdifout.hw, 799 - [AUD_CLKID_RESAMPLE] = &aud_resample.hw, 800 - [AUD_CLKID_POWER_DETECT] = &aud_power_detect.hw, 801 - [AUD_CLKID_MST_A_MCLK_SEL] = &aud_mst_a_mclk_sel.hw, 802 - [AUD_CLKID_MST_B_MCLK_SEL] = &aud_mst_b_mclk_sel.hw, 803 - [AUD_CLKID_MST_C_MCLK_SEL] = &aud_mst_c_mclk_sel.hw, 804 - [AUD_CLKID_MST_D_MCLK_SEL] = &aud_mst_d_mclk_sel.hw, 805 - [AUD_CLKID_MST_E_MCLK_SEL] = &aud_mst_e_mclk_sel.hw, 806 - [AUD_CLKID_MST_F_MCLK_SEL] = &aud_mst_f_mclk_sel.hw, 807 - [AUD_CLKID_MST_A_MCLK_DIV] = &aud_mst_a_mclk_div.hw, 808 - [AUD_CLKID_MST_B_MCLK_DIV] = &aud_mst_b_mclk_div.hw, 809 - [AUD_CLKID_MST_C_MCLK_DIV] = &aud_mst_c_mclk_div.hw, 810 - [AUD_CLKID_MST_D_MCLK_DIV] = &aud_mst_d_mclk_div.hw, 811 - [AUD_CLKID_MST_E_MCLK_DIV] = &aud_mst_e_mclk_div.hw, 812 - [AUD_CLKID_MST_F_MCLK_DIV] = &aud_mst_f_mclk_div.hw, 813 - [AUD_CLKID_MST_A_MCLK] = &aud_mst_a_mclk.hw, 814 - [AUD_CLKID_MST_B_MCLK] = &aud_mst_b_mclk.hw, 815 - [AUD_CLKID_MST_C_MCLK] = &aud_mst_c_mclk.hw, 816 - [AUD_CLKID_MST_D_MCLK] = &aud_mst_d_mclk.hw, 817 - [AUD_CLKID_MST_E_MCLK] = &aud_mst_e_mclk.hw, 818 - [AUD_CLKID_MST_F_MCLK] = &aud_mst_f_mclk.hw, 819 - [AUD_CLKID_SPDIFOUT_CLK_SEL] = &aud_spdifout_clk_sel.hw, 820 - [AUD_CLKID_SPDIFOUT_CLK_DIV] = &aud_spdifout_clk_div.hw, 821 - [AUD_CLKID_SPDIFOUT_CLK] = &aud_spdifout_clk.hw, 822 - [AUD_CLKID_SPDIFIN_CLK_SEL] = &aud_spdifin_clk_sel.hw, 823 - [AUD_CLKID_SPDIFIN_CLK_DIV] = &aud_spdifin_clk_div.hw, 824 - [AUD_CLKID_SPDIFIN_CLK] = &aud_spdifin_clk.hw, 825 - [AUD_CLKID_PDM_DCLK_SEL] = &aud_pdm_dclk_sel.hw, 826 - [AUD_CLKID_PDM_DCLK_DIV] = &aud_pdm_dclk_div.hw, 827 - [AUD_CLKID_PDM_DCLK] = &aud_pdm_dclk.hw, 828 - [AUD_CLKID_PDM_SYSCLK_SEL] = &aud_pdm_sysclk_sel.hw, 829 - [AUD_CLKID_PDM_SYSCLK_DIV] = &aud_pdm_sysclk_div.hw, 830 - [AUD_CLKID_PDM_SYSCLK] = &aud_pdm_sysclk.hw, 831 - [AUD_CLKID_MST_A_SCLK_PRE_EN] = &aud_mst_a_sclk_pre_en.hw, 832 - [AUD_CLKID_MST_B_SCLK_PRE_EN] = &aud_mst_b_sclk_pre_en.hw, 833 - [AUD_CLKID_MST_C_SCLK_PRE_EN] = &aud_mst_c_sclk_pre_en.hw, 834 - [AUD_CLKID_MST_D_SCLK_PRE_EN] = &aud_mst_d_sclk_pre_en.hw, 835 - [AUD_CLKID_MST_E_SCLK_PRE_EN] = &aud_mst_e_sclk_pre_en.hw, 836 - [AUD_CLKID_MST_F_SCLK_PRE_EN] = &aud_mst_f_sclk_pre_en.hw, 837 - [AUD_CLKID_MST_A_SCLK_DIV] = &aud_mst_a_sclk_div.hw, 838 - [AUD_CLKID_MST_B_SCLK_DIV] = &aud_mst_b_sclk_div.hw, 839 - [AUD_CLKID_MST_C_SCLK_DIV] = &aud_mst_c_sclk_div.hw, 840 - [AUD_CLKID_MST_D_SCLK_DIV] = &aud_mst_d_sclk_div.hw, 841 - [AUD_CLKID_MST_E_SCLK_DIV] = &aud_mst_e_sclk_div.hw, 842 - [AUD_CLKID_MST_F_SCLK_DIV] = &aud_mst_f_sclk_div.hw, 843 - [AUD_CLKID_MST_A_SCLK_POST_EN] = &aud_mst_a_sclk_post_en.hw, 844 - [AUD_CLKID_MST_B_SCLK_POST_EN] = &aud_mst_b_sclk_post_en.hw, 845 - [AUD_CLKID_MST_C_SCLK_POST_EN] = &aud_mst_c_sclk_post_en.hw, 846 - [AUD_CLKID_MST_D_SCLK_POST_EN] = &aud_mst_d_sclk_post_en.hw, 847 - [AUD_CLKID_MST_E_SCLK_POST_EN] = &aud_mst_e_sclk_post_en.hw, 848 - [AUD_CLKID_MST_F_SCLK_POST_EN] = &aud_mst_f_sclk_post_en.hw, 849 - [AUD_CLKID_MST_A_SCLK] = &aud_mst_a_sclk.hw, 850 - [AUD_CLKID_MST_B_SCLK] = &aud_mst_b_sclk.hw, 851 - [AUD_CLKID_MST_C_SCLK] = &aud_mst_c_sclk.hw, 852 - [AUD_CLKID_MST_D_SCLK] = &aud_mst_d_sclk.hw, 853 - [AUD_CLKID_MST_E_SCLK] = &aud_mst_e_sclk.hw, 854 - [AUD_CLKID_MST_F_SCLK] = &aud_mst_f_sclk.hw, 855 - [AUD_CLKID_MST_A_LRCLK_DIV] = &aud_mst_a_lrclk_div.hw, 856 - [AUD_CLKID_MST_B_LRCLK_DIV] = &aud_mst_b_lrclk_div.hw, 857 - [AUD_CLKID_MST_C_LRCLK_DIV] = &aud_mst_c_lrclk_div.hw, 858 - [AUD_CLKID_MST_D_LRCLK_DIV] = &aud_mst_d_lrclk_div.hw, 859 - [AUD_CLKID_MST_E_LRCLK_DIV] = &aud_mst_e_lrclk_div.hw, 860 - [AUD_CLKID_MST_F_LRCLK_DIV] = &aud_mst_f_lrclk_div.hw, 861 - [AUD_CLKID_MST_A_LRCLK] = &aud_mst_a_lrclk.hw, 862 - [AUD_CLKID_MST_B_LRCLK] = &aud_mst_b_lrclk.hw, 863 - [AUD_CLKID_MST_C_LRCLK] = &aud_mst_c_lrclk.hw, 864 - [AUD_CLKID_MST_D_LRCLK] = &aud_mst_d_lrclk.hw, 865 - [AUD_CLKID_MST_E_LRCLK] = &aud_mst_e_lrclk.hw, 866 - [AUD_CLKID_MST_F_LRCLK] = &aud_mst_f_lrclk.hw, 867 - [AUD_CLKID_TDMIN_A_SCLK_SEL] = &aud_tdmin_a_sclk_sel.hw, 868 - [AUD_CLKID_TDMIN_B_SCLK_SEL] = &aud_tdmin_b_sclk_sel.hw, 869 - [AUD_CLKID_TDMIN_C_SCLK_SEL] = &aud_tdmin_c_sclk_sel.hw, 870 - [AUD_CLKID_TDMIN_LB_SCLK_SEL] = &aud_tdmin_lb_sclk_sel.hw, 871 - [AUD_CLKID_TDMOUT_A_SCLK_SEL] = &aud_tdmout_a_sclk_sel.hw, 872 - [AUD_CLKID_TDMOUT_B_SCLK_SEL] = &aud_tdmout_b_sclk_sel.hw, 873 - [AUD_CLKID_TDMOUT_C_SCLK_SEL] = &aud_tdmout_c_sclk_sel.hw, 874 - [AUD_CLKID_TDMIN_A_SCLK_PRE_EN] = &aud_tdmin_a_sclk_pre_en.hw, 875 - [AUD_CLKID_TDMIN_B_SCLK_PRE_EN] = &aud_tdmin_b_sclk_pre_en.hw, 876 - [AUD_CLKID_TDMIN_C_SCLK_PRE_EN] = &aud_tdmin_c_sclk_pre_en.hw, 877 - [AUD_CLKID_TDMIN_LB_SCLK_PRE_EN] = &aud_tdmin_lb_sclk_pre_en.hw, 878 - [AUD_CLKID_TDMOUT_A_SCLK_PRE_EN] = &aud_tdmout_a_sclk_pre_en.hw, 879 - [AUD_CLKID_TDMOUT_B_SCLK_PRE_EN] = &aud_tdmout_b_sclk_pre_en.hw, 880 - [AUD_CLKID_TDMOUT_C_SCLK_PRE_EN] = &aud_tdmout_c_sclk_pre_en.hw, 881 - [AUD_CLKID_TDMIN_A_SCLK_POST_EN] = &aud_tdmin_a_sclk_post_en.hw, 882 - [AUD_CLKID_TDMIN_B_SCLK_POST_EN] = &aud_tdmin_b_sclk_post_en.hw, 883 - [AUD_CLKID_TDMIN_C_SCLK_POST_EN] = &aud_tdmin_c_sclk_post_en.hw, 884 - [AUD_CLKID_TDMIN_LB_SCLK_POST_EN] = &aud_tdmin_lb_sclk_post_en.hw, 885 - [AUD_CLKID_TDMOUT_A_SCLK_POST_EN] = &aud_tdmout_a_sclk_post_en.hw, 886 - [AUD_CLKID_TDMOUT_B_SCLK_POST_EN] = &aud_tdmout_b_sclk_post_en.hw, 887 - [AUD_CLKID_TDMOUT_C_SCLK_POST_EN] = &aud_tdmout_c_sclk_post_en.hw, 888 - [AUD_CLKID_TDMIN_A_SCLK] = &aud_tdmin_a_sclk.hw, 889 - [AUD_CLKID_TDMIN_B_SCLK] = &aud_tdmin_b_sclk.hw, 890 - [AUD_CLKID_TDMIN_C_SCLK] = &aud_tdmin_c_sclk.hw, 891 - [AUD_CLKID_TDMIN_LB_SCLK] = &aud_tdmin_lb_sclk.hw, 892 - [AUD_CLKID_TDMOUT_A_SCLK] = &aud_tdmout_a_sclk.hw, 893 - [AUD_CLKID_TDMOUT_B_SCLK] = &aud_tdmout_b_sclk.hw, 894 - [AUD_CLKID_TDMOUT_C_SCLK] = &aud_tdmout_c_sclk.hw, 895 - [AUD_CLKID_TDMIN_A_LRCLK] = &aud_tdmin_a_lrclk.hw, 896 - [AUD_CLKID_TDMIN_B_LRCLK] = &aud_tdmin_b_lrclk.hw, 897 - [AUD_CLKID_TDMIN_C_LRCLK] = &aud_tdmin_c_lrclk.hw, 898 - [AUD_CLKID_TDMIN_LB_LRCLK] = &aud_tdmin_lb_lrclk.hw, 899 - [AUD_CLKID_TDMOUT_A_LRCLK] = &aud_tdmout_a_lrclk.hw, 900 - [AUD_CLKID_TDMOUT_B_LRCLK] = &aud_tdmout_b_lrclk.hw, 901 - [AUD_CLKID_TDMOUT_C_LRCLK] = &aud_tdmout_c_lrclk.hw, 480 + [AUD_CLKID_DDR_ARB] = &ddr_arb.hw, 481 + [AUD_CLKID_PDM] = &pdm.hw, 482 + [AUD_CLKID_TDMIN_A] = &tdmin_a.hw, 483 + [AUD_CLKID_TDMIN_B] = &tdmin_b.hw, 484 + [AUD_CLKID_TDMIN_C] = &tdmin_c.hw, 485 + [AUD_CLKID_TDMIN_LB] = &tdmin_lb.hw, 486 + [AUD_CLKID_TDMOUT_A] = &tdmout_a.hw, 487 + [AUD_CLKID_TDMOUT_B] = &tdmout_b.hw, 488 + [AUD_CLKID_TDMOUT_C] = &tdmout_c.hw, 489 + [AUD_CLKID_FRDDR_A] = &frddr_a.hw, 490 + [AUD_CLKID_FRDDR_B] = &frddr_b.hw, 491 + [AUD_CLKID_FRDDR_C] = &frddr_c.hw, 492 + [AUD_CLKID_TODDR_A] = &toddr_a.hw, 493 + [AUD_CLKID_TODDR_B] = &toddr_b.hw, 494 + [AUD_CLKID_TODDR_C] = &toddr_c.hw, 495 + [AUD_CLKID_LOOPBACK] = &loopback.hw, 496 + [AUD_CLKID_SPDIFIN] = &spdifin.hw, 497 + [AUD_CLKID_SPDIFOUT] = &spdifout.hw, 498 + [AUD_CLKID_RESAMPLE] = &resample.hw, 499 + [AUD_CLKID_POWER_DETECT] = &power_detect.hw, 500 + [AUD_CLKID_MST_A_MCLK_SEL] = &mst_a_mclk_sel.hw, 501 + [AUD_CLKID_MST_B_MCLK_SEL] = &mst_b_mclk_sel.hw, 502 + [AUD_CLKID_MST_C_MCLK_SEL] = &mst_c_mclk_sel.hw, 503 + [AUD_CLKID_MST_D_MCLK_SEL] = &mst_d_mclk_sel.hw, 504 + [AUD_CLKID_MST_E_MCLK_SEL] = &mst_e_mclk_sel.hw, 505 + [AUD_CLKID_MST_F_MCLK_SEL] = &mst_f_mclk_sel.hw, 506 + [AUD_CLKID_MST_A_MCLK_DIV] = &mst_a_mclk_div.hw, 507 + [AUD_CLKID_MST_B_MCLK_DIV] = &mst_b_mclk_div.hw, 508 + [AUD_CLKID_MST_C_MCLK_DIV] = &mst_c_mclk_div.hw, 509 + [AUD_CLKID_MST_D_MCLK_DIV] = &mst_d_mclk_div.hw, 510 + [AUD_CLKID_MST_E_MCLK_DIV] = &mst_e_mclk_div.hw, 511 + [AUD_CLKID_MST_F_MCLK_DIV] = &mst_f_mclk_div.hw, 512 + [AUD_CLKID_MST_A_MCLK] = &mst_a_mclk.hw, 513 + [AUD_CLKID_MST_B_MCLK] = &mst_b_mclk.hw, 514 + [AUD_CLKID_MST_C_MCLK] = &mst_c_mclk.hw, 515 + [AUD_CLKID_MST_D_MCLK] = &mst_d_mclk.hw, 516 + [AUD_CLKID_MST_E_MCLK] = &mst_e_mclk.hw, 517 + [AUD_CLKID_MST_F_MCLK] = &mst_f_mclk.hw, 518 + [AUD_CLKID_SPDIFOUT_CLK_SEL] = &spdifout_clk_sel.hw, 519 + [AUD_CLKID_SPDIFOUT_CLK_DIV] = &spdifout_clk_div.hw, 520 + [AUD_CLKID_SPDIFOUT_CLK] = &spdifout_clk.hw, 521 + [AUD_CLKID_SPDIFIN_CLK_SEL] = &spdifin_clk_sel.hw, 522 + [AUD_CLKID_SPDIFIN_CLK_DIV] = &spdifin_clk_div.hw, 523 + [AUD_CLKID_SPDIFIN_CLK] = &spdifin_clk.hw, 524 + [AUD_CLKID_PDM_DCLK_SEL] = &pdm_dclk_sel.hw, 525 + [AUD_CLKID_PDM_DCLK_DIV] = &pdm_dclk_div.hw, 526 + [AUD_CLKID_PDM_DCLK] = &pdm_dclk.hw, 527 + [AUD_CLKID_PDM_SYSCLK_SEL] = &pdm_sysclk_sel.hw, 528 + [AUD_CLKID_PDM_SYSCLK_DIV] = &pdm_sysclk_div.hw, 529 + [AUD_CLKID_PDM_SYSCLK] = &pdm_sysclk.hw, 530 + [AUD_CLKID_MST_A_SCLK_PRE_EN] = &mst_a_sclk_pre_en.hw, 531 + [AUD_CLKID_MST_B_SCLK_PRE_EN] = &mst_b_sclk_pre_en.hw, 532 + [AUD_CLKID_MST_C_SCLK_PRE_EN] = &mst_c_sclk_pre_en.hw, 533 + [AUD_CLKID_MST_D_SCLK_PRE_EN] = &mst_d_sclk_pre_en.hw, 534 + [AUD_CLKID_MST_E_SCLK_PRE_EN] = &mst_e_sclk_pre_en.hw, 535 + [AUD_CLKID_MST_F_SCLK_PRE_EN] = &mst_f_sclk_pre_en.hw, 536 + [AUD_CLKID_MST_A_SCLK_DIV] = &mst_a_sclk_div.hw, 537 + [AUD_CLKID_MST_B_SCLK_DIV] = &mst_b_sclk_div.hw, 538 + [AUD_CLKID_MST_C_SCLK_DIV] = &mst_c_sclk_div.hw, 539 + [AUD_CLKID_MST_D_SCLK_DIV] = &mst_d_sclk_div.hw, 540 + [AUD_CLKID_MST_E_SCLK_DIV] = &mst_e_sclk_div.hw, 541 + [AUD_CLKID_MST_F_SCLK_DIV] = &mst_f_sclk_div.hw, 542 + [AUD_CLKID_MST_A_SCLK_POST_EN] = &mst_a_sclk_post_en.hw, 543 + [AUD_CLKID_MST_B_SCLK_POST_EN] = &mst_b_sclk_post_en.hw, 544 + [AUD_CLKID_MST_C_SCLK_POST_EN] = &mst_c_sclk_post_en.hw, 545 + [AUD_CLKID_MST_D_SCLK_POST_EN] = &mst_d_sclk_post_en.hw, 546 + [AUD_CLKID_MST_E_SCLK_POST_EN] = &mst_e_sclk_post_en.hw, 547 + [AUD_CLKID_MST_F_SCLK_POST_EN] = &mst_f_sclk_post_en.hw, 548 + [AUD_CLKID_MST_A_SCLK] = &mst_a_sclk.hw, 549 + [AUD_CLKID_MST_B_SCLK] = &mst_b_sclk.hw, 550 + [AUD_CLKID_MST_C_SCLK] = &mst_c_sclk.hw, 551 + [AUD_CLKID_MST_D_SCLK] = &mst_d_sclk.hw, 552 + [AUD_CLKID_MST_E_SCLK] = &mst_e_sclk.hw, 553 + [AUD_CLKID_MST_F_SCLK] = &mst_f_sclk.hw, 554 + [AUD_CLKID_MST_A_LRCLK_DIV] = &mst_a_lrclk_div.hw, 555 + [AUD_CLKID_MST_B_LRCLK_DIV] = &mst_b_lrclk_div.hw, 556 + [AUD_CLKID_MST_C_LRCLK_DIV] = &mst_c_lrclk_div.hw, 557 + [AUD_CLKID_MST_D_LRCLK_DIV] = &mst_d_lrclk_div.hw, 558 + [AUD_CLKID_MST_E_LRCLK_DIV] = &mst_e_lrclk_div.hw, 559 + [AUD_CLKID_MST_F_LRCLK_DIV] = &mst_f_lrclk_div.hw, 560 + [AUD_CLKID_MST_A_LRCLK] = &mst_a_lrclk.hw, 561 + [AUD_CLKID_MST_B_LRCLK] = &mst_b_lrclk.hw, 562 + [AUD_CLKID_MST_C_LRCLK] = &mst_c_lrclk.hw, 563 + [AUD_CLKID_MST_D_LRCLK] = &mst_d_lrclk.hw, 564 + [AUD_CLKID_MST_E_LRCLK] = &mst_e_lrclk.hw, 565 + [AUD_CLKID_MST_F_LRCLK] = &mst_f_lrclk.hw, 566 + [AUD_CLKID_TDMIN_A_SCLK_SEL] = &tdmin_a_sclk_sel.hw, 567 + [AUD_CLKID_TDMIN_B_SCLK_SEL] = &tdmin_b_sclk_sel.hw, 568 + [AUD_CLKID_TDMIN_C_SCLK_SEL] = &tdmin_c_sclk_sel.hw, 569 + [AUD_CLKID_TDMIN_LB_SCLK_SEL] = &tdmin_lb_sclk_sel.hw, 570 + [AUD_CLKID_TDMOUT_A_SCLK_SEL] = &tdmout_a_sclk_sel.hw, 571 + [AUD_CLKID_TDMOUT_B_SCLK_SEL] = &tdmout_b_sclk_sel.hw, 572 + [AUD_CLKID_TDMOUT_C_SCLK_SEL] = &tdmout_c_sclk_sel.hw, 573 + [AUD_CLKID_TDMIN_A_SCLK_PRE_EN] = &tdmin_a_sclk_pre_en.hw, 574 + [AUD_CLKID_TDMIN_B_SCLK_PRE_EN] = &tdmin_b_sclk_pre_en.hw, 575 + [AUD_CLKID_TDMIN_C_SCLK_PRE_EN] = &tdmin_c_sclk_pre_en.hw, 576 + [AUD_CLKID_TDMIN_LB_SCLK_PRE_EN] = &tdmin_lb_sclk_pre_en.hw, 577 + [AUD_CLKID_TDMOUT_A_SCLK_PRE_EN] = &tdmout_a_sclk_pre_en.hw, 578 + [AUD_CLKID_TDMOUT_B_SCLK_PRE_EN] = &tdmout_b_sclk_pre_en.hw, 579 + [AUD_CLKID_TDMOUT_C_SCLK_PRE_EN] = &tdmout_c_sclk_pre_en.hw, 580 + [AUD_CLKID_TDMIN_A_SCLK_POST_EN] = &tdmin_a_sclk_post_en.hw, 581 + [AUD_CLKID_TDMIN_B_SCLK_POST_EN] = &tdmin_b_sclk_post_en.hw, 582 + [AUD_CLKID_TDMIN_C_SCLK_POST_EN] = &tdmin_c_sclk_post_en.hw, 583 + [AUD_CLKID_TDMIN_LB_SCLK_POST_EN] = &tdmin_lb_sclk_post_en.hw, 584 + [AUD_CLKID_TDMOUT_A_SCLK_POST_EN] = &tdmout_a_sclk_post_en.hw, 585 + [AUD_CLKID_TDMOUT_B_SCLK_POST_EN] = &tdmout_b_sclk_post_en.hw, 586 + [AUD_CLKID_TDMOUT_C_SCLK_POST_EN] = &tdmout_c_sclk_post_en.hw, 587 + [AUD_CLKID_TDMIN_A_SCLK] = &tdmin_a_sclk.hw, 588 + [AUD_CLKID_TDMIN_B_SCLK] = &tdmin_b_sclk.hw, 589 + [AUD_CLKID_TDMIN_C_SCLK] = &tdmin_c_sclk.hw, 590 + [AUD_CLKID_TDMIN_LB_SCLK] = &tdmin_lb_sclk.hw, 591 + [AUD_CLKID_TDMOUT_A_SCLK] = &tdmout_a_sclk.hw, 592 + [AUD_CLKID_TDMOUT_B_SCLK] = &tdmout_b_sclk.hw, 593 + [AUD_CLKID_TDMOUT_C_SCLK] = &tdmout_c_sclk.hw, 594 + [AUD_CLKID_TDMIN_A_LRCLK] = &tdmin_a_lrclk.hw, 595 + [AUD_CLKID_TDMIN_B_LRCLK] = &tdmin_b_lrclk.hw, 596 + [AUD_CLKID_TDMIN_C_LRCLK] = &tdmin_c_lrclk.hw, 597 + [AUD_CLKID_TDMIN_LB_LRCLK] = &tdmin_lb_lrclk.hw, 598 + [AUD_CLKID_TDMOUT_A_LRCLK] = &tdmout_a_lrclk.hw, 599 + [AUD_CLKID_TDMOUT_B_LRCLK] = &tdmout_b_lrclk.hw, 600 + [AUD_CLKID_TDMOUT_C_LRCLK] = &tdmout_c_lrclk.hw, 601 + [AUD_CLKID_TOP] = &axg_aud_top, 902 602 [NR_CLKS] = NULL, 903 603 }, 904 604 .num = NR_CLKS, ··· 911 609 */ 912 610 static struct clk_hw_onecell_data g12a_audio_hw_onecell_data = { 913 611 .hws = { 914 - [AUD_CLKID_DDR_ARB] = &aud_ddr_arb.hw, 915 - [AUD_CLKID_PDM] = &aud_pdm.hw, 916 - [AUD_CLKID_TDMIN_A] = &aud_tdmin_a.hw, 917 - [AUD_CLKID_TDMIN_B] = &aud_tdmin_b.hw, 918 - [AUD_CLKID_TDMIN_C] = &aud_tdmin_c.hw, 919 - [AUD_CLKID_TDMIN_LB] = &aud_tdmin_lb.hw, 920 - [AUD_CLKID_TDMOUT_A] = &aud_tdmout_a.hw, 921 - [AUD_CLKID_TDMOUT_B] = &aud_tdmout_b.hw, 922 - [AUD_CLKID_TDMOUT_C] = &aud_tdmout_c.hw, 923 - [AUD_CLKID_FRDDR_A] = &aud_frddr_a.hw, 924 - [AUD_CLKID_FRDDR_B] = &aud_frddr_b.hw, 925 - [AUD_CLKID_FRDDR_C] = &aud_frddr_c.hw, 926 - [AUD_CLKID_TODDR_A] = &aud_toddr_a.hw, 927 - [AUD_CLKID_TODDR_B] = &aud_toddr_b.hw, 928 - [AUD_CLKID_TODDR_C] = &aud_toddr_c.hw, 929 - [AUD_CLKID_LOOPBACK] = &aud_loopback.hw, 930 - [AUD_CLKID_SPDIFIN] = &aud_spdifin.hw, 931 - [AUD_CLKID_SPDIFOUT] = &aud_spdifout.hw, 932 - [AUD_CLKID_RESAMPLE] = &aud_resample.hw, 933 - [AUD_CLKID_POWER_DETECT] = &aud_power_detect.hw, 934 - [AUD_CLKID_SPDIFOUT_B] = &aud_spdifout_b.hw, 935 - [AUD_CLKID_MST_A_MCLK_SEL] = &aud_mst_a_mclk_sel.hw, 936 - [AUD_CLKID_MST_B_MCLK_SEL] = &aud_mst_b_mclk_sel.hw, 937 - [AUD_CLKID_MST_C_MCLK_SEL] = &aud_mst_c_mclk_sel.hw, 938 - [AUD_CLKID_MST_D_MCLK_SEL] = &aud_mst_d_mclk_sel.hw, 939 - [AUD_CLKID_MST_E_MCLK_SEL] = &aud_mst_e_mclk_sel.hw, 940 - [AUD_CLKID_MST_F_MCLK_SEL] = &aud_mst_f_mclk_sel.hw, 941 - [AUD_CLKID_MST_A_MCLK_DIV] = &aud_mst_a_mclk_div.hw, 942 - [AUD_CLKID_MST_B_MCLK_DIV] = &aud_mst_b_mclk_div.hw, 943 - [AUD_CLKID_MST_C_MCLK_DIV] = &aud_mst_c_mclk_div.hw, 944 - [AUD_CLKID_MST_D_MCLK_DIV] = &aud_mst_d_mclk_div.hw, 945 - [AUD_CLKID_MST_E_MCLK_DIV] = &aud_mst_e_mclk_div.hw, 946 - [AUD_CLKID_MST_F_MCLK_DIV] = &aud_mst_f_mclk_div.hw, 947 - [AUD_CLKID_MST_A_MCLK] = &aud_mst_a_mclk.hw, 948 - [AUD_CLKID_MST_B_MCLK] = &aud_mst_b_mclk.hw, 949 - [AUD_CLKID_MST_C_MCLK] = &aud_mst_c_mclk.hw, 950 - [AUD_CLKID_MST_D_MCLK] = &aud_mst_d_mclk.hw, 951 - [AUD_CLKID_MST_E_MCLK] = &aud_mst_e_mclk.hw, 952 - [AUD_CLKID_MST_F_MCLK] = &aud_mst_f_mclk.hw, 953 - [AUD_CLKID_SPDIFOUT_CLK_SEL] = &aud_spdifout_clk_sel.hw, 954 - [AUD_CLKID_SPDIFOUT_CLK_DIV] = &aud_spdifout_clk_div.hw, 955 - [AUD_CLKID_SPDIFOUT_CLK] = &aud_spdifout_clk.hw, 956 - [AUD_CLKID_SPDIFOUT_B_CLK_SEL] = &aud_spdifout_b_clk_sel.hw, 957 - [AUD_CLKID_SPDIFOUT_B_CLK_DIV] = &aud_spdifout_b_clk_div.hw, 958 - [AUD_CLKID_SPDIFOUT_B_CLK] = &aud_spdifout_b_clk.hw, 959 - [AUD_CLKID_SPDIFIN_CLK_SEL] = &aud_spdifin_clk_sel.hw, 960 - [AUD_CLKID_SPDIFIN_CLK_DIV] = &aud_spdifin_clk_div.hw, 961 - [AUD_CLKID_SPDIFIN_CLK] = &aud_spdifin_clk.hw, 962 - [AUD_CLKID_PDM_DCLK_SEL] = &aud_pdm_dclk_sel.hw, 963 - [AUD_CLKID_PDM_DCLK_DIV] = &aud_pdm_dclk_div.hw, 964 - [AUD_CLKID_PDM_DCLK] = &aud_pdm_dclk.hw, 965 - [AUD_CLKID_PDM_SYSCLK_SEL] = &aud_pdm_sysclk_sel.hw, 966 - [AUD_CLKID_PDM_SYSCLK_DIV] = &aud_pdm_sysclk_div.hw, 967 - [AUD_CLKID_PDM_SYSCLK] = &aud_pdm_sysclk.hw, 968 - [AUD_CLKID_MST_A_SCLK_PRE_EN] = &aud_mst_a_sclk_pre_en.hw, 969 - [AUD_CLKID_MST_B_SCLK_PRE_EN] = &aud_mst_b_sclk_pre_en.hw, 970 - [AUD_CLKID_MST_C_SCLK_PRE_EN] = &aud_mst_c_sclk_pre_en.hw, 971 - [AUD_CLKID_MST_D_SCLK_PRE_EN] = &aud_mst_d_sclk_pre_en.hw, 972 - [AUD_CLKID_MST_E_SCLK_PRE_EN] = &aud_mst_e_sclk_pre_en.hw, 973 - [AUD_CLKID_MST_F_SCLK_PRE_EN] = &aud_mst_f_sclk_pre_en.hw, 974 - [AUD_CLKID_MST_A_SCLK_DIV] = &aud_mst_a_sclk_div.hw, 975 - [AUD_CLKID_MST_B_SCLK_DIV] = &aud_mst_b_sclk_div.hw, 976 - [AUD_CLKID_MST_C_SCLK_DIV] = &aud_mst_c_sclk_div.hw, 977 - [AUD_CLKID_MST_D_SCLK_DIV] = &aud_mst_d_sclk_div.hw, 978 - [AUD_CLKID_MST_E_SCLK_DIV] = &aud_mst_e_sclk_div.hw, 979 - [AUD_CLKID_MST_F_SCLK_DIV] = &aud_mst_f_sclk_div.hw, 980 - [AUD_CLKID_MST_A_SCLK_POST_EN] = &aud_mst_a_sclk_post_en.hw, 981 - [AUD_CLKID_MST_B_SCLK_POST_EN] = &aud_mst_b_sclk_post_en.hw, 982 - [AUD_CLKID_MST_C_SCLK_POST_EN] = &aud_mst_c_sclk_post_en.hw, 983 - [AUD_CLKID_MST_D_SCLK_POST_EN] = &aud_mst_d_sclk_post_en.hw, 984 - [AUD_CLKID_MST_E_SCLK_POST_EN] = &aud_mst_e_sclk_post_en.hw, 985 - [AUD_CLKID_MST_F_SCLK_POST_EN] = &aud_mst_f_sclk_post_en.hw, 986 - [AUD_CLKID_MST_A_SCLK] = &aud_mst_a_sclk.hw, 987 - [AUD_CLKID_MST_B_SCLK] = &aud_mst_b_sclk.hw, 988 - [AUD_CLKID_MST_C_SCLK] = &aud_mst_c_sclk.hw, 989 - [AUD_CLKID_MST_D_SCLK] = &aud_mst_d_sclk.hw, 990 - [AUD_CLKID_MST_E_SCLK] = &aud_mst_e_sclk.hw, 991 - [AUD_CLKID_MST_F_SCLK] = &aud_mst_f_sclk.hw, 992 - [AUD_CLKID_MST_A_LRCLK_DIV] = &aud_mst_a_lrclk_div.hw, 993 - [AUD_CLKID_MST_B_LRCLK_DIV] = &aud_mst_b_lrclk_div.hw, 994 - [AUD_CLKID_MST_C_LRCLK_DIV] = &aud_mst_c_lrclk_div.hw, 995 - [AUD_CLKID_MST_D_LRCLK_DIV] = &aud_mst_d_lrclk_div.hw, 996 - [AUD_CLKID_MST_E_LRCLK_DIV] = &aud_mst_e_lrclk_div.hw, 997 - [AUD_CLKID_MST_F_LRCLK_DIV] = &aud_mst_f_lrclk_div.hw, 998 - [AUD_CLKID_MST_A_LRCLK] = &aud_mst_a_lrclk.hw, 999 - [AUD_CLKID_MST_B_LRCLK] = &aud_mst_b_lrclk.hw, 1000 - [AUD_CLKID_MST_C_LRCLK] = &aud_mst_c_lrclk.hw, 1001 - [AUD_CLKID_MST_D_LRCLK] = &aud_mst_d_lrclk.hw, 1002 - [AUD_CLKID_MST_E_LRCLK] = &aud_mst_e_lrclk.hw, 1003 - [AUD_CLKID_MST_F_LRCLK] = &aud_mst_f_lrclk.hw, 1004 - [AUD_CLKID_TDMIN_A_SCLK_SEL] = &aud_tdmin_a_sclk_sel.hw, 1005 - [AUD_CLKID_TDMIN_B_SCLK_SEL] = &aud_tdmin_b_sclk_sel.hw, 1006 - [AUD_CLKID_TDMIN_C_SCLK_SEL] = &aud_tdmin_c_sclk_sel.hw, 1007 - [AUD_CLKID_TDMIN_LB_SCLK_SEL] = &aud_tdmin_lb_sclk_sel.hw, 1008 - [AUD_CLKID_TDMOUT_A_SCLK_SEL] = &aud_tdmout_a_sclk_sel.hw, 1009 - [AUD_CLKID_TDMOUT_B_SCLK_SEL] = &aud_tdmout_b_sclk_sel.hw, 1010 - [AUD_CLKID_TDMOUT_C_SCLK_SEL] = &aud_tdmout_c_sclk_sel.hw, 1011 - [AUD_CLKID_TDMIN_A_SCLK_PRE_EN] = &aud_tdmin_a_sclk_pre_en.hw, 1012 - [AUD_CLKID_TDMIN_B_SCLK_PRE_EN] = &aud_tdmin_b_sclk_pre_en.hw, 1013 - [AUD_CLKID_TDMIN_C_SCLK_PRE_EN] = &aud_tdmin_c_sclk_pre_en.hw, 1014 - [AUD_CLKID_TDMIN_LB_SCLK_PRE_EN] = &aud_tdmin_lb_sclk_pre_en.hw, 1015 - [AUD_CLKID_TDMOUT_A_SCLK_PRE_EN] = &aud_tdmout_a_sclk_pre_en.hw, 1016 - [AUD_CLKID_TDMOUT_B_SCLK_PRE_EN] = &aud_tdmout_b_sclk_pre_en.hw, 1017 - [AUD_CLKID_TDMOUT_C_SCLK_PRE_EN] = &aud_tdmout_c_sclk_pre_en.hw, 1018 - [AUD_CLKID_TDMIN_A_SCLK_POST_EN] = &aud_tdmin_a_sclk_post_en.hw, 1019 - [AUD_CLKID_TDMIN_B_SCLK_POST_EN] = &aud_tdmin_b_sclk_post_en.hw, 1020 - [AUD_CLKID_TDMIN_C_SCLK_POST_EN] = &aud_tdmin_c_sclk_post_en.hw, 1021 - [AUD_CLKID_TDMIN_LB_SCLK_POST_EN] = &aud_tdmin_lb_sclk_post_en.hw, 1022 - [AUD_CLKID_TDMOUT_A_SCLK_POST_EN] = &aud_tdmout_a_sclk_post_en.hw, 1023 - [AUD_CLKID_TDMOUT_B_SCLK_POST_EN] = &aud_tdmout_b_sclk_post_en.hw, 1024 - [AUD_CLKID_TDMOUT_C_SCLK_POST_EN] = &aud_tdmout_c_sclk_post_en.hw, 1025 - [AUD_CLKID_TDMIN_A_SCLK] = &aud_tdmin_a_sclk.hw, 1026 - [AUD_CLKID_TDMIN_B_SCLK] = &aud_tdmin_b_sclk.hw, 1027 - [AUD_CLKID_TDMIN_C_SCLK] = &aud_tdmin_c_sclk.hw, 1028 - [AUD_CLKID_TDMIN_LB_SCLK] = &aud_tdmin_lb_sclk.hw, 1029 - [AUD_CLKID_TDMOUT_A_SCLK] = &aud_tdmout_a_sclk.hw, 1030 - [AUD_CLKID_TDMOUT_B_SCLK] = &aud_tdmout_b_sclk.hw, 1031 - [AUD_CLKID_TDMOUT_C_SCLK] = &aud_tdmout_c_sclk.hw, 1032 - [AUD_CLKID_TDMIN_A_LRCLK] = &aud_tdmin_a_lrclk.hw, 1033 - [AUD_CLKID_TDMIN_B_LRCLK] = &aud_tdmin_b_lrclk.hw, 1034 - [AUD_CLKID_TDMIN_C_LRCLK] = &aud_tdmin_c_lrclk.hw, 1035 - [AUD_CLKID_TDMIN_LB_LRCLK] = &aud_tdmin_lb_lrclk.hw, 1036 - [AUD_CLKID_TDMOUT_A_LRCLK] = &aud_tdmout_a_lrclk.hw, 1037 - [AUD_CLKID_TDMOUT_B_LRCLK] = &aud_tdmout_b_lrclk.hw, 1038 - [AUD_CLKID_TDMOUT_C_LRCLK] = &aud_tdmout_c_lrclk.hw, 1039 - [AUD_CLKID_TDM_MCLK_PAD0] = &aud_tdm_mclk_pad_0.hw, 1040 - [AUD_CLKID_TDM_MCLK_PAD1] = &aud_tdm_mclk_pad_1.hw, 1041 - [AUD_CLKID_TDM_LRCLK_PAD0] = &aud_tdm_lrclk_pad_0.hw, 1042 - [AUD_CLKID_TDM_LRCLK_PAD1] = &aud_tdm_lrclk_pad_1.hw, 1043 - [AUD_CLKID_TDM_LRCLK_PAD2] = &aud_tdm_lrclk_pad_2.hw, 1044 - [AUD_CLKID_TDM_SCLK_PAD0] = &aud_tdm_sclk_pad_0.hw, 1045 - [AUD_CLKID_TDM_SCLK_PAD1] = &aud_tdm_sclk_pad_1.hw, 1046 - [AUD_CLKID_TDM_SCLK_PAD2] = &aud_tdm_sclk_pad_2.hw, 612 + [AUD_CLKID_DDR_ARB] = &ddr_arb.hw, 613 + [AUD_CLKID_PDM] = &pdm.hw, 614 + [AUD_CLKID_TDMIN_A] = &tdmin_a.hw, 615 + [AUD_CLKID_TDMIN_B] = &tdmin_b.hw, 616 + [AUD_CLKID_TDMIN_C] = &tdmin_c.hw, 617 + [AUD_CLKID_TDMIN_LB] = &tdmin_lb.hw, 618 + [AUD_CLKID_TDMOUT_A] = &tdmout_a.hw, 619 + [AUD_CLKID_TDMOUT_B] = &tdmout_b.hw, 620 + [AUD_CLKID_TDMOUT_C] = &tdmout_c.hw, 621 + [AUD_CLKID_FRDDR_A] = &frddr_a.hw, 622 + [AUD_CLKID_FRDDR_B] = &frddr_b.hw, 623 + [AUD_CLKID_FRDDR_C] = &frddr_c.hw, 624 + [AUD_CLKID_TODDR_A] = &toddr_a.hw, 625 + [AUD_CLKID_TODDR_B] = &toddr_b.hw, 626 + [AUD_CLKID_TODDR_C] = &toddr_c.hw, 627 + [AUD_CLKID_LOOPBACK] = &loopback.hw, 628 + [AUD_CLKID_SPDIFIN] = &spdifin.hw, 629 + [AUD_CLKID_SPDIFOUT] = &spdifout.hw, 630 + [AUD_CLKID_RESAMPLE] = &resample.hw, 631 + [AUD_CLKID_POWER_DETECT] = &power_detect.hw, 632 + [AUD_CLKID_SPDIFOUT_B] = &spdifout_b.hw, 633 + [AUD_CLKID_MST_A_MCLK_SEL] = &mst_a_mclk_sel.hw, 634 + [AUD_CLKID_MST_B_MCLK_SEL] = &mst_b_mclk_sel.hw, 635 + [AUD_CLKID_MST_C_MCLK_SEL] = &mst_c_mclk_sel.hw, 636 + [AUD_CLKID_MST_D_MCLK_SEL] = &mst_d_mclk_sel.hw, 637 + [AUD_CLKID_MST_E_MCLK_SEL] = &mst_e_mclk_sel.hw, 638 + [AUD_CLKID_MST_F_MCLK_SEL] = &mst_f_mclk_sel.hw, 639 + [AUD_CLKID_MST_A_MCLK_DIV] = &mst_a_mclk_div.hw, 640 + [AUD_CLKID_MST_B_MCLK_DIV] = &mst_b_mclk_div.hw, 641 + [AUD_CLKID_MST_C_MCLK_DIV] = &mst_c_mclk_div.hw, 642 + [AUD_CLKID_MST_D_MCLK_DIV] = &mst_d_mclk_div.hw, 643 + [AUD_CLKID_MST_E_MCLK_DIV] = &mst_e_mclk_div.hw, 644 + [AUD_CLKID_MST_F_MCLK_DIV] = &mst_f_mclk_div.hw, 645 + [AUD_CLKID_MST_A_MCLK] = &mst_a_mclk.hw, 646 + [AUD_CLKID_MST_B_MCLK] = &mst_b_mclk.hw, 647 + [AUD_CLKID_MST_C_MCLK] = &mst_c_mclk.hw, 648 + [AUD_CLKID_MST_D_MCLK] = &mst_d_mclk.hw, 649 + [AUD_CLKID_MST_E_MCLK] = &mst_e_mclk.hw, 650 + [AUD_CLKID_MST_F_MCLK] = &mst_f_mclk.hw, 651 + [AUD_CLKID_SPDIFOUT_CLK_SEL] = &spdifout_clk_sel.hw, 652 + [AUD_CLKID_SPDIFOUT_CLK_DIV] = &spdifout_clk_div.hw, 653 + [AUD_CLKID_SPDIFOUT_CLK] = &spdifout_clk.hw, 654 + [AUD_CLKID_SPDIFOUT_B_CLK_SEL] = &spdifout_b_clk_sel.hw, 655 + [AUD_CLKID_SPDIFOUT_B_CLK_DIV] = &spdifout_b_clk_div.hw, 656 + [AUD_CLKID_SPDIFOUT_B_CLK] = &spdifout_b_clk.hw, 657 + [AUD_CLKID_SPDIFIN_CLK_SEL] = &spdifin_clk_sel.hw, 658 + [AUD_CLKID_SPDIFIN_CLK_DIV] = &spdifin_clk_div.hw, 659 + [AUD_CLKID_SPDIFIN_CLK] = &spdifin_clk.hw, 660 + [AUD_CLKID_PDM_DCLK_SEL] = &pdm_dclk_sel.hw, 661 + [AUD_CLKID_PDM_DCLK_DIV] = &pdm_dclk_div.hw, 662 + [AUD_CLKID_PDM_DCLK] = &pdm_dclk.hw, 663 + [AUD_CLKID_PDM_SYSCLK_SEL] = &pdm_sysclk_sel.hw, 664 + [AUD_CLKID_PDM_SYSCLK_DIV] = &pdm_sysclk_div.hw, 665 + [AUD_CLKID_PDM_SYSCLK] = &pdm_sysclk.hw, 666 + [AUD_CLKID_MST_A_SCLK_PRE_EN] = &mst_a_sclk_pre_en.hw, 667 + [AUD_CLKID_MST_B_SCLK_PRE_EN] = &mst_b_sclk_pre_en.hw, 668 + [AUD_CLKID_MST_C_SCLK_PRE_EN] = &mst_c_sclk_pre_en.hw, 669 + [AUD_CLKID_MST_D_SCLK_PRE_EN] = &mst_d_sclk_pre_en.hw, 670 + [AUD_CLKID_MST_E_SCLK_PRE_EN] = &mst_e_sclk_pre_en.hw, 671 + [AUD_CLKID_MST_F_SCLK_PRE_EN] = &mst_f_sclk_pre_en.hw, 672 + [AUD_CLKID_MST_A_SCLK_DIV] = &mst_a_sclk_div.hw, 673 + [AUD_CLKID_MST_B_SCLK_DIV] = &mst_b_sclk_div.hw, 674 + [AUD_CLKID_MST_C_SCLK_DIV] = &mst_c_sclk_div.hw, 675 + [AUD_CLKID_MST_D_SCLK_DIV] = &mst_d_sclk_div.hw, 676 + [AUD_CLKID_MST_E_SCLK_DIV] = &mst_e_sclk_div.hw, 677 + [AUD_CLKID_MST_F_SCLK_DIV] = &mst_f_sclk_div.hw, 678 + [AUD_CLKID_MST_A_SCLK_POST_EN] = &mst_a_sclk_post_en.hw, 679 + [AUD_CLKID_MST_B_SCLK_POST_EN] = &mst_b_sclk_post_en.hw, 680 + [AUD_CLKID_MST_C_SCLK_POST_EN] = &mst_c_sclk_post_en.hw, 681 + [AUD_CLKID_MST_D_SCLK_POST_EN] = &mst_d_sclk_post_en.hw, 682 + [AUD_CLKID_MST_E_SCLK_POST_EN] = &mst_e_sclk_post_en.hw, 683 + [AUD_CLKID_MST_F_SCLK_POST_EN] = &mst_f_sclk_post_en.hw, 684 + [AUD_CLKID_MST_A_SCLK] = &mst_a_sclk.hw, 685 + [AUD_CLKID_MST_B_SCLK] = &mst_b_sclk.hw, 686 + [AUD_CLKID_MST_C_SCLK] = &mst_c_sclk.hw, 687 + [AUD_CLKID_MST_D_SCLK] = &mst_d_sclk.hw, 688 + [AUD_CLKID_MST_E_SCLK] = &mst_e_sclk.hw, 689 + [AUD_CLKID_MST_F_SCLK] = &mst_f_sclk.hw, 690 + [AUD_CLKID_MST_A_LRCLK_DIV] = &mst_a_lrclk_div.hw, 691 + [AUD_CLKID_MST_B_LRCLK_DIV] = &mst_b_lrclk_div.hw, 692 + [AUD_CLKID_MST_C_LRCLK_DIV] = &mst_c_lrclk_div.hw, 693 + [AUD_CLKID_MST_D_LRCLK_DIV] = &mst_d_lrclk_div.hw, 694 + [AUD_CLKID_MST_E_LRCLK_DIV] = &mst_e_lrclk_div.hw, 695 + [AUD_CLKID_MST_F_LRCLK_DIV] = &mst_f_lrclk_div.hw, 696 + [AUD_CLKID_MST_A_LRCLK] = &mst_a_lrclk.hw, 697 + [AUD_CLKID_MST_B_LRCLK] = &mst_b_lrclk.hw, 698 + [AUD_CLKID_MST_C_LRCLK] = &mst_c_lrclk.hw, 699 + [AUD_CLKID_MST_D_LRCLK] = &mst_d_lrclk.hw, 700 + [AUD_CLKID_MST_E_LRCLK] = &mst_e_lrclk.hw, 701 + [AUD_CLKID_MST_F_LRCLK] = &mst_f_lrclk.hw, 702 + [AUD_CLKID_TDMIN_A_SCLK_SEL] = &tdmin_a_sclk_sel.hw, 703 + [AUD_CLKID_TDMIN_B_SCLK_SEL] = &tdmin_b_sclk_sel.hw, 704 + [AUD_CLKID_TDMIN_C_SCLK_SEL] = &tdmin_c_sclk_sel.hw, 705 + [AUD_CLKID_TDMIN_LB_SCLK_SEL] = &tdmin_lb_sclk_sel.hw, 706 + [AUD_CLKID_TDMOUT_A_SCLK_SEL] = &tdmout_a_sclk_sel.hw, 707 + [AUD_CLKID_TDMOUT_B_SCLK_SEL] = &tdmout_b_sclk_sel.hw, 708 + [AUD_CLKID_TDMOUT_C_SCLK_SEL] = &tdmout_c_sclk_sel.hw, 709 + [AUD_CLKID_TDMIN_A_SCLK_PRE_EN] = &tdmin_a_sclk_pre_en.hw, 710 + [AUD_CLKID_TDMIN_B_SCLK_PRE_EN] = &tdmin_b_sclk_pre_en.hw, 711 + [AUD_CLKID_TDMIN_C_SCLK_PRE_EN] = &tdmin_c_sclk_pre_en.hw, 712 + [AUD_CLKID_TDMIN_LB_SCLK_PRE_EN] = &tdmin_lb_sclk_pre_en.hw, 713 + [AUD_CLKID_TDMOUT_A_SCLK_PRE_EN] = &tdmout_a_sclk_pre_en.hw, 714 + [AUD_CLKID_TDMOUT_B_SCLK_PRE_EN] = &tdmout_b_sclk_pre_en.hw, 715 + [AUD_CLKID_TDMOUT_C_SCLK_PRE_EN] = &tdmout_c_sclk_pre_en.hw, 716 + [AUD_CLKID_TDMIN_A_SCLK_POST_EN] = &tdmin_a_sclk_post_en.hw, 717 + [AUD_CLKID_TDMIN_B_SCLK_POST_EN] = &tdmin_b_sclk_post_en.hw, 718 + [AUD_CLKID_TDMIN_C_SCLK_POST_EN] = &tdmin_c_sclk_post_en.hw, 719 + [AUD_CLKID_TDMIN_LB_SCLK_POST_EN] = &tdmin_lb_sclk_post_en.hw, 720 + [AUD_CLKID_TDMOUT_A_SCLK_POST_EN] = &tdmout_a_sclk_post_en.hw, 721 + [AUD_CLKID_TDMOUT_B_SCLK_POST_EN] = &tdmout_b_sclk_post_en.hw, 722 + [AUD_CLKID_TDMOUT_C_SCLK_POST_EN] = &tdmout_c_sclk_post_en.hw, 723 + [AUD_CLKID_TDMIN_A_SCLK] = &tdmin_a_sclk.hw, 724 + [AUD_CLKID_TDMIN_B_SCLK] = &tdmin_b_sclk.hw, 725 + [AUD_CLKID_TDMIN_C_SCLK] = &tdmin_c_sclk.hw, 726 + [AUD_CLKID_TDMIN_LB_SCLK] = &tdmin_lb_sclk.hw, 727 + [AUD_CLKID_TDMOUT_A_SCLK] = &tdmout_a_sclk.hw, 728 + [AUD_CLKID_TDMOUT_B_SCLK] = &tdmout_b_sclk.hw, 729 + [AUD_CLKID_TDMOUT_C_SCLK] = &tdmout_c_sclk.hw, 730 + [AUD_CLKID_TDMIN_A_LRCLK] = &tdmin_a_lrclk.hw, 731 + [AUD_CLKID_TDMIN_B_LRCLK] = &tdmin_b_lrclk.hw, 732 + [AUD_CLKID_TDMIN_C_LRCLK] = &tdmin_c_lrclk.hw, 733 + [AUD_CLKID_TDMIN_LB_LRCLK] = &tdmin_lb_lrclk.hw, 734 + [AUD_CLKID_TDMOUT_A_LRCLK] = &tdmout_a_lrclk.hw, 735 + [AUD_CLKID_TDMOUT_B_LRCLK] = &tdmout_b_lrclk.hw, 736 + [AUD_CLKID_TDMOUT_C_LRCLK] = &tdmout_c_lrclk.hw, 737 + [AUD_CLKID_TDM_MCLK_PAD0] = &g12a_tdm_mclk_pad_0.hw, 738 + [AUD_CLKID_TDM_MCLK_PAD1] = &g12a_tdm_mclk_pad_1.hw, 739 + [AUD_CLKID_TDM_LRCLK_PAD0] = &g12a_tdm_lrclk_pad_0.hw, 740 + [AUD_CLKID_TDM_LRCLK_PAD1] = &g12a_tdm_lrclk_pad_1.hw, 741 + [AUD_CLKID_TDM_LRCLK_PAD2] = &g12a_tdm_lrclk_pad_2.hw, 742 + [AUD_CLKID_TDM_SCLK_PAD0] = &g12a_tdm_sclk_pad_0.hw, 743 + [AUD_CLKID_TDM_SCLK_PAD1] = &g12a_tdm_sclk_pad_1.hw, 744 + [AUD_CLKID_TDM_SCLK_PAD2] = &g12a_tdm_sclk_pad_2.hw, 745 + [AUD_CLKID_TOP] = &axg_aud_top, 1047 746 [NR_CLKS] = NULL, 1048 747 }, 1049 748 .num = NR_CLKS, 1050 749 }; 750 + 751 + /* 752 + * Array of all SM1 clocks provided by this provider 753 + * The input clocks of the controller will be populated at runtime 754 + */ 755 + static struct clk_hw_onecell_data sm1_audio_hw_onecell_data = { 756 + .hws = { 757 + [AUD_CLKID_DDR_ARB] = &ddr_arb.hw, 758 + [AUD_CLKID_PDM] = &pdm.hw, 759 + [AUD_CLKID_TDMIN_A] = &tdmin_a.hw, 760 + [AUD_CLKID_TDMIN_B] = &tdmin_b.hw, 761 + [AUD_CLKID_TDMIN_C] = &tdmin_c.hw, 762 + [AUD_CLKID_TDMIN_LB] = &tdmin_lb.hw, 763 + [AUD_CLKID_TDMOUT_A] = &tdmout_a.hw, 764 + [AUD_CLKID_TDMOUT_B] = &tdmout_b.hw, 765 + [AUD_CLKID_TDMOUT_C] = &tdmout_c.hw, 766 + [AUD_CLKID_FRDDR_A] = &frddr_a.hw, 767 + [AUD_CLKID_FRDDR_B] = &frddr_b.hw, 768 + [AUD_CLKID_FRDDR_C] = &frddr_c.hw, 769 + [AUD_CLKID_TODDR_A] = &toddr_a.hw, 770 + [AUD_CLKID_TODDR_B] = &toddr_b.hw, 771 + [AUD_CLKID_TODDR_C] = &toddr_c.hw, 772 + [AUD_CLKID_LOOPBACK] = &loopback.hw, 773 + [AUD_CLKID_SPDIFIN] = &spdifin.hw, 774 + [AUD_CLKID_SPDIFOUT] = &spdifout.hw, 775 + [AUD_CLKID_RESAMPLE] = &resample.hw, 776 + [AUD_CLKID_SPDIFOUT_B] = &spdifout_b.hw, 777 + [AUD_CLKID_MST_A_MCLK_SEL] = &sm1_mst_a_mclk_sel.hw, 778 + [AUD_CLKID_MST_B_MCLK_SEL] = &sm1_mst_b_mclk_sel.hw, 779 + [AUD_CLKID_MST_C_MCLK_SEL] = &sm1_mst_c_mclk_sel.hw, 780 + [AUD_CLKID_MST_D_MCLK_SEL] = &sm1_mst_d_mclk_sel.hw, 781 + [AUD_CLKID_MST_E_MCLK_SEL] = &sm1_mst_e_mclk_sel.hw, 782 + [AUD_CLKID_MST_F_MCLK_SEL] = &sm1_mst_f_mclk_sel.hw, 783 + [AUD_CLKID_MST_A_MCLK_DIV] = &sm1_mst_a_mclk_div.hw, 784 + [AUD_CLKID_MST_B_MCLK_DIV] = &sm1_mst_b_mclk_div.hw, 785 + [AUD_CLKID_MST_C_MCLK_DIV] = &sm1_mst_c_mclk_div.hw, 786 + [AUD_CLKID_MST_D_MCLK_DIV] = &sm1_mst_d_mclk_div.hw, 787 + [AUD_CLKID_MST_E_MCLK_DIV] = &sm1_mst_e_mclk_div.hw, 788 + [AUD_CLKID_MST_F_MCLK_DIV] = &sm1_mst_f_mclk_div.hw, 789 + [AUD_CLKID_MST_A_MCLK] = &sm1_mst_a_mclk.hw, 790 + [AUD_CLKID_MST_B_MCLK] = &sm1_mst_b_mclk.hw, 791 + [AUD_CLKID_MST_C_MCLK] = &sm1_mst_c_mclk.hw, 792 + [AUD_CLKID_MST_D_MCLK] = &sm1_mst_d_mclk.hw, 793 + [AUD_CLKID_MST_E_MCLK] = &sm1_mst_e_mclk.hw, 794 + [AUD_CLKID_MST_F_MCLK] = &sm1_mst_f_mclk.hw, 795 + [AUD_CLKID_SPDIFOUT_CLK_SEL] = &spdifout_clk_sel.hw, 796 + [AUD_CLKID_SPDIFOUT_CLK_DIV] = &spdifout_clk_div.hw, 797 + [AUD_CLKID_SPDIFOUT_CLK] = &spdifout_clk.hw, 798 + [AUD_CLKID_SPDIFOUT_B_CLK_SEL] = &spdifout_b_clk_sel.hw, 799 + [AUD_CLKID_SPDIFOUT_B_CLK_DIV] = &spdifout_b_clk_div.hw, 800 + [AUD_CLKID_SPDIFOUT_B_CLK] = &spdifout_b_clk.hw, 801 + [AUD_CLKID_SPDIFIN_CLK_SEL] = &spdifin_clk_sel.hw, 802 + [AUD_CLKID_SPDIFIN_CLK_DIV] = &spdifin_clk_div.hw, 803 + [AUD_CLKID_SPDIFIN_CLK] = &spdifin_clk.hw, 804 + [AUD_CLKID_PDM_DCLK_SEL] = &pdm_dclk_sel.hw, 805 + [AUD_CLKID_PDM_DCLK_DIV] = &pdm_dclk_div.hw, 806 + [AUD_CLKID_PDM_DCLK] = &pdm_dclk.hw, 807 + [AUD_CLKID_PDM_SYSCLK_SEL] = &pdm_sysclk_sel.hw, 808 + [AUD_CLKID_PDM_SYSCLK_DIV] = &pdm_sysclk_div.hw, 809 + [AUD_CLKID_PDM_SYSCLK] = &pdm_sysclk.hw, 810 + [AUD_CLKID_MST_A_SCLK_PRE_EN] = &mst_a_sclk_pre_en.hw, 811 + [AUD_CLKID_MST_B_SCLK_PRE_EN] = &mst_b_sclk_pre_en.hw, 812 + [AUD_CLKID_MST_C_SCLK_PRE_EN] = &mst_c_sclk_pre_en.hw, 813 + [AUD_CLKID_MST_D_SCLK_PRE_EN] = &mst_d_sclk_pre_en.hw, 814 + [AUD_CLKID_MST_E_SCLK_PRE_EN] = &mst_e_sclk_pre_en.hw, 815 + [AUD_CLKID_MST_F_SCLK_PRE_EN] = &mst_f_sclk_pre_en.hw, 816 + [AUD_CLKID_MST_A_SCLK_DIV] = &mst_a_sclk_div.hw, 817 + [AUD_CLKID_MST_B_SCLK_DIV] = &mst_b_sclk_div.hw, 818 + [AUD_CLKID_MST_C_SCLK_DIV] = &mst_c_sclk_div.hw, 819 + [AUD_CLKID_MST_D_SCLK_DIV] = &mst_d_sclk_div.hw, 820 + [AUD_CLKID_MST_E_SCLK_DIV] = &mst_e_sclk_div.hw, 821 + [AUD_CLKID_MST_F_SCLK_DIV] = &mst_f_sclk_div.hw, 822 + [AUD_CLKID_MST_A_SCLK_POST_EN] = &mst_a_sclk_post_en.hw, 823 + [AUD_CLKID_MST_B_SCLK_POST_EN] = &mst_b_sclk_post_en.hw, 824 + [AUD_CLKID_MST_C_SCLK_POST_EN] = &mst_c_sclk_post_en.hw, 825 + [AUD_CLKID_MST_D_SCLK_POST_EN] = &mst_d_sclk_post_en.hw, 826 + [AUD_CLKID_MST_E_SCLK_POST_EN] = &mst_e_sclk_post_en.hw, 827 + [AUD_CLKID_MST_F_SCLK_POST_EN] = &mst_f_sclk_post_en.hw, 828 + [AUD_CLKID_MST_A_SCLK] = &mst_a_sclk.hw, 829 + [AUD_CLKID_MST_B_SCLK] = &mst_b_sclk.hw, 830 + [AUD_CLKID_MST_C_SCLK] = &mst_c_sclk.hw, 831 + [AUD_CLKID_MST_D_SCLK] = &mst_d_sclk.hw, 832 + [AUD_CLKID_MST_E_SCLK] = &mst_e_sclk.hw, 833 + [AUD_CLKID_MST_F_SCLK] = &mst_f_sclk.hw, 834 + [AUD_CLKID_MST_A_LRCLK_DIV] = &mst_a_lrclk_div.hw, 835 + [AUD_CLKID_MST_B_LRCLK_DIV] = &mst_b_lrclk_div.hw, 836 + [AUD_CLKID_MST_C_LRCLK_DIV] = &mst_c_lrclk_div.hw, 837 + [AUD_CLKID_MST_D_LRCLK_DIV] = &mst_d_lrclk_div.hw, 838 + [AUD_CLKID_MST_E_LRCLK_DIV] = &mst_e_lrclk_div.hw, 839 + [AUD_CLKID_MST_F_LRCLK_DIV] = &mst_f_lrclk_div.hw, 840 + [AUD_CLKID_MST_A_LRCLK] = &mst_a_lrclk.hw, 841 + [AUD_CLKID_MST_B_LRCLK] = &mst_b_lrclk.hw, 842 + [AUD_CLKID_MST_C_LRCLK] = &mst_c_lrclk.hw, 843 + [AUD_CLKID_MST_D_LRCLK] = &mst_d_lrclk.hw, 844 + [AUD_CLKID_MST_E_LRCLK] = &mst_e_lrclk.hw, 845 + [AUD_CLKID_MST_F_LRCLK] = &mst_f_lrclk.hw, 846 + [AUD_CLKID_TDMIN_A_SCLK_SEL] = &tdmin_a_sclk_sel.hw, 847 + [AUD_CLKID_TDMIN_B_SCLK_SEL] = &tdmin_b_sclk_sel.hw, 848 + [AUD_CLKID_TDMIN_C_SCLK_SEL] = &tdmin_c_sclk_sel.hw, 849 + [AUD_CLKID_TDMIN_LB_SCLK_SEL] = &tdmin_lb_sclk_sel.hw, 850 + [AUD_CLKID_TDMOUT_A_SCLK_SEL] = &tdmout_a_sclk_sel.hw, 851 + [AUD_CLKID_TDMOUT_B_SCLK_SEL] = &tdmout_b_sclk_sel.hw, 852 + [AUD_CLKID_TDMOUT_C_SCLK_SEL] = &tdmout_c_sclk_sel.hw, 853 + [AUD_CLKID_TDMIN_A_SCLK_PRE_EN] = &tdmin_a_sclk_pre_en.hw, 854 + [AUD_CLKID_TDMIN_B_SCLK_PRE_EN] = &tdmin_b_sclk_pre_en.hw, 855 + [AUD_CLKID_TDMIN_C_SCLK_PRE_EN] = &tdmin_c_sclk_pre_en.hw, 856 + [AUD_CLKID_TDMIN_LB_SCLK_PRE_EN] = &tdmin_lb_sclk_pre_en.hw, 857 + [AUD_CLKID_TDMOUT_A_SCLK_PRE_EN] = &tdmout_a_sclk_pre_en.hw, 858 + [AUD_CLKID_TDMOUT_B_SCLK_PRE_EN] = &tdmout_b_sclk_pre_en.hw, 859 + [AUD_CLKID_TDMOUT_C_SCLK_PRE_EN] = &tdmout_c_sclk_pre_en.hw, 860 + [AUD_CLKID_TDMIN_A_SCLK_POST_EN] = &tdmin_a_sclk_post_en.hw, 861 + [AUD_CLKID_TDMIN_B_SCLK_POST_EN] = &tdmin_b_sclk_post_en.hw, 862 + [AUD_CLKID_TDMIN_C_SCLK_POST_EN] = &tdmin_c_sclk_post_en.hw, 863 + [AUD_CLKID_TDMIN_LB_SCLK_POST_EN] = &tdmin_lb_sclk_post_en.hw, 864 + [AUD_CLKID_TDMOUT_A_SCLK_POST_EN] = &tdmout_a_sclk_post_en.hw, 865 + [AUD_CLKID_TDMOUT_B_SCLK_POST_EN] = &tdmout_b_sclk_post_en.hw, 866 + [AUD_CLKID_TDMOUT_C_SCLK_POST_EN] = &tdmout_c_sclk_post_en.hw, 867 + [AUD_CLKID_TDMIN_A_SCLK] = &tdmin_a_sclk.hw, 868 + [AUD_CLKID_TDMIN_B_SCLK] = &tdmin_b_sclk.hw, 869 + [AUD_CLKID_TDMIN_C_SCLK] = &tdmin_c_sclk.hw, 870 + [AUD_CLKID_TDMIN_LB_SCLK] = &tdmin_lb_sclk.hw, 871 + [AUD_CLKID_TDMOUT_A_SCLK] = &tdmout_a_sclk.hw, 872 + [AUD_CLKID_TDMOUT_B_SCLK] = &tdmout_b_sclk.hw, 873 + [AUD_CLKID_TDMOUT_C_SCLK] = &tdmout_c_sclk.hw, 874 + [AUD_CLKID_TDMIN_A_LRCLK] = &tdmin_a_lrclk.hw, 875 + [AUD_CLKID_TDMIN_B_LRCLK] = &tdmin_b_lrclk.hw, 876 + [AUD_CLKID_TDMIN_C_LRCLK] = &tdmin_c_lrclk.hw, 877 + [AUD_CLKID_TDMIN_LB_LRCLK] = &tdmin_lb_lrclk.hw, 878 + [AUD_CLKID_TDMOUT_A_LRCLK] = &tdmout_a_lrclk.hw, 879 + [AUD_CLKID_TDMOUT_B_LRCLK] = &tdmout_b_lrclk.hw, 880 + [AUD_CLKID_TDMOUT_C_LRCLK] = &tdmout_c_lrclk.hw, 881 + [AUD_CLKID_TDM_MCLK_PAD0] = &sm1_tdm_mclk_pad_0.hw, 882 + [AUD_CLKID_TDM_MCLK_PAD1] = &sm1_tdm_mclk_pad_1.hw, 883 + [AUD_CLKID_TDM_LRCLK_PAD0] = &sm1_tdm_lrclk_pad_0.hw, 884 + [AUD_CLKID_TDM_LRCLK_PAD1] = &sm1_tdm_lrclk_pad_1.hw, 885 + [AUD_CLKID_TDM_LRCLK_PAD2] = &sm1_tdm_lrclk_pad_2.hw, 886 + [AUD_CLKID_TDM_SCLK_PAD0] = &sm1_tdm_sclk_pad_0.hw, 887 + [AUD_CLKID_TDM_SCLK_PAD1] = &sm1_tdm_sclk_pad_1.hw, 888 + [AUD_CLKID_TDM_SCLK_PAD2] = &sm1_tdm_sclk_pad_2.hw, 889 + [AUD_CLKID_TOP] = &sm1_aud_top.hw, 890 + [AUD_CLKID_TORAM] = &toram.hw, 891 + [AUD_CLKID_EQDRC] = &eqdrc.hw, 892 + [AUD_CLKID_RESAMPLE_B] = &resample_b.hw, 893 + [AUD_CLKID_TOVAD] = &tovad.hw, 894 + [AUD_CLKID_LOCKER] = &locker.hw, 895 + [AUD_CLKID_SPDIFIN_LB] = &spdifin_lb.hw, 896 + [AUD_CLKID_FRDDR_D] = &frddr_d.hw, 897 + [AUD_CLKID_TODDR_D] = &toddr_d.hw, 898 + [AUD_CLKID_LOOPBACK_B] = &loopback_b.hw, 899 + [AUD_CLKID_CLK81_EN] = &sm1_clk81_en.hw, 900 + [AUD_CLKID_SYSCLK_A_DIV] = &sm1_sysclk_a_div.hw, 901 + [AUD_CLKID_SYSCLK_A_EN] = &sm1_sysclk_a_en.hw, 902 + [AUD_CLKID_SYSCLK_B_DIV] = &sm1_sysclk_b_div.hw, 903 + [AUD_CLKID_SYSCLK_B_EN] = &sm1_sysclk_b_en.hw, 904 + [NR_CLKS] = NULL, 905 + }, 906 + .num = NR_CLKS, 907 + }; 908 + 1051 909 1052 910 /* Convenience table to populate regmap in .probe() 1053 911 * Note that this table is shared between both AXG and G12A, ··· 1215 753 * clocks are not declared within the AXG onecell table, we do not 1216 754 * feel the need to have separate AXG/G12A regmap tables. 1217 755 */ 1218 - static struct clk_regmap *const aud_clk_regmaps[] = { 1219 - &aud_ddr_arb, 1220 - &aud_pdm, 1221 - &aud_tdmin_a, 1222 - &aud_tdmin_b, 1223 - &aud_tdmin_c, 1224 - &aud_tdmin_lb, 1225 - &aud_tdmout_a, 1226 - &aud_tdmout_b, 1227 - &aud_tdmout_c, 1228 - &aud_frddr_a, 1229 - &aud_frddr_b, 1230 - &aud_frddr_c, 1231 - &aud_toddr_a, 1232 - &aud_toddr_b, 1233 - &aud_toddr_c, 1234 - &aud_loopback, 1235 - &aud_spdifin, 1236 - &aud_spdifout, 1237 - &aud_resample, 1238 - &aud_power_detect, 1239 - &aud_spdifout_b, 1240 - &aud_mst_a_mclk_sel, 1241 - &aud_mst_b_mclk_sel, 1242 - &aud_mst_c_mclk_sel, 1243 - &aud_mst_d_mclk_sel, 1244 - &aud_mst_e_mclk_sel, 1245 - &aud_mst_f_mclk_sel, 1246 - &aud_mst_a_mclk_div, 1247 - &aud_mst_b_mclk_div, 1248 - &aud_mst_c_mclk_div, 1249 - &aud_mst_d_mclk_div, 1250 - &aud_mst_e_mclk_div, 1251 - &aud_mst_f_mclk_div, 1252 - &aud_mst_a_mclk, 1253 - &aud_mst_b_mclk, 1254 - &aud_mst_c_mclk, 1255 - &aud_mst_d_mclk, 1256 - &aud_mst_e_mclk, 1257 - &aud_mst_f_mclk, 1258 - &aud_spdifout_clk_sel, 1259 - &aud_spdifout_clk_div, 1260 - &aud_spdifout_clk, 1261 - &aud_spdifin_clk_sel, 1262 - &aud_spdifin_clk_div, 1263 - &aud_spdifin_clk, 1264 - &aud_pdm_dclk_sel, 1265 - &aud_pdm_dclk_div, 1266 - &aud_pdm_dclk, 1267 - &aud_pdm_sysclk_sel, 1268 - &aud_pdm_sysclk_div, 1269 - &aud_pdm_sysclk, 1270 - &aud_mst_a_sclk_pre_en, 1271 - &aud_mst_b_sclk_pre_en, 1272 - &aud_mst_c_sclk_pre_en, 1273 - &aud_mst_d_sclk_pre_en, 1274 - &aud_mst_e_sclk_pre_en, 1275 - &aud_mst_f_sclk_pre_en, 1276 - &aud_mst_a_sclk_div, 1277 - &aud_mst_b_sclk_div, 1278 - &aud_mst_c_sclk_div, 1279 - &aud_mst_d_sclk_div, 1280 - &aud_mst_e_sclk_div, 1281 - &aud_mst_f_sclk_div, 1282 - &aud_mst_a_sclk_post_en, 1283 - &aud_mst_b_sclk_post_en, 1284 - &aud_mst_c_sclk_post_en, 1285 - &aud_mst_d_sclk_post_en, 1286 - &aud_mst_e_sclk_post_en, 1287 - &aud_mst_f_sclk_post_en, 1288 - &aud_mst_a_sclk, 1289 - &aud_mst_b_sclk, 1290 - &aud_mst_c_sclk, 1291 - &aud_mst_d_sclk, 1292 - &aud_mst_e_sclk, 1293 - &aud_mst_f_sclk, 1294 - &aud_mst_a_lrclk_div, 1295 - &aud_mst_b_lrclk_div, 1296 - &aud_mst_c_lrclk_div, 1297 - &aud_mst_d_lrclk_div, 1298 - &aud_mst_e_lrclk_div, 1299 - &aud_mst_f_lrclk_div, 1300 - &aud_mst_a_lrclk, 1301 - &aud_mst_b_lrclk, 1302 - &aud_mst_c_lrclk, 1303 - &aud_mst_d_lrclk, 1304 - &aud_mst_e_lrclk, 1305 - &aud_mst_f_lrclk, 1306 - &aud_tdmin_a_sclk_sel, 1307 - &aud_tdmin_b_sclk_sel, 1308 - &aud_tdmin_c_sclk_sel, 1309 - &aud_tdmin_lb_sclk_sel, 1310 - &aud_tdmout_a_sclk_sel, 1311 - &aud_tdmout_b_sclk_sel, 1312 - &aud_tdmout_c_sclk_sel, 1313 - &aud_tdmin_a_sclk_pre_en, 1314 - &aud_tdmin_b_sclk_pre_en, 1315 - &aud_tdmin_c_sclk_pre_en, 1316 - &aud_tdmin_lb_sclk_pre_en, 1317 - &aud_tdmout_a_sclk_pre_en, 1318 - &aud_tdmout_b_sclk_pre_en, 1319 - &aud_tdmout_c_sclk_pre_en, 1320 - &aud_tdmin_a_sclk_post_en, 1321 - &aud_tdmin_b_sclk_post_en, 1322 - &aud_tdmin_c_sclk_post_en, 1323 - &aud_tdmin_lb_sclk_post_en, 1324 - &aud_tdmout_a_sclk_post_en, 1325 - &aud_tdmout_b_sclk_post_en, 1326 - &aud_tdmout_c_sclk_post_en, 1327 - &aud_tdmin_a_sclk, 1328 - &aud_tdmin_b_sclk, 1329 - &aud_tdmin_c_sclk, 1330 - &aud_tdmin_lb_sclk, 1331 - &aud_tdmout_a_sclk, 1332 - &aud_tdmout_b_sclk, 1333 - &aud_tdmout_c_sclk, 1334 - &aud_tdmin_a_lrclk, 1335 - &aud_tdmin_b_lrclk, 1336 - &aud_tdmin_c_lrclk, 1337 - &aud_tdmin_lb_lrclk, 1338 - &aud_tdmout_a_lrclk, 1339 - &aud_tdmout_b_lrclk, 1340 - &aud_tdmout_c_lrclk, 1341 - &aud_spdifout_b_clk_sel, 1342 - &aud_spdifout_b_clk_div, 1343 - &aud_spdifout_b_clk, 1344 - &aud_tdm_mclk_pad_0, 1345 - &aud_tdm_mclk_pad_1, 1346 - &aud_tdm_lrclk_pad_0, 1347 - &aud_tdm_lrclk_pad_1, 1348 - &aud_tdm_lrclk_pad_2, 1349 - &aud_tdm_sclk_pad_0, 1350 - &aud_tdm_sclk_pad_1, 1351 - &aud_tdm_sclk_pad_2, 756 + static struct clk_regmap *const axg_clk_regmaps[] = { 757 + &ddr_arb, 758 + &pdm, 759 + &tdmin_a, 760 + &tdmin_b, 761 + &tdmin_c, 762 + &tdmin_lb, 763 + &tdmout_a, 764 + &tdmout_b, 765 + &tdmout_c, 766 + &frddr_a, 767 + &frddr_b, 768 + &frddr_c, 769 + &toddr_a, 770 + &toddr_b, 771 + &toddr_c, 772 + &loopback, 773 + &spdifin, 774 + &spdifout, 775 + &resample, 776 + &power_detect, 777 + &spdifout_b, 778 + &mst_a_mclk_sel, 779 + &mst_b_mclk_sel, 780 + &mst_c_mclk_sel, 781 + &mst_d_mclk_sel, 782 + &mst_e_mclk_sel, 783 + &mst_f_mclk_sel, 784 + &mst_a_mclk_div, 785 + &mst_b_mclk_div, 786 + &mst_c_mclk_div, 787 + &mst_d_mclk_div, 788 + &mst_e_mclk_div, 789 + &mst_f_mclk_div, 790 + &mst_a_mclk, 791 + &mst_b_mclk, 792 + &mst_c_mclk, 793 + &mst_d_mclk, 794 + &mst_e_mclk, 795 + &mst_f_mclk, 796 + &spdifout_clk_sel, 797 + &spdifout_clk_div, 798 + &spdifout_clk, 799 + &spdifin_clk_sel, 800 + &spdifin_clk_div, 801 + &spdifin_clk, 802 + &pdm_dclk_sel, 803 + &pdm_dclk_div, 804 + &pdm_dclk, 805 + &pdm_sysclk_sel, 806 + &pdm_sysclk_div, 807 + &pdm_sysclk, 808 + &mst_a_sclk_pre_en, 809 + &mst_b_sclk_pre_en, 810 + &mst_c_sclk_pre_en, 811 + &mst_d_sclk_pre_en, 812 + &mst_e_sclk_pre_en, 813 + &mst_f_sclk_pre_en, 814 + &mst_a_sclk_div, 815 + &mst_b_sclk_div, 816 + &mst_c_sclk_div, 817 + &mst_d_sclk_div, 818 + &mst_e_sclk_div, 819 + &mst_f_sclk_div, 820 + &mst_a_sclk_post_en, 821 + &mst_b_sclk_post_en, 822 + &mst_c_sclk_post_en, 823 + &mst_d_sclk_post_en, 824 + &mst_e_sclk_post_en, 825 + &mst_f_sclk_post_en, 826 + &mst_a_sclk, 827 + &mst_b_sclk, 828 + &mst_c_sclk, 829 + &mst_d_sclk, 830 + &mst_e_sclk, 831 + &mst_f_sclk, 832 + &mst_a_lrclk_div, 833 + &mst_b_lrclk_div, 834 + &mst_c_lrclk_div, 835 + &mst_d_lrclk_div, 836 + &mst_e_lrclk_div, 837 + &mst_f_lrclk_div, 838 + &mst_a_lrclk, 839 + &mst_b_lrclk, 840 + &mst_c_lrclk, 841 + &mst_d_lrclk, 842 + &mst_e_lrclk, 843 + &mst_f_lrclk, 844 + &tdmin_a_sclk_sel, 845 + &tdmin_b_sclk_sel, 846 + &tdmin_c_sclk_sel, 847 + &tdmin_lb_sclk_sel, 848 + &tdmout_a_sclk_sel, 849 + &tdmout_b_sclk_sel, 850 + &tdmout_c_sclk_sel, 851 + &tdmin_a_sclk_pre_en, 852 + &tdmin_b_sclk_pre_en, 853 + &tdmin_c_sclk_pre_en, 854 + &tdmin_lb_sclk_pre_en, 855 + &tdmout_a_sclk_pre_en, 856 + &tdmout_b_sclk_pre_en, 857 + &tdmout_c_sclk_pre_en, 858 + &tdmin_a_sclk_post_en, 859 + &tdmin_b_sclk_post_en, 860 + &tdmin_c_sclk_post_en, 861 + &tdmin_lb_sclk_post_en, 862 + &tdmout_a_sclk_post_en, 863 + &tdmout_b_sclk_post_en, 864 + &tdmout_c_sclk_post_en, 865 + &tdmin_a_sclk, 866 + &tdmin_b_sclk, 867 + &tdmin_c_sclk, 868 + &tdmin_lb_sclk, 869 + &tdmout_a_sclk, 870 + &tdmout_b_sclk, 871 + &tdmout_c_sclk, 872 + &tdmin_a_lrclk, 873 + &tdmin_b_lrclk, 874 + &tdmin_c_lrclk, 875 + &tdmin_lb_lrclk, 876 + &tdmout_a_lrclk, 877 + &tdmout_b_lrclk, 878 + &tdmout_c_lrclk, 879 + &spdifout_b_clk_sel, 880 + &spdifout_b_clk_div, 881 + &spdifout_b_clk, 882 + &g12a_tdm_mclk_pad_0, 883 + &g12a_tdm_mclk_pad_1, 884 + &g12a_tdm_lrclk_pad_0, 885 + &g12a_tdm_lrclk_pad_1, 886 + &g12a_tdm_lrclk_pad_2, 887 + &g12a_tdm_sclk_pad_0, 888 + &g12a_tdm_sclk_pad_1, 889 + &g12a_tdm_sclk_pad_2, 890 + &toram, 891 + &eqdrc, 892 + }; 893 + 894 + static struct clk_regmap *const sm1_clk_regmaps[] = { 895 + &ddr_arb, 896 + &pdm, 897 + &tdmin_a, 898 + &tdmin_b, 899 + &tdmin_c, 900 + &tdmin_lb, 901 + &tdmout_a, 902 + &tdmout_b, 903 + &tdmout_c, 904 + &frddr_a, 905 + &frddr_b, 906 + &frddr_c, 907 + &toddr_a, 908 + &toddr_b, 909 + &toddr_c, 910 + &loopback, 911 + &spdifin, 912 + &spdifout, 913 + &resample, 914 + &spdifout_b, 915 + &sm1_mst_a_mclk_sel, 916 + &sm1_mst_b_mclk_sel, 917 + &sm1_mst_c_mclk_sel, 918 + &sm1_mst_d_mclk_sel, 919 + &sm1_mst_e_mclk_sel, 920 + &sm1_mst_f_mclk_sel, 921 + &sm1_mst_a_mclk_div, 922 + &sm1_mst_b_mclk_div, 923 + &sm1_mst_c_mclk_div, 924 + &sm1_mst_d_mclk_div, 925 + &sm1_mst_e_mclk_div, 926 + &sm1_mst_f_mclk_div, 927 + &sm1_mst_a_mclk, 928 + &sm1_mst_b_mclk, 929 + &sm1_mst_c_mclk, 930 + &sm1_mst_d_mclk, 931 + &sm1_mst_e_mclk, 932 + &sm1_mst_f_mclk, 933 + &spdifout_clk_sel, 934 + &spdifout_clk_div, 935 + &spdifout_clk, 936 + &spdifin_clk_sel, 937 + &spdifin_clk_div, 938 + &spdifin_clk, 939 + &pdm_dclk_sel, 940 + &pdm_dclk_div, 941 + &pdm_dclk, 942 + &pdm_sysclk_sel, 943 + &pdm_sysclk_div, 944 + &pdm_sysclk, 945 + &mst_a_sclk_pre_en, 946 + &mst_b_sclk_pre_en, 947 + &mst_c_sclk_pre_en, 948 + &mst_d_sclk_pre_en, 949 + &mst_e_sclk_pre_en, 950 + &mst_f_sclk_pre_en, 951 + &mst_a_sclk_div, 952 + &mst_b_sclk_div, 953 + &mst_c_sclk_div, 954 + &mst_d_sclk_div, 955 + &mst_e_sclk_div, 956 + &mst_f_sclk_div, 957 + &mst_a_sclk_post_en, 958 + &mst_b_sclk_post_en, 959 + &mst_c_sclk_post_en, 960 + &mst_d_sclk_post_en, 961 + &mst_e_sclk_post_en, 962 + &mst_f_sclk_post_en, 963 + &mst_a_sclk, 964 + &mst_b_sclk, 965 + &mst_c_sclk, 966 + &mst_d_sclk, 967 + &mst_e_sclk, 968 + &mst_f_sclk, 969 + &mst_a_lrclk_div, 970 + &mst_b_lrclk_div, 971 + &mst_c_lrclk_div, 972 + &mst_d_lrclk_div, 973 + &mst_e_lrclk_div, 974 + &mst_f_lrclk_div, 975 + &mst_a_lrclk, 976 + &mst_b_lrclk, 977 + &mst_c_lrclk, 978 + &mst_d_lrclk, 979 + &mst_e_lrclk, 980 + &mst_f_lrclk, 981 + &tdmin_a_sclk_sel, 982 + &tdmin_b_sclk_sel, 983 + &tdmin_c_sclk_sel, 984 + &tdmin_lb_sclk_sel, 985 + &tdmout_a_sclk_sel, 986 + &tdmout_b_sclk_sel, 987 + &tdmout_c_sclk_sel, 988 + &tdmin_a_sclk_pre_en, 989 + &tdmin_b_sclk_pre_en, 990 + &tdmin_c_sclk_pre_en, 991 + &tdmin_lb_sclk_pre_en, 992 + &tdmout_a_sclk_pre_en, 993 + &tdmout_b_sclk_pre_en, 994 + &tdmout_c_sclk_pre_en, 995 + &tdmin_a_sclk_post_en, 996 + &tdmin_b_sclk_post_en, 997 + &tdmin_c_sclk_post_en, 998 + &tdmin_lb_sclk_post_en, 999 + &tdmout_a_sclk_post_en, 1000 + &tdmout_b_sclk_post_en, 1001 + &tdmout_c_sclk_post_en, 1002 + &tdmin_a_sclk, 1003 + &tdmin_b_sclk, 1004 + &tdmin_c_sclk, 1005 + &tdmin_lb_sclk, 1006 + &tdmout_a_sclk, 1007 + &tdmout_b_sclk, 1008 + &tdmout_c_sclk, 1009 + &tdmin_a_lrclk, 1010 + &tdmin_b_lrclk, 1011 + &tdmin_c_lrclk, 1012 + &tdmin_lb_lrclk, 1013 + &tdmout_a_lrclk, 1014 + &tdmout_b_lrclk, 1015 + &tdmout_c_lrclk, 1016 + &spdifout_b_clk_sel, 1017 + &spdifout_b_clk_div, 1018 + &spdifout_b_clk, 1019 + &sm1_tdm_mclk_pad_0, 1020 + &sm1_tdm_mclk_pad_1, 1021 + &sm1_tdm_lrclk_pad_0, 1022 + &sm1_tdm_lrclk_pad_1, 1023 + &sm1_tdm_lrclk_pad_2, 1024 + &sm1_tdm_sclk_pad_0, 1025 + &sm1_tdm_sclk_pad_1, 1026 + &sm1_tdm_sclk_pad_2, 1027 + &sm1_aud_top, 1028 + &toram, 1029 + &eqdrc, 1030 + &resample_b, 1031 + &tovad, 1032 + &locker, 1033 + &spdifin_lb, 1034 + &frddr_d, 1035 + &toddr_d, 1036 + &loopback_b, 1037 + &sm1_clk81_en, 1038 + &sm1_sysclk_a_div, 1039 + &sm1_sysclk_a_en, 1040 + &sm1_sysclk_b_div, 1041 + &sm1_sysclk_b_en, 1352 1042 }; 1353 1043 1354 1044 static int devm_clk_get_enable(struct device *dev, char *id) ··· 1615 1001 .reg_bits = 32, 1616 1002 .val_bits = 32, 1617 1003 .reg_stride = 4, 1618 - .max_register = AUDIO_CLK_PDMIN_CTRL1, 1004 + .max_register = AUDIO_CLK_SPDIFOUT_B_CTRL, 1619 1005 }; 1620 1006 1621 1007 struct audioclk_data { 1008 + struct clk_regmap *const *regmap_clks; 1009 + unsigned int regmap_clk_num; 1622 1010 struct clk_hw_onecell_data *hw_onecell_data; 1623 1011 unsigned int reset_offset; 1624 1012 unsigned int reset_num; ··· 1632 1016 const struct audioclk_data *data; 1633 1017 struct axg_audio_reset_data *rst; 1634 1018 struct regmap *map; 1635 - struct resource *res; 1636 1019 void __iomem *regs; 1637 1020 struct clk_hw *hw; 1638 1021 int ret, i; ··· 1640 1025 if (!data) 1641 1026 return -EINVAL; 1642 1027 1643 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1644 - regs = devm_ioremap_resource(dev, res); 1028 + regs = devm_platform_ioremap_resource(pdev, 0); 1645 1029 if (IS_ERR(regs)) 1646 1030 return PTR_ERR(regs); 1647 1031 ··· 1662 1048 } 1663 1049 1664 1050 /* Populate regmap for the regmap backed clocks */ 1665 - for (i = 0; i < ARRAY_SIZE(aud_clk_regmaps); i++) 1666 - aud_clk_regmaps[i]->map = map; 1051 + for (i = 0; i < data->regmap_clk_num; i++) 1052 + data->regmap_clks[i]->map = map; 1667 1053 1668 1054 /* Take care to skip the registered input clocks */ 1669 1055 for (i = AUD_CLKID_DDR_ARB; i < data->hw_onecell_data->num; i++) { ··· 1707 1093 } 1708 1094 1709 1095 static const struct audioclk_data axg_audioclk_data = { 1096 + .regmap_clks = axg_clk_regmaps, 1097 + .regmap_clk_num = ARRAY_SIZE(axg_clk_regmaps), 1710 1098 .hw_onecell_data = &axg_audio_hw_onecell_data, 1711 1099 }; 1712 1100 1713 1101 static const struct audioclk_data g12a_audioclk_data = { 1102 + .regmap_clks = axg_clk_regmaps, 1103 + .regmap_clk_num = ARRAY_SIZE(axg_clk_regmaps), 1714 1104 .hw_onecell_data = &g12a_audio_hw_onecell_data, 1715 1105 .reset_offset = AUDIO_SW_RESET, 1716 1106 .reset_num = 26, 1107 + }; 1108 + 1109 + static const struct audioclk_data sm1_audioclk_data = { 1110 + .regmap_clks = sm1_clk_regmaps, 1111 + .regmap_clk_num = ARRAY_SIZE(sm1_clk_regmaps), 1112 + .hw_onecell_data = &sm1_audio_hw_onecell_data, 1113 + .reset_offset = AUDIO_SM1_SW_RESET0, 1114 + .reset_num = 39, 1717 1115 }; 1718 1116 1719 1117 static const struct of_device_id clkc_match_table[] = { ··· 1735 1109 }, { 1736 1110 .compatible = "amlogic,g12a-audio-clkc", 1737 1111 .data = &g12a_audioclk_data 1112 + }, { 1113 + .compatible = "amlogic,sm1-audio-clkc", 1114 + .data = &sm1_audioclk_data 1738 1115 }, {} 1739 1116 }; 1740 1117 MODULE_DEVICE_TABLE(of, clkc_match_table); ··· 1751 1122 }; 1752 1123 module_platform_driver(axg_audio_driver); 1753 1124 1754 - MODULE_DESCRIPTION("Amlogic AXG/G12A Audio Clock driver"); 1125 + MODULE_DESCRIPTION("Amlogic AXG/G12A/SM1 Audio Clock driver"); 1755 1126 MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>"); 1756 1127 MODULE_LICENSE("GPL v2");
+20 -1
drivers/clk/meson/axg-audio.h
··· 50 50 #define AUDIO_CLK_PDMIN_CTRL1 0x0B0 51 51 #define AUDIO_CLK_SPDIFOUT_B_CTRL 0x0B4 52 52 53 + /* SM1 introduce new register and some shifts :( */ 54 + #define AUDIO_CLK_GATE_EN1 0x004 55 + #define AUDIO_SM1_MCLK_A_CTRL 0x008 56 + #define AUDIO_SM1_MCLK_B_CTRL 0x00C 57 + #define AUDIO_SM1_MCLK_C_CTRL 0x010 58 + #define AUDIO_SM1_MCLK_D_CTRL 0x014 59 + #define AUDIO_SM1_MCLK_E_CTRL 0x018 60 + #define AUDIO_SM1_MCLK_F_CTRL 0x01C 61 + #define AUDIO_SM1_MST_PAD_CTRL0 0x020 62 + #define AUDIO_SM1_MST_PAD_CTRL1 0x024 63 + #define AUDIO_SM1_SW_RESET0 0x028 64 + #define AUDIO_SM1_SW_RESET1 0x02C 65 + #define AUDIO_CLK81_CTRL 0x030 66 + #define AUDIO_CLK81_EN 0x034 53 67 /* 54 68 * CLKID index values 55 69 * These indices are entirely contrived and do not map onto the hardware. ··· 129 115 #define AUD_CLKID_TDMOUT_C_SCLK_POST_EN 150 130 116 #define AUD_CLKID_SPDIFOUT_B_CLK_SEL 153 131 117 #define AUD_CLKID_SPDIFOUT_B_CLK_DIV 154 118 + #define AUD_CLKID_CLK81_EN 173 119 + #define AUD_CLKID_SYSCLK_A_DIV 174 120 + #define AUD_CLKID_SYSCLK_B_DIV 175 121 + #define AUD_CLKID_SYSCLK_A_EN 176 122 + #define AUD_CLKID_SYSCLK_B_EN 177 132 123 133 124 /* include the CLKIDs which are part of the DT bindings */ 134 125 #include <dt-bindings/clock/axg-audio-clkc.h> 135 126 136 - #define NR_CLKS 163 127 + #define NR_CLKS 178 137 128 138 129 #endif /*__AXG_AUDIO_CLKC_H */
+2 -2
drivers/clk/mvebu/ap-cpu-clk.c
··· 274 274 if (!ap_cpu_clk) 275 275 return -ENOMEM; 276 276 277 - ap_cpu_data = devm_kzalloc(dev, sizeof(*ap_cpu_data) + 278 - sizeof(struct clk_hw *) * nclusters, 277 + ap_cpu_data = devm_kzalloc(dev, struct_size(ap_cpu_data, hws, 278 + nclusters), 279 279 GFP_KERNEL); 280 280 if (!ap_cpu_data) 281 281 return -ENOMEM;
+4 -2
drivers/clk/mvebu/armada-37xx-periph.c
··· 303 303 PERIPH_CLK_FULL_DD(sdio, 11, 14, DIV_SEL0, DIV_SEL0, 3, 6); 304 304 PERIPH_CLK_FULL_DD(usb32_usb2_sys, 16, 16, DIV_SEL0, DIV_SEL0, 9, 12); 305 305 PERIPH_CLK_FULL_DD(usb32_ss_sys, 17, 18, DIV_SEL0, DIV_SEL0, 15, 18); 306 + static PERIPH_GATE(pcie, 14); 306 307 307 308 static struct clk_periph_data data_sb[] = { 308 309 REF_CLK_MUX_DD(gbe_50), ··· 319 318 REF_CLK_FULL_DD(sdio), 320 319 REF_CLK_FULL_DD(usb32_usb2_sys), 321 320 REF_CLK_FULL_DD(usb32_ss_sys), 321 + REF_CLK_GATE(pcie, "gbe_core"), 322 322 { }, 323 323 }; 324 324 ··· 714 712 } 715 713 716 714 static const struct dev_pm_ops armada_3700_periph_clock_pm_ops = { 717 - SET_SYSTEM_SLEEP_PM_OPS(armada_3700_periph_clock_suspend, 718 - armada_3700_periph_clock_resume) 715 + SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(armada_3700_periph_clock_suspend, 716 + armada_3700_periph_clock_resume) 719 717 }; 720 718 721 719 static int armada_3700_periph_clock_probe(struct platform_device *pdev)
-26
drivers/clk/mvebu/armada-xp.c
··· 50 50 return 250000000; 51 51 } 52 52 53 - /* MV98DX3236 TCLK frequency is fixed to 200MHz */ 54 - static u32 __init mv98dx3236_get_tclk_freq(void __iomem *sar) 55 - { 56 - return 200000000; 57 - } 58 - 59 53 static const u32 axp_cpu_freqs[] __initconst = { 60 54 1000000000, 61 55 1066000000, ··· 85 91 cpu_freq = axp_cpu_freqs[cpu_freq_select]; 86 92 87 93 return cpu_freq; 88 - } 89 - 90 - /* MV98DX3236 CLK frequency is fixed to 800MHz */ 91 - static u32 __init mv98dx3236_get_cpu_freq(void __iomem *sar) 92 - { 93 - return 800000000; 94 94 } 95 95 96 96 static const int axp_nbclk_ratios[32][2] __initconst = { ··· 156 168 .num_ratios = ARRAY_SIZE(axp_coreclk_ratios), 157 169 }; 158 170 159 - static const struct coreclk_soc_desc mv98dx3236_coreclks = { 160 - .get_tclk_freq = mv98dx3236_get_tclk_freq, 161 - .get_cpu_freq = mv98dx3236_get_cpu_freq, 162 - }; 163 - 164 171 /* 165 172 * Clock Gating Control 166 173 */ ··· 190 207 { "xor1", NULL, 28, 0 }, 191 208 { "sata1lnk", NULL, 29, 0 }, 192 209 { "sata1", "sata1lnk", 30, 0 }, 193 - { } 194 - }; 195 - 196 - static const struct clk_gating_soc_desc mv98dx3236_gating_desc[] __initconst = { 197 - { "ge1", NULL, 3, 0 }, 198 - { "ge0", NULL, 4, 0 }, 199 - { "pex00", NULL, 5, 0 }, 200 - { "sdio", NULL, 17, 0 }, 201 - { "xor0", NULL, 22, 0 }, 202 210 { } 203 211 }; 204 212
+2 -2
drivers/clk/mvebu/cp110-system-controller.c
··· 235 235 if (ret) 236 236 return ret; 237 237 238 - cp110_clk_data = devm_kzalloc(dev, sizeof(*cp110_clk_data) + 239 - sizeof(struct clk_hw *) * CP110_CLK_NUM, 238 + cp110_clk_data = devm_kzalloc(dev, struct_size(cp110_clk_data, hws, 239 + CP110_CLK_NUM), 240 240 GFP_KERNEL); 241 241 if (!cp110_clk_data) 242 242 return -ENOMEM;
+1
drivers/clk/pxa/clk-pxa27x.c
··· 459 459 }; 460 460 static struct dummy_clk dummy_clks[] __initdata = { 461 461 DUMMY_CLK(NULL, "pxa27x-gpio", "osc_32_768khz"), 462 + DUMMY_CLK(NULL, "pxa-rtc", "osc_32_768khz"), 462 463 DUMMY_CLK(NULL, "sa1100-rtc", "osc_32_768khz"), 463 464 DUMMY_CLK("UARTCLK", "pxa2xx-ir", "STUART"), 464 465 };
+26
drivers/clk/qcom/Kconfig
··· 220 220 Say Y if you want to use peripheral devices such as UART, SPI, 221 221 i2c, USB, UFS, SD/eMMC, PCIe, etc. 222 222 223 + config MSM_GPUCC_8998 224 + tristate "MSM8998 Graphics Clock Controller" 225 + select MSM_GCC_8998 226 + select QCOM_GDSC 227 + help 228 + Support for the graphics clock controller on MSM8998 devices. 229 + Say Y if you want to support graphics controller devices and 230 + functionality such as 3D graphics. 231 + 223 232 config QCS_GCC_404 224 233 tristate "QCS404 Global Clock Controller" 225 234 help 226 235 Support for the global clock controller on QCS404 devices. 227 236 Say Y if you want to use multimedia devices or peripheral 228 237 devices such as UART, SPI, I2C, USB, SD/eMMC, PCIe etc. 238 + 239 + config SC_GCC_7180 240 + tristate "SC7180 Global Clock Controller" 241 + select QCOM_GDSC 242 + depends on COMMON_CLK_QCOM 243 + help 244 + Support for the global clock controller on SC7180 devices. 245 + Say Y if you want to use peripheral devices such as UART, SPI, 246 + I2C, USB, UFS, SDCC, etc. 229 247 230 248 config SDM_CAMCC_845 231 249 tristate "SDM845 Camera Clock Controller" ··· 265 247 help 266 248 Support for the Turing Clock Controller on QCS404, provides clocks 267 249 and resets for the Turing subsystem. 250 + 251 + config QCS_Q6SSTOP_404 252 + tristate "QCS404 Q6SSTOP Clock Controller" 253 + select QCS_GCC_404 254 + help 255 + Support for the Q6SSTOP clock controller on QCS404 devices. 256 + Say Y if you want to use the Q6SSTOP branch clocks of the WCSS clock 257 + controller to reset the Q6SSTOP subsystem. 268 258 269 259 config SDM_GCC_845 270 260 tristate "SDM845 Global Clock Controller"
+3
drivers/clk/qcom/Makefile
··· 33 33 obj-$(CONFIG_MSM_GCC_8996) += gcc-msm8996.o 34 34 obj-$(CONFIG_MSM_LCC_8960) += lcc-msm8960.o 35 35 obj-$(CONFIG_MSM_GCC_8998) += gcc-msm8998.o 36 + obj-$(CONFIG_MSM_GPUCC_8998) += gpucc-msm8998.o 36 37 obj-$(CONFIG_MSM_MMCC_8960) += mmcc-msm8960.o 37 38 obj-$(CONFIG_MSM_MMCC_8974) += mmcc-msm8974.o 38 39 obj-$(CONFIG_MSM_MMCC_8996) += mmcc-msm8996.o ··· 43 42 obj-$(CONFIG_QCOM_CLK_RPMH) += clk-rpmh.o 44 43 obj-$(CONFIG_QCOM_CLK_SMD_RPM) += clk-smd-rpm.o 45 44 obj-$(CONFIG_QCS_GCC_404) += gcc-qcs404.o 45 + obj-$(CONFIG_QCS_Q6SSTOP_404) += q6sstop-qcs404.o 46 46 obj-$(CONFIG_QCS_TURING_404) += turingcc-qcs404.o 47 + obj-$(CONFIG_SC_GCC_7180) += gcc-sc7180.o 47 48 obj-$(CONFIG_SDM_CAMCC_845) += camcc-sdm845.o 48 49 obj-$(CONFIG_SDM_DISPCC_845) += dispcc-sdm845.o 49 50 obj-$(CONFIG_SDM_GCC_660) += gcc-sdm660.o
+1 -1
drivers/clk/qcom/clk-rcg.h
··· 168 168 }; 169 169 170 170 #define DEFINE_RCG_DFS(r) \ 171 - { .rcg = &r##_src, .init = &r##_init } 171 + { .rcg = &r, .init = &r##_init } 172 172 173 173 extern int qcom_cc_register_rcg_dfs(struct regmap *regmap, 174 174 const struct clk_rcg_dfs_data *rcgs,
+4 -2
drivers/clk/qcom/clk-rcg2.c
··· 206 206 break; 207 207 default: 208 208 return -EINVAL; 209 - }; 209 + } 210 210 211 211 if (!f) 212 212 return -EINVAL; ··· 220 220 if (clk_flags & CLK_SET_RATE_PARENT) { 221 221 rate = f->freq; 222 222 if (f->pre_div) { 223 + if (!rate) 224 + rate = req->rate; 223 225 rate /= 2; 224 226 rate *= f->pre_div + 1; 225 227 } ··· 321 319 break; 322 320 default: 323 321 return -EINVAL; 324 - }; 322 + } 325 323 326 324 if (!f) 327 325 return -EINVAL;
+33 -20
drivers/clk/qcom/clk-rpmh.c
··· 334 334 .recalc_rate = clk_rpmh_bcm_recalc_rate, 335 335 }; 336 336 337 - /* Resource name must match resource id present in cmd-db. */ 337 + /* Resource name must match resource id present in cmd-db */ 338 338 DEFINE_CLK_RPMH_ARC(sdm845, bi_tcxo, bi_tcxo_ao, "xo.lvl", 0x3, 2); 339 339 DEFINE_CLK_RPMH_VRM(sdm845, ln_bb_clk2, ln_bb_clk2_ao, "lnbclka2", 2); 340 340 DEFINE_CLK_RPMH_VRM(sdm845, ln_bb_clk3, ln_bb_clk3_ao, "lnbclka3", 2); 341 341 DEFINE_CLK_RPMH_VRM(sdm845, rf_clk1, rf_clk1_ao, "rfclka1", 1); 342 342 DEFINE_CLK_RPMH_VRM(sdm845, rf_clk2, rf_clk2_ao, "rfclka2", 1); 343 343 DEFINE_CLK_RPMH_VRM(sdm845, rf_clk3, rf_clk3_ao, "rfclka3", 1); 344 + DEFINE_CLK_RPMH_VRM(sm8150, rf_clk3, rf_clk3_ao, "rfclka3", 1); 344 345 DEFINE_CLK_RPMH_BCM(sdm845, ipa, "IP0"); 345 346 346 347 static struct clk_hw *sdm845_rpmh_clocks[] = { ··· 365 364 .num_clks = ARRAY_SIZE(sdm845_rpmh_clocks), 366 365 }; 367 366 368 - DEFINE_CLK_RPMH_ARC(sm8150, bi_tcxo, bi_tcxo_ao, "xo.lvl", 0x3, 2); 369 - DEFINE_CLK_RPMH_VRM(sm8150, ln_bb_clk2, ln_bb_clk2_ao, "lnbclka2", 2); 370 - DEFINE_CLK_RPMH_VRM(sm8150, ln_bb_clk3, ln_bb_clk3_ao, "lnbclka3", 2); 371 - DEFINE_CLK_RPMH_VRM(sm8150, rf_clk1, rf_clk1_ao, "rfclka1", 1); 372 - DEFINE_CLK_RPMH_VRM(sm8150, rf_clk2, rf_clk2_ao, "rfclka2", 1); 373 - DEFINE_CLK_RPMH_VRM(sm8150, rf_clk3, rf_clk3_ao, "rfclka3", 1); 374 - 375 367 static struct clk_hw *sm8150_rpmh_clocks[] = { 376 - [RPMH_CXO_CLK] = &sm8150_bi_tcxo.hw, 377 - [RPMH_CXO_CLK_A] = &sm8150_bi_tcxo_ao.hw, 378 - [RPMH_LN_BB_CLK2] = &sm8150_ln_bb_clk2.hw, 379 - [RPMH_LN_BB_CLK2_A] = &sm8150_ln_bb_clk2_ao.hw, 380 - [RPMH_LN_BB_CLK3] = &sm8150_ln_bb_clk3.hw, 381 - [RPMH_LN_BB_CLK3_A] = &sm8150_ln_bb_clk3_ao.hw, 382 - [RPMH_RF_CLK1] = &sm8150_rf_clk1.hw, 383 - [RPMH_RF_CLK1_A] = &sm8150_rf_clk1_ao.hw, 384 - [RPMH_RF_CLK2] = &sm8150_rf_clk2.hw, 385 - [RPMH_RF_CLK2_A] = &sm8150_rf_clk2_ao.hw, 386 - [RPMH_RF_CLK3] = &sm8150_rf_clk3.hw, 387 - [RPMH_RF_CLK3_A] = &sm8150_rf_clk3_ao.hw, 368 + [RPMH_CXO_CLK] = &sdm845_bi_tcxo.hw, 369 + [RPMH_CXO_CLK_A] = &sdm845_bi_tcxo_ao.hw, 370 + [RPMH_LN_BB_CLK2] = &sdm845_ln_bb_clk2.hw, 371 + [RPMH_LN_BB_CLK2_A] = &sdm845_ln_bb_clk2_ao.hw, 372 + [RPMH_LN_BB_CLK3] = &sdm845_ln_bb_clk3.hw, 373 + [RPMH_LN_BB_CLK3_A] = &sdm845_ln_bb_clk3_ao.hw, 374 + [RPMH_RF_CLK1] = &sdm845_rf_clk1.hw, 375 + [RPMH_RF_CLK1_A] = &sdm845_rf_clk1_ao.hw, 376 + [RPMH_RF_CLK2] = &sdm845_rf_clk2.hw, 377 + [RPMH_RF_CLK2_A] = &sdm845_rf_clk2_ao.hw, 378 + [RPMH_RF_CLK3] = &sdm845_rf_clk3.hw, 379 + [RPMH_RF_CLK3_A] = &sdm845_rf_clk3_ao.hw, 388 380 }; 389 381 390 382 static const struct clk_rpmh_desc clk_rpmh_sm8150 = { 391 383 .clks = sm8150_rpmh_clocks, 392 384 .num_clks = ARRAY_SIZE(sm8150_rpmh_clocks), 385 + }; 386 + 387 + static struct clk_hw *sc7180_rpmh_clocks[] = { 388 + [RPMH_CXO_CLK] = &sdm845_bi_tcxo.hw, 389 + [RPMH_CXO_CLK_A] = &sdm845_bi_tcxo_ao.hw, 390 + [RPMH_LN_BB_CLK2] = &sdm845_ln_bb_clk2.hw, 391 + [RPMH_LN_BB_CLK2_A] = &sdm845_ln_bb_clk2_ao.hw, 392 + [RPMH_LN_BB_CLK3] = &sdm845_ln_bb_clk3.hw, 393 + [RPMH_LN_BB_CLK3_A] = &sdm845_ln_bb_clk3_ao.hw, 394 + [RPMH_RF_CLK1] = &sdm845_rf_clk1.hw, 395 + [RPMH_RF_CLK1_A] = &sdm845_rf_clk1_ao.hw, 396 + [RPMH_RF_CLK2] = &sdm845_rf_clk2.hw, 397 + [RPMH_RF_CLK2_A] = &sdm845_rf_clk2_ao.hw, 398 + }; 399 + 400 + static const struct clk_rpmh_desc clk_rpmh_sc7180 = { 401 + .clks = sc7180_rpmh_clocks, 402 + .num_clks = ARRAY_SIZE(sc7180_rpmh_clocks), 393 403 }; 394 404 395 405 static struct clk_hw *of_clk_rpmh_hw_get(struct of_phandle_args *clkspec, ··· 483 471 static const struct of_device_id clk_rpmh_match_table[] = { 484 472 { .compatible = "qcom,sdm845-rpmh-clk", .data = &clk_rpmh_sdm845}, 485 473 { .compatible = "qcom,sm8150-rpmh-clk", .data = &clk_rpmh_sm8150}, 474 + { .compatible = "qcom,sc7180-rpmh-clk", .data = &clk_rpmh_sc7180}, 486 475 { } 487 476 }; 488 477 MODULE_DEVICE_TABLE(of, clk_rpmh_match_table);
+3
drivers/clk/qcom/clk-smd-rpm.c
··· 648 648 }; 649 649 650 650 /* msm8998 */ 651 + DEFINE_CLK_SMD_RPM(msm8998, pcnoc_clk, pcnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 0); 651 652 DEFINE_CLK_SMD_RPM(msm8998, snoc_clk, snoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 1); 652 653 DEFINE_CLK_SMD_RPM(msm8998, cnoc_clk, cnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 2); 653 654 DEFINE_CLK_SMD_RPM(msm8998, ce1_clk, ce1_a_clk, QCOM_SMD_RPM_CE_CLK, 0); ··· 671 670 DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8998, rf_clk3, rf_clk3_a, 6); 672 671 DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8998, rf_clk3_pin, rf_clk3_a_pin, 6); 673 672 static struct clk_smd_rpm *msm8998_clks[] = { 673 + [RPM_SMD_PCNOC_CLK] = &msm8998_pcnoc_clk, 674 + [RPM_SMD_PCNOC_A_CLK] = &msm8998_pcnoc_a_clk, 674 675 [RPM_SMD_SNOC_CLK] = &msm8998_snoc_clk, 675 676 [RPM_SMD_SNOC_A_CLK] = &msm8998_snoc_a_clk, 676 677 [RPM_SMD_CNOC_CLK] = &msm8998_cnoc_clk,
+4 -1
drivers/clk/qcom/common.c
··· 29 29 if (!f) 30 30 return NULL; 31 31 32 + if (!f->freq) 33 + return f; 34 + 32 35 for (; f->freq; f++) 33 36 if (rate <= f->freq) 34 37 return f; ··· 221 218 return ERR_PTR(-EINVAL); 222 219 } 223 220 224 - return cc->rclks[idx] ? &cc->rclks[idx]->hw : ERR_PTR(-ENOENT); 221 + return cc->rclks[idx] ? &cc->rclks[idx]->hw : NULL; 225 222 } 226 223 227 224 int qcom_cc_really_probe(struct platform_device *pdev,
+72
drivers/clk/qcom/gcc-msm8998.c
··· 1266 1266 }, 1267 1267 }; 1268 1268 1269 + static struct clk_branch gcc_mss_cfg_ahb_clk = { 1270 + .halt_reg = 0x8a000, 1271 + .halt_check = BRANCH_HALT, 1272 + .clkr = { 1273 + .enable_reg = 0x8a000, 1274 + .enable_mask = BIT(0), 1275 + .hw.init = &(struct clk_init_data){ 1276 + .name = "gcc_mss_cfg_ahb_clk", 1277 + .ops = &clk_branch2_ops, 1278 + }, 1279 + }, 1280 + }; 1281 + 1282 + static struct clk_branch gcc_mss_snoc_axi_clk = { 1283 + .halt_reg = 0x8a03c, 1284 + .halt_check = BRANCH_HALT, 1285 + .clkr = { 1286 + .enable_reg = 0x8a03c, 1287 + .enable_mask = BIT(0), 1288 + .hw.init = &(struct clk_init_data){ 1289 + .name = "gcc_mss_snoc_axi_clk", 1290 + .ops = &clk_branch2_ops, 1291 + }, 1292 + }, 1293 + }; 1294 + 1295 + static struct clk_branch gcc_mss_mnoc_bimc_axi_clk = { 1296 + .halt_reg = 0x8a004, 1297 + .halt_check = BRANCH_HALT, 1298 + .clkr = { 1299 + .enable_reg = 0x8a004, 1300 + .enable_mask = BIT(0), 1301 + .hw.init = &(struct clk_init_data){ 1302 + .name = "gcc_mss_mnoc_bimc_axi_clk", 1303 + .ops = &clk_branch2_ops, 1304 + }, 1305 + }, 1306 + }; 1307 + 1308 + static struct clk_branch gcc_boot_rom_ahb_clk = { 1309 + .halt_reg = 0x38004, 1310 + .halt_check = BRANCH_HALT_VOTED, 1311 + .hwcg_reg = 0x38004, 1312 + .hwcg_bit = 1, 1313 + .clkr = { 1314 + .enable_reg = 0x52004, 1315 + .enable_mask = BIT(10), 1316 + .hw.init = &(struct clk_init_data){ 1317 + .name = "gcc_boot_rom_ahb_clk", 1318 + .ops = &clk_branch2_ops, 1319 + }, 1320 + }, 1321 + }; 1322 + 1323 + static struct clk_branch gcc_mss_gpll0_div_clk_src = { 1324 + .halt_check = BRANCH_HALT_DELAY, 1325 + .clkr = { 1326 + .enable_reg = 0x5200c, 1327 + .enable_mask = BIT(2), 1328 + .hw.init = &(struct clk_init_data){ 1329 + .name = "gcc_mss_gpll0_div_clk_src", 1330 + .ops = &clk_branch2_ops, 1331 + }, 1332 + }, 1333 + }; 1334 + 1269 1335 static struct clk_branch gcc_blsp1_ahb_clk = { 1270 1336 .halt_reg = 0x17004, 1271 1337 .halt_check = BRANCH_HALT_VOTED, ··· 2898 2832 [GCC_USB3_CLKREF_CLK] = &gcc_usb3_clkref_clk.clkr, 2899 2833 [GCC_PCIE_CLKREF_CLK] = &gcc_pcie_clkref_clk.clkr, 2900 2834 [GCC_RX1_USB2_CLKREF_CLK] = &gcc_rx1_usb2_clkref_clk.clkr, 2835 + [GCC_MSS_CFG_AHB_CLK] = &gcc_mss_cfg_ahb_clk.clkr, 2836 + [GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr, 2837 + [GCC_MSS_GPLL0_DIV_CLK_SRC] = &gcc_mss_gpll0_div_clk_src.clkr, 2838 + [GCC_MSS_SNOC_AXI_CLK] = &gcc_mss_snoc_axi_clk.clkr, 2839 + [GCC_MSS_MNOC_BIMC_AXI_CLK] = &gcc_mss_mnoc_bimc_axi_clk.clkr, 2901 2840 }; 2902 2841 2903 2842 static struct gdsc *gcc_msm8998_gdscs[] = { ··· 2999 2928 [GCC_GPU_BCR] = { 0x71000 }, 3000 2929 [GCC_SPSS_BCR] = { 0x72000 }, 3001 2930 [GCC_OBT_ODT_BCR] = { 0x73000 }, 2931 + [GCC_MSS_RESTART] = { 0x79000 }, 3002 2932 [GCC_VS_BCR] = { 0x7a000 }, 3003 2933 [GCC_MSS_VS_RESET] = { 0x7a100 }, 3004 2934 [GCC_GPU_VS_RESET] = { 0x7a104 },
+2450
drivers/clk/qcom/gcc-sc7180.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Copyright (c) 2019, The Linux Foundation. All rights reserved. 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/of.h> 11 + #include <linux/of_device.h> 12 + #include <linux/regmap.h> 13 + 14 + #include <dt-bindings/clock/qcom,gcc-sc7180.h> 15 + 16 + #include "clk-alpha-pll.h" 17 + #include "clk-branch.h" 18 + #include "clk-rcg.h" 19 + #include "clk-regmap.h" 20 + #include "common.h" 21 + #include "gdsc.h" 22 + #include "reset.h" 23 + 24 + enum { 25 + P_BI_TCXO, 26 + P_CORE_BI_PLL_TEST_SE, 27 + P_GPLL0_OUT_EVEN, 28 + P_GPLL0_OUT_MAIN, 29 + P_GPLL1_OUT_MAIN, 30 + P_GPLL4_OUT_MAIN, 31 + P_GPLL6_OUT_MAIN, 32 + P_GPLL7_OUT_MAIN, 33 + P_SLEEP_CLK, 34 + }; 35 + 36 + static struct clk_alpha_pll gpll0 = { 37 + .offset = 0x0, 38 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], 39 + .clkr = { 40 + .enable_reg = 0x52010, 41 + .enable_mask = BIT(0), 42 + .hw.init = &(struct clk_init_data){ 43 + .name = "gpll0", 44 + .parent_data = &(const struct clk_parent_data){ 45 + .fw_name = "bi_tcxo", 46 + .name = "bi_tcxo", 47 + }, 48 + .num_parents = 1, 49 + .ops = &clk_alpha_pll_fixed_fabia_ops, 50 + }, 51 + }, 52 + }; 53 + 54 + static const struct clk_div_table post_div_table_gpll0_out_even[] = { 55 + { 0x1, 2 }, 56 + { } 57 + }; 58 + 59 + static struct clk_alpha_pll_postdiv gpll0_out_even = { 60 + .offset = 0x0, 61 + .post_div_shift = 8, 62 + .post_div_table = post_div_table_gpll0_out_even, 63 + .num_post_div = ARRAY_SIZE(post_div_table_gpll0_out_even), 64 + .width = 4, 65 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], 66 + .clkr.hw.init = &(struct clk_init_data){ 67 + .name = "gpll0_out_even", 68 + .parent_data = &(const struct clk_parent_data){ 69 + .hw = &gpll0.clkr.hw, 70 + }, 71 + .num_parents = 1, 72 + .ops = &clk_alpha_pll_postdiv_fabia_ops, 73 + }, 74 + }; 75 + 76 + static struct clk_fixed_factor gcc_pll0_main_div_cdiv = { 77 + .mult = 1, 78 + .div = 2, 79 + .hw.init = &(struct clk_init_data){ 80 + .name = "gcc_pll0_main_div_cdiv", 81 + .parent_data = &(const struct clk_parent_data){ 82 + .hw = &gpll0.clkr.hw, 83 + }, 84 + .num_parents = 1, 85 + .ops = &clk_fixed_factor_ops, 86 + }, 87 + }; 88 + 89 + static struct clk_alpha_pll gpll1 = { 90 + .offset = 0x01000, 91 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], 92 + .clkr = { 93 + .enable_reg = 0x52010, 94 + .enable_mask = BIT(1), 95 + .hw.init = &(struct clk_init_data){ 96 + .name = "gpll1", 97 + .parent_data = &(const struct clk_parent_data){ 98 + .fw_name = "bi_tcxo", 99 + .name = "bi_tcxo", 100 + }, 101 + .num_parents = 1, 102 + .ops = &clk_alpha_pll_fixed_fabia_ops, 103 + }, 104 + }, 105 + }; 106 + 107 + static struct clk_alpha_pll gpll4 = { 108 + .offset = 0x76000, 109 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], 110 + .clkr = { 111 + .enable_reg = 0x52010, 112 + .enable_mask = BIT(4), 113 + .hw.init = &(struct clk_init_data){ 114 + .name = "gpll4", 115 + .parent_data = &(const struct clk_parent_data){ 116 + .fw_name = "bi_tcxo", 117 + .name = "bi_tcxo", 118 + }, 119 + .num_parents = 1, 120 + .ops = &clk_alpha_pll_fixed_fabia_ops, 121 + }, 122 + }, 123 + }; 124 + 125 + static struct clk_alpha_pll gpll6 = { 126 + .offset = 0x13000, 127 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], 128 + .clkr = { 129 + .enable_reg = 0x52010, 130 + .enable_mask = BIT(6), 131 + .hw.init = &(struct clk_init_data){ 132 + .name = "gpll6", 133 + .parent_data = &(const struct clk_parent_data){ 134 + .fw_name = "bi_tcxo", 135 + .name = "bi_tcxo", 136 + }, 137 + .num_parents = 1, 138 + .ops = &clk_alpha_pll_fixed_fabia_ops, 139 + }, 140 + }, 141 + }; 142 + 143 + static struct clk_alpha_pll gpll7 = { 144 + .offset = 0x27000, 145 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], 146 + .clkr = { 147 + .enable_reg = 0x52010, 148 + .enable_mask = BIT(7), 149 + .hw.init = &(struct clk_init_data){ 150 + .name = "gpll7", 151 + .parent_data = &(const struct clk_parent_data){ 152 + .fw_name = "bi_tcxo", 153 + .name = "bi_tcxo", 154 + }, 155 + .num_parents = 1, 156 + .ops = &clk_alpha_pll_fixed_fabia_ops, 157 + }, 158 + }, 159 + }; 160 + 161 + static const struct parent_map gcc_parent_map_0[] = { 162 + { P_BI_TCXO, 0 }, 163 + { P_GPLL0_OUT_MAIN, 1 }, 164 + { P_GPLL0_OUT_EVEN, 6 }, 165 + { P_CORE_BI_PLL_TEST_SE, 7 }, 166 + }; 167 + 168 + static const struct clk_parent_data gcc_parent_data_0[] = { 169 + { .fw_name = "bi_tcxo", .name = "bi_tcxo" }, 170 + { .hw = &gpll0.clkr.hw }, 171 + { .hw = &gpll0_out_even.clkr.hw }, 172 + { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" }, 173 + }; 174 + 175 + static const struct clk_parent_data gcc_parent_data_0_ao[] = { 176 + { .fw_name = "bi_tcxo_ao", .name = "bi_tcxo_ao" }, 177 + { .hw = &gpll0.clkr.hw }, 178 + { .hw = &gpll0_out_even.clkr.hw }, 179 + { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" }, 180 + }; 181 + 182 + static const struct parent_map gcc_parent_map_1[] = { 183 + { P_BI_TCXO, 0 }, 184 + { P_GPLL0_OUT_MAIN, 1 }, 185 + { P_GPLL6_OUT_MAIN, 2 }, 186 + { P_GPLL0_OUT_EVEN, 6 }, 187 + { P_CORE_BI_PLL_TEST_SE, 7 }, 188 + }; 189 + 190 + static const struct clk_parent_data gcc_parent_data_1[] = { 191 + { .fw_name = "bi_tcxo", .name = "bi_tcxo" }, 192 + { .hw = &gpll0.clkr.hw }, 193 + { .hw = &gpll6.clkr.hw }, 194 + { .hw = &gpll0_out_even.clkr.hw }, 195 + { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" }, 196 + }; 197 + 198 + static const struct parent_map gcc_parent_map_2[] = { 199 + { P_BI_TCXO, 0 }, 200 + { P_GPLL0_OUT_MAIN, 1 }, 201 + { P_GPLL1_OUT_MAIN, 4 }, 202 + { P_GPLL4_OUT_MAIN, 5 }, 203 + { P_GPLL0_OUT_EVEN, 6 }, 204 + { P_CORE_BI_PLL_TEST_SE, 7 }, 205 + }; 206 + 207 + static const struct clk_parent_data gcc_parent_data_2[] = { 208 + { .fw_name = "bi_tcxo", .name = "bi_tcxo" }, 209 + { .hw = &gpll0.clkr.hw }, 210 + { .hw = &gpll1.clkr.hw }, 211 + { .hw = &gpll4.clkr.hw }, 212 + { .hw = &gpll0_out_even.clkr.hw }, 213 + { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" }, 214 + }; 215 + 216 + static const struct parent_map gcc_parent_map_3[] = { 217 + { P_BI_TCXO, 0 }, 218 + { P_GPLL0_OUT_MAIN, 1 }, 219 + { P_CORE_BI_PLL_TEST_SE, 7 }, 220 + }; 221 + 222 + static const struct clk_parent_data gcc_parent_data_3[] = { 223 + { .fw_name = "bi_tcxo", .name = "bi_tcxo" }, 224 + { .hw = &gpll0.clkr.hw }, 225 + { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" }, 226 + }; 227 + 228 + static const struct parent_map gcc_parent_map_4[] = { 229 + { P_BI_TCXO, 0 }, 230 + { P_GPLL0_OUT_MAIN, 1 }, 231 + { P_SLEEP_CLK, 5 }, 232 + { P_GPLL0_OUT_EVEN, 6 }, 233 + { P_CORE_BI_PLL_TEST_SE, 7 }, 234 + }; 235 + 236 + static const struct clk_parent_data gcc_parent_data_4[] = { 237 + { .fw_name = "bi_tcxo", .name = "bi_tcxo" }, 238 + { .hw = &gpll0.clkr.hw }, 239 + { .fw_name = "sleep_clk", .name = "sleep_clk" }, 240 + { .hw = &gpll0_out_even.clkr.hw }, 241 + { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" }, 242 + }; 243 + 244 + static const struct parent_map gcc_parent_map_5[] = { 245 + { P_BI_TCXO, 0 }, 246 + { P_GPLL0_OUT_MAIN, 1 }, 247 + { P_GPLL7_OUT_MAIN, 3 }, 248 + { P_GPLL0_OUT_EVEN, 6 }, 249 + { P_CORE_BI_PLL_TEST_SE, 7 }, 250 + }; 251 + 252 + static const struct clk_parent_data gcc_parent_data_5[] = { 253 + { .fw_name = "bi_tcxo", .name = "bi_tcxo" }, 254 + { .hw = &gpll0.clkr.hw }, 255 + { .hw = &gpll7.clkr.hw }, 256 + { .hw = &gpll0_out_even.clkr.hw }, 257 + { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" }, 258 + }; 259 + 260 + static const struct parent_map gcc_parent_map_6[] = { 261 + { P_BI_TCXO, 0 }, 262 + { P_GPLL0_OUT_MAIN, 1 }, 263 + { P_SLEEP_CLK, 5 }, 264 + { P_CORE_BI_PLL_TEST_SE, 7 }, 265 + }; 266 + 267 + static const struct clk_parent_data gcc_parent_data_6[] = { 268 + { .fw_name = "bi_tcxo", .name = "bi_tcxo" }, 269 + { .hw = &gpll0.clkr.hw }, 270 + { .fw_name = "sleep_clk", .name = "sleep_clk" }, 271 + { .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" }, 272 + }; 273 + 274 + static const struct freq_tbl ftbl_gcc_cpuss_ahb_clk_src[] = { 275 + F(19200000, P_BI_TCXO, 1, 0, 0), 276 + { } 277 + }; 278 + 279 + static struct clk_rcg2 gcc_cpuss_ahb_clk_src = { 280 + .cmd_rcgr = 0x48014, 281 + .mnd_width = 0, 282 + .hid_width = 5, 283 + .parent_map = gcc_parent_map_0, 284 + .freq_tbl = ftbl_gcc_cpuss_ahb_clk_src, 285 + .clkr.hw.init = &(struct clk_init_data){ 286 + .name = "gcc_cpuss_ahb_clk_src", 287 + .parent_data = gcc_parent_data_0_ao, 288 + .num_parents = 4, 289 + .flags = CLK_SET_RATE_PARENT, 290 + .ops = &clk_rcg2_ops, 291 + }, 292 + }; 293 + 294 + static const struct freq_tbl ftbl_gcc_gp1_clk_src[] = { 295 + F(19200000, P_BI_TCXO, 1, 0, 0), 296 + F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0), 297 + F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0), 298 + F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0), 299 + F(200000000, P_GPLL0_OUT_EVEN, 1.5, 0, 0), 300 + { } 301 + }; 302 + 303 + static struct clk_rcg2 gcc_gp1_clk_src = { 304 + .cmd_rcgr = 0x64004, 305 + .mnd_width = 8, 306 + .hid_width = 5, 307 + .parent_map = gcc_parent_map_4, 308 + .freq_tbl = ftbl_gcc_gp1_clk_src, 309 + .clkr.hw.init = &(struct clk_init_data){ 310 + .name = "gcc_gp1_clk_src", 311 + .parent_data = gcc_parent_data_4, 312 + .num_parents = 5, 313 + .ops = &clk_rcg2_ops, 314 + }, 315 + }; 316 + 317 + static struct clk_rcg2 gcc_gp2_clk_src = { 318 + .cmd_rcgr = 0x65004, 319 + .mnd_width = 8, 320 + .hid_width = 5, 321 + .parent_map = gcc_parent_map_4, 322 + .freq_tbl = ftbl_gcc_gp1_clk_src, 323 + .clkr.hw.init = &(struct clk_init_data){ 324 + .name = "gcc_gp2_clk_src", 325 + .parent_data = gcc_parent_data_4, 326 + .num_parents = 5, 327 + .ops = &clk_rcg2_ops, 328 + }, 329 + }; 330 + 331 + static struct clk_rcg2 gcc_gp3_clk_src = { 332 + .cmd_rcgr = 0x66004, 333 + .mnd_width = 8, 334 + .hid_width = 5, 335 + .parent_map = gcc_parent_map_4, 336 + .freq_tbl = ftbl_gcc_gp1_clk_src, 337 + .clkr.hw.init = &(struct clk_init_data){ 338 + .name = "gcc_gp3_clk_src", 339 + .parent_data = gcc_parent_data_4, 340 + .num_parents = 5, 341 + .ops = &clk_rcg2_ops, 342 + }, 343 + }; 344 + 345 + static const struct freq_tbl ftbl_gcc_pdm2_clk_src[] = { 346 + F(19200000, P_BI_TCXO, 1, 0, 0), 347 + F(60000000, P_GPLL0_OUT_EVEN, 5, 0, 0), 348 + { } 349 + }; 350 + 351 + static struct clk_rcg2 gcc_pdm2_clk_src = { 352 + .cmd_rcgr = 0x33010, 353 + .mnd_width = 0, 354 + .hid_width = 5, 355 + .parent_map = gcc_parent_map_0, 356 + .freq_tbl = ftbl_gcc_pdm2_clk_src, 357 + .clkr.hw.init = &(struct clk_init_data){ 358 + .name = "gcc_pdm2_clk_src", 359 + .parent_data = gcc_parent_data_0, 360 + .num_parents = 4, 361 + .ops = &clk_rcg2_ops, 362 + }, 363 + }; 364 + 365 + static const struct freq_tbl ftbl_gcc_qspi_core_clk_src[] = { 366 + F(75000000, P_GPLL0_OUT_EVEN, 4, 0, 0), 367 + F(150000000, P_GPLL0_OUT_EVEN, 2, 0, 0), 368 + F(300000000, P_GPLL0_OUT_EVEN, 1, 0, 0), 369 + { } 370 + }; 371 + 372 + static struct clk_rcg2 gcc_qspi_core_clk_src = { 373 + .cmd_rcgr = 0x4b00c, 374 + .mnd_width = 0, 375 + .hid_width = 5, 376 + .parent_map = gcc_parent_map_2, 377 + .freq_tbl = ftbl_gcc_qspi_core_clk_src, 378 + .clkr.hw.init = &(struct clk_init_data){ 379 + .name = "gcc_qspi_core_clk_src", 380 + .parent_data = gcc_parent_data_2, 381 + .num_parents = 6, 382 + .ops = &clk_rcg2_ops, 383 + }, 384 + }; 385 + 386 + static const struct freq_tbl ftbl_gcc_qupv3_wrap0_s0_clk_src[] = { 387 + F(7372800, P_GPLL0_OUT_EVEN, 1, 384, 15625), 388 + F(14745600, P_GPLL0_OUT_EVEN, 1, 768, 15625), 389 + F(19200000, P_BI_TCXO, 1, 0, 0), 390 + F(29491200, P_GPLL0_OUT_EVEN, 1, 1536, 15625), 391 + F(32000000, P_GPLL0_OUT_EVEN, 1, 8, 75), 392 + F(48000000, P_GPLL0_OUT_EVEN, 1, 4, 25), 393 + F(64000000, P_GPLL0_OUT_EVEN, 1, 16, 75), 394 + F(75000000, P_GPLL0_OUT_EVEN, 4, 0, 0), 395 + F(80000000, P_GPLL0_OUT_EVEN, 1, 4, 15), 396 + F(96000000, P_GPLL0_OUT_EVEN, 1, 8, 25), 397 + F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0), 398 + F(102400000, P_GPLL0_OUT_EVEN, 1, 128, 375), 399 + F(112000000, P_GPLL0_OUT_EVEN, 1, 28, 75), 400 + F(117964800, P_GPLL0_OUT_EVEN, 1, 6144, 15625), 401 + F(120000000, P_GPLL0_OUT_EVEN, 2.5, 0, 0), 402 + F(128000000, P_GPLL6_OUT_MAIN, 3, 0, 0), 403 + { } 404 + }; 405 + 406 + static struct clk_init_data gcc_qupv3_wrap0_s0_clk_src_init = { 407 + .name = "gcc_qupv3_wrap0_s0_clk_src", 408 + .parent_data = gcc_parent_data_0, 409 + .num_parents = 4, 410 + .ops = &clk_rcg2_ops, 411 + }; 412 + 413 + static struct clk_rcg2 gcc_qupv3_wrap0_s0_clk_src = { 414 + .cmd_rcgr = 0x17034, 415 + .mnd_width = 16, 416 + .hid_width = 5, 417 + .parent_map = gcc_parent_map_0, 418 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 419 + .clkr.hw.init = &gcc_qupv3_wrap0_s0_clk_src_init, 420 + }; 421 + 422 + static struct clk_init_data gcc_qupv3_wrap0_s1_clk_src_init = { 423 + .name = "gcc_qupv3_wrap0_s1_clk_src", 424 + .parent_data = gcc_parent_data_0, 425 + .num_parents = 4, 426 + .ops = &clk_rcg2_ops, 427 + }; 428 + 429 + static struct clk_rcg2 gcc_qupv3_wrap0_s1_clk_src = { 430 + .cmd_rcgr = 0x17164, 431 + .mnd_width = 16, 432 + .hid_width = 5, 433 + .parent_map = gcc_parent_map_0, 434 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 435 + .clkr.hw.init = &gcc_qupv3_wrap0_s1_clk_src_init, 436 + }; 437 + 438 + static struct clk_init_data gcc_qupv3_wrap0_s2_clk_src_init = { 439 + .name = "gcc_qupv3_wrap0_s2_clk_src", 440 + .parent_data = gcc_parent_data_0, 441 + .num_parents = 4, 442 + .ops = &clk_rcg2_ops, 443 + }; 444 + 445 + static struct clk_rcg2 gcc_qupv3_wrap0_s2_clk_src = { 446 + .cmd_rcgr = 0x17294, 447 + .mnd_width = 16, 448 + .hid_width = 5, 449 + .parent_map = gcc_parent_map_0, 450 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 451 + .clkr.hw.init = &gcc_qupv3_wrap0_s2_clk_src_init, 452 + }; 453 + 454 + static struct clk_init_data gcc_qupv3_wrap0_s3_clk_src_init = { 455 + .name = "gcc_qupv3_wrap0_s3_clk_src", 456 + .parent_data = gcc_parent_data_0, 457 + .num_parents = 4, 458 + .ops = &clk_rcg2_ops, 459 + }; 460 + 461 + static struct clk_rcg2 gcc_qupv3_wrap0_s3_clk_src = { 462 + .cmd_rcgr = 0x173c4, 463 + .mnd_width = 16, 464 + .hid_width = 5, 465 + .parent_map = gcc_parent_map_0, 466 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 467 + .clkr.hw.init = &gcc_qupv3_wrap0_s3_clk_src_init, 468 + }; 469 + 470 + static struct clk_init_data gcc_qupv3_wrap0_s4_clk_src_init = { 471 + .name = "gcc_qupv3_wrap0_s4_clk_src", 472 + .parent_data = gcc_parent_data_0, 473 + .num_parents = 4, 474 + .ops = &clk_rcg2_ops, 475 + }; 476 + 477 + static struct clk_rcg2 gcc_qupv3_wrap0_s4_clk_src = { 478 + .cmd_rcgr = 0x174f4, 479 + .mnd_width = 16, 480 + .hid_width = 5, 481 + .parent_map = gcc_parent_map_0, 482 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 483 + .clkr.hw.init = &gcc_qupv3_wrap0_s4_clk_src_init, 484 + }; 485 + 486 + static struct clk_init_data gcc_qupv3_wrap0_s5_clk_src_init = { 487 + .name = "gcc_qupv3_wrap0_s5_clk_src", 488 + .parent_data = gcc_parent_data_0, 489 + .num_parents = 4, 490 + .ops = &clk_rcg2_ops, 491 + }; 492 + 493 + static struct clk_rcg2 gcc_qupv3_wrap0_s5_clk_src = { 494 + .cmd_rcgr = 0x17624, 495 + .mnd_width = 16, 496 + .hid_width = 5, 497 + .parent_map = gcc_parent_map_0, 498 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 499 + .clkr.hw.init = &gcc_qupv3_wrap0_s5_clk_src_init, 500 + }; 501 + 502 + static struct clk_init_data gcc_qupv3_wrap1_s0_clk_src_init = { 503 + .name = "gcc_qupv3_wrap1_s0_clk_src", 504 + .parent_data = gcc_parent_data_0, 505 + .num_parents = 4, 506 + .ops = &clk_rcg2_ops, 507 + }; 508 + 509 + static struct clk_rcg2 gcc_qupv3_wrap1_s0_clk_src = { 510 + .cmd_rcgr = 0x18018, 511 + .mnd_width = 16, 512 + .hid_width = 5, 513 + .parent_map = gcc_parent_map_0, 514 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 515 + .clkr.hw.init = &gcc_qupv3_wrap1_s0_clk_src_init, 516 + }; 517 + 518 + static struct clk_init_data gcc_qupv3_wrap1_s1_clk_src_init = { 519 + .name = "gcc_qupv3_wrap1_s1_clk_src", 520 + .parent_data = gcc_parent_data_0, 521 + .num_parents = 4, 522 + .ops = &clk_rcg2_ops, 523 + }; 524 + 525 + static struct clk_rcg2 gcc_qupv3_wrap1_s1_clk_src = { 526 + .cmd_rcgr = 0x18148, 527 + .mnd_width = 16, 528 + .hid_width = 5, 529 + .parent_map = gcc_parent_map_0, 530 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 531 + .clkr.hw.init = &gcc_qupv3_wrap1_s1_clk_src_init, 532 + }; 533 + 534 + static struct clk_init_data gcc_qupv3_wrap1_s2_clk_src_init = { 535 + .name = "gcc_qupv3_wrap1_s2_clk_src", 536 + .parent_data = gcc_parent_data_0, 537 + .num_parents = 4, 538 + .ops = &clk_rcg2_ops, 539 + }; 540 + 541 + static struct clk_rcg2 gcc_qupv3_wrap1_s2_clk_src = { 542 + .cmd_rcgr = 0x18278, 543 + .mnd_width = 16, 544 + .hid_width = 5, 545 + .parent_map = gcc_parent_map_0, 546 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 547 + .clkr.hw.init = &gcc_qupv3_wrap1_s2_clk_src_init, 548 + }; 549 + 550 + static struct clk_init_data gcc_qupv3_wrap1_s3_clk_src_init = { 551 + .name = "gcc_qupv3_wrap1_s3_clk_src", 552 + .parent_data = gcc_parent_data_0, 553 + .num_parents = 4, 554 + .ops = &clk_rcg2_ops, 555 + }; 556 + 557 + static struct clk_rcg2 gcc_qupv3_wrap1_s3_clk_src = { 558 + .cmd_rcgr = 0x183a8, 559 + .mnd_width = 16, 560 + .hid_width = 5, 561 + .parent_map = gcc_parent_map_0, 562 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 563 + .clkr.hw.init = &gcc_qupv3_wrap1_s3_clk_src_init, 564 + }; 565 + 566 + static struct clk_init_data gcc_qupv3_wrap1_s4_clk_src_init = { 567 + .name = "gcc_qupv3_wrap1_s4_clk_src", 568 + .parent_data = gcc_parent_data_0, 569 + .num_parents = 4, 570 + .ops = &clk_rcg2_ops, 571 + }; 572 + 573 + static struct clk_rcg2 gcc_qupv3_wrap1_s4_clk_src = { 574 + .cmd_rcgr = 0x184d8, 575 + .mnd_width = 16, 576 + .hid_width = 5, 577 + .parent_map = gcc_parent_map_0, 578 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 579 + .clkr.hw.init = &gcc_qupv3_wrap1_s4_clk_src_init, 580 + }; 581 + 582 + static struct clk_init_data gcc_qupv3_wrap1_s5_clk_src_init = { 583 + .name = "gcc_qupv3_wrap1_s5_clk_src", 584 + .parent_data = gcc_parent_data_0, 585 + .num_parents = 4, 586 + .ops = &clk_rcg2_ops, 587 + }; 588 + 589 + static struct clk_rcg2 gcc_qupv3_wrap1_s5_clk_src = { 590 + .cmd_rcgr = 0x18608, 591 + .mnd_width = 16, 592 + .hid_width = 5, 593 + .parent_map = gcc_parent_map_0, 594 + .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 595 + .clkr.hw.init = &gcc_qupv3_wrap1_s5_clk_src_init, 596 + }; 597 + 598 + 599 + static const struct freq_tbl ftbl_gcc_sdcc1_apps_clk_src[] = { 600 + F(144000, P_BI_TCXO, 16, 3, 25), 601 + F(400000, P_BI_TCXO, 12, 1, 4), 602 + F(19200000, P_BI_TCXO, 1, 0, 0), 603 + F(20000000, P_GPLL0_OUT_EVEN, 5, 1, 3), 604 + F(25000000, P_GPLL0_OUT_EVEN, 6, 1, 2), 605 + F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0), 606 + F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0), 607 + F(192000000, P_GPLL6_OUT_MAIN, 2, 0, 0), 608 + F(384000000, P_GPLL6_OUT_MAIN, 1, 0, 0), 609 + { } 610 + }; 611 + 612 + static struct clk_rcg2 gcc_sdcc1_apps_clk_src = { 613 + .cmd_rcgr = 0x12028, 614 + .mnd_width = 8, 615 + .hid_width = 5, 616 + .parent_map = gcc_parent_map_1, 617 + .freq_tbl = ftbl_gcc_sdcc1_apps_clk_src, 618 + .clkr.hw.init = &(struct clk_init_data){ 619 + .name = "gcc_sdcc1_apps_clk_src", 620 + .parent_data = gcc_parent_data_1, 621 + .num_parents = 5, 622 + .ops = &clk_rcg2_ops, 623 + }, 624 + }; 625 + 626 + static const struct freq_tbl ftbl_gcc_sdcc1_ice_core_clk_src[] = { 627 + F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0), 628 + F(150000000, P_GPLL0_OUT_EVEN, 2, 0, 0), 629 + F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 630 + F(300000000, P_GPLL0_OUT_EVEN, 1, 0, 0), 631 + { } 632 + }; 633 + 634 + static struct clk_rcg2 gcc_sdcc1_ice_core_clk_src = { 635 + .cmd_rcgr = 0x12010, 636 + .mnd_width = 0, 637 + .hid_width = 5, 638 + .parent_map = gcc_parent_map_0, 639 + .freq_tbl = ftbl_gcc_sdcc1_ice_core_clk_src, 640 + .clkr.hw.init = &(struct clk_init_data){ 641 + .name = "gcc_sdcc1_ice_core_clk_src", 642 + .parent_data = gcc_parent_data_0, 643 + .num_parents = 4, 644 + .ops = &clk_rcg2_ops, 645 + }, 646 + }; 647 + 648 + static const struct freq_tbl ftbl_gcc_sdcc2_apps_clk_src[] = { 649 + F(400000, P_BI_TCXO, 12, 1, 4), 650 + F(9600000, P_BI_TCXO, 2, 0, 0), 651 + F(19200000, P_BI_TCXO, 1, 0, 0), 652 + F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0), 653 + F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0), 654 + F(202000000, P_GPLL7_OUT_MAIN, 4, 0, 0), 655 + { } 656 + }; 657 + 658 + static struct clk_rcg2 gcc_sdcc2_apps_clk_src = { 659 + .cmd_rcgr = 0x1400c, 660 + .mnd_width = 8, 661 + .hid_width = 5, 662 + .parent_map = gcc_parent_map_5, 663 + .freq_tbl = ftbl_gcc_sdcc2_apps_clk_src, 664 + .clkr.hw.init = &(struct clk_init_data){ 665 + .name = "gcc_sdcc2_apps_clk_src", 666 + .parent_data = gcc_parent_data_5, 667 + .num_parents = 5, 668 + .ops = &clk_rcg2_ops, 669 + }, 670 + }; 671 + 672 + static const struct freq_tbl ftbl_gcc_ufs_phy_axi_clk_src[] = { 673 + F(25000000, P_GPLL0_OUT_EVEN, 12, 0, 0), 674 + F(50000000, P_GPLL0_OUT_EVEN, 6, 0, 0), 675 + F(100000000, P_GPLL0_OUT_EVEN, 3, 0, 0), 676 + F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 677 + F(240000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0), 678 + { } 679 + }; 680 + 681 + static struct clk_rcg2 gcc_ufs_phy_axi_clk_src = { 682 + .cmd_rcgr = 0x77020, 683 + .mnd_width = 8, 684 + .hid_width = 5, 685 + .parent_map = gcc_parent_map_0, 686 + .freq_tbl = ftbl_gcc_ufs_phy_axi_clk_src, 687 + .clkr.hw.init = &(struct clk_init_data){ 688 + .name = "gcc_ufs_phy_axi_clk_src", 689 + .parent_data = gcc_parent_data_0, 690 + .num_parents = 4, 691 + .ops = &clk_rcg2_ops, 692 + }, 693 + }; 694 + 695 + static const struct freq_tbl ftbl_gcc_ufs_phy_ice_core_clk_src[] = { 696 + F(37500000, P_GPLL0_OUT_EVEN, 8, 0, 0), 697 + F(75000000, P_GPLL0_OUT_EVEN, 4, 0, 0), 698 + F(150000000, P_GPLL0_OUT_EVEN, 2, 0, 0), 699 + F(300000000, P_GPLL0_OUT_EVEN, 1, 0, 0), 700 + { } 701 + }; 702 + 703 + static struct clk_rcg2 gcc_ufs_phy_ice_core_clk_src = { 704 + .cmd_rcgr = 0x77048, 705 + .mnd_width = 0, 706 + .hid_width = 5, 707 + .parent_map = gcc_parent_map_0, 708 + .freq_tbl = ftbl_gcc_ufs_phy_ice_core_clk_src, 709 + .clkr.hw.init = &(struct clk_init_data){ 710 + .name = "gcc_ufs_phy_ice_core_clk_src", 711 + .parent_data = gcc_parent_data_0, 712 + .num_parents = 4, 713 + .ops = &clk_rcg2_ops, 714 + }, 715 + }; 716 + 717 + static const struct freq_tbl ftbl_gcc_ufs_phy_phy_aux_clk_src[] = { 718 + F(9600000, P_BI_TCXO, 2, 0, 0), 719 + F(19200000, P_BI_TCXO, 1, 0, 0), 720 + { } 721 + }; 722 + 723 + static struct clk_rcg2 gcc_ufs_phy_phy_aux_clk_src = { 724 + .cmd_rcgr = 0x77098, 725 + .mnd_width = 0, 726 + .hid_width = 5, 727 + .parent_map = gcc_parent_map_3, 728 + .freq_tbl = ftbl_gcc_ufs_phy_phy_aux_clk_src, 729 + .clkr.hw.init = &(struct clk_init_data){ 730 + .name = "gcc_ufs_phy_phy_aux_clk_src", 731 + .parent_data = gcc_parent_data_3, 732 + .num_parents = 3, 733 + .ops = &clk_rcg2_ops, 734 + }, 735 + }; 736 + 737 + static const struct freq_tbl ftbl_gcc_ufs_phy_unipro_core_clk_src[] = { 738 + F(37500000, P_GPLL0_OUT_EVEN, 8, 0, 0), 739 + F(75000000, P_GPLL0_OUT_EVEN, 4, 0, 0), 740 + F(150000000, P_GPLL0_OUT_EVEN, 2, 0, 0), 741 + { } 742 + }; 743 + 744 + static struct clk_rcg2 gcc_ufs_phy_unipro_core_clk_src = { 745 + .cmd_rcgr = 0x77060, 746 + .mnd_width = 0, 747 + .hid_width = 5, 748 + .parent_map = gcc_parent_map_0, 749 + .freq_tbl = ftbl_gcc_ufs_phy_unipro_core_clk_src, 750 + .clkr.hw.init = &(struct clk_init_data){ 751 + .name = "gcc_ufs_phy_unipro_core_clk_src", 752 + .parent_data = gcc_parent_data_0, 753 + .num_parents = 4, 754 + .ops = &clk_rcg2_ops, 755 + }, 756 + }; 757 + 758 + static const struct freq_tbl ftbl_gcc_usb30_prim_master_clk_src[] = { 759 + F(66666667, P_GPLL0_OUT_EVEN, 4.5, 0, 0), 760 + F(133333333, P_GPLL0_OUT_MAIN, 4.5, 0, 0), 761 + F(200000000, P_GPLL0_OUT_MAIN, 3, 0, 0), 762 + F(240000000, P_GPLL0_OUT_MAIN, 2.5, 0, 0), 763 + { } 764 + }; 765 + 766 + static struct clk_rcg2 gcc_usb30_prim_master_clk_src = { 767 + .cmd_rcgr = 0xf01c, 768 + .mnd_width = 8, 769 + .hid_width = 5, 770 + .parent_map = gcc_parent_map_0, 771 + .freq_tbl = ftbl_gcc_usb30_prim_master_clk_src, 772 + .clkr.hw.init = &(struct clk_init_data){ 773 + .name = "gcc_usb30_prim_master_clk_src", 774 + .parent_data = gcc_parent_data_0, 775 + .num_parents = 4, 776 + .ops = &clk_rcg2_ops, 777 + }, 778 + }; 779 + 780 + static const struct freq_tbl ftbl_gcc_usb30_prim_mock_utmi_clk_src[] = { 781 + F(19200000, P_BI_TCXO, 1, 0, 0), 782 + F(20000000, P_GPLL0_OUT_EVEN, 15, 0, 0), 783 + { } 784 + }; 785 + 786 + static struct clk_rcg2 gcc_usb30_prim_mock_utmi_clk_src = { 787 + .cmd_rcgr = 0xf034, 788 + .mnd_width = 0, 789 + .hid_width = 5, 790 + .parent_map = gcc_parent_map_0, 791 + .freq_tbl = ftbl_gcc_usb30_prim_mock_utmi_clk_src, 792 + .clkr.hw.init = &(struct clk_init_data){ 793 + .name = "gcc_usb30_prim_mock_utmi_clk_src", 794 + .parent_data = gcc_parent_data_0, 795 + .num_parents = 4, 796 + .ops = &clk_rcg2_ops, 797 + }, 798 + }; 799 + 800 + static const struct freq_tbl ftbl_gcc_usb3_prim_phy_aux_clk_src[] = { 801 + F(19200000, P_BI_TCXO, 1, 0, 0), 802 + { } 803 + }; 804 + 805 + static struct clk_rcg2 gcc_usb3_prim_phy_aux_clk_src = { 806 + .cmd_rcgr = 0xf060, 807 + .mnd_width = 0, 808 + .hid_width = 5, 809 + .parent_map = gcc_parent_map_6, 810 + .freq_tbl = ftbl_gcc_usb3_prim_phy_aux_clk_src, 811 + .clkr.hw.init = &(struct clk_init_data){ 812 + .name = "gcc_usb3_prim_phy_aux_clk_src", 813 + .parent_data = gcc_parent_data_6, 814 + .num_parents = 4, 815 + .ops = &clk_rcg2_ops, 816 + }, 817 + }; 818 + 819 + static struct clk_branch gcc_aggre_ufs_phy_axi_clk = { 820 + .halt_reg = 0x82024, 821 + .halt_check = BRANCH_HALT_DELAY, 822 + .hwcg_reg = 0x82024, 823 + .hwcg_bit = 1, 824 + .clkr = { 825 + .enable_reg = 0x82024, 826 + .enable_mask = BIT(0), 827 + .hw.init = &(struct clk_init_data){ 828 + .name = "gcc_aggre_ufs_phy_axi_clk", 829 + .parent_data = &(const struct clk_parent_data){ 830 + .hw = &gcc_ufs_phy_axi_clk_src.clkr.hw, 831 + }, 832 + .num_parents = 1, 833 + .flags = CLK_SET_RATE_PARENT, 834 + .ops = &clk_branch2_ops, 835 + }, 836 + }, 837 + }; 838 + 839 + static struct clk_branch gcc_aggre_usb3_prim_axi_clk = { 840 + .halt_reg = 0x8201c, 841 + .halt_check = BRANCH_HALT, 842 + .clkr = { 843 + .enable_reg = 0x8201c, 844 + .enable_mask = BIT(0), 845 + .hw.init = &(struct clk_init_data){ 846 + .name = "gcc_aggre_usb3_prim_axi_clk", 847 + .parent_data = &(const struct clk_parent_data){ 848 + .hw = &gcc_usb30_prim_master_clk_src.clkr.hw, 849 + }, 850 + .num_parents = 1, 851 + .flags = CLK_SET_RATE_PARENT, 852 + .ops = &clk_branch2_ops, 853 + }, 854 + }, 855 + }; 856 + 857 + static struct clk_branch gcc_boot_rom_ahb_clk = { 858 + .halt_reg = 0x38004, 859 + .halt_check = BRANCH_HALT_VOTED, 860 + .hwcg_reg = 0x38004, 861 + .hwcg_bit = 1, 862 + .clkr = { 863 + .enable_reg = 0x52000, 864 + .enable_mask = BIT(10), 865 + .hw.init = &(struct clk_init_data){ 866 + .name = "gcc_boot_rom_ahb_clk", 867 + .ops = &clk_branch2_ops, 868 + }, 869 + }, 870 + }; 871 + 872 + static struct clk_branch gcc_camera_ahb_clk = { 873 + .halt_reg = 0xb008, 874 + .halt_check = BRANCH_HALT, 875 + .hwcg_reg = 0xb008, 876 + .hwcg_bit = 1, 877 + .clkr = { 878 + .enable_reg = 0xb008, 879 + .enable_mask = BIT(0), 880 + .hw.init = &(struct clk_init_data){ 881 + .name = "gcc_camera_ahb_clk", 882 + .ops = &clk_branch2_ops, 883 + }, 884 + }, 885 + }; 886 + 887 + static struct clk_branch gcc_camera_hf_axi_clk = { 888 + .halt_reg = 0xb020, 889 + .halt_check = BRANCH_HALT, 890 + .clkr = { 891 + .enable_reg = 0xb020, 892 + .enable_mask = BIT(0), 893 + .hw.init = &(struct clk_init_data){ 894 + .name = "gcc_camera_hf_axi_clk", 895 + .ops = &clk_branch2_ops, 896 + }, 897 + }, 898 + }; 899 + 900 + static struct clk_branch gcc_camera_throttle_hf_axi_clk = { 901 + .halt_reg = 0xb080, 902 + .halt_check = BRANCH_HALT, 903 + .hwcg_reg = 0xb080, 904 + .hwcg_bit = 1, 905 + .clkr = { 906 + .enable_reg = 0xb080, 907 + .enable_mask = BIT(0), 908 + .hw.init = &(struct clk_init_data){ 909 + .name = "gcc_camera_throttle_hf_axi_clk", 910 + .ops = &clk_branch2_ops, 911 + }, 912 + }, 913 + }; 914 + 915 + static struct clk_branch gcc_camera_xo_clk = { 916 + .halt_reg = 0xb02c, 917 + .halt_check = BRANCH_HALT, 918 + .clkr = { 919 + .enable_reg = 0xb02c, 920 + .enable_mask = BIT(0), 921 + .hw.init = &(struct clk_init_data){ 922 + .name = "gcc_camera_xo_clk", 923 + .ops = &clk_branch2_ops, 924 + }, 925 + }, 926 + }; 927 + 928 + static struct clk_branch gcc_ce1_ahb_clk = { 929 + .halt_reg = 0x4100c, 930 + .halt_check = BRANCH_HALT_VOTED, 931 + .hwcg_reg = 0x4100c, 932 + .hwcg_bit = 1, 933 + .clkr = { 934 + .enable_reg = 0x52000, 935 + .enable_mask = BIT(3), 936 + .hw.init = &(struct clk_init_data){ 937 + .name = "gcc_ce1_ahb_clk", 938 + .ops = &clk_branch2_ops, 939 + }, 940 + }, 941 + }; 942 + 943 + static struct clk_branch gcc_ce1_axi_clk = { 944 + .halt_reg = 0x41008, 945 + .halt_check = BRANCH_HALT_VOTED, 946 + .clkr = { 947 + .enable_reg = 0x52000, 948 + .enable_mask = BIT(4), 949 + .hw.init = &(struct clk_init_data){ 950 + .name = "gcc_ce1_axi_clk", 951 + .ops = &clk_branch2_ops, 952 + }, 953 + }, 954 + }; 955 + 956 + static struct clk_branch gcc_ce1_clk = { 957 + .halt_reg = 0x41004, 958 + .halt_check = BRANCH_HALT_VOTED, 959 + .clkr = { 960 + .enable_reg = 0x52000, 961 + .enable_mask = BIT(5), 962 + .hw.init = &(struct clk_init_data){ 963 + .name = "gcc_ce1_clk", 964 + .ops = &clk_branch2_ops, 965 + }, 966 + }, 967 + }; 968 + 969 + static struct clk_branch gcc_cfg_noc_usb3_prim_axi_clk = { 970 + .halt_reg = 0x502c, 971 + .halt_check = BRANCH_HALT, 972 + .clkr = { 973 + .enable_reg = 0x502c, 974 + .enable_mask = BIT(0), 975 + .hw.init = &(struct clk_init_data){ 976 + .name = "gcc_cfg_noc_usb3_prim_axi_clk", 977 + .parent_data = &(const struct clk_parent_data){ 978 + .hw = &gcc_usb30_prim_master_clk_src.clkr.hw, 979 + }, 980 + .num_parents = 1, 981 + .flags = CLK_SET_RATE_PARENT, 982 + .ops = &clk_branch2_ops, 983 + }, 984 + }, 985 + }; 986 + 987 + /* For CPUSS functionality the AHB clock needs to be left enabled */ 988 + static struct clk_branch gcc_cpuss_ahb_clk = { 989 + .halt_reg = 0x48000, 990 + .halt_check = BRANCH_HALT_VOTED, 991 + .clkr = { 992 + .enable_reg = 0x52000, 993 + .enable_mask = BIT(21), 994 + .hw.init = &(struct clk_init_data){ 995 + .name = "gcc_cpuss_ahb_clk", 996 + .parent_data = &(const struct clk_parent_data){ 997 + .hw = &gcc_cpuss_ahb_clk_src.clkr.hw, 998 + }, 999 + .num_parents = 1, 1000 + .flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT, 1001 + .ops = &clk_branch2_ops, 1002 + }, 1003 + }, 1004 + }; 1005 + 1006 + static struct clk_branch gcc_cpuss_rbcpr_clk = { 1007 + .halt_reg = 0x48008, 1008 + .halt_check = BRANCH_HALT, 1009 + .clkr = { 1010 + .enable_reg = 0x48008, 1011 + .enable_mask = BIT(0), 1012 + .hw.init = &(struct clk_init_data){ 1013 + .name = "gcc_cpuss_rbcpr_clk", 1014 + .ops = &clk_branch2_ops, 1015 + }, 1016 + }, 1017 + }; 1018 + 1019 + static struct clk_branch gcc_ddrss_gpu_axi_clk = { 1020 + .halt_reg = 0x4452c, 1021 + .halt_check = BRANCH_VOTED, 1022 + .clkr = { 1023 + .enable_reg = 0x4452c, 1024 + .enable_mask = BIT(0), 1025 + .hw.init = &(struct clk_init_data){ 1026 + .name = "gcc_ddrss_gpu_axi_clk", 1027 + .ops = &clk_branch2_ops, 1028 + }, 1029 + }, 1030 + }; 1031 + 1032 + static struct clk_branch gcc_disp_gpll0_clk_src = { 1033 + .halt_check = BRANCH_HALT_DELAY, 1034 + .clkr = { 1035 + .enable_reg = 0x52000, 1036 + .enable_mask = BIT(18), 1037 + .hw.init = &(struct clk_init_data){ 1038 + .name = "gcc_disp_gpll0_clk_src", 1039 + .parent_data = &(const struct clk_parent_data){ 1040 + .hw = &gpll0.clkr.hw, 1041 + }, 1042 + .num_parents = 1, 1043 + .ops = &clk_branch2_ops, 1044 + }, 1045 + }, 1046 + }; 1047 + 1048 + static struct clk_branch gcc_disp_gpll0_div_clk_src = { 1049 + .halt_check = BRANCH_HALT_DELAY, 1050 + .clkr = { 1051 + .enable_reg = 0x52000, 1052 + .enable_mask = BIT(19), 1053 + .hw.init = &(struct clk_init_data){ 1054 + .name = "gcc_disp_gpll0_div_clk_src", 1055 + .parent_data = &(const struct clk_parent_data){ 1056 + .hw = &gcc_pll0_main_div_cdiv.hw, 1057 + }, 1058 + .num_parents = 1, 1059 + .ops = &clk_branch2_ops, 1060 + }, 1061 + }, 1062 + }; 1063 + 1064 + static struct clk_branch gcc_disp_hf_axi_clk = { 1065 + .halt_reg = 0xb024, 1066 + .halt_check = BRANCH_HALT, 1067 + .clkr = { 1068 + .enable_reg = 0xb024, 1069 + .enable_mask = BIT(0), 1070 + .hw.init = &(struct clk_init_data){ 1071 + .name = "gcc_disp_hf_axi_clk", 1072 + .ops = &clk_branch2_ops, 1073 + }, 1074 + }, 1075 + }; 1076 + 1077 + static struct clk_branch gcc_disp_throttle_hf_axi_clk = { 1078 + .halt_reg = 0xb084, 1079 + .halt_check = BRANCH_HALT, 1080 + .hwcg_reg = 0xb084, 1081 + .hwcg_bit = 1, 1082 + .clkr = { 1083 + .enable_reg = 0xb084, 1084 + .enable_mask = BIT(0), 1085 + .hw.init = &(struct clk_init_data){ 1086 + .name = "gcc_disp_throttle_hf_axi_clk", 1087 + .ops = &clk_branch2_ops, 1088 + }, 1089 + }, 1090 + }; 1091 + 1092 + static struct clk_branch gcc_disp_xo_clk = { 1093 + .halt_reg = 0xb030, 1094 + .halt_check = BRANCH_HALT, 1095 + .clkr = { 1096 + .enable_reg = 0xb030, 1097 + .enable_mask = BIT(0), 1098 + .hw.init = &(struct clk_init_data){ 1099 + .name = "gcc_disp_xo_clk", 1100 + .ops = &clk_branch2_ops, 1101 + }, 1102 + }, 1103 + }; 1104 + 1105 + static struct clk_branch gcc_gp1_clk = { 1106 + .halt_reg = 0x64000, 1107 + .halt_check = BRANCH_HALT, 1108 + .clkr = { 1109 + .enable_reg = 0x64000, 1110 + .enable_mask = BIT(0), 1111 + .hw.init = &(struct clk_init_data){ 1112 + .name = "gcc_gp1_clk", 1113 + .parent_data = &(const struct clk_parent_data){ 1114 + .hw = &gcc_gp1_clk_src.clkr.hw, 1115 + }, 1116 + .num_parents = 1, 1117 + .flags = CLK_SET_RATE_PARENT, 1118 + .ops = &clk_branch2_ops, 1119 + }, 1120 + }, 1121 + }; 1122 + 1123 + static struct clk_branch gcc_gp2_clk = { 1124 + .halt_reg = 0x65000, 1125 + .halt_check = BRANCH_HALT, 1126 + .clkr = { 1127 + .enable_reg = 0x65000, 1128 + .enable_mask = BIT(0), 1129 + .hw.init = &(struct clk_init_data){ 1130 + .name = "gcc_gp2_clk", 1131 + .parent_data = &(const struct clk_parent_data){ 1132 + .hw = &gcc_gp2_clk_src.clkr.hw, 1133 + }, 1134 + .num_parents = 1, 1135 + .flags = CLK_SET_RATE_PARENT, 1136 + .ops = &clk_branch2_ops, 1137 + }, 1138 + }, 1139 + }; 1140 + 1141 + static struct clk_branch gcc_gp3_clk = { 1142 + .halt_reg = 0x66000, 1143 + .halt_check = BRANCH_HALT, 1144 + .clkr = { 1145 + .enable_reg = 0x66000, 1146 + .enable_mask = BIT(0), 1147 + .hw.init = &(struct clk_init_data){ 1148 + .name = "gcc_gp3_clk", 1149 + .parent_data = &(const struct clk_parent_data){ 1150 + .hw = &gcc_gp3_clk_src.clkr.hw, 1151 + }, 1152 + .num_parents = 1, 1153 + .flags = CLK_SET_RATE_PARENT, 1154 + .ops = &clk_branch2_ops, 1155 + }, 1156 + }, 1157 + }; 1158 + 1159 + static struct clk_branch gcc_gpu_gpll0_clk_src = { 1160 + .halt_check = BRANCH_HALT_DELAY, 1161 + .clkr = { 1162 + .enable_reg = 0x52000, 1163 + .enable_mask = BIT(15), 1164 + .hw.init = &(struct clk_init_data){ 1165 + .name = "gcc_gpu_gpll0_clk_src", 1166 + .parent_data = &(const struct clk_parent_data){ 1167 + .hw = &gpll0.clkr.hw, 1168 + }, 1169 + .num_parents = 1, 1170 + .ops = &clk_branch2_ops, 1171 + }, 1172 + }, 1173 + }; 1174 + 1175 + static struct clk_branch gcc_gpu_gpll0_div_clk_src = { 1176 + .halt_check = BRANCH_HALT_DELAY, 1177 + .clkr = { 1178 + .enable_reg = 0x52000, 1179 + .enable_mask = BIT(16), 1180 + .hw.init = &(struct clk_init_data){ 1181 + .name = "gcc_gpu_gpll0_div_clk_src", 1182 + .parent_data = &(const struct clk_parent_data){ 1183 + .hw = &gcc_pll0_main_div_cdiv.hw, 1184 + }, 1185 + .num_parents = 1, 1186 + .ops = &clk_branch2_ops, 1187 + }, 1188 + }, 1189 + }; 1190 + 1191 + static struct clk_branch gcc_gpu_memnoc_gfx_clk = { 1192 + .halt_reg = 0x7100c, 1193 + .halt_check = BRANCH_VOTED, 1194 + .clkr = { 1195 + .enable_reg = 0x7100c, 1196 + .enable_mask = BIT(0), 1197 + .hw.init = &(struct clk_init_data){ 1198 + .name = "gcc_gpu_memnoc_gfx_clk", 1199 + .ops = &clk_branch2_ops, 1200 + }, 1201 + }, 1202 + }; 1203 + 1204 + static struct clk_branch gcc_gpu_snoc_dvm_gfx_clk = { 1205 + .halt_reg = 0x71018, 1206 + .halt_check = BRANCH_HALT, 1207 + .clkr = { 1208 + .enable_reg = 0x71018, 1209 + .enable_mask = BIT(0), 1210 + .hw.init = &(struct clk_init_data){ 1211 + .name = "gcc_gpu_snoc_dvm_gfx_clk", 1212 + .ops = &clk_branch2_ops, 1213 + }, 1214 + }, 1215 + }; 1216 + 1217 + static struct clk_branch gcc_npu_axi_clk = { 1218 + .halt_reg = 0x4d008, 1219 + .halt_check = BRANCH_HALT, 1220 + .clkr = { 1221 + .enable_reg = 0x4d008, 1222 + .enable_mask = BIT(0), 1223 + .hw.init = &(struct clk_init_data){ 1224 + .name = "gcc_npu_axi_clk", 1225 + .ops = &clk_branch2_ops, 1226 + }, 1227 + }, 1228 + }; 1229 + 1230 + static struct clk_branch gcc_npu_bwmon_axi_clk = { 1231 + .halt_reg = 0x73008, 1232 + .halt_check = BRANCH_HALT, 1233 + .clkr = { 1234 + .enable_reg = 0x73008, 1235 + .enable_mask = BIT(0), 1236 + .hw.init = &(struct clk_init_data){ 1237 + .name = "gcc_npu_bwmon_axi_clk", 1238 + .ops = &clk_branch2_ops, 1239 + }, 1240 + }, 1241 + }; 1242 + 1243 + static struct clk_branch gcc_npu_bwmon_dma_cfg_ahb_clk = { 1244 + .halt_reg = 0x73018, 1245 + .halt_check = BRANCH_HALT, 1246 + .clkr = { 1247 + .enable_reg = 0x73018, 1248 + .enable_mask = BIT(0), 1249 + .hw.init = &(struct clk_init_data){ 1250 + .name = "gcc_npu_bwmon_dma_cfg_ahb_clk", 1251 + .ops = &clk_branch2_ops, 1252 + }, 1253 + }, 1254 + }; 1255 + 1256 + static struct clk_branch gcc_npu_bwmon_dsp_cfg_ahb_clk = { 1257 + .halt_reg = 0x7301c, 1258 + .halt_check = BRANCH_HALT, 1259 + .clkr = { 1260 + .enable_reg = 0x7301c, 1261 + .enable_mask = BIT(0), 1262 + .hw.init = &(struct clk_init_data){ 1263 + .name = "gcc_npu_bwmon_dsp_cfg_ahb_clk", 1264 + .ops = &clk_branch2_ops, 1265 + }, 1266 + }, 1267 + }; 1268 + 1269 + static struct clk_branch gcc_npu_cfg_ahb_clk = { 1270 + .halt_reg = 0x4d004, 1271 + .halt_check = BRANCH_HALT, 1272 + .hwcg_reg = 0x4d004, 1273 + .hwcg_bit = 1, 1274 + .clkr = { 1275 + .enable_reg = 0x4d004, 1276 + .enable_mask = BIT(0), 1277 + .hw.init = &(struct clk_init_data){ 1278 + .name = "gcc_npu_cfg_ahb_clk", 1279 + .ops = &clk_branch2_ops, 1280 + }, 1281 + }, 1282 + }; 1283 + 1284 + static struct clk_branch gcc_npu_dma_clk = { 1285 + .halt_reg = 0x4d1a0, 1286 + .halt_check = BRANCH_HALT, 1287 + .hwcg_reg = 0x4d1a0, 1288 + .hwcg_bit = 1, 1289 + .clkr = { 1290 + .enable_reg = 0x4d1a0, 1291 + .enable_mask = BIT(0), 1292 + .hw.init = &(struct clk_init_data){ 1293 + .name = "gcc_npu_dma_clk", 1294 + .ops = &clk_branch2_ops, 1295 + }, 1296 + }, 1297 + }; 1298 + 1299 + static struct clk_branch gcc_npu_gpll0_clk_src = { 1300 + .halt_check = BRANCH_HALT_DELAY, 1301 + .clkr = { 1302 + .enable_reg = 0x52000, 1303 + .enable_mask = BIT(25), 1304 + .hw.init = &(struct clk_init_data){ 1305 + .name = "gcc_npu_gpll0_clk_src", 1306 + .parent_data = &(const struct clk_parent_data){ 1307 + .hw = &gpll0.clkr.hw, 1308 + }, 1309 + .num_parents = 1, 1310 + .ops = &clk_branch2_ops, 1311 + }, 1312 + }, 1313 + }; 1314 + 1315 + static struct clk_branch gcc_npu_gpll0_div_clk_src = { 1316 + .halt_check = BRANCH_HALT_DELAY, 1317 + .clkr = { 1318 + .enable_reg = 0x52000, 1319 + .enable_mask = BIT(26), 1320 + .hw.init = &(struct clk_init_data){ 1321 + .name = "gcc_npu_gpll0_div_clk_src", 1322 + .parent_data = &(const struct clk_parent_data){ 1323 + .hw = &gcc_pll0_main_div_cdiv.hw, 1324 + }, 1325 + .num_parents = 1, 1326 + .flags = CLK_SET_RATE_PARENT, 1327 + .ops = &clk_branch2_ops, 1328 + }, 1329 + }, 1330 + }; 1331 + 1332 + static struct clk_branch gcc_pdm2_clk = { 1333 + .halt_reg = 0x3300c, 1334 + .halt_check = BRANCH_HALT, 1335 + .clkr = { 1336 + .enable_reg = 0x3300c, 1337 + .enable_mask = BIT(0), 1338 + .hw.init = &(struct clk_init_data){ 1339 + .name = "gcc_pdm2_clk", 1340 + .parent_data = &(const struct clk_parent_data){ 1341 + .hw = &gcc_pdm2_clk_src.clkr.hw, 1342 + }, 1343 + .num_parents = 1, 1344 + .flags = CLK_SET_RATE_PARENT, 1345 + .ops = &clk_branch2_ops, 1346 + }, 1347 + }, 1348 + }; 1349 + 1350 + static struct clk_branch gcc_pdm_ahb_clk = { 1351 + .halt_reg = 0x33004, 1352 + .halt_check = BRANCH_HALT, 1353 + .hwcg_reg = 0x33004, 1354 + .hwcg_bit = 1, 1355 + .clkr = { 1356 + .enable_reg = 0x33004, 1357 + .enable_mask = BIT(0), 1358 + .hw.init = &(struct clk_init_data){ 1359 + .name = "gcc_pdm_ahb_clk", 1360 + .ops = &clk_branch2_ops, 1361 + }, 1362 + }, 1363 + }; 1364 + 1365 + static struct clk_branch gcc_pdm_xo4_clk = { 1366 + .halt_reg = 0x33008, 1367 + .halt_check = BRANCH_HALT, 1368 + .clkr = { 1369 + .enable_reg = 0x33008, 1370 + .enable_mask = BIT(0), 1371 + .hw.init = &(struct clk_init_data){ 1372 + .name = "gcc_pdm_xo4_clk", 1373 + .ops = &clk_branch2_ops, 1374 + }, 1375 + }, 1376 + }; 1377 + 1378 + static struct clk_branch gcc_prng_ahb_clk = { 1379 + .halt_reg = 0x34004, 1380 + .halt_check = BRANCH_HALT_VOTED, 1381 + .hwcg_reg = 0x34004, 1382 + .hwcg_bit = 1, 1383 + .clkr = { 1384 + .enable_reg = 0x52000, 1385 + .enable_mask = BIT(13), 1386 + .hw.init = &(struct clk_init_data){ 1387 + .name = "gcc_prng_ahb_clk", 1388 + .ops = &clk_branch2_ops, 1389 + }, 1390 + }, 1391 + }; 1392 + 1393 + static struct clk_branch gcc_qspi_cnoc_periph_ahb_clk = { 1394 + .halt_reg = 0x4b004, 1395 + .halt_check = BRANCH_HALT, 1396 + .hwcg_reg = 0x4b004, 1397 + .hwcg_bit = 1, 1398 + .clkr = { 1399 + .enable_reg = 0x4b004, 1400 + .enable_mask = BIT(0), 1401 + .hw.init = &(struct clk_init_data){ 1402 + .name = "gcc_qspi_cnoc_periph_ahb_clk", 1403 + .ops = &clk_branch2_ops, 1404 + }, 1405 + }, 1406 + }; 1407 + 1408 + static struct clk_branch gcc_qspi_core_clk = { 1409 + .halt_reg = 0x4b008, 1410 + .halt_check = BRANCH_HALT, 1411 + .clkr = { 1412 + .enable_reg = 0x4b008, 1413 + .enable_mask = BIT(0), 1414 + .hw.init = &(struct clk_init_data){ 1415 + .name = "gcc_qspi_core_clk", 1416 + .parent_data = &(const struct clk_parent_data){ 1417 + .hw = &gcc_qspi_core_clk_src.clkr.hw, 1418 + }, 1419 + .num_parents = 1, 1420 + .flags = CLK_SET_RATE_PARENT, 1421 + .ops = &clk_branch2_ops, 1422 + }, 1423 + }, 1424 + }; 1425 + 1426 + static struct clk_branch gcc_qupv3_wrap0_core_2x_clk = { 1427 + .halt_reg = 0x17014, 1428 + .halt_check = BRANCH_HALT_VOTED, 1429 + .clkr = { 1430 + .enable_reg = 0x52008, 1431 + .enable_mask = BIT(9), 1432 + .hw.init = &(struct clk_init_data){ 1433 + .name = "gcc_qupv3_wrap0_core_2x_clk", 1434 + .ops = &clk_branch2_ops, 1435 + }, 1436 + }, 1437 + }; 1438 + 1439 + static struct clk_branch gcc_qupv3_wrap0_core_clk = { 1440 + .halt_reg = 0x1700c, 1441 + .halt_check = BRANCH_HALT_VOTED, 1442 + .clkr = { 1443 + .enable_reg = 0x52008, 1444 + .enable_mask = BIT(8), 1445 + .hw.init = &(struct clk_init_data){ 1446 + .name = "gcc_qupv3_wrap0_core_clk", 1447 + .ops = &clk_branch2_ops, 1448 + }, 1449 + }, 1450 + }; 1451 + 1452 + static struct clk_branch gcc_qupv3_wrap0_s0_clk = { 1453 + .halt_reg = 0x17030, 1454 + .halt_check = BRANCH_HALT_VOTED, 1455 + .clkr = { 1456 + .enable_reg = 0x52008, 1457 + .enable_mask = BIT(10), 1458 + .hw.init = &(struct clk_init_data){ 1459 + .name = "gcc_qupv3_wrap0_s0_clk", 1460 + .parent_data = &(const struct clk_parent_data){ 1461 + .hw = &gcc_qupv3_wrap0_s0_clk_src.clkr.hw, 1462 + }, 1463 + .num_parents = 1, 1464 + .flags = CLK_SET_RATE_PARENT, 1465 + .ops = &clk_branch2_ops, 1466 + }, 1467 + }, 1468 + }; 1469 + 1470 + static struct clk_branch gcc_qupv3_wrap0_s1_clk = { 1471 + .halt_reg = 0x17160, 1472 + .halt_check = BRANCH_HALT_VOTED, 1473 + .clkr = { 1474 + .enable_reg = 0x52008, 1475 + .enable_mask = BIT(11), 1476 + .hw.init = &(struct clk_init_data){ 1477 + .name = "gcc_qupv3_wrap0_s1_clk", 1478 + .parent_data = &(const struct clk_parent_data){ 1479 + .hw = &gcc_qupv3_wrap0_s1_clk_src.clkr.hw, 1480 + }, 1481 + .num_parents = 1, 1482 + .flags = CLK_SET_RATE_PARENT, 1483 + .ops = &clk_branch2_ops, 1484 + }, 1485 + }, 1486 + }; 1487 + 1488 + static struct clk_branch gcc_qupv3_wrap0_s2_clk = { 1489 + .halt_reg = 0x17290, 1490 + .halt_check = BRANCH_HALT_VOTED, 1491 + .clkr = { 1492 + .enable_reg = 0x52008, 1493 + .enable_mask = BIT(12), 1494 + .hw.init = &(struct clk_init_data){ 1495 + .name = "gcc_qupv3_wrap0_s2_clk", 1496 + .parent_data = &(const struct clk_parent_data){ 1497 + .hw = &gcc_qupv3_wrap0_s2_clk_src.clkr.hw, 1498 + }, 1499 + .num_parents = 1, 1500 + .flags = CLK_SET_RATE_PARENT, 1501 + .ops = &clk_branch2_ops, 1502 + }, 1503 + }, 1504 + }; 1505 + 1506 + static struct clk_branch gcc_qupv3_wrap0_s3_clk = { 1507 + .halt_reg = 0x173c0, 1508 + .halt_check = BRANCH_HALT_VOTED, 1509 + .clkr = { 1510 + .enable_reg = 0x52008, 1511 + .enable_mask = BIT(13), 1512 + .hw.init = &(struct clk_init_data){ 1513 + .name = "gcc_qupv3_wrap0_s3_clk", 1514 + .parent_data = &(const struct clk_parent_data){ 1515 + .hw = &gcc_qupv3_wrap0_s3_clk_src.clkr.hw, 1516 + }, 1517 + .num_parents = 1, 1518 + .flags = CLK_SET_RATE_PARENT, 1519 + .ops = &clk_branch2_ops, 1520 + }, 1521 + }, 1522 + }; 1523 + 1524 + static struct clk_branch gcc_qupv3_wrap0_s4_clk = { 1525 + .halt_reg = 0x174f0, 1526 + .halt_check = BRANCH_HALT_VOTED, 1527 + .clkr = { 1528 + .enable_reg = 0x52008, 1529 + .enable_mask = BIT(14), 1530 + .hw.init = &(struct clk_init_data){ 1531 + .name = "gcc_qupv3_wrap0_s4_clk", 1532 + .parent_data = &(const struct clk_parent_data){ 1533 + .hw = &gcc_qupv3_wrap0_s4_clk_src.clkr.hw, 1534 + }, 1535 + .num_parents = 1, 1536 + .flags = CLK_SET_RATE_PARENT, 1537 + .ops = &clk_branch2_ops, 1538 + }, 1539 + }, 1540 + }; 1541 + 1542 + static struct clk_branch gcc_qupv3_wrap0_s5_clk = { 1543 + .halt_reg = 0x17620, 1544 + .halt_check = BRANCH_HALT_VOTED, 1545 + .clkr = { 1546 + .enable_reg = 0x52008, 1547 + .enable_mask = BIT(15), 1548 + .hw.init = &(struct clk_init_data){ 1549 + .name = "gcc_qupv3_wrap0_s5_clk", 1550 + .parent_data = &(const struct clk_parent_data){ 1551 + .hw = &gcc_qupv3_wrap0_s5_clk_src.clkr.hw, 1552 + }, 1553 + .num_parents = 1, 1554 + .flags = CLK_SET_RATE_PARENT, 1555 + .ops = &clk_branch2_ops, 1556 + }, 1557 + }, 1558 + }; 1559 + 1560 + static struct clk_branch gcc_qupv3_wrap1_core_2x_clk = { 1561 + .halt_reg = 0x18004, 1562 + .halt_check = BRANCH_HALT_VOTED, 1563 + .clkr = { 1564 + .enable_reg = 0x52008, 1565 + .enable_mask = BIT(18), 1566 + .hw.init = &(struct clk_init_data){ 1567 + .name = "gcc_qupv3_wrap1_core_2x_clk", 1568 + .ops = &clk_branch2_ops, 1569 + }, 1570 + }, 1571 + }; 1572 + 1573 + static struct clk_branch gcc_qupv3_wrap1_core_clk = { 1574 + .halt_reg = 0x18008, 1575 + .halt_check = BRANCH_HALT_VOTED, 1576 + .clkr = { 1577 + .enable_reg = 0x52008, 1578 + .enable_mask = BIT(19), 1579 + .hw.init = &(struct clk_init_data){ 1580 + .name = "gcc_qupv3_wrap1_core_clk", 1581 + .ops = &clk_branch2_ops, 1582 + }, 1583 + }, 1584 + }; 1585 + 1586 + static struct clk_branch gcc_qupv3_wrap1_s0_clk = { 1587 + .halt_reg = 0x18014, 1588 + .halt_check = BRANCH_HALT_VOTED, 1589 + .clkr = { 1590 + .enable_reg = 0x52008, 1591 + .enable_mask = BIT(22), 1592 + .hw.init = &(struct clk_init_data){ 1593 + .name = "gcc_qupv3_wrap1_s0_clk", 1594 + .parent_data = &(const struct clk_parent_data){ 1595 + .hw = &gcc_qupv3_wrap1_s0_clk_src.clkr.hw, 1596 + }, 1597 + .num_parents = 1, 1598 + .flags = CLK_SET_RATE_PARENT, 1599 + .ops = &clk_branch2_ops, 1600 + }, 1601 + }, 1602 + }; 1603 + 1604 + static struct clk_branch gcc_qupv3_wrap1_s1_clk = { 1605 + .halt_reg = 0x18144, 1606 + .halt_check = BRANCH_HALT_VOTED, 1607 + .clkr = { 1608 + .enable_reg = 0x52008, 1609 + .enable_mask = BIT(23), 1610 + .hw.init = &(struct clk_init_data){ 1611 + .name = "gcc_qupv3_wrap1_s1_clk", 1612 + .parent_data = &(const struct clk_parent_data){ 1613 + .hw = &gcc_qupv3_wrap1_s1_clk_src.clkr.hw, 1614 + }, 1615 + .num_parents = 1, 1616 + .flags = CLK_SET_RATE_PARENT, 1617 + .ops = &clk_branch2_ops, 1618 + }, 1619 + }, 1620 + }; 1621 + 1622 + static struct clk_branch gcc_qupv3_wrap1_s2_clk = { 1623 + .halt_reg = 0x18274, 1624 + .halt_check = BRANCH_HALT_VOTED, 1625 + .clkr = { 1626 + .enable_reg = 0x52008, 1627 + .enable_mask = BIT(24), 1628 + .hw.init = &(struct clk_init_data){ 1629 + .name = "gcc_qupv3_wrap1_s2_clk", 1630 + .parent_data = &(const struct clk_parent_data){ 1631 + .hw = &gcc_qupv3_wrap1_s2_clk_src.clkr.hw, 1632 + }, 1633 + .num_parents = 1, 1634 + .flags = CLK_SET_RATE_PARENT, 1635 + .ops = &clk_branch2_ops, 1636 + }, 1637 + }, 1638 + }; 1639 + 1640 + static struct clk_branch gcc_qupv3_wrap1_s3_clk = { 1641 + .halt_reg = 0x183a4, 1642 + .halt_check = BRANCH_HALT_VOTED, 1643 + .clkr = { 1644 + .enable_reg = 0x52008, 1645 + .enable_mask = BIT(25), 1646 + .hw.init = &(struct clk_init_data){ 1647 + .name = "gcc_qupv3_wrap1_s3_clk", 1648 + .parent_data = &(const struct clk_parent_data){ 1649 + .hw = &gcc_qupv3_wrap1_s3_clk_src.clkr.hw, 1650 + }, 1651 + .num_parents = 1, 1652 + .flags = CLK_SET_RATE_PARENT, 1653 + .ops = &clk_branch2_ops, 1654 + }, 1655 + }, 1656 + }; 1657 + 1658 + static struct clk_branch gcc_qupv3_wrap1_s4_clk = { 1659 + .halt_reg = 0x184d4, 1660 + .halt_check = BRANCH_HALT_VOTED, 1661 + .clkr = { 1662 + .enable_reg = 0x52008, 1663 + .enable_mask = BIT(26), 1664 + .hw.init = &(struct clk_init_data){ 1665 + .name = "gcc_qupv3_wrap1_s4_clk", 1666 + .parent_data = &(const struct clk_parent_data){ 1667 + .hw = &gcc_qupv3_wrap1_s4_clk_src.clkr.hw, 1668 + }, 1669 + .num_parents = 1, 1670 + .flags = CLK_SET_RATE_PARENT, 1671 + .ops = &clk_branch2_ops, 1672 + }, 1673 + }, 1674 + }; 1675 + 1676 + static struct clk_branch gcc_qupv3_wrap1_s5_clk = { 1677 + .halt_reg = 0x18604, 1678 + .halt_check = BRANCH_HALT_VOTED, 1679 + .clkr = { 1680 + .enable_reg = 0x52008, 1681 + .enable_mask = BIT(27), 1682 + .hw.init = &(struct clk_init_data){ 1683 + .name = "gcc_qupv3_wrap1_s5_clk", 1684 + .parent_data = &(const struct clk_parent_data){ 1685 + .hw = &gcc_qupv3_wrap1_s5_clk_src.clkr.hw, 1686 + }, 1687 + .num_parents = 1, 1688 + .flags = CLK_SET_RATE_PARENT, 1689 + .ops = &clk_branch2_ops, 1690 + }, 1691 + }, 1692 + }; 1693 + 1694 + static struct clk_branch gcc_qupv3_wrap_0_m_ahb_clk = { 1695 + .halt_reg = 0x17004, 1696 + .halt_check = BRANCH_HALT_VOTED, 1697 + .clkr = { 1698 + .enable_reg = 0x52008, 1699 + .enable_mask = BIT(6), 1700 + .hw.init = &(struct clk_init_data){ 1701 + .name = "gcc_qupv3_wrap_0_m_ahb_clk", 1702 + .ops = &clk_branch2_ops, 1703 + }, 1704 + }, 1705 + }; 1706 + 1707 + static struct clk_branch gcc_qupv3_wrap_0_s_ahb_clk = { 1708 + .halt_reg = 0x17008, 1709 + .halt_check = BRANCH_HALT_VOTED, 1710 + .hwcg_reg = 0x17008, 1711 + .hwcg_bit = 1, 1712 + .clkr = { 1713 + .enable_reg = 0x52008, 1714 + .enable_mask = BIT(7), 1715 + .hw.init = &(struct clk_init_data){ 1716 + .name = "gcc_qupv3_wrap_0_s_ahb_clk", 1717 + .ops = &clk_branch2_ops, 1718 + }, 1719 + }, 1720 + }; 1721 + 1722 + static struct clk_branch gcc_qupv3_wrap_1_m_ahb_clk = { 1723 + .halt_reg = 0x1800c, 1724 + .halt_check = BRANCH_HALT_VOTED, 1725 + .clkr = { 1726 + .enable_reg = 0x52008, 1727 + .enable_mask = BIT(20), 1728 + .hw.init = &(struct clk_init_data){ 1729 + .name = "gcc_qupv3_wrap_1_m_ahb_clk", 1730 + .ops = &clk_branch2_ops, 1731 + }, 1732 + }, 1733 + }; 1734 + 1735 + static struct clk_branch gcc_qupv3_wrap_1_s_ahb_clk = { 1736 + .halt_reg = 0x18010, 1737 + .halt_check = BRANCH_HALT_VOTED, 1738 + .hwcg_reg = 0x18010, 1739 + .hwcg_bit = 1, 1740 + .clkr = { 1741 + .enable_reg = 0x52008, 1742 + .enable_mask = BIT(21), 1743 + .hw.init = &(struct clk_init_data){ 1744 + .name = "gcc_qupv3_wrap_1_s_ahb_clk", 1745 + .ops = &clk_branch2_ops, 1746 + }, 1747 + }, 1748 + }; 1749 + 1750 + static struct clk_branch gcc_sdcc1_ahb_clk = { 1751 + .halt_reg = 0x12008, 1752 + .halt_check = BRANCH_HALT, 1753 + .clkr = { 1754 + .enable_reg = 0x12008, 1755 + .enable_mask = BIT(0), 1756 + .hw.init = &(struct clk_init_data){ 1757 + .name = "gcc_sdcc1_ahb_clk", 1758 + .ops = &clk_branch2_ops, 1759 + }, 1760 + }, 1761 + }; 1762 + 1763 + static struct clk_branch gcc_sdcc1_apps_clk = { 1764 + .halt_reg = 0x1200c, 1765 + .halt_check = BRANCH_HALT, 1766 + .clkr = { 1767 + .enable_reg = 0x1200c, 1768 + .enable_mask = BIT(0), 1769 + .hw.init = &(struct clk_init_data){ 1770 + .name = "gcc_sdcc1_apps_clk", 1771 + .parent_data = &(const struct clk_parent_data){ 1772 + .hw = &gcc_sdcc1_apps_clk_src.clkr.hw, 1773 + }, 1774 + .num_parents = 1, 1775 + .flags = CLK_SET_RATE_PARENT, 1776 + .ops = &clk_branch2_ops, 1777 + }, 1778 + }, 1779 + }; 1780 + 1781 + static struct clk_branch gcc_sdcc1_ice_core_clk = { 1782 + .halt_reg = 0x12040, 1783 + .halt_check = BRANCH_HALT, 1784 + .clkr = { 1785 + .enable_reg = 0x12040, 1786 + .enable_mask = BIT(0), 1787 + .hw.init = &(struct clk_init_data){ 1788 + .name = "gcc_sdcc1_ice_core_clk", 1789 + .parent_data = &(const struct clk_parent_data){ 1790 + .hw = &gcc_sdcc1_ice_core_clk_src.clkr.hw, 1791 + }, 1792 + .num_parents = 1, 1793 + .flags = CLK_SET_RATE_PARENT, 1794 + .ops = &clk_branch2_ops, 1795 + }, 1796 + }, 1797 + }; 1798 + 1799 + static struct clk_branch gcc_sdcc2_ahb_clk = { 1800 + .halt_reg = 0x14008, 1801 + .halt_check = BRANCH_HALT, 1802 + .clkr = { 1803 + .enable_reg = 0x14008, 1804 + .enable_mask = BIT(0), 1805 + .hw.init = &(struct clk_init_data){ 1806 + .name = "gcc_sdcc2_ahb_clk", 1807 + .ops = &clk_branch2_ops, 1808 + }, 1809 + }, 1810 + }; 1811 + 1812 + static struct clk_branch gcc_sdcc2_apps_clk = { 1813 + .halt_reg = 0x14004, 1814 + .halt_check = BRANCH_HALT, 1815 + .clkr = { 1816 + .enable_reg = 0x14004, 1817 + .enable_mask = BIT(0), 1818 + .hw.init = &(struct clk_init_data){ 1819 + .name = "gcc_sdcc2_apps_clk", 1820 + .parent_data = &(const struct clk_parent_data){ 1821 + .hw = &gcc_sdcc2_apps_clk_src.clkr.hw, 1822 + }, 1823 + .num_parents = 1, 1824 + .flags = CLK_SET_RATE_PARENT, 1825 + .ops = &clk_branch2_ops, 1826 + }, 1827 + }, 1828 + }; 1829 + 1830 + /* For CPUSS functionality the SYS NOC clock needs to be left enabled */ 1831 + static struct clk_branch gcc_sys_noc_cpuss_ahb_clk = { 1832 + .halt_reg = 0x4144, 1833 + .halt_check = BRANCH_HALT_VOTED, 1834 + .clkr = { 1835 + .enable_reg = 0x52000, 1836 + .enable_mask = BIT(0), 1837 + .hw.init = &(struct clk_init_data){ 1838 + .name = "gcc_sys_noc_cpuss_ahb_clk", 1839 + .parent_data = &(const struct clk_parent_data){ 1840 + .hw = &gcc_cpuss_ahb_clk_src.clkr.hw, 1841 + }, 1842 + .num_parents = 1, 1843 + .flags = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT, 1844 + .ops = &clk_branch2_ops, 1845 + }, 1846 + }, 1847 + }; 1848 + 1849 + static struct clk_branch gcc_ufs_mem_clkref_clk = { 1850 + .halt_reg = 0x8c000, 1851 + .halt_check = BRANCH_HALT, 1852 + .clkr = { 1853 + .enable_reg = 0x8c000, 1854 + .enable_mask = BIT(0), 1855 + .hw.init = &(struct clk_init_data){ 1856 + .name = "gcc_ufs_mem_clkref_clk", 1857 + .ops = &clk_branch2_ops, 1858 + }, 1859 + }, 1860 + }; 1861 + 1862 + static struct clk_branch gcc_ufs_phy_ahb_clk = { 1863 + .halt_reg = 0x77014, 1864 + .halt_check = BRANCH_HALT, 1865 + .hwcg_reg = 0x77014, 1866 + .hwcg_bit = 1, 1867 + .clkr = { 1868 + .enable_reg = 0x77014, 1869 + .enable_mask = BIT(0), 1870 + .hw.init = &(struct clk_init_data){ 1871 + .name = "gcc_ufs_phy_ahb_clk", 1872 + .ops = &clk_branch2_ops, 1873 + }, 1874 + }, 1875 + }; 1876 + 1877 + static struct clk_branch gcc_ufs_phy_axi_clk = { 1878 + .halt_reg = 0x77038, 1879 + .halt_check = BRANCH_HALT, 1880 + .hwcg_reg = 0x77038, 1881 + .hwcg_bit = 1, 1882 + .clkr = { 1883 + .enable_reg = 0x77038, 1884 + .enable_mask = BIT(0), 1885 + .hw.init = &(struct clk_init_data){ 1886 + .name = "gcc_ufs_phy_axi_clk", 1887 + .parent_data = &(const struct clk_parent_data){ 1888 + .hw = &gcc_ufs_phy_axi_clk_src.clkr.hw, 1889 + }, 1890 + .num_parents = 1, 1891 + .flags = CLK_SET_RATE_PARENT, 1892 + .ops = &clk_branch2_ops, 1893 + }, 1894 + }, 1895 + }; 1896 + 1897 + static struct clk_branch gcc_ufs_phy_ice_core_clk = { 1898 + .halt_reg = 0x77090, 1899 + .halt_check = BRANCH_HALT, 1900 + .hwcg_reg = 0x77090, 1901 + .hwcg_bit = 1, 1902 + .clkr = { 1903 + .enable_reg = 0x77090, 1904 + .enable_mask = BIT(0), 1905 + .hw.init = &(struct clk_init_data){ 1906 + .name = "gcc_ufs_phy_ice_core_clk", 1907 + .parent_data = &(const struct clk_parent_data){ 1908 + .hw = &gcc_ufs_phy_ice_core_clk_src.clkr.hw, 1909 + }, 1910 + .num_parents = 1, 1911 + .flags = CLK_SET_RATE_PARENT, 1912 + .ops = &clk_branch2_ops, 1913 + }, 1914 + }, 1915 + }; 1916 + 1917 + static struct clk_branch gcc_ufs_phy_phy_aux_clk = { 1918 + .halt_reg = 0x77094, 1919 + .halt_check = BRANCH_HALT, 1920 + .hwcg_reg = 0x77094, 1921 + .hwcg_bit = 1, 1922 + .clkr = { 1923 + .enable_reg = 0x77094, 1924 + .enable_mask = BIT(0), 1925 + .hw.init = &(struct clk_init_data){ 1926 + .name = "gcc_ufs_phy_phy_aux_clk", 1927 + .parent_data = &(const struct clk_parent_data){ 1928 + .hw = &gcc_ufs_phy_phy_aux_clk_src.clkr.hw, 1929 + }, 1930 + .num_parents = 1, 1931 + .flags = CLK_SET_RATE_PARENT, 1932 + .ops = &clk_branch2_ops, 1933 + }, 1934 + }, 1935 + }; 1936 + 1937 + static struct clk_branch gcc_ufs_phy_rx_symbol_0_clk = { 1938 + .halt_reg = 0x7701c, 1939 + .halt_check = BRANCH_HALT_SKIP, 1940 + .clkr = { 1941 + .enable_reg = 0x7701c, 1942 + .enable_mask = BIT(0), 1943 + .hw.init = &(struct clk_init_data){ 1944 + .name = "gcc_ufs_phy_rx_symbol_0_clk", 1945 + .ops = &clk_branch2_ops, 1946 + }, 1947 + }, 1948 + }; 1949 + 1950 + static struct clk_branch gcc_ufs_phy_tx_symbol_0_clk = { 1951 + .halt_reg = 0x77018, 1952 + .halt_check = BRANCH_HALT_SKIP, 1953 + .clkr = { 1954 + .enable_reg = 0x77018, 1955 + .enable_mask = BIT(0), 1956 + .hw.init = &(struct clk_init_data){ 1957 + .name = "gcc_ufs_phy_tx_symbol_0_clk", 1958 + .ops = &clk_branch2_ops, 1959 + }, 1960 + }, 1961 + }; 1962 + 1963 + static struct clk_branch gcc_ufs_phy_unipro_core_clk = { 1964 + .halt_reg = 0x7708c, 1965 + .halt_check = BRANCH_HALT, 1966 + .hwcg_reg = 0x7708c, 1967 + .hwcg_bit = 1, 1968 + .clkr = { 1969 + .enable_reg = 0x7708c, 1970 + .enable_mask = BIT(0), 1971 + .hw.init = &(struct clk_init_data){ 1972 + .name = "gcc_ufs_phy_unipro_core_clk", 1973 + .parent_data = &(const struct clk_parent_data){ 1974 + .hw = &gcc_ufs_phy_unipro_core_clk_src.clkr.hw, 1975 + }, 1976 + .num_parents = 1, 1977 + .flags = CLK_SET_RATE_PARENT, 1978 + .ops = &clk_branch2_ops, 1979 + }, 1980 + }, 1981 + }; 1982 + 1983 + static struct clk_branch gcc_usb30_prim_master_clk = { 1984 + .halt_reg = 0xf010, 1985 + .halt_check = BRANCH_HALT, 1986 + .clkr = { 1987 + .enable_reg = 0xf010, 1988 + .enable_mask = BIT(0), 1989 + .hw.init = &(struct clk_init_data){ 1990 + .name = "gcc_usb30_prim_master_clk", 1991 + .parent_data = &(const struct clk_parent_data){ 1992 + .hw = &gcc_usb30_prim_master_clk_src.clkr.hw, 1993 + }, 1994 + .num_parents = 1, 1995 + .flags = CLK_SET_RATE_PARENT, 1996 + .ops = &clk_branch2_ops, 1997 + }, 1998 + }, 1999 + }; 2000 + 2001 + static struct clk_branch gcc_usb30_prim_mock_utmi_clk = { 2002 + .halt_reg = 0xf018, 2003 + .halt_check = BRANCH_HALT, 2004 + .clkr = { 2005 + .enable_reg = 0xf018, 2006 + .enable_mask = BIT(0), 2007 + .hw.init = &(struct clk_init_data){ 2008 + .name = "gcc_usb30_prim_mock_utmi_clk", 2009 + .parent_data = &(const struct clk_parent_data){ 2010 + .hw = 2011 + &gcc_usb30_prim_mock_utmi_clk_src.clkr.hw, 2012 + }, 2013 + .num_parents = 1, 2014 + .flags = CLK_SET_RATE_PARENT, 2015 + .ops = &clk_branch2_ops, 2016 + }, 2017 + }, 2018 + }; 2019 + 2020 + static struct clk_branch gcc_usb30_prim_sleep_clk = { 2021 + .halt_reg = 0xf014, 2022 + .halt_check = BRANCH_HALT, 2023 + .clkr = { 2024 + .enable_reg = 0xf014, 2025 + .enable_mask = BIT(0), 2026 + .hw.init = &(struct clk_init_data){ 2027 + .name = "gcc_usb30_prim_sleep_clk", 2028 + .ops = &clk_branch2_ops, 2029 + }, 2030 + }, 2031 + }; 2032 + 2033 + static struct clk_branch gcc_usb3_prim_clkref_clk = { 2034 + .halt_reg = 0x8c010, 2035 + .halt_check = BRANCH_HALT, 2036 + .clkr = { 2037 + .enable_reg = 0x8c010, 2038 + .enable_mask = BIT(0), 2039 + .hw.init = &(struct clk_init_data){ 2040 + .name = "gcc_usb3_prim_clkref_clk", 2041 + .ops = &clk_branch2_ops, 2042 + }, 2043 + }, 2044 + }; 2045 + 2046 + static struct clk_branch gcc_usb3_prim_phy_aux_clk = { 2047 + .halt_reg = 0xf050, 2048 + .halt_check = BRANCH_HALT, 2049 + .clkr = { 2050 + .enable_reg = 0xf050, 2051 + .enable_mask = BIT(0), 2052 + .hw.init = &(struct clk_init_data){ 2053 + .name = "gcc_usb3_prim_phy_aux_clk", 2054 + .parent_data = &(const struct clk_parent_data){ 2055 + .hw = &gcc_usb3_prim_phy_aux_clk_src.clkr.hw, 2056 + }, 2057 + .num_parents = 1, 2058 + .flags = CLK_SET_RATE_PARENT, 2059 + .ops = &clk_branch2_ops, 2060 + }, 2061 + }, 2062 + }; 2063 + 2064 + static struct clk_branch gcc_usb3_prim_phy_com_aux_clk = { 2065 + .halt_reg = 0xf054, 2066 + .halt_check = BRANCH_HALT, 2067 + .clkr = { 2068 + .enable_reg = 0xf054, 2069 + .enable_mask = BIT(0), 2070 + .hw.init = &(struct clk_init_data){ 2071 + .name = "gcc_usb3_prim_phy_com_aux_clk", 2072 + .parent_data = &(const struct clk_parent_data){ 2073 + .hw = &gcc_usb3_prim_phy_aux_clk_src.clkr.hw, 2074 + }, 2075 + .num_parents = 1, 2076 + .flags = CLK_SET_RATE_PARENT, 2077 + .ops = &clk_branch2_ops, 2078 + }, 2079 + }, 2080 + }; 2081 + 2082 + static struct clk_branch gcc_usb3_prim_phy_pipe_clk = { 2083 + .halt_reg = 0xf058, 2084 + .halt_check = BRANCH_HALT_SKIP, 2085 + .clkr = { 2086 + .enable_reg = 0xf058, 2087 + .enable_mask = BIT(0), 2088 + .hw.init = &(struct clk_init_data){ 2089 + .name = "gcc_usb3_prim_phy_pipe_clk", 2090 + .ops = &clk_branch2_ops, 2091 + }, 2092 + }, 2093 + }; 2094 + 2095 + static struct clk_branch gcc_usb_phy_cfg_ahb2phy_clk = { 2096 + .halt_reg = 0x6a004, 2097 + .halt_check = BRANCH_HALT, 2098 + .hwcg_reg = 0x6a004, 2099 + .hwcg_bit = 1, 2100 + .clkr = { 2101 + .enable_reg = 0x6a004, 2102 + .enable_mask = BIT(0), 2103 + .hw.init = &(struct clk_init_data){ 2104 + .name = "gcc_usb_phy_cfg_ahb2phy_clk", 2105 + .ops = &clk_branch2_ops, 2106 + }, 2107 + }, 2108 + }; 2109 + 2110 + static struct clk_branch gcc_video_axi_clk = { 2111 + .halt_reg = 0xb01c, 2112 + .halt_check = BRANCH_HALT, 2113 + .clkr = { 2114 + .enable_reg = 0xb01c, 2115 + .enable_mask = BIT(0), 2116 + .hw.init = &(struct clk_init_data){ 2117 + .name = "gcc_video_axi_clk", 2118 + .ops = &clk_branch2_ops, 2119 + }, 2120 + }, 2121 + }; 2122 + 2123 + static struct clk_branch gcc_video_gpll0_div_clk_src = { 2124 + .halt_check = BRANCH_HALT_DELAY, 2125 + .clkr = { 2126 + .enable_reg = 0x52000, 2127 + .enable_mask = BIT(20), 2128 + .hw.init = &(struct clk_init_data){ 2129 + .name = "gcc_video_gpll0_div_clk_src", 2130 + .parent_data = &(const struct clk_parent_data){ 2131 + .hw = &gcc_pll0_main_div_cdiv.hw, 2132 + }, 2133 + .num_parents = 1, 2134 + .flags = CLK_SET_RATE_PARENT, 2135 + .ops = &clk_branch2_ops, 2136 + }, 2137 + }, 2138 + }; 2139 + 2140 + static struct clk_branch gcc_video_throttle_axi_clk = { 2141 + .halt_reg = 0xb07c, 2142 + .halt_check = BRANCH_HALT, 2143 + .hwcg_reg = 0xb07c, 2144 + .hwcg_bit = 1, 2145 + .clkr = { 2146 + .enable_reg = 0xb07c, 2147 + .enable_mask = BIT(0), 2148 + .hw.init = &(struct clk_init_data){ 2149 + .name = "gcc_video_throttle_axi_clk", 2150 + .ops = &clk_branch2_ops, 2151 + }, 2152 + }, 2153 + }; 2154 + 2155 + static struct clk_branch gcc_video_xo_clk = { 2156 + .halt_reg = 0xb028, 2157 + .halt_check = BRANCH_HALT, 2158 + .clkr = { 2159 + .enable_reg = 0xb028, 2160 + .enable_mask = BIT(0), 2161 + .hw.init = &(struct clk_init_data){ 2162 + .name = "gcc_video_xo_clk", 2163 + .ops = &clk_branch2_ops, 2164 + }, 2165 + }, 2166 + }; 2167 + 2168 + static struct gdsc ufs_phy_gdsc = { 2169 + .gdscr = 0x77004, 2170 + .pd = { 2171 + .name = "ufs_phy_gdsc", 2172 + }, 2173 + .pwrsts = PWRSTS_OFF_ON, 2174 + }; 2175 + 2176 + static struct gdsc usb30_prim_gdsc = { 2177 + .gdscr = 0x0f004, 2178 + .pd = { 2179 + .name = "usb30_prim_gdsc", 2180 + }, 2181 + .pwrsts = PWRSTS_OFF_ON, 2182 + }; 2183 + 2184 + static struct gdsc hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc = { 2185 + .gdscr = 0x7d040, 2186 + .pd = { 2187 + .name = "hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc", 2188 + }, 2189 + .pwrsts = PWRSTS_OFF_ON | VOTABLE, 2190 + }; 2191 + 2192 + static struct gdsc hlos1_vote_mmnoc_mmu_tbu_sf_gdsc = { 2193 + .gdscr = 0x7d044, 2194 + .pd = { 2195 + .name = "hlos1_vote_mmnoc_mmu_tbu_sf_gdsc", 2196 + }, 2197 + .pwrsts = PWRSTS_OFF_ON | VOTABLE, 2198 + }; 2199 + 2200 + static struct gdsc *gcc_sc7180_gdscs[] = { 2201 + [UFS_PHY_GDSC] = &ufs_phy_gdsc, 2202 + [USB30_PRIM_GDSC] = &usb30_prim_gdsc, 2203 + [HLOS1_VOTE_MMNOC_MMU_TBU_HF0_GDSC] = 2204 + &hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc, 2205 + [HLOS1_VOTE_MMNOC_MMU_TBU_SF_GDSC] = 2206 + &hlos1_vote_mmnoc_mmu_tbu_sf_gdsc, 2207 + }; 2208 + 2209 + 2210 + static struct clk_hw *gcc_sc7180_hws[] = { 2211 + [GCC_GPLL0_MAIN_DIV_CDIV] = &gcc_pll0_main_div_cdiv.hw, 2212 + }; 2213 + 2214 + static struct clk_regmap *gcc_sc7180_clocks[] = { 2215 + [GCC_AGGRE_UFS_PHY_AXI_CLK] = &gcc_aggre_ufs_phy_axi_clk.clkr, 2216 + [GCC_AGGRE_USB3_PRIM_AXI_CLK] = &gcc_aggre_usb3_prim_axi_clk.clkr, 2217 + [GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr, 2218 + [GCC_CAMERA_AHB_CLK] = &gcc_camera_ahb_clk.clkr, 2219 + [GCC_CAMERA_HF_AXI_CLK] = &gcc_camera_hf_axi_clk.clkr, 2220 + [GCC_CAMERA_THROTTLE_HF_AXI_CLK] = &gcc_camera_throttle_hf_axi_clk.clkr, 2221 + [GCC_CAMERA_XO_CLK] = &gcc_camera_xo_clk.clkr, 2222 + [GCC_CE1_AHB_CLK] = &gcc_ce1_ahb_clk.clkr, 2223 + [GCC_CE1_AXI_CLK] = &gcc_ce1_axi_clk.clkr, 2224 + [GCC_CE1_CLK] = &gcc_ce1_clk.clkr, 2225 + [GCC_CFG_NOC_USB3_PRIM_AXI_CLK] = &gcc_cfg_noc_usb3_prim_axi_clk.clkr, 2226 + [GCC_CPUSS_AHB_CLK] = &gcc_cpuss_ahb_clk.clkr, 2227 + [GCC_CPUSS_AHB_CLK_SRC] = &gcc_cpuss_ahb_clk_src.clkr, 2228 + [GCC_CPUSS_RBCPR_CLK] = &gcc_cpuss_rbcpr_clk.clkr, 2229 + [GCC_DDRSS_GPU_AXI_CLK] = &gcc_ddrss_gpu_axi_clk.clkr, 2230 + [GCC_DISP_GPLL0_CLK_SRC] = &gcc_disp_gpll0_clk_src.clkr, 2231 + [GCC_DISP_GPLL0_DIV_CLK_SRC] = &gcc_disp_gpll0_div_clk_src.clkr, 2232 + [GCC_DISP_HF_AXI_CLK] = &gcc_disp_hf_axi_clk.clkr, 2233 + [GCC_DISP_THROTTLE_HF_AXI_CLK] = &gcc_disp_throttle_hf_axi_clk.clkr, 2234 + [GCC_DISP_XO_CLK] = &gcc_disp_xo_clk.clkr, 2235 + [GCC_GP1_CLK] = &gcc_gp1_clk.clkr, 2236 + [GCC_GP1_CLK_SRC] = &gcc_gp1_clk_src.clkr, 2237 + [GCC_GP2_CLK] = &gcc_gp2_clk.clkr, 2238 + [GCC_GP2_CLK_SRC] = &gcc_gp2_clk_src.clkr, 2239 + [GCC_GP3_CLK] = &gcc_gp3_clk.clkr, 2240 + [GCC_GP3_CLK_SRC] = &gcc_gp3_clk_src.clkr, 2241 + [GCC_GPU_GPLL0_CLK_SRC] = &gcc_gpu_gpll0_clk_src.clkr, 2242 + [GCC_GPU_GPLL0_DIV_CLK_SRC] = &gcc_gpu_gpll0_div_clk_src.clkr, 2243 + [GCC_GPU_MEMNOC_GFX_CLK] = &gcc_gpu_memnoc_gfx_clk.clkr, 2244 + [GCC_GPU_SNOC_DVM_GFX_CLK] = &gcc_gpu_snoc_dvm_gfx_clk.clkr, 2245 + [GCC_NPU_AXI_CLK] = &gcc_npu_axi_clk.clkr, 2246 + [GCC_NPU_BWMON_AXI_CLK] = &gcc_npu_bwmon_axi_clk.clkr, 2247 + [GCC_NPU_BWMON_DMA_CFG_AHB_CLK] = &gcc_npu_bwmon_dma_cfg_ahb_clk.clkr, 2248 + [GCC_NPU_BWMON_DSP_CFG_AHB_CLK] = &gcc_npu_bwmon_dsp_cfg_ahb_clk.clkr, 2249 + [GCC_NPU_CFG_AHB_CLK] = &gcc_npu_cfg_ahb_clk.clkr, 2250 + [GCC_NPU_DMA_CLK] = &gcc_npu_dma_clk.clkr, 2251 + [GCC_NPU_GPLL0_CLK_SRC] = &gcc_npu_gpll0_clk_src.clkr, 2252 + [GCC_NPU_GPLL0_DIV_CLK_SRC] = &gcc_npu_gpll0_div_clk_src.clkr, 2253 + [GCC_PDM2_CLK] = &gcc_pdm2_clk.clkr, 2254 + [GCC_PDM2_CLK_SRC] = &gcc_pdm2_clk_src.clkr, 2255 + [GCC_PDM_AHB_CLK] = &gcc_pdm_ahb_clk.clkr, 2256 + [GCC_PDM_XO4_CLK] = &gcc_pdm_xo4_clk.clkr, 2257 + [GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr, 2258 + [GCC_QSPI_CNOC_PERIPH_AHB_CLK] = &gcc_qspi_cnoc_periph_ahb_clk.clkr, 2259 + [GCC_QSPI_CORE_CLK] = &gcc_qspi_core_clk.clkr, 2260 + [GCC_QSPI_CORE_CLK_SRC] = &gcc_qspi_core_clk_src.clkr, 2261 + [GCC_QUPV3_WRAP0_CORE_2X_CLK] = &gcc_qupv3_wrap0_core_2x_clk.clkr, 2262 + [GCC_QUPV3_WRAP0_CORE_CLK] = &gcc_qupv3_wrap0_core_clk.clkr, 2263 + [GCC_QUPV3_WRAP0_S0_CLK] = &gcc_qupv3_wrap0_s0_clk.clkr, 2264 + [GCC_QUPV3_WRAP0_S0_CLK_SRC] = &gcc_qupv3_wrap0_s0_clk_src.clkr, 2265 + [GCC_QUPV3_WRAP0_S1_CLK] = &gcc_qupv3_wrap0_s1_clk.clkr, 2266 + [GCC_QUPV3_WRAP0_S1_CLK_SRC] = &gcc_qupv3_wrap0_s1_clk_src.clkr, 2267 + [GCC_QUPV3_WRAP0_S2_CLK] = &gcc_qupv3_wrap0_s2_clk.clkr, 2268 + [GCC_QUPV3_WRAP0_S2_CLK_SRC] = &gcc_qupv3_wrap0_s2_clk_src.clkr, 2269 + [GCC_QUPV3_WRAP0_S3_CLK] = &gcc_qupv3_wrap0_s3_clk.clkr, 2270 + [GCC_QUPV3_WRAP0_S3_CLK_SRC] = &gcc_qupv3_wrap0_s3_clk_src.clkr, 2271 + [GCC_QUPV3_WRAP0_S4_CLK] = &gcc_qupv3_wrap0_s4_clk.clkr, 2272 + [GCC_QUPV3_WRAP0_S4_CLK_SRC] = &gcc_qupv3_wrap0_s4_clk_src.clkr, 2273 + [GCC_QUPV3_WRAP0_S5_CLK] = &gcc_qupv3_wrap0_s5_clk.clkr, 2274 + [GCC_QUPV3_WRAP0_S5_CLK_SRC] = &gcc_qupv3_wrap0_s5_clk_src.clkr, 2275 + [GCC_QUPV3_WRAP1_CORE_2X_CLK] = &gcc_qupv3_wrap1_core_2x_clk.clkr, 2276 + [GCC_QUPV3_WRAP1_CORE_CLK] = &gcc_qupv3_wrap1_core_clk.clkr, 2277 + [GCC_QUPV3_WRAP1_S0_CLK] = &gcc_qupv3_wrap1_s0_clk.clkr, 2278 + [GCC_QUPV3_WRAP1_S0_CLK_SRC] = &gcc_qupv3_wrap1_s0_clk_src.clkr, 2279 + [GCC_QUPV3_WRAP1_S1_CLK] = &gcc_qupv3_wrap1_s1_clk.clkr, 2280 + [GCC_QUPV3_WRAP1_S1_CLK_SRC] = &gcc_qupv3_wrap1_s1_clk_src.clkr, 2281 + [GCC_QUPV3_WRAP1_S2_CLK] = &gcc_qupv3_wrap1_s2_clk.clkr, 2282 + [GCC_QUPV3_WRAP1_S2_CLK_SRC] = &gcc_qupv3_wrap1_s2_clk_src.clkr, 2283 + [GCC_QUPV3_WRAP1_S3_CLK] = &gcc_qupv3_wrap1_s3_clk.clkr, 2284 + [GCC_QUPV3_WRAP1_S3_CLK_SRC] = &gcc_qupv3_wrap1_s3_clk_src.clkr, 2285 + [GCC_QUPV3_WRAP1_S4_CLK] = &gcc_qupv3_wrap1_s4_clk.clkr, 2286 + [GCC_QUPV3_WRAP1_S4_CLK_SRC] = &gcc_qupv3_wrap1_s4_clk_src.clkr, 2287 + [GCC_QUPV3_WRAP1_S5_CLK] = &gcc_qupv3_wrap1_s5_clk.clkr, 2288 + [GCC_QUPV3_WRAP1_S5_CLK_SRC] = &gcc_qupv3_wrap1_s5_clk_src.clkr, 2289 + [GCC_QUPV3_WRAP_0_M_AHB_CLK] = &gcc_qupv3_wrap_0_m_ahb_clk.clkr, 2290 + [GCC_QUPV3_WRAP_0_S_AHB_CLK] = &gcc_qupv3_wrap_0_s_ahb_clk.clkr, 2291 + [GCC_QUPV3_WRAP_1_M_AHB_CLK] = &gcc_qupv3_wrap_1_m_ahb_clk.clkr, 2292 + [GCC_QUPV3_WRAP_1_S_AHB_CLK] = &gcc_qupv3_wrap_1_s_ahb_clk.clkr, 2293 + [GCC_SDCC1_AHB_CLK] = &gcc_sdcc1_ahb_clk.clkr, 2294 + [GCC_SDCC1_APPS_CLK] = &gcc_sdcc1_apps_clk.clkr, 2295 + [GCC_SDCC1_APPS_CLK_SRC] = &gcc_sdcc1_apps_clk_src.clkr, 2296 + [GCC_SDCC1_ICE_CORE_CLK] = &gcc_sdcc1_ice_core_clk.clkr, 2297 + [GCC_SDCC1_ICE_CORE_CLK_SRC] = &gcc_sdcc1_ice_core_clk_src.clkr, 2298 + [GCC_SDCC2_AHB_CLK] = &gcc_sdcc2_ahb_clk.clkr, 2299 + [GCC_SDCC2_APPS_CLK] = &gcc_sdcc2_apps_clk.clkr, 2300 + [GCC_SDCC2_APPS_CLK_SRC] = &gcc_sdcc2_apps_clk_src.clkr, 2301 + [GCC_SYS_NOC_CPUSS_AHB_CLK] = &gcc_sys_noc_cpuss_ahb_clk.clkr, 2302 + [GCC_UFS_MEM_CLKREF_CLK] = &gcc_ufs_mem_clkref_clk.clkr, 2303 + [GCC_UFS_PHY_AHB_CLK] = &gcc_ufs_phy_ahb_clk.clkr, 2304 + [GCC_UFS_PHY_AXI_CLK] = &gcc_ufs_phy_axi_clk.clkr, 2305 + [GCC_UFS_PHY_AXI_CLK_SRC] = &gcc_ufs_phy_axi_clk_src.clkr, 2306 + [GCC_UFS_PHY_ICE_CORE_CLK] = &gcc_ufs_phy_ice_core_clk.clkr, 2307 + [GCC_UFS_PHY_ICE_CORE_CLK_SRC] = &gcc_ufs_phy_ice_core_clk_src.clkr, 2308 + [GCC_UFS_PHY_PHY_AUX_CLK] = &gcc_ufs_phy_phy_aux_clk.clkr, 2309 + [GCC_UFS_PHY_PHY_AUX_CLK_SRC] = &gcc_ufs_phy_phy_aux_clk_src.clkr, 2310 + [GCC_UFS_PHY_RX_SYMBOL_0_CLK] = &gcc_ufs_phy_rx_symbol_0_clk.clkr, 2311 + [GCC_UFS_PHY_TX_SYMBOL_0_CLK] = &gcc_ufs_phy_tx_symbol_0_clk.clkr, 2312 + [GCC_UFS_PHY_UNIPRO_CORE_CLK] = &gcc_ufs_phy_unipro_core_clk.clkr, 2313 + [GCC_UFS_PHY_UNIPRO_CORE_CLK_SRC] = 2314 + &gcc_ufs_phy_unipro_core_clk_src.clkr, 2315 + [GCC_USB30_PRIM_MASTER_CLK] = &gcc_usb30_prim_master_clk.clkr, 2316 + [GCC_USB30_PRIM_MASTER_CLK_SRC] = &gcc_usb30_prim_master_clk_src.clkr, 2317 + [GCC_USB30_PRIM_MOCK_UTMI_CLK] = &gcc_usb30_prim_mock_utmi_clk.clkr, 2318 + [GCC_USB30_PRIM_MOCK_UTMI_CLK_SRC] = 2319 + &gcc_usb30_prim_mock_utmi_clk_src.clkr, 2320 + [GCC_USB30_PRIM_SLEEP_CLK] = &gcc_usb30_prim_sleep_clk.clkr, 2321 + [GCC_USB3_PRIM_CLKREF_CLK] = &gcc_usb3_prim_clkref_clk.clkr, 2322 + [GCC_USB3_PRIM_PHY_AUX_CLK] = &gcc_usb3_prim_phy_aux_clk.clkr, 2323 + [GCC_USB3_PRIM_PHY_AUX_CLK_SRC] = &gcc_usb3_prim_phy_aux_clk_src.clkr, 2324 + [GCC_USB3_PRIM_PHY_COM_AUX_CLK] = &gcc_usb3_prim_phy_com_aux_clk.clkr, 2325 + [GCC_USB3_PRIM_PHY_PIPE_CLK] = &gcc_usb3_prim_phy_pipe_clk.clkr, 2326 + [GCC_USB_PHY_CFG_AHB2PHY_CLK] = &gcc_usb_phy_cfg_ahb2phy_clk.clkr, 2327 + [GCC_VIDEO_AXI_CLK] = &gcc_video_axi_clk.clkr, 2328 + [GCC_VIDEO_GPLL0_DIV_CLK_SRC] = &gcc_video_gpll0_div_clk_src.clkr, 2329 + [GCC_VIDEO_THROTTLE_AXI_CLK] = &gcc_video_throttle_axi_clk.clkr, 2330 + [GCC_VIDEO_XO_CLK] = &gcc_video_xo_clk.clkr, 2331 + [GPLL0] = &gpll0.clkr, 2332 + [GPLL0_OUT_EVEN] = &gpll0_out_even.clkr, 2333 + [GPLL6] = &gpll6.clkr, 2334 + [GPLL7] = &gpll7.clkr, 2335 + [GPLL4] = &gpll4.clkr, 2336 + [GPLL1] = &gpll1.clkr, 2337 + }; 2338 + 2339 + static const struct qcom_reset_map gcc_sc7180_resets[] = { 2340 + [GCC_QUSB2PHY_PRIM_BCR] = { 0x26000 }, 2341 + [GCC_QUSB2PHY_SEC_BCR] = { 0x26004 }, 2342 + [GCC_UFS_PHY_BCR] = { 0x77000 }, 2343 + [GCC_USB30_PRIM_BCR] = { 0xf000 }, 2344 + [GCC_USB3_PHY_PRIM_BCR] = { 0x50000 }, 2345 + [GCC_USB3PHY_PHY_PRIM_BCR] = { 0x50004 }, 2346 + [GCC_USB3_PHY_SEC_BCR] = { 0x5000c }, 2347 + [GCC_USB3_DP_PHY_PRIM_BCR] = { 0x50008 }, 2348 + [GCC_USB3PHY_PHY_SEC_BCR] = { 0x50010 }, 2349 + [GCC_USB3_DP_PHY_SEC_BCR] = { 0x50014 }, 2350 + [GCC_USB_PHY_CFG_AHB2PHY_BCR] = { 0x6a000 }, 2351 + }; 2352 + 2353 + static struct clk_rcg_dfs_data gcc_dfs_clocks[] = { 2354 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s0_clk_src), 2355 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s1_clk_src), 2356 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s2_clk_src), 2357 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s3_clk_src), 2358 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s4_clk_src), 2359 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s5_clk_src), 2360 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s0_clk_src), 2361 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s1_clk_src), 2362 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s2_clk_src), 2363 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s3_clk_src), 2364 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s4_clk_src), 2365 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s5_clk_src), 2366 + }; 2367 + 2368 + static const struct regmap_config gcc_sc7180_regmap_config = { 2369 + .reg_bits = 32, 2370 + .reg_stride = 4, 2371 + .val_bits = 32, 2372 + .max_register = 0x18208c, 2373 + .fast_io = true, 2374 + }; 2375 + 2376 + static const struct qcom_cc_desc gcc_sc7180_desc = { 2377 + .config = &gcc_sc7180_regmap_config, 2378 + .clk_hws = gcc_sc7180_hws, 2379 + .num_clk_hws = ARRAY_SIZE(gcc_sc7180_hws), 2380 + .clks = gcc_sc7180_clocks, 2381 + .num_clks = ARRAY_SIZE(gcc_sc7180_clocks), 2382 + .resets = gcc_sc7180_resets, 2383 + .num_resets = ARRAY_SIZE(gcc_sc7180_resets), 2384 + .gdscs = gcc_sc7180_gdscs, 2385 + .num_gdscs = ARRAY_SIZE(gcc_sc7180_gdscs), 2386 + }; 2387 + 2388 + static const struct of_device_id gcc_sc7180_match_table[] = { 2389 + { .compatible = "qcom,gcc-sc7180" }, 2390 + { } 2391 + }; 2392 + MODULE_DEVICE_TABLE(of, gcc_sc7180_match_table); 2393 + 2394 + static int gcc_sc7180_probe(struct platform_device *pdev) 2395 + { 2396 + struct regmap *regmap; 2397 + int ret; 2398 + 2399 + regmap = qcom_cc_map(pdev, &gcc_sc7180_desc); 2400 + if (IS_ERR(regmap)) 2401 + return PTR_ERR(regmap); 2402 + 2403 + /* 2404 + * Disable the GPLL0 active input to MM blocks, NPU 2405 + * and GPU via MISC registers. 2406 + */ 2407 + regmap_update_bits(regmap, 0x09ffc, 0x3, 0x3); 2408 + regmap_update_bits(regmap, 0x4d110, 0x3, 0x3); 2409 + regmap_update_bits(regmap, 0x71028, 0x3, 0x3); 2410 + 2411 + /* 2412 + * Keep the clocks always-ON 2413 + * GCC_CPUSS_GNOC_CLK, GCC_VIDEO_AHB_CLK, GCC_DISP_AHB_CLK 2414 + * GCC_GPU_CFG_AHB_CLK 2415 + */ 2416 + regmap_update_bits(regmap, 0x48004, BIT(0), BIT(0)); 2417 + regmap_update_bits(regmap, 0x0b004, BIT(0), BIT(0)); 2418 + regmap_update_bits(regmap, 0x0b00c, BIT(0), BIT(0)); 2419 + regmap_update_bits(regmap, 0x71004, BIT(0), BIT(0)); 2420 + 2421 + ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks, 2422 + ARRAY_SIZE(gcc_dfs_clocks)); 2423 + if (ret) 2424 + return ret; 2425 + 2426 + return qcom_cc_really_probe(pdev, &gcc_sc7180_desc, regmap); 2427 + } 2428 + 2429 + static struct platform_driver gcc_sc7180_driver = { 2430 + .probe = gcc_sc7180_probe, 2431 + .driver = { 2432 + .name = "gcc-sc7180", 2433 + .of_match_table = gcc_sc7180_match_table, 2434 + }, 2435 + }; 2436 + 2437 + static int __init gcc_sc7180_init(void) 2438 + { 2439 + return platform_driver_register(&gcc_sc7180_driver); 2440 + } 2441 + core_initcall(gcc_sc7180_init); 2442 + 2443 + static void __exit gcc_sc7180_exit(void) 2444 + { 2445 + platform_driver_unregister(&gcc_sc7180_driver); 2446 + } 2447 + module_exit(gcc_sc7180_exit); 2448 + 2449 + MODULE_DESCRIPTION("QTI GCC SC7180 Driver"); 2450 + MODULE_LICENSE("GPL v2");
+48 -48
drivers/clk/qcom/gcc-sdm845.c
··· 408 408 { } 409 409 }; 410 410 411 - static struct clk_init_data gcc_qupv3_wrap0_s0_clk_init = { 411 + static struct clk_init_data gcc_qupv3_wrap0_s0_clk_src_init = { 412 412 .name = "gcc_qupv3_wrap0_s0_clk_src", 413 413 .parent_names = gcc_parent_names_0, 414 414 .num_parents = 4, ··· 421 421 .hid_width = 5, 422 422 .parent_map = gcc_parent_map_0, 423 423 .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 424 - .clkr.hw.init = &gcc_qupv3_wrap0_s0_clk_init, 424 + .clkr.hw.init = &gcc_qupv3_wrap0_s0_clk_src_init, 425 425 }; 426 426 427 - static struct clk_init_data gcc_qupv3_wrap0_s1_clk_init = { 427 + static struct clk_init_data gcc_qupv3_wrap0_s1_clk_src_init = { 428 428 .name = "gcc_qupv3_wrap0_s1_clk_src", 429 429 .parent_names = gcc_parent_names_0, 430 430 .num_parents = 4, ··· 437 437 .hid_width = 5, 438 438 .parent_map = gcc_parent_map_0, 439 439 .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 440 - .clkr.hw.init = &gcc_qupv3_wrap0_s1_clk_init, 440 + .clkr.hw.init = &gcc_qupv3_wrap0_s1_clk_src_init, 441 441 }; 442 442 443 - static struct clk_init_data gcc_qupv3_wrap0_s2_clk_init = { 443 + static struct clk_init_data gcc_qupv3_wrap0_s2_clk_src_init = { 444 444 .name = "gcc_qupv3_wrap0_s2_clk_src", 445 445 .parent_names = gcc_parent_names_0, 446 446 .num_parents = 4, ··· 453 453 .hid_width = 5, 454 454 .parent_map = gcc_parent_map_0, 455 455 .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 456 - .clkr.hw.init = &gcc_qupv3_wrap0_s2_clk_init, 456 + .clkr.hw.init = &gcc_qupv3_wrap0_s2_clk_src_init, 457 457 }; 458 458 459 - static struct clk_init_data gcc_qupv3_wrap0_s3_clk_init = { 459 + static struct clk_init_data gcc_qupv3_wrap0_s3_clk_src_init = { 460 460 .name = "gcc_qupv3_wrap0_s3_clk_src", 461 461 .parent_names = gcc_parent_names_0, 462 462 .num_parents = 4, ··· 469 469 .hid_width = 5, 470 470 .parent_map = gcc_parent_map_0, 471 471 .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 472 - .clkr.hw.init = &gcc_qupv3_wrap0_s3_clk_init, 472 + .clkr.hw.init = &gcc_qupv3_wrap0_s3_clk_src_init, 473 473 }; 474 474 475 - static struct clk_init_data gcc_qupv3_wrap0_s4_clk_init = { 475 + static struct clk_init_data gcc_qupv3_wrap0_s4_clk_src_init = { 476 476 .name = "gcc_qupv3_wrap0_s4_clk_src", 477 477 .parent_names = gcc_parent_names_0, 478 478 .num_parents = 4, ··· 485 485 .hid_width = 5, 486 486 .parent_map = gcc_parent_map_0, 487 487 .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 488 - .clkr.hw.init = &gcc_qupv3_wrap0_s4_clk_init, 488 + .clkr.hw.init = &gcc_qupv3_wrap0_s4_clk_src_init, 489 489 }; 490 490 491 - static struct clk_init_data gcc_qupv3_wrap0_s5_clk_init = { 491 + static struct clk_init_data gcc_qupv3_wrap0_s5_clk_src_init = { 492 492 .name = "gcc_qupv3_wrap0_s5_clk_src", 493 493 .parent_names = gcc_parent_names_0, 494 494 .num_parents = 4, ··· 501 501 .hid_width = 5, 502 502 .parent_map = gcc_parent_map_0, 503 503 .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 504 - .clkr.hw.init = &gcc_qupv3_wrap0_s5_clk_init, 504 + .clkr.hw.init = &gcc_qupv3_wrap0_s5_clk_src_init, 505 505 }; 506 506 507 - static struct clk_init_data gcc_qupv3_wrap0_s6_clk_init = { 507 + static struct clk_init_data gcc_qupv3_wrap0_s6_clk_src_init = { 508 508 .name = "gcc_qupv3_wrap0_s6_clk_src", 509 509 .parent_names = gcc_parent_names_0, 510 510 .num_parents = 4, ··· 517 517 .hid_width = 5, 518 518 .parent_map = gcc_parent_map_0, 519 519 .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 520 - .clkr.hw.init = &gcc_qupv3_wrap0_s6_clk_init, 520 + .clkr.hw.init = &gcc_qupv3_wrap0_s6_clk_src_init, 521 521 }; 522 522 523 - static struct clk_init_data gcc_qupv3_wrap0_s7_clk_init = { 523 + static struct clk_init_data gcc_qupv3_wrap0_s7_clk_src_init = { 524 524 .name = "gcc_qupv3_wrap0_s7_clk_src", 525 525 .parent_names = gcc_parent_names_0, 526 526 .num_parents = 4, ··· 533 533 .hid_width = 5, 534 534 .parent_map = gcc_parent_map_0, 535 535 .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 536 - .clkr.hw.init = &gcc_qupv3_wrap0_s7_clk_init, 536 + .clkr.hw.init = &gcc_qupv3_wrap0_s7_clk_src_init, 537 537 }; 538 538 539 - static struct clk_init_data gcc_qupv3_wrap1_s0_clk_init = { 539 + static struct clk_init_data gcc_qupv3_wrap1_s0_clk_src_init = { 540 540 .name = "gcc_qupv3_wrap1_s0_clk_src", 541 541 .parent_names = gcc_parent_names_0, 542 542 .num_parents = 4, ··· 549 549 .hid_width = 5, 550 550 .parent_map = gcc_parent_map_0, 551 551 .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 552 - .clkr.hw.init = &gcc_qupv3_wrap1_s0_clk_init, 552 + .clkr.hw.init = &gcc_qupv3_wrap1_s0_clk_src_init, 553 553 }; 554 554 555 - static struct clk_init_data gcc_qupv3_wrap1_s1_clk_init = { 555 + static struct clk_init_data gcc_qupv3_wrap1_s1_clk_src_init = { 556 556 .name = "gcc_qupv3_wrap1_s1_clk_src", 557 557 .parent_names = gcc_parent_names_0, 558 558 .num_parents = 4, ··· 565 565 .hid_width = 5, 566 566 .parent_map = gcc_parent_map_0, 567 567 .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 568 - .clkr.hw.init = &gcc_qupv3_wrap1_s1_clk_init, 568 + .clkr.hw.init = &gcc_qupv3_wrap1_s1_clk_src_init, 569 569 }; 570 570 571 - static struct clk_init_data gcc_qupv3_wrap1_s2_clk_init = { 571 + static struct clk_init_data gcc_qupv3_wrap1_s2_clk_src_init = { 572 572 .name = "gcc_qupv3_wrap1_s2_clk_src", 573 573 .parent_names = gcc_parent_names_0, 574 574 .num_parents = 4, ··· 581 581 .hid_width = 5, 582 582 .parent_map = gcc_parent_map_0, 583 583 .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 584 - .clkr.hw.init = &gcc_qupv3_wrap1_s2_clk_init, 584 + .clkr.hw.init = &gcc_qupv3_wrap1_s2_clk_src_init, 585 585 }; 586 586 587 - static struct clk_init_data gcc_qupv3_wrap1_s3_clk_init = { 587 + static struct clk_init_data gcc_qupv3_wrap1_s3_clk_src_init = { 588 588 .name = "gcc_qupv3_wrap1_s3_clk_src", 589 589 .parent_names = gcc_parent_names_0, 590 590 .num_parents = 4, ··· 597 597 .hid_width = 5, 598 598 .parent_map = gcc_parent_map_0, 599 599 .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 600 - .clkr.hw.init = &gcc_qupv3_wrap1_s3_clk_init, 600 + .clkr.hw.init = &gcc_qupv3_wrap1_s3_clk_src_init, 601 601 }; 602 602 603 - static struct clk_init_data gcc_qupv3_wrap1_s4_clk_init = { 603 + static struct clk_init_data gcc_qupv3_wrap1_s4_clk_src_init = { 604 604 .name = "gcc_qupv3_wrap1_s4_clk_src", 605 605 .parent_names = gcc_parent_names_0, 606 606 .num_parents = 4, ··· 613 613 .hid_width = 5, 614 614 .parent_map = gcc_parent_map_0, 615 615 .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 616 - .clkr.hw.init = &gcc_qupv3_wrap1_s4_clk_init, 616 + .clkr.hw.init = &gcc_qupv3_wrap1_s4_clk_src_init, 617 617 }; 618 618 619 - static struct clk_init_data gcc_qupv3_wrap1_s5_clk_init = { 619 + static struct clk_init_data gcc_qupv3_wrap1_s5_clk_src_init = { 620 620 .name = "gcc_qupv3_wrap1_s5_clk_src", 621 621 .parent_names = gcc_parent_names_0, 622 622 .num_parents = 4, ··· 629 629 .hid_width = 5, 630 630 .parent_map = gcc_parent_map_0, 631 631 .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 632 - .clkr.hw.init = &gcc_qupv3_wrap1_s5_clk_init, 632 + .clkr.hw.init = &gcc_qupv3_wrap1_s5_clk_src_init, 633 633 }; 634 634 635 - static struct clk_init_data gcc_qupv3_wrap1_s6_clk_init = { 635 + static struct clk_init_data gcc_qupv3_wrap1_s6_clk_src_init = { 636 636 .name = "gcc_qupv3_wrap1_s6_clk_src", 637 637 .parent_names = gcc_parent_names_0, 638 638 .num_parents = 4, ··· 645 645 .hid_width = 5, 646 646 .parent_map = gcc_parent_map_0, 647 647 .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 648 - .clkr.hw.init = &gcc_qupv3_wrap1_s6_clk_init, 648 + .clkr.hw.init = &gcc_qupv3_wrap1_s6_clk_src_init, 649 649 }; 650 650 651 - static struct clk_init_data gcc_qupv3_wrap1_s7_clk_init = { 651 + static struct clk_init_data gcc_qupv3_wrap1_s7_clk_src_init = { 652 652 .name = "gcc_qupv3_wrap1_s7_clk_src", 653 653 .parent_names = gcc_parent_names_0, 654 654 .num_parents = 4, ··· 661 661 .hid_width = 5, 662 662 .parent_map = gcc_parent_map_0, 663 663 .freq_tbl = ftbl_gcc_qupv3_wrap0_s0_clk_src, 664 - .clkr.hw.init = &gcc_qupv3_wrap1_s7_clk_init, 664 + .clkr.hw.init = &gcc_qupv3_wrap1_s7_clk_src_init, 665 665 }; 666 666 667 667 static const struct freq_tbl ftbl_gcc_sdcc2_apps_clk_src[] = { ··· 3577 3577 MODULE_DEVICE_TABLE(of, gcc_sdm845_match_table); 3578 3578 3579 3579 static const struct clk_rcg_dfs_data gcc_dfs_clocks[] = { 3580 - DEFINE_RCG_DFS(gcc_qupv3_wrap0_s0_clk), 3581 - DEFINE_RCG_DFS(gcc_qupv3_wrap0_s1_clk), 3582 - DEFINE_RCG_DFS(gcc_qupv3_wrap0_s2_clk), 3583 - DEFINE_RCG_DFS(gcc_qupv3_wrap0_s3_clk), 3584 - DEFINE_RCG_DFS(gcc_qupv3_wrap0_s4_clk), 3585 - DEFINE_RCG_DFS(gcc_qupv3_wrap0_s5_clk), 3586 - DEFINE_RCG_DFS(gcc_qupv3_wrap0_s6_clk), 3587 - DEFINE_RCG_DFS(gcc_qupv3_wrap0_s7_clk), 3588 - DEFINE_RCG_DFS(gcc_qupv3_wrap1_s0_clk), 3589 - DEFINE_RCG_DFS(gcc_qupv3_wrap1_s1_clk), 3590 - DEFINE_RCG_DFS(gcc_qupv3_wrap1_s2_clk), 3591 - DEFINE_RCG_DFS(gcc_qupv3_wrap1_s3_clk), 3592 - DEFINE_RCG_DFS(gcc_qupv3_wrap1_s4_clk), 3593 - DEFINE_RCG_DFS(gcc_qupv3_wrap1_s5_clk), 3594 - DEFINE_RCG_DFS(gcc_qupv3_wrap1_s6_clk), 3595 - DEFINE_RCG_DFS(gcc_qupv3_wrap1_s7_clk), 3580 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s0_clk_src), 3581 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s1_clk_src), 3582 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s2_clk_src), 3583 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s3_clk_src), 3584 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s4_clk_src), 3585 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s5_clk_src), 3586 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s6_clk_src), 3587 + DEFINE_RCG_DFS(gcc_qupv3_wrap0_s7_clk_src), 3588 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s0_clk_src), 3589 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s1_clk_src), 3590 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s2_clk_src), 3591 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s3_clk_src), 3592 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s4_clk_src), 3593 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s5_clk_src), 3594 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s6_clk_src), 3595 + DEFINE_RCG_DFS(gcc_qupv3_wrap1_s7_clk_src), 3596 3596 }; 3597 3597 3598 3598 static int gcc_sdm845_probe(struct platform_device *pdev)
+338
drivers/clk/qcom/gpucc-msm8998.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Copyright (c) 2019, Jeffrey Hugo 4 + */ 5 + 6 + #include <linux/kernel.h> 7 + #include <linux/bitops.h> 8 + #include <linux/err.h> 9 + #include <linux/platform_device.h> 10 + #include <linux/module.h> 11 + #include <linux/of.h> 12 + #include <linux/of_device.h> 13 + #include <linux/clk-provider.h> 14 + #include <linux/regmap.h> 15 + #include <linux/reset-controller.h> 16 + 17 + #include <dt-bindings/clock/qcom,gpucc-msm8998.h> 18 + 19 + #include "common.h" 20 + #include "clk-regmap.h" 21 + #include "clk-regmap-divider.h" 22 + #include "clk-alpha-pll.h" 23 + #include "clk-rcg.h" 24 + #include "clk-branch.h" 25 + #include "reset.h" 26 + #include "gdsc.h" 27 + 28 + enum { 29 + P_XO, 30 + P_GPLL0, 31 + P_GPUPLL0_OUT_EVEN, 32 + }; 33 + 34 + /* Instead of going directly to the block, XO is routed through this branch */ 35 + static struct clk_branch gpucc_cxo_clk = { 36 + .halt_reg = 0x1020, 37 + .clkr = { 38 + .enable_reg = 0x1020, 39 + .enable_mask = BIT(0), 40 + .hw.init = &(struct clk_init_data){ 41 + .name = "gpucc_cxo_clk", 42 + .parent_data = &(const struct clk_parent_data){ 43 + .fw_name = "xo", 44 + .name = "xo" 45 + }, 46 + .num_parents = 1, 47 + .ops = &clk_branch2_ops, 48 + .flags = CLK_IS_CRITICAL, 49 + }, 50 + }, 51 + }; 52 + 53 + static const struct clk_div_table post_div_table_fabia_even[] = { 54 + { 0x0, 1 }, 55 + { 0x1, 2 }, 56 + { 0x3, 4 }, 57 + { 0x7, 8 }, 58 + { } 59 + }; 60 + 61 + static struct clk_alpha_pll gpupll0 = { 62 + .offset = 0x0, 63 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], 64 + .clkr.hw.init = &(struct clk_init_data){ 65 + .name = "gpupll0", 66 + .parent_hws = (const struct clk_hw *[]){ &gpucc_cxo_clk.clkr.hw }, 67 + .num_parents = 1, 68 + .ops = &clk_alpha_pll_fixed_fabia_ops, 69 + }, 70 + }; 71 + 72 + static struct clk_alpha_pll_postdiv gpupll0_out_even = { 73 + .offset = 0x0, 74 + .post_div_shift = 8, 75 + .post_div_table = post_div_table_fabia_even, 76 + .num_post_div = ARRAY_SIZE(post_div_table_fabia_even), 77 + .width = 4, 78 + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], 79 + .clkr.hw.init = &(struct clk_init_data){ 80 + .name = "gpupll0_out_even", 81 + .parent_hws = (const struct clk_hw *[]){ &gpupll0.clkr.hw }, 82 + .num_parents = 1, 83 + .ops = &clk_alpha_pll_postdiv_fabia_ops, 84 + }, 85 + }; 86 + 87 + static const struct parent_map gpu_xo_gpll0_map[] = { 88 + { P_XO, 0 }, 89 + { P_GPLL0, 5 }, 90 + }; 91 + 92 + static const struct clk_parent_data gpu_xo_gpll0[] = { 93 + { .hw = &gpucc_cxo_clk.clkr.hw }, 94 + { .fw_name = "gpll0", .name = "gpll0" }, 95 + }; 96 + 97 + static const struct parent_map gpu_xo_gpupll0_map[] = { 98 + { P_XO, 0 }, 99 + { P_GPUPLL0_OUT_EVEN, 1 }, 100 + }; 101 + 102 + static const struct clk_parent_data gpu_xo_gpupll0[] = { 103 + { .hw = &gpucc_cxo_clk.clkr.hw }, 104 + { .hw = &gpupll0_out_even.clkr.hw }, 105 + }; 106 + 107 + static const struct freq_tbl ftbl_rbcpr_clk_src[] = { 108 + F(19200000, P_XO, 1, 0, 0), 109 + F(50000000, P_GPLL0, 12, 0, 0), 110 + { } 111 + }; 112 + 113 + static struct clk_rcg2 rbcpr_clk_src = { 114 + .cmd_rcgr = 0x1030, 115 + .hid_width = 5, 116 + .parent_map = gpu_xo_gpll0_map, 117 + .freq_tbl = ftbl_rbcpr_clk_src, 118 + .clkr.hw.init = &(struct clk_init_data){ 119 + .name = "rbcpr_clk_src", 120 + .parent_data = gpu_xo_gpll0, 121 + .num_parents = 2, 122 + .ops = &clk_rcg2_ops, 123 + }, 124 + }; 125 + 126 + static const struct freq_tbl ftbl_gfx3d_clk_src[] = { 127 + { .src = P_GPUPLL0_OUT_EVEN, .pre_div = 3 }, 128 + { } 129 + }; 130 + 131 + static struct clk_rcg2 gfx3d_clk_src = { 132 + .cmd_rcgr = 0x1070, 133 + .hid_width = 5, 134 + .parent_map = gpu_xo_gpupll0_map, 135 + .freq_tbl = ftbl_gfx3d_clk_src, 136 + .clkr.hw.init = &(struct clk_init_data){ 137 + .name = "gfx3d_clk_src", 138 + .parent_data = gpu_xo_gpupll0, 139 + .num_parents = 2, 140 + .ops = &clk_rcg2_ops, 141 + .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE, 142 + }, 143 + }; 144 + 145 + static const struct freq_tbl ftbl_rbbmtimer_clk_src[] = { 146 + F(19200000, P_XO, 1, 0, 0), 147 + { } 148 + }; 149 + 150 + static struct clk_rcg2 rbbmtimer_clk_src = { 151 + .cmd_rcgr = 0x10b0, 152 + .hid_width = 5, 153 + .parent_map = gpu_xo_gpll0_map, 154 + .freq_tbl = ftbl_rbbmtimer_clk_src, 155 + .clkr.hw.init = &(struct clk_init_data){ 156 + .name = "rbbmtimer_clk_src", 157 + .parent_data = gpu_xo_gpll0, 158 + .num_parents = 2, 159 + .ops = &clk_rcg2_ops, 160 + }, 161 + }; 162 + 163 + static const struct freq_tbl ftbl_gfx3d_isense_clk_src[] = { 164 + F(19200000, P_XO, 1, 0, 0), 165 + F(40000000, P_GPLL0, 15, 0, 0), 166 + F(200000000, P_GPLL0, 3, 0, 0), 167 + F(300000000, P_GPLL0, 2, 0, 0), 168 + { } 169 + }; 170 + 171 + static struct clk_rcg2 gfx3d_isense_clk_src = { 172 + .cmd_rcgr = 0x1100, 173 + .hid_width = 5, 174 + .parent_map = gpu_xo_gpll0_map, 175 + .freq_tbl = ftbl_gfx3d_isense_clk_src, 176 + .clkr.hw.init = &(struct clk_init_data){ 177 + .name = "gfx3d_isense_clk_src", 178 + .parent_data = gpu_xo_gpll0, 179 + .num_parents = 2, 180 + .ops = &clk_rcg2_ops, 181 + }, 182 + }; 183 + 184 + static struct clk_branch rbcpr_clk = { 185 + .halt_reg = 0x1054, 186 + .clkr = { 187 + .enable_reg = 0x1054, 188 + .enable_mask = BIT(0), 189 + .hw.init = &(struct clk_init_data){ 190 + .name = "rbcpr_clk", 191 + .parent_hws = (const struct clk_hw *[]){ &rbcpr_clk_src.clkr.hw }, 192 + .num_parents = 1, 193 + .ops = &clk_branch2_ops, 194 + .flags = CLK_SET_RATE_PARENT, 195 + }, 196 + }, 197 + }; 198 + 199 + static struct clk_branch gfx3d_clk = { 200 + .halt_reg = 0x1098, 201 + .clkr = { 202 + .enable_reg = 0x1098, 203 + .enable_mask = BIT(0), 204 + .hw.init = &(struct clk_init_data){ 205 + .name = "gfx3d_clk", 206 + .parent_hws = (const struct clk_hw *[]){ &gfx3d_clk_src.clkr.hw }, 207 + .num_parents = 1, 208 + .ops = &clk_branch2_ops, 209 + .flags = CLK_SET_RATE_PARENT, 210 + }, 211 + }, 212 + }; 213 + 214 + static struct clk_branch rbbmtimer_clk = { 215 + .halt_reg = 0x10d0, 216 + .clkr = { 217 + .enable_reg = 0x10d0, 218 + .enable_mask = BIT(0), 219 + .hw.init = &(struct clk_init_data){ 220 + .name = "rbbmtimer_clk", 221 + .parent_hws = (const struct clk_hw *[]){ &rbbmtimer_clk_src.clkr.hw }, 222 + .num_parents = 1, 223 + .ops = &clk_branch2_ops, 224 + .flags = CLK_SET_RATE_PARENT, 225 + }, 226 + }, 227 + }; 228 + 229 + static struct clk_branch gfx3d_isense_clk = { 230 + .halt_reg = 0x1124, 231 + .clkr = { 232 + .enable_reg = 0x1124, 233 + .enable_mask = BIT(0), 234 + .hw.init = &(struct clk_init_data){ 235 + .name = "gfx3d_isense_clk", 236 + .parent_hws = (const struct clk_hw *[]){ &gfx3d_isense_clk_src.clkr.hw }, 237 + .num_parents = 1, 238 + .ops = &clk_branch2_ops, 239 + }, 240 + }, 241 + }; 242 + 243 + static struct gdsc gpu_cx_gdsc = { 244 + .gdscr = 0x1004, 245 + .pd = { 246 + .name = "gpu_cx", 247 + }, 248 + .pwrsts = PWRSTS_OFF_ON, 249 + }; 250 + 251 + static struct gdsc gpu_gx_gdsc = { 252 + .gdscr = 0x1094, 253 + .clamp_io_ctrl = 0x130, 254 + .pd = { 255 + .name = "gpu_gx", 256 + }, 257 + .parent = &gpu_cx_gdsc.pd, 258 + .pwrsts = PWRSTS_OFF_ON, 259 + .flags = CLAMP_IO | AON_RESET, 260 + }; 261 + 262 + static struct clk_regmap *gpucc_msm8998_clocks[] = { 263 + [GPUPLL0] = &gpupll0.clkr, 264 + [GPUPLL0_OUT_EVEN] = &gpupll0_out_even.clkr, 265 + [RBCPR_CLK_SRC] = &rbcpr_clk_src.clkr, 266 + [GFX3D_CLK_SRC] = &gfx3d_clk_src.clkr, 267 + [RBBMTIMER_CLK_SRC] = &rbbmtimer_clk_src.clkr, 268 + [GFX3D_ISENSE_CLK_SRC] = &gfx3d_isense_clk_src.clkr, 269 + [RBCPR_CLK] = &rbcpr_clk.clkr, 270 + [GFX3D_CLK] = &gfx3d_clk.clkr, 271 + [RBBMTIMER_CLK] = &rbbmtimer_clk.clkr, 272 + [GFX3D_ISENSE_CLK] = &gfx3d_isense_clk.clkr, 273 + [GPUCC_CXO_CLK] = &gpucc_cxo_clk.clkr, 274 + }; 275 + 276 + static struct gdsc *gpucc_msm8998_gdscs[] = { 277 + [GPU_CX_GDSC] = &gpu_cx_gdsc, 278 + [GPU_GX_GDSC] = &gpu_gx_gdsc, 279 + }; 280 + 281 + static const struct qcom_reset_map gpucc_msm8998_resets[] = { 282 + [GPU_CX_BCR] = { 0x1000 }, 283 + [RBCPR_BCR] = { 0x1050 }, 284 + [GPU_GX_BCR] = { 0x1090 }, 285 + [GPU_ISENSE_BCR] = { 0x1120 }, 286 + }; 287 + 288 + static const struct regmap_config gpucc_msm8998_regmap_config = { 289 + .reg_bits = 32, 290 + .reg_stride = 4, 291 + .val_bits = 32, 292 + .max_register = 0x9000, 293 + .fast_io = true, 294 + }; 295 + 296 + static const struct qcom_cc_desc gpucc_msm8998_desc = { 297 + .config = &gpucc_msm8998_regmap_config, 298 + .clks = gpucc_msm8998_clocks, 299 + .num_clks = ARRAY_SIZE(gpucc_msm8998_clocks), 300 + .resets = gpucc_msm8998_resets, 301 + .num_resets = ARRAY_SIZE(gpucc_msm8998_resets), 302 + .gdscs = gpucc_msm8998_gdscs, 303 + .num_gdscs = ARRAY_SIZE(gpucc_msm8998_gdscs), 304 + }; 305 + 306 + static const struct of_device_id gpucc_msm8998_match_table[] = { 307 + { .compatible = "qcom,msm8998-gpucc" }, 308 + { } 309 + }; 310 + MODULE_DEVICE_TABLE(of, gpucc_msm8998_match_table); 311 + 312 + static int gpucc_msm8998_probe(struct platform_device *pdev) 313 + { 314 + struct regmap *regmap; 315 + 316 + regmap = qcom_cc_map(pdev, &gpucc_msm8998_desc); 317 + if (IS_ERR(regmap)) 318 + return PTR_ERR(regmap); 319 + 320 + /* force periph logic on to avoid perf counter corruption */ 321 + regmap_write_bits(regmap, gfx3d_clk.clkr.enable_reg, BIT(13), BIT(13)); 322 + /* tweak droop detector (GPUCC_GPU_DD_WRAP_CTRL) to reduce leakage */ 323 + regmap_write_bits(regmap, gfx3d_clk.clkr.enable_reg, BIT(0), BIT(0)); 324 + 325 + return qcom_cc_really_probe(pdev, &gpucc_msm8998_desc, regmap); 326 + } 327 + 328 + static struct platform_driver gpucc_msm8998_driver = { 329 + .probe = gpucc_msm8998_probe, 330 + .driver = { 331 + .name = "gpucc-msm8998", 332 + .of_match_table = gpucc_msm8998_match_table, 333 + }, 334 + }; 335 + module_platform_driver(gpucc_msm8998_driver); 336 + 337 + MODULE_DESCRIPTION("QCOM GPUCC MSM8998 Driver"); 338 + MODULE_LICENSE("GPL v2");
+223
drivers/clk/qcom/q6sstop-qcs404.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Copyright (c) 2018, The Linux Foundation. All rights reserved. 4 + */ 5 + 6 + #include <linux/bitops.h> 7 + #include <linux/err.h> 8 + #include <linux/module.h> 9 + #include <linux/platform_device.h> 10 + #include <linux/pm_clock.h> 11 + #include <linux/pm_runtime.h> 12 + #include <linux/regmap.h> 13 + 14 + #include <dt-bindings/clock/qcom,q6sstopcc-qcs404.h> 15 + 16 + #include "clk-regmap.h" 17 + #include "clk-branch.h" 18 + #include "common.h" 19 + #include "reset.h" 20 + 21 + static struct clk_branch lcc_ahbfabric_cbc_clk = { 22 + .halt_reg = 0x1b004, 23 + .halt_check = BRANCH_HALT, 24 + .clkr = { 25 + .enable_reg = 0x1b004, 26 + .enable_mask = BIT(0), 27 + .hw.init = &(struct clk_init_data){ 28 + .name = "lcc_ahbfabric_cbc_clk", 29 + .ops = &clk_branch2_ops, 30 + }, 31 + }, 32 + }; 33 + 34 + static struct clk_branch lcc_q6ss_ahbs_cbc_clk = { 35 + .halt_reg = 0x22000, 36 + .halt_check = BRANCH_VOTED, 37 + .clkr = { 38 + .enable_reg = 0x22000, 39 + .enable_mask = BIT(0), 40 + .hw.init = &(struct clk_init_data){ 41 + .name = "lcc_q6ss_ahbs_cbc_clk", 42 + .ops = &clk_branch2_ops, 43 + }, 44 + }, 45 + }; 46 + 47 + static struct clk_branch lcc_q6ss_tcm_slave_cbc_clk = { 48 + .halt_reg = 0x1c000, 49 + .halt_check = BRANCH_VOTED, 50 + .clkr = { 51 + .enable_reg = 0x1c000, 52 + .enable_mask = BIT(0), 53 + .hw.init = &(struct clk_init_data){ 54 + .name = "lcc_q6ss_tcm_slave_cbc_clk", 55 + .ops = &clk_branch2_ops, 56 + }, 57 + }, 58 + }; 59 + 60 + static struct clk_branch lcc_q6ss_ahbm_cbc_clk = { 61 + .halt_reg = 0x22004, 62 + .halt_check = BRANCH_VOTED, 63 + .clkr = { 64 + .enable_reg = 0x22004, 65 + .enable_mask = BIT(0), 66 + .hw.init = &(struct clk_init_data){ 67 + .name = "lcc_q6ss_ahbm_cbc_clk", 68 + .ops = &clk_branch2_ops, 69 + }, 70 + }, 71 + }; 72 + 73 + static struct clk_branch lcc_q6ss_axim_cbc_clk = { 74 + .halt_reg = 0x1c004, 75 + .halt_check = BRANCH_VOTED, 76 + .clkr = { 77 + .enable_reg = 0x1c004, 78 + .enable_mask = BIT(0), 79 + .hw.init = &(struct clk_init_data){ 80 + .name = "lcc_q6ss_axim_cbc_clk", 81 + .ops = &clk_branch2_ops, 82 + }, 83 + }, 84 + }; 85 + 86 + static struct clk_branch lcc_q6ss_bcr_sleep_clk = { 87 + .halt_reg = 0x6004, 88 + .halt_check = BRANCH_VOTED, 89 + .clkr = { 90 + .enable_reg = 0x6004, 91 + .enable_mask = BIT(0), 92 + .hw.init = &(struct clk_init_data){ 93 + .name = "lcc_q6ss_bcr_sleep_clk", 94 + .ops = &clk_branch2_ops, 95 + }, 96 + }, 97 + }; 98 + 99 + /* TCSR clock */ 100 + static struct clk_branch tcsr_lcc_csr_cbcr_clk = { 101 + .halt_reg = 0x8008, 102 + .halt_check = BRANCH_VOTED, 103 + .clkr = { 104 + .enable_reg = 0x8008, 105 + .enable_mask = BIT(0), 106 + .hw.init = &(struct clk_init_data){ 107 + .name = "tcsr_lcc_csr_cbcr_clk", 108 + .ops = &clk_branch2_ops, 109 + }, 110 + }, 111 + }; 112 + 113 + static struct regmap_config q6sstop_regmap_config = { 114 + .reg_bits = 32, 115 + .reg_stride = 4, 116 + .val_bits = 32, 117 + .fast_io = true, 118 + }; 119 + 120 + static struct clk_regmap *q6sstop_qcs404_clocks[] = { 121 + [LCC_AHBFABRIC_CBC_CLK] = &lcc_ahbfabric_cbc_clk.clkr, 122 + [LCC_Q6SS_AHBS_CBC_CLK] = &lcc_q6ss_ahbs_cbc_clk.clkr, 123 + [LCC_Q6SS_TCM_SLAVE_CBC_CLK] = &lcc_q6ss_tcm_slave_cbc_clk.clkr, 124 + [LCC_Q6SS_AHBM_CBC_CLK] = &lcc_q6ss_ahbm_cbc_clk.clkr, 125 + [LCC_Q6SS_AXIM_CBC_CLK] = &lcc_q6ss_axim_cbc_clk.clkr, 126 + [LCC_Q6SS_BCR_SLEEP_CLK] = &lcc_q6ss_bcr_sleep_clk.clkr, 127 + }; 128 + 129 + static const struct qcom_reset_map q6sstop_qcs404_resets[] = { 130 + [Q6SSTOP_BCR_RESET] = { 0x6000 }, 131 + }; 132 + 133 + static const struct qcom_cc_desc q6sstop_qcs404_desc = { 134 + .config = &q6sstop_regmap_config, 135 + .clks = q6sstop_qcs404_clocks, 136 + .num_clks = ARRAY_SIZE(q6sstop_qcs404_clocks), 137 + .resets = q6sstop_qcs404_resets, 138 + .num_resets = ARRAY_SIZE(q6sstop_qcs404_resets), 139 + }; 140 + 141 + static struct clk_regmap *tcsr_qcs404_clocks[] = { 142 + [TCSR_Q6SS_LCC_CBCR_CLK] = &tcsr_lcc_csr_cbcr_clk.clkr, 143 + }; 144 + 145 + static const struct qcom_cc_desc tcsr_qcs404_desc = { 146 + .config = &q6sstop_regmap_config, 147 + .clks = tcsr_qcs404_clocks, 148 + .num_clks = ARRAY_SIZE(tcsr_qcs404_clocks), 149 + }; 150 + 151 + static const struct of_device_id q6sstopcc_qcs404_match_table[] = { 152 + { .compatible = "qcom,qcs404-q6sstopcc" }, 153 + { } 154 + }; 155 + MODULE_DEVICE_TABLE(of, q6sstopcc_qcs404_match_table); 156 + 157 + static int q6sstopcc_qcs404_probe(struct platform_device *pdev) 158 + { 159 + const struct qcom_cc_desc *desc; 160 + int ret; 161 + 162 + pm_runtime_enable(&pdev->dev); 163 + ret = pm_clk_create(&pdev->dev); 164 + if (ret) 165 + goto disable_pm_runtime; 166 + 167 + ret = pm_clk_add(&pdev->dev, NULL); 168 + if (ret < 0) { 169 + dev_err(&pdev->dev, "failed to acquire iface clock\n"); 170 + goto destroy_pm_clk; 171 + } 172 + 173 + q6sstop_regmap_config.name = "q6sstop_tcsr"; 174 + desc = &tcsr_qcs404_desc; 175 + 176 + ret = qcom_cc_probe_by_index(pdev, 1, desc); 177 + if (ret) 178 + goto destroy_pm_clk; 179 + 180 + q6sstop_regmap_config.name = "q6sstop_cc"; 181 + desc = &q6sstop_qcs404_desc; 182 + 183 + ret = qcom_cc_probe_by_index(pdev, 0, desc); 184 + if (ret) 185 + goto destroy_pm_clk; 186 + 187 + return 0; 188 + 189 + destroy_pm_clk: 190 + pm_clk_destroy(&pdev->dev); 191 + 192 + disable_pm_runtime: 193 + pm_runtime_disable(&pdev->dev); 194 + 195 + return ret; 196 + } 197 + 198 + static int q6sstopcc_qcs404_remove(struct platform_device *pdev) 199 + { 200 + pm_clk_destroy(&pdev->dev); 201 + pm_runtime_disable(&pdev->dev); 202 + 203 + return 0; 204 + } 205 + 206 + static const struct dev_pm_ops q6sstopcc_pm_ops = { 207 + SET_RUNTIME_PM_OPS(pm_clk_suspend, pm_clk_resume, NULL) 208 + }; 209 + 210 + static struct platform_driver q6sstopcc_qcs404_driver = { 211 + .probe = q6sstopcc_qcs404_probe, 212 + .remove = q6sstopcc_qcs404_remove, 213 + .driver = { 214 + .name = "qcs404-q6sstopcc", 215 + .of_match_table = q6sstopcc_qcs404_match_table, 216 + .pm = &q6sstopcc_pm_ops, 217 + }, 218 + }; 219 + 220 + module_platform_driver(q6sstopcc_qcs404_driver); 221 + 222 + MODULE_DESCRIPTION("QTI QCS404 Q6SSTOP Clock Controller Driver"); 223 + MODULE_LICENSE("GPL v2");
+12 -22
drivers/clk/renesas/Kconfig
··· 12 12 select CLK_R8A7745 if ARCH_R8A7745 13 13 select CLK_R8A77470 if ARCH_R8A77470 14 14 select CLK_R8A774A1 if ARCH_R8A774A1 15 + select CLK_R8A774B1 if ARCH_R8A774B1 15 16 select CLK_R8A774C0 if ARCH_R8A774C0 16 17 select CLK_R8A7778 if ARCH_R8A7778 17 18 select CLK_R8A7779 if ARCH_R8A7779 ··· 21 20 select CLK_R8A7792 if ARCH_R8A7792 22 21 select CLK_R8A7794 if ARCH_R8A7794 23 22 select CLK_R8A7795 if ARCH_R8A7795 24 - select CLK_R8A7796 if ARCH_R8A7796 23 + select CLK_R8A77960 if ARCH_R8A77960 || ARCH_R8A7796 24 + select CLK_R8A77961 if ARCH_R8A77961 25 25 select CLK_R8A77965 if ARCH_R8A77965 26 26 select CLK_R8A77970 if ARCH_R8A77970 27 27 select CLK_R8A77980 if ARCH_R8A77980 ··· 32 30 select CLK_SH73A0 if ARCH_SH73A0 33 31 34 32 if CLK_RENESAS 35 - 36 - config CLK_RENESAS_LEGACY 37 - bool "Legacy DT clock support" 38 - depends on CLK_R8A7790 || CLK_R8A7791 || CLK_R8A7792 || CLK_R8A7794 39 - help 40 - Enable backward compatibility with old device trees describing a 41 - hierarchical representation of the various CPG and MSTP clocks. 42 - 43 - Say Y if you want your kernel to work with old DTBs. 44 - It is safe to say N if you use the DTS that is supplied with the 45 - current kernel source tree. 46 33 47 34 # SoC 48 35 config CLK_EMEV2 ··· 71 80 bool "RZ/G2M clock support" if COMPILE_TEST 72 81 select CLK_RCAR_GEN3_CPG 73 82 83 + config CLK_R8A774B1 84 + bool "RZ/G2N clock support" if COMPILE_TEST 85 + select CLK_RCAR_GEN3_CPG 86 + 74 87 config CLK_R8A774C0 75 88 bool "RZ/G2E clock support" if COMPILE_TEST 76 89 select CLK_RCAR_GEN3_CPG ··· 89 94 90 95 config CLK_R8A7790 91 96 bool "R-Car H2 clock support" if COMPILE_TEST 92 - select CLK_RCAR_GEN2 if CLK_RENESAS_LEGACY 93 97 select CLK_RCAR_GEN2_CPG 94 98 select CLK_RENESAS_DIV6 95 99 96 100 config CLK_R8A7791 97 101 bool "R-Car M2-W/N clock support" if COMPILE_TEST 98 - select CLK_RCAR_GEN2 if CLK_RENESAS_LEGACY 99 102 select CLK_RCAR_GEN2_CPG 100 103 select CLK_RENESAS_DIV6 101 104 102 105 config CLK_R8A7792 103 106 bool "R-Car V2H clock support" if COMPILE_TEST 104 - select CLK_RCAR_GEN2 if CLK_RENESAS_LEGACY 105 107 select CLK_RCAR_GEN2_CPG 106 108 107 109 config CLK_R8A7794 108 110 bool "R-Car E2 clock support" if COMPILE_TEST 109 - select CLK_RCAR_GEN2 if CLK_RENESAS_LEGACY 110 111 select CLK_RCAR_GEN2_CPG 111 112 select CLK_RENESAS_DIV6 112 113 ··· 110 119 bool "R-Car H3 clock support" if COMPILE_TEST 111 120 select CLK_RCAR_GEN3_CPG 112 121 113 - config CLK_R8A7796 122 + config CLK_R8A77960 114 123 bool "R-Car M3-W clock support" if COMPILE_TEST 124 + select CLK_RCAR_GEN3_CPG 125 + 126 + config CLK_R8A77961 127 + bool "R-Car M3-W+ clock support" if COMPILE_TEST 115 128 select CLK_RCAR_GEN3_CPG 116 129 117 130 config CLK_R8A77965 ··· 150 155 151 156 152 157 # Family 153 - config CLK_RCAR_GEN2 154 - bool "R-Car Gen2 legacy clock support" if COMPILE_TEST 155 - select CLK_RENESAS_CPG_MSTP 156 - select CLK_RENESAS_DIV6 157 - 158 158 config CLK_RCAR_GEN2_CPG 159 159 bool "R-Car Gen2 CPG clock support" if COMPILE_TEST 160 160 select CLK_RENESAS_CPG_MSSR
+3 -2
drivers/clk/renesas/Makefile
··· 9 9 obj-$(CONFIG_CLK_R8A7745) += r8a7745-cpg-mssr.o 10 10 obj-$(CONFIG_CLK_R8A77470) += r8a77470-cpg-mssr.o 11 11 obj-$(CONFIG_CLK_R8A774A1) += r8a774a1-cpg-mssr.o 12 + obj-$(CONFIG_CLK_R8A774B1) += r8a774b1-cpg-mssr.o 12 13 obj-$(CONFIG_CLK_R8A774C0) += r8a774c0-cpg-mssr.o 13 14 obj-$(CONFIG_CLK_R8A7778) += clk-r8a7778.o 14 15 obj-$(CONFIG_CLK_R8A7779) += clk-r8a7779.o ··· 18 17 obj-$(CONFIG_CLK_R8A7792) += r8a7792-cpg-mssr.o 19 18 obj-$(CONFIG_CLK_R8A7794) += r8a7794-cpg-mssr.o 20 19 obj-$(CONFIG_CLK_R8A7795) += r8a7795-cpg-mssr.o 21 - obj-$(CONFIG_CLK_R8A7796) += r8a7796-cpg-mssr.o 20 + obj-$(CONFIG_CLK_R8A77960) += r8a7796-cpg-mssr.o 21 + obj-$(CONFIG_CLK_R8A77961) += r8a7796-cpg-mssr.o 22 22 obj-$(CONFIG_CLK_R8A77965) += r8a77965-cpg-mssr.o 23 23 obj-$(CONFIG_CLK_R8A77970) += r8a77970-cpg-mssr.o 24 24 obj-$(CONFIG_CLK_R8A77980) += r8a77980-cpg-mssr.o ··· 29 27 obj-$(CONFIG_CLK_SH73A0) += clk-sh73a0.o 30 28 31 29 # Family 32 - obj-$(CONFIG_CLK_RCAR_GEN2) += clk-rcar-gen2.o 33 30 obj-$(CONFIG_CLK_RCAR_GEN2_CPG) += rcar-gen2-cpg.o 34 31 obj-$(CONFIG_CLK_RCAR_GEN3_CPG) += rcar-gen3-cpg.o 35 32 obj-$(CONFIG_CLK_RCAR_USB2_CLOCK_SEL) += rcar-usb2-clock-sel.o
+1 -3
drivers/clk/renesas/clk-mstp.c
··· 189 189 unsigned int i; 190 190 191 191 group = kzalloc(struct_size(group, clks, MSTP_MAX_CLOCKS), GFP_KERNEL); 192 - if (group == NULL) { 193 - kfree(group); 192 + if (!group) 194 193 return; 195 - } 196 194 197 195 clks = group->clks; 198 196 spin_lock_init(&group->lock);
-457
drivers/clk/renesas/clk-rcar-gen2.c
··· 1 - // SPDX-License-Identifier: GPL-2.0 2 - /* 3 - * rcar_gen2 Core CPG Clocks 4 - * 5 - * Copyright (C) 2013 Ideas On Board SPRL 6 - * 7 - * Contact: Laurent Pinchart <laurent.pinchart@ideasonboard.com> 8 - */ 9 - 10 - #include <linux/clk-provider.h> 11 - #include <linux/clk/renesas.h> 12 - #include <linux/init.h> 13 - #include <linux/io.h> 14 - #include <linux/kernel.h> 15 - #include <linux/math64.h> 16 - #include <linux/of.h> 17 - #include <linux/of_address.h> 18 - #include <linux/slab.h> 19 - #include <linux/spinlock.h> 20 - #include <linux/soc/renesas/rcar-rst.h> 21 - 22 - struct rcar_gen2_cpg { 23 - struct clk_onecell_data data; 24 - spinlock_t lock; 25 - void __iomem *reg; 26 - }; 27 - 28 - #define CPG_FRQCRB 0x00000004 29 - #define CPG_FRQCRB_KICK BIT(31) 30 - #define CPG_SDCKCR 0x00000074 31 - #define CPG_PLL0CR 0x000000d8 32 - #define CPG_FRQCRC 0x000000e0 33 - #define CPG_FRQCRC_ZFC_MASK (0x1f << 8) 34 - #define CPG_FRQCRC_ZFC_SHIFT 8 35 - #define CPG_ADSPCKCR 0x0000025c 36 - #define CPG_RCANCKCR 0x00000270 37 - 38 - /* ----------------------------------------------------------------------------- 39 - * Z Clock 40 - * 41 - * Traits of this clock: 42 - * prepare - clk_prepare only ensures that parents are prepared 43 - * enable - clk_enable only ensures that parents are enabled 44 - * rate - rate is adjustable. clk->rate = parent->rate * mult / 32 45 - * parent - fixed parent. No clk_set_parent support 46 - */ 47 - 48 - struct cpg_z_clk { 49 - struct clk_hw hw; 50 - void __iomem *reg; 51 - void __iomem *kick_reg; 52 - }; 53 - 54 - #define to_z_clk(_hw) container_of(_hw, struct cpg_z_clk, hw) 55 - 56 - static unsigned long cpg_z_clk_recalc_rate(struct clk_hw *hw, 57 - unsigned long parent_rate) 58 - { 59 - struct cpg_z_clk *zclk = to_z_clk(hw); 60 - unsigned int mult; 61 - unsigned int val; 62 - 63 - val = (readl(zclk->reg) & CPG_FRQCRC_ZFC_MASK) >> CPG_FRQCRC_ZFC_SHIFT; 64 - mult = 32 - val; 65 - 66 - return div_u64((u64)parent_rate * mult, 32); 67 - } 68 - 69 - static long cpg_z_clk_round_rate(struct clk_hw *hw, unsigned long rate, 70 - unsigned long *parent_rate) 71 - { 72 - unsigned long prate = *parent_rate; 73 - unsigned int mult; 74 - 75 - if (!prate) 76 - prate = 1; 77 - 78 - mult = div_u64((u64)rate * 32, prate); 79 - mult = clamp(mult, 1U, 32U); 80 - 81 - return *parent_rate / 32 * mult; 82 - } 83 - 84 - static int cpg_z_clk_set_rate(struct clk_hw *hw, unsigned long rate, 85 - unsigned long parent_rate) 86 - { 87 - struct cpg_z_clk *zclk = to_z_clk(hw); 88 - unsigned int mult; 89 - u32 val, kick; 90 - unsigned int i; 91 - 92 - mult = div_u64((u64)rate * 32, parent_rate); 93 - mult = clamp(mult, 1U, 32U); 94 - 95 - if (readl(zclk->kick_reg) & CPG_FRQCRB_KICK) 96 - return -EBUSY; 97 - 98 - val = readl(zclk->reg); 99 - val &= ~CPG_FRQCRC_ZFC_MASK; 100 - val |= (32 - mult) << CPG_FRQCRC_ZFC_SHIFT; 101 - writel(val, zclk->reg); 102 - 103 - /* 104 - * Set KICK bit in FRQCRB to update hardware setting and wait for 105 - * clock change completion. 106 - */ 107 - kick = readl(zclk->kick_reg); 108 - kick |= CPG_FRQCRB_KICK; 109 - writel(kick, zclk->kick_reg); 110 - 111 - /* 112 - * Note: There is no HW information about the worst case latency. 113 - * 114 - * Using experimental measurements, it seems that no more than 115 - * ~10 iterations are needed, independently of the CPU rate. 116 - * Since this value might be dependent on external xtal rate, pll1 117 - * rate or even the other emulation clocks rate, use 1000 as a 118 - * "super" safe value. 119 - */ 120 - for (i = 1000; i; i--) { 121 - if (!(readl(zclk->kick_reg) & CPG_FRQCRB_KICK)) 122 - return 0; 123 - 124 - cpu_relax(); 125 - } 126 - 127 - return -ETIMEDOUT; 128 - } 129 - 130 - static const struct clk_ops cpg_z_clk_ops = { 131 - .recalc_rate = cpg_z_clk_recalc_rate, 132 - .round_rate = cpg_z_clk_round_rate, 133 - .set_rate = cpg_z_clk_set_rate, 134 - }; 135 - 136 - static struct clk * __init cpg_z_clk_register(struct rcar_gen2_cpg *cpg) 137 - { 138 - static const char *parent_name = "pll0"; 139 - struct clk_init_data init; 140 - struct cpg_z_clk *zclk; 141 - struct clk *clk; 142 - 143 - zclk = kzalloc(sizeof(*zclk), GFP_KERNEL); 144 - if (!zclk) 145 - return ERR_PTR(-ENOMEM); 146 - 147 - init.name = "z"; 148 - init.ops = &cpg_z_clk_ops; 149 - init.flags = 0; 150 - init.parent_names = &parent_name; 151 - init.num_parents = 1; 152 - 153 - zclk->reg = cpg->reg + CPG_FRQCRC; 154 - zclk->kick_reg = cpg->reg + CPG_FRQCRB; 155 - zclk->hw.init = &init; 156 - 157 - clk = clk_register(NULL, &zclk->hw); 158 - if (IS_ERR(clk)) 159 - kfree(zclk); 160 - 161 - return clk; 162 - } 163 - 164 - static struct clk * __init cpg_rcan_clk_register(struct rcar_gen2_cpg *cpg, 165 - struct device_node *np) 166 - { 167 - const char *parent_name = of_clk_get_parent_name(np, 1); 168 - struct clk_fixed_factor *fixed; 169 - struct clk_gate *gate; 170 - struct clk *clk; 171 - 172 - fixed = kzalloc(sizeof(*fixed), GFP_KERNEL); 173 - if (!fixed) 174 - return ERR_PTR(-ENOMEM); 175 - 176 - fixed->mult = 1; 177 - fixed->div = 6; 178 - 179 - gate = kzalloc(sizeof(*gate), GFP_KERNEL); 180 - if (!gate) { 181 - kfree(fixed); 182 - return ERR_PTR(-ENOMEM); 183 - } 184 - 185 - gate->reg = cpg->reg + CPG_RCANCKCR; 186 - gate->bit_idx = 8; 187 - gate->flags = CLK_GATE_SET_TO_DISABLE; 188 - gate->lock = &cpg->lock; 189 - 190 - clk = clk_register_composite(NULL, "rcan", &parent_name, 1, NULL, NULL, 191 - &fixed->hw, &clk_fixed_factor_ops, 192 - &gate->hw, &clk_gate_ops, 0); 193 - if (IS_ERR(clk)) { 194 - kfree(gate); 195 - kfree(fixed); 196 - } 197 - 198 - return clk; 199 - } 200 - 201 - /* ADSP divisors */ 202 - static const struct clk_div_table cpg_adsp_div_table[] = { 203 - { 1, 3 }, { 2, 4 }, { 3, 6 }, { 4, 8 }, 204 - { 5, 12 }, { 6, 16 }, { 7, 18 }, { 8, 24 }, 205 - { 10, 36 }, { 11, 48 }, { 0, 0 }, 206 - }; 207 - 208 - static struct clk * __init cpg_adsp_clk_register(struct rcar_gen2_cpg *cpg) 209 - { 210 - const char *parent_name = "pll1"; 211 - struct clk_divider *div; 212 - struct clk_gate *gate; 213 - struct clk *clk; 214 - 215 - div = kzalloc(sizeof(*div), GFP_KERNEL); 216 - if (!div) 217 - return ERR_PTR(-ENOMEM); 218 - 219 - div->reg = cpg->reg + CPG_ADSPCKCR; 220 - div->width = 4; 221 - div->table = cpg_adsp_div_table; 222 - div->lock = &cpg->lock; 223 - 224 - gate = kzalloc(sizeof(*gate), GFP_KERNEL); 225 - if (!gate) { 226 - kfree(div); 227 - return ERR_PTR(-ENOMEM); 228 - } 229 - 230 - gate->reg = cpg->reg + CPG_ADSPCKCR; 231 - gate->bit_idx = 8; 232 - gate->flags = CLK_GATE_SET_TO_DISABLE; 233 - gate->lock = &cpg->lock; 234 - 235 - clk = clk_register_composite(NULL, "adsp", &parent_name, 1, NULL, NULL, 236 - &div->hw, &clk_divider_ops, 237 - &gate->hw, &clk_gate_ops, 0); 238 - if (IS_ERR(clk)) { 239 - kfree(gate); 240 - kfree(div); 241 - } 242 - 243 - return clk; 244 - } 245 - 246 - /* ----------------------------------------------------------------------------- 247 - * CPG Clock Data 248 - */ 249 - 250 - /* 251 - * MD EXTAL PLL0 PLL1 PLL3 252 - * 14 13 19 (MHz) *1 *1 253 - *--------------------------------------------------- 254 - * 0 0 0 15 x 1 x172/2 x208/2 x106 255 - * 0 0 1 15 x 1 x172/2 x208/2 x88 256 - * 0 1 0 20 x 1 x130/2 x156/2 x80 257 - * 0 1 1 20 x 1 x130/2 x156/2 x66 258 - * 1 0 0 26 / 2 x200/2 x240/2 x122 259 - * 1 0 1 26 / 2 x200/2 x240/2 x102 260 - * 1 1 0 30 / 2 x172/2 x208/2 x106 261 - * 1 1 1 30 / 2 x172/2 x208/2 x88 262 - * 263 - * *1 : Table 7.6 indicates VCO output (PLLx = VCO/2) 264 - */ 265 - #define CPG_PLL_CONFIG_INDEX(md) ((((md) & BIT(14)) >> 12) | \ 266 - (((md) & BIT(13)) >> 12) | \ 267 - (((md) & BIT(19)) >> 19)) 268 - struct cpg_pll_config { 269 - unsigned int extal_div; 270 - unsigned int pll1_mult; 271 - unsigned int pll3_mult; 272 - unsigned int pll0_mult; /* For R-Car V2H and E2 only */ 273 - }; 274 - 275 - static const struct cpg_pll_config cpg_pll_configs[8] __initconst = { 276 - { 1, 208, 106, 200 }, { 1, 208, 88, 200 }, 277 - { 1, 156, 80, 150 }, { 1, 156, 66, 150 }, 278 - { 2, 240, 122, 230 }, { 2, 240, 102, 230 }, 279 - { 2, 208, 106, 200 }, { 2, 208, 88, 200 }, 280 - }; 281 - 282 - /* SDHI divisors */ 283 - static const struct clk_div_table cpg_sdh_div_table[] = { 284 - { 0, 2 }, { 1, 3 }, { 2, 4 }, { 3, 6 }, 285 - { 4, 8 }, { 5, 12 }, { 6, 16 }, { 7, 18 }, 286 - { 8, 24 }, { 10, 36 }, { 11, 48 }, { 0, 0 }, 287 - }; 288 - 289 - static const struct clk_div_table cpg_sd01_div_table[] = { 290 - { 4, 8 }, 291 - { 5, 12 }, { 6, 16 }, { 7, 18 }, { 8, 24 }, 292 - { 10, 36 }, { 11, 48 }, { 12, 10 }, { 0, 0 }, 293 - }; 294 - 295 - /* ----------------------------------------------------------------------------- 296 - * Initialization 297 - */ 298 - 299 - static u32 cpg_mode __initdata; 300 - 301 - static const char * const pll0_mult_match[] = { 302 - "renesas,r8a7792-cpg-clocks", 303 - "renesas,r8a7794-cpg-clocks", 304 - NULL 305 - }; 306 - 307 - static struct clk * __init 308 - rcar_gen2_cpg_register_clock(struct device_node *np, struct rcar_gen2_cpg *cpg, 309 - const struct cpg_pll_config *config, 310 - const char *name) 311 - { 312 - const struct clk_div_table *table = NULL; 313 - const char *parent_name; 314 - unsigned int shift; 315 - unsigned int mult = 1; 316 - unsigned int div = 1; 317 - 318 - if (!strcmp(name, "main")) { 319 - parent_name = of_clk_get_parent_name(np, 0); 320 - div = config->extal_div; 321 - } else if (!strcmp(name, "pll0")) { 322 - /* PLL0 is a configurable multiplier clock. Register it as a 323 - * fixed factor clock for now as there's no generic multiplier 324 - * clock implementation and we currently have no need to change 325 - * the multiplier value. 326 - */ 327 - if (of_device_compatible_match(np, pll0_mult_match)) { 328 - /* R-Car V2H and E2 do not have PLL0CR */ 329 - mult = config->pll0_mult; 330 - div = 3; 331 - } else { 332 - u32 value = readl(cpg->reg + CPG_PLL0CR); 333 - mult = ((value >> 24) & ((1 << 7) - 1)) + 1; 334 - } 335 - parent_name = "main"; 336 - } else if (!strcmp(name, "pll1")) { 337 - parent_name = "main"; 338 - mult = config->pll1_mult / 2; 339 - } else if (!strcmp(name, "pll3")) { 340 - parent_name = "main"; 341 - mult = config->pll3_mult; 342 - } else if (!strcmp(name, "lb")) { 343 - parent_name = "pll1"; 344 - div = cpg_mode & BIT(18) ? 36 : 24; 345 - } else if (!strcmp(name, "qspi")) { 346 - parent_name = "pll1_div2"; 347 - div = (cpg_mode & (BIT(3) | BIT(2) | BIT(1))) == BIT(2) 348 - ? 8 : 10; 349 - } else if (!strcmp(name, "sdh")) { 350 - parent_name = "pll1"; 351 - table = cpg_sdh_div_table; 352 - shift = 8; 353 - } else if (!strcmp(name, "sd0")) { 354 - parent_name = "pll1"; 355 - table = cpg_sd01_div_table; 356 - shift = 4; 357 - } else if (!strcmp(name, "sd1")) { 358 - parent_name = "pll1"; 359 - table = cpg_sd01_div_table; 360 - shift = 0; 361 - } else if (!strcmp(name, "z")) { 362 - return cpg_z_clk_register(cpg); 363 - } else if (!strcmp(name, "rcan")) { 364 - return cpg_rcan_clk_register(cpg, np); 365 - } else if (!strcmp(name, "adsp")) { 366 - return cpg_adsp_clk_register(cpg); 367 - } else { 368 - return ERR_PTR(-EINVAL); 369 - } 370 - 371 - if (!table) 372 - return clk_register_fixed_factor(NULL, name, parent_name, 0, 373 - mult, div); 374 - else 375 - return clk_register_divider_table(NULL, name, parent_name, 0, 376 - cpg->reg + CPG_SDCKCR, shift, 377 - 4, 0, table, &cpg->lock); 378 - } 379 - 380 - /* 381 - * Reset register definitions. 382 - */ 383 - #define MODEMR 0xe6160060 384 - 385 - static u32 __init rcar_gen2_read_mode_pins(void) 386 - { 387 - void __iomem *modemr = ioremap_nocache(MODEMR, 4); 388 - u32 mode; 389 - 390 - BUG_ON(!modemr); 391 - mode = ioread32(modemr); 392 - iounmap(modemr); 393 - 394 - return mode; 395 - } 396 - 397 - static void __init rcar_gen2_cpg_clocks_init(struct device_node *np) 398 - { 399 - const struct cpg_pll_config *config; 400 - struct rcar_gen2_cpg *cpg; 401 - struct clk **clks; 402 - unsigned int i; 403 - int num_clks; 404 - 405 - if (rcar_rst_read_mode_pins(&cpg_mode)) { 406 - /* Backward-compatibility with old DT */ 407 - pr_warn("%pOF: failed to obtain mode pins from RST\n", np); 408 - cpg_mode = rcar_gen2_read_mode_pins(); 409 - } 410 - 411 - num_clks = of_property_count_strings(np, "clock-output-names"); 412 - if (num_clks < 0) { 413 - pr_err("%s: failed to count clocks\n", __func__); 414 - return; 415 - } 416 - 417 - cpg = kzalloc(sizeof(*cpg), GFP_KERNEL); 418 - clks = kcalloc(num_clks, sizeof(*clks), GFP_KERNEL); 419 - if (cpg == NULL || clks == NULL) { 420 - /* We're leaking memory on purpose, there's no point in cleaning 421 - * up as the system won't boot anyway. 422 - */ 423 - return; 424 - } 425 - 426 - spin_lock_init(&cpg->lock); 427 - 428 - cpg->data.clks = clks; 429 - cpg->data.clk_num = num_clks; 430 - 431 - cpg->reg = of_iomap(np, 0); 432 - if (WARN_ON(cpg->reg == NULL)) 433 - return; 434 - 435 - config = &cpg_pll_configs[CPG_PLL_CONFIG_INDEX(cpg_mode)]; 436 - 437 - for (i = 0; i < num_clks; ++i) { 438 - const char *name; 439 - struct clk *clk; 440 - 441 - of_property_read_string_index(np, "clock-output-names", i, 442 - &name); 443 - 444 - clk = rcar_gen2_cpg_register_clock(np, cpg, config, name); 445 - if (IS_ERR(clk)) 446 - pr_err("%s: failed to register %pOFn %s clock (%ld)\n", 447 - __func__, np, name, PTR_ERR(clk)); 448 - else 449 - cpg->data.clks[i] = clk; 450 - } 451 - 452 - of_clk_add_provider(np, of_clk_src_onecell_get, &cpg->data); 453 - 454 - cpg_mstp_add_clk_domain(np); 455 - } 456 - CLK_OF_DECLARE(rcar_gen2_cpg_clks, "renesas,rcar-gen2-cpg-clocks", 457 - rcar_gen2_cpg_clocks_init);
+327
drivers/clk/renesas/r8a774b1-cpg-mssr.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * r8a774b1 Clock Pulse Generator / Module Standby and Software Reset 4 + * 5 + * Copyright (C) 2019 Renesas Electronics Corp. 6 + * 7 + * Based on r8a7796-cpg-mssr.c 8 + * 9 + * Copyright (C) 2016 Glider bvba 10 + */ 11 + 12 + #include <linux/device.h> 13 + #include <linux/init.h> 14 + #include <linux/kernel.h> 15 + #include <linux/soc/renesas/rcar-rst.h> 16 + 17 + #include <dt-bindings/clock/r8a774b1-cpg-mssr.h> 18 + 19 + #include "renesas-cpg-mssr.h" 20 + #include "rcar-gen3-cpg.h" 21 + 22 + enum clk_ids { 23 + /* Core Clock Outputs exported to DT */ 24 + LAST_DT_CORE_CLK = R8A774B1_CLK_CANFD, 25 + 26 + /* External Input Clocks */ 27 + CLK_EXTAL, 28 + CLK_EXTALR, 29 + 30 + /* Internal Core Clocks */ 31 + CLK_MAIN, 32 + CLK_PLL0, 33 + CLK_PLL1, 34 + CLK_PLL3, 35 + CLK_PLL4, 36 + CLK_PLL1_DIV2, 37 + CLK_PLL1_DIV4, 38 + CLK_S0, 39 + CLK_S1, 40 + CLK_S2, 41 + CLK_S3, 42 + CLK_SDSRC, 43 + CLK_RINT, 44 + 45 + /* Module Clocks */ 46 + MOD_CLK_BASE 47 + }; 48 + 49 + static const struct cpg_core_clk r8a774b1_core_clks[] __initconst = { 50 + /* External Clock Inputs */ 51 + DEF_INPUT("extal", CLK_EXTAL), 52 + DEF_INPUT("extalr", CLK_EXTALR), 53 + 54 + /* Internal Core Clocks */ 55 + DEF_BASE(".main", CLK_MAIN, CLK_TYPE_GEN3_MAIN, CLK_EXTAL), 56 + DEF_BASE(".pll0", CLK_PLL0, CLK_TYPE_GEN3_PLL0, CLK_MAIN), 57 + DEF_BASE(".pll1", CLK_PLL1, CLK_TYPE_GEN3_PLL1, CLK_MAIN), 58 + DEF_BASE(".pll3", CLK_PLL3, CLK_TYPE_GEN3_PLL3, CLK_MAIN), 59 + DEF_BASE(".pll4", CLK_PLL4, CLK_TYPE_GEN3_PLL4, CLK_MAIN), 60 + 61 + DEF_FIXED(".pll1_div2", CLK_PLL1_DIV2, CLK_PLL1, 2, 1), 62 + DEF_FIXED(".pll1_div4", CLK_PLL1_DIV4, CLK_PLL1_DIV2, 2, 1), 63 + DEF_FIXED(".s0", CLK_S0, CLK_PLL1_DIV2, 2, 1), 64 + DEF_FIXED(".s1", CLK_S1, CLK_PLL1_DIV2, 3, 1), 65 + DEF_FIXED(".s2", CLK_S2, CLK_PLL1_DIV2, 4, 1), 66 + DEF_FIXED(".s3", CLK_S3, CLK_PLL1_DIV2, 6, 1), 67 + DEF_FIXED(".sdsrc", CLK_SDSRC, CLK_PLL1_DIV2, 2, 1), 68 + 69 + DEF_GEN3_OSC(".r", CLK_RINT, CLK_EXTAL, 32), 70 + 71 + /* Core Clock Outputs */ 72 + DEF_GEN3_Z("z", R8A774B1_CLK_Z, CLK_TYPE_GEN3_Z, CLK_PLL0, 2, 8), 73 + DEF_FIXED("ztr", R8A774B1_CLK_ZTR, CLK_PLL1_DIV2, 6, 1), 74 + DEF_FIXED("ztrd2", R8A774B1_CLK_ZTRD2, CLK_PLL1_DIV2, 12, 1), 75 + DEF_FIXED("zt", R8A774B1_CLK_ZT, CLK_PLL1_DIV2, 4, 1), 76 + DEF_FIXED("zx", R8A774B1_CLK_ZX, CLK_PLL1_DIV2, 2, 1), 77 + DEF_FIXED("s0d1", R8A774B1_CLK_S0D1, CLK_S0, 1, 1), 78 + DEF_FIXED("s0d2", R8A774B1_CLK_S0D2, CLK_S0, 2, 1), 79 + DEF_FIXED("s0d3", R8A774B1_CLK_S0D3, CLK_S0, 3, 1), 80 + DEF_FIXED("s0d4", R8A774B1_CLK_S0D4, CLK_S0, 4, 1), 81 + DEF_FIXED("s0d6", R8A774B1_CLK_S0D6, CLK_S0, 6, 1), 82 + DEF_FIXED("s0d8", R8A774B1_CLK_S0D8, CLK_S0, 8, 1), 83 + DEF_FIXED("s0d12", R8A774B1_CLK_S0D12, CLK_S0, 12, 1), 84 + DEF_FIXED("s1d2", R8A774B1_CLK_S1D2, CLK_S1, 2, 1), 85 + DEF_FIXED("s1d4", R8A774B1_CLK_S1D4, CLK_S1, 4, 1), 86 + DEF_FIXED("s2d1", R8A774B1_CLK_S2D1, CLK_S2, 1, 1), 87 + DEF_FIXED("s2d2", R8A774B1_CLK_S2D2, CLK_S2, 2, 1), 88 + DEF_FIXED("s2d4", R8A774B1_CLK_S2D4, CLK_S2, 4, 1), 89 + DEF_FIXED("s3d1", R8A774B1_CLK_S3D1, CLK_S3, 1, 1), 90 + DEF_FIXED("s3d2", R8A774B1_CLK_S3D2, CLK_S3, 2, 1), 91 + DEF_FIXED("s3d4", R8A774B1_CLK_S3D4, CLK_S3, 4, 1), 92 + 93 + DEF_GEN3_SD("sd0", R8A774B1_CLK_SD0, CLK_SDSRC, 0x074), 94 + DEF_GEN3_SD("sd1", R8A774B1_CLK_SD1, CLK_SDSRC, 0x078), 95 + DEF_GEN3_SD("sd2", R8A774B1_CLK_SD2, CLK_SDSRC, 0x268), 96 + DEF_GEN3_SD("sd3", R8A774B1_CLK_SD3, CLK_SDSRC, 0x26c), 97 + 98 + DEF_FIXED("cl", R8A774B1_CLK_CL, CLK_PLL1_DIV2, 48, 1), 99 + DEF_FIXED("cp", R8A774B1_CLK_CP, CLK_EXTAL, 2, 1), 100 + DEF_FIXED("cpex", R8A774B1_CLK_CPEX, CLK_EXTAL, 2, 1), 101 + 102 + DEF_DIV6P1("canfd", R8A774B1_CLK_CANFD, CLK_PLL1_DIV4, 0x244), 103 + DEF_DIV6P1("csi0", R8A774B1_CLK_CSI0, CLK_PLL1_DIV4, 0x00c), 104 + DEF_DIV6P1("mso", R8A774B1_CLK_MSO, CLK_PLL1_DIV4, 0x014), 105 + DEF_DIV6P1("hdmi", R8A774B1_CLK_HDMI, CLK_PLL1_DIV4, 0x250), 106 + 107 + DEF_GEN3_OSC("osc", R8A774B1_CLK_OSC, CLK_EXTAL, 8), 108 + 109 + DEF_BASE("r", R8A774B1_CLK_R, CLK_TYPE_GEN3_R, CLK_RINT), 110 + }; 111 + 112 + static const struct mssr_mod_clk r8a774b1_mod_clks[] __initconst = { 113 + DEF_MOD("tmu4", 121, R8A774B1_CLK_S0D6), 114 + DEF_MOD("tmu3", 122, R8A774B1_CLK_S3D2), 115 + DEF_MOD("tmu2", 123, R8A774B1_CLK_S3D2), 116 + DEF_MOD("tmu1", 124, R8A774B1_CLK_S3D2), 117 + DEF_MOD("tmu0", 125, R8A774B1_CLK_CP), 118 + DEF_MOD("fdp1-0", 119, R8A774B1_CLK_S0D1), 119 + DEF_MOD("scif5", 202, R8A774B1_CLK_S3D4), 120 + DEF_MOD("scif4", 203, R8A774B1_CLK_S3D4), 121 + DEF_MOD("scif3", 204, R8A774B1_CLK_S3D4), 122 + DEF_MOD("scif1", 206, R8A774B1_CLK_S3D4), 123 + DEF_MOD("scif0", 207, R8A774B1_CLK_S3D4), 124 + DEF_MOD("msiof3", 208, R8A774B1_CLK_MSO), 125 + DEF_MOD("msiof2", 209, R8A774B1_CLK_MSO), 126 + DEF_MOD("msiof1", 210, R8A774B1_CLK_MSO), 127 + DEF_MOD("msiof0", 211, R8A774B1_CLK_MSO), 128 + DEF_MOD("sys-dmac2", 217, R8A774B1_CLK_S3D1), 129 + DEF_MOD("sys-dmac1", 218, R8A774B1_CLK_S3D1), 130 + DEF_MOD("sys-dmac0", 219, R8A774B1_CLK_S0D3), 131 + DEF_MOD("cmt3", 300, R8A774B1_CLK_R), 132 + DEF_MOD("cmt2", 301, R8A774B1_CLK_R), 133 + DEF_MOD("cmt1", 302, R8A774B1_CLK_R), 134 + DEF_MOD("cmt0", 303, R8A774B1_CLK_R), 135 + DEF_MOD("tpu0", 304, R8A774B1_CLK_S3D4), 136 + DEF_MOD("scif2", 310, R8A774B1_CLK_S3D4), 137 + DEF_MOD("sdif3", 311, R8A774B1_CLK_SD3), 138 + DEF_MOD("sdif2", 312, R8A774B1_CLK_SD2), 139 + DEF_MOD("sdif1", 313, R8A774B1_CLK_SD1), 140 + DEF_MOD("sdif0", 314, R8A774B1_CLK_SD0), 141 + DEF_MOD("pcie1", 318, R8A774B1_CLK_S3D1), 142 + DEF_MOD("pcie0", 319, R8A774B1_CLK_S3D1), 143 + DEF_MOD("usb3-if0", 328, R8A774B1_CLK_S3D1), 144 + DEF_MOD("usb-dmac0", 330, R8A774B1_CLK_S3D1), 145 + DEF_MOD("usb-dmac1", 331, R8A774B1_CLK_S3D1), 146 + DEF_MOD("rwdt", 402, R8A774B1_CLK_R), 147 + DEF_MOD("intc-ex", 407, R8A774B1_CLK_CP), 148 + DEF_MOD("intc-ap", 408, R8A774B1_CLK_S0D3), 149 + DEF_MOD("audmac1", 501, R8A774B1_CLK_S1D2), 150 + DEF_MOD("audmac0", 502, R8A774B1_CLK_S1D2), 151 + DEF_MOD("hscif4", 516, R8A774B1_CLK_S3D1), 152 + DEF_MOD("hscif3", 517, R8A774B1_CLK_S3D1), 153 + DEF_MOD("hscif2", 518, R8A774B1_CLK_S3D1), 154 + DEF_MOD("hscif1", 519, R8A774B1_CLK_S3D1), 155 + DEF_MOD("hscif0", 520, R8A774B1_CLK_S3D1), 156 + DEF_MOD("thermal", 522, R8A774B1_CLK_CP), 157 + DEF_MOD("pwm", 523, R8A774B1_CLK_S0D12), 158 + DEF_MOD("fcpvd1", 602, R8A774B1_CLK_S0D2), 159 + DEF_MOD("fcpvd0", 603, R8A774B1_CLK_S0D2), 160 + DEF_MOD("fcpvb0", 607, R8A774B1_CLK_S0D1), 161 + DEF_MOD("fcpvi0", 611, R8A774B1_CLK_S0D1), 162 + DEF_MOD("fcpf0", 615, R8A774B1_CLK_S0D1), 163 + DEF_MOD("fcpcs", 619, R8A774B1_CLK_S0D2), 164 + DEF_MOD("vspd1", 622, R8A774B1_CLK_S0D2), 165 + DEF_MOD("vspd0", 623, R8A774B1_CLK_S0D2), 166 + DEF_MOD("vspb", 626, R8A774B1_CLK_S0D1), 167 + DEF_MOD("vspi0", 631, R8A774B1_CLK_S0D1), 168 + DEF_MOD("ehci1", 702, R8A774B1_CLK_S3D2), 169 + DEF_MOD("ehci0", 703, R8A774B1_CLK_S3D2), 170 + DEF_MOD("hsusb", 704, R8A774B1_CLK_S3D2), 171 + DEF_MOD("csi20", 714, R8A774B1_CLK_CSI0), 172 + DEF_MOD("csi40", 716, R8A774B1_CLK_CSI0), 173 + DEF_MOD("du3", 721, R8A774B1_CLK_S2D1), 174 + DEF_MOD("du1", 723, R8A774B1_CLK_S2D1), 175 + DEF_MOD("du0", 724, R8A774B1_CLK_S2D1), 176 + DEF_MOD("lvds", 727, R8A774B1_CLK_S2D1), 177 + DEF_MOD("hdmi0", 729, R8A774B1_CLK_HDMI), 178 + DEF_MOD("vin7", 804, R8A774B1_CLK_S0D2), 179 + DEF_MOD("vin6", 805, R8A774B1_CLK_S0D2), 180 + DEF_MOD("vin5", 806, R8A774B1_CLK_S0D2), 181 + DEF_MOD("vin4", 807, R8A774B1_CLK_S0D2), 182 + DEF_MOD("vin3", 808, R8A774B1_CLK_S0D2), 183 + DEF_MOD("vin2", 809, R8A774B1_CLK_S0D2), 184 + DEF_MOD("vin1", 810, R8A774B1_CLK_S0D2), 185 + DEF_MOD("vin0", 811, R8A774B1_CLK_S0D2), 186 + DEF_MOD("etheravb", 812, R8A774B1_CLK_S0D6), 187 + DEF_MOD("sata0", 815, R8A774B1_CLK_S3D2), 188 + DEF_MOD("gpio7", 905, R8A774B1_CLK_S3D4), 189 + DEF_MOD("gpio6", 906, R8A774B1_CLK_S3D4), 190 + DEF_MOD("gpio5", 907, R8A774B1_CLK_S3D4), 191 + DEF_MOD("gpio4", 908, R8A774B1_CLK_S3D4), 192 + DEF_MOD("gpio3", 909, R8A774B1_CLK_S3D4), 193 + DEF_MOD("gpio2", 910, R8A774B1_CLK_S3D4), 194 + DEF_MOD("gpio1", 911, R8A774B1_CLK_S3D4), 195 + DEF_MOD("gpio0", 912, R8A774B1_CLK_S3D4), 196 + DEF_MOD("can-fd", 914, R8A774B1_CLK_S3D2), 197 + DEF_MOD("can-if1", 915, R8A774B1_CLK_S3D4), 198 + DEF_MOD("can-if0", 916, R8A774B1_CLK_S3D4), 199 + DEF_MOD("i2c6", 918, R8A774B1_CLK_S0D6), 200 + DEF_MOD("i2c5", 919, R8A774B1_CLK_S0D6), 201 + DEF_MOD("i2c-dvfs", 926, R8A774B1_CLK_CP), 202 + DEF_MOD("i2c4", 927, R8A774B1_CLK_S0D6), 203 + DEF_MOD("i2c3", 928, R8A774B1_CLK_S0D6), 204 + DEF_MOD("i2c2", 929, R8A774B1_CLK_S3D2), 205 + DEF_MOD("i2c1", 930, R8A774B1_CLK_S3D2), 206 + DEF_MOD("i2c0", 931, R8A774B1_CLK_S3D2), 207 + DEF_MOD("ssi-all", 1005, R8A774B1_CLK_S3D4), 208 + DEF_MOD("ssi9", 1006, MOD_CLK_ID(1005)), 209 + DEF_MOD("ssi8", 1007, MOD_CLK_ID(1005)), 210 + DEF_MOD("ssi7", 1008, MOD_CLK_ID(1005)), 211 + DEF_MOD("ssi6", 1009, MOD_CLK_ID(1005)), 212 + DEF_MOD("ssi5", 1010, MOD_CLK_ID(1005)), 213 + DEF_MOD("ssi4", 1011, MOD_CLK_ID(1005)), 214 + DEF_MOD("ssi3", 1012, MOD_CLK_ID(1005)), 215 + DEF_MOD("ssi2", 1013, MOD_CLK_ID(1005)), 216 + DEF_MOD("ssi1", 1014, MOD_CLK_ID(1005)), 217 + DEF_MOD("ssi0", 1015, MOD_CLK_ID(1005)), 218 + DEF_MOD("scu-all", 1017, R8A774B1_CLK_S3D4), 219 + DEF_MOD("scu-dvc1", 1018, MOD_CLK_ID(1017)), 220 + DEF_MOD("scu-dvc0", 1019, MOD_CLK_ID(1017)), 221 + DEF_MOD("scu-ctu1-mix1", 1020, MOD_CLK_ID(1017)), 222 + DEF_MOD("scu-ctu0-mix0", 1021, MOD_CLK_ID(1017)), 223 + DEF_MOD("scu-src9", 1022, MOD_CLK_ID(1017)), 224 + DEF_MOD("scu-src8", 1023, MOD_CLK_ID(1017)), 225 + DEF_MOD("scu-src7", 1024, MOD_CLK_ID(1017)), 226 + DEF_MOD("scu-src6", 1025, MOD_CLK_ID(1017)), 227 + DEF_MOD("scu-src5", 1026, MOD_CLK_ID(1017)), 228 + DEF_MOD("scu-src4", 1027, MOD_CLK_ID(1017)), 229 + DEF_MOD("scu-src3", 1028, MOD_CLK_ID(1017)), 230 + DEF_MOD("scu-src2", 1029, MOD_CLK_ID(1017)), 231 + DEF_MOD("scu-src1", 1030, MOD_CLK_ID(1017)), 232 + DEF_MOD("scu-src0", 1031, MOD_CLK_ID(1017)), 233 + }; 234 + 235 + static const unsigned int r8a774b1_crit_mod_clks[] __initconst = { 236 + MOD_CLK_ID(408), /* INTC-AP (GIC) */ 237 + }; 238 + 239 + /* 240 + * CPG Clock Data 241 + */ 242 + 243 + /* 244 + * MD EXTAL PLL0 PLL1 PLL3 PLL4 OSC 245 + * 14 13 19 17 (MHz) 246 + *----------------------------------------------------------------- 247 + * 0 0 0 0 16.66 x 1 x180 x192 x192 x144 /16 248 + * 0 0 0 1 16.66 x 1 x180 x192 x128 x144 /16 249 + * 0 0 1 0 Prohibited setting 250 + * 0 0 1 1 16.66 x 1 x180 x192 x192 x144 /16 251 + * 0 1 0 0 20 x 1 x150 x160 x160 x120 /19 252 + * 0 1 0 1 20 x 1 x150 x160 x106 x120 /19 253 + * 0 1 1 0 Prohibited setting 254 + * 0 1 1 1 20 x 1 x150 x160 x160 x120 /19 255 + * 1 0 0 0 25 x 1 x120 x128 x128 x96 /24 256 + * 1 0 0 1 25 x 1 x120 x128 x84 x96 /24 257 + * 1 0 1 0 Prohibited setting 258 + * 1 0 1 1 25 x 1 x120 x128 x128 x96 /24 259 + * 1 1 0 0 33.33 / 2 x180 x192 x192 x144 /32 260 + * 1 1 0 1 33.33 / 2 x180 x192 x128 x144 /32 261 + * 1 1 1 0 Prohibited setting 262 + * 1 1 1 1 33.33 / 2 x180 x192 x192 x144 /32 263 + */ 264 + #define CPG_PLL_CONFIG_INDEX(md) ((((md) & BIT(14)) >> 11) | \ 265 + (((md) & BIT(13)) >> 11) | \ 266 + (((md) & BIT(19)) >> 18) | \ 267 + (((md) & BIT(17)) >> 17)) 268 + 269 + static const struct rcar_gen3_cpg_pll_config cpg_pll_configs[16] __initconst = { 270 + /* EXTAL div PLL1 mult/div PLL3 mult/div OSC prediv */ 271 + { 1, 192, 1, 192, 1, 16, }, 272 + { 1, 192, 1, 128, 1, 16, }, 273 + { 0, /* Prohibited setting */ }, 274 + { 1, 192, 1, 192, 1, 16, }, 275 + { 1, 160, 1, 160, 1, 19, }, 276 + { 1, 160, 1, 106, 1, 19, }, 277 + { 0, /* Prohibited setting */ }, 278 + { 1, 160, 1, 160, 1, 19, }, 279 + { 1, 128, 1, 128, 1, 24, }, 280 + { 1, 128, 1, 84, 1, 24, }, 281 + { 0, /* Prohibited setting */ }, 282 + { 1, 128, 1, 128, 1, 24, }, 283 + { 2, 192, 1, 192, 1, 32, }, 284 + { 2, 192, 1, 128, 1, 32, }, 285 + { 0, /* Prohibited setting */ }, 286 + { 2, 192, 1, 192, 1, 32, }, 287 + }; 288 + 289 + static int __init r8a774b1_cpg_mssr_init(struct device *dev) 290 + { 291 + const struct rcar_gen3_cpg_pll_config *cpg_pll_config; 292 + u32 cpg_mode; 293 + int error; 294 + 295 + error = rcar_rst_read_mode_pins(&cpg_mode); 296 + if (error) 297 + return error; 298 + 299 + cpg_pll_config = &cpg_pll_configs[CPG_PLL_CONFIG_INDEX(cpg_mode)]; 300 + if (!cpg_pll_config->extal_div) { 301 + dev_err(dev, "Prohibited setting (cpg_mode=0x%x)\n", cpg_mode); 302 + return -EINVAL; 303 + } 304 + 305 + return rcar_gen3_cpg_init(cpg_pll_config, CLK_EXTALR, cpg_mode); 306 + } 307 + 308 + const struct cpg_mssr_info r8a774b1_cpg_mssr_info __initconst = { 309 + /* Core Clocks */ 310 + .core_clks = r8a774b1_core_clks, 311 + .num_core_clks = ARRAY_SIZE(r8a774b1_core_clks), 312 + .last_dt_core_clk = LAST_DT_CORE_CLK, 313 + .num_total_core_clks = MOD_CLK_BASE, 314 + 315 + /* Module Clocks */ 316 + .mod_clks = r8a774b1_mod_clks, 317 + .num_mod_clks = ARRAY_SIZE(r8a774b1_mod_clks), 318 + .num_hw_mod_clks = 12 * 32, 319 + 320 + /* Critical Module Clocks */ 321 + .crit_mod_clks = r8a774b1_crit_mod_clks, 322 + .num_crit_mod_clks = ARRAY_SIZE(r8a774b1_crit_mod_clks), 323 + 324 + /* Callbacks */ 325 + .init = r8a774b1_cpg_mssr_init, 326 + .cpg_clk_register = rcar_gen3_cpg_clk_register, 327 + };
+20 -4
drivers/clk/renesas/r8a7796-cpg-mssr.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0 2 2 /* 3 - * r8a7796 Clock Pulse Generator / Module Standby and Software Reset 3 + * r8a7796 (R-Car M3-W/W+) Clock Pulse Generator / Module Standby and Software 4 + * Reset 4 5 * 5 - * Copyright (C) 2016 Glider bvba 6 - * Copyright (C) 2018 Renesas Electronics Corp. 6 + * Copyright (C) 2016-2019 Glider bvba 7 + * Copyright (C) 2018-2019 Renesas Electronics Corp. 7 8 * 8 9 * Based on r8a7795-cpg-mssr.c 9 10 * ··· 15 14 #include <linux/device.h> 16 15 #include <linux/init.h> 17 16 #include <linux/kernel.h> 17 + #include <linux/of.h> 18 18 #include <linux/soc/renesas/rcar-rst.h> 19 19 20 20 #include <dt-bindings/clock/r8a7796-cpg-mssr.h> ··· 118 116 DEF_BASE("r", R8A7796_CLK_R, CLK_TYPE_GEN3_R, CLK_RINT), 119 117 }; 120 118 121 - static const struct mssr_mod_clk r8a7796_mod_clks[] __initconst = { 119 + static struct mssr_mod_clk r8a7796_mod_clks[] __initdata = { 122 120 DEF_MOD("fdp1-0", 119, R8A7796_CLK_S0D1), 123 121 DEF_MOD("scif5", 202, R8A7796_CLK_S3D4), 124 122 DEF_MOD("scif4", 203, R8A7796_CLK_S3D4), ··· 306 304 { 2, 192, 1, 192, 1, 32, }, 307 305 }; 308 306 307 + /* 308 + * Fixups for R-Car M3-W+ 309 + */ 310 + 311 + static const unsigned int r8a77961_mod_nullify[] __initconst = { 312 + MOD_CLK_ID(617), /* FCPCI0 */ 313 + }; 314 + 309 315 static int __init r8a7796_cpg_mssr_init(struct device *dev) 310 316 { 311 317 const struct rcar_gen3_cpg_pll_config *cpg_pll_config; ··· 329 319 dev_err(dev, "Prohibited setting (cpg_mode=0x%x)\n", cpg_mode); 330 320 return -EINVAL; 331 321 } 322 + 323 + if (of_device_is_compatible(dev->of_node, "renesas,r8a77961-cpg-mssr")) 324 + mssr_mod_nullify(r8a7796_mod_clks, 325 + ARRAY_SIZE(r8a7796_mod_clks), 326 + r8a77961_mod_nullify, 327 + ARRAY_SIZE(r8a77961_mod_nullify)); 332 328 333 329 return rcar_gen3_cpg_init(cpg_pll_config, CLK_EXTALR, cpg_mode); 334 330 }
+1 -1
drivers/clk/renesas/r8a77965-cpg-mssr.c
··· 323 323 } 324 324 325 325 return rcar_gen3_cpg_init(cpg_pll_config, CLK_EXTALR, cpg_mode); 326 - }; 326 + } 327 327 328 328 const struct cpg_mssr_info r8a77965_cpg_mssr_info __initconst = { 329 329 /* Core Clocks */
+14 -11
drivers/clk/renesas/rcar-gen2-cpg.c
··· 63 63 return div_u64((u64)parent_rate * mult, 32); 64 64 } 65 65 66 - static long cpg_z_clk_round_rate(struct clk_hw *hw, unsigned long rate, 67 - unsigned long *parent_rate) 66 + static int cpg_z_clk_determine_rate(struct clk_hw *hw, 67 + struct clk_rate_request *req) 68 68 { 69 - unsigned long prate = *parent_rate; 70 - unsigned int mult; 69 + unsigned long prate = req->best_parent_rate; 70 + unsigned int min_mult, max_mult, mult; 71 71 72 - if (!prate) 73 - prate = 1; 72 + min_mult = max(div64_ul(req->min_rate * 32ULL, prate), 1ULL); 73 + max_mult = min(div64_ul(req->max_rate * 32ULL, prate), 32ULL); 74 + if (max_mult < min_mult) 75 + return -EINVAL; 74 76 75 - mult = div_u64((u64)rate * 32, prate); 76 - mult = clamp(mult, 1U, 32U); 77 + mult = div64_ul(req->rate * 32ULL, prate); 78 + mult = clamp(mult, min_mult, max_mult); 77 79 78 - return *parent_rate / 32 * mult; 80 + req->rate = div_u64((u64)prate * mult, 32); 81 + return 0; 79 82 } 80 83 81 84 static int cpg_z_clk_set_rate(struct clk_hw *hw, unsigned long rate, ··· 89 86 u32 val, kick; 90 87 unsigned int i; 91 88 92 - mult = div_u64((u64)rate * 32, parent_rate); 89 + mult = div64_ul(rate * 32ULL, parent_rate); 93 90 mult = clamp(mult, 1U, 32U); 94 91 95 92 if (readl(zclk->kick_reg) & CPG_FRQCRB_KICK) ··· 129 126 130 127 static const struct clk_ops cpg_z_clk_ops = { 131 128 .recalc_rate = cpg_z_clk_recalc_rate, 132 - .round_rate = cpg_z_clk_round_rate, 129 + .determine_rate = cpg_z_clk_determine_rate, 133 130 .set_rate = cpg_z_clk_set_rate, 134 131 }; 135 132
+35 -29
drivers/clk/renesas/rcar-gen3-cpg.c
··· 114 114 32 * zclk->fixed_div); 115 115 } 116 116 117 - static long cpg_z_clk_round_rate(struct clk_hw *hw, unsigned long rate, 118 - unsigned long *parent_rate) 117 + static int cpg_z_clk_determine_rate(struct clk_hw *hw, 118 + struct clk_rate_request *req) 119 119 { 120 120 struct cpg_z_clk *zclk = to_z_clk(hw); 121 + unsigned int min_mult, max_mult, mult; 121 122 unsigned long prate; 122 - unsigned int mult; 123 123 124 - prate = *parent_rate / zclk->fixed_div; 125 - mult = div_u64(rate * 32ULL, prate); 126 - mult = clamp(mult, 1U, 32U); 124 + prate = req->best_parent_rate / zclk->fixed_div; 125 + min_mult = max(div64_ul(req->min_rate * 32ULL, prate), 1ULL); 126 + max_mult = min(div64_ul(req->max_rate * 32ULL, prate), 32ULL); 127 + if (max_mult < min_mult) 128 + return -EINVAL; 127 129 128 - return (u64)prate * mult / 32; 130 + mult = div64_ul(req->rate * 32ULL, prate); 131 + mult = clamp(mult, min_mult, max_mult); 132 + 133 + req->rate = div_u64((u64)prate * mult, 32); 134 + return 0; 129 135 } 130 136 131 137 static int cpg_z_clk_set_rate(struct clk_hw *hw, unsigned long rate, ··· 178 172 179 173 static const struct clk_ops cpg_z_clk_ops = { 180 174 .recalc_rate = cpg_z_clk_recalc_rate, 181 - .round_rate = cpg_z_clk_round_rate, 175 + .determine_rate = cpg_z_clk_determine_rate, 182 176 .set_rate = cpg_z_clk_set_rate, 183 177 }; 184 178 ··· 315 309 clock->div_table[clock->cur_div_idx].div); 316 310 } 317 311 318 - static unsigned int cpg_sd_clock_calc_div(struct sd_clock *clock, 319 - unsigned long rate, 320 - unsigned long parent_rate) 312 + static int cpg_sd_clock_determine_rate(struct clk_hw *hw, 313 + struct clk_rate_request *req) 321 314 { 322 - unsigned long calc_rate, diff, diff_min = ULONG_MAX; 323 - unsigned int i, best_div = 0; 315 + unsigned long best_rate = ULONG_MAX, diff_min = ULONG_MAX; 316 + struct sd_clock *clock = to_sd_clock(hw); 317 + unsigned long calc_rate, diff; 318 + unsigned int i; 324 319 325 320 for (i = 0; i < clock->div_num; i++) { 326 - calc_rate = DIV_ROUND_CLOSEST(parent_rate, 321 + calc_rate = DIV_ROUND_CLOSEST(req->best_parent_rate, 327 322 clock->div_table[i].div); 328 - diff = calc_rate > rate ? calc_rate - rate : rate - calc_rate; 323 + if (calc_rate < req->min_rate || calc_rate > req->max_rate) 324 + continue; 325 + 326 + diff = calc_rate > req->rate ? calc_rate - req->rate 327 + : req->rate - calc_rate; 329 328 if (diff < diff_min) { 330 - best_div = clock->div_table[i].div; 329 + best_rate = calc_rate; 331 330 diff_min = diff; 332 331 } 333 332 } 334 333 335 - return best_div; 336 - } 334 + if (best_rate == ULONG_MAX) 335 + return -EINVAL; 337 336 338 - static long cpg_sd_clock_round_rate(struct clk_hw *hw, unsigned long rate, 339 - unsigned long *parent_rate) 340 - { 341 - struct sd_clock *clock = to_sd_clock(hw); 342 - unsigned int div = cpg_sd_clock_calc_div(clock, rate, *parent_rate); 343 - 344 - return DIV_ROUND_CLOSEST(*parent_rate, div); 337 + req->rate = best_rate; 338 + return 0; 345 339 } 346 340 347 341 static int cpg_sd_clock_set_rate(struct clk_hw *hw, unsigned long rate, 348 - unsigned long parent_rate) 342 + unsigned long parent_rate) 349 343 { 350 344 struct sd_clock *clock = to_sd_clock(hw); 351 - unsigned int div = cpg_sd_clock_calc_div(clock, rate, parent_rate); 352 345 unsigned int i; 353 346 354 347 for (i = 0; i < clock->div_num; i++) 355 - if (div == clock->div_table[i].div) 348 + if (rate == DIV_ROUND_CLOSEST(parent_rate, 349 + clock->div_table[i].div)) 356 350 break; 357 351 358 352 if (i >= clock->div_num) ··· 372 366 .disable = cpg_sd_clock_disable, 373 367 .is_enabled = cpg_sd_clock_is_enabled, 374 368 .recalc_rate = cpg_sd_clock_recalc_rate, 375 - .round_rate = cpg_sd_clock_round_rate, 369 + .determine_rate = cpg_sd_clock_determine_rate, 376 370 .set_rate = cpg_sd_clock_set_rate, 377 371 }; 378 372
+13 -1
drivers/clk/renesas/renesas-cpg-mssr.c
··· 702 702 .data = &r8a774a1_cpg_mssr_info, 703 703 }, 704 704 #endif 705 + #ifdef CONFIG_CLK_R8A774B1 706 + { 707 + .compatible = "renesas,r8a774b1-cpg-mssr", 708 + .data = &r8a774b1_cpg_mssr_info, 709 + }, 710 + #endif 705 711 #ifdef CONFIG_CLK_R8A774C0 706 712 { 707 713 .compatible = "renesas,r8a774c0-cpg-mssr", ··· 749 743 .data = &r8a7795_cpg_mssr_info, 750 744 }, 751 745 #endif 752 - #ifdef CONFIG_CLK_R8A7796 746 + #ifdef CONFIG_CLK_R8A77960 753 747 { 754 748 .compatible = "renesas,r8a7796-cpg-mssr", 749 + .data = &r8a7796_cpg_mssr_info, 750 + }, 751 + #endif 752 + #ifdef CONFIG_CLK_R8A77961 753 + { 754 + .compatible = "renesas,r8a77961-cpg-mssr", 755 755 .data = &r8a7796_cpg_mssr_info, 756 756 }, 757 757 #endif
+1
drivers/clk/renesas/renesas-cpg-mssr.h
··· 159 159 extern const struct cpg_mssr_info r8a7745_cpg_mssr_info; 160 160 extern const struct cpg_mssr_info r8a77470_cpg_mssr_info; 161 161 extern const struct cpg_mssr_info r8a774a1_cpg_mssr_info; 162 + extern const struct cpg_mssr_info r8a774b1_cpg_mssr_info; 162 163 extern const struct cpg_mssr_info r8a774c0_cpg_mssr_info; 163 164 extern const struct cpg_mssr_info r8a7790_cpg_mssr_info; 164 165 extern const struct cpg_mssr_info r8a7791_cpg_mssr_info;
+1 -2
drivers/clk/rockchip/clk-half-divider.c
··· 139 139 return 0; 140 140 } 141 141 142 - const struct clk_ops clk_half_divider_ops = { 142 + static const struct clk_ops clk_half_divider_ops = { 143 143 .recalc_rate = clk_half_divider_recalc_rate, 144 144 .round_rate = clk_half_divider_round_rate, 145 145 .set_rate = clk_half_divider_set_rate, 146 146 }; 147 - EXPORT_SYMBOL_GPL(clk_half_divider_ops); 148 147 149 148 /** 150 149 * Register a clock branch.
+56 -14
drivers/clk/rockchip/clk-px30.c
··· 167 167 PNAME(mux_cif_out_p) = { "xin24m", "dummy_cpll", "npll", "usb480m" }; 168 168 PNAME(mux_dclk_vopb_p) = { "dclk_vopb_src", "dclk_vopb_frac", "xin24m" }; 169 169 PNAME(mux_dclk_vopl_p) = { "dclk_vopl_src", "dclk_vopl_frac", "xin24m" }; 170 + PNAME(mux_nandc_p) = { "clk_nandc_div", "clk_nandc_div50" }; 171 + PNAME(mux_sdio_p) = { "clk_sdio_div", "clk_sdio_div50" }; 172 + PNAME(mux_emmc_p) = { "clk_emmc_div", "clk_emmc_div50" }; 173 + PNAME(mux_sdmmc_p) = { "clk_sdmmc_div", "clk_sdmmc_div50" }; 170 174 PNAME(mux_gmac_p) = { "clk_gmac_src", "gmac_clkin" }; 171 175 PNAME(mux_gmac_rmii_sel_p) = { "clk_gmac_rx_tx_div20", "clk_gmac_rx_tx_div2" }; 172 176 PNAME(mux_rtc32k_pmu_p) = { "xin32k", "pmu_pvtm_32k", "clk_rtc32k_frac", }; ··· 464 460 /* PD_MMC_NAND */ 465 461 GATE(HCLK_MMC_NAND, "hclk_mmc_nand", "hclk_peri_pre", 0, 466 462 PX30_CLKGATE_CON(6), 0, GFLAGS), 467 - COMPOSITE(SCLK_NANDC, "clk_nandc", mux_gpll_cpll_npll_p, 0, 463 + COMPOSITE(SCLK_NANDC_DIV, "clk_nandc_div", mux_gpll_cpll_npll_p, 0, 468 464 PX30_CLKSEL_CON(15), 6, 2, MFLAGS, 0, 5, DFLAGS, 465 + PX30_CLKGATE_CON(5), 11, GFLAGS), 466 + COMPOSITE(SCLK_NANDC_DIV50, "clk_nandc_div50", mux_gpll_cpll_npll_p, 0, 467 + PX30_CLKSEL_CON(15), 6, 2, MFLAGS, 8, 5, DFLAGS, 468 + PX30_CLKGATE_CON(5), 12, GFLAGS), 469 + COMPOSITE_NODIV(SCLK_NANDC, "clk_nandc", mux_nandc_p, 470 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 471 + PX30_CLKSEL_CON(15), 15, 1, MFLAGS, 469 472 PX30_CLKGATE_CON(5), 13, GFLAGS), 470 473 471 - COMPOSITE(SCLK_SDIO, "clk_sdio", mux_gpll_cpll_npll_xin24m_p, 0, 474 + COMPOSITE(SCLK_SDIO_DIV, "clk_sdio_div", mux_gpll_cpll_npll_xin24m_p, 0, 472 475 PX30_CLKSEL_CON(18), 14, 2, MFLAGS, 0, 8, DFLAGS, 476 + PX30_CLKGATE_CON(6), 1, GFLAGS), 477 + COMPOSITE_DIV_OFFSET(SCLK_SDIO_DIV50, "clk_sdio_div50", 478 + mux_gpll_cpll_npll_xin24m_p, 0, 479 + PX30_CLKSEL_CON(18), 14, 2, MFLAGS, 480 + PX30_CLKSEL_CON(19), 0, 8, DFLAGS, 481 + PX30_CLKGATE_CON(6), 2, GFLAGS), 482 + COMPOSITE_NODIV(SCLK_SDIO, "clk_sdio", mux_sdio_p, 483 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 484 + PX30_CLKSEL_CON(19), 15, 1, MFLAGS, 473 485 PX30_CLKGATE_CON(6), 3, GFLAGS), 474 486 475 - COMPOSITE(SCLK_EMMC, "clk_emmc", mux_gpll_cpll_npll_xin24m_p, 0, 487 + COMPOSITE(SCLK_EMMC_DIV, "clk_emmc_div", mux_gpll_cpll_npll_xin24m_p, 0, 476 488 PX30_CLKSEL_CON(20), 14, 2, MFLAGS, 0, 8, DFLAGS, 489 + PX30_CLKGATE_CON(6), 4, GFLAGS), 490 + COMPOSITE_DIV_OFFSET(SCLK_EMMC_DIV50, "clk_emmc_div50", mux_gpll_cpll_npll_xin24m_p, 0, 491 + PX30_CLKSEL_CON(20), 14, 2, MFLAGS, 492 + PX30_CLKSEL_CON(21), 0, 8, DFLAGS, 493 + PX30_CLKGATE_CON(6), 5, GFLAGS), 494 + COMPOSITE_NODIV(SCLK_EMMC, "clk_emmc", mux_emmc_p, 495 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 496 + PX30_CLKSEL_CON(21), 15, 1, MFLAGS, 477 497 PX30_CLKGATE_CON(6), 6, GFLAGS), 478 498 479 499 COMPOSITE(SCLK_SFC, "clk_sfc", mux_gpll_cpll_p, 0, ··· 522 494 /* PD_SDCARD */ 523 495 GATE(0, "hclk_sdmmc_pre", "hclk_peri_pre", 0, 524 496 PX30_CLKGATE_CON(6), 12, GFLAGS), 525 - COMPOSITE(SCLK_SDMMC, "clk_sdmmc", mux_gpll_cpll_npll_xin24m_p, 0, 497 + COMPOSITE(SCLK_SDMMC_DIV, "clk_sdmmc_div", mux_gpll_cpll_npll_xin24m_p, 0, 526 498 PX30_CLKSEL_CON(16), 14, 2, MFLAGS, 0, 8, DFLAGS, 499 + PX30_CLKGATE_CON(6), 13, GFLAGS), 500 + COMPOSITE_DIV_OFFSET(SCLK_SDMMC_DIV50, "clk_sdmmc_div50", mux_gpll_cpll_npll_xin24m_p, 0, 501 + PX30_CLKSEL_CON(16), 14, 2, MFLAGS, 502 + PX30_CLKSEL_CON(17), 0, 8, DFLAGS, 503 + PX30_CLKGATE_CON(6), 14, GFLAGS), 504 + COMPOSITE_NODIV(SCLK_SDMMC, "clk_sdmmc", mux_sdmmc_p, 505 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 506 + PX30_CLKSEL_CON(17), 15, 1, MFLAGS, 527 507 PX30_CLKGATE_CON(6), 15, GFLAGS), 528 508 529 509 /* PD_USB */ ··· 799 763 GATE(0, "pclk_ddrphy", "pclk_top_pre", CLK_IGNORE_UNUSED, PX30_CLKGATE_CON(16), 3, GFLAGS), 800 764 GATE(PCLK_MIPIDSIPHY, "pclk_mipidsiphy", "pclk_top_pre", 0, PX30_CLKGATE_CON(16), 4, GFLAGS), 801 765 GATE(PCLK_MIPICSIPHY, "pclk_mipicsiphy", "pclk_top_pre", 0, PX30_CLKGATE_CON(16), 5, GFLAGS), 802 - GATE(PCLK_USB_GRF, "pclk_usb_grf", "pclk_top_pre", CLK_IGNORE_UNUSED, PX30_CLKGATE_CON(16), 6, GFLAGS), 766 + GATE(PCLK_USB_GRF, "pclk_usb_grf", "pclk_top_pre", 0, PX30_CLKGATE_CON(16), 6, GFLAGS), 803 767 GATE(0, "pclk_cpu_hoost", "pclk_top_pre", CLK_IGNORE_UNUSED, PX30_CLKGATE_CON(16), 7, GFLAGS), 804 768 805 769 /* PD_VI */ 806 - GATE(0, "aclk_vi_niu", "aclk_vi_pre", CLK_IGNORE_UNUSED, PX30_CLKGATE_CON(4), 15, GFLAGS), 770 + GATE(0, "aclk_vi_niu", "aclk_vi_pre", 0, PX30_CLKGATE_CON(4), 15, GFLAGS), 807 771 GATE(ACLK_CIF, "aclk_cif", "aclk_vi_pre", 0, PX30_CLKGATE_CON(5), 1, GFLAGS), 808 772 GATE(ACLK_ISP, "aclk_isp", "aclk_vi_pre", 0, PX30_CLKGATE_CON(5), 3, GFLAGS), 809 - GATE(0, "hclk_vi_niu", "hclk_vi_pre", CLK_IGNORE_UNUSED, PX30_CLKGATE_CON(5), 0, GFLAGS), 773 + GATE(0, "hclk_vi_niu", "hclk_vi_pre", 0, PX30_CLKGATE_CON(5), 0, GFLAGS), 810 774 GATE(HCLK_CIF, "hclk_cif", "hclk_vi_pre", 0, PX30_CLKGATE_CON(5), 2, GFLAGS), 811 775 GATE(HCLK_ISP, "hclk_isp", "hclk_vi_pre", 0, PX30_CLKGATE_CON(5), 4, GFLAGS), 812 776 813 777 /* PD_VO */ 814 - GATE(0, "aclk_vo_niu", "aclk_vo_pre", CLK_IGNORE_UNUSED, PX30_CLKGATE_CON(3), 0, GFLAGS), 778 + GATE(0, "aclk_vo_niu", "aclk_vo_pre", 0, PX30_CLKGATE_CON(3), 0, GFLAGS), 815 779 GATE(ACLK_VOPB, "aclk_vopb", "aclk_vo_pre", 0, PX30_CLKGATE_CON(3), 3, GFLAGS), 816 780 GATE(ACLK_RGA, "aclk_rga", "aclk_vo_pre", 0, PX30_CLKGATE_CON(3), 7, GFLAGS), 817 781 GATE(ACLK_VOPL, "aclk_vopl", "aclk_vo_pre", 0, PX30_CLKGATE_CON(3), 5, GFLAGS), 818 782 819 - GATE(0, "hclk_vo_niu", "hclk_vo_pre", CLK_IGNORE_UNUSED, PX30_CLKGATE_CON(3), 1, GFLAGS), 783 + GATE(0, "hclk_vo_niu", "hclk_vo_pre", 0, PX30_CLKGATE_CON(3), 1, GFLAGS), 820 784 GATE(HCLK_VOPB, "hclk_vopb", "hclk_vo_pre", 0, PX30_CLKGATE_CON(3), 4, GFLAGS), 821 785 GATE(HCLK_RGA, "hclk_rga", "hclk_vo_pre", 0, PX30_CLKGATE_CON(3), 8, GFLAGS), 822 786 GATE(HCLK_VOPL, "hclk_vopl", "hclk_vo_pre", 0, PX30_CLKGATE_CON(3), 6, GFLAGS), 823 787 824 - GATE(0, "pclk_vo_niu", "pclk_vo_pre", CLK_IGNORE_UNUSED, PX30_CLKGATE_CON(3), 2, GFLAGS), 788 + GATE(0, "pclk_vo_niu", "pclk_vo_pre", 0, PX30_CLKGATE_CON(3), 2, GFLAGS), 825 789 GATE(PCLK_MIPI_DSI, "pclk_mipi_dsi", "pclk_vo_pre", 0, PX30_CLKGATE_CON(3), 9, GFLAGS), 826 790 827 791 /* PD_BUS */ ··· 976 940 GATE(0, "pclk_cru_pmu", "pclk_pmu_pre", CLK_IGNORE_UNUSED, PX30_PMU_CLKGATE_CON(0), 8, GFLAGS), 977 941 }; 978 942 979 - static const char *const px30_pmucru_critical_clocks[] __initconst = { 943 + static const char *const px30_cru_critical_clocks[] __initconst = { 980 944 "aclk_bus_pre", 981 945 "pclk_bus_pre", 982 946 "hclk_bus_pre", ··· 986 950 "pclk_top_pre", 987 951 "pclk_pmu_pre", 988 952 "hclk_usb_niu", 953 + "pclk_vo_niu", 954 + "aclk_vo_niu", 955 + "hclk_vo_niu", 956 + "aclk_vi_niu", 957 + "hclk_vi_niu", 989 958 "pll_npll", 990 959 "usb480m", 991 960 "clk_uart2", 992 961 "pclk_uart2", 962 + "pclk_usb_grf", 993 963 }; 994 964 995 965 static void __init px30_clk_init(struct device_node *np) ··· 1026 984 mux_armclk_p, ARRAY_SIZE(mux_armclk_p), 1027 985 &px30_cpuclk_data, px30_cpuclk_rates, 1028 986 ARRAY_SIZE(px30_cpuclk_rates)); 987 + 988 + rockchip_clk_protect_critical(px30_cru_critical_clocks, 989 + ARRAY_SIZE(px30_cru_critical_clocks)); 1029 990 1030 991 rockchip_register_softrst(np, 12, reg_base + PX30_SOFTRST_CON(0), 1031 992 ROCKCHIP_SOFTRST_HIWORD_MASK); ··· 1061 1016 1062 1017 rockchip_clk_register_branches(ctx, px30_clk_pmu_branches, 1063 1018 ARRAY_SIZE(px30_clk_pmu_branches)); 1064 - 1065 - rockchip_clk_protect_critical(px30_pmucru_critical_clocks, 1066 - ARRAY_SIZE(px30_pmucru_critical_clocks)); 1067 1019 1068 1020 rockchip_clk_of_add_provider(np, ctx); 1069 1021 }
+26 -8
drivers/clk/samsung/clk-exynos5420.c
··· 165 165 GATE_BUS_CPU, 166 166 GATE_SCLK_CPU, 167 167 CLKOUT_CMU_CPU, 168 + APLL_CON0, 169 + KPLL_CON0, 168 170 CPLL_CON0, 169 171 DPLL_CON0, 170 172 EPLL_CON0, ··· 613 611 MUX(0, "mout_aclk66", mout_group1_p, SRC_TOP1, 8, 2), 614 612 MUX(0, "mout_aclk166", mout_group1_p, SRC_TOP1, 24, 2), 615 613 616 - MUX(0, "mout_aclk_g3d", mout_group5_p, SRC_TOP2, 16, 1), 614 + MUX_F(0, "mout_aclk_g3d", mout_group5_p, SRC_TOP2, 16, 1, 615 + CLK_SET_RATE_PARENT, 0), 617 616 618 617 MUX(0, "mout_user_aclk400_isp", mout_user_aclk400_isp_p, 619 618 SRC_TOP3, 0, 1), ··· 656 653 SRC_TOP5, 8, 1), 657 654 MUX(0, "mout_user_aclk266_g2d", mout_user_aclk266_g2d_p, 658 655 SRC_TOP5, 12, 1), 659 - MUX(CLK_MOUT_G3D, "mout_user_aclk_g3d", mout_user_aclk_g3d_p, 660 - SRC_TOP5, 16, 1), 656 + MUX_F(CLK_MOUT_G3D, "mout_user_aclk_g3d", mout_user_aclk_g3d_p, 657 + SRC_TOP5, 16, 1, CLK_SET_RATE_PARENT, 0), 661 658 MUX(0, "mout_user_aclk300_jpeg", mout_user_aclk300_jpeg_p, 662 659 SRC_TOP5, 20, 1), 663 660 MUX(CLK_MOUT_USER_ACLK300_DISP1, "mout_user_aclk300_disp1", ··· 666 663 mout_user_aclk300_gscl_p, SRC_TOP5, 28, 1), 667 664 668 665 MUX(0, "mout_sclk_mpll", mout_mpll_p, SRC_TOP6, 0, 1), 669 - MUX(CLK_MOUT_VPLL, "mout_sclk_vpll", mout_vpll_p, SRC_TOP6, 4, 1), 666 + MUX_F(CLK_MOUT_VPLL, "mout_sclk_vpll", mout_vpll_p, SRC_TOP6, 4, 1, 667 + CLK_SET_RATE_PARENT, 0), 670 668 MUX(CLK_MOUT_SCLK_SPLL, "mout_sclk_spll", mout_spll_p, SRC_TOP6, 8, 1), 671 669 MUX(0, "mout_sclk_ipll", mout_ipll_p, SRC_TOP6, 12, 1), 672 670 MUX(0, "mout_sclk_rpll", mout_rpll_p, SRC_TOP6, 16, 1), ··· 711 707 SRC_TOP12, 8, 1), 712 708 MUX(0, "mout_sw_aclk266_g2d", mout_sw_aclk266_g2d_p, 713 709 SRC_TOP12, 12, 1), 714 - MUX(0, "mout_sw_aclk_g3d", mout_sw_aclk_g3d_p, SRC_TOP12, 16, 1), 710 + MUX_F(0, "mout_sw_aclk_g3d", mout_sw_aclk_g3d_p, SRC_TOP12, 16, 1, 711 + CLK_SET_RATE_PARENT, 0), 715 712 MUX(0, "mout_sw_aclk300_jpeg", mout_sw_aclk300_jpeg_p, 716 713 SRC_TOP12, 20, 1), 717 714 MUX(CLK_MOUT_SW_ACLK300, "mout_sw_aclk300_disp1", ··· 809 804 DIV_TOP2, 8, 3), 810 805 DIV(CLK_DOUT_ACLK266_G2D, "dout_aclk266_g2d", "mout_aclk266_g2d", 811 806 DIV_TOP2, 12, 3), 812 - DIV(CLK_DOUT_ACLK_G3D, "dout_aclk_g3d", "mout_aclk_g3d", DIV_TOP2, 813 - 16, 3), 807 + DIV_F(CLK_DOUT_ACLK_G3D, "dout_aclk_g3d", "mout_aclk_g3d", DIV_TOP2, 808 + 16, 3, CLK_SET_RATE_PARENT, 0), 814 809 DIV(CLK_DOUT_ACLK300_JPEG, "dout_aclk300_jpeg", "mout_aclk300_jpeg", 815 810 DIV_TOP2, 20, 3), 816 811 DIV(CLK_DOUT_ACLK300_DISP1, "dout_aclk300_disp1", ··· 1258 1253 }; 1259 1254 1260 1255 static const struct samsung_gate_clock exynos5x_g3d_gate_clks[] __initconst = { 1261 - GATE(CLK_G3D, "g3d", "mout_user_aclk_g3d", GATE_IP_G3D, 9, 0, 0), 1256 + GATE(CLK_G3D, "g3d", "mout_user_aclk_g3d", GATE_IP_G3D, 9, 1257 + CLK_SET_RATE_PARENT, 0), 1262 1258 }; 1263 1259 1264 1260 static struct exynos5_subcmu_reg_dump exynos5x_g3d_suspend_regs[] = { ··· 1443 1437 PLL_36XX_RATE(24 * MHZ, 32768001U, 131, 3, 5, 4719), 1444 1438 }; 1445 1439 1440 + static const struct samsung_pll_rate_table exynos5420_vpll_24mhz_tbl[] = { 1441 + PLL_35XX_RATE(24 * MHZ, 600000000U, 200, 2, 2), 1442 + PLL_35XX_RATE(24 * MHZ, 543000000U, 181, 2, 2), 1443 + PLL_35XX_RATE(24 * MHZ, 480000000U, 160, 2, 2), 1444 + PLL_35XX_RATE(24 * MHZ, 420000000U, 140, 2, 2), 1445 + PLL_35XX_RATE(24 * MHZ, 350000000U, 175, 3, 2), 1446 + PLL_35XX_RATE(24 * MHZ, 266000000U, 266, 3, 3), 1447 + PLL_35XX_RATE(24 * MHZ, 177000000U, 118, 2, 3), 1448 + PLL_35XX_RATE(24 * MHZ, 100000000U, 200, 3, 4), 1449 + }; 1450 + 1446 1451 static struct samsung_pll_clock exynos5x_plls[nr_plls] __initdata = { 1447 1452 [apll] = PLL(pll_2550, CLK_FOUT_APLL, "fout_apll", "fin_pll", APLL_LOCK, 1448 1453 APLL_CON0, NULL), ··· 1578 1561 exynos5x_plls[apll].rate_table = exynos5420_pll2550x_24mhz_tbl; 1579 1562 exynos5x_plls[epll].rate_table = exynos5420_epll_24mhz_tbl; 1580 1563 exynos5x_plls[kpll].rate_table = exynos5420_pll2550x_24mhz_tbl; 1564 + exynos5x_plls[vpll].rate_table = exynos5420_vpll_24mhz_tbl; 1581 1565 } 1582 1566 1583 1567 if (soc == EXYNOS5420)
+1 -3
drivers/clk/samsung/clk-s3c2410-dclk.c
··· 238 238 static int s3c24xx_dclk_probe(struct platform_device *pdev) 239 239 { 240 240 struct s3c24xx_dclk *s3c24xx_dclk; 241 - struct resource *mem; 242 241 struct s3c24xx_dclk_drv_data *dclk_variant; 243 242 struct clk_hw **clk_table; 244 243 int ret, i; ··· 256 257 platform_set_drvdata(pdev, s3c24xx_dclk); 257 258 spin_lock_init(&s3c24xx_dclk->dclk_lock); 258 259 259 - mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 260 - s3c24xx_dclk->base = devm_ioremap_resource(&pdev->dev, mem); 260 + s3c24xx_dclk->base = devm_platform_ioremap_resource(pdev, 0); 261 261 if (IS_ERR(s3c24xx_dclk->base)) 262 262 return PTR_ERR(s3c24xx_dclk->base); 263 263
+1 -2
drivers/clk/samsung/clk.c
··· 60 60 struct samsung_clk_provider *ctx; 61 61 int i; 62 62 63 - ctx = kzalloc(sizeof(struct samsung_clk_provider) + 64 - sizeof(*ctx->clk_data.hws) * nr_clks, GFP_KERNEL); 63 + ctx = kzalloc(struct_size(ctx, clk_data.hws, nr_clks), GFP_KERNEL); 65 64 if (!ctx) 66 65 panic("could not allocate clock provider context.\n"); 67 66
+2 -4
drivers/clk/sprd/common.c
··· 42 42 void __iomem *base; 43 43 struct device_node *node = pdev->dev.of_node; 44 44 struct regmap *regmap; 45 - struct resource *res; 46 45 47 46 if (of_find_property(node, "sprd,syscon", NULL)) { 48 47 regmap = syscon_regmap_lookup_by_phandle(node, "sprd,syscon"); 49 - if (IS_ERR_OR_NULL(regmap)) { 48 + if (IS_ERR(regmap)) { 50 49 pr_err("%s: failed to get syscon regmap\n", __func__); 51 50 return PTR_ERR(regmap); 52 51 } 53 52 } else { 54 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 55 - base = devm_ioremap_resource(&pdev->dev, res); 53 + base = devm_platform_ioremap_resource(pdev, 0); 56 54 if (IS_ERR(base)) 57 55 return PTR_ERR(base); 58 56
+16 -7
drivers/clk/sunxi-ng/ccu-sun50i-h6.c
··· 203 203 * hardcode it to match with the clock names. 204 204 */ 205 205 #define SUN50I_H6_PLL_AUDIO_REG 0x078 206 + 207 + static struct ccu_sdm_setting pll_audio_sdm_table[] = { 208 + { .rate = 541900800, .pattern = 0xc001288d, .m = 1, .n = 22 }, 209 + { .rate = 589824000, .pattern = 0xc00126e9, .m = 1, .n = 24 }, 210 + }; 211 + 206 212 static struct ccu_nm pll_audio_base_clk = { 207 213 .enable = BIT(31), 208 214 .lock = BIT(28), 209 215 .n = _SUNXI_CCU_MULT_MIN(8, 8, 12), 210 216 .m = _SUNXI_CCU_DIV(1, 1), /* input divider */ 217 + .sdm = _SUNXI_CCU_SDM(pll_audio_sdm_table, 218 + BIT(24), 0x178, BIT(31)), 211 219 .common = { 220 + .features = CCU_FEATURE_SIGMA_DELTA_MOD, 212 221 .reg = 0x078, 213 222 .hw.init = CLK_HW_INIT("pll-audio-base", "osc24M", 214 223 &ccu_nm_ops, ··· 299 290 0, 3, /* M */ 300 291 24, 1, /* mux */ 301 292 BIT(31), /* gate */ 302 - 0); 293 + CLK_SET_RATE_PARENT); 303 294 304 295 static SUNXI_CCU_GATE(bus_gpu_clk, "bus-gpu", "psi-ahb1-ahb2", 305 296 0x67c, BIT(0), 0); ··· 762 753 }; 763 754 764 755 /* 765 - * The divider of pll-audio is fixed to 8 now, as pll-audio-4x has a 766 - * fixed post-divider 2. 756 + * The divider of pll-audio is fixed to 24 for now, so 24576000 and 22579200 757 + * rates can be set exactly in conjunction with sigma-delta modulation. 767 758 */ 768 759 static CLK_FIXED_FACTOR_HWS(pll_audio_clk, "pll-audio", 769 760 clk_parent_pll_audio, 770 - 8, 1, CLK_SET_RATE_PARENT); 761 + 24, 1, CLK_SET_RATE_PARENT); 771 762 static CLK_FIXED_FACTOR_HWS(pll_audio_2x_clk, "pll-audio-2x", 772 763 clk_parent_pll_audio, 773 764 4, 1, CLK_SET_RATE_PARENT); ··· 1224 1215 } 1225 1216 1226 1217 /* 1227 - * Force the post-divider of pll-audio to 8 and the output divider 1228 - * of it to 1, to make the clock name represents the real frequency. 1218 + * Force the post-divider of pll-audio to 12 and the output divider 1219 + * of it to 2, so 24576000 and 22579200 rates can be set exactly. 1229 1220 */ 1230 1221 val = readl(reg + SUN50I_H6_PLL_AUDIO_REG); 1231 1222 val &= ~(GENMASK(21, 16) | BIT(0)); 1232 - writel(val | (7 << 16), reg + SUN50I_H6_PLL_AUDIO_REG); 1223 + writel(val | (11 << 16) | BIT(0), reg + SUN50I_H6_PLL_AUDIO_REG); 1233 1224 1234 1225 /* 1235 1226 * First clock parent (osc32K) is unusable for CEC. But since there
-4
drivers/clk/sunxi-ng/ccu-sun8i-h3.h
··· 48 48 49 49 /* Some more module clocks are exported */ 50 50 51 - #define CLK_MBUS 113 52 - 53 - /* And the GPU module clock is exported */ 54 - 55 51 #define CLK_NUMBER_H3 (CLK_GPU + 1) 56 52 #define CLK_NUMBER_H5 (CLK_BUS_SCR1 + 1) 57 53
+2
drivers/clk/tegra/Makefile
··· 17 17 obj-y += clk-tegra-super-gen4.o 18 18 obj-$(CONFIG_TEGRA_CLK_EMC) += clk-emc.o 19 19 obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += clk-tegra20.o 20 + obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += clk-tegra20-emc.o 20 21 obj-$(CONFIG_ARCH_TEGRA_3x_SOC) += clk-tegra30.o 22 + obj-$(CONFIG_ARCH_TEGRA_3x_SOC) += clk-tegra20-emc.o 21 23 obj-$(CONFIG_ARCH_TEGRA_114_SOC) += clk-tegra114.o 22 24 obj-$(CONFIG_ARCH_TEGRA_124_SOC) += clk-tegra124.o 23 25 obj-$(CONFIG_TEGRA_CLK_DFLL) += clk-tegra124-dfll-fcpu.o
+56
drivers/clk/tegra/clk-dfll.c
··· 1487 1487 td->last_unrounded_rate = 0; 1488 1488 1489 1489 pm_runtime_enable(td->dev); 1490 + pm_runtime_irq_safe(td->dev); 1490 1491 pm_runtime_get_sync(td->dev); 1491 1492 1492 1493 dfll_set_mode(td, DFLL_DISABLED); ··· 1513 1512 1514 1513 return ret; 1515 1514 } 1515 + 1516 + /** 1517 + * tegra_dfll_suspend - check DFLL is disabled 1518 + * @dev: DFLL device * 1519 + * 1520 + * DFLL clock should be disabled by the CPUFreq driver. So, make 1521 + * sure it is disabled and disable all clocks needed by the DFLL. 1522 + */ 1523 + int tegra_dfll_suspend(struct device *dev) 1524 + { 1525 + struct tegra_dfll *td = dev_get_drvdata(dev); 1526 + 1527 + if (dfll_is_running(td)) { 1528 + dev_err(td->dev, "DFLL still enabled while suspending\n"); 1529 + return -EBUSY; 1530 + } 1531 + 1532 + reset_control_assert(td->dvco_rst); 1533 + 1534 + return 0; 1535 + } 1536 + EXPORT_SYMBOL(tegra_dfll_suspend); 1537 + 1538 + /** 1539 + * tegra_dfll_resume - reinitialize DFLL on resume 1540 + * @dev: DFLL instance 1541 + * 1542 + * DFLL is disabled and reset during suspend and resume. 1543 + * So, reinitialize the DFLL IP block back for use. 1544 + * DFLL clock is enabled later in closed loop mode by CPUFreq 1545 + * driver before switching its clock source to DFLL output. 1546 + */ 1547 + int tegra_dfll_resume(struct device *dev) 1548 + { 1549 + struct tegra_dfll *td = dev_get_drvdata(dev); 1550 + 1551 + reset_control_deassert(td->dvco_rst); 1552 + 1553 + pm_runtime_get_sync(td->dev); 1554 + 1555 + dfll_set_mode(td, DFLL_DISABLED); 1556 + dfll_set_default_params(td); 1557 + 1558 + if (td->soc->init_clock_trimmers) 1559 + td->soc->init_clock_trimmers(); 1560 + 1561 + dfll_set_open_loop_config(td); 1562 + 1563 + dfll_init_out_if(td); 1564 + 1565 + pm_runtime_put_sync(td->dev); 1566 + 1567 + return 0; 1568 + } 1569 + EXPORT_SYMBOL(tegra_dfll_resume); 1516 1570 1517 1571 /* 1518 1572 * DT data fetch
+2
drivers/clk/tegra/clk-dfll.h
··· 42 42 struct tegra_dfll_soc_data *tegra_dfll_unregister(struct platform_device *pdev); 43 43 int tegra_dfll_runtime_suspend(struct device *dev); 44 44 int tegra_dfll_runtime_resume(struct device *dev); 45 + int tegra_dfll_suspend(struct device *dev); 46 + int tegra_dfll_resume(struct device *dev); 45 47 46 48 #endif /* __DRIVERS_CLK_TEGRA_CLK_DFLL_H */
+11
drivers/clk/tegra/clk-divider.c
··· 109 109 return 0; 110 110 } 111 111 112 + static void clk_divider_restore_context(struct clk_hw *hw) 113 + { 114 + struct clk_hw *parent = clk_hw_get_parent(hw); 115 + unsigned long parent_rate = clk_hw_get_rate(parent); 116 + unsigned long rate = clk_hw_get_rate(hw); 117 + 118 + if (clk_frac_div_set_rate(hw, rate, parent_rate) < 0) 119 + WARN_ON(1); 120 + } 121 + 112 122 const struct clk_ops tegra_clk_frac_div_ops = { 113 123 .recalc_rate = clk_frac_div_recalc_rate, 114 124 .set_rate = clk_frac_div_set_rate, 115 125 .round_rate = clk_frac_div_round_rate, 126 + .restore_context = clk_divider_restore_context, 116 127 }; 117 128 118 129 struct clk *tegra_clk_register_divider(const char *name,
+4 -8
drivers/clk/tegra/clk-emc.c
··· 403 403 } 404 404 405 405 timing->parent_index = 0xff; 406 - for (i = 0; i < ARRAY_SIZE(emc_parent_clk_names); i++) { 407 - if (!strcmp(emc_parent_clk_names[i], 408 - __clk_get_name(timing->parent))) { 409 - timing->parent_index = i; 410 - break; 411 - } 412 - } 413 - if (timing->parent_index == 0xff) { 406 + i = match_string(emc_parent_clk_names, ARRAY_SIZE(emc_parent_clk_names), 407 + __clk_get_name(timing->parent)); 408 + if (i < 0) { 414 409 pr_err("timing %pOF: %s is not a valid parent\n", 415 410 node, __clk_get_name(timing->parent)); 416 411 clk_put(timing->parent); 417 412 return -EINVAL; 418 413 } 419 414 415 + timing->parent_index = i; 420 416 return 0; 421 417 } 422 418
+2 -2
drivers/clk/tegra/clk-id.h
··· 236 236 tegra_clk_soc_therm, 237 237 tegra_clk_soc_therm_8, 238 238 tegra_clk_sor0, 239 - tegra_clk_sor0_lvds, 239 + tegra_clk_sor0_out, 240 240 tegra_clk_sor1, 241 - tegra_clk_sor1_src, 241 + tegra_clk_sor1_out, 242 242 tegra_clk_spdif, 243 243 tegra_clk_spdif_2x, 244 244 tegra_clk_spdif_in,
+21
drivers/clk/tegra/clk-periph.c
··· 3 3 * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved. 4 4 */ 5 5 6 + #include <linux/clk.h> 6 7 #include <linux/clk-provider.h> 7 8 #include <linux/export.h> 8 9 #include <linux/slab.h> ··· 100 99 gate_ops->disable(gate_hw); 101 100 } 102 101 102 + static void clk_periph_restore_context(struct clk_hw *hw) 103 + { 104 + struct tegra_clk_periph *periph = to_clk_periph(hw); 105 + const struct clk_ops *div_ops = periph->div_ops; 106 + struct clk_hw *div_hw = &periph->divider.hw; 107 + int parent_id; 108 + 109 + parent_id = clk_hw_get_parent_index(hw); 110 + if (WARN_ON(parent_id < 0)) 111 + return; 112 + 113 + if (!(periph->gate.flags & TEGRA_PERIPH_NO_DIV)) 114 + div_ops->restore_context(div_hw); 115 + 116 + clk_periph_set_parent(hw, parent_id); 117 + } 118 + 103 119 const struct clk_ops tegra_clk_periph_ops = { 104 120 .get_parent = clk_periph_get_parent, 105 121 .set_parent = clk_periph_set_parent, ··· 126 108 .is_enabled = clk_periph_is_enabled, 127 109 .enable = clk_periph_enable, 128 110 .disable = clk_periph_disable, 111 + .restore_context = clk_periph_restore_context, 129 112 }; 130 113 131 114 static const struct clk_ops tegra_clk_periph_nodiv_ops = { ··· 135 116 .is_enabled = clk_periph_is_enabled, 136 117 .enable = clk_periph_enable, 137 118 .disable = clk_periph_disable, 119 + .restore_context = clk_periph_restore_context, 138 120 }; 139 121 140 122 static const struct clk_ops tegra_clk_periph_no_gate_ops = { ··· 144 124 .recalc_rate = clk_periph_recalc_rate, 145 125 .round_rate = clk_periph_round_rate, 146 126 .set_rate = clk_periph_set_rate, 127 + .restore_context = clk_periph_restore_context, 147 128 }; 148 129 149 130 static struct clk *_tegra_clk_register_periph(const char *name,
+9
drivers/clk/tegra/clk-pll-out.c
··· 69 69 spin_unlock_irqrestore(pll_out->lock, flags); 70 70 } 71 71 72 + static void tegra_clk_pll_out_restore_context(struct clk_hw *hw) 73 + { 74 + if (!__clk_get_enable_count(hw->clk)) 75 + clk_pll_out_disable(hw); 76 + else 77 + clk_pll_out_enable(hw); 78 + } 79 + 72 80 const struct clk_ops tegra_clk_pll_out_ops = { 73 81 .is_enabled = clk_pll_out_is_enabled, 74 82 .enable = clk_pll_out_enable, 75 83 .disable = clk_pll_out_disable, 84 + .restore_context = tegra_clk_pll_out_restore_context, 76 85 }; 77 86 78 87 struct clk *tegra_clk_register_pll_out(const char *name,
+54 -32
drivers/clk/tegra/clk-pll.c
··· 1008 1008 return rate; 1009 1009 } 1010 1010 1011 + static void tegra_clk_pll_restore_context(struct clk_hw *hw) 1012 + { 1013 + struct tegra_clk_pll *pll = to_clk_pll(hw); 1014 + struct clk_hw *parent = clk_hw_get_parent(hw); 1015 + unsigned long parent_rate = clk_hw_get_rate(parent); 1016 + unsigned long rate = clk_hw_get_rate(hw); 1017 + 1018 + if (clk_pll_is_enabled(hw)) 1019 + return; 1020 + 1021 + if (pll->params->set_defaults) 1022 + pll->params->set_defaults(pll); 1023 + 1024 + clk_pll_set_rate(hw, rate, parent_rate); 1025 + 1026 + if (!__clk_get_enable_count(hw->clk)) 1027 + clk_pll_disable(hw); 1028 + else 1029 + clk_pll_enable(hw); 1030 + } 1031 + 1011 1032 const struct clk_ops tegra_clk_pll_ops = { 1012 1033 .is_enabled = clk_pll_is_enabled, 1013 1034 .enable = clk_pll_enable, ··· 1036 1015 .recalc_rate = clk_pll_recalc_rate, 1037 1016 .round_rate = clk_pll_round_rate, 1038 1017 .set_rate = clk_pll_set_rate, 1018 + .restore_context = tegra_clk_pll_restore_context, 1039 1019 }; 1040 1020 1041 1021 const struct clk_ops tegra_clk_plle_ops = { ··· 1824 1802 1825 1803 return ret; 1826 1804 } 1805 + 1806 + static void _clk_plle_tegra_init_parent(struct tegra_clk_pll *pll) 1807 + { 1808 + u32 val, val_aux; 1809 + 1810 + /* ensure parent is set to pll_ref */ 1811 + val = pll_readl_base(pll); 1812 + val_aux = pll_readl(pll->params->aux_reg, pll); 1813 + 1814 + if (val & PLL_BASE_ENABLE) { 1815 + if ((val_aux & PLLE_AUX_PLLRE_SEL) || 1816 + (val_aux & PLLE_AUX_PLLP_SEL)) 1817 + WARN(1, "pll_e enabled with unsupported parent %s\n", 1818 + (val_aux & PLLE_AUX_PLLP_SEL) ? "pllp_out0" : 1819 + "pll_re_vco"); 1820 + } else { 1821 + val_aux &= ~(PLLE_AUX_PLLRE_SEL | PLLE_AUX_PLLP_SEL); 1822 + pll_writel(val_aux, pll->params->aux_reg, pll); 1823 + fence_udelay(1, pll->clk_base); 1824 + } 1825 + } 1827 1826 #endif 1828 1827 1829 1828 static struct tegra_clk_pll *_tegra_init_pll(void __iomem *clk_base, ··· 2257 2214 { 2258 2215 struct tegra_clk_pll *pll; 2259 2216 struct clk *clk; 2260 - u32 val, val_aux; 2261 2217 2262 2218 pll = _tegra_init_pll(clk_base, NULL, pll_params, lock); 2263 2219 if (IS_ERR(pll)) 2264 2220 return ERR_CAST(pll); 2265 2221 2266 - /* ensure parent is set to pll_re_vco */ 2267 - 2268 - val = pll_readl_base(pll); 2269 - val_aux = pll_readl(pll_params->aux_reg, pll); 2270 - 2271 - if (val & PLL_BASE_ENABLE) { 2272 - if ((val_aux & PLLE_AUX_PLLRE_SEL) || 2273 - (val_aux & PLLE_AUX_PLLP_SEL)) 2274 - WARN(1, "pll_e enabled with unsupported parent %s\n", 2275 - (val_aux & PLLE_AUX_PLLP_SEL) ? "pllp_out0" : 2276 - "pll_re_vco"); 2277 - } else { 2278 - val_aux &= ~(PLLE_AUX_PLLRE_SEL | PLLE_AUX_PLLP_SEL); 2279 - pll_writel(val_aux, pll_params->aux_reg, pll); 2280 - } 2222 + _clk_plle_tegra_init_parent(pll); 2281 2223 2282 2224 clk = _tegra_clk_register_pll(pll, name, parent_name, flags, 2283 2225 &tegra_clk_plle_tegra114_ops); ··· 2304 2276 .recalc_rate = clk_pll_recalc_rate, 2305 2277 .round_rate = clk_pll_ramp_round_rate, 2306 2278 .set_rate = clk_pllxc_set_rate, 2279 + .restore_context = tegra_clk_pll_restore_context, 2307 2280 }; 2308 2281 2309 2282 struct clk *tegra_clk_register_pllss(const char *name, const char *parent_name, ··· 2549 2520 spin_unlock_irqrestore(pll->lock, flags); 2550 2521 } 2551 2522 2523 + static void tegra_clk_plle_t210_restore_context(struct clk_hw *hw) 2524 + { 2525 + struct tegra_clk_pll *pll = to_clk_pll(hw); 2526 + 2527 + _clk_plle_tegra_init_parent(pll); 2528 + } 2529 + 2552 2530 static const struct clk_ops tegra_clk_plle_tegra210_ops = { 2553 2531 .is_enabled = clk_plle_tegra210_is_enabled, 2554 2532 .enable = clk_plle_tegra210_enable, 2555 2533 .disable = clk_plle_tegra210_disable, 2556 2534 .recalc_rate = clk_pll_recalc_rate, 2535 + .restore_context = tegra_clk_plle_t210_restore_context, 2557 2536 }; 2558 2537 2559 2538 struct clk *tegra_clk_register_plle_tegra210(const char *name, ··· 2572 2535 { 2573 2536 struct tegra_clk_pll *pll; 2574 2537 struct clk *clk; 2575 - u32 val, val_aux; 2576 2538 2577 2539 pll = _tegra_init_pll(clk_base, NULL, pll_params, lock); 2578 2540 if (IS_ERR(pll)) 2579 2541 return ERR_CAST(pll); 2580 2542 2581 - /* ensure parent is set to pll_re_vco */ 2582 - 2583 - val = pll_readl_base(pll); 2584 - val_aux = pll_readl(pll_params->aux_reg, pll); 2585 - 2586 - if (val & PLLE_BASE_ENABLE) { 2587 - if ((val_aux & PLLE_AUX_PLLRE_SEL) || 2588 - (val_aux & PLLE_AUX_PLLP_SEL)) 2589 - WARN(1, "pll_e enabled with unsupported parent %s\n", 2590 - (val_aux & PLLE_AUX_PLLP_SEL) ? "pllp_out0" : 2591 - "pll_re_vco"); 2592 - } else { 2593 - val_aux &= ~(PLLE_AUX_PLLRE_SEL | PLLE_AUX_PLLP_SEL); 2594 - pll_writel(val_aux, pll_params->aux_reg, pll); 2595 - } 2543 + _clk_plle_tegra_init_parent(pll); 2596 2544 2597 2545 clk = _tegra_clk_register_pll(pll, name, parent_name, flags, 2598 2546 &tegra_clk_plle_tegra210_ops);
+16
drivers/clk/tegra/clk-sdmmc-mux.c
··· 194 194 gate_ops->disable(gate_hw); 195 195 } 196 196 197 + static void clk_sdmmc_mux_restore_context(struct clk_hw *hw) 198 + { 199 + struct clk_hw *parent = clk_hw_get_parent(hw); 200 + unsigned long parent_rate = clk_hw_get_rate(parent); 201 + unsigned long rate = clk_hw_get_rate(hw); 202 + int parent_id; 203 + 204 + parent_id = clk_hw_get_parent_index(hw); 205 + if (WARN_ON(parent_id < 0)) 206 + return; 207 + 208 + clk_sdmmc_mux_set_parent(hw, parent_id); 209 + clk_sdmmc_mux_set_rate(hw, rate, parent_rate); 210 + } 211 + 197 212 static const struct clk_ops tegra_clk_sdmmc_mux_ops = { 198 213 .get_parent = clk_sdmmc_mux_get_parent, 199 214 .set_parent = clk_sdmmc_mux_set_parent, ··· 218 203 .is_enabled = clk_sdmmc_mux_is_enabled, 219 204 .enable = clk_sdmmc_mux_enable, 220 205 .disable = clk_sdmmc_mux_disable, 206 + .restore_context = clk_sdmmc_mux_restore_context, 221 207 }; 222 208 223 209 struct clk *tegra_clk_register_sdmmc_mux_div(const char *name,
+41
drivers/clk/tegra/clk-super.c
··· 28 28 #define super_state_to_src_shift(m, s) ((m->width * s)) 29 29 #define super_state_to_src_mask(m) (((1 << m->width) - 1)) 30 30 31 + #define CCLK_SRC_PLLP_OUT0 4 32 + #define CCLK_SRC_PLLP_OUT4 5 33 + 31 34 static u8 clk_super_get_parent(struct clk_hw *hw) 32 35 { 33 36 struct tegra_clk_super_mux *mux = to_clk_super_mux(hw); ··· 100 97 if (index == mux->div2_index) 101 98 index = mux->pllx_index; 102 99 } 100 + 101 + /* enable PLLP branches to CPU before selecting PLLP source */ 102 + if ((mux->flags & TEGRA210_CPU_CLK) && 103 + (index == CCLK_SRC_PLLP_OUT0 || index == CCLK_SRC_PLLP_OUT4)) 104 + tegra_clk_set_pllp_out_cpu(true); 105 + 103 106 val &= ~((super_state_to_src_mask(mux)) << shift); 104 107 val |= (index & (super_state_to_src_mask(mux))) << shift; 105 108 106 109 writel_relaxed(val, mux->reg); 107 110 udelay(2); 111 + 112 + /* disable PLLP branches to CPU if not used */ 113 + if ((mux->flags & TEGRA210_CPU_CLK) && 114 + index != CCLK_SRC_PLLP_OUT0 && index != CCLK_SRC_PLLP_OUT4) 115 + tegra_clk_set_pllp_out_cpu(false); 108 116 109 117 out: 110 118 if (mux->lock) ··· 124 110 return err; 125 111 } 126 112 113 + static void clk_super_mux_restore_context(struct clk_hw *hw) 114 + { 115 + int parent_id; 116 + 117 + parent_id = clk_hw_get_parent_index(hw); 118 + if (WARN_ON(parent_id < 0)) 119 + return; 120 + 121 + clk_super_set_parent(hw, parent_id); 122 + } 123 + 127 124 static const struct clk_ops tegra_clk_super_mux_ops = { 128 125 .get_parent = clk_super_get_parent, 129 126 .set_parent = clk_super_set_parent, 127 + .restore_context = clk_super_mux_restore_context, 130 128 }; 131 129 132 130 static long clk_super_round_rate(struct clk_hw *hw, unsigned long rate, ··· 174 148 return super->div_ops->set_rate(div_hw, rate, parent_rate); 175 149 } 176 150 151 + static void clk_super_restore_context(struct clk_hw *hw) 152 + { 153 + struct tegra_clk_super_mux *super = to_clk_super_mux(hw); 154 + struct clk_hw *div_hw = &super->frac_div.hw; 155 + int parent_id; 156 + 157 + parent_id = clk_hw_get_parent_index(hw); 158 + if (WARN_ON(parent_id < 0)) 159 + return; 160 + 161 + super->div_ops->restore_context(div_hw); 162 + clk_super_set_parent(hw, parent_id); 163 + } 164 + 177 165 const struct clk_ops tegra_clk_super_ops = { 178 166 .get_parent = clk_super_get_parent, 179 167 .set_parent = clk_super_set_parent, 180 168 .set_rate = clk_super_set_rate, 181 169 .round_rate = clk_super_round_rate, 182 170 .recalc_rate = clk_super_recalc_rate, 171 + .restore_context = clk_super_restore_context, 183 172 }; 184 173 185 174 struct clk *tegra_clk_register_super_mux(const char *name,
+15
drivers/clk/tegra/clk-tegra-fixed.c
··· 17 17 #define OSC_CTRL 0x50 18 18 #define OSC_CTRL_OSC_FREQ_SHIFT 28 19 19 #define OSC_CTRL_PLL_REF_DIV_SHIFT 26 20 + #define OSC_CTRL_MASK (0x3f2 | \ 21 + (0xf << OSC_CTRL_OSC_FREQ_SHIFT)) 22 + 23 + static u32 osc_ctrl_ctx; 20 24 21 25 int __init tegra_osc_clk_init(void __iomem *clk_base, struct tegra_clk *clks, 22 26 unsigned long *input_freqs, unsigned int num, ··· 33 29 unsigned osc_idx; 34 30 35 31 val = readl_relaxed(clk_base + OSC_CTRL); 32 + osc_ctrl_ctx = val & OSC_CTRL_MASK; 36 33 osc_idx = val >> OSC_CTRL_OSC_FREQ_SHIFT; 37 34 38 35 if (osc_idx < num) ··· 100 95 CLK_SET_RATE_PARENT, 1, 4); 101 96 *dt_clk = clk; 102 97 } 98 + } 99 + 100 + void tegra_clk_osc_resume(void __iomem *clk_base) 101 + { 102 + u32 val; 103 + 104 + val = readl_relaxed(clk_base + OSC_CTRL) & ~OSC_CTRL_MASK; 105 + val |= osc_ctrl_ctx; 106 + writel_relaxed(val, clk_base + OSC_CTRL); 107 + fence_udelay(2, clk_base); 103 108 }
-8
drivers/clk/tegra/clk-tegra-periph.c
··· 262 262 static DEFINE_SPINLOCK(PLLP_OUTA_lock); 263 263 static DEFINE_SPINLOCK(PLLP_OUTB_lock); 264 264 static DEFINE_SPINLOCK(PLLP_OUTC_lock); 265 - static DEFINE_SPINLOCK(sor0_lock); 266 265 267 266 #define MUX_I2S_SPDIF(_id) \ 268 267 static const char *mux_pllaout0_##_id##_2x_pllp_clkm[] = { "pll_a_out0", \ ··· 586 587 [0] = 0, [1] = 2, [2] = 3, 587 588 }; 588 589 589 - static const char *mux_clkm_plldp_sor0lvds[] = { 590 - "clk_m", "pll_dp", "sor0_lvds", 591 - }; 592 - #define mux_clkm_plldp_sor0lvds_idx NULL 593 - 594 590 static const char * const mux_dmic1[] = { 595 591 "pll_a_out0", "dmic1_sync_clk", "pll_p", "clk_m" 596 592 }; ··· 725 731 MUX8("hdmi_audio", mux_pllp3_pllc_clkm, CLK_SOURCE_HDMI_AUDIO, 176, TEGRA_PERIPH_NO_RESET, tegra_clk_hdmi_audio), 726 732 MUX8("clk72mhz", mux_pllp3_pllc_clkm, CLK_SOURCE_CLK72MHZ, 177, TEGRA_PERIPH_NO_RESET, tegra_clk_clk72Mhz), 727 733 MUX8("clk72mhz", mux_pllp_out3_pllp_pllc_clkm, CLK_SOURCE_CLK72MHZ, 177, TEGRA_PERIPH_NO_RESET, tegra_clk_clk72Mhz_8), 728 - MUX8_NOGATE_LOCK("sor0_lvds", mux_pllp_pllm_plld_plla_pllc_plld2_clkm, CLK_SOURCE_SOR0, tegra_clk_sor0_lvds, &sor0_lock), 729 734 MUX_FLAGS("csite", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_CSITE, 73, TEGRA_PERIPH_ON_APB, tegra_clk_csite, CLK_IGNORE_UNUSED), 730 735 MUX_FLAGS("csite", mux_pllp_pllre_clkm, CLK_SOURCE_CSITE, 73, TEGRA_PERIPH_ON_APB, tegra_clk_csite_8, CLK_IGNORE_UNUSED), 731 736 NODIV("disp1", mux_pllp_pllm_plld_plla_pllc_plld2_clkm, CLK_SOURCE_DISP1, 29, 7, 27, 0, tegra_clk_disp1, NULL), 732 737 NODIV("disp1", mux_pllp_plld_plld2_clkm, CLK_SOURCE_DISP1, 29, 7, 27, 0, tegra_clk_disp1_8, NULL), 733 738 NODIV("disp2", mux_pllp_pllm_plld_plla_pllc_plld2_clkm, CLK_SOURCE_DISP2, 29, 7, 26, 0, tegra_clk_disp2, NULL), 734 739 NODIV("disp2", mux_pllp_plld_plld2_clkm, CLK_SOURCE_DISP2, 29, 7, 26, 0, tegra_clk_disp2_8, NULL), 735 - NODIV("sor0", mux_clkm_plldp_sor0lvds, CLK_SOURCE_SOR0, 14, 3, 182, 0, tegra_clk_sor0, &sor0_lock), 736 740 UART("uarta", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTA, 6, tegra_clk_uarta), 737 741 UART("uartb", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTB, 7, tegra_clk_uartb), 738 742 UART("uartc", mux_pllp_pllc_pllm_clkm, CLK_SOURCE_UARTC, 55, tegra_clk_uartc),
+6 -1
drivers/clk/tegra/clk-tegra-super-gen4.c
··· 180 180 gen_info->num_cclk_g_parents, 181 181 CLK_SET_RATE_PARENT, 182 182 clk_base + CCLKG_BURST_POLICY, 183 - 0, 4, 8, 0, NULL); 183 + TEGRA210_CPU_CLK, 4, 8, 0, NULL); 184 184 } else { 185 185 clk = tegra_clk_register_super_mux("cclk_g", 186 186 gen_info->cclk_g_parents, ··· 196 196 dt_clk = tegra_lookup_dt_id(tegra_clk_cclk_lp, tegra_clks); 197 197 if (dt_clk) { 198 198 if (gen_info->gen == gen5) { 199 + /* 200 + * TEGRA210_CPU_CLK flag is not needed for cclk_lp as 201 + * cluster switching is not currently supported on 202 + * Tegra210 and also cpu_lp is not used. 203 + */ 199 204 clk = tegra_clk_register_super_mux("cclk_lp", 200 205 gen_info->cclk_lp_parents, 201 206 gen_info->num_cclk_lp_parents,
+1
drivers/clk/tegra/clk-tegra124-dfll-fcpu.c
··· 631 631 static const struct dev_pm_ops tegra124_dfll_pm_ops = { 632 632 SET_RUNTIME_PM_OPS(tegra_dfll_runtime_suspend, 633 633 tegra_dfll_runtime_resume, NULL) 634 + SET_SYSTEM_SLEEP_PM_OPS(tegra_dfll_suspend, tegra_dfll_resume) 634 635 }; 635 636 636 637 static struct platform_driver tegra124_dfll_fcpu_driver = {
+54 -1
drivers/clk/tegra/clk-tegra124.c
··· 27 27 28 28 #define CLK_SOURCE_CSITE 0x1d4 29 29 #define CLK_SOURCE_EMC 0x19c 30 + #define CLK_SOURCE_SOR0 0x414 30 31 31 32 #define RST_DFLL_DVCO 0x2f4 32 33 #define DVFS_DFLL_RESET_SHIFT 0 ··· 92 91 /* Tegra CPU clock and reset control regs */ 93 92 #define CLK_RST_CONTROLLER_CPU_CMPLX_STATUS 0x470 94 93 94 + #define MASK(x) (BIT(x) - 1) 95 + 96 + #define MUX8_NOGATE_LOCK(_name, _parents, _offset, _clk_id, _lock) \ 97 + TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset, \ 98 + 29, MASK(3), 0, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP,\ 99 + 0, TEGRA_PERIPH_NO_GATE, _clk_id,\ 100 + _parents##_idx, 0, _lock) 101 + 102 + #define NODIV(_name, _parents, _offset, \ 103 + _mux_shift, _mux_mask, _clk_num, \ 104 + _gate_flags, _clk_id, _lock) \ 105 + TEGRA_INIT_DATA_TABLE(_name, NULL, NULL, _parents, _offset,\ 106 + _mux_shift, _mux_mask, 0, 0, 0, 0, 0,\ 107 + _clk_num, (_gate_flags) | TEGRA_PERIPH_NO_DIV,\ 108 + _clk_id, _parents##_idx, 0, _lock) 109 + 95 110 #ifdef CONFIG_PM_SLEEP 96 111 static struct cpu_clk_suspend_context { 97 112 u32 clk_csite_src; ··· 127 110 static DEFINE_SPINLOCK(pll_re_lock); 128 111 static DEFINE_SPINLOCK(pll_u_lock); 129 112 static DEFINE_SPINLOCK(emc_lock); 113 + static DEFINE_SPINLOCK(sor0_lock); 130 114 131 115 /* possible OSC frequencies in Hz */ 132 116 static unsigned long tegra124_input_freq[] = { ··· 847 829 [tegra_clk_adx1] = { .dt_id = TEGRA124_CLK_ADX1, .present = true }, 848 830 [tegra_clk_dpaux] = { .dt_id = TEGRA124_CLK_DPAUX, .present = true }, 849 831 [tegra_clk_sor0] = { .dt_id = TEGRA124_CLK_SOR0, .present = true }, 850 - [tegra_clk_sor0_lvds] = { .dt_id = TEGRA124_CLK_SOR0_LVDS, .present = true }, 832 + [tegra_clk_sor0_out] = { .dt_id = TEGRA124_CLK_SOR0_OUT, .present = true }, 851 833 [tegra_clk_gpu] = { .dt_id = TEGRA124_CLK_GPU, .present = true }, 852 834 [tegra_clk_amx1] = { .dt_id = TEGRA124_CLK_AMX1, .present = true }, 853 835 [tegra_clk_uartb] = { .dt_id = TEGRA124_CLK_UARTB, .present = true }, ··· 1005 987 { .con_id = "hda2hdmi", .dt_id = TEGRA124_CLK_HDA2HDMI }, 1006 988 }; 1007 989 990 + static const char * const sor0_parents[] = { 991 + "pll_p_out0", "pll_m_out0", "pll_d_out0", "pll_a_out0", "pll_c_out0", 992 + "pll_d2_out0", "clk_m", 993 + }; 994 + 995 + static const char * const sor0_out_parents[] = { 996 + "clk_m", "sor0_pad_clkout", 997 + }; 998 + 999 + static struct tegra_periph_init_data tegra124_periph[] = { 1000 + TEGRA_INIT_DATA_TABLE("sor0", NULL, NULL, sor0_parents, 1001 + CLK_SOURCE_SOR0, 29, 0x7, 0, 0, 0, 0, 1002 + 0, 182, 0, tegra_clk_sor0, NULL, 0, 1003 + &sor0_lock), 1004 + TEGRA_INIT_DATA_TABLE("sor0_out", NULL, NULL, sor0_out_parents, 1005 + CLK_SOURCE_SOR0, 14, 0x1, 0, 0, 0, 0, 1006 + 0, 0, TEGRA_PERIPH_NO_GATE, tegra_clk_sor0_out, 1007 + NULL, 0, &sor0_lock), 1008 + }; 1009 + 1008 1010 static struct clk **clks; 1009 1011 1010 1012 static __init void tegra124_periph_clk_init(void __iomem *clk_base, 1011 1013 void __iomem *pmc_base) 1012 1014 { 1013 1015 struct clk *clk; 1016 + unsigned int i; 1014 1017 1015 1018 /* xusb_ss_div2 */ 1016 1019 clk = clk_register_fixed_factor(NULL, "xusb_ss_div2", "xusb_ss_src", 0, ··· 1071 1032 1, 0, &pll_e_lock); 1072 1033 clk_register_clkdev(clk, "cml1", NULL); 1073 1034 clks[TEGRA124_CLK_CML1] = clk; 1035 + 1036 + for (i = 0; i < ARRAY_SIZE(tegra124_periph); i++) { 1037 + struct tegra_periph_init_data *init = &tegra124_periph[i]; 1038 + struct clk **clkp; 1039 + 1040 + clkp = tegra_lookup_dt_id(init->clk_id, tegra124_clks); 1041 + if (!clkp) { 1042 + pr_warn("clock %u not found\n", init->clk_id); 1043 + continue; 1044 + } 1045 + 1046 + clk = tegra_clk_register_periph_data(clk_base, init); 1047 + *clkp = clk; 1048 + } 1074 1049 1075 1050 tegra_periph_clk_init(clk_base, pmc_base, tegra124_clks, &pll_p_params); 1076 1051 }
+293
drivers/clk/tegra/clk-tegra20-emc.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* 3 + * Based on drivers/clk/tegra/clk-emc.c 4 + * Copyright (c) 2014, NVIDIA CORPORATION. All rights reserved. 5 + * 6 + * Author: Dmitry Osipenko <digetx@gmail.com> 7 + * Copyright (C) 2019 GRATE-DRIVER project 8 + */ 9 + 10 + #define pr_fmt(fmt) "tegra-emc-clk: " fmt 11 + 12 + #include <linux/bits.h> 13 + #include <linux/clk-provider.h> 14 + #include <linux/clk/tegra.h> 15 + #include <linux/err.h> 16 + #include <linux/io.h> 17 + #include <linux/kernel.h> 18 + #include <linux/slab.h> 19 + 20 + #include "clk.h" 21 + 22 + #define CLK_SOURCE_EMC_2X_CLK_DIVISOR_MASK GENMASK(7, 0) 23 + #define CLK_SOURCE_EMC_2X_CLK_SRC_MASK GENMASK(31, 30) 24 + #define CLK_SOURCE_EMC_2X_CLK_SRC_SHIFT 30 25 + 26 + #define MC_EMC_SAME_FREQ BIT(16) 27 + #define USE_PLLM_UD BIT(29) 28 + 29 + #define EMC_SRC_PLL_M 0 30 + #define EMC_SRC_PLL_C 1 31 + #define EMC_SRC_PLL_P 2 32 + #define EMC_SRC_CLK_M 3 33 + 34 + static const char * const emc_parent_clk_names[] = { 35 + "pll_m", "pll_c", "pll_p", "clk_m", 36 + }; 37 + 38 + struct tegra_clk_emc { 39 + struct clk_hw hw; 40 + void __iomem *reg; 41 + bool mc_same_freq; 42 + bool want_low_jitter; 43 + 44 + tegra20_clk_emc_round_cb *round_cb; 45 + void *cb_arg; 46 + }; 47 + 48 + static inline struct tegra_clk_emc *to_tegra_clk_emc(struct clk_hw *hw) 49 + { 50 + return container_of(hw, struct tegra_clk_emc, hw); 51 + } 52 + 53 + static unsigned long emc_recalc_rate(struct clk_hw *hw, 54 + unsigned long parent_rate) 55 + { 56 + struct tegra_clk_emc *emc = to_tegra_clk_emc(hw); 57 + u32 val, div; 58 + 59 + val = readl_relaxed(emc->reg); 60 + div = val & CLK_SOURCE_EMC_2X_CLK_DIVISOR_MASK; 61 + 62 + return DIV_ROUND_UP(parent_rate * 2, div + 2); 63 + } 64 + 65 + static u8 emc_get_parent(struct clk_hw *hw) 66 + { 67 + struct tegra_clk_emc *emc = to_tegra_clk_emc(hw); 68 + 69 + return readl_relaxed(emc->reg) >> CLK_SOURCE_EMC_2X_CLK_SRC_SHIFT; 70 + } 71 + 72 + static int emc_set_parent(struct clk_hw *hw, u8 index) 73 + { 74 + struct tegra_clk_emc *emc = to_tegra_clk_emc(hw); 75 + u32 val, div; 76 + 77 + val = readl_relaxed(emc->reg); 78 + val &= ~CLK_SOURCE_EMC_2X_CLK_SRC_MASK; 79 + val |= index << CLK_SOURCE_EMC_2X_CLK_SRC_SHIFT; 80 + 81 + div = val & CLK_SOURCE_EMC_2X_CLK_DIVISOR_MASK; 82 + 83 + if (index == EMC_SRC_PLL_M && div == 0 && emc->want_low_jitter) 84 + val |= USE_PLLM_UD; 85 + else 86 + val &= ~USE_PLLM_UD; 87 + 88 + if (emc->mc_same_freq) 89 + val |= MC_EMC_SAME_FREQ; 90 + else 91 + val &= ~MC_EMC_SAME_FREQ; 92 + 93 + writel_relaxed(val, emc->reg); 94 + 95 + fence_udelay(1, emc->reg); 96 + 97 + return 0; 98 + } 99 + 100 + static int emc_set_rate(struct clk_hw *hw, unsigned long rate, 101 + unsigned long parent_rate) 102 + { 103 + struct tegra_clk_emc *emc = to_tegra_clk_emc(hw); 104 + unsigned int index; 105 + u32 val, div; 106 + 107 + div = div_frac_get(rate, parent_rate, 8, 1, 0); 108 + 109 + val = readl_relaxed(emc->reg); 110 + val &= ~CLK_SOURCE_EMC_2X_CLK_DIVISOR_MASK; 111 + val |= div; 112 + 113 + index = val >> CLK_SOURCE_EMC_2X_CLK_SRC_SHIFT; 114 + 115 + if (index == EMC_SRC_PLL_M && div == 0 && emc->want_low_jitter) 116 + val |= USE_PLLM_UD; 117 + else 118 + val &= ~USE_PLLM_UD; 119 + 120 + if (emc->mc_same_freq) 121 + val |= MC_EMC_SAME_FREQ; 122 + else 123 + val &= ~MC_EMC_SAME_FREQ; 124 + 125 + writel_relaxed(val, emc->reg); 126 + 127 + fence_udelay(1, emc->reg); 128 + 129 + return 0; 130 + } 131 + 132 + static int emc_set_rate_and_parent(struct clk_hw *hw, 133 + unsigned long rate, 134 + unsigned long parent_rate, 135 + u8 index) 136 + { 137 + struct tegra_clk_emc *emc = to_tegra_clk_emc(hw); 138 + u32 val, div; 139 + 140 + div = div_frac_get(rate, parent_rate, 8, 1, 0); 141 + 142 + val = readl_relaxed(emc->reg); 143 + 144 + val &= ~CLK_SOURCE_EMC_2X_CLK_SRC_MASK; 145 + val |= index << CLK_SOURCE_EMC_2X_CLK_SRC_SHIFT; 146 + 147 + val &= ~CLK_SOURCE_EMC_2X_CLK_DIVISOR_MASK; 148 + val |= div; 149 + 150 + if (index == EMC_SRC_PLL_M && div == 0 && emc->want_low_jitter) 151 + val |= USE_PLLM_UD; 152 + else 153 + val &= ~USE_PLLM_UD; 154 + 155 + if (emc->mc_same_freq) 156 + val |= MC_EMC_SAME_FREQ; 157 + else 158 + val &= ~MC_EMC_SAME_FREQ; 159 + 160 + writel_relaxed(val, emc->reg); 161 + 162 + fence_udelay(1, emc->reg); 163 + 164 + return 0; 165 + } 166 + 167 + static int emc_determine_rate(struct clk_hw *hw, struct clk_rate_request *req) 168 + { 169 + struct tegra_clk_emc *emc = to_tegra_clk_emc(hw); 170 + struct clk_hw *parent_hw; 171 + unsigned long divided_rate; 172 + unsigned long parent_rate; 173 + unsigned int i; 174 + long emc_rate; 175 + int div; 176 + 177 + emc_rate = emc->round_cb(req->rate, req->min_rate, req->max_rate, 178 + emc->cb_arg); 179 + if (emc_rate < 0) 180 + return emc_rate; 181 + 182 + for (i = 0; i < ARRAY_SIZE(emc_parent_clk_names); i++) { 183 + parent_hw = clk_hw_get_parent_by_index(hw, i); 184 + 185 + if (req->best_parent_hw == parent_hw) 186 + parent_rate = req->best_parent_rate; 187 + else 188 + parent_rate = clk_hw_get_rate(parent_hw); 189 + 190 + if (emc_rate > parent_rate) 191 + continue; 192 + 193 + div = div_frac_get(emc_rate, parent_rate, 8, 1, 0); 194 + divided_rate = DIV_ROUND_UP(parent_rate * 2, div + 2); 195 + 196 + if (divided_rate != emc_rate) 197 + continue; 198 + 199 + req->best_parent_rate = parent_rate; 200 + req->best_parent_hw = parent_hw; 201 + req->rate = emc_rate; 202 + break; 203 + } 204 + 205 + if (i == ARRAY_SIZE(emc_parent_clk_names)) { 206 + pr_err_once("can't find parent for rate %lu emc_rate %lu\n", 207 + req->rate, emc_rate); 208 + return -EINVAL; 209 + } 210 + 211 + return 0; 212 + } 213 + 214 + static const struct clk_ops tegra_clk_emc_ops = { 215 + .recalc_rate = emc_recalc_rate, 216 + .get_parent = emc_get_parent, 217 + .set_parent = emc_set_parent, 218 + .set_rate = emc_set_rate, 219 + .set_rate_and_parent = emc_set_rate_and_parent, 220 + .determine_rate = emc_determine_rate, 221 + }; 222 + 223 + void tegra20_clk_set_emc_round_callback(tegra20_clk_emc_round_cb *round_cb, 224 + void *cb_arg) 225 + { 226 + struct clk *clk = __clk_lookup("emc"); 227 + struct tegra_clk_emc *emc; 228 + struct clk_hw *hw; 229 + 230 + if (clk) { 231 + hw = __clk_get_hw(clk); 232 + emc = to_tegra_clk_emc(hw); 233 + 234 + emc->round_cb = round_cb; 235 + emc->cb_arg = cb_arg; 236 + } 237 + } 238 + 239 + bool tegra20_clk_emc_driver_available(struct clk_hw *emc_hw) 240 + { 241 + return to_tegra_clk_emc(emc_hw)->round_cb != NULL; 242 + } 243 + 244 + struct clk *tegra20_clk_register_emc(void __iomem *ioaddr, bool low_jitter) 245 + { 246 + struct tegra_clk_emc *emc; 247 + struct clk_init_data init; 248 + struct clk *clk; 249 + 250 + emc = kzalloc(sizeof(*emc), GFP_KERNEL); 251 + if (!emc) 252 + return NULL; 253 + 254 + /* 255 + * EMC stands for External Memory Controller. 256 + * 257 + * We don't want EMC clock to be disabled ever by gating its 258 + * parent and whatnot because system is busted immediately in that 259 + * case, hence the clock is marked as critical. 260 + */ 261 + init.name = "emc"; 262 + init.ops = &tegra_clk_emc_ops; 263 + init.flags = CLK_IS_CRITICAL; 264 + init.parent_names = emc_parent_clk_names; 265 + init.num_parents = ARRAY_SIZE(emc_parent_clk_names); 266 + 267 + emc->reg = ioaddr; 268 + emc->hw.init = &init; 269 + emc->want_low_jitter = low_jitter; 270 + 271 + clk = clk_register(NULL, &emc->hw); 272 + if (IS_ERR(clk)) { 273 + kfree(emc); 274 + return NULL; 275 + } 276 + 277 + return clk; 278 + } 279 + 280 + int tegra20_clk_prepare_emc_mc_same_freq(struct clk *emc_clk, bool same) 281 + { 282 + struct tegra_clk_emc *emc; 283 + struct clk_hw *hw; 284 + 285 + if (!emc_clk) 286 + return -EINVAL; 287 + 288 + hw = __clk_get_hw(emc_clk); 289 + emc = to_tegra_clk_emc(hw); 290 + emc->mc_same_freq = same; 291 + 292 + return 0; 293 + }
+29 -49
drivers/clk/tegra/clk-tegra20.c
··· 130 130 static void __iomem *clk_base; 131 131 static void __iomem *pmc_base; 132 132 133 - static DEFINE_SPINLOCK(emc_lock); 134 - 135 133 #define TEGRA_INIT_DATA_MUX(_name, _parents, _offset, \ 136 134 _clk_num, _gate_flags, _clk_id) \ 137 135 TEGRA_INIT_DATA(_name, NULL, NULL, _parents, _offset, \ ··· 758 760 static const char *mux_pllpcm_clkm[] = { "pll_p", "pll_c", "pll_m", "clk_m" }; 759 761 static const char *mux_pllpdc_clkm[] = { "pll_p", "pll_d_out0", "pll_c", 760 762 "clk_m" }; 761 - static const char *mux_pllmcp_clkm[] = { "pll_m", "pll_c", "pll_p", "clk_m" }; 762 763 763 764 static struct tegra_periph_init_data tegra_periph_clk_list[] = { 764 765 TEGRA_INIT_DATA_MUX("i2s1", i2s1_parents, CLK_SOURCE_I2S1, 11, TEGRA_PERIPH_ON_APB, TEGRA20_CLK_I2S1), ··· 784 787 TEGRA_INIT_DATA_NODIV("disp2", mux_pllpdc_clkm, CLK_SOURCE_DISP2, 30, 2, 26, 0, TEGRA20_CLK_DISP2), 785 788 }; 786 789 787 - static void __init tegra20_emc_clk_init(void) 788 - { 789 - const u32 use_pllm_ud = BIT(29); 790 - struct clk *clk; 791 - u32 emc_reg; 792 - 793 - clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm, 794 - ARRAY_SIZE(mux_pllmcp_clkm), 795 - CLK_SET_RATE_NO_REPARENT, 796 - clk_base + CLK_SOURCE_EMC, 797 - 30, 2, 0, &emc_lock); 798 - 799 - clk = tegra_clk_register_mc("mc", "emc_mux", clk_base + CLK_SOURCE_EMC, 800 - &emc_lock); 801 - clks[TEGRA20_CLK_MC] = clk; 802 - 803 - /* un-divided pll_m_out0 is currently unsupported */ 804 - emc_reg = readl_relaxed(clk_base + CLK_SOURCE_EMC); 805 - if (emc_reg & use_pllm_ud) { 806 - pr_err("%s: un-divided PllM_out0 used as clock source\n", 807 - __func__); 808 - return; 809 - } 810 - 811 - /* 812 - * Note that 'emc_mux' source and 'emc' rate shouldn't be changed at 813 - * the same time due to a HW bug, this won't happen because we're 814 - * defining 'emc_mux' and 'emc' as distinct clocks. 815 - */ 816 - clk = tegra_clk_register_divider("emc", "emc_mux", 817 - clk_base + CLK_SOURCE_EMC, CLK_IS_CRITICAL, 818 - TEGRA_DIVIDER_INT, 0, 8, 1, &emc_lock); 819 - clks[TEGRA20_CLK_EMC] = clk; 820 - } 821 - 822 790 static void __init tegra20_periph_clk_init(void) 823 791 { 824 792 struct tegra_periph_init_data *data; ··· 797 835 clks[TEGRA20_CLK_AC97] = clk; 798 836 799 837 /* emc */ 800 - tegra20_emc_clk_init(); 838 + clk = tegra20_clk_register_emc(clk_base + CLK_SOURCE_EMC, false); 839 + 840 + clks[TEGRA20_CLK_EMC] = clk; 841 + 842 + clk = tegra_clk_register_mc("mc", "emc", clk_base + CLK_SOURCE_EMC, 843 + NULL); 844 + clks[TEGRA20_CLK_MC] = clk; 801 845 802 846 /* dsi */ 803 847 clk = tegra_clk_register_periph_gate("dsi", "pll_d", 0, clk_base, 0, ··· 955 987 static void tegra20_cpu_clock_resume(void) 956 988 { 957 989 unsigned int reg, policy; 990 + u32 misc, base; 958 991 959 992 /* Is CPU complex already running on PLLX? */ 960 993 reg = readl(clk_base + CCLK_BURST_POLICY); ··· 969 1000 BUG(); 970 1001 971 1002 if (reg != CCLK_BURST_POLICY_PLLX) { 972 - /* restore PLLX settings if CPU is on different PLL */ 973 - writel(tegra20_cpu_clk_sctx.pllx_misc, 974 - clk_base + PLLX_MISC); 975 - writel(tegra20_cpu_clk_sctx.pllx_base, 976 - clk_base + PLLX_BASE); 1003 + misc = readl_relaxed(clk_base + PLLX_MISC); 1004 + base = readl_relaxed(clk_base + PLLX_BASE); 977 1005 978 - /* wait for PLL stabilization if PLLX was enabled */ 979 - if (tegra20_cpu_clk_sctx.pllx_base & (1 << 30)) 980 - udelay(300); 1006 + if (misc != tegra20_cpu_clk_sctx.pllx_misc || 1007 + base != tegra20_cpu_clk_sctx.pllx_base) { 1008 + /* restore PLLX settings if CPU is on different PLL */ 1009 + writel(tegra20_cpu_clk_sctx.pllx_misc, 1010 + clk_base + PLLX_MISC); 1011 + writel(tegra20_cpu_clk_sctx.pllx_base, 1012 + clk_base + PLLX_BASE); 1013 + 1014 + /* wait for PLL stabilization if PLLX was enabled */ 1015 + if (tegra20_cpu_clk_sctx.pllx_base & (1 << 30)) 1016 + udelay(300); 1017 + } 981 1018 } 982 1019 983 1020 /* ··· 1090 1115 if (IS_ERR(clk)) 1091 1116 return clk; 1092 1117 1118 + hw = __clk_get_hw(clk); 1119 + 1093 1120 /* 1094 1121 * Tegra20 CDEV1 and CDEV2 clocks are a bit special case, their parent 1095 1122 * clock is created by the pinctrl driver. It is possible for clk user ··· 1101 1124 */ 1102 1125 if (clkspec->args[0] == TEGRA20_CLK_CDEV1 || 1103 1126 clkspec->args[0] == TEGRA20_CLK_CDEV2) { 1104 - hw = __clk_get_hw(clk); 1105 - 1106 1127 parent_hw = clk_hw_get_parent(hw); 1107 1128 if (!parent_hw) 1129 + return ERR_PTR(-EPROBE_DEFER); 1130 + } 1131 + 1132 + if (clkspec->args[0] == TEGRA20_CLK_EMC) { 1133 + if (!tegra20_clk_emc_driver_available(hw)) 1108 1134 return ERR_PTR(-EPROBE_DEFER); 1109 1135 } 1110 1136
+157 -28
drivers/clk/tegra/clk-tegra210.c
··· 9 9 #include <linux/clkdev.h> 10 10 #include <linux/of.h> 11 11 #include <linux/of_address.h> 12 + #include <linux/syscore_ops.h> 12 13 #include <linux/delay.h> 13 14 #include <linux/export.h> 14 15 #include <linux/mutex.h> 15 16 #include <linux/clk/tegra.h> 16 17 #include <dt-bindings/clock/tegra210-car.h> 17 18 #include <dt-bindings/reset/tegra210-car.h> 18 - #include <linux/iopoll.h> 19 19 #include <linux/sizes.h> 20 20 #include <soc/tegra/pmc.h> 21 21 ··· 33 33 #define CLK_SOURCE_CSITE 0x1d4 34 34 #define CLK_SOURCE_EMC 0x19c 35 35 #define CLK_SOURCE_SOR1 0x410 36 + #define CLK_SOURCE_SOR0 0x414 36 37 #define CLK_SOURCE_LA 0x1f8 37 38 #define CLK_SOURCE_SDMMC2 0x154 38 39 #define CLK_SOURCE_SDMMC4 0x164 ··· 221 220 #define CLK_M_DIVISOR_SHIFT 2 222 221 #define CLK_M_DIVISOR_MASK 0x3 223 222 223 + #define CLK_MASK_ARM 0x44 224 + #define MISC_CLK_ENB 0x48 225 + 224 226 #define RST_DFLL_DVCO 0x2f4 225 227 #define DVFS_DFLL_RESET_SHIFT 0 226 228 227 229 #define CLK_RST_CONTROLLER_RST_DEV_Y_SET 0x2a8 228 230 #define CLK_RST_CONTROLLER_RST_DEV_Y_CLR 0x2ac 231 + #define CPU_SOFTRST_CTRL 0x380 229 232 230 233 #define LVL2_CLK_GATE_OVRA 0xf8 231 234 #define LVL2_CLK_GATE_OVRC 0x3a0 ··· 303 298 static DEFINE_SPINLOCK(pll_e_lock); 304 299 static DEFINE_SPINLOCK(pll_re_lock); 305 300 static DEFINE_SPINLOCK(pll_u_lock); 301 + static DEFINE_SPINLOCK(sor0_lock); 306 302 static DEFINE_SPINLOCK(sor1_lock); 307 303 static DEFINE_SPINLOCK(emc_lock); 308 304 static DEFINE_MUTEX(lvl2_ovr_lock); ··· 2357 2351 [tegra_clk_dpaux] = { .dt_id = TEGRA210_CLK_DPAUX, .present = true }, 2358 2352 [tegra_clk_dpaux1] = { .dt_id = TEGRA210_CLK_DPAUX1, .present = true }, 2359 2353 [tegra_clk_sor0] = { .dt_id = TEGRA210_CLK_SOR0, .present = true }, 2360 - [tegra_clk_sor0_lvds] = { .dt_id = TEGRA210_CLK_SOR0_LVDS, .present = true }, 2354 + [tegra_clk_sor0_out] = { .dt_id = TEGRA210_CLK_SOR0_OUT, .present = true }, 2361 2355 [tegra_clk_sor1] = { .dt_id = TEGRA210_CLK_SOR1, .present = true }, 2362 - [tegra_clk_sor1_src] = { .dt_id = TEGRA210_CLK_SOR1_SRC, .present = true }, 2356 + [tegra_clk_sor1_out] = { .dt_id = TEGRA210_CLK_SOR1_OUT, .present = true }, 2363 2357 [tegra_clk_gpu] = { .dt_id = TEGRA210_CLK_GPU, .present = true }, 2364 2358 [tegra_clk_pll_g_ref] = { .dt_id = TEGRA210_CLK_PLL_G_REF, .present = true, }, 2365 2359 [tegra_clk_uartb_8] = { .dt_id = TEGRA210_CLK_UARTB, .present = true }, ··· 2557 2551 { .con_id = "pll_c4_out2", .dt_id = TEGRA210_CLK_PLL_C4_OUT2 }, 2558 2552 { .con_id = "pll_c4_out3", .dt_id = TEGRA210_CLK_PLL_C4_OUT3 }, 2559 2553 { .con_id = "dpaux", .dt_id = TEGRA210_CLK_DPAUX }, 2560 - { .con_id = "sor0", .dt_id = TEGRA210_CLK_SOR0 }, 2561 2554 }; 2562 2555 2563 2556 static struct tegra_audio_clk_info tegra210_audio_plls[] = { ··· 2830 2825 struct tegra_clk_pll_freq_table *fentry; 2831 2826 struct tegra_clk_pll pllu; 2832 2827 u32 reg; 2828 + int ret; 2833 2829 2834 2830 for (fentry = pll_u_freq_table; fentry->input_rate; fentry++) { 2835 2831 if (fentry->input_rate == pll_ref_freq) ··· 2847 2841 reg = readl_relaxed(clk_base + pllu.params->ext_misc_reg[0]); 2848 2842 reg &= ~BIT(pllu.params->iddq_bit_idx); 2849 2843 writel_relaxed(reg, clk_base + pllu.params->ext_misc_reg[0]); 2850 - udelay(5); 2844 + fence_udelay(5, clk_base); 2851 2845 2852 2846 reg = readl_relaxed(clk_base + PLLU_BASE); 2853 2847 reg &= ~GENMASK(20, 0); ··· 2855 2849 reg |= fentry->n << 8; 2856 2850 reg |= fentry->p << 16; 2857 2851 writel(reg, clk_base + PLLU_BASE); 2858 - udelay(1); 2852 + fence_udelay(1, clk_base); 2859 2853 reg |= PLL_ENABLE; 2860 2854 writel(reg, clk_base + PLLU_BASE); 2861 2855 2862 - readl_relaxed_poll_timeout_atomic(clk_base + PLLU_BASE, reg, 2863 - reg & PLL_BASE_LOCK, 2, 1000); 2864 - if (!(reg & PLL_BASE_LOCK)) { 2856 + /* 2857 + * During clocks resume, same PLLU init and enable sequence get 2858 + * executed. So, readx_poll_timeout_atomic can't be used here as it 2859 + * uses ktime_get() and timekeeping resume doesn't happen by that 2860 + * time. So, using tegra210_wait_for_mask for PLL LOCK. 2861 + */ 2862 + ret = tegra210_wait_for_mask(&pllu, PLLU_BASE, PLL_BASE_LOCK); 2863 + if (ret) { 2865 2864 pr_err("Timed out waiting for PLL_U to lock\n"); 2866 2865 return -ETIMEDOUT; 2867 2866 } ··· 2906 2895 reg = readl_relaxed(clk_base + XUSB_PLL_CFG0); 2907 2896 reg &= ~XUSB_PLL_CFG0_PLLU_LOCK_DLY_MASK; 2908 2897 writel_relaxed(reg, clk_base + XUSB_PLL_CFG0); 2909 - udelay(1); 2898 + fence_udelay(1, clk_base); 2910 2899 2911 2900 reg = readl_relaxed(clk_base + PLLU_HW_PWRDN_CFG0); 2912 2901 reg |= PLLU_HW_PWRDN_CFG0_SEQ_ENABLE; 2913 2902 writel_relaxed(reg, clk_base + PLLU_HW_PWRDN_CFG0); 2914 - udelay(1); 2903 + fence_udelay(1, clk_base); 2915 2904 2916 2905 reg = readl_relaxed(clk_base + PLLU_BASE); 2917 2906 reg &= ~PLLU_BASE_CLKENABLE_USB; ··· 2926 2915 return 0; 2927 2916 } 2928 2917 2929 - static const char * const sor1_out_parents[] = { 2930 - /* 2931 - * Bit 0 of the mux selects sor1_pad_clkout, irrespective of bit 1, so 2932 - * the sor1_pad_clkout parent appears twice in the list below. This is 2933 - * merely to support clk_get_parent() if firmware happened to set 2934 - * these bits to 0b11. While not an invalid setting, code should 2935 - * always set the bits to 0b01 to select sor1_pad_clkout. 2936 - */ 2937 - "sor_safe", "sor1_pad_clkout", "sor1", "sor1_pad_clkout", 2918 + /* 2919 + * The SOR hardware blocks are driven by two clocks: a module clock that is 2920 + * used to access registers and a pixel clock that is sourced from the same 2921 + * pixel clock that also drives the head attached to the SOR. The module 2922 + * clock is typically called sorX (with X being the SOR instance) and the 2923 + * pixel clock is called sorX_out. The source for the SOR pixel clock is 2924 + * referred to as the "parent" clock. 2925 + * 2926 + * On Tegra186 and newer, clocks are provided by the BPMP. Unfortunately the 2927 + * BPMP implementation for the SOR clocks doesn't exactly match the above in 2928 + * some aspects. For example, the SOR module is really clocked by the pad or 2929 + * sor_safe clocks, but BPMP models the sorX clock as being sourced by the 2930 + * pixel clocks. Conversely the sorX_out clock is sourced by the sor_safe or 2931 + * pad clocks on BPMP. 2932 + * 2933 + * In order to allow the display driver to deal with all SoC generations in 2934 + * a unified way, implement the BPMP semantics in this driver. 2935 + */ 2936 + 2937 + static const char * const sor0_parents[] = { 2938 + "pll_d_out0", 2939 + }; 2940 + 2941 + static const char * const sor0_out_parents[] = { 2942 + "sor_safe", "sor0_pad_clkout", 2938 2943 }; 2939 2944 2940 2945 static const char * const sor1_parents[] = { ··· 2959 2932 2960 2933 static u32 sor1_parents_idx[] = { 0, 2, 5, 6 }; 2961 2934 2935 + static const char * const sor1_out_parents[] = { 2936 + /* 2937 + * Bit 0 of the mux selects sor1_pad_clkout, irrespective of bit 1, so 2938 + * the sor1_pad_clkout parent appears twice in the list below. This is 2939 + * merely to support clk_get_parent() if firmware happened to set 2940 + * these bits to 0b11. While not an invalid setting, code should 2941 + * always set the bits to 0b01 to select sor1_pad_clkout. 2942 + */ 2943 + "sor_safe", "sor1_pad_clkout", "sor1_out", "sor1_pad_clkout", 2944 + }; 2945 + 2962 2946 static struct tegra_periph_init_data tegra210_periph[] = { 2947 + /* 2948 + * On Tegra210, the sor0 clock doesn't have a mux it bitfield 31:29, 2949 + * but it is hardwired to the pll_d_out0 clock. 2950 + */ 2951 + TEGRA_INIT_DATA_TABLE("sor0", NULL, NULL, sor0_parents, 2952 + CLK_SOURCE_SOR0, 29, 0x0, 0, 0, 0, 0, 2953 + 0, 182, 0, tegra_clk_sor0, NULL, 0, 2954 + &sor0_lock), 2955 + TEGRA_INIT_DATA_TABLE("sor0_out", NULL, NULL, sor0_out_parents, 2956 + CLK_SOURCE_SOR0, 14, 0x1, 0, 0, 0, 0, 2957 + 0, 0, TEGRA_PERIPH_NO_GATE, tegra_clk_sor0_out, 2958 + NULL, 0, &sor0_lock), 2963 2959 TEGRA_INIT_DATA_TABLE("sor1", NULL, NULL, sor1_parents, 2964 2960 CLK_SOURCE_SOR1, 29, 0x7, 0, 0, 8, 1, 2965 - TEGRA_DIVIDER_ROUND_UP, 183, 0, tegra_clk_sor1, 2966 - sor1_parents_idx, 0, &sor1_lock), 2961 + TEGRA_DIVIDER_ROUND_UP, 183, 0, 2962 + tegra_clk_sor1, sor1_parents_idx, 0, 2963 + &sor1_lock), 2964 + TEGRA_INIT_DATA_TABLE("sor1_out", NULL, NULL, sor1_out_parents, 2965 + CLK_SOURCE_SOR1, 14, 0x3, 0, 0, 0, 0, 2966 + 0, 0, TEGRA_PERIPH_NO_GATE, 2967 + tegra_clk_sor1_out, NULL, 0, &sor1_lock), 2967 2968 }; 2968 2969 2969 2970 static const char * const la_parents[] = { ··· 3023 2968 clk = tegra_clk_register_periph_fixed("dpaux1", "sor_safe", 0, clk_base, 3024 2969 1, 17, 207); 3025 2970 clks[TEGRA210_CLK_DPAUX1] = clk; 3026 - 3027 - clk = clk_register_mux_table(NULL, "sor1_out", sor1_out_parents, 3028 - ARRAY_SIZE(sor1_out_parents), 0, 3029 - clk_base + CLK_SOURCE_SOR1, 14, 0x3, 3030 - 0, NULL, &sor1_lock); 3031 - clks[TEGRA210_CLK_SOR1_OUT] = clk; 3032 2971 3033 2972 /* pll_d_dsi_out */ 3034 2973 clk = clk_register_gate(NULL, "pll_d_dsi_out", "pll_d_out0", 0, ··· 3336 3287 } 3337 3288 3338 3289 #ifdef CONFIG_PM_SLEEP 3290 + #define car_readl(_base, _off) readl_relaxed(clk_base + (_base) + ((_off) * 4)) 3291 + #define car_writel(_val, _base, _off) \ 3292 + writel_relaxed(_val, clk_base + (_base) + ((_off) * 4)) 3293 + 3294 + static u32 spare_reg_ctx, misc_clk_enb_ctx, clk_msk_arm_ctx; 3295 + static u32 cpu_softrst_ctx[3]; 3296 + 3297 + static int tegra210_clk_suspend(void) 3298 + { 3299 + unsigned int i; 3300 + 3301 + clk_save_context(); 3302 + 3303 + /* 3304 + * Save the bootloader configured clock registers SPARE_REG0, 3305 + * MISC_CLK_ENB, CLK_MASK_ARM, CPU_SOFTRST_CTRL. 3306 + */ 3307 + spare_reg_ctx = readl_relaxed(clk_base + SPARE_REG0); 3308 + misc_clk_enb_ctx = readl_relaxed(clk_base + MISC_CLK_ENB); 3309 + clk_msk_arm_ctx = readl_relaxed(clk_base + CLK_MASK_ARM); 3310 + 3311 + for (i = 0; i < ARRAY_SIZE(cpu_softrst_ctx); i++) 3312 + cpu_softrst_ctx[i] = car_readl(CPU_SOFTRST_CTRL, i); 3313 + 3314 + tegra_clk_periph_suspend(); 3315 + return 0; 3316 + } 3317 + 3318 + static void tegra210_clk_resume(void) 3319 + { 3320 + unsigned int i; 3321 + 3322 + tegra_clk_osc_resume(clk_base); 3323 + 3324 + /* 3325 + * Restore the bootloader configured clock registers SPARE_REG0, 3326 + * MISC_CLK_ENB, CLK_MASK_ARM, CPU_SOFTRST_CTRL from saved context. 3327 + */ 3328 + writel_relaxed(spare_reg_ctx, clk_base + SPARE_REG0); 3329 + writel_relaxed(misc_clk_enb_ctx, clk_base + MISC_CLK_ENB); 3330 + writel_relaxed(clk_msk_arm_ctx, clk_base + CLK_MASK_ARM); 3331 + 3332 + for (i = 0; i < ARRAY_SIZE(cpu_softrst_ctx); i++) 3333 + car_writel(cpu_softrst_ctx[i], CPU_SOFTRST_CTRL, i); 3334 + 3335 + /* 3336 + * Tegra clock programming sequence recommends peripheral clock to 3337 + * be enabled prior to changing its clock source and divider to 3338 + * prevent glitchless frequency switch. 3339 + * So, enable all peripheral clocks before restoring their source 3340 + * and dividers. 3341 + */ 3342 + writel_relaxed(TEGRA210_CLK_ENB_VLD_MSK_L, clk_base + CLK_OUT_ENB_L); 3343 + writel_relaxed(TEGRA210_CLK_ENB_VLD_MSK_H, clk_base + CLK_OUT_ENB_H); 3344 + writel_relaxed(TEGRA210_CLK_ENB_VLD_MSK_U, clk_base + CLK_OUT_ENB_U); 3345 + writel_relaxed(TEGRA210_CLK_ENB_VLD_MSK_V, clk_base + CLK_OUT_ENB_V); 3346 + writel_relaxed(TEGRA210_CLK_ENB_VLD_MSK_W, clk_base + CLK_OUT_ENB_W); 3347 + writel_relaxed(TEGRA210_CLK_ENB_VLD_MSK_X, clk_base + CLK_OUT_ENB_X); 3348 + writel_relaxed(TEGRA210_CLK_ENB_VLD_MSK_Y, clk_base + CLK_OUT_ENB_Y); 3349 + 3350 + /* wait for all writes to happen to have all the clocks enabled */ 3351 + fence_udelay(2, clk_base); 3352 + 3353 + /* restore PLLs and all peripheral clock rates */ 3354 + tegra210_init_pllu(); 3355 + clk_restore_context(); 3356 + 3357 + /* restore saved context of peripheral clocks and reset state */ 3358 + tegra_clk_periph_resume(); 3359 + } 3360 + 3339 3361 static void tegra210_cpu_clock_suspend(void) 3340 3362 { 3341 3363 /* switch coresite to clk_m, save off original source */ ··· 3421 3301 clk_base + CLK_SOURCE_CSITE); 3422 3302 } 3423 3303 #endif 3304 + 3305 + static struct syscore_ops tegra_clk_syscore_ops = { 3306 + #ifdef CONFIG_PM_SLEEP 3307 + .suspend = tegra210_clk_suspend, 3308 + .resume = tegra210_clk_resume, 3309 + #endif 3310 + }; 3424 3311 3425 3312 static struct tegra_cpu_car_ops tegra210_cpu_car_ops = { 3426 3313 .wait_for_reset = tegra210_wait_cpu_in_reset, ··· 3713 3586 tegra210_mbist_clk_init(); 3714 3587 3715 3588 tegra_cpu_car_ops = &tegra210_cpu_car_ops; 3589 + 3590 + register_syscore_ops(&tegra_clk_syscore_ops); 3716 3591 } 3717 3592 CLK_OF_DECLARE(tegra210, "nvidia,tegra210-car", tegra210_clock_init);
+42 -19
drivers/clk/tegra/clk-tegra30.c
··· 151 151 152 152 static DEFINE_SPINLOCK(cml_lock); 153 153 static DEFINE_SPINLOCK(pll_d_lock); 154 - static DEFINE_SPINLOCK(emc_lock); 155 154 156 155 #define TEGRA_INIT_DATA_MUX(_name, _parents, _offset, \ 157 156 _clk_num, _gate_flags, _clk_id) \ ··· 807 808 [tegra_clk_pll_a] = { .dt_id = TEGRA30_CLK_PLL_A, .present = true }, 808 809 [tegra_clk_pll_a_out0] = { .dt_id = TEGRA30_CLK_PLL_A_OUT0, .present = true }, 809 810 [tegra_clk_cec] = { .dt_id = TEGRA30_CLK_CEC, .present = true }, 810 - [tegra_clk_emc] = { .dt_id = TEGRA30_CLK_EMC, .present = true }, 811 + [tegra_clk_emc] = { .dt_id = TEGRA30_CLK_EMC, .present = false }, 811 812 }; 812 813 813 814 static const char *pll_e_parents[] = { "pll_ref", "pll_p" }; ··· 994 995 static const char *mux_pllacp_clkm[] = { "pll_a_out0", "unused", "pll_p", 995 996 "clk_m" }; 996 997 static const char *mux_pllpcm_clkm[] = { "pll_p", "pll_c", "pll_m", "clk_m" }; 997 - static const char *mux_pllmcp_clkm[] = { "pll_m", "pll_c", "pll_p", "clk_m" }; 998 998 static const char *spdif_out_parents[] = { "pll_a_out0", "spdif_2x", "pll_p", 999 999 "clk_m" }; 1000 1000 static const char *mux_pllmcpa[] = { "pll_m", "pll_c", "pll_p", "pll_a_out0" }; ··· 1042 1044 clks[TEGRA30_CLK_AFI] = clk; 1043 1045 1044 1046 /* emc */ 1045 - clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm, 1046 - ARRAY_SIZE(mux_pllmcp_clkm), 1047 - CLK_SET_RATE_NO_REPARENT, 1048 - clk_base + CLK_SOURCE_EMC, 1049 - 30, 2, 0, &emc_lock); 1047 + clk = tegra20_clk_register_emc(clk_base + CLK_SOURCE_EMC, true); 1050 1048 1051 - clk = tegra_clk_register_mc("mc", "emc_mux", clk_base + CLK_SOURCE_EMC, 1052 - &emc_lock); 1049 + clks[TEGRA30_CLK_EMC] = clk; 1050 + 1051 + clk = tegra_clk_register_mc("mc", "emc", clk_base + CLK_SOURCE_EMC, 1052 + NULL); 1053 1053 clks[TEGRA30_CLK_MC] = clk; 1054 1054 1055 1055 /* cml0 */ ··· 1163 1167 static void tegra30_cpu_clock_resume(void) 1164 1168 { 1165 1169 unsigned int reg, policy; 1170 + u32 misc, base; 1166 1171 1167 1172 /* Is CPU complex already running on PLLX? */ 1168 1173 reg = readl(clk_base + CLK_RESET_CCLK_BURST); ··· 1177 1180 BUG(); 1178 1181 1179 1182 if (reg != CLK_RESET_CCLK_BURST_POLICY_PLLX) { 1180 - /* restore PLLX settings if CPU is on different PLL */ 1181 - writel(tegra30_cpu_clk_sctx.pllx_misc, 1182 - clk_base + CLK_RESET_PLLX_MISC); 1183 - writel(tegra30_cpu_clk_sctx.pllx_base, 1184 - clk_base + CLK_RESET_PLLX_BASE); 1183 + misc = readl_relaxed(clk_base + CLK_RESET_PLLX_MISC); 1184 + base = readl_relaxed(clk_base + CLK_RESET_PLLX_BASE); 1185 1185 1186 - /* wait for PLL stabilization if PLLX was enabled */ 1187 - if (tegra30_cpu_clk_sctx.pllx_base & (1 << 30)) 1188 - udelay(300); 1186 + if (misc != tegra30_cpu_clk_sctx.pllx_misc || 1187 + base != tegra30_cpu_clk_sctx.pllx_base) { 1188 + /* restore PLLX settings if CPU is on different PLL */ 1189 + writel(tegra30_cpu_clk_sctx.pllx_misc, 1190 + clk_base + CLK_RESET_PLLX_MISC); 1191 + writel(tegra30_cpu_clk_sctx.pllx_base, 1192 + clk_base + CLK_RESET_PLLX_BASE); 1193 + 1194 + /* wait for PLL stabilization if PLLX was enabled */ 1195 + if (tegra30_cpu_clk_sctx.pllx_base & (1 << 30)) 1196 + udelay(300); 1197 + } 1189 1198 } 1190 1199 1191 1200 /* ··· 1305 1302 { "pll_a", &pll_a_params, tegra_clk_pll_a, "pll_p_out1" }, 1306 1303 }; 1307 1304 1305 + static struct clk *tegra30_clk_src_onecell_get(struct of_phandle_args *clkspec, 1306 + void *data) 1307 + { 1308 + struct clk_hw *hw; 1309 + struct clk *clk; 1310 + 1311 + clk = of_clk_src_onecell_get(clkspec, data); 1312 + if (IS_ERR(clk)) 1313 + return clk; 1314 + 1315 + hw = __clk_get_hw(clk); 1316 + 1317 + if (clkspec->args[0] == TEGRA30_CLK_EMC) { 1318 + if (!tegra20_clk_emc_driver_available(hw)) 1319 + return ERR_PTR(-EPROBE_DEFER); 1320 + } 1321 + 1322 + return clk; 1323 + } 1324 + 1308 1325 static void __init tegra30_clock_init(struct device_node *np) 1309 1326 { 1310 1327 struct device_node *node; ··· 1368 1345 1369 1346 tegra_init_dup_clks(tegra_clk_duplicates, clks, TEGRA30_CLK_CLK_MAX); 1370 1347 1371 - tegra_add_of_provider(np, of_clk_src_onecell_get); 1348 + tegra_add_of_provider(np, tegra30_clk_src_onecell_get); 1372 1349 tegra_register_devclks(devclks, ARRAY_SIZE(devclks)); 1373 1350 1374 1351 tegra_clk_apply_init_table = tegra30_clock_apply_init_table;
+68 -44
drivers/clk/tegra/clk.c
··· 16 16 17 17 #include "clk.h" 18 18 19 - #define CLK_OUT_ENB_L 0x010 20 - #define CLK_OUT_ENB_H 0x014 21 - #define CLK_OUT_ENB_U 0x018 22 - #define CLK_OUT_ENB_V 0x360 23 - #define CLK_OUT_ENB_W 0x364 24 - #define CLK_OUT_ENB_X 0x280 25 - #define CLK_OUT_ENB_Y 0x298 26 - #define CLK_OUT_ENB_SET_L 0x320 27 - #define CLK_OUT_ENB_CLR_L 0x324 28 - #define CLK_OUT_ENB_SET_H 0x328 29 - #define CLK_OUT_ENB_CLR_H 0x32c 30 - #define CLK_OUT_ENB_SET_U 0x330 31 - #define CLK_OUT_ENB_CLR_U 0x334 32 - #define CLK_OUT_ENB_SET_V 0x440 33 - #define CLK_OUT_ENB_CLR_V 0x444 34 - #define CLK_OUT_ENB_SET_W 0x448 35 - #define CLK_OUT_ENB_CLR_W 0x44c 36 - #define CLK_OUT_ENB_SET_X 0x284 37 - #define CLK_OUT_ENB_CLR_X 0x288 38 - #define CLK_OUT_ENB_SET_Y 0x29c 39 - #define CLK_OUT_ENB_CLR_Y 0x2a0 40 - 41 - #define RST_DEVICES_L 0x004 42 - #define RST_DEVICES_H 0x008 43 - #define RST_DEVICES_U 0x00C 44 - #define RST_DEVICES_V 0x358 45 - #define RST_DEVICES_W 0x35C 46 - #define RST_DEVICES_X 0x28C 47 - #define RST_DEVICES_Y 0x2a4 48 - #define RST_DEVICES_SET_L 0x300 49 - #define RST_DEVICES_CLR_L 0x304 50 - #define RST_DEVICES_SET_H 0x308 51 - #define RST_DEVICES_CLR_H 0x30c 52 - #define RST_DEVICES_SET_U 0x310 53 - #define RST_DEVICES_CLR_U 0x314 54 - #define RST_DEVICES_SET_V 0x430 55 - #define RST_DEVICES_CLR_V 0x434 56 - #define RST_DEVICES_SET_W 0x438 57 - #define RST_DEVICES_CLR_W 0x43c 58 - #define RST_DEVICES_SET_X 0x290 59 - #define RST_DEVICES_CLR_X 0x294 60 - #define RST_DEVICES_SET_Y 0x2a8 61 - #define RST_DEVICES_CLR_Y 0x2ac 62 - 63 19 /* Global data of Tegra CPU CAR ops */ 64 20 static struct tegra_cpu_car_ops dummy_car_ops; 65 21 struct tegra_cpu_car_ops *tegra_cpu_car_ops = &dummy_car_ops; 66 22 67 23 int *periph_clk_enb_refcnt; 68 24 static int periph_banks; 25 + static u32 *periph_state_ctx; 69 26 static struct clk **clks; 70 27 static int clk_num; 71 28 static struct clk_onecell_data clk_data; ··· 156 199 } 157 200 } 158 201 202 + void tegra_clk_set_pllp_out_cpu(bool enable) 203 + { 204 + u32 val; 205 + 206 + val = readl_relaxed(clk_base + CLK_OUT_ENB_Y); 207 + if (enable) 208 + val |= CLK_ENB_PLLP_OUT_CPU; 209 + else 210 + val &= ~CLK_ENB_PLLP_OUT_CPU; 211 + 212 + writel_relaxed(val, clk_base + CLK_OUT_ENB_Y); 213 + } 214 + 215 + void tegra_clk_periph_suspend(void) 216 + { 217 + unsigned int i, idx; 218 + 219 + idx = 0; 220 + for (i = 0; i < periph_banks; i++, idx++) 221 + periph_state_ctx[idx] = 222 + readl_relaxed(clk_base + periph_regs[i].enb_reg); 223 + 224 + for (i = 0; i < periph_banks; i++, idx++) 225 + periph_state_ctx[idx] = 226 + readl_relaxed(clk_base + periph_regs[i].rst_reg); 227 + } 228 + 229 + void tegra_clk_periph_resume(void) 230 + { 231 + unsigned int i, idx; 232 + 233 + idx = 0; 234 + for (i = 0; i < periph_banks; i++, idx++) 235 + writel_relaxed(periph_state_ctx[idx], 236 + clk_base + periph_regs[i].enb_reg); 237 + /* 238 + * All non-boot peripherals will be in reset state on resume. 239 + * Wait for 5us of reset propagation delay before de-asserting 240 + * the peripherals based on the saved context. 241 + */ 242 + fence_udelay(5, clk_base); 243 + 244 + for (i = 0; i < periph_banks; i++, idx++) 245 + writel_relaxed(periph_state_ctx[idx], 246 + clk_base + periph_regs[i].rst_reg); 247 + 248 + fence_udelay(2, clk_base); 249 + } 250 + 251 + static int tegra_clk_periph_ctx_init(int banks) 252 + { 253 + periph_state_ctx = kcalloc(2 * banks, sizeof(*periph_state_ctx), 254 + GFP_KERNEL); 255 + if (!periph_state_ctx) 256 + return -ENOMEM; 257 + 258 + return 0; 259 + } 260 + 159 261 struct clk ** __init tegra_clk_init(void __iomem *regs, int num, int banks) 160 262 { 161 263 clk_base = regs; ··· 235 219 kfree(periph_clk_enb_refcnt); 236 220 237 221 clk_num = num; 222 + 223 + if (IS_ENABLED(CONFIG_PM_SLEEP)) { 224 + if (tegra_clk_periph_ctx_init(banks)) { 225 + kfree(periph_clk_enb_refcnt); 226 + kfree(clks); 227 + return NULL; 228 + } 229 + } 238 230 239 231 return clks; 240 232 }
+70
drivers/clk/tegra/clk.h
··· 10 10 #include <linux/clkdev.h> 11 11 #include <linux/delay.h> 12 12 13 + #define CLK_OUT_ENB_L 0x010 14 + #define CLK_OUT_ENB_H 0x014 15 + #define CLK_OUT_ENB_U 0x018 16 + #define CLK_OUT_ENB_V 0x360 17 + #define CLK_OUT_ENB_W 0x364 18 + #define CLK_OUT_ENB_X 0x280 19 + #define CLK_OUT_ENB_Y 0x298 20 + #define CLK_ENB_PLLP_OUT_CPU BIT(31) 21 + #define CLK_OUT_ENB_SET_L 0x320 22 + #define CLK_OUT_ENB_CLR_L 0x324 23 + #define CLK_OUT_ENB_SET_H 0x328 24 + #define CLK_OUT_ENB_CLR_H 0x32c 25 + #define CLK_OUT_ENB_SET_U 0x330 26 + #define CLK_OUT_ENB_CLR_U 0x334 27 + #define CLK_OUT_ENB_SET_V 0x440 28 + #define CLK_OUT_ENB_CLR_V 0x444 29 + #define CLK_OUT_ENB_SET_W 0x448 30 + #define CLK_OUT_ENB_CLR_W 0x44c 31 + #define CLK_OUT_ENB_SET_X 0x284 32 + #define CLK_OUT_ENB_CLR_X 0x288 33 + #define CLK_OUT_ENB_SET_Y 0x29c 34 + #define CLK_OUT_ENB_CLR_Y 0x2a0 35 + 36 + #define RST_DEVICES_L 0x004 37 + #define RST_DEVICES_H 0x008 38 + #define RST_DEVICES_U 0x00C 39 + #define RST_DEVICES_V 0x358 40 + #define RST_DEVICES_W 0x35C 41 + #define RST_DEVICES_X 0x28C 42 + #define RST_DEVICES_Y 0x2a4 43 + #define RST_DEVICES_SET_L 0x300 44 + #define RST_DEVICES_CLR_L 0x304 45 + #define RST_DEVICES_SET_H 0x308 46 + #define RST_DEVICES_CLR_H 0x30c 47 + #define RST_DEVICES_SET_U 0x310 48 + #define RST_DEVICES_CLR_U 0x314 49 + #define RST_DEVICES_SET_V 0x430 50 + #define RST_DEVICES_CLR_V 0x434 51 + #define RST_DEVICES_SET_W 0x438 52 + #define RST_DEVICES_CLR_W 0x43c 53 + #define RST_DEVICES_SET_X 0x290 54 + #define RST_DEVICES_CLR_X 0x294 55 + #define RST_DEVICES_SET_Y 0x2a8 56 + #define RST_DEVICES_CLR_Y 0x2ac 57 + 58 + /* 59 + * Tegra CLK_OUT_ENB registers have some undefined bits which are not used and 60 + * any accidental write of 1 to these bits can cause PSLVERR. 61 + * So below are the valid mask defines for each CLK_OUT_ENB register used to 62 + * turn ON only the valid clocks. 63 + */ 64 + #define TEGRA210_CLK_ENB_VLD_MSK_L 0xdcd7dff9 65 + #define TEGRA210_CLK_ENB_VLD_MSK_H 0x87d1f3e7 66 + #define TEGRA210_CLK_ENB_VLD_MSK_U 0xf3fed3fa 67 + #define TEGRA210_CLK_ENB_VLD_MSK_V 0xffc18cfb 68 + #define TEGRA210_CLK_ENB_VLD_MSK_W 0x793fb7ff 69 + #define TEGRA210_CLK_ENB_VLD_MSK_X 0x3fe66fff 70 + #define TEGRA210_CLK_ENB_VLD_MSK_Y 0xfc1fc7ff 71 + 13 72 /** 14 73 * struct tegra_clk_sync_source - external clock source from codec 15 74 * ··· 728 669 * Flags: 729 670 * TEGRA_DIVIDER_2 - LP cluster has additional divider. This flag indicates 730 671 * that this is LP cluster clock. 672 + * TEGRA210_CPU_CLK - This flag is used to identify CPU cluster for gen5 673 + * super mux parent using PLLP branches. To use PLLP branches to CPU, need 674 + * to configure additional bit PLLP_OUT_CPU in the clock registers. 731 675 */ 732 676 struct tegra_clk_super_mux { 733 677 struct clk_hw hw; ··· 747 685 #define to_clk_super_mux(_hw) container_of(_hw, struct tegra_clk_super_mux, hw) 748 686 749 687 #define TEGRA_DIVIDER_2 BIT(0) 688 + #define TEGRA210_CPU_CLK BIT(1) 750 689 751 690 extern const struct clk_ops tegra_clk_super_ops; 752 691 struct clk *tegra_clk_register_super_mux(const char *name, ··· 892 829 int tegra_pll_p_div_to_hw(struct tegra_clk_pll *pll, u8 p_div); 893 830 int div_frac_get(unsigned long rate, unsigned parent_rate, u8 width, 894 831 u8 frac_width, u8 flags); 832 + void tegra_clk_osc_resume(void __iomem *clk_base); 833 + void tegra_clk_set_pllp_out_cpu(bool enable); 834 + void tegra_clk_periph_suspend(void); 835 + void tegra_clk_periph_resume(void); 895 836 896 837 897 838 /* Combined read fence with delay */ ··· 904 837 readl(reg); \ 905 838 udelay(delay); \ 906 839 } while (0) 840 + 841 + bool tegra20_clk_emc_driver_available(struct clk_hw *emc_hw); 842 + struct clk *tegra20_clk_register_emc(void __iomem *ioaddr, bool low_jitter); 907 843 908 844 #endif /* TEGRA_CLK_H */
+2 -9
drivers/clk/ti/adpll.c
··· 194 194 if (err) 195 195 return NULL; 196 196 } else { 197 - const char *base_name = "adpll"; 198 - char *buf; 199 - 200 - buf = devm_kzalloc(d->dev, 8 + 1 + strlen(base_name) + 1 + 201 - strlen(postfix), GFP_KERNEL); 202 - if (!buf) 203 - return NULL; 204 - sprintf(buf, "%08lx.%s.%s", d->pa, base_name, postfix); 205 - name = buf; 197 + name = devm_kasprintf(d->dev, GFP_KERNEL, "%08lx.adpll.%s", 198 + d->pa, postfix); 206 199 } 207 200 208 201 return name;
+2 -2
drivers/clk/ti/clk-33xx.c
··· 107 107 }; 108 108 109 109 static const struct omap_clkctrl_reg_data am3_pruss_ocp_clkctrl_regs[] __initconst = { 110 - { AM3_PRUSS_OCP_PRUSS_CLKCTRL, NULL, CLKF_SW_SUP, "pruss_ocp_gclk" }, 110 + { AM3_PRUSS_OCP_PRUSS_CLKCTRL, NULL, CLKF_SW_SUP | CLKF_NO_IDLEST, "pruss_ocp_gclk" }, 111 111 { 0 }, 112 112 }; 113 113 ··· 217 217 }; 218 218 219 219 static const struct omap_clkctrl_reg_data am3_gfx_l3_clkctrl_regs[] __initconst = { 220 - { AM3_GFX_L3_GFX_CLKCTRL, NULL, CLKF_SW_SUP, "gfx_fck_div_ck" }, 220 + { AM3_GFX_L3_GFX_CLKCTRL, NULL, CLKF_SW_SUP | CLKF_NO_IDLEST, "gfx_fck_div_ck" }, 221 221 { 0 }, 222 222 }; 223 223
+2 -2
drivers/clk/ti/clk-43xx.c
··· 73 73 }; 74 74 75 75 static const struct omap_clkctrl_reg_data am4_gfx_l3_clkctrl_regs[] __initconst = { 76 - { AM4_GFX_L3_GFX_CLKCTRL, NULL, CLKF_SW_SUP, "gfx_fck_div_ck" }, 76 + { AM4_GFX_L3_GFX_CLKCTRL, NULL, CLKF_SW_SUP | CLKF_NO_IDLEST, "gfx_fck_div_ck" }, 77 77 { 0 }, 78 78 }; 79 79 ··· 126 126 }; 127 127 128 128 static const struct omap_clkctrl_reg_data am4_pruss_ocp_clkctrl_regs[] __initconst = { 129 - { AM4_PRUSS_OCP_PRUSS_CLKCTRL, NULL, CLKF_SW_SUP, "pruss_ocp_gclk" }, 129 + { AM4_PRUSS_OCP_PRUSS_CLKCTRL, NULL, CLKF_SW_SUP | CLKF_NO_IDLEST, "pruss_ocp_gclk" }, 130 130 { 0 }, 131 131 }; 132 132
+2 -2
drivers/clk/ti/clk-44xx.c
··· 37 37 }; 38 38 39 39 static const struct omap_clkctrl_reg_data omap4_tesla_clkctrl_regs[] __initconst = { 40 - { OMAP4_DSP_CLKCTRL, NULL, CLKF_HW_SUP, "dpll_iva_m4x2_ck" }, 40 + { OMAP4_DSP_CLKCTRL, NULL, CLKF_HW_SUP | CLKF_NO_IDLEST, "dpll_iva_m4x2_ck" }, 41 41 { 0 }, 42 42 }; 43 43 ··· 219 219 }; 220 220 221 221 static const struct omap_clkctrl_reg_data omap4_ducati_clkctrl_regs[] __initconst = { 222 - { OMAP4_IPU_CLKCTRL, NULL, CLKF_HW_SUP, "ducati_clk_mux_ck" }, 222 + { OMAP4_IPU_CLKCTRL, NULL, CLKF_HW_SUP | CLKF_NO_IDLEST, "ducati_clk_mux_ck" }, 223 223 { 0 }, 224 224 }; 225 225
+9 -2
drivers/clk/ti/clk-54xx.c
··· 31 31 }; 32 32 33 33 static const struct omap_clkctrl_reg_data omap5_dsp_clkctrl_regs[] __initconst = { 34 - { OMAP5_MMU_DSP_CLKCTRL, NULL, CLKF_HW_SUP, "dpll_iva_h11x2_ck" }, 34 + { OMAP5_MMU_DSP_CLKCTRL, NULL, CLKF_HW_SUP | CLKF_NO_IDLEST, "dpll_iva_h11x2_ck" }, 35 35 { 0 }, 36 36 }; 37 37 ··· 145 145 }; 146 146 147 147 static const struct omap_clkctrl_reg_data omap5_ipu_clkctrl_regs[] __initconst = { 148 - { OMAP5_MMU_IPU_CLKCTRL, NULL, CLKF_HW_SUP, "dpll_core_h22x2_ck" }, 148 + { OMAP5_MMU_IPU_CLKCTRL, NULL, CLKF_HW_SUP | CLKF_NO_IDLEST, "dpll_core_h22x2_ck" }, 149 149 { 0 }, 150 150 }; 151 151 ··· 283 283 { OMAP5_I2C5_CLKCTRL, NULL, CLKF_SW_SUP, "func_96m_fclk" }, 284 284 { OMAP5_UART5_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" }, 285 285 { OMAP5_UART6_CLKCTRL, NULL, CLKF_SW_SUP, "func_48m_fclk" }, 286 + { 0 }, 287 + }; 288 + 289 + static const struct omap_clkctrl_reg_data omap5_iva_clkctrl_regs[] __initconst = { 290 + { OMAP5_IVA_CLKCTRL, NULL, CLKF_HW_SUP, "dpll_iva_h12x2_ck" }, 291 + { OMAP5_SL2IF_CLKCTRL, NULL, CLKF_HW_SUP, "dpll_iva_h12x2_ck" }, 286 292 { 0 }, 287 293 }; 288 294 ··· 508 502 { 0x4a008d20, omap5_l4cfg_clkctrl_regs }, 509 503 { 0x4a008e20, omap5_l3instr_clkctrl_regs }, 510 504 { 0x4a009020, omap5_l4per_clkctrl_regs }, 505 + { 0x4a009220, omap5_iva_clkctrl_regs }, 511 506 { 0x4a009420, omap5_dss_clkctrl_regs }, 512 507 { 0x4a009520, omap5_gpu_clkctrl_regs }, 513 508 { 0x4a009620, omap5_l3init_clkctrl_regs },
+4 -4
drivers/clk/ti/clk-7xx.c
··· 25 25 }; 26 26 27 27 static const struct omap_clkctrl_reg_data dra7_dsp1_clkctrl_regs[] __initconst = { 28 - { DRA7_DSP1_MMU0_DSP1_CLKCTRL, NULL, CLKF_HW_SUP, "dpll_dsp_m2_ck" }, 28 + { DRA7_DSP1_MMU0_DSP1_CLKCTRL, NULL, CLKF_HW_SUP | CLKF_NO_IDLEST, "dpll_dsp_m2_ck" }, 29 29 { 0 }, 30 30 }; 31 31 ··· 41 41 }; 42 42 43 43 static const struct omap_clkctrl_reg_data dra7_ipu1_clkctrl_regs[] __initconst = { 44 - { DRA7_IPU1_MMU_IPU1_CLKCTRL, dra7_mmu_ipu1_bit_data, CLKF_HW_SUP, "ipu1-clkctrl:0000:24" }, 44 + { DRA7_IPU1_MMU_IPU1_CLKCTRL, dra7_mmu_ipu1_bit_data, CLKF_HW_SUP | CLKF_NO_IDLEST, "ipu1-clkctrl:0000:24" }, 45 45 { 0 }, 46 46 }; 47 47 ··· 137 137 }; 138 138 139 139 static const struct omap_clkctrl_reg_data dra7_dsp2_clkctrl_regs[] __initconst = { 140 - { DRA7_DSP2_MMU0_DSP2_CLKCTRL, NULL, CLKF_HW_SUP, "dpll_dsp_m2_ck" }, 140 + { DRA7_DSP2_MMU0_DSP2_CLKCTRL, NULL, CLKF_HW_SUP | CLKF_NO_IDLEST, "dpll_dsp_m2_ck" }, 141 141 { 0 }, 142 142 }; 143 143 ··· 164 164 }; 165 165 166 166 static const struct omap_clkctrl_reg_data dra7_ipu2_clkctrl_regs[] __initconst = { 167 - { DRA7_IPU2_MMU_IPU2_CLKCTRL, NULL, CLKF_HW_SUP, "dpll_core_h22x2_ck" }, 167 + { DRA7_IPU2_MMU_IPU2_CLKCTRL, NULL, CLKF_HW_SUP | CLKF_NO_IDLEST, "dpll_core_h22x2_ck" }, 168 168 { 0 }, 169 169 }; 170 170
+39 -6
drivers/clk/ti/clkctrl.c
··· 24 24 #include <linux/timekeeping.h> 25 25 #include "clock.h" 26 26 27 - #define NO_IDLEST 0x1 27 + #define NO_IDLEST 0 28 28 29 29 #define OMAP4_MODULEMODE_MASK 0x3 30 30 ··· 33 33 34 34 #define OMAP4_IDLEST_MASK (0x3 << 16) 35 35 #define OMAP4_IDLEST_SHIFT 16 36 + 37 + #define OMAP4_STBYST_MASK BIT(18) 38 + #define OMAP4_STBYST_SHIFT 18 36 39 37 40 #define CLKCTRL_IDLEST_FUNCTIONAL 0x0 38 41 #define CLKCTRL_IDLEST_INTERFACE_IDLE 0x2 ··· 162 159 163 160 ti_clk_ll_ops->clk_writel(val, &clk->enable_reg); 164 161 165 - if (clk->flags & NO_IDLEST) 162 + if (test_bit(NO_IDLEST, &clk->flags)) 166 163 return 0; 167 164 168 165 /* Wait until module is enabled */ ··· 191 188 192 189 ti_clk_ll_ops->clk_writel(val, &clk->enable_reg); 193 190 194 - if (clk->flags & NO_IDLEST) 191 + if (test_bit(NO_IDLEST, &clk->flags)) 195 192 goto exit; 196 193 197 194 /* Wait until module is disabled */ ··· 384 381 385 382 if (ti_clk_parse_divider_data((int *)div_data->dividers, 0, 386 383 div_data->max_div, div_flags, 387 - &div->width, &div->table)) { 384 + div)) { 388 385 pr_err("%s: Data parsing for %pOF:%04x:%d failed\n", __func__, 389 386 node, offset, data->bit); 390 387 kfree(div); ··· 600 597 if (reg_data->flags & CLKF_HW_SUP) 601 598 hw->enable_bit = MODULEMODE_HWCTRL; 602 599 if (reg_data->flags & CLKF_NO_IDLEST) 603 - hw->flags |= NO_IDLEST; 600 + set_bit(NO_IDLEST, &hw->flags); 604 601 605 602 if (reg_data->clkdm_name) 606 603 hw->clkdm_name = reg_data->clkdm_name; ··· 626 623 init.ops = &omap4_clkctrl_clk_ops; 627 624 hw->hw.init = &init; 628 625 629 - clk = ti_clk_register(NULL, &hw->hw, init.name); 626 + clk = ti_clk_register_omap_hw(NULL, &hw->hw, init.name); 630 627 if (IS_ERR_OR_NULL(clk)) 631 628 goto cleanup; 632 629 ··· 651 648 } 652 649 CLK_OF_DECLARE(ti_omap4_clkctrl_clock, "ti,clkctrl", 653 650 _ti_omap4_clkctrl_setup); 651 + 652 + /** 653 + * ti_clk_is_in_standby - Check if clkctrl clock is in standby or not 654 + * @clk: clock to check standby status for 655 + * 656 + * Finds whether the provided clock is in standby mode or not. Returns 657 + * true if the provided clock is a clkctrl type clock and it is in standby, 658 + * false otherwise. 659 + */ 660 + bool ti_clk_is_in_standby(struct clk *clk) 661 + { 662 + struct clk_hw *hw; 663 + struct clk_hw_omap *hwclk; 664 + u32 val; 665 + 666 + hw = __clk_get_hw(clk); 667 + 668 + if (!omap2_clk_is_hw_omap(hw)) 669 + return false; 670 + 671 + hwclk = to_clk_hw_omap(hw); 672 + 673 + val = ti_clk_ll_ops->clk_readl(&hwclk->enable_reg); 674 + 675 + if (val & OMAP4_STBYST_MASK) 676 + return true; 677 + 678 + return false; 679 + } 680 + EXPORT_SYMBOL_GPL(ti_clk_is_in_standby);
+4 -3
drivers/clk/ti/clock.h
··· 20 20 struct clk_hw hw; 21 21 struct clk_omap_reg reg; 22 22 u8 shift; 23 - u8 width; 24 23 u8 flags; 25 24 s8 latch; 25 + u16 min; 26 + u16 max; 27 + u16 mask; 26 28 const struct clk_div_table *table; 27 29 u32 context; 28 30 }; ··· 222 220 struct clk_hw *ti_clk_build_component_mux(struct ti_clk_mux *setup); 223 221 224 222 int ti_clk_parse_divider_data(int *div_table, int num_dividers, int max_div, 225 - u8 flags, u8 *width, 226 - const struct clk_div_table **table); 223 + u8 flags, struct clk_omap_divider *div); 227 224 228 225 int ti_clk_get_reg_addr(struct device_node *node, int index, 229 226 struct clk_omap_reg *reg);
+114 -168
drivers/clk/ti/divider.c
··· 26 26 #undef pr_fmt 27 27 #define pr_fmt(fmt) "%s: " fmt, __func__ 28 28 29 - #define div_mask(d) ((1 << ((d)->width)) - 1) 30 - 31 - static unsigned int _get_table_maxdiv(const struct clk_div_table *table) 32 - { 33 - unsigned int maxdiv = 0; 34 - const struct clk_div_table *clkt; 35 - 36 - for (clkt = table; clkt->div; clkt++) 37 - if (clkt->div > maxdiv) 38 - maxdiv = clkt->div; 39 - return maxdiv; 40 - } 41 - 42 - static unsigned int _get_maxdiv(struct clk_omap_divider *divider) 43 - { 44 - if (divider->flags & CLK_DIVIDER_ONE_BASED) 45 - return div_mask(divider); 46 - if (divider->flags & CLK_DIVIDER_POWER_OF_TWO) 47 - return 1 << div_mask(divider); 48 - if (divider->table) 49 - return _get_table_maxdiv(divider->table); 50 - return div_mask(divider) + 1; 51 - } 52 - 53 29 static unsigned int _get_table_div(const struct clk_div_table *table, 54 30 unsigned int val) 55 31 { ··· 35 59 if (clkt->val == val) 36 60 return clkt->div; 37 61 return 0; 62 + } 63 + 64 + static void _setup_mask(struct clk_omap_divider *divider) 65 + { 66 + u16 mask; 67 + u32 max_val; 68 + const struct clk_div_table *clkt; 69 + 70 + if (divider->table) { 71 + max_val = 0; 72 + 73 + for (clkt = divider->table; clkt->div; clkt++) 74 + if (clkt->val > max_val) 75 + max_val = clkt->val; 76 + } else { 77 + max_val = divider->max; 78 + 79 + if (!(divider->flags & CLK_DIVIDER_ONE_BASED) && 80 + !(divider->flags & CLK_DIVIDER_POWER_OF_TWO)) 81 + max_val--; 82 + } 83 + 84 + if (divider->flags & CLK_DIVIDER_POWER_OF_TWO) 85 + mask = fls(max_val) - 1; 86 + else 87 + mask = max_val; 88 + 89 + divider->mask = (1 << fls(mask)) - 1; 38 90 } 39 91 40 92 static unsigned int _get_div(struct clk_omap_divider *divider, unsigned int val) ··· 105 101 unsigned int div, val; 106 102 107 103 val = ti_clk_ll_ops->clk_readl(&divider->reg) >> divider->shift; 108 - val &= div_mask(divider); 104 + val &= divider->mask; 109 105 110 106 div = _get_div(divider, val); 111 107 if (!div) { ··· 184 180 if (!rate) 185 181 rate = 1; 186 182 187 - maxdiv = _get_maxdiv(divider); 183 + maxdiv = divider->max; 188 184 189 185 if (!(clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT)) { 190 186 parent_rate = *best_parent_rate; ··· 223 219 } 224 220 225 221 if (!bestdiv) { 226 - bestdiv = _get_maxdiv(divider); 222 + bestdiv = divider->max; 227 223 *best_parent_rate = 228 224 clk_hw_round_rate(clk_hw_get_parent(hw), 1); 229 225 } ··· 253 249 divider = to_clk_omap_divider(hw); 254 250 255 251 div = DIV_ROUND_UP(parent_rate, rate); 252 + 253 + if (div > divider->max) 254 + div = divider->max; 255 + if (div < divider->min) 256 + div = divider->min; 257 + 256 258 value = _get_val(divider, div); 257 259 258 - if (value > div_mask(divider)) 259 - value = div_mask(divider); 260 - 261 - if (divider->flags & CLK_DIVIDER_HIWORD_MASK) { 262 - val = div_mask(divider) << (divider->shift + 16); 263 - } else { 264 - val = ti_clk_ll_ops->clk_readl(&divider->reg); 265 - val &= ~(div_mask(divider) << divider->shift); 266 - } 260 + val = ti_clk_ll_ops->clk_readl(&divider->reg); 261 + val &= ~(divider->mask << divider->shift); 267 262 val |= value << divider->shift; 268 263 ti_clk_ll_ops->clk_writel(val, &divider->reg); 269 264 ··· 283 280 u32 val; 284 281 285 282 val = ti_clk_ll_ops->clk_readl(&divider->reg) >> divider->shift; 286 - divider->context = val & div_mask(divider); 283 + divider->context = val & divider->mask; 287 284 288 285 return 0; 289 286 } ··· 300 297 u32 val; 301 298 302 299 val = ti_clk_ll_ops->clk_readl(&divider->reg); 303 - val &= ~(div_mask(divider) << divider->shift); 300 + val &= ~(divider->mask << divider->shift); 304 301 val |= divider->context << divider->shift; 305 302 ti_clk_ll_ops->clk_writel(val, &divider->reg); 306 303 } ··· 313 310 .restore_context = clk_divider_restore_context, 314 311 }; 315 312 316 - static struct clk *_register_divider(struct device *dev, const char *name, 317 - const char *parent_name, 318 - unsigned long flags, 319 - struct clk_omap_reg *reg, 320 - u8 shift, u8 width, s8 latch, 321 - u8 clk_divider_flags, 322 - const struct clk_div_table *table) 313 + static struct clk *_register_divider(struct device_node *node, 314 + u32 flags, 315 + struct clk_omap_divider *div) 323 316 { 324 - struct clk_omap_divider *div; 325 317 struct clk *clk; 326 318 struct clk_init_data init; 319 + const char *parent_name; 327 320 328 - if (clk_divider_flags & CLK_DIVIDER_HIWORD_MASK) { 329 - if (width + shift > 16) { 330 - pr_warn("divider value exceeds LOWORD field\n"); 331 - return ERR_PTR(-EINVAL); 332 - } 333 - } 321 + parent_name = of_clk_get_parent_name(node, 0); 334 322 335 - /* allocate the divider */ 336 - div = kzalloc(sizeof(*div), GFP_KERNEL); 337 - if (!div) 338 - return ERR_PTR(-ENOMEM); 339 - 340 - init.name = name; 323 + init.name = node->name; 341 324 init.ops = &ti_clk_divider_ops; 342 325 init.flags = flags; 343 326 init.parent_names = (parent_name ? &parent_name : NULL); 344 327 init.num_parents = (parent_name ? 1 : 0); 345 328 346 - /* struct clk_divider assignments */ 347 - memcpy(&div->reg, reg, sizeof(*reg)); 348 - div->shift = shift; 349 - div->width = width; 350 - div->latch = latch; 351 - div->flags = clk_divider_flags; 352 329 div->hw.init = &init; 353 - div->table = table; 354 330 355 331 /* register the clock */ 356 - clk = ti_clk_register(dev, &div->hw, name); 332 + clk = ti_clk_register(NULL, &div->hw, node->name); 357 333 358 334 if (IS_ERR(clk)) 359 335 kfree(div); ··· 341 359 } 342 360 343 361 int ti_clk_parse_divider_data(int *div_table, int num_dividers, int max_div, 344 - u8 flags, u8 *width, 345 - const struct clk_div_table **table) 362 + u8 flags, struct clk_omap_divider *divider) 346 363 { 347 364 int valid_div = 0; 348 - u32 val; 349 - int div; 350 365 int i; 351 366 struct clk_div_table *tmp; 367 + u16 min_div = 0; 352 368 353 369 if (!div_table) { 354 - if (flags & CLKF_INDEX_STARTS_AT_ONE) 355 - val = 1; 356 - else 357 - val = 0; 358 - 359 - div = 1; 360 - 361 - while (div < max_div) { 362 - if (flags & CLKF_INDEX_POWER_OF_TWO) 363 - div <<= 1; 364 - else 365 - div++; 366 - val++; 367 - } 368 - 369 - *width = fls(val); 370 - *table = NULL; 371 - 370 + divider->min = 1; 371 + divider->max = max_div; 372 + _setup_mask(divider); 372 373 return 0; 373 374 } 374 375 ··· 368 403 num_dividers = i; 369 404 370 405 tmp = kcalloc(valid_div + 1, sizeof(*tmp), GFP_KERNEL); 371 - if (!tmp) { 372 - *table = ERR_PTR(-ENOMEM); 406 + if (!tmp) 373 407 return -ENOMEM; 374 - } 375 408 376 409 valid_div = 0; 377 - *width = 0; 378 410 379 411 for (i = 0; i < num_dividers; i++) 380 412 if (div_table[i] > 0) { 381 413 tmp[valid_div].div = div_table[i]; 382 414 tmp[valid_div].val = i; 383 415 valid_div++; 384 - *width = i; 416 + if (div_table[i] > max_div) 417 + max_div = div_table[i]; 418 + if (!min_div || div_table[i] < min_div) 419 + min_div = div_table[i]; 385 420 } 386 421 387 - *width = fls(*width); 388 - *table = tmp; 422 + divider->min = min_div; 423 + divider->max = max_div; 424 + divider->table = tmp; 425 + _setup_mask(divider); 389 426 390 427 return 0; 391 428 } 392 429 393 - static struct clk_div_table * 394 - __init ti_clk_get_div_table(struct device_node *node) 430 + static int __init ti_clk_get_div_table(struct device_node *node, 431 + struct clk_omap_divider *div) 395 432 { 396 433 struct clk_div_table *table; 397 434 const __be32 *divspec; ··· 405 438 divspec = of_get_property(node, "ti,dividers", &num_div); 406 439 407 440 if (!divspec) 408 - return NULL; 441 + return 0; 409 442 410 443 num_div /= 4; 411 444 ··· 420 453 421 454 if (!valid_div) { 422 455 pr_err("no valid dividers for %pOFn table\n", node); 423 - return ERR_PTR(-EINVAL); 456 + return -EINVAL; 424 457 } 425 458 426 459 table = kcalloc(valid_div + 1, sizeof(*table), GFP_KERNEL); 427 - 428 460 if (!table) 429 - return ERR_PTR(-ENOMEM); 461 + return -ENOMEM; 430 462 431 463 valid_div = 0; 432 464 ··· 438 472 } 439 473 } 440 474 441 - return table; 475 + div->table = table; 476 + 477 + return 0; 442 478 } 443 479 444 - static int _get_divider_width(struct device_node *node, 445 - const struct clk_div_table *table, 446 - u8 flags) 480 + static int _populate_divider_min_max(struct device_node *node, 481 + struct clk_omap_divider *divider) 447 482 { 448 - u32 min_div; 449 - u32 max_div; 450 - u32 val = 0; 451 - u32 div; 483 + u32 min_div = 0; 484 + u32 max_div = 0; 485 + u32 val; 486 + const struct clk_div_table *clkt; 452 487 453 - if (!table) { 488 + if (!divider->table) { 454 489 /* Clk divider table not provided, determine min/max divs */ 455 490 if (of_property_read_u32(node, "ti,min-div", &min_div)) 456 491 min_div = 1; ··· 460 493 pr_err("no max-div for %pOFn!\n", node); 461 494 return -EINVAL; 462 495 } 463 - 464 - /* Determine bit width for the field */ 465 - if (flags & CLK_DIVIDER_ONE_BASED) 466 - val = 1; 467 - 468 - div = min_div; 469 - 470 - while (div < max_div) { 471 - if (flags & CLK_DIVIDER_POWER_OF_TWO) 472 - div <<= 1; 473 - else 474 - div++; 475 - val++; 476 - } 477 496 } else { 478 - div = 0; 479 497 480 - while (table[div].div) { 481 - val = table[div].val; 482 - div++; 498 + for (clkt = divider->table; clkt->div; clkt++) { 499 + val = clkt->div; 500 + if (val > max_div) 501 + max_div = val; 502 + if (!min_div || val < min_div) 503 + min_div = val; 483 504 } 484 505 } 485 506 486 - return fls(val); 507 + divider->min = min_div; 508 + divider->max = max_div; 509 + _setup_mask(divider); 510 + 511 + return 0; 487 512 } 488 513 489 514 static int __init ti_clk_divider_populate(struct device_node *node, 490 - struct clk_omap_reg *reg, const struct clk_div_table **table, 491 - u32 *flags, u8 *div_flags, u8 *width, u8 *shift, s8 *latch) 515 + struct clk_omap_divider *div, 516 + u32 *flags) 492 517 { 493 518 u32 val; 494 519 int ret; 495 520 496 - ret = ti_clk_get_reg_addr(node, 0, reg); 521 + ret = ti_clk_get_reg_addr(node, 0, &div->reg); 497 522 if (ret) 498 523 return ret; 499 524 500 525 if (!of_property_read_u32(node, "ti,bit-shift", &val)) 501 - *shift = val; 526 + div->shift = val; 502 527 else 503 - *shift = 0; 528 + div->shift = 0; 504 529 505 - if (latch) { 506 - if (!of_property_read_u32(node, "ti,latch-bit", &val)) 507 - *latch = val; 508 - else 509 - *latch = -EINVAL; 510 - } 530 + if (!of_property_read_u32(node, "ti,latch-bit", &val)) 531 + div->latch = val; 532 + else 533 + div->latch = -EINVAL; 511 534 512 535 *flags = 0; 513 - *div_flags = 0; 536 + div->flags = 0; 514 537 515 538 if (of_property_read_bool(node, "ti,index-starts-at-one")) 516 - *div_flags |= CLK_DIVIDER_ONE_BASED; 539 + div->flags |= CLK_DIVIDER_ONE_BASED; 517 540 518 541 if (of_property_read_bool(node, "ti,index-power-of-two")) 519 - *div_flags |= CLK_DIVIDER_POWER_OF_TWO; 542 + div->flags |= CLK_DIVIDER_POWER_OF_TWO; 520 543 521 544 if (of_property_read_bool(node, "ti,set-rate-parent")) 522 545 *flags |= CLK_SET_RATE_PARENT; 523 546 524 - *table = ti_clk_get_div_table(node); 547 + ret = ti_clk_get_div_table(node, div); 548 + if (ret) 549 + return ret; 525 550 526 - if (IS_ERR(*table)) 527 - return PTR_ERR(*table); 528 - 529 - *width = _get_divider_width(node, *table, *div_flags); 530 - 531 - return 0; 551 + return _populate_divider_min_max(node, div); 532 552 } 533 553 534 554 /** ··· 527 573 static void __init of_ti_divider_clk_setup(struct device_node *node) 528 574 { 529 575 struct clk *clk; 530 - const char *parent_name; 531 - struct clk_omap_reg reg; 532 - u8 clk_divider_flags = 0; 533 - u8 width = 0; 534 - u8 shift = 0; 535 - s8 latch = -EINVAL; 536 - const struct clk_div_table *table = NULL; 537 576 u32 flags = 0; 577 + struct clk_omap_divider *div; 538 578 539 - parent_name = of_clk_get_parent_name(node, 0); 579 + div = kzalloc(sizeof(*div), GFP_KERNEL); 580 + if (!div) 581 + return; 540 582 541 - if (ti_clk_divider_populate(node, &reg, &table, &flags, 542 - &clk_divider_flags, &width, &shift, &latch)) 583 + if (ti_clk_divider_populate(node, div, &flags)) 543 584 goto cleanup; 544 585 545 - clk = _register_divider(NULL, node->name, parent_name, flags, &reg, 546 - shift, width, latch, clk_divider_flags, table); 547 - 586 + clk = _register_divider(node, flags, div); 548 587 if (!IS_ERR(clk)) { 549 588 of_clk_add_provider(node, of_clk_src_simple_get, clk); 550 589 of_ti_clk_autoidle_setup(node); ··· 545 598 } 546 599 547 600 cleanup: 548 - kfree(table); 601 + kfree(div->table); 602 + kfree(div); 549 603 } 550 604 CLK_OF_DECLARE(divider_clk, "ti,divider-clock", of_ti_divider_clk_setup); 551 605 552 606 static void __init of_ti_composite_divider_clk_setup(struct device_node *node) 553 607 { 554 608 struct clk_omap_divider *div; 555 - u32 val; 609 + u32 tmp; 556 610 557 611 div = kzalloc(sizeof(*div), GFP_KERNEL); 558 612 if (!div) 559 613 return; 560 614 561 - if (ti_clk_divider_populate(node, &div->reg, &div->table, &val, 562 - &div->flags, &div->width, &div->shift, 563 - NULL) < 0) 615 + if (ti_clk_divider_populate(node, div, &tmp)) 564 616 goto cleanup; 565 617 566 618 if (!ti_clk_add_component(node, &div->hw, CLK_COMPONENT_TYPE_DIVIDER))
+1 -2
drivers/clk/uniphier/clk-uniphier-core.c
··· 64 64 for (p = data; p->name; p++) 65 65 clk_num = max(clk_num, p->idx + 1); 66 66 67 - hw_data = devm_kzalloc(dev, 68 - sizeof(*hw_data) + clk_num * sizeof(struct clk_hw *), 67 + hw_data = devm_kzalloc(dev, struct_size(hw_data, hws, clk_num), 69 68 GFP_KERNEL); 70 69 if (!hw_data) 71 70 return -ENOMEM;
+2
include/dt-bindings/clock/aspeed-clock.h
··· 39 39 #define ASPEED_CLK_BCLK 33 40 40 #define ASPEED_CLK_MPLL 34 41 41 #define ASPEED_CLK_24M 35 42 + #define ASPEED_CLK_MAC1RCLK 36 43 + #define ASPEED_CLK_MAC2RCLK 37 42 44 43 45 #define ASPEED_RESET_XDMA 0 44 46 #define ASPEED_RESET_MCTP 1
+4
include/dt-bindings/clock/ast2600-clock.h
··· 83 83 #define ASPEED_CLK_MAC12 64 84 84 #define ASPEED_CLK_MAC34 65 85 85 #define ASPEED_CLK_USBPHY_40M 66 86 + #define ASPEED_CLK_MAC1RCLK 67 87 + #define ASPEED_CLK_MAC2RCLK 68 88 + #define ASPEED_CLK_MAC3RCLK 69 89 + #define ASPEED_CLK_MAC4RCLK 70 86 90 87 91 /* Only list resets here that are not part of a gate */ 88 92 #define ASPEED_RESET_ADC 55
+10
include/dt-bindings/clock/axg-audio-clkc.h
··· 80 80 #define AUD_CLKID_TDM_SCLK_PAD0 160 81 81 #define AUD_CLKID_TDM_SCLK_PAD1 161 82 82 #define AUD_CLKID_TDM_SCLK_PAD2 162 83 + #define AUD_CLKID_TOP 163 84 + #define AUD_CLKID_TORAM 164 85 + #define AUD_CLKID_EQDRC 165 86 + #define AUD_CLKID_RESAMPLE_B 166 87 + #define AUD_CLKID_TOVAD 167 88 + #define AUD_CLKID_LOCKER 168 89 + #define AUD_CLKID_SPDIFIN_LB 169 90 + #define AUD_CLKID_FRDDR_D 170 91 + #define AUD_CLKID_TODDR_D 171 92 + #define AUD_CLKID_LOOPBACK_B 172 83 93 84 94 #endif /* __AXG_AUDIO_CLKC_BINDINGS_H */
+82
include/dt-bindings/clock/bm1880-clock.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0+ */ 2 + /* 3 + * Device Tree binding constants for Bitmain BM1880 SoC 4 + * 5 + * Copyright (c) 2019 Linaro Ltd. 6 + */ 7 + 8 + #ifndef __DT_BINDINGS_CLOCK_BM1880_H 9 + #define __DT_BINDINGS_CLOCK_BM1880_H 10 + 11 + #define BM1880_CLK_OSC 0 12 + #define BM1880_CLK_MPLL 1 13 + #define BM1880_CLK_SPLL 2 14 + #define BM1880_CLK_FPLL 3 15 + #define BM1880_CLK_DDRPLL 4 16 + #define BM1880_CLK_A53 5 17 + #define BM1880_CLK_50M_A53 6 18 + #define BM1880_CLK_AHB_ROM 7 19 + #define BM1880_CLK_AXI_SRAM 8 20 + #define BM1880_CLK_DDR_AXI 9 21 + #define BM1880_CLK_EFUSE 10 22 + #define BM1880_CLK_APB_EFUSE 11 23 + #define BM1880_CLK_AXI5_EMMC 12 24 + #define BM1880_CLK_EMMC 13 25 + #define BM1880_CLK_100K_EMMC 14 26 + #define BM1880_CLK_AXI5_SD 15 27 + #define BM1880_CLK_SD 16 28 + #define BM1880_CLK_100K_SD 17 29 + #define BM1880_CLK_500M_ETH0 18 30 + #define BM1880_CLK_AXI4_ETH0 19 31 + #define BM1880_CLK_500M_ETH1 20 32 + #define BM1880_CLK_AXI4_ETH1 21 33 + #define BM1880_CLK_AXI1_GDMA 22 34 + #define BM1880_CLK_APB_GPIO 23 35 + #define BM1880_CLK_APB_GPIO_INTR 24 36 + #define BM1880_CLK_GPIO_DB 25 37 + #define BM1880_CLK_AXI1_MINER 26 38 + #define BM1880_CLK_AHB_SF 27 39 + #define BM1880_CLK_SDMA_AXI 28 40 + #define BM1880_CLK_SDMA_AUD 29 41 + #define BM1880_CLK_APB_I2C 30 42 + #define BM1880_CLK_APB_WDT 31 43 + #define BM1880_CLK_APB_JPEG 32 44 + #define BM1880_CLK_JPEG_AXI 33 45 + #define BM1880_CLK_AXI5_NF 34 46 + #define BM1880_CLK_APB_NF 35 47 + #define BM1880_CLK_NF 36 48 + #define BM1880_CLK_APB_PWM 37 49 + #define BM1880_CLK_DIV_0_RV 38 50 + #define BM1880_CLK_DIV_1_RV 39 51 + #define BM1880_CLK_MUX_RV 40 52 + #define BM1880_CLK_RV 41 53 + #define BM1880_CLK_APB_SPI 42 54 + #define BM1880_CLK_TPU_AXI 43 55 + #define BM1880_CLK_DIV_UART_500M 44 56 + #define BM1880_CLK_UART_500M 45 57 + #define BM1880_CLK_APB_UART 46 58 + #define BM1880_CLK_APB_I2S 47 59 + #define BM1880_CLK_AXI4_USB 48 60 + #define BM1880_CLK_APB_USB 49 61 + #define BM1880_CLK_125M_USB 50 62 + #define BM1880_CLK_33K_USB 51 63 + #define BM1880_CLK_DIV_12M_USB 52 64 + #define BM1880_CLK_12M_USB 53 65 + #define BM1880_CLK_APB_VIDEO 54 66 + #define BM1880_CLK_VIDEO_AXI 55 67 + #define BM1880_CLK_VPP_AXI 56 68 + #define BM1880_CLK_APB_VPP 57 69 + #define BM1880_CLK_DIV_0_AXI1 58 70 + #define BM1880_CLK_DIV_1_AXI1 59 71 + #define BM1880_CLK_AXI1 60 72 + #define BM1880_CLK_AXI2 61 73 + #define BM1880_CLK_AXI3 62 74 + #define BM1880_CLK_AXI4 63 75 + #define BM1880_CLK_AXI5 64 76 + #define BM1880_CLK_DIV_0_AXI6 65 77 + #define BM1880_CLK_DIV_1_AXI6 66 78 + #define BM1880_CLK_MUX_AXI6 67 79 + #define BM1880_CLK_AXI6 68 80 + #define BM1880_NR_CLKS 69 81 + 82 + #endif /* __DT_BINDINGS_CLOCK_BM1880_H */
+1
include/dt-bindings/clock/imx7ulp-clock.h
··· 49 49 #define IMX7ULP_CLK_NIC1_DIV 36 50 50 #define IMX7ULP_CLK_NIC1_BUS_DIV 37 51 51 #define IMX7ULP_CLK_NIC1_EXT_DIV 38 52 + /* IMX7ULP_CLK_MIPI_PLL is unsupported and shouldn't be used in DT */ 52 53 #define IMX7ULP_CLK_MIPI_PLL 39 53 54 #define IMX7ULP_CLK_SIRC 40 54 55 #define IMX7ULP_CLK_SOSC_BUS_CLK 41
+18 -1
include/dt-bindings/clock/imx8mm-clock.h
··· 248 248 #define IMX8MM_CLK_SNVS_ROOT 228 249 249 #define IMX8MM_CLK_GIC 229 250 250 251 - #define IMX8MM_CLK_END 230 251 + #define IMX8MM_SYS_PLL1_40M_CG 230 252 + #define IMX8MM_SYS_PLL1_80M_CG 231 253 + #define IMX8MM_SYS_PLL1_100M_CG 232 254 + #define IMX8MM_SYS_PLL1_133M_CG 233 255 + #define IMX8MM_SYS_PLL1_160M_CG 234 256 + #define IMX8MM_SYS_PLL1_200M_CG 235 257 + #define IMX8MM_SYS_PLL1_266M_CG 236 258 + #define IMX8MM_SYS_PLL1_400M_CG 237 259 + #define IMX8MM_SYS_PLL2_50M_CG 238 260 + #define IMX8MM_SYS_PLL2_100M_CG 239 261 + #define IMX8MM_SYS_PLL2_125M_CG 240 262 + #define IMX8MM_SYS_PLL2_166M_CG 241 263 + #define IMX8MM_SYS_PLL2_200M_CG 242 264 + #define IMX8MM_SYS_PLL2_250M_CG 243 265 + #define IMX8MM_SYS_PLL2_333M_CG 244 266 + #define IMX8MM_SYS_PLL2_500M_CG 245 267 + 268 + #define IMX8MM_CLK_END 246 252 269 253 270 #endif
+18 -1
include/dt-bindings/clock/imx8mn-clock.h
··· 211 211 #define IMX8MN_CLK_GPU_CORE_ROOT 193 212 212 #define IMX8MN_CLK_GIC 194 213 213 214 - #define IMX8MN_CLK_END 195 214 + #define IMX8MN_SYS_PLL1_40M_CG 195 215 + #define IMX8MN_SYS_PLL1_80M_CG 196 216 + #define IMX8MN_SYS_PLL1_100M_CG 197 217 + #define IMX8MN_SYS_PLL1_133M_CG 198 218 + #define IMX8MN_SYS_PLL1_160M_CG 199 219 + #define IMX8MN_SYS_PLL1_200M_CG 200 220 + #define IMX8MN_SYS_PLL1_266M_CG 201 221 + #define IMX8MN_SYS_PLL1_400M_CG 202 222 + #define IMX8MN_SYS_PLL2_50M_CG 203 223 + #define IMX8MN_SYS_PLL2_100M_CG 204 224 + #define IMX8MN_SYS_PLL2_125M_CG 205 225 + #define IMX8MN_SYS_PLL2_166M_CG 206 226 + #define IMX8MN_SYS_PLL2_200M_CG 207 227 + #define IMX8MN_SYS_PLL2_250M_CG 208 228 + #define IMX8MN_SYS_PLL2_333M_CG 209 229 + #define IMX8MN_SYS_PLL2_500M_CG 210 230 + 231 + #define IMX8MN_CLK_END 211 215 232 216 233 #endif
+23 -1
include/dt-bindings/clock/imx8mq-clock.h
··· 403 403 #define IMX8MQ_CLK_SNVS_ROOT 264 404 404 #define IMX8MQ_CLK_GIC 265 405 405 406 - #define IMX8MQ_CLK_END 266 406 + #define IMX8MQ_VIDEO2_PLL1_REF_SEL 266 407 + 408 + #define IMX8MQ_SYS1_PLL_40M_CG 267 409 + #define IMX8MQ_SYS1_PLL_80M_CG 268 410 + #define IMX8MQ_SYS1_PLL_100M_CG 269 411 + #define IMX8MQ_SYS1_PLL_133M_CG 270 412 + #define IMX8MQ_SYS1_PLL_160M_CG 271 413 + #define IMX8MQ_SYS1_PLL_200M_CG 272 414 + #define IMX8MQ_SYS1_PLL_266M_CG 273 415 + #define IMX8MQ_SYS1_PLL_400M_CG 274 416 + #define IMX8MQ_SYS1_PLL_800M_CG 275 417 + #define IMX8MQ_SYS2_PLL_50M_CG 276 418 + #define IMX8MQ_SYS2_PLL_100M_CG 277 419 + #define IMX8MQ_SYS2_PLL_125M_CG 278 420 + #define IMX8MQ_SYS2_PLL_166M_CG 279 421 + #define IMX8MQ_SYS2_PLL_200M_CG 280 422 + #define IMX8MQ_SYS2_PLL_250M_CG 281 423 + #define IMX8MQ_SYS2_PLL_333M_CG 282 424 + #define IMX8MQ_SYS2_PLL_500M_CG 283 425 + #define IMX8MQ_SYS2_PLL_1000M_CG 284 426 + 427 + #define IMX8MQ_CLK_END 285 428 + 407 429 #endif /* __DT_BINDINGS_CLOCK_IMX8MQ_H */
+4
include/dt-bindings/clock/omap5.h
··· 86 86 #define OMAP5_UART5_CLKCTRL OMAP5_CLKCTRL_INDEX(0x170) 87 87 #define OMAP5_UART6_CLKCTRL OMAP5_CLKCTRL_INDEX(0x178) 88 88 89 + /* iva clocks */ 90 + #define OMAP5_IVA_CLKCTRL OMAP5_CLKCTRL_INDEX(0x20) 91 + #define OMAP5_SL2IF_CLKCTRL OMAP5_CLKCTRL_INDEX(0x28) 92 + 89 93 /* dss clocks */ 90 94 #define OMAP5_DSS_CORE_CLKCTRL OMAP5_CLKCTRL_INDEX(0x20) 91 95
+2
include/dt-bindings/clock/px30-cru.h
··· 85 85 #define SCLK_EMMC_DIV50 83 86 86 #define SCLK_DDRCLK 84 87 87 #define SCLK_UART1_SRC 85 88 + #define SCLK_SDMMC_DIV 86 89 + #define SCLK_SDMMC_DIV50 87 88 90 89 91 /* dclk gates */ 90 92 #define DCLK_VOPB 150
+6
include/dt-bindings/clock/qcom,gcc-msm8998.h
··· 177 177 #define GCC_UFS_CLKREF_CLK 168 178 178 #define GCC_PCIE_CLKREF_CLK 169 179 179 #define GCC_RX1_USB2_CLKREF_CLK 170 180 + #define GCC_MSS_CFG_AHB_CLK 171 181 + #define GCC_BOOT_ROM_AHB_CLK 172 182 + #define GCC_MSS_GPLL0_DIV_CLK_SRC 173 183 + #define GCC_MSS_SNOC_AXI_CLK 174 184 + #define GCC_MSS_MNOC_BIMC_AXI_CLK 175 180 185 181 186 #define PCIE_0_GDSC 0 182 187 #define UFS_GDSC 1 ··· 295 290 #define GCC_MSMPU_BCR 105 296 291 #define GCC_QUSB2PHY_PRIM_BCR 106 297 292 #define GCC_QUSB2PHY_SEC_BCR 107 293 + #define GCC_MSS_RESTART 108 298 294 299 295 #endif
+155
include/dt-bindings/clock/qcom,gcc-sc7180.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (c) 2019, The Linux Foundation. All rights reserved. 4 + */ 5 + 6 + #ifndef _DT_BINDINGS_CLK_QCOM_GCC_SC7180_H 7 + #define _DT_BINDINGS_CLK_QCOM_GCC_SC7180_H 8 + 9 + /* GCC clocks */ 10 + #define GCC_GPLL0_MAIN_DIV_CDIV 0 11 + #define GPLL0 1 12 + #define GPLL0_OUT_EVEN 2 13 + #define GPLL1 3 14 + #define GPLL4 4 15 + #define GPLL6 5 16 + #define GPLL7 6 17 + #define GCC_AGGRE_UFS_PHY_AXI_CLK 7 18 + #define GCC_AGGRE_USB3_PRIM_AXI_CLK 8 19 + #define GCC_BOOT_ROM_AHB_CLK 9 20 + #define GCC_CAMERA_AHB_CLK 10 21 + #define GCC_CAMERA_HF_AXI_CLK 11 22 + #define GCC_CAMERA_THROTTLE_HF_AXI_CLK 12 23 + #define GCC_CAMERA_XO_CLK 13 24 + #define GCC_CE1_AHB_CLK 14 25 + #define GCC_CE1_AXI_CLK 15 26 + #define GCC_CE1_CLK 16 27 + #define GCC_CFG_NOC_USB3_PRIM_AXI_CLK 17 28 + #define GCC_CPUSS_AHB_CLK 18 29 + #define GCC_CPUSS_AHB_CLK_SRC 19 30 + #define GCC_CPUSS_GNOC_CLK 20 31 + #define GCC_CPUSS_RBCPR_CLK 21 32 + #define GCC_DDRSS_GPU_AXI_CLK 22 33 + #define GCC_DISP_AHB_CLK 23 34 + #define GCC_DISP_GPLL0_CLK_SRC 24 35 + #define GCC_DISP_GPLL0_DIV_CLK_SRC 25 36 + #define GCC_DISP_HF_AXI_CLK 26 37 + #define GCC_DISP_THROTTLE_HF_AXI_CLK 27 38 + #define GCC_DISP_XO_CLK 28 39 + #define GCC_GP1_CLK 29 40 + #define GCC_GP1_CLK_SRC 30 41 + #define GCC_GP2_CLK 31 42 + #define GCC_GP2_CLK_SRC 32 43 + #define GCC_GP3_CLK 33 44 + #define GCC_GP3_CLK_SRC 34 45 + #define GCC_GPU_CFG_AHB_CLK 35 46 + #define GCC_GPU_GPLL0_CLK_SRC 36 47 + #define GCC_GPU_GPLL0_DIV_CLK_SRC 37 48 + #define GCC_GPU_MEMNOC_GFX_CLK 38 49 + #define GCC_GPU_SNOC_DVM_GFX_CLK 39 50 + #define GCC_NPU_AXI_CLK 40 51 + #define GCC_NPU_BWMON_AXI_CLK 41 52 + #define GCC_NPU_BWMON_DMA_CFG_AHB_CLK 42 53 + #define GCC_NPU_BWMON_DSP_CFG_AHB_CLK 43 54 + #define GCC_NPU_CFG_AHB_CLK 44 55 + #define GCC_NPU_DMA_CLK 45 56 + #define GCC_NPU_GPLL0_CLK_SRC 46 57 + #define GCC_NPU_GPLL0_DIV_CLK_SRC 47 58 + #define GCC_PDM2_CLK 48 59 + #define GCC_PDM2_CLK_SRC 49 60 + #define GCC_PDM_AHB_CLK 50 61 + #define GCC_PDM_XO4_CLK 51 62 + #define GCC_PRNG_AHB_CLK 52 63 + #define GCC_QSPI_CNOC_PERIPH_AHB_CLK 53 64 + #define GCC_QSPI_CORE_CLK 54 65 + #define GCC_QSPI_CORE_CLK_SRC 55 66 + #define GCC_QUPV3_WRAP0_CORE_2X_CLK 56 67 + #define GCC_QUPV3_WRAP0_CORE_CLK 57 68 + #define GCC_QUPV3_WRAP0_S0_CLK 58 69 + #define GCC_QUPV3_WRAP0_S0_CLK_SRC 59 70 + #define GCC_QUPV3_WRAP0_S1_CLK 60 71 + #define GCC_QUPV3_WRAP0_S1_CLK_SRC 61 72 + #define GCC_QUPV3_WRAP0_S2_CLK 62 73 + #define GCC_QUPV3_WRAP0_S2_CLK_SRC 63 74 + #define GCC_QUPV3_WRAP0_S3_CLK 64 75 + #define GCC_QUPV3_WRAP0_S3_CLK_SRC 65 76 + #define GCC_QUPV3_WRAP0_S4_CLK 66 77 + #define GCC_QUPV3_WRAP0_S4_CLK_SRC 67 78 + #define GCC_QUPV3_WRAP0_S5_CLK 68 79 + #define GCC_QUPV3_WRAP0_S5_CLK_SRC 69 80 + #define GCC_QUPV3_WRAP1_CORE_2X_CLK 70 81 + #define GCC_QUPV3_WRAP1_CORE_CLK 71 82 + #define GCC_QUPV3_WRAP1_S0_CLK 72 83 + #define GCC_QUPV3_WRAP1_S0_CLK_SRC 73 84 + #define GCC_QUPV3_WRAP1_S1_CLK 74 85 + #define GCC_QUPV3_WRAP1_S1_CLK_SRC 75 86 + #define GCC_QUPV3_WRAP1_S2_CLK 76 87 + #define GCC_QUPV3_WRAP1_S2_CLK_SRC 77 88 + #define GCC_QUPV3_WRAP1_S3_CLK 78 89 + #define GCC_QUPV3_WRAP1_S3_CLK_SRC 79 90 + #define GCC_QUPV3_WRAP1_S4_CLK 80 91 + #define GCC_QUPV3_WRAP1_S4_CLK_SRC 81 92 + #define GCC_QUPV3_WRAP1_S5_CLK 82 93 + #define GCC_QUPV3_WRAP1_S5_CLK_SRC 83 94 + #define GCC_QUPV3_WRAP_0_M_AHB_CLK 84 95 + #define GCC_QUPV3_WRAP_0_S_AHB_CLK 85 96 + #define GCC_QUPV3_WRAP_1_M_AHB_CLK 86 97 + #define GCC_QUPV3_WRAP_1_S_AHB_CLK 87 98 + #define GCC_SDCC1_AHB_CLK 88 99 + #define GCC_SDCC1_APPS_CLK 89 100 + #define GCC_SDCC1_APPS_CLK_SRC 90 101 + #define GCC_SDCC1_ICE_CORE_CLK 91 102 + #define GCC_SDCC1_ICE_CORE_CLK_SRC 92 103 + #define GCC_SDCC2_AHB_CLK 93 104 + #define GCC_SDCC2_APPS_CLK 94 105 + #define GCC_SDCC2_APPS_CLK_SRC 95 106 + #define GCC_SYS_NOC_CPUSS_AHB_CLK 96 107 + #define GCC_UFS_MEM_CLKREF_CLK 97 108 + #define GCC_UFS_PHY_AHB_CLK 98 109 + #define GCC_UFS_PHY_AXI_CLK 99 110 + #define GCC_UFS_PHY_AXI_CLK_SRC 100 111 + #define GCC_UFS_PHY_ICE_CORE_CLK 101 112 + #define GCC_UFS_PHY_ICE_CORE_CLK_SRC 102 113 + #define GCC_UFS_PHY_PHY_AUX_CLK 103 114 + #define GCC_UFS_PHY_PHY_AUX_CLK_SRC 104 115 + #define GCC_UFS_PHY_RX_SYMBOL_0_CLK 105 116 + #define GCC_UFS_PHY_TX_SYMBOL_0_CLK 106 117 + #define GCC_UFS_PHY_UNIPRO_CORE_CLK 107 118 + #define GCC_UFS_PHY_UNIPRO_CORE_CLK_SRC 108 119 + #define GCC_USB30_PRIM_MASTER_CLK 109 120 + #define GCC_USB30_PRIM_MASTER_CLK_SRC 110 121 + #define GCC_USB30_PRIM_MOCK_UTMI_CLK 111 122 + #define GCC_USB30_PRIM_MOCK_UTMI_CLK_SRC 112 123 + #define GCC_USB30_PRIM_SLEEP_CLK 113 124 + #define GCC_USB3_PRIM_CLKREF_CLK 114 125 + #define GCC_USB3_PRIM_PHY_AUX_CLK 115 126 + #define GCC_USB3_PRIM_PHY_AUX_CLK_SRC 116 127 + #define GCC_USB3_PRIM_PHY_COM_AUX_CLK 117 128 + #define GCC_USB3_PRIM_PHY_PIPE_CLK 118 129 + #define GCC_USB_PHY_CFG_AHB2PHY_CLK 119 130 + #define GCC_VIDEO_AHB_CLK 120 131 + #define GCC_VIDEO_AXI_CLK 121 132 + #define GCC_VIDEO_GPLL0_DIV_CLK_SRC 122 133 + #define GCC_VIDEO_THROTTLE_AXI_CLK 123 134 + #define GCC_VIDEO_XO_CLK 124 135 + 136 + /* GCC resets */ 137 + #define GCC_QUSB2PHY_PRIM_BCR 0 138 + #define GCC_QUSB2PHY_SEC_BCR 1 139 + #define GCC_UFS_PHY_BCR 2 140 + #define GCC_USB30_PRIM_BCR 3 141 + #define GCC_USB3_DP_PHY_PRIM_BCR 4 142 + #define GCC_USB3_DP_PHY_SEC_BCR 5 143 + #define GCC_USB3_PHY_PRIM_BCR 6 144 + #define GCC_USB3_PHY_SEC_BCR 7 145 + #define GCC_USB3PHY_PHY_PRIM_BCR 8 146 + #define GCC_USB3PHY_PHY_SEC_BCR 9 147 + #define GCC_USB_PHY_CFG_AHB2PHY_BCR 10 148 + 149 + /* GCC GDSCRs */ 150 + #define UFS_PHY_GDSC 0 151 + #define USB30_PRIM_GDSC 1 152 + #define HLOS1_VOTE_MMNOC_MMU_TBU_HF0_GDSC 2 153 + #define HLOS1_VOTE_MMNOC_MMU_TBU_SF_GDSC 3 154 + 155 + #endif
+18
include/dt-bindings/clock/qcom,q6sstopcc-qcs404.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright (c) 2018, The Linux Foundation. All rights reserved. 4 + */ 5 + 6 + #ifndef _DT_BINDINGS_CLK_Q6SSTOP_QCS404_H 7 + #define _DT_BINDINGS_CLK_Q6SSTOP_QCS404_H 8 + 9 + #define LCC_AHBFABRIC_CBC_CLK 0 10 + #define LCC_Q6SS_AHBS_CBC_CLK 1 11 + #define LCC_Q6SS_TCM_SLAVE_CBC_CLK 2 12 + #define LCC_Q6SS_AHBM_CBC_CLK 3 13 + #define LCC_Q6SS_AXIM_CBC_CLK 4 14 + #define LCC_Q6SS_BCR_SLEEP_CLK 5 15 + #define TCSR_Q6SS_LCC_CBCR_CLK 6 16 + 17 + #define Q6SSTOP_BCR_RESET 1 18 + #endif
+57
include/dt-bindings/clock/r8a774b1-cpg-mssr.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 2 + * 3 + * Copyright (C) 2019 Renesas Electronics Corp. 4 + */ 5 + #ifndef __DT_BINDINGS_CLOCK_R8A774B1_CPG_MSSR_H__ 6 + #define __DT_BINDINGS_CLOCK_R8A774B1_CPG_MSSR_H__ 7 + 8 + #include <dt-bindings/clock/renesas-cpg-mssr.h> 9 + 10 + /* r8a774b1 CPG Core Clocks */ 11 + #define R8A774B1_CLK_Z 0 12 + #define R8A774B1_CLK_ZG 1 13 + #define R8A774B1_CLK_ZTR 2 14 + #define R8A774B1_CLK_ZTRD2 3 15 + #define R8A774B1_CLK_ZT 4 16 + #define R8A774B1_CLK_ZX 5 17 + #define R8A774B1_CLK_S0D1 6 18 + #define R8A774B1_CLK_S0D2 7 19 + #define R8A774B1_CLK_S0D3 8 20 + #define R8A774B1_CLK_S0D4 9 21 + #define R8A774B1_CLK_S0D6 10 22 + #define R8A774B1_CLK_S0D8 11 23 + #define R8A774B1_CLK_S0D12 12 24 + #define R8A774B1_CLK_S1D2 13 25 + #define R8A774B1_CLK_S1D4 14 26 + #define R8A774B1_CLK_S2D1 15 27 + #define R8A774B1_CLK_S2D2 16 28 + #define R8A774B1_CLK_S2D4 17 29 + #define R8A774B1_CLK_S3D1 18 30 + #define R8A774B1_CLK_S3D2 19 31 + #define R8A774B1_CLK_S3D4 20 32 + #define R8A774B1_CLK_LB 21 33 + #define R8A774B1_CLK_CL 22 34 + #define R8A774B1_CLK_ZB3 23 35 + #define R8A774B1_CLK_ZB3D2 24 36 + #define R8A774B1_CLK_CR 25 37 + #define R8A774B1_CLK_DDR 26 38 + #define R8A774B1_CLK_SD0H 27 39 + #define R8A774B1_CLK_SD0 28 40 + #define R8A774B1_CLK_SD1H 29 41 + #define R8A774B1_CLK_SD1 30 42 + #define R8A774B1_CLK_SD2H 31 43 + #define R8A774B1_CLK_SD2 32 44 + #define R8A774B1_CLK_SD3H 33 45 + #define R8A774B1_CLK_SD3 34 46 + #define R8A774B1_CLK_RPC 35 47 + #define R8A774B1_CLK_RPCD2 36 48 + #define R8A774B1_CLK_MSO 37 49 + #define R8A774B1_CLK_HDMI 38 50 + #define R8A774B1_CLK_CSI0 39 51 + #define R8A774B1_CLK_CP 40 52 + #define R8A774B1_CLK_CPEX 41 53 + #define R8A774B1_CLK_R 42 54 + #define R8A774B1_CLK_OSC 43 55 + #define R8A774B1_CLK_CANFD 44 56 + 57 + #endif /* __DT_BINDINGS_CLOCK_R8A774B1_CPG_MSSR_H__ */
+65
include/dt-bindings/clock/r8a77961-cpg-mssr.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0+ 2 + * 3 + * Copyright (C) 2019 Renesas Electronics Corp. 4 + */ 5 + #ifndef __DT_BINDINGS_CLOCK_R8A77961_CPG_MSSR_H__ 6 + #define __DT_BINDINGS_CLOCK_R8A77961_CPG_MSSR_H__ 7 + 8 + #include <dt-bindings/clock/renesas-cpg-mssr.h> 9 + 10 + /* r8a77961 CPG Core Clocks */ 11 + #define R8A77961_CLK_Z 0 12 + #define R8A77961_CLK_Z2 1 13 + #define R8A77961_CLK_ZR 2 14 + #define R8A77961_CLK_ZG 3 15 + #define R8A77961_CLK_ZTR 4 16 + #define R8A77961_CLK_ZTRD2 5 17 + #define R8A77961_CLK_ZT 6 18 + #define R8A77961_CLK_ZX 7 19 + #define R8A77961_CLK_S0D1 8 20 + #define R8A77961_CLK_S0D2 9 21 + #define R8A77961_CLK_S0D3 10 22 + #define R8A77961_CLK_S0D4 11 23 + #define R8A77961_CLK_S0D6 12 24 + #define R8A77961_CLK_S0D8 13 25 + #define R8A77961_CLK_S0D12 14 26 + #define R8A77961_CLK_S1D1 15 27 + #define R8A77961_CLK_S1D2 16 28 + #define R8A77961_CLK_S1D4 17 29 + #define R8A77961_CLK_S2D1 18 30 + #define R8A77961_CLK_S2D2 19 31 + #define R8A77961_CLK_S2D4 20 32 + #define R8A77961_CLK_S3D1 21 33 + #define R8A77961_CLK_S3D2 22 34 + #define R8A77961_CLK_S3D4 23 35 + #define R8A77961_CLK_LB 24 36 + #define R8A77961_CLK_CL 25 37 + #define R8A77961_CLK_ZB3 26 38 + #define R8A77961_CLK_ZB3D2 27 39 + #define R8A77961_CLK_ZB3D4 28 40 + #define R8A77961_CLK_CR 29 41 + #define R8A77961_CLK_CRD2 30 42 + #define R8A77961_CLK_SD0H 31 43 + #define R8A77961_CLK_SD0 32 44 + #define R8A77961_CLK_SD1H 33 45 + #define R8A77961_CLK_SD1 34 46 + #define R8A77961_CLK_SD2H 35 47 + #define R8A77961_CLK_SD2 36 48 + #define R8A77961_CLK_SD3H 37 49 + #define R8A77961_CLK_SD3 38 50 + #define R8A77961_CLK_SSP2 39 51 + #define R8A77961_CLK_SSP1 40 52 + #define R8A77961_CLK_SSPRS 41 53 + #define R8A77961_CLK_RPC 42 54 + #define R8A77961_CLK_RPCD2 43 55 + #define R8A77961_CLK_MSO 44 56 + #define R8A77961_CLK_CANFD 45 57 + #define R8A77961_CLK_HDMI 46 58 + #define R8A77961_CLK_CSI0 47 59 + /* CLK_CSIREF was removed */ 60 + #define R8A77961_CLK_CP 49 61 + #define R8A77961_CLK_CPEX 50 62 + #define R8A77961_CLK_R 51 63 + #define R8A77961_CLK_OSC 52 64 + 65 + #endif /* __DT_BINDINGS_CLOCK_R8A77961_CPG_MSSR_H__ */
+1 -1
include/dt-bindings/clock/sun8i-h3-ccu.h
··· 143 143 #define CLK_AVS 110 144 144 #define CLK_HDMI 111 145 145 #define CLK_HDMI_DDC 112 146 - 146 + #define CLK_MBUS 113 147 147 #define CLK_GPU 114 148 148 149 149 /* New clocks imported in H5 */
+2 -1
include/dt-bindings/clock/tegra124-car-common.h
··· 337 337 #define TEGRA124_CLK_CLK_OUT_3_MUX 308 338 338 /* 309 */ 339 339 /* 310 */ 340 - #define TEGRA124_CLK_SOR0_LVDS 311 340 + #define TEGRA124_CLK_SOR0_LVDS 311 /* deprecated */ 341 + #define TEGRA124_CLK_SOR0_OUT 311 341 342 #define TEGRA124_CLK_XUSB_SS_DIV2 312 342 343 343 344 #define TEGRA124_CLK_PLL_M_UD 313
+3 -3
include/dt-bindings/clock/tegra210-car.h
··· 308 308 #define TEGRA210_CLK_CLK_OUT_2 278 309 309 #define TEGRA210_CLK_CLK_OUT_3 279 310 310 #define TEGRA210_CLK_BLINK 280 311 - /* 281 */ 312 - #define TEGRA210_CLK_SOR1_SRC 282 311 + #define TEGRA210_CLK_SOR0_LVDS 281 /* deprecated */ 312 + #define TEGRA210_CLK_SOR0_OUT 281 313 313 #define TEGRA210_CLK_SOR1_OUT 282 314 314 /* 283 */ 315 315 #define TEGRA210_CLK_XUSB_HOST_SRC 284 ··· 391 391 #define TEGRA210_CLK_CLK_OUT_3_MUX 358 392 392 #define TEGRA210_CLK_DSIA_MUX 359 393 393 #define TEGRA210_CLK_DSIB_MUX 360 394 - #define TEGRA210_CLK_SOR0_LVDS 361 394 + /* 361 */ 395 395 #define TEGRA210_CLK_XUSB_SS_DIV2 362 396 396 397 397 #define TEGRA210_CLK_PLL_M_UD 363
+44
include/dt-bindings/clock/x1000-cgu.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * This header provides clock numbers for the ingenic,x1000-cgu DT binding. 4 + * 5 + * They are roughly ordered as: 6 + * - external clocks 7 + * - PLLs 8 + * - muxes/dividers in the order they appear in the x1000 programmers manual 9 + * - gates in order of their bit in the CLKGR* registers 10 + */ 11 + 12 + #ifndef __DT_BINDINGS_CLOCK_X1000_CGU_H__ 13 + #define __DT_BINDINGS_CLOCK_X1000_CGU_H__ 14 + 15 + #define X1000_CLK_EXCLK 0 16 + #define X1000_CLK_RTCLK 1 17 + #define X1000_CLK_APLL 2 18 + #define X1000_CLK_MPLL 3 19 + #define X1000_CLK_SCLKA 4 20 + #define X1000_CLK_CPUMUX 5 21 + #define X1000_CLK_CPU 6 22 + #define X1000_CLK_L2CACHE 7 23 + #define X1000_CLK_AHB0 8 24 + #define X1000_CLK_AHB2PMUX 9 25 + #define X1000_CLK_AHB2 10 26 + #define X1000_CLK_PCLK 11 27 + #define X1000_CLK_DDR 12 28 + #define X1000_CLK_MAC 13 29 + #define X1000_CLK_MSCMUX 14 30 + #define X1000_CLK_MSC0 15 31 + #define X1000_CLK_MSC1 16 32 + #define X1000_CLK_SSIPLL 17 33 + #define X1000_CLK_SSIMUX 18 34 + #define X1000_CLK_SFC 19 35 + #define X1000_CLK_I2C0 20 36 + #define X1000_CLK_I2C1 21 37 + #define X1000_CLK_I2C2 22 38 + #define X1000_CLK_UART0 23 39 + #define X1000_CLK_UART1 24 40 + #define X1000_CLK_UART2 25 41 + #define X1000_CLK_SSI 26 42 + #define X1000_CLK_PDMA 27 43 + 44 + #endif /* __DT_BINDINGS_CLOCK_X1000_CGU_H__ */
+26
include/dt-bindings/power/r8a774b1-sysc.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 2 + * 3 + * Copyright (C) 2019 Renesas Electronics Corp. 4 + */ 5 + #ifndef __DT_BINDINGS_POWER_R8A774B1_SYSC_H__ 6 + #define __DT_BINDINGS_POWER_R8A774B1_SYSC_H__ 7 + 8 + /* 9 + * These power domain indices match the numbers of the interrupt bits 10 + * representing the power areas in the various Interrupt Registers 11 + * (e.g. SYSCISR, Interrupt Status Register) 12 + */ 13 + 14 + #define R8A774B1_PD_CA57_CPU0 0 15 + #define R8A774B1_PD_CA57_CPU1 1 16 + #define R8A774B1_PD_A3VP 9 17 + #define R8A774B1_PD_CA57_SCU 12 18 + #define R8A774B1_PD_A3VC 14 19 + #define R8A774B1_PD_3DG_A 17 20 + #define R8A774B1_PD_3DG_B 18 21 + #define R8A774B1_PD_A2VC1 26 22 + 23 + /* Always-on power area */ 24 + #define R8A774B1_PD_ALWAYS_ON 32 25 + 26 + #endif /* __DT_BINDINGS_POWER_R8A774B1_SYSC_H__ */
+32
include/dt-bindings/power/r8a77961-sysc.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright (C) 2019 Glider bvba 4 + */ 5 + #ifndef __DT_BINDINGS_POWER_R8A77961_SYSC_H__ 6 + #define __DT_BINDINGS_POWER_R8A77961_SYSC_H__ 7 + 8 + /* 9 + * These power domain indices match the numbers of the interrupt bits 10 + * representing the power areas in the various Interrupt Registers 11 + * (e.g. SYSCISR, Interrupt Status Register) 12 + */ 13 + 14 + #define R8A77961_PD_CA57_CPU0 0 15 + #define R8A77961_PD_CA57_CPU1 1 16 + #define R8A77961_PD_CA53_CPU0 5 17 + #define R8A77961_PD_CA53_CPU1 6 18 + #define R8A77961_PD_CA53_CPU2 7 19 + #define R8A77961_PD_CA53_CPU3 8 20 + #define R8A77961_PD_CA57_SCU 12 21 + #define R8A77961_PD_CR7 13 22 + #define R8A77961_PD_A3VC 14 23 + #define R8A77961_PD_3DG_A 17 24 + #define R8A77961_PD_3DG_B 18 25 + #define R8A77961_PD_CA53_SCU 21 26 + #define R8A77961_PD_A3IR 24 27 + #define R8A77961_PD_A2VC1 26 28 + 29 + /* Always-on power area */ 30 + #define R8A77961_PD_ALWAYS_ON 32 31 + 32 + #endif /* __DT_BINDINGS_POWER_R8A77961_SYSC_H__ */
+15
include/dt-bindings/reset/amlogic,meson-g12a-audio-reset.h
··· 35 35 #define AUD_RESET_TOHDMITX 24 36 36 #define AUD_RESET_CLKTREE 25 37 37 38 + /* SM1 added resets */ 39 + #define AUD_RESET_RESAMPLE_B 26 40 + #define AUD_RESET_TOVAD 27 41 + #define AUD_RESET_LOCKER 28 42 + #define AUD_RESET_SPDIFIN_LB 29 43 + #define AUD_RESET_FRATV 30 44 + #define AUD_RESET_FRHDMIRX 31 45 + #define AUD_RESET_FRDDR_D 32 46 + #define AUD_RESET_TODDR_D 33 47 + #define AUD_RESET_LOOPBACK_B 34 48 + #define AUD_RESET_EARCTX 35 49 + #define AUD_RESET_EARCRX 36 50 + #define AUD_RESET_FRDDR_E 37 51 + #define AUD_RESET_TODDR_E 38 52 + 38 53 #endif
+1
include/linux/clk-provider.h
··· 818 818 struct clk_hw *clk_hw_get_parent(const struct clk_hw *hw); 819 819 struct clk_hw *clk_hw_get_parent_by_index(const struct clk_hw *hw, 820 820 unsigned int index); 821 + int clk_hw_get_parent_index(struct clk_hw *hw); 821 822 int clk_hw_set_parent(struct clk_hw *hw, struct clk_hw *new_parent); 822 823 unsigned int __clk_get_enable_count(struct clk *clk); 823 824 unsigned long clk_hw_get_rate(const struct clk_hw *hw);
+24
include/linux/clk/tegra.h
··· 108 108 109 109 tegra_cpu_car_ops->resume(); 110 110 } 111 + #else 112 + static inline bool tegra_cpu_rail_off_ready(void) 113 + { 114 + return false; 115 + } 116 + 117 + static inline void tegra_cpu_clock_suspend(void) 118 + { 119 + } 120 + 121 + static inline void tegra_cpu_clock_resume(void) 122 + { 123 + } 111 124 #endif 112 125 113 126 extern void tegra210_xusb_pll_hw_control_enable(void); ··· 131 118 extern void tegra210_put_utmipll_in_iddq(void); 132 119 extern void tegra210_put_utmipll_out_iddq(void); 133 120 extern int tegra210_clk_handle_mbist_war(unsigned int id); 121 + 122 + struct clk; 123 + 124 + typedef long (tegra20_clk_emc_round_cb)(unsigned long rate, 125 + unsigned long min_rate, 126 + unsigned long max_rate, 127 + void *arg); 128 + 129 + void tegra20_clk_set_emc_round_callback(tegra20_clk_emc_round_cb *round_cb, 130 + void *cb_arg); 131 + int tegra20_clk_prepare_emc_mc_same_freq(struct clk *emc_clk, bool same); 134 132 135 133 #endif /* __LINUX_CLK_TEGRA_H_ */
+2 -1
include/linux/clk/ti.h
··· 153 153 u8 fixed_div; 154 154 struct clk_omap_reg enable_reg; 155 155 u8 enable_bit; 156 - u8 flags; 156 + unsigned long flags; 157 157 struct clk_omap_reg clksel_reg; 158 158 struct dpll_data *dpll_data; 159 159 const char *clkdm_name; ··· 298 298 299 299 void ti_clk_setup_features(struct ti_clk_features *features); 300 300 const struct ti_clk_features *ti_clk_get_features(void); 301 + bool ti_clk_is_in_standby(struct clk *clk); 301 302 int omap3_noncore_dpll_save_context(struct clk_hw *hw); 302 303 void omap3_noncore_dpll_restore_context(struct clk_hw *hw); 303 304