Merge branches 'clk-range', 'clk-uniphier', 'clk-apple' and 'clk-qcom' into clk-next
- Make clk_set_rate_range() re-evaluate the limits each time - Introduce various clk_set_rate_range() tests - Add clk_drop_range() to drop a previously set range - Support for NCO blocks on Apple SoCs * clk-range: clk: Drop the rate range on clk_put() clk: test: Test clk_set_rate_range on orphan mux clk: Initialize orphan req_rate clk: bcm: rpi: Run some clocks at the minimum rate allowed clk: bcm: rpi: Set a default minimum rate clk: bcm: rpi: Add variant structure clk: Add clk_drop_range clk: Always set the rate on clk_set_range_rate clk: Use clamp instead of open-coding our own clk: Always clamp the rounded rate clk: Enforce that disjoints limits are invalid clk: Introduce Kunit Tests for the framework clk: Fix clk_hw_get_clk() when dev is NULL * clk-uniphier: clk: uniphier: Fix fixed-rate initialization * clk-apple: clk: clk-apple-nco: Allow and fix module building MAINTAINERS: Add clk-apple-nco under ARM/APPLE MACHINE clk: clk-apple-nco: Add driver for Apple NCO dt-bindings: clock: Add Apple NCO * clk-qcom: (61 commits) clk: qcom: gcc-msm8994: Fix gpll4 width dt-bindings: clock: fix dt_binding_check error for qcom,gcc-other.yaml clk: qcom: Add display clock controller driver for SM6125 dt-bindings: clock: add QCOM SM6125 display clock bindings clk: qcom: Fix sorting of SDX_GCC_65 in Makefile and Kconfig clk: qcom: gcc: Add emac GDSC support for SM8150 clk: qcom: gcc: sm8150: Fix some identation issues clk: qcom: gcc: Add UFS_CARD and UFS_PHY GDSCs for SM8150 clk: qcom: gcc: Add PCIe0 and PCIe1 GDSC for SM8150 clk: qcom: clk-rcg2: Update the frac table for pixel clock clk: qcom: clk-rcg2: Update logic to calculate D value for RCG clk: qcom: smd: Add missing MSM8998 RPM clocks clk: qcom: smd: Add missing RPM clocks for msm8992/4 dt-bindings: clock: qcom: rpmcc: Add RPM Modem SubSystem (MSS) clocks clk: qcom: gcc-ipq806x: add CryptoEngine resets dt-bindings: reset: add ipq8064 ce5 resets clk: qcom: gcc-ipq806x: add CryptoEngine clocks dt-bindings: clock: add ipq8064 ce5 clk define clk: qcom: gcc-ipq806x: add additional freq for sdc table clk: qcom: clk-rcg: add clk_rcg_floor_ops ops ...
This commit is contained in:
		
						commit
						c64dd8ea8e
					
				
							
								
								
									
										62
									
								
								Documentation/devicetree/bindings/clock/apple,nco.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								Documentation/devicetree/bindings/clock/apple,nco.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,62 @@ | ||||
| # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) | ||||
| %YAML 1.2 | ||||
| --- | ||||
| $id: http://devicetree.org/schemas/clock/apple,nco.yaml# | ||||
| $schema: http://devicetree.org/meta-schemas/core.yaml# | ||||
| 
 | ||||
| title: Apple SoCs' NCO block | ||||
| 
 | ||||
| maintainers: | ||||
|   - Martin Povišer <povik+lin@cutebit.org> | ||||
| 
 | ||||
| description: | | ||||
|   The NCO (Numerically Controlled Oscillator) block found on Apple SoCs | ||||
|   such as the t8103 (M1) is a programmable clock generator performing | ||||
|   fractional division of a high frequency input clock. | ||||
| 
 | ||||
|   It carries a number of independent channels and is typically used for | ||||
|   generation of audio bitclocks. | ||||
| 
 | ||||
| properties: | ||||
|   compatible: | ||||
|     items: | ||||
|       - enum: | ||||
|           - apple,t6000-nco | ||||
|           - apple,t8103-nco | ||||
|       - const: apple,nco | ||||
| 
 | ||||
|   clocks: | ||||
|     description: | ||||
|       Specifies the reference clock from which the output clocks | ||||
|       are derived through fractional division. | ||||
|     maxItems: 1 | ||||
| 
 | ||||
|   '#clock-cells': | ||||
|     const: 1 | ||||
| 
 | ||||
|   reg: | ||||
|     maxItems: 1 | ||||
| 
 | ||||
| required: | ||||
|   - compatible | ||||
|   - clocks | ||||
|   - '#clock-cells' | ||||
|   - reg | ||||
| 
 | ||||
| additionalProperties: false | ||||
| 
 | ||||
| examples: | ||||
|   - | | ||||
|     nco_clkref: clock-ref { | ||||
|       compatible = "fixed-clock"; | ||||
|       #clock-cells = <0>; | ||||
|       clock-frequency = <900000000>; | ||||
|       clock-output-names = "nco-ref"; | ||||
|     }; | ||||
| 
 | ||||
|     nco: clock-controller@23b044000 { | ||||
|       compatible = "apple,t8103-nco", "apple,nco"; | ||||
|       reg = <0x3b044000 0x14000>; | ||||
|       #clock-cells = <1>; | ||||
|       clocks = <&nco_clkref>; | ||||
|     }; | ||||
| @ -10,7 +10,7 @@ maintainers: | ||||
|   - Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> | ||||
| 
 | ||||
| description: | ||||
|   The A7 PLL on the Qualcomm platforms like SDX55 is used to provide high | ||||
|   The A7 PLL on the Qualcomm platforms like SDX55, SDX65 is used to provide high | ||||
|   frequency clock to the CPU. | ||||
| 
 | ||||
| properties: | ||||
|  | ||||
| @ -1,18 +0,0 @@ | ||||
| Qualcomm Camera Clock & Reset Controller Binding | ||||
| ------------------------------------------------ | ||||
| 
 | ||||
| Required properties : | ||||
| - compatible : shall contain "qcom,sdm845-camcc". | ||||
| - reg : shall contain base register location and length. | ||||
| - #clock-cells : from common clock binding, shall contain 1. | ||||
| - #reset-cells : from common reset binding, shall contain 1. | ||||
| - #power-domain-cells : from generic power domain binding, shall contain 1. | ||||
| 
 | ||||
| Example: | ||||
| 	camcc: clock-controller@ad00000 { | ||||
| 		compatible = "qcom,sdm845-camcc"; | ||||
| 		reg = <0xad00000 0x10000>; | ||||
| 		#clock-cells = <1>; | ||||
| 		#reset-cells = <1>; | ||||
| 		#power-domain-cells = <1>; | ||||
| 	}; | ||||
| @ -0,0 +1,87 @@ | ||||
| # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) | ||||
| %YAML 1.2 | ||||
| --- | ||||
| $id: http://devicetree.org/schemas/clock/qcom,dispcc-sm6125.yaml# | ||||
| $schema: http://devicetree.org/meta-schemas/core.yaml# | ||||
| 
 | ||||
| title: Qualcomm Display Clock Controller Binding for SM6125 | ||||
| 
 | ||||
| maintainers: | ||||
|   - Martin Botka <martin.botka@somainline.org> | ||||
| 
 | ||||
| description: | | ||||
|   Qualcomm display clock control module which supports the clocks and | ||||
|   power domains on SM6125. | ||||
| 
 | ||||
|   See also: | ||||
|     dt-bindings/clock/qcom,dispcc-sm6125.h | ||||
| 
 | ||||
| properties: | ||||
|   compatible: | ||||
|     enum: | ||||
|       - qcom,sm6125-dispcc | ||||
| 
 | ||||
|   clocks: | ||||
|     items: | ||||
|       - description: Board XO source | ||||
|       - description: Byte clock from DSI PHY0 | ||||
|       - description: Pixel clock from DSI PHY0 | ||||
|       - description: Pixel clock from DSI PHY1 | ||||
|       - description: Link clock from DP PHY | ||||
|       - description: VCO DIV clock from DP PHY | ||||
|       - description: AHB config clock from GCC | ||||
| 
 | ||||
|   clock-names: | ||||
|     items: | ||||
|       - const: bi_tcxo | ||||
|       - const: dsi0_phy_pll_out_byteclk | ||||
|       - const: dsi0_phy_pll_out_dsiclk | ||||
|       - const: dsi1_phy_pll_out_dsiclk | ||||
|       - const: dp_phy_pll_link_clk | ||||
|       - const: dp_phy_pll_vco_div_clk | ||||
|       - const: cfg_ahb_clk | ||||
| 
 | ||||
|   '#clock-cells': | ||||
|     const: 1 | ||||
| 
 | ||||
|   '#power-domain-cells': | ||||
|     const: 1 | ||||
| 
 | ||||
|   reg: | ||||
|     maxItems: 1 | ||||
| 
 | ||||
| required: | ||||
|   - compatible | ||||
|   - reg | ||||
|   - clocks | ||||
|   - clock-names | ||||
|   - '#clock-cells' | ||||
|   - '#power-domain-cells' | ||||
| 
 | ||||
| additionalProperties: false | ||||
| 
 | ||||
| examples: | ||||
|   - | | ||||
|     #include <dt-bindings/clock/qcom,rpmcc.h> | ||||
|     #include <dt-bindings/clock/qcom,gcc-sm6125.h> | ||||
|     clock-controller@5f00000 { | ||||
|       compatible = "qcom,sm6125-dispcc"; | ||||
|       reg = <0x5f00000 0x20000>; | ||||
|       clocks = <&rpmcc RPM_SMD_XO_CLK_SRC>, | ||||
|                <&dsi0_phy 0>, | ||||
|                <&dsi0_phy 1>, | ||||
|                <&dsi1_phy 1>, | ||||
|                <&dp_phy 0>, | ||||
|                <&dp_phy 1>, | ||||
|                <&gcc GCC_DISP_AHB_CLK>; | ||||
|       clock-names = "bi_tcxo", | ||||
|                     "dsi0_phy_pll_out_byteclk", | ||||
|                     "dsi0_phy_pll_out_dsiclk", | ||||
|                     "dsi1_phy_pll_out_dsiclk", | ||||
|                     "dp_phy_pll_link_clk", | ||||
|                     "dp_phy_pll_vco_div_clk", | ||||
|                     "cfg_ahb_clk"; | ||||
|       #clock-cells = <1>; | ||||
|       #power-domain-cells = <1>; | ||||
|     }; | ||||
| ... | ||||
| @ -0,0 +1,86 @@ | ||||
| # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) | ||||
| %YAML 1.2 | ||||
| --- | ||||
| $id: http://devicetree.org/schemas/clock/qcom,dispcc-sm6350.yaml# | ||||
| $schema: http://devicetree.org/meta-schemas/core.yaml# | ||||
| 
 | ||||
| title: Qualcomm Display Clock & Reset Controller Binding for SM6350 | ||||
| 
 | ||||
| maintainers: | ||||
|   - Konrad Dybcio <konrad.dybcio@somainline.org> | ||||
| 
 | ||||
| description: | | ||||
|   Qualcomm display clock control module which supports the clocks, resets and | ||||
|   power domains on SM6350. | ||||
| 
 | ||||
|   See also dt-bindings/clock/qcom,dispcc-sm6350.h. | ||||
| 
 | ||||
| properties: | ||||
|   compatible: | ||||
|     const: qcom,sm6350-dispcc | ||||
| 
 | ||||
|   clocks: | ||||
|     items: | ||||
|       - description: Board XO source | ||||
|       - description: GPLL0 source from GCC | ||||
|       - description: Byte clock from DSI PHY | ||||
|       - description: Pixel clock from DSI PHY | ||||
|       - description: Link clock from DP PHY | ||||
|       - description: VCO DIV clock from DP PHY | ||||
| 
 | ||||
|   clock-names: | ||||
|     items: | ||||
|       - const: bi_tcxo | ||||
|       - const: gcc_disp_gpll0_clk | ||||
|       - const: dsi0_phy_pll_out_byteclk | ||||
|       - const: dsi0_phy_pll_out_dsiclk | ||||
|       - const: dp_phy_pll_link_clk | ||||
|       - const: dp_phy_pll_vco_div_clk | ||||
| 
 | ||||
|   '#clock-cells': | ||||
|     const: 1 | ||||
| 
 | ||||
|   '#reset-cells': | ||||
|     const: 1 | ||||
| 
 | ||||
|   '#power-domain-cells': | ||||
|     const: 1 | ||||
| 
 | ||||
|   reg: | ||||
|     maxItems: 1 | ||||
| 
 | ||||
| required: | ||||
|   - compatible | ||||
|   - reg | ||||
|   - clocks | ||||
|   - clock-names | ||||
|   - '#clock-cells' | ||||
|   - '#reset-cells' | ||||
|   - '#power-domain-cells' | ||||
| 
 | ||||
| additionalProperties: false | ||||
| 
 | ||||
| examples: | ||||
|   - | | ||||
|     #include <dt-bindings/clock/qcom,gcc-sm6350.h> | ||||
|     #include <dt-bindings/clock/qcom,rpmh.h> | ||||
|     clock-controller@af00000 { | ||||
|       compatible = "qcom,sm6350-dispcc"; | ||||
|       reg = <0x0af00000 0x20000>; | ||||
|       clocks = <&rpmhcc RPMH_CXO_CLK>, | ||||
|                <&gcc GCC_DISP_GPLL0_CLK>, | ||||
|                <&dsi_phy 0>, | ||||
|                <&dsi_phy 1>, | ||||
|                <&dp_phy 0>, | ||||
|                <&dp_phy 1>; | ||||
|       clock-names = "bi_tcxo", | ||||
|                     "gcc_disp_gpll0_clk", | ||||
|                     "dsi0_phy_pll_out_byteclk", | ||||
|                     "dsi0_phy_pll_out_dsiclk", | ||||
|                     "dp_phy_pll_link_clk", | ||||
|                     "dp_phy_pll_vco_div_clk"; | ||||
|       #clock-cells = <1>; | ||||
|       #reset-cells = <1>; | ||||
|       #power-domain-cells = <1>; | ||||
|     }; | ||||
| ... | ||||
| @ -6,6 +6,9 @@ $schema: http://devicetree.org/meta-schemas/core.yaml# | ||||
| 
 | ||||
| title: Qualcomm Global Clock & Reset Controller Binding for APQ8064 | ||||
| 
 | ||||
| allOf: | ||||
|   - $ref: qcom,gcc.yaml# | ||||
| 
 | ||||
| maintainers: | ||||
|   - Stephen Boyd <sboyd@kernel.org> | ||||
|   - Taniya Das <tdas@codeaurora.org> | ||||
| @ -17,22 +20,12 @@ description: | | ||||
|   See also: | ||||
|   - dt-bindings/clock/qcom,gcc-msm8960.h | ||||
|   - dt-bindings/reset/qcom,gcc-msm8960.h | ||||
|   - dt-bindings/clock/qcom,gcc-apq8084.h | ||||
|   - dt-bindings/reset/qcom,gcc-apq8084.h | ||||
| 
 | ||||
| properties: | ||||
|   compatible: | ||||
|     const: qcom,gcc-apq8064 | ||||
| 
 | ||||
|   '#clock-cells': | ||||
|     const: 1 | ||||
| 
 | ||||
|   '#reset-cells': | ||||
|     const: 1 | ||||
| 
 | ||||
|   '#power-domain-cells': | ||||
|     const: 1 | ||||
| 
 | ||||
|   reg: | ||||
|     maxItems: 1 | ||||
|     const: qcom,gcc-apq8084 | ||||
| 
 | ||||
|   nvmem-cells: | ||||
|     minItems: 1 | ||||
| @ -53,21 +46,13 @@ properties: | ||||
|   '#thermal-sensor-cells': | ||||
|     const: 1 | ||||
| 
 | ||||
|   protected-clocks: | ||||
|     description: | ||||
|       Protected clock specifier list as per common clock binding. | ||||
| 
 | ||||
| required: | ||||
|   - compatible | ||||
|   - reg | ||||
|   - '#clock-cells' | ||||
|   - '#reset-cells' | ||||
|   - '#power-domain-cells' | ||||
|   - nvmem-cells | ||||
|   - nvmem-cell-names | ||||
|   - '#thermal-sensor-cells' | ||||
| 
 | ||||
| additionalProperties: false | ||||
| unevaluatedProperties: false | ||||
| 
 | ||||
| examples: | ||||
|   - | | ||||
|  | ||||
| @ -0,0 +1,76 @@ | ||||
| # SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause | ||||
| %YAML 1.2 | ||||
| --- | ||||
| $id: http://devicetree.org/schemas/clock/qcom,gcc-ipq8064.yaml# | ||||
| $schema: http://devicetree.org/meta-schemas/core.yaml# | ||||
| 
 | ||||
| title: Qualcomm Global Clock & Reset Controller Binding for IPQ8064 | ||||
| 
 | ||||
| allOf: | ||||
|   - $ref: qcom,gcc.yaml# | ||||
| 
 | ||||
| maintainers: | ||||
|   - Ansuel Smith <ansuelsmth@gmail.com> | ||||
| 
 | ||||
| description: | | ||||
|   Qualcomm global clock control module which supports the clocks, resets and | ||||
|   power domains on IPQ8064. | ||||
| 
 | ||||
|   See also: | ||||
|   - dt-bindings/clock/qcom,gcc-ipq806x.h (qcom,gcc-ipq8064) | ||||
|   - dt-bindings/reset/qcom,gcc-ipq806x.h (qcom,gcc-ipq8064) | ||||
| 
 | ||||
| properties: | ||||
|   compatible: | ||||
|     items: | ||||
|       - const: qcom,gcc-ipq8064 | ||||
|       - const: syscon | ||||
| 
 | ||||
|   clocks: | ||||
|     items: | ||||
|       - description: PXO source | ||||
|       - description: CXO source | ||||
| 
 | ||||
|   clock-names: | ||||
|     items: | ||||
|       - const: pxo | ||||
|       - const: cxo | ||||
| 
 | ||||
|   thermal-sensor: | ||||
|     type: object | ||||
| 
 | ||||
|     allOf: | ||||
|       - $ref: /schemas/thermal/qcom-tsens.yaml# | ||||
| 
 | ||||
| required: | ||||
|   - compatible | ||||
|   - clocks | ||||
|   - clock-names | ||||
| 
 | ||||
| unevaluatedProperties: false | ||||
| 
 | ||||
| examples: | ||||
|   - | | ||||
|     #include <dt-bindings/interrupt-controller/arm-gic.h> | ||||
| 
 | ||||
|     gcc: clock-controller@900000 { | ||||
|       compatible = "qcom,gcc-ipq8064", "syscon"; | ||||
|       reg = <0x00900000 0x4000>; | ||||
|       clocks = <&pxo_board>, <&cxo_board>; | ||||
|       clock-names = "pxo", "cxo"; | ||||
|       #clock-cells = <1>; | ||||
|       #reset-cells = <1>; | ||||
|       #power-domain-cells = <1>; | ||||
| 
 | ||||
|       tsens: thermal-sensor { | ||||
|         compatible = "qcom,ipq8064-tsens"; | ||||
| 
 | ||||
|         nvmem-cells = <&tsens_calib>, <&tsens_calib_backup>; | ||||
|         nvmem-cell-names = "calib", "calib_backup"; | ||||
|         interrupts = <GIC_SPI 178 IRQ_TYPE_LEVEL_HIGH>; | ||||
|         interrupt-names = "uplow"; | ||||
| 
 | ||||
|         #qcom,sensors = <11>; | ||||
|         #thermal-sensor-cells = <1>; | ||||
|       }; | ||||
|     }; | ||||
							
								
								
									
										70
									
								
								Documentation/devicetree/bindings/clock/qcom,gcc-other.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								Documentation/devicetree/bindings/clock/qcom,gcc-other.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,70 @@ | ||||
| # SPDX-License-Identifier: GPL-2.0-only | ||||
| %YAML 1.2 | ||||
| --- | ||||
| $id: http://devicetree.org/schemas/clock/qcom,gcc-other.yaml# | ||||
| $schema: http://devicetree.org/meta-schemas/core.yaml# | ||||
| 
 | ||||
| title: Qualcomm Global Clock & Reset Controller Binding | ||||
| 
 | ||||
| maintainers: | ||||
|   - Stephen Boyd <sboyd@kernel.org> | ||||
|   - Taniya Das <tdas@codeaurora.org> | ||||
| 
 | ||||
| description: | | ||||
|   Qualcomm global clock control module which supports the clocks, resets and | ||||
|   power domains. | ||||
| 
 | ||||
|   See also: | ||||
|   - dt-bindings/clock/qcom,gcc-ipq4019.h | ||||
|   - dt-bindings/clock/qcom,gcc-ipq6018.h | ||||
|   - dt-bindings/reset/qcom,gcc-ipq6018.h | ||||
|   - dt-bindings/clock/qcom,gcc-msm8939.h | ||||
|   - dt-bindings/clock/qcom,gcc-msm8953.h | ||||
|   - dt-bindings/reset/qcom,gcc-msm8939.h | ||||
|   - dt-bindings/clock/qcom,gcc-msm8660.h | ||||
|   - dt-bindings/reset/qcom,gcc-msm8660.h | ||||
|   - dt-bindings/clock/qcom,gcc-msm8974.h (qcom,gcc-msm8226 and qcom,gcc-msm8974) | ||||
|   - dt-bindings/reset/qcom,gcc-msm8974.h (qcom,gcc-msm8226 and qcom,gcc-msm8974) | ||||
|   - dt-bindings/clock/qcom,gcc-mdm9607.h | ||||
|   - dt-bindings/clock/qcom,gcc-mdm9615.h | ||||
|   - dt-bindings/reset/qcom,gcc-mdm9615.h | ||||
|   - dt-bindings/clock/qcom,gcc-sdm660.h  (qcom,gcc-sdm630 and qcom,gcc-sdm660) | ||||
| 
 | ||||
| allOf: | ||||
|   - $ref: "qcom,gcc.yaml#" | ||||
| 
 | ||||
| properties: | ||||
|   compatible: | ||||
|     enum: | ||||
|       - qcom,gcc-ipq4019 | ||||
|       - qcom,gcc-ipq6018 | ||||
|       - qcom,gcc-mdm9607 | ||||
|       - qcom,gcc-msm8226 | ||||
|       - qcom,gcc-msm8660 | ||||
|       - qcom,gcc-msm8916 | ||||
|       - qcom,gcc-msm8939 | ||||
|       - qcom,gcc-msm8953 | ||||
|       - qcom,gcc-msm8960 | ||||
|       - qcom,gcc-msm8974 | ||||
|       - qcom,gcc-msm8974pro | ||||
|       - qcom,gcc-msm8974pro-ac | ||||
|       - qcom,gcc-mdm9615 | ||||
|       - qcom,gcc-sdm630 | ||||
|       - qcom,gcc-sdm660 | ||||
| 
 | ||||
| required: | ||||
|   - compatible | ||||
| 
 | ||||
| unevaluatedProperties: false | ||||
| 
 | ||||
| examples: | ||||
|   # Example for GCC for MSM8960: | ||||
|   - | | ||||
|     clock-controller@900000 { | ||||
|       compatible = "qcom,gcc-msm8960"; | ||||
|       reg = <0x900000 0x4000>; | ||||
|       #clock-cells = <1>; | ||||
|       #reset-cells = <1>; | ||||
|       #power-domain-cells = <1>; | ||||
|     }; | ||||
| ... | ||||
| @ -4,57 +4,17 @@ | ||||
| $id: http://devicetree.org/schemas/clock/qcom,gcc.yaml# | ||||
| $schema: http://devicetree.org/meta-schemas/core.yaml# | ||||
| 
 | ||||
| title: Qualcomm Global Clock & Reset Controller Binding | ||||
| title: Qualcomm Global Clock & Reset Controller Binding Common Bindings | ||||
| 
 | ||||
| maintainers: | ||||
|   - Stephen Boyd <sboyd@kernel.org> | ||||
|   - Taniya Das <tdas@codeaurora.org> | ||||
| 
 | ||||
| description: | | ||||
|   Qualcomm global clock control module which supports the clocks, resets and | ||||
|   power domains. | ||||
| 
 | ||||
|   See also: | ||||
|   - dt-bindings/clock/qcom,gcc-apq8084.h | ||||
|   - dt-bindings/reset/qcom,gcc-apq8084.h | ||||
|   - dt-bindings/clock/qcom,gcc-ipq4019.h | ||||
|   - dt-bindings/clock/qcom,gcc-ipq6018.h | ||||
|   - dt-bindings/reset/qcom,gcc-ipq6018.h | ||||
|   - dt-bindings/clock/qcom,gcc-ipq806x.h (qcom,gcc-ipq8064) | ||||
|   - dt-bindings/reset/qcom,gcc-ipq806x.h (qcom,gcc-ipq8064) | ||||
|   - dt-bindings/clock/qcom,gcc-msm8939.h | ||||
|   - dt-bindings/clock/qcom,gcc-msm8953.h | ||||
|   - dt-bindings/reset/qcom,gcc-msm8939.h | ||||
|   - dt-bindings/clock/qcom,gcc-msm8660.h | ||||
|   - dt-bindings/reset/qcom,gcc-msm8660.h | ||||
|   - dt-bindings/clock/qcom,gcc-msm8974.h (qcom,gcc-msm8226 and qcom,gcc-msm8974) | ||||
|   - dt-bindings/reset/qcom,gcc-msm8974.h (qcom,gcc-msm8226 and qcom,gcc-msm8974) | ||||
|   - dt-bindings/clock/qcom,gcc-mdm9607.h | ||||
|   - dt-bindings/clock/qcom,gcc-mdm9615.h | ||||
|   - dt-bindings/reset/qcom,gcc-mdm9615.h | ||||
|   - dt-bindings/clock/qcom,gcc-sdm660.h  (qcom,gcc-sdm630 and qcom,gcc-sdm660) | ||||
|   Common bindings for Qualcomm global clock control module which supports | ||||
|   the clocks, resets and power domains. | ||||
| 
 | ||||
| properties: | ||||
|   compatible: | ||||
|     enum: | ||||
|       - qcom,gcc-apq8084 | ||||
|       - qcom,gcc-ipq4019 | ||||
|       - qcom,gcc-ipq6018 | ||||
|       - qcom,gcc-ipq8064 | ||||
|       - qcom,gcc-mdm9607 | ||||
|       - qcom,gcc-msm8226 | ||||
|       - qcom,gcc-msm8660 | ||||
|       - qcom,gcc-msm8916 | ||||
|       - qcom,gcc-msm8939 | ||||
|       - qcom,gcc-msm8953 | ||||
|       - qcom,gcc-msm8960 | ||||
|       - qcom,gcc-msm8974 | ||||
|       - qcom,gcc-msm8974pro | ||||
|       - qcom,gcc-msm8974pro-ac | ||||
|       - qcom,gcc-mdm9615 | ||||
|       - qcom,gcc-sdm630 | ||||
|       - qcom,gcc-sdm660 | ||||
| 
 | ||||
|   '#clock-cells': | ||||
|     const: 1 | ||||
| 
 | ||||
| @ -72,22 +32,11 @@ properties: | ||||
|       Protected clock specifier list as per common clock binding. | ||||
| 
 | ||||
| required: | ||||
|   - compatible | ||||
|   - reg | ||||
|   - '#clock-cells' | ||||
|   - '#reset-cells' | ||||
|   - '#power-domain-cells' | ||||
| 
 | ||||
| additionalProperties: false | ||||
| additionalProperties: true | ||||
| 
 | ||||
| examples: | ||||
|   # Example for GCC for MSM8960: | ||||
|   - | | ||||
|     clock-controller@900000 { | ||||
|       compatible = "qcom,gcc-msm8960"; | ||||
|       reg = <0x900000 0x4000>; | ||||
|       #clock-cells = <1>; | ||||
|       #reset-cells = <1>; | ||||
|       #power-domain-cells = <1>; | ||||
|     }; | ||||
| ... | ||||
|  | ||||
| @ -17,6 +17,7 @@ description: | | ||||
|     dt-bindings/clock/qcom,gpucc-sdm845.h | ||||
|     dt-bindings/clock/qcom,gpucc-sc7180.h | ||||
|     dt-bindings/clock/qcom,gpucc-sc7280.h | ||||
|     dt-bindings/clock/qcom,gpucc-sm6350.h | ||||
|     dt-bindings/clock/qcom,gpucc-sm8150.h | ||||
|     dt-bindings/clock/qcom,gpucc-sm8250.h | ||||
| 
 | ||||
| @ -27,6 +28,7 @@ properties: | ||||
|       - qcom,sc7180-gpucc | ||||
|       - qcom,sc7280-gpucc | ||||
|       - qcom,sc8180x-gpucc | ||||
|       - qcom,sm6350-gpucc | ||||
|       - qcom,sm8150-gpucc | ||||
|       - qcom,sm8250-gpucc | ||||
| 
 | ||||
|  | ||||
| @ -19,6 +19,7 @@ properties: | ||||
|     enum: | ||||
|       - qcom,mmcc-apq8064 | ||||
|       - qcom,mmcc-apq8084 | ||||
|       - qcom,mmcc-msm8226 | ||||
|       - qcom,mmcc-msm8660 | ||||
|       - qcom,mmcc-msm8960 | ||||
|       - qcom,mmcc-msm8974 | ||||
|  | ||||
| @ -0,0 +1,87 @@ | ||||
| # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) | ||||
| %YAML 1.2 | ||||
| --- | ||||
| $id: http://devicetree.org/schemas/clock/qcom,qcm2290-dispcc.yaml# | ||||
| $schema: http://devicetree.org/meta-schemas/core.yaml# | ||||
| 
 | ||||
| title: Qualcomm Display Clock & Reset Controller Binding for qcm2290 | ||||
| 
 | ||||
| maintainers: | ||||
|   - Loic Poulain <loic.poulain@linaro.org> | ||||
| 
 | ||||
| description: | | ||||
|   Qualcomm display clock control module which supports the clocks, resets and | ||||
|   power domains on qcm2290. | ||||
| 
 | ||||
|   See also dt-bindings/clock/qcom,dispcc-qcm2290.h. | ||||
| 
 | ||||
| properties: | ||||
|   compatible: | ||||
|     const: qcom,qcm2290-dispcc | ||||
| 
 | ||||
|   clocks: | ||||
|     items: | ||||
|       - description: Board XO source | ||||
|       - description: Board active-only XO source | ||||
|       - description: GPLL0 source from GCC | ||||
|       - description: GPLL0 div source from GCC | ||||
|       - description: Byte clock from DSI PHY | ||||
|       - description: Pixel clock from DSI PHY | ||||
| 
 | ||||
|   clock-names: | ||||
|     items: | ||||
|       - const: bi_tcxo | ||||
|       - const: bi_tcxo_ao | ||||
|       - const: gcc_disp_gpll0_clk_src | ||||
|       - const: gcc_disp_gpll0_div_clk_src | ||||
|       - const: dsi0_phy_pll_out_byteclk | ||||
|       - const: dsi0_phy_pll_out_dsiclk | ||||
| 
 | ||||
|   '#clock-cells': | ||||
|     const: 1 | ||||
| 
 | ||||
|   '#reset-cells': | ||||
|     const: 1 | ||||
| 
 | ||||
|   '#power-domain-cells': | ||||
|     const: 1 | ||||
| 
 | ||||
|   reg: | ||||
|     maxItems: 1 | ||||
| 
 | ||||
| required: | ||||
|   - compatible | ||||
|   - reg | ||||
|   - clocks | ||||
|   - clock-names | ||||
|   - '#clock-cells' | ||||
|   - '#reset-cells' | ||||
|   - '#power-domain-cells' | ||||
| 
 | ||||
| additionalProperties: false | ||||
| 
 | ||||
| examples: | ||||
|   - | | ||||
|     #include <dt-bindings/clock/qcom,dispcc-qcm2290.h> | ||||
|     #include <dt-bindings/clock/qcom,gcc-qcm2290.h> | ||||
|     #include <dt-bindings/clock/qcom,rpmcc.h> | ||||
|     clock-controller@5f00000 { | ||||
|             compatible = "qcom,qcm2290-dispcc"; | ||||
|             reg = <0x5f00000 0x20000>; | ||||
|             clocks = <&rpmcc RPM_SMD_XO_CLK_SRC>, | ||||
|                      <&rpmcc RPM_SMD_XO_A_CLK_SRC>, | ||||
|                      <&gcc GCC_DISP_GPLL0_CLK_SRC>, | ||||
|                      <&gcc GCC_DISP_GPLL0_DIV_CLK_SRC>, | ||||
|                      <&dsi0_phy 0>, | ||||
|                      <&dsi0_phy 1>; | ||||
|             clock-names = "bi_tcxo", | ||||
|                           "bi_tcxo_ao", | ||||
|                           "gcc_disp_gpll0_clk_src", | ||||
|                           "gcc_disp_gpll0_div_clk_src", | ||||
|                           "dsi0_phy_pll_out_byteclk", | ||||
|                           "dsi0_phy_pll_out_dsiclk"; | ||||
|             #clock-cells = <1>; | ||||
|             #reset-cells = <1>; | ||||
|             #power-domain-cells = <1>; | ||||
|     }; | ||||
| ... | ||||
| @ -20,6 +20,7 @@ properties: | ||||
|       - qcom,sc7180-rpmh-clk | ||||
|       - qcom,sc7280-rpmh-clk | ||||
|       - qcom,sc8180x-rpmh-clk | ||||
|       - qcom,sc8280xp-rpmh-clk | ||||
|       - qcom,sdm845-rpmh-clk | ||||
|       - qcom,sdx55-rpmh-clk | ||||
|       - qcom,sdx65-rpmh-clk | ||||
|  | ||||
| @ -0,0 +1,65 @@ | ||||
| # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) | ||||
| %YAML 1.2 | ||||
| --- | ||||
| $id: http://devicetree.org/schemas/clock/qcom,sdm845-camcc.yaml# | ||||
| $schema: http://devicetree.org/meta-schemas/core.yaml# | ||||
| 
 | ||||
| title: Qualcomm Camera Clock & Reset Controller Binding for SDM845 | ||||
| 
 | ||||
| maintainers: | ||||
|   - Bjorn Andersson <bjorn.andersson@linaro.org> | ||||
| 
 | ||||
| description: | | ||||
|   Qualcomm camera clock control module which supports the clocks, resets and | ||||
|   power domains on SDM845. | ||||
| 
 | ||||
|   See also dt-bindings/clock/qcom,camcc-sm845.h | ||||
| 
 | ||||
| properties: | ||||
|   compatible: | ||||
|     const: qcom,sdm845-camcc | ||||
| 
 | ||||
|   clocks: | ||||
|     items: | ||||
|       - description: Board XO source | ||||
| 
 | ||||
|   clock-names: | ||||
|     items: | ||||
|       - const: bi_tcxo | ||||
| 
 | ||||
|   '#clock-cells': | ||||
|     const: 1 | ||||
| 
 | ||||
|   '#reset-cells': | ||||
|     const: 1 | ||||
| 
 | ||||
|   '#power-domain-cells': | ||||
|     const: 1 | ||||
| 
 | ||||
|   reg: | ||||
|     maxItems: 1 | ||||
| 
 | ||||
| required: | ||||
|   - compatible | ||||
|   - reg | ||||
|   - clocks | ||||
|   - clock-names | ||||
|   - '#clock-cells' | ||||
|   - '#reset-cells' | ||||
|   - '#power-domain-cells' | ||||
| 
 | ||||
| additionalProperties: false | ||||
| 
 | ||||
| examples: | ||||
|   - | | ||||
|     #include <dt-bindings/clock/qcom,rpmh.h> | ||||
|     clock-controller@ad00000 { | ||||
|       compatible = "qcom,sdm845-camcc"; | ||||
|       reg = <0x0ad00000 0x10000>; | ||||
|       clocks = <&rpmhcc RPMH_CXO_CLK>; | ||||
|       clock-names = "bi_tcxo"; | ||||
|       #clock-cells = <1>; | ||||
|       #reset-cells = <1>; | ||||
|       #power-domain-cells = <1>; | ||||
|     }; | ||||
| ... | ||||
| @ -1768,6 +1768,7 @@ C:	irc://irc.oftc.net/asahi-dev | ||||
| T:	git https://github.com/AsahiLinux/linux.git | ||||
| F:	Documentation/devicetree/bindings/arm/apple.yaml | ||||
| F:	Documentation/devicetree/bindings/arm/apple/* | ||||
| F:	Documentation/devicetree/bindings/clock/apple,nco.yaml | ||||
| F:	Documentation/devicetree/bindings/i2c/apple,i2c.yaml | ||||
| F:	Documentation/devicetree/bindings/interrupt-controller/apple,aic.yaml | ||||
| F:	Documentation/devicetree/bindings/mailbox/apple,mailbox.yaml | ||||
| @ -1776,6 +1777,7 @@ F:	Documentation/devicetree/bindings/pinctrl/apple,pinctrl.yaml | ||||
| F:	Documentation/devicetree/bindings/power/apple* | ||||
| F:	Documentation/devicetree/bindings/watchdog/apple,wdt.yaml | ||||
| F:	arch/arm64/boot/dts/apple/ | ||||
| F:	drivers/clk/clk-apple-nco.c | ||||
| F:	drivers/i2c/busses/i2c-pasemi-core.c | ||||
| F:	drivers/i2c/busses/i2c-pasemi-platform.c | ||||
| F:	drivers/irqchip/irq-apple-aic.c | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| CONFIG_KUNIT=y | ||||
| CONFIG_COMMON_CLK=y | ||||
| CONFIG_CLK_KUNIT_TEST=y | ||||
| CONFIG_CLK_GATE_KUNIT_TEST=y | ||||
|  | ||||
| @ -59,6 +59,15 @@ config LMK04832 | ||||
| 	  Say yes here to build support for Texas Instruments' LMK04832 Ultra | ||||
| 	  Low-Noise JESD204B Compliant Clock Jitter Cleaner With Dual Loop PLLs | ||||
| 
 | ||||
| config COMMON_CLK_APPLE_NCO | ||||
| 	tristate "Clock driver for Apple SoC NCOs" | ||||
| 	depends on ARCH_APPLE || COMPILE_TEST | ||||
| 	default ARCH_APPLE | ||||
| 	help | ||||
| 	  This driver supports NCO (Numerically Controlled Oscillator) blocks | ||||
| 	  found on Apple SoCs such as t8103 (M1). The blocks are typically | ||||
| 	  generators of audio clocks. | ||||
| 
 | ||||
| config COMMON_CLK_MAX77686 | ||||
| 	tristate "Clock driver for Maxim 77620/77686/77802 MFD" | ||||
| 	depends on MFD_MAX77686 || MFD_MAX77620 || COMPILE_TEST | ||||
| @ -438,6 +447,13 @@ source "drivers/clk/xilinx/Kconfig" | ||||
| source "drivers/clk/zynqmp/Kconfig" | ||||
| 
 | ||||
| # Kunit test cases | ||||
| config CLK_KUNIT_TEST | ||||
| 	tristate "Basic Clock Framework Kunit Tests" if !KUNIT_ALL_TESTS | ||||
| 	depends on KUNIT | ||||
| 	default KUNIT_ALL_TESTS | ||||
| 	help | ||||
| 	  Kunit tests for the common clock framework. | ||||
| 
 | ||||
| config CLK_GATE_KUNIT_TEST | ||||
| 	tristate "Basic gate type Kunit test" if !KUNIT_ALL_TESTS | ||||
| 	depends on KUNIT | ||||
|  | ||||
| @ -2,6 +2,7 @@ | ||||
| # common clock types
 | ||||
| obj-$(CONFIG_HAVE_CLK)		+= clk-devres.o clk-bulk.o clkdev.o | ||||
| obj-$(CONFIG_COMMON_CLK)	+= clk.o | ||||
| obj-$(CONFIG_CLK_KUNIT_TEST)	+= clk_test.o | ||||
| obj-$(CONFIG_COMMON_CLK)	+= clk-divider.o | ||||
| obj-$(CONFIG_COMMON_CLK)	+= clk-fixed-factor.o | ||||
| obj-$(CONFIG_COMMON_CLK)	+= clk-fixed-rate.o | ||||
| @ -18,6 +19,7 @@ endif | ||||
| 
 | ||||
| # hardware specific clock types
 | ||||
| # please keep this section sorted lexicographically by file path name
 | ||||
| obj-$(CONFIG_COMMON_CLK_APPLE_NCO)  	+= clk-apple-nco.o | ||||
| obj-$(CONFIG_MACH_ASM9260)		+= clk-asm9260.o | ||||
| obj-$(CONFIG_COMMON_CLK_AXI_CLKGEN)	+= clk-axi-clkgen.o | ||||
| obj-$(CONFIG_ARCH_AXXIA)		+= clk-axm5516.o | ||||
|  | ||||
| @ -56,6 +56,8 @@ static char *rpi_firmware_clk_names[] = { | ||||
| #define RPI_FIRMWARE_STATE_ENABLE_BIT	BIT(0) | ||||
| #define RPI_FIRMWARE_STATE_WAIT_BIT	BIT(1) | ||||
| 
 | ||||
| struct raspberrypi_clk_variant; | ||||
| 
 | ||||
| struct raspberrypi_clk { | ||||
| 	struct device *dev; | ||||
| 	struct rpi_firmware *firmware; | ||||
| @ -66,10 +68,72 @@ struct raspberrypi_clk_data { | ||||
| 	struct clk_hw hw; | ||||
| 
 | ||||
| 	unsigned int id; | ||||
| 	struct raspberrypi_clk_variant *variant; | ||||
| 
 | ||||
| 	struct raspberrypi_clk *rpi; | ||||
| }; | ||||
| 
 | ||||
| struct raspberrypi_clk_variant { | ||||
| 	bool		export; | ||||
| 	char		*clkdev; | ||||
| 	unsigned long	min_rate; | ||||
| 	bool		minimize; | ||||
| }; | ||||
| 
 | ||||
| static struct raspberrypi_clk_variant | ||||
| raspberrypi_clk_variants[RPI_FIRMWARE_NUM_CLK_ID] = { | ||||
| 	[RPI_FIRMWARE_ARM_CLK_ID] = { | ||||
| 		.export = true, | ||||
| 		.clkdev = "cpu0", | ||||
| 	}, | ||||
| 	[RPI_FIRMWARE_CORE_CLK_ID] = { | ||||
| 		.export = true, | ||||
| 
 | ||||
| 		/*
 | ||||
| 		 * The clock is shared between the HVS and the CSI | ||||
| 		 * controllers, on the BCM2711 and will change depending | ||||
| 		 * on the pixels composited on the HVS and the capture | ||||
| 		 * resolution on Unicam. | ||||
| 		 * | ||||
| 		 * Since the rate can get quite large, and we need to | ||||
| 		 * coordinate between both driver instances, let's | ||||
| 		 * always use the minimum the drivers will let us. | ||||
| 		 */ | ||||
| 		.minimize = true, | ||||
| 	}, | ||||
| 	[RPI_FIRMWARE_M2MC_CLK_ID] = { | ||||
| 		.export = true, | ||||
| 
 | ||||
| 		/*
 | ||||
| 		 * If we boot without any cable connected to any of the | ||||
| 		 * HDMI connector, the firmware will skip the HSM | ||||
| 		 * initialization and leave it with a rate of 0, | ||||
| 		 * resulting in a bus lockup when we're accessing the | ||||
| 		 * registers even if it's enabled. | ||||
| 		 * | ||||
| 		 * Let's put a sensible default so that we don't end up | ||||
| 		 * in this situation. | ||||
| 		 */ | ||||
| 		.min_rate = 120000000, | ||||
| 
 | ||||
| 		/*
 | ||||
| 		 * The clock is shared between the two HDMI controllers | ||||
| 		 * on the BCM2711 and will change depending on the | ||||
| 		 * resolution output on each. Since the rate can get | ||||
| 		 * quite large, and we need to coordinate between both | ||||
| 		 * driver instances, let's always use the minimum the | ||||
| 		 * drivers will let us. | ||||
| 		 */ | ||||
| 		.minimize = true, | ||||
| 	}, | ||||
| 	[RPI_FIRMWARE_V3D_CLK_ID] = { | ||||
| 		.export = true, | ||||
| 	}, | ||||
| 	[RPI_FIRMWARE_PIXEL_BVB_CLK_ID] = { | ||||
| 		.export = true, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  * Structure of the message passed to Raspberry Pi's firmware in order to | ||||
|  * change clock rates. The 'disable_turbo' option is only available to the ARM | ||||
| @ -165,12 +229,26 @@ static int raspberrypi_fw_set_rate(struct clk_hw *hw, unsigned long rate, | ||||
| static int raspberrypi_fw_dumb_determine_rate(struct clk_hw *hw, | ||||
| 					      struct clk_rate_request *req) | ||||
| { | ||||
| 	struct raspberrypi_clk_data *data = | ||||
| 		container_of(hw, struct raspberrypi_clk_data, hw); | ||||
| 	struct raspberrypi_clk_variant *variant = data->variant; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * The firmware will do the rounding but that isn't part of | ||||
| 	 * the interface with the firmware, so we just do our best | ||||
| 	 * here. | ||||
| 	 */ | ||||
| 
 | ||||
| 	req->rate = clamp(req->rate, req->min_rate, req->max_rate); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * We want to aggressively reduce the clock rate here, so let's | ||||
| 	 * just ignore the requested rate and return the bare minimum | ||||
| 	 * rate we can get away with. | ||||
| 	 */ | ||||
| 	if (variant->minimize && req->min_rate > 0) | ||||
| 		req->rate = req->min_rate; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| @ -183,7 +261,8 @@ static const struct clk_ops raspberrypi_firmware_clk_ops = { | ||||
| 
 | ||||
| static struct clk_hw *raspberrypi_clk_register(struct raspberrypi_clk *rpi, | ||||
| 					       unsigned int parent, | ||||
| 					       unsigned int id) | ||||
| 					       unsigned int id, | ||||
| 					       struct raspberrypi_clk_variant *variant) | ||||
| { | ||||
| 	struct raspberrypi_clk_data *data; | ||||
| 	struct clk_init_data init = {}; | ||||
| @ -195,6 +274,7 @@ static struct clk_hw *raspberrypi_clk_register(struct raspberrypi_clk *rpi, | ||||
| 		return ERR_PTR(-ENOMEM); | ||||
| 	data->rpi = rpi; | ||||
| 	data->id = id; | ||||
| 	data->variant = variant; | ||||
| 
 | ||||
| 	init.name = devm_kasprintf(rpi->dev, GFP_KERNEL, | ||||
| 				   "fw-clk-%s", | ||||
| @ -228,15 +308,28 @@ static struct clk_hw *raspberrypi_clk_register(struct raspberrypi_clk *rpi, | ||||
| 
 | ||||
| 	clk_hw_set_rate_range(&data->hw, min_rate, max_rate); | ||||
| 
 | ||||
| 	if (id == RPI_FIRMWARE_ARM_CLK_ID) { | ||||
| 	if (variant->clkdev) { | ||||
| 		ret = devm_clk_hw_register_clkdev(rpi->dev, &data->hw, | ||||
| 						  NULL, "cpu0"); | ||||
| 						  NULL, variant->clkdev); | ||||
| 		if (ret) { | ||||
| 			dev_err(rpi->dev, "Failed to initialize clkdev\n"); | ||||
| 			return ERR_PTR(ret); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (variant->min_rate) { | ||||
| 		unsigned long rate; | ||||
| 
 | ||||
| 		clk_hw_set_rate_range(&data->hw, variant->min_rate, max_rate); | ||||
| 
 | ||||
| 		rate = raspberrypi_fw_get_rate(&data->hw, 0); | ||||
| 		if (rate < variant->min_rate) { | ||||
| 			ret = raspberrypi_fw_set_rate(&data->hw, variant->min_rate, 0); | ||||
| 			if (ret) | ||||
| 				return ERR_PTR(ret); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return &data->hw; | ||||
| } | ||||
| 
 | ||||
| @ -264,27 +357,27 @@ static int raspberrypi_discover_clocks(struct raspberrypi_clk *rpi, | ||||
| 		return ret; | ||||
| 
 | ||||
| 	while (clks->id) { | ||||
| 		struct clk_hw *hw; | ||||
| 		struct raspberrypi_clk_variant *variant; | ||||
| 
 | ||||
| 		if (clks->id > RPI_FIRMWARE_NUM_CLK_ID) { | ||||
| 			dev_err(rpi->dev, "Unknown clock id: %u", clks->id); | ||||
| 			return -EINVAL; | ||||
| 		} | ||||
| 
 | ||||
| 		variant = &raspberrypi_clk_variants[clks->id]; | ||||
| 		if (variant->export) { | ||||
| 			struct clk_hw *hw; | ||||
| 
 | ||||
| 		switch (clks->id) { | ||||
| 		case RPI_FIRMWARE_ARM_CLK_ID: | ||||
| 		case RPI_FIRMWARE_CORE_CLK_ID: | ||||
| 		case RPI_FIRMWARE_M2MC_CLK_ID: | ||||
| 		case RPI_FIRMWARE_V3D_CLK_ID: | ||||
| 		case RPI_FIRMWARE_PIXEL_BVB_CLK_ID: | ||||
| 			hw = raspberrypi_clk_register(rpi, clks->parent, | ||||
| 						      clks->id); | ||||
| 						      clks->id, variant); | ||||
| 			if (IS_ERR(hw)) | ||||
| 				return PTR_ERR(hw); | ||||
| 
 | ||||
| 			data->hws[clks->id] = hw; | ||||
| 			data->num = clks->id + 1; | ||||
| 			fallthrough; | ||||
| 
 | ||||
| 		default: | ||||
| 			clks++; | ||||
| 			break; | ||||
| 		} | ||||
| 
 | ||||
| 		clks++; | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
|  | ||||
							
								
								
									
										334
									
								
								drivers/clk/clk-apple-nco.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										334
									
								
								drivers/clk/clk-apple-nco.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,334 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0-only OR MIT
 | ||||
| /*
 | ||||
|  * Driver for an SoC block (Numerically Controlled Oscillator) | ||||
|  * found on t8103 (M1) and other Apple chips | ||||
|  * | ||||
|  * Copyright (C) The Asahi Linux Contributors | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/bits.h> | ||||
| #include <linux/bitfield.h> | ||||
| #include <linux/clk-provider.h> | ||||
| #include <linux/io.h> | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/math64.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/of.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/spinlock.h> | ||||
| 
 | ||||
| #define NCO_CHANNEL_STRIDE	0x4000 | ||||
| #define NCO_CHANNEL_REGSIZE	20 | ||||
| 
 | ||||
| #define REG_CTRL	0 | ||||
| #define CTRL_ENABLE	BIT(31) | ||||
| #define REG_DIV		4 | ||||
| #define DIV_FINE	GENMASK(1, 0) | ||||
| #define DIV_COARSE	GENMASK(12, 2) | ||||
| #define REG_INC1	8 | ||||
| #define REG_INC2	12 | ||||
| #define REG_ACCINIT	16 | ||||
| 
 | ||||
| /*
 | ||||
|  * Theory of operation (postulated) | ||||
|  * | ||||
|  * The REG_DIV register indirectly expresses a base integer divisor, roughly | ||||
|  * corresponding to twice the desired ratio of input to output clock. This | ||||
|  * base divisor is adjusted on a cycle-by-cycle basis based on the state of a | ||||
|  * 32-bit phase accumulator to achieve a desired precise clock ratio over the | ||||
|  * long term. | ||||
|  * | ||||
|  * Specifically an output clock cycle is produced after (REG_DIV divisor)/2 | ||||
|  * or (REG_DIV divisor + 1)/2 input cycles, the latter taking effect when top | ||||
|  * bit of the 32-bit accumulator is set. The accumulator is incremented each | ||||
|  * produced output cycle, by the value from either REG_INC1 or REG_INC2, which | ||||
|  * of the two is selected depending again on the accumulator's current top bit. | ||||
|  * | ||||
|  * Because the NCO hardware implements counting of input clock cycles in part | ||||
|  * in a Galois linear-feedback shift register, the higher bits of divisor | ||||
|  * are programmed into REG_DIV by picking an appropriate LFSR state. See | ||||
|  * applnco_compute_tables/applnco_div_translate for details on this. | ||||
|  */ | ||||
| 
 | ||||
| #define LFSR_POLY	0xa01 | ||||
| #define LFSR_INIT	0x7ff | ||||
| #define LFSR_LEN	11 | ||||
| #define LFSR_PERIOD	((1 << LFSR_LEN) - 1) | ||||
| #define LFSR_TBLSIZE	(1 << LFSR_LEN) | ||||
| 
 | ||||
| /* The minimal attainable coarse divisor (first value in table) */ | ||||
| #define COARSE_DIV_OFFSET 2 | ||||
| 
 | ||||
| struct applnco_tables { | ||||
| 	u16 fwd[LFSR_TBLSIZE]; | ||||
| 	u16 inv[LFSR_TBLSIZE]; | ||||
| }; | ||||
| 
 | ||||
| struct applnco_channel { | ||||
| 	void __iomem *base; | ||||
| 	struct applnco_tables *tbl; | ||||
| 	struct clk_hw hw; | ||||
| 
 | ||||
| 	spinlock_t lock; | ||||
| }; | ||||
| 
 | ||||
| #define to_applnco_channel(_hw) container_of(_hw, struct applnco_channel, hw) | ||||
| 
 | ||||
| static void applnco_enable_nolock(struct clk_hw *hw) | ||||
| { | ||||
| 	struct applnco_channel *chan = to_applnco_channel(hw); | ||||
| 	u32 val; | ||||
| 
 | ||||
| 	val = readl_relaxed(chan->base + REG_CTRL); | ||||
| 	writel_relaxed(val | CTRL_ENABLE, chan->base + REG_CTRL); | ||||
| } | ||||
| 
 | ||||
| static void applnco_disable_nolock(struct clk_hw *hw) | ||||
| { | ||||
| 	struct applnco_channel *chan = to_applnco_channel(hw); | ||||
| 	u32 val; | ||||
| 
 | ||||
| 	val = readl_relaxed(chan->base + REG_CTRL); | ||||
| 	writel_relaxed(val & ~CTRL_ENABLE, chan->base + REG_CTRL); | ||||
| } | ||||
| 
 | ||||
| static int applnco_is_enabled(struct clk_hw *hw) | ||||
| { | ||||
| 	struct applnco_channel *chan = to_applnco_channel(hw); | ||||
| 
 | ||||
| 	return (readl_relaxed(chan->base + REG_CTRL) & CTRL_ENABLE) != 0; | ||||
| } | ||||
| 
 | ||||
| static void applnco_compute_tables(struct applnco_tables *tbl) | ||||
| { | ||||
| 	int i; | ||||
| 	u32 state = LFSR_INIT; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Go through the states of a Galois LFSR and build | ||||
| 	 * a coarse divisor translation table. | ||||
| 	 */ | ||||
| 	for (i = LFSR_PERIOD; i > 0; i--) { | ||||
| 		if (state & 1) | ||||
| 			state = (state >> 1) ^ (LFSR_POLY >> 1); | ||||
| 		else | ||||
| 			state = (state >> 1); | ||||
| 		tbl->fwd[i] = state; | ||||
| 		tbl->inv[state] = i; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Zero value is special-cased */ | ||||
| 	tbl->fwd[0] = 0; | ||||
| 	tbl->inv[0] = 0; | ||||
| } | ||||
| 
 | ||||
| static bool applnco_div_out_of_range(unsigned int div) | ||||
| { | ||||
| 	unsigned int coarse = div / 4; | ||||
| 
 | ||||
| 	return coarse < COARSE_DIV_OFFSET || | ||||
| 		coarse >= COARSE_DIV_OFFSET + LFSR_TBLSIZE; | ||||
| } | ||||
| 
 | ||||
| static u32 applnco_div_translate(struct applnco_tables *tbl, unsigned int div) | ||||
| { | ||||
| 	unsigned int coarse = div / 4; | ||||
| 
 | ||||
| 	if (WARN_ON(applnco_div_out_of_range(div))) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	return FIELD_PREP(DIV_COARSE, tbl->fwd[coarse - COARSE_DIV_OFFSET]) | | ||||
| 			FIELD_PREP(DIV_FINE, div % 4); | ||||
| } | ||||
| 
 | ||||
| static unsigned int applnco_div_translate_inv(struct applnco_tables *tbl, u32 regval) | ||||
| { | ||||
| 	unsigned int coarse, fine; | ||||
| 
 | ||||
| 	coarse = tbl->inv[FIELD_GET(DIV_COARSE, regval)] + COARSE_DIV_OFFSET; | ||||
| 	fine = FIELD_GET(DIV_FINE, regval); | ||||
| 
 | ||||
| 	return coarse * 4 + fine; | ||||
| } | ||||
| 
 | ||||
| static int applnco_set_rate(struct clk_hw *hw, unsigned long rate, | ||||
| 				unsigned long parent_rate) | ||||
| { | ||||
| 	struct applnco_channel *chan = to_applnco_channel(hw); | ||||
| 	unsigned long flags; | ||||
| 	u32 div, inc1, inc2; | ||||
| 	bool was_enabled; | ||||
| 
 | ||||
| 	div = 2 * parent_rate / rate; | ||||
| 	inc1 = 2 * parent_rate - div * rate; | ||||
| 	inc2 = inc1 - rate; | ||||
| 
 | ||||
| 	if (applnco_div_out_of_range(div)) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	div = applnco_div_translate(chan->tbl, div); | ||||
| 
 | ||||
| 	spin_lock_irqsave(&chan->lock, flags); | ||||
| 	was_enabled = applnco_is_enabled(hw); | ||||
| 	applnco_disable_nolock(hw); | ||||
| 
 | ||||
| 	writel_relaxed(div,  chan->base + REG_DIV); | ||||
| 	writel_relaxed(inc1, chan->base + REG_INC1); | ||||
| 	writel_relaxed(inc2, chan->base + REG_INC2); | ||||
| 
 | ||||
| 	/* Presumably a neutral initial value for accumulator */ | ||||
| 	writel_relaxed(1 << 31, chan->base + REG_ACCINIT); | ||||
| 
 | ||||
| 	if (was_enabled) | ||||
| 		applnco_enable_nolock(hw); | ||||
| 	spin_unlock_irqrestore(&chan->lock, flags); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static unsigned long applnco_recalc_rate(struct clk_hw *hw, | ||||
| 				unsigned long parent_rate) | ||||
| { | ||||
| 	struct applnco_channel *chan = to_applnco_channel(hw); | ||||
| 	u32 div, inc1, inc2, incbase; | ||||
| 
 | ||||
| 	div = applnco_div_translate_inv(chan->tbl, | ||||
| 			readl_relaxed(chan->base + REG_DIV)); | ||||
| 
 | ||||
| 	inc1 = readl_relaxed(chan->base + REG_INC1); | ||||
| 	inc2 = readl_relaxed(chan->base + REG_INC2); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * We don't support wraparound of accumulator | ||||
| 	 * nor the edge case of both increments being zero | ||||
| 	 */ | ||||
| 	if (inc1 >= (1 << 31) || inc2 < (1 << 31) || (inc1 == 0 && inc2 == 0)) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	/* Scale both sides of division by incbase to maintain precision */ | ||||
| 	incbase = inc1 - inc2; | ||||
| 
 | ||||
| 	return div64_u64(((u64) parent_rate) * 2 * incbase, | ||||
| 			((u64) div) * incbase + inc1); | ||||
| } | ||||
| 
 | ||||
| static long applnco_round_rate(struct clk_hw *hw, unsigned long rate, | ||||
| 				unsigned long *parent_rate) | ||||
| { | ||||
| 	unsigned long lo = *parent_rate / (COARSE_DIV_OFFSET + LFSR_TBLSIZE) + 1; | ||||
| 	unsigned long hi = *parent_rate / COARSE_DIV_OFFSET; | ||||
| 
 | ||||
| 	return clamp(rate, lo, hi); | ||||
| } | ||||
| 
 | ||||
| static int applnco_enable(struct clk_hw *hw) | ||||
| { | ||||
| 	struct applnco_channel *chan = to_applnco_channel(hw); | ||||
| 	unsigned long flags; | ||||
| 
 | ||||
| 	spin_lock_irqsave(&chan->lock, flags); | ||||
| 	applnco_enable_nolock(hw); | ||||
| 	spin_unlock_irqrestore(&chan->lock, flags); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void applnco_disable(struct clk_hw *hw) | ||||
| { | ||||
| 	struct applnco_channel *chan = to_applnco_channel(hw); | ||||
| 	unsigned long flags; | ||||
| 
 | ||||
| 	spin_lock_irqsave(&chan->lock, flags); | ||||
| 	applnco_disable_nolock(hw); | ||||
| 	spin_unlock_irqrestore(&chan->lock, flags); | ||||
| } | ||||
| 
 | ||||
| static const struct clk_ops applnco_ops = { | ||||
| 	.set_rate = applnco_set_rate, | ||||
| 	.recalc_rate = applnco_recalc_rate, | ||||
| 	.round_rate = applnco_round_rate, | ||||
| 	.enable = applnco_enable, | ||||
| 	.disable = applnco_disable, | ||||
| 	.is_enabled = applnco_is_enabled, | ||||
| }; | ||||
| 
 | ||||
| static int applnco_probe(struct platform_device *pdev) | ||||
| { | ||||
| 	struct device_node *np = pdev->dev.of_node; | ||||
| 	struct clk_parent_data pdata = { .index = 0 }; | ||||
| 	struct clk_init_data init; | ||||
| 	struct clk_hw_onecell_data *onecell_data; | ||||
| 	void __iomem *base; | ||||
| 	struct resource *res; | ||||
| 	struct applnco_tables *tbl; | ||||
| 	unsigned int nchannels; | ||||
| 	int ret, i; | ||||
| 
 | ||||
| 	base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); | ||||
| 	if (IS_ERR(base)) | ||||
| 		return PTR_ERR(base); | ||||
| 
 | ||||
| 	if (resource_size(res) < NCO_CHANNEL_REGSIZE) | ||||
| 		return -EINVAL; | ||||
| 	nchannels = (resource_size(res) - NCO_CHANNEL_REGSIZE) | ||||
| 			/ NCO_CHANNEL_STRIDE + 1; | ||||
| 
 | ||||
| 	onecell_data = devm_kzalloc(&pdev->dev, struct_size(onecell_data, hws, | ||||
| 							nchannels), GFP_KERNEL); | ||||
| 	if (!onecell_data) | ||||
| 		return -ENOMEM; | ||||
| 	onecell_data->num = nchannels; | ||||
| 
 | ||||
| 	tbl = devm_kzalloc(&pdev->dev, sizeof(*tbl), GFP_KERNEL); | ||||
| 	if (!tbl) | ||||
| 		return -ENOMEM; | ||||
| 	applnco_compute_tables(tbl); | ||||
| 
 | ||||
| 	for (i = 0; i < nchannels; i++) { | ||||
| 		struct applnco_channel *chan; | ||||
| 
 | ||||
| 		chan = devm_kzalloc(&pdev->dev, sizeof(*chan), GFP_KERNEL); | ||||
| 		if (!chan) | ||||
| 			return -ENOMEM; | ||||
| 		chan->base = base + NCO_CHANNEL_STRIDE * i; | ||||
| 		chan->tbl = tbl; | ||||
| 		spin_lock_init(&chan->lock); | ||||
| 
 | ||||
| 		memset(&init, 0, sizeof(init)); | ||||
| 		init.name = devm_kasprintf(&pdev->dev, GFP_KERNEL, | ||||
| 						"%s-%d", np->name, i); | ||||
| 		init.ops = &applnco_ops; | ||||
| 		init.parent_data = &pdata; | ||||
| 		init.num_parents = 1; | ||||
| 		init.flags = 0; | ||||
| 
 | ||||
| 		chan->hw.init = &init; | ||||
| 		ret = devm_clk_hw_register(&pdev->dev, &chan->hw); | ||||
| 		if (ret) | ||||
| 			return ret; | ||||
| 
 | ||||
| 		onecell_data->hws[i] = &chan->hw; | ||||
| 	} | ||||
| 
 | ||||
| 	return devm_of_clk_add_hw_provider(&pdev->dev, of_clk_hw_onecell_get, | ||||
| 							onecell_data); | ||||
| } | ||||
| 
 | ||||
| static const struct of_device_id applnco_ids[] = { | ||||
| 	{ .compatible = "apple,nco" }, | ||||
| 	{ } | ||||
| }; | ||||
| MODULE_DEVICE_TABLE(of, applnco_ids); | ||||
| 
 | ||||
| static struct platform_driver applnco_driver = { | ||||
| 	.driver = { | ||||
| 		.name = "apple-nco", | ||||
| 		.of_match_table = applnco_ids, | ||||
| 	}, | ||||
| 	.probe = applnco_probe, | ||||
| }; | ||||
| module_platform_driver(applnco_driver); | ||||
| 
 | ||||
| MODULE_AUTHOR("Martin Povišer <povik+lin@cutebit.org>"); | ||||
| MODULE_DESCRIPTION("Clock driver for NCO blocks on Apple SoCs"); | ||||
| MODULE_LICENSE("GPL"); | ||||
| @ -632,6 +632,24 @@ static void clk_core_get_boundaries(struct clk_core *core, | ||||
| 		*max_rate = min(*max_rate, clk_user->max_rate); | ||||
| } | ||||
| 
 | ||||
| static bool clk_core_check_boundaries(struct clk_core *core, | ||||
| 				      unsigned long min_rate, | ||||
| 				      unsigned long max_rate) | ||||
| { | ||||
| 	struct clk *user; | ||||
| 
 | ||||
| 	lockdep_assert_held(&prepare_lock); | ||||
| 
 | ||||
| 	if (min_rate > core->max_rate || max_rate < core->min_rate) | ||||
| 		return false; | ||||
| 
 | ||||
| 	hlist_for_each_entry(user, &core->clks, clks_node) | ||||
| 		if (min_rate > user->max_rate || max_rate < user->min_rate) | ||||
| 			return false; | ||||
| 
 | ||||
| 	return true; | ||||
| } | ||||
| 
 | ||||
| void clk_hw_set_rate_range(struct clk_hw *hw, unsigned long min_rate, | ||||
| 			   unsigned long max_rate) | ||||
| { | ||||
| @ -1330,6 +1348,8 @@ static int clk_core_determine_round_nolock(struct clk_core *core, | ||||
| 	if (!core) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	req->rate = clamp(req->rate, req->min_rate, req->max_rate); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * At this point, core protection will be disabled | ||||
| 	 * - if the provider is not protected at all | ||||
| @ -2312,19 +2332,15 @@ int clk_set_rate_exclusive(struct clk *clk, unsigned long rate) | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(clk_set_rate_exclusive); | ||||
| 
 | ||||
| /**
 | ||||
|  * clk_set_rate_range - set a rate range for a clock source | ||||
|  * @clk: clock source | ||||
|  * @min: desired minimum clock rate in Hz, inclusive | ||||
|  * @max: desired maximum clock rate in Hz, inclusive | ||||
|  * | ||||
|  * Returns success (0) or negative errno. | ||||
|  */ | ||||
| int clk_set_rate_range(struct clk *clk, unsigned long min, unsigned long max) | ||||
| static int clk_set_rate_range_nolock(struct clk *clk, | ||||
| 				     unsigned long min, | ||||
| 				     unsigned long max) | ||||
| { | ||||
| 	int ret = 0; | ||||
| 	unsigned long old_min, old_max, rate; | ||||
| 
 | ||||
| 	lockdep_assert_held(&prepare_lock); | ||||
| 
 | ||||
| 	if (!clk) | ||||
| 		return 0; | ||||
| 
 | ||||
| @ -2337,8 +2353,6 @@ int clk_set_rate_range(struct clk *clk, unsigned long min, unsigned long max) | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
| 	clk_prepare_lock(); | ||||
| 
 | ||||
| 	if (clk->exclusive_count) | ||||
| 		clk_core_rate_unprotect(clk->core); | ||||
| 
 | ||||
| @ -2348,37 +2362,62 @@ int clk_set_rate_range(struct clk *clk, unsigned long min, unsigned long max) | ||||
| 	clk->min_rate = min; | ||||
| 	clk->max_rate = max; | ||||
| 
 | ||||
| 	rate = clk_core_get_rate_nolock(clk->core); | ||||
| 	if (rate < min || rate > max) { | ||||
| 		/*
 | ||||
| 		 * FIXME: | ||||
| 		 * We are in bit of trouble here, current rate is outside the | ||||
| 		 * the requested range. We are going try to request appropriate | ||||
| 		 * range boundary but there is a catch. It may fail for the | ||||
| 		 * usual reason (clock broken, clock protected, etc) but also | ||||
| 		 * because: | ||||
| 		 * - round_rate() was not favorable and fell on the wrong | ||||
| 		 *   side of the boundary | ||||
| 		 * - the determine_rate() callback does not really check for | ||||
| 		 *   this corner case when determining the rate | ||||
| 		 */ | ||||
| 
 | ||||
| 		if (rate < min) | ||||
| 			rate = min; | ||||
| 		else | ||||
| 			rate = max; | ||||
| 
 | ||||
| 		ret = clk_core_set_rate_nolock(clk->core, rate); | ||||
| 		if (ret) { | ||||
| 			/* rollback the changes */ | ||||
| 			clk->min_rate = old_min; | ||||
| 			clk->max_rate = old_max; | ||||
| 		} | ||||
| 	if (!clk_core_check_boundaries(clk->core, min, max)) { | ||||
| 		ret = -EINVAL; | ||||
| 		goto out; | ||||
| 	} | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Since the boundaries have been changed, let's give the | ||||
| 	 * opportunity to the provider to adjust the clock rate based on | ||||
| 	 * the new boundaries. | ||||
| 	 * | ||||
| 	 * We also need to handle the case where the clock is currently | ||||
| 	 * outside of the boundaries. Clamping the last requested rate | ||||
| 	 * to the current minimum and maximum will also handle this. | ||||
| 	 * | ||||
| 	 * FIXME: | ||||
| 	 * There is a catch. It may fail for the usual reason (clock | ||||
| 	 * broken, clock protected, etc) but also because: | ||||
| 	 * - round_rate() was not favorable and fell on the wrong | ||||
| 	 *   side of the boundary | ||||
| 	 * - the determine_rate() callback does not really check for | ||||
| 	 *   this corner case when determining the rate | ||||
| 	 */ | ||||
| 	rate = clamp(clk->core->req_rate, min, max); | ||||
| 	ret = clk_core_set_rate_nolock(clk->core, rate); | ||||
| 	if (ret) { | ||||
| 		/* rollback the changes */ | ||||
| 		clk->min_rate = old_min; | ||||
| 		clk->max_rate = old_max; | ||||
| 	} | ||||
| 
 | ||||
| out: | ||||
| 	if (clk->exclusive_count) | ||||
| 		clk_core_rate_protect(clk->core); | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * clk_set_rate_range - set a rate range for a clock source | ||||
|  * @clk: clock source | ||||
|  * @min: desired minimum clock rate in Hz, inclusive | ||||
|  * @max: desired maximum clock rate in Hz, inclusive | ||||
|  * | ||||
|  * Return: 0 for success or negative errno on failure. | ||||
|  */ | ||||
| int clk_set_rate_range(struct clk *clk, unsigned long min, unsigned long max) | ||||
| { | ||||
| 	int ret; | ||||
| 
 | ||||
| 	if (!clk) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	clk_prepare_lock(); | ||||
| 
 | ||||
| 	ret = clk_set_rate_range_nolock(clk, min, max); | ||||
| 
 | ||||
| 	clk_prepare_unlock(); | ||||
| 
 | ||||
| 	return ret; | ||||
| @ -3456,6 +3495,19 @@ static void clk_core_reparent_orphans_nolock(void) | ||||
| 			__clk_set_parent_after(orphan, parent, NULL); | ||||
| 			__clk_recalc_accuracies(orphan); | ||||
| 			__clk_recalc_rates(orphan, 0); | ||||
| 
 | ||||
| 			/*
 | ||||
| 			 * __clk_init_parent() will set the initial req_rate to | ||||
| 			 * 0 if the clock doesn't have clk_ops::recalc_rate and | ||||
| 			 * is an orphan when it's registered. | ||||
| 			 * | ||||
| 			 * 'req_rate' is used by clk_set_rate_range() and | ||||
| 			 * clk_put() to trigger a clk_set_rate() call whenever | ||||
| 			 * the boundaries are modified. Let's make sure | ||||
| 			 * 'req_rate' is set to something non-zero so that | ||||
| 			 * clk_set_rate_range() doesn't drop the frequency. | ||||
| 			 */ | ||||
| 			orphan->req_rate = orphan->rate; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @ -3773,8 +3825,9 @@ struct clk *clk_hw_create_clk(struct device *dev, struct clk_hw *hw, | ||||
| struct clk *clk_hw_get_clk(struct clk_hw *hw, const char *con_id) | ||||
| { | ||||
| 	struct device *dev = hw->core->dev; | ||||
| 	const char *name = dev ? dev_name(dev) : NULL; | ||||
| 
 | ||||
| 	return clk_hw_create_clk(dev, hw, dev_name(dev), con_id); | ||||
| 	return clk_hw_create_clk(dev, hw, name, con_id); | ||||
| } | ||||
| EXPORT_SYMBOL(clk_hw_get_clk); | ||||
| 
 | ||||
| @ -4366,9 +4419,7 @@ void __clk_put(struct clk *clk) | ||||
| 	} | ||||
| 
 | ||||
| 	hlist_del(&clk->clks_node); | ||||
| 	if (clk->min_rate > clk->core->req_rate || | ||||
| 	    clk->max_rate < clk->core->req_rate) | ||||
| 		clk_core_set_rate_nolock(clk->core, clk->core->req_rate); | ||||
| 	clk_set_rate_range_nolock(clk, 0, ULONG_MAX); | ||||
| 
 | ||||
| 	owner = clk->core->owner; | ||||
| 	kref_put(&clk->core->ref, __clk_release); | ||||
|  | ||||
							
								
								
									
										1008
									
								
								drivers/clk/clk_test.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1008
									
								
								drivers/clk/clk_test.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -29,11 +29,11 @@ config QCOM_A53PLL | ||||
| 	  devices. | ||||
| 
 | ||||
| config QCOM_A7PLL | ||||
| 	tristate "SDX55 A7 PLL" | ||||
| 	tristate "A7 PLL driver for SDX55 and SDX65" | ||||
| 	help | ||||
| 	  Support for the A7 PLL on SDX55 devices. It provides the CPU with | ||||
| 	  Support for the A7 PLL on SDX55 and SDX65 devices. It provides the CPU with | ||||
| 	  frequencies above 1GHz. | ||||
| 	  Say Y if you want to support higher CPU frequencies on SDX55 | ||||
| 	  Say Y if you want to support higher CPU frequencies on SDX55 and SDX65 | ||||
| 	  devices. | ||||
| 
 | ||||
| config QCOM_CLK_APCS_MSM8916 | ||||
| @ -55,13 +55,13 @@ config QCOM_CLK_APCC_MSM8996 | ||||
| 	  drivers for dynamic power management. | ||||
| 
 | ||||
| config QCOM_CLK_APCS_SDX55 | ||||
| 	tristate "SDX55 APCS Clock Controller" | ||||
| 	tristate "SDX55 and SDX65 APCS Clock Controller" | ||||
| 	depends on QCOM_APCS_IPC || COMPILE_TEST | ||||
| 	help | ||||
| 	  Support for the APCS Clock Controller on SDX55 platform. The | ||||
| 	  Support for the APCS Clock Controller on SDX55, SDX65 platforms. The | ||||
| 	  APCS is managing the mux and divider which feeds the CPUs. | ||||
| 	  Say Y if you want to support CPU frequency scaling on devices | ||||
| 	  such as SDX55. | ||||
| 	  such as SDX55, SDX65. | ||||
| 
 | ||||
| config QCOM_CLK_RPM | ||||
| 	tristate "RPM based Clock Controller" | ||||
| @ -340,6 +340,15 @@ config QCM_GCC_2290 | ||||
| 	  Say Y if you want to use multimedia devices or peripheral | ||||
| 	  devices such as UART, SPI, I2C, USB, SD/eMMC etc. | ||||
| 
 | ||||
| config QCM_DISPCC_2290 | ||||
| 	tristate "QCM2290 Display Clock Controller" | ||||
| 	select QCM_GCC_2290 | ||||
| 	help | ||||
| 	  Support for the display clock controller on Qualcomm Technologies, Inc | ||||
| 	  QCM2290 devices. | ||||
| 	  Say Y if you want to support display devices and functionality such as | ||||
| 	  splash screen. | ||||
| 
 | ||||
| config QCS_GCC_404 | ||||
| 	tristate "QCS404 Global Clock Controller" | ||||
| 	help | ||||
| @ -565,13 +574,6 @@ config SDX_GCC_55 | ||||
| 	  Say Y if you want to use peripheral devices such as UART, | ||||
| 	  SPI, I2C, USB, SD/UFS, PCIe etc. | ||||
| 
 | ||||
| config SM_CAMCC_8250 | ||||
| 	tristate "SM8250 Camera Clock Controller" | ||||
| 	select SM_GCC_8250 | ||||
| 	help | ||||
| 	  Support for the camera clock controller on SM8250 devices. | ||||
| 	  Say Y if you want to support camera devices and camera functionality. | ||||
| 
 | ||||
| config SDX_GCC_65 | ||||
| 	tristate "SDX65 Global Clock Controller" | ||||
| 	select QCOM_GDSC | ||||
| @ -580,6 +582,22 @@ config SDX_GCC_65 | ||||
| 	  Say Y if you want to use peripheral devices such as UART, | ||||
| 	  SPI, I2C, USB, SD/UFS, PCIe etc. | ||||
| 
 | ||||
| config SM_CAMCC_8250 | ||||
| 	tristate "SM8250 Camera Clock Controller" | ||||
| 	select SM_GCC_8250 | ||||
| 	help | ||||
| 	  Support for the camera clock controller on SM8250 devices. | ||||
| 	  Say Y if you want to support camera devices and camera functionality. | ||||
| 
 | ||||
| config SM_DISPCC_6125 | ||||
| 	tristate "SM6125 Display Clock Controller" | ||||
| 	depends on SM_GCC_6125 | ||||
| 	help | ||||
| 	  Support for the display clock controller on Qualcomm Technologies, Inc | ||||
| 	  SM6125 devices. | ||||
| 	  Say Y if you want to support display devices and functionality such as | ||||
| 	  splash screen | ||||
| 
 | ||||
| config SM_DISPCC_8250 | ||||
| 	tristate "SM8150 and SM8250 Display Clock Controller" | ||||
| 	depends on SM_GCC_8150 || SM_GCC_8250 | ||||
| @ -589,6 +607,15 @@ config SM_DISPCC_8250 | ||||
| 	  Say Y if you want to support display devices and functionality such as | ||||
| 	  splash screen. | ||||
| 
 | ||||
| config SM_DISPCC_6350 | ||||
| 	tristate "SM6350 Display Clock Controller" | ||||
| 	depends on SM_GCC_6350 | ||||
| 	help | ||||
| 	  Support for the display clock controller on Qualcomm Technologies, Inc | ||||
| 	  SM6350 devices. | ||||
| 	  Say Y if you want to support display devices and functionality such as | ||||
| 	  splash screen. | ||||
| 
 | ||||
| config SM_GCC_6115 | ||||
| 	tristate "SM6115 and SM4250 Global Clock Controller" | ||||
| 	help | ||||
| @ -642,6 +669,14 @@ config SM_GCC_8450 | ||||
| 	  Say Y if you want to use peripheral devices such as UART, | ||||
| 	  SPI, I2C, USB, SD/UFS, PCIe etc. | ||||
| 
 | ||||
| config SM_GPUCC_6350 | ||||
| 	tristate "SM6350 Graphics Clock Controller" | ||||
| 	select SM_GCC_6350 | ||||
| 	help | ||||
| 	  Support for the graphics clock controller on SM6350 devices. | ||||
| 	  Say Y if you want to support graphics controller devices and | ||||
| 	  functionality such as 3D graphics. | ||||
| 
 | ||||
| config SM_GPUCC_8150 | ||||
| 	tristate "SM8150 Graphics Clock Controller" | ||||
| 	select SM_GCC_8150 | ||||
|  | ||||
| @ -56,6 +56,7 @@ obj-$(CONFIG_QCOM_CLK_RPM) += clk-rpm.o | ||||
| obj-$(CONFIG_QCOM_CLK_RPMH) += clk-rpmh.o | ||||
| obj-$(CONFIG_QCOM_CLK_SMD_RPM) += clk-smd-rpm.o | ||||
| obj-$(CONFIG_QCM_GCC_2290) += gcc-qcm2290.o | ||||
| obj-$(CONFIG_QCM_DISPCC_2290) += dispcc-qcm2290.o | ||||
| obj-$(CONFIG_QCS_GCC_404) += gcc-qcs404.o | ||||
| obj-$(CONFIG_QCS_Q6SSTOP_404) += q6sstop-qcs404.o | ||||
| obj-$(CONFIG_QCS_TURING_404) += turingcc-qcs404.o | ||||
| @ -83,8 +84,10 @@ obj-$(CONFIG_SDM_GPUCC_845) += gpucc-sdm845.o | ||||
| obj-$(CONFIG_SDM_LPASSCC_845) += lpasscc-sdm845.o | ||||
| obj-$(CONFIG_SDM_VIDEOCC_845) += videocc-sdm845.o | ||||
| obj-$(CONFIG_SDX_GCC_55) += gcc-sdx55.o | ||||
| obj-$(CONFIG_SM_CAMCC_8250) += camcc-sm8250.o | ||||
| obj-$(CONFIG_SDX_GCC_65) += gcc-sdx65.o | ||||
| obj-$(CONFIG_SM_CAMCC_8250) += camcc-sm8250.o | ||||
| obj-$(CONFIG_SM_DISPCC_6125) += dispcc-sm6125.o | ||||
| obj-$(CONFIG_SM_DISPCC_6350) += dispcc-sm6350.o | ||||
| obj-$(CONFIG_SM_DISPCC_8250) += dispcc-sm8250.o | ||||
| obj-$(CONFIG_SM_GCC_6115) += gcc-sm6115.o | ||||
| obj-$(CONFIG_SM_GCC_6125) += gcc-sm6125.o | ||||
| @ -93,6 +96,7 @@ obj-$(CONFIG_SM_GCC_8150) += gcc-sm8150.o | ||||
| obj-$(CONFIG_SM_GCC_8250) += gcc-sm8250.o | ||||
| obj-$(CONFIG_SM_GCC_8350) += gcc-sm8350.o | ||||
| obj-$(CONFIG_SM_GCC_8450) += gcc-sm8450.o | ||||
| obj-$(CONFIG_SM_GPUCC_6350) += gpucc-sm6350.o | ||||
| obj-$(CONFIG_SM_GPUCC_8150) += gpucc-sm8150.o | ||||
| obj-$(CONFIG_SM_GPUCC_8250) += gpucc-sm8250.o | ||||
| obj-$(CONFIG_SM_VIDEOCC_8150) += videocc-sm8150.o | ||||
|  | ||||
| @ -29,7 +29,6 @@ enum { | ||||
| 	P_CAM_CC_PLL2_OUT_AUX, | ||||
| 	P_CAM_CC_PLL2_OUT_EARLY, | ||||
| 	P_CAM_CC_PLL3_OUT_MAIN, | ||||
| 	P_CORE_BI_PLL_TEST_SE, | ||||
| }; | ||||
| 
 | ||||
| static const struct pll_vco agera_vco[] = { | ||||
| @ -127,7 +126,9 @@ static struct clk_fixed_factor cam_cc_pll2_out_early = { | ||||
| 	.div = 2, | ||||
| 	.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_pll2_out_early", | ||||
| 		.parent_names = (const char *[]){ "cam_cc_pll2" }, | ||||
| 		.parent_hws = (const struct clk_hw*[]){ | ||||
| 			&cam_cc_pll2.clkr.hw, | ||||
| 		}, | ||||
| 		.num_parents = 1, | ||||
| 		.ops = &clk_fixed_factor_ops, | ||||
| 	}, | ||||
| @ -147,8 +148,8 @@ static struct clk_alpha_pll_postdiv cam_cc_pll2_out_aux = { | ||||
| 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_AGERA], | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_pll2_out_aux", | ||||
| 		.parent_data = &(const struct clk_parent_data){ | ||||
| 			.hw = &cam_cc_pll2.clkr.hw, | ||||
| 		.parent_hws = (const struct clk_hw*[]){ | ||||
| 			&cam_cc_pll2.clkr.hw, | ||||
| 		}, | ||||
| 		.num_parents = 1, | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| @ -187,26 +188,22 @@ static const struct parent_map cam_cc_parent_map_0[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| 	{ P_CAM_CC_PLL1_OUT_EVEN, 2 }, | ||||
| 	{ P_CAM_CC_PLL0_OUT_EVEN, 6 }, | ||||
| 	{ P_CORE_BI_PLL_TEST_SE, 7 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data cam_cc_parent_data_0[] = { | ||||
| 	{ .fw_name = "bi_tcxo" }, | ||||
| 	{ .hw = &cam_cc_pll1.clkr.hw }, | ||||
| 	{ .hw = &cam_cc_pll0.clkr.hw }, | ||||
| 	{ .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map cam_cc_parent_map_1[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| 	{ P_CAM_CC_PLL2_OUT_AUX, 1 }, | ||||
| 	{ P_CORE_BI_PLL_TEST_SE, 7 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data cam_cc_parent_data_1[] = { | ||||
| 	{ .fw_name = "bi_tcxo" }, | ||||
| 	{ .hw = &cam_cc_pll2_out_aux.clkr.hw }, | ||||
| 	{ .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map cam_cc_parent_map_2[] = { | ||||
| @ -214,7 +211,6 @@ static const struct parent_map cam_cc_parent_map_2[] = { | ||||
| 	{ P_CAM_CC_PLL2_OUT_EARLY, 4 }, | ||||
| 	{ P_CAM_CC_PLL3_OUT_MAIN, 5 }, | ||||
| 	{ P_CAM_CC_PLL0_OUT_EVEN, 6 }, | ||||
| 	{ P_CORE_BI_PLL_TEST_SE, 7 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data cam_cc_parent_data_2[] = { | ||||
| @ -222,7 +218,6 @@ static const struct clk_parent_data cam_cc_parent_data_2[] = { | ||||
| 	{ .hw = &cam_cc_pll2_out_early.hw }, | ||||
| 	{ .hw = &cam_cc_pll3.clkr.hw }, | ||||
| 	{ .hw = &cam_cc_pll0.clkr.hw }, | ||||
| 	{ .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map cam_cc_parent_map_3[] = { | ||||
| @ -231,7 +226,6 @@ static const struct parent_map cam_cc_parent_map_3[] = { | ||||
| 	{ P_CAM_CC_PLL2_OUT_EARLY, 4 }, | ||||
| 	{ P_CAM_CC_PLL3_OUT_MAIN, 5 }, | ||||
| 	{ P_CAM_CC_PLL0_OUT_EVEN, 6 }, | ||||
| 	{ P_CORE_BI_PLL_TEST_SE, 7 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data cam_cc_parent_data_3[] = { | ||||
| @ -240,33 +234,28 @@ static const struct clk_parent_data cam_cc_parent_data_3[] = { | ||||
| 	{ .hw = &cam_cc_pll2_out_early.hw }, | ||||
| 	{ .hw = &cam_cc_pll3.clkr.hw }, | ||||
| 	{ .hw = &cam_cc_pll0.clkr.hw }, | ||||
| 	{ .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map cam_cc_parent_map_4[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| 	{ P_CAM_CC_PLL3_OUT_MAIN, 5 }, | ||||
| 	{ P_CAM_CC_PLL0_OUT_EVEN, 6 }, | ||||
| 	{ P_CORE_BI_PLL_TEST_SE, 7 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data cam_cc_parent_data_4[] = { | ||||
| 	{ .fw_name = "bi_tcxo" }, | ||||
| 	{ .hw = &cam_cc_pll3.clkr.hw }, | ||||
| 	{ .hw = &cam_cc_pll0.clkr.hw }, | ||||
| 	{ .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map cam_cc_parent_map_5[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| 	{ P_CAM_CC_PLL0_OUT_EVEN, 6 }, | ||||
| 	{ P_CORE_BI_PLL_TEST_SE, 7 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data cam_cc_parent_data_5[] = { | ||||
| 	{ .fw_name = "bi_tcxo" }, | ||||
| 	{ .hw = &cam_cc_pll0.clkr.hw }, | ||||
| 	{ .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map cam_cc_parent_map_6[] = { | ||||
| @ -274,7 +263,6 @@ static const struct parent_map cam_cc_parent_map_6[] = { | ||||
| 	{ P_CAM_CC_PLL1_OUT_EVEN, 2 }, | ||||
| 	{ P_CAM_CC_PLL3_OUT_MAIN, 5 }, | ||||
| 	{ P_CAM_CC_PLL0_OUT_EVEN, 6 }, | ||||
| 	{ P_CORE_BI_PLL_TEST_SE, 7 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data cam_cc_parent_data_6[] = { | ||||
| @ -282,7 +270,6 @@ static const struct clk_parent_data cam_cc_parent_data_6[] = { | ||||
| 	{ .hw = &cam_cc_pll1.clkr.hw }, | ||||
| 	{ .hw = &cam_cc_pll3.clkr.hw }, | ||||
| 	{ .hw = &cam_cc_pll0.clkr.hw }, | ||||
| 	{ .fw_name = "core_bi_pll_test_se", .name = "core_bi_pll_test_se" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct freq_tbl ftbl_cam_cc_bps_clk_src[] = { | ||||
| @ -303,7 +290,7 @@ static struct clk_rcg2 cam_cc_bps_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_bps_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_2, | ||||
| 		.num_parents = 5, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_2), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -324,7 +311,7 @@ static struct clk_rcg2 cam_cc_cci_0_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_cci_0_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_5, | ||||
| 		.num_parents = 3, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_5), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -338,7 +325,7 @@ static struct clk_rcg2 cam_cc_cci_1_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_cci_1_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_5, | ||||
| 		.num_parents = 3, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_5), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -359,7 +346,7 @@ static struct clk_rcg2 cam_cc_cphy_rx_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_cphy_rx_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_3, | ||||
| 		.num_parents = 6, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_3), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -378,7 +365,7 @@ static struct clk_rcg2 cam_cc_csi0phytimer_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_csi0phytimer_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = 4, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -392,7 +379,7 @@ static struct clk_rcg2 cam_cc_csi1phytimer_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_csi1phytimer_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = 4, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -406,7 +393,7 @@ static struct clk_rcg2 cam_cc_csi2phytimer_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_csi2phytimer_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = 4, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -420,7 +407,7 @@ static struct clk_rcg2 cam_cc_csi3phytimer_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_csi3phytimer_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = 4, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -442,7 +429,7 @@ static struct clk_rcg2 cam_cc_fast_ahb_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_fast_ahb_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = 4, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -465,7 +452,7 @@ static struct clk_rcg2 cam_cc_icp_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_icp_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_2, | ||||
| 		.num_parents = 5, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_2), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -487,7 +474,7 @@ static struct clk_rcg2 cam_cc_ife_0_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_ife_0_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_4, | ||||
| 		.num_parents = 4, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_4), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -509,7 +496,7 @@ static struct clk_rcg2 cam_cc_ife_0_csid_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_ife_0_csid_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_3, | ||||
| 		.num_parents = 6, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_3), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -523,7 +510,7 @@ static struct clk_rcg2 cam_cc_ife_1_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_ife_1_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_4, | ||||
| 		.num_parents = 4, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_4), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -537,7 +524,7 @@ static struct clk_rcg2 cam_cc_ife_1_csid_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_ife_1_csid_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_3, | ||||
| 		.num_parents = 6, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_3), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -551,7 +538,7 @@ static struct clk_rcg2 cam_cc_ife_lite_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_ife_lite_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_4, | ||||
| 		.num_parents = 4, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_4), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| @ -566,7 +553,7 @@ static struct clk_rcg2 cam_cc_ife_lite_csid_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_ife_lite_csid_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_3, | ||||
| 		.num_parents = 6, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_3), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -589,7 +576,7 @@ static struct clk_rcg2 cam_cc_ipe_0_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_ipe_0_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_2, | ||||
| 		.num_parents = 5, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_2), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -612,7 +599,7 @@ static struct clk_rcg2 cam_cc_jpeg_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_jpeg_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_2, | ||||
| 		.num_parents = 5, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_2), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -634,7 +621,7 @@ static struct clk_rcg2 cam_cc_lrme_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_lrme_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_6, | ||||
| 		.num_parents = 5, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_6), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -655,7 +642,7 @@ static struct clk_rcg2 cam_cc_mclk0_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_mclk0_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_1, | ||||
| 		.num_parents = 3, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_1), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -669,7 +656,7 @@ static struct clk_rcg2 cam_cc_mclk1_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_mclk1_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_1, | ||||
| 		.num_parents = 3, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_1), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -683,7 +670,7 @@ static struct clk_rcg2 cam_cc_mclk2_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_mclk2_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_1, | ||||
| 		.num_parents = 3, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_1), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -697,7 +684,7 @@ static struct clk_rcg2 cam_cc_mclk3_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_mclk3_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_1, | ||||
| 		.num_parents = 3, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_1), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -711,7 +698,7 @@ static struct clk_rcg2 cam_cc_mclk4_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_mclk4_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_1, | ||||
| 		.num_parents = 3, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_1), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -730,7 +717,7 @@ static struct clk_rcg2 cam_cc_slow_ahb_clk_src = { | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_slow_ahb_clk_src", | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = 4, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE, | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| @ -744,8 +731,8 @@ static struct clk_branch cam_cc_bps_ahb_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_bps_ahb_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_slow_ahb_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_slow_ahb_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -762,8 +749,8 @@ static struct clk_branch cam_cc_bps_areg_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_bps_areg_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_fast_ahb_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_fast_ahb_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -793,8 +780,8 @@ static struct clk_branch cam_cc_bps_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_bps_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_bps_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_bps_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -824,8 +811,8 @@ static struct clk_branch cam_cc_cci_0_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_cci_0_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_cci_0_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_cci_0_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -842,8 +829,8 @@ static struct clk_branch cam_cc_cci_1_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_cci_1_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_cci_1_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_cci_1_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -860,8 +847,8 @@ static struct clk_branch cam_cc_core_ahb_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_core_ahb_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_slow_ahb_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_slow_ahb_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -878,8 +865,8 @@ static struct clk_branch cam_cc_cpas_ahb_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_cpas_ahb_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_slow_ahb_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_slow_ahb_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -896,8 +883,8 @@ static struct clk_branch cam_cc_csi0phytimer_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_csi0phytimer_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_csi0phytimer_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_csi0phytimer_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -914,8 +901,8 @@ static struct clk_branch cam_cc_csi1phytimer_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_csi1phytimer_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_csi1phytimer_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_csi1phytimer_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -932,8 +919,8 @@ static struct clk_branch cam_cc_csi2phytimer_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_csi2phytimer_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_csi2phytimer_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_csi2phytimer_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -950,8 +937,8 @@ static struct clk_branch cam_cc_csi3phytimer_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_csi3phytimer_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_csi3phytimer_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_csi3phytimer_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -968,8 +955,8 @@ static struct clk_branch cam_cc_csiphy0_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_csiphy0_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_cphy_rx_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_cphy_rx_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -986,8 +973,8 @@ static struct clk_branch cam_cc_csiphy1_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_csiphy1_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_cphy_rx_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_cphy_rx_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1004,8 +991,8 @@ static struct clk_branch cam_cc_csiphy2_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_csiphy2_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_cphy_rx_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_cphy_rx_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1022,8 +1009,8 @@ static struct clk_branch cam_cc_csiphy3_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_csiphy3_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_cphy_rx_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_cphy_rx_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1040,8 +1027,8 @@ static struct clk_branch cam_cc_icp_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_icp_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_icp_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_icp_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1071,8 +1058,8 @@ static struct clk_branch cam_cc_ife_0_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ife_0_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_ife_0_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_ife_0_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1089,8 +1076,8 @@ static struct clk_branch cam_cc_ife_0_cphy_rx_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ife_0_cphy_rx_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_cphy_rx_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_cphy_rx_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1107,8 +1094,8 @@ static struct clk_branch cam_cc_ife_0_csid_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ife_0_csid_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_ife_0_csid_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_ife_0_csid_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1125,8 +1112,8 @@ static struct clk_branch cam_cc_ife_0_dsp_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ife_0_dsp_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_ife_0_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_ife_0_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1156,8 +1143,8 @@ static struct clk_branch cam_cc_ife_1_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ife_1_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_ife_1_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_ife_1_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1174,8 +1161,8 @@ static struct clk_branch cam_cc_ife_1_cphy_rx_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ife_1_cphy_rx_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_cphy_rx_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_cphy_rx_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1192,8 +1179,8 @@ static struct clk_branch cam_cc_ife_1_csid_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ife_1_csid_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_ife_1_csid_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_ife_1_csid_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1210,8 +1197,8 @@ static struct clk_branch cam_cc_ife_1_dsp_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ife_1_dsp_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_ife_1_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_ife_1_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1228,8 +1215,8 @@ static struct clk_branch cam_cc_ife_lite_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ife_lite_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_ife_lite_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_ife_lite_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1246,8 +1233,8 @@ static struct clk_branch cam_cc_ife_lite_cphy_rx_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ife_lite_cphy_rx_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_cphy_rx_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_cphy_rx_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1264,8 +1251,8 @@ static struct clk_branch cam_cc_ife_lite_csid_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ife_lite_csid_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_ife_lite_csid_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_ife_lite_csid_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1282,8 +1269,8 @@ static struct clk_branch cam_cc_ipe_0_ahb_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ipe_0_ahb_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_slow_ahb_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_slow_ahb_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1300,8 +1287,8 @@ static struct clk_branch cam_cc_ipe_0_areg_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ipe_0_areg_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_fast_ahb_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_fast_ahb_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1331,8 +1318,8 @@ static struct clk_branch cam_cc_ipe_0_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ipe_0_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_ipe_0_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_ipe_0_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1349,8 +1336,8 @@ static struct clk_branch cam_cc_jpeg_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_jpeg_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_jpeg_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_jpeg_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1367,8 +1354,8 @@ static struct clk_branch cam_cc_lrme_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_lrme_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_lrme_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_lrme_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1385,8 +1372,8 @@ static struct clk_branch cam_cc_mclk0_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_mclk0_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_mclk0_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_mclk0_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1403,8 +1390,8 @@ static struct clk_branch cam_cc_mclk1_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_mclk1_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_mclk1_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_mclk1_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1421,8 +1408,8 @@ static struct clk_branch cam_cc_mclk2_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_mclk2_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_mclk2_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_mclk2_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1439,8 +1426,8 @@ static struct clk_branch cam_cc_mclk3_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_mclk3_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_mclk3_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_mclk3_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1457,8 +1444,8 @@ static struct clk_branch cam_cc_mclk4_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_mclk4_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &cam_cc_mclk4_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_mclk4_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
|  | ||||
| @ -23,25 +23,6 @@ enum { | ||||
| 	P_CAM_CC_PLL1_OUT_EVEN, | ||||
| 	P_CAM_CC_PLL2_OUT_EVEN, | ||||
| 	P_CAM_CC_PLL3_OUT_EVEN, | ||||
| 	P_CORE_BI_PLL_TEST_SE, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map cam_cc_parent_map_0[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| 	{ P_CAM_CC_PLL2_OUT_EVEN, 1 }, | ||||
| 	{ P_CAM_CC_PLL1_OUT_EVEN, 2 }, | ||||
| 	{ P_CAM_CC_PLL3_OUT_EVEN, 5 }, | ||||
| 	{ P_CAM_CC_PLL0_OUT_EVEN, 6 }, | ||||
| 	{ P_CORE_BI_PLL_TEST_SE, 7 }, | ||||
| }; | ||||
| 
 | ||||
| static const char * const cam_cc_parent_names_0[] = { | ||||
| 	"bi_tcxo", | ||||
| 	"cam_cc_pll2_out_even", | ||||
| 	"cam_cc_pll1_out_even", | ||||
| 	"cam_cc_pll3_out_even", | ||||
| 	"cam_cc_pll0_out_even", | ||||
| 	"core_bi_pll_test_se", | ||||
| }; | ||||
| 
 | ||||
| static struct clk_alpha_pll cam_cc_pll0 = { | ||||
| @ -50,7 +31,9 @@ static struct clk_alpha_pll cam_cc_pll0 = { | ||||
| 	.clkr = { | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_pll0", | ||||
| 			.parent_names = (const char *[]){ "bi_tcxo" }, | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.fw_name = "bi_tcxo", .name = "bi_tcxo", | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.ops = &clk_alpha_pll_fabia_ops, | ||||
| 		}, | ||||
| @ -72,7 +55,9 @@ static struct clk_alpha_pll_postdiv cam_cc_pll0_out_even = { | ||||
| 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_pll0_out_even", | ||||
| 		.parent_names = (const char *[]){ "cam_cc_pll0" }, | ||||
| 		.parent_hws = (const struct clk_hw*[]){ | ||||
| 			&cam_cc_pll0.clkr.hw, | ||||
| 		}, | ||||
| 		.num_parents = 1, | ||||
| 		.ops = &clk_alpha_pll_postdiv_fabia_ops, | ||||
| 	}, | ||||
| @ -84,7 +69,9 @@ static struct clk_alpha_pll cam_cc_pll1 = { | ||||
| 	.clkr = { | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_pll1", | ||||
| 			.parent_names = (const char *[]){ "bi_tcxo" }, | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.fw_name = "bi_tcxo", .name = "bi_tcxo", | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.ops = &clk_alpha_pll_fabia_ops, | ||||
| 		}, | ||||
| @ -100,7 +87,9 @@ static struct clk_alpha_pll_postdiv cam_cc_pll1_out_even = { | ||||
| 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_pll1_out_even", | ||||
| 		.parent_names = (const char *[]){ "cam_cc_pll1" }, | ||||
| 		.parent_hws = (const struct clk_hw*[]){ | ||||
| 			&cam_cc_pll1.clkr.hw, | ||||
| 		}, | ||||
| 		.num_parents = 1, | ||||
| 		.ops = &clk_alpha_pll_postdiv_fabia_ops, | ||||
| 	}, | ||||
| @ -112,7 +101,9 @@ static struct clk_alpha_pll cam_cc_pll2 = { | ||||
| 	.clkr = { | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_pll2", | ||||
| 			.parent_names = (const char *[]){ "bi_tcxo" }, | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.fw_name = "bi_tcxo", .name = "bi_tcxo", | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.ops = &clk_alpha_pll_fabia_ops, | ||||
| 		}, | ||||
| @ -128,7 +119,9 @@ static struct clk_alpha_pll_postdiv cam_cc_pll2_out_even = { | ||||
| 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_pll2_out_even", | ||||
| 		.parent_names = (const char *[]){ "cam_cc_pll2" }, | ||||
| 		.parent_hws = (const struct clk_hw*[]){ | ||||
| 			&cam_cc_pll2.clkr.hw, | ||||
| 		}, | ||||
| 		.num_parents = 1, | ||||
| 		.ops = &clk_alpha_pll_postdiv_fabia_ops, | ||||
| 	}, | ||||
| @ -140,7 +133,9 @@ static struct clk_alpha_pll cam_cc_pll3 = { | ||||
| 	.clkr = { | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_pll3", | ||||
| 			.parent_names = (const char *[]){ "bi_tcxo" }, | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.fw_name = "bi_tcxo", .name = "bi_tcxo", | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.ops = &clk_alpha_pll_fabia_ops, | ||||
| 		}, | ||||
| @ -156,12 +151,30 @@ static struct clk_alpha_pll_postdiv cam_cc_pll3_out_even = { | ||||
| 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_pll3_out_even", | ||||
| 		.parent_names = (const char *[]){ "cam_cc_pll3" }, | ||||
| 		.parent_hws = (const struct clk_hw*[]){ | ||||
| 			&cam_cc_pll3.clkr.hw, | ||||
| 		}, | ||||
| 		.num_parents = 1, | ||||
| 		.ops = &clk_alpha_pll_postdiv_fabia_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map cam_cc_parent_map_0[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| 	{ P_CAM_CC_PLL2_OUT_EVEN, 1 }, | ||||
| 	{ P_CAM_CC_PLL1_OUT_EVEN, 2 }, | ||||
| 	{ P_CAM_CC_PLL3_OUT_EVEN, 5 }, | ||||
| 	{ P_CAM_CC_PLL0_OUT_EVEN, 6 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data cam_cc_parent_data_0[] = { | ||||
| 	{ .fw_name = "bi_tcxo", .name = "bi_tcxo" }, | ||||
| 	{ .hw = &cam_cc_pll2_out_even.clkr.hw }, | ||||
| 	{ .hw = &cam_cc_pll1_out_even.clkr.hw }, | ||||
| 	{ .hw = &cam_cc_pll3_out_even.clkr.hw }, | ||||
| 	{ .hw = &cam_cc_pll0_out_even.clkr.hw }, | ||||
| }; | ||||
| 
 | ||||
| static const struct freq_tbl ftbl_cam_cc_bps_clk_src[] = { | ||||
| 	F(19200000, P_BI_TCXO, 1, 0, 0), | ||||
| 	F(100000000, P_CAM_CC_PLL0_OUT_EVEN, 6, 0, 0), | ||||
| @ -189,8 +202,8 @@ static struct clk_rcg2 cam_cc_bps_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_bps_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_bps_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| @ -212,8 +225,8 @@ static struct clk_rcg2 cam_cc_cci_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_cci_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_cci_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -232,8 +245,8 @@ static struct clk_rcg2 cam_cc_cphy_rx_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_cphy_rx_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_cphy_rx_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -253,8 +266,8 @@ static struct clk_rcg2 cam_cc_csi0phytimer_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_csi0phytimer_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| @ -268,8 +281,8 @@ static struct clk_rcg2 cam_cc_csi1phytimer_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_csi1phytimer_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| @ -283,8 +296,8 @@ static struct clk_rcg2 cam_cc_csi2phytimer_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_csi2phytimer_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| @ -298,8 +311,8 @@ static struct clk_rcg2 cam_cc_csi3phytimer_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_csi0phytimer_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_csi3phytimer_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| @ -323,8 +336,8 @@ static struct clk_rcg2 cam_cc_fast_ahb_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_fast_ahb_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_fast_ahb_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -346,8 +359,8 @@ static struct clk_rcg2 cam_cc_fd_core_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_fd_core_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_fd_core_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -369,8 +382,8 @@ static struct clk_rcg2 cam_cc_icp_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_icp_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_icp_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -393,8 +406,8 @@ static struct clk_rcg2 cam_cc_ife_0_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_ife_0_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_ife_0_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| @ -416,8 +429,8 @@ static struct clk_rcg2 cam_cc_ife_0_csid_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_ife_0_csid_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_ife_0_csid_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -430,8 +443,8 @@ static struct clk_rcg2 cam_cc_ife_1_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_ife_0_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_ife_1_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| @ -445,8 +458,8 @@ static struct clk_rcg2 cam_cc_ife_1_csid_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_ife_0_csid_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_ife_1_csid_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -459,8 +472,8 @@ static struct clk_rcg2 cam_cc_ife_lite_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_ife_0_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_ife_lite_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| @ -474,8 +487,8 @@ static struct clk_rcg2 cam_cc_ife_lite_csid_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_ife_0_csid_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_ife_lite_csid_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| @ -499,8 +512,8 @@ static struct clk_rcg2 cam_cc_ipe_0_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_ipe_0_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_ipe_0_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| @ -514,8 +527,8 @@ static struct clk_rcg2 cam_cc_ipe_1_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_ipe_0_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_ipe_1_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| @ -529,8 +542,8 @@ static struct clk_rcg2 cam_cc_jpeg_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_bps_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_jpeg_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| @ -554,8 +567,8 @@ static struct clk_rcg2 cam_cc_lrme_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_lrme_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_lrme_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| @ -577,8 +590,8 @@ static struct clk_rcg2 cam_cc_mclk0_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_mclk0_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_mclk0_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| @ -592,8 +605,8 @@ static struct clk_rcg2 cam_cc_mclk1_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_mclk0_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_mclk1_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| @ -607,8 +620,8 @@ static struct clk_rcg2 cam_cc_mclk2_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_mclk0_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_mclk2_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| @ -622,8 +635,8 @@ static struct clk_rcg2 cam_cc_mclk3_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_mclk0_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_mclk3_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| @ -646,8 +659,8 @@ static struct clk_rcg2 cam_cc_slow_ahb_clk_src = { | ||||
| 	.freq_tbl = ftbl_cam_cc_slow_ahb_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "cam_cc_slow_ahb_clk_src", | ||||
| 		.parent_names = cam_cc_parent_names_0, | ||||
| 		.num_parents = 6, | ||||
| 		.parent_data = cam_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(cam_cc_parent_data_0), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| @ -661,8 +674,8 @@ static struct clk_branch cam_cc_bps_ahb_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_bps_ahb_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_slow_ahb_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_slow_ahb_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -679,8 +692,8 @@ static struct clk_branch cam_cc_bps_areg_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_bps_areg_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_fast_ahb_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_fast_ahb_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -710,8 +723,8 @@ static struct clk_branch cam_cc_bps_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_bps_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_bps_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_bps_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -754,8 +767,8 @@ static struct clk_branch cam_cc_cci_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_cci_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_cci_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_cci_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -772,8 +785,8 @@ static struct clk_branch cam_cc_cpas_ahb_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_cpas_ahb_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_slow_ahb_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_slow_ahb_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -790,8 +803,8 @@ static struct clk_branch cam_cc_csi0phytimer_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_csi0phytimer_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_csi0phytimer_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_csi0phytimer_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -808,8 +821,8 @@ static struct clk_branch cam_cc_csi1phytimer_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_csi1phytimer_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_csi1phytimer_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_csi1phytimer_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -826,8 +839,8 @@ static struct clk_branch cam_cc_csi2phytimer_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_csi2phytimer_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_csi2phytimer_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_csi2phytimer_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -844,8 +857,8 @@ static struct clk_branch cam_cc_csi3phytimer_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_csi3phytimer_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_csi3phytimer_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_csi3phytimer_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -862,8 +875,8 @@ static struct clk_branch cam_cc_csiphy0_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_csiphy0_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_cphy_rx_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_cphy_rx_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -880,8 +893,8 @@ static struct clk_branch cam_cc_csiphy1_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_csiphy1_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_cphy_rx_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_cphy_rx_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -898,8 +911,8 @@ static struct clk_branch cam_cc_csiphy2_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_csiphy2_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_cphy_rx_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_cphy_rx_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -916,8 +929,8 @@ static struct clk_branch cam_cc_csiphy3_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_csiphy3_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_cphy_rx_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_cphy_rx_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -934,8 +947,8 @@ static struct clk_branch cam_cc_fd_core_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_fd_core_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_fd_core_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_fd_core_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -952,8 +965,8 @@ static struct clk_branch cam_cc_fd_core_uar_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_fd_core_uar_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_fd_core_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_fd_core_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| @ -995,8 +1008,8 @@ static struct clk_branch cam_cc_icp_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_icp_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_icp_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_icp_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1052,8 +1065,8 @@ static struct clk_branch cam_cc_ife_0_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ife_0_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_ife_0_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_ife_0_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1070,8 +1083,8 @@ static struct clk_branch cam_cc_ife_0_cphy_rx_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ife_0_cphy_rx_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_cphy_rx_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_cphy_rx_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1088,8 +1101,8 @@ static struct clk_branch cam_cc_ife_0_csid_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ife_0_csid_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_ife_0_csid_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_ife_0_csid_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1106,8 +1119,8 @@ static struct clk_branch cam_cc_ife_0_dsp_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ife_0_dsp_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_ife_0_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_ife_0_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| @ -1136,8 +1149,8 @@ static struct clk_branch cam_cc_ife_1_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ife_1_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_ife_1_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_ife_1_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1154,8 +1167,8 @@ static struct clk_branch cam_cc_ife_1_cphy_rx_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ife_1_cphy_rx_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_cphy_rx_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_cphy_rx_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1172,8 +1185,8 @@ static struct clk_branch cam_cc_ife_1_csid_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ife_1_csid_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_ife_1_csid_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_ife_1_csid_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1190,8 +1203,8 @@ static struct clk_branch cam_cc_ife_1_dsp_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ife_1_dsp_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_ife_1_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_ife_1_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| @ -1207,8 +1220,8 @@ static struct clk_branch cam_cc_ife_lite_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ife_lite_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_ife_lite_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_ife_lite_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1225,8 +1238,8 @@ static struct clk_branch cam_cc_ife_lite_cphy_rx_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ife_lite_cphy_rx_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_cphy_rx_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_cphy_rx_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1243,8 +1256,8 @@ static struct clk_branch cam_cc_ife_lite_csid_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ife_lite_csid_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_ife_lite_csid_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_ife_lite_csid_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1261,8 +1274,8 @@ static struct clk_branch cam_cc_ipe_0_ahb_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ipe_0_ahb_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_slow_ahb_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_slow_ahb_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1279,8 +1292,8 @@ static struct clk_branch cam_cc_ipe_0_areg_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ipe_0_areg_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_fast_ahb_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_fast_ahb_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1310,8 +1323,8 @@ static struct clk_branch cam_cc_ipe_0_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ipe_0_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_ipe_0_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_ipe_0_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1328,8 +1341,8 @@ static struct clk_branch cam_cc_ipe_1_ahb_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ipe_1_ahb_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_slow_ahb_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_slow_ahb_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1346,8 +1359,8 @@ static struct clk_branch cam_cc_ipe_1_areg_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ipe_1_areg_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_fast_ahb_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_fast_ahb_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1377,8 +1390,8 @@ static struct clk_branch cam_cc_ipe_1_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_ipe_1_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_ipe_1_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_ipe_1_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1395,8 +1408,8 @@ static struct clk_branch cam_cc_jpeg_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_jpeg_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_jpeg_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_jpeg_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1413,8 +1426,8 @@ static struct clk_branch cam_cc_lrme_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_lrme_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_lrme_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_lrme_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1431,8 +1444,8 @@ static struct clk_branch cam_cc_mclk0_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_mclk0_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_mclk0_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_mclk0_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1449,8 +1462,8 @@ static struct clk_branch cam_cc_mclk1_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_mclk1_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_mclk1_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_mclk1_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1467,8 +1480,8 @@ static struct clk_branch cam_cc_mclk2_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_mclk2_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_mclk2_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_mclk2_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -1485,8 +1498,8 @@ static struct clk_branch cam_cc_mclk3_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "cam_cc_mclk3_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"cam_cc_mclk3_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&cam_cc_mclk3_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
|  | ||||
| @ -526,6 +526,19 @@ static int clk_rcg_set_rate(struct clk_hw *hw, unsigned long rate, | ||||
| 	return __clk_rcg_set_rate(rcg, f); | ||||
| } | ||||
| 
 | ||||
| static int clk_rcg_set_floor_rate(struct clk_hw *hw, unsigned long rate, | ||||
| 				  unsigned long parent_rate) | ||||
| { | ||||
| 	struct clk_rcg *rcg = to_clk_rcg(hw); | ||||
| 	const struct freq_tbl *f; | ||||
| 
 | ||||
| 	f = qcom_find_freq_floor(rcg->freq_tbl, rate); | ||||
| 	if (!f) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	return __clk_rcg_set_rate(rcg, f); | ||||
| } | ||||
| 
 | ||||
| static int clk_rcg_bypass_set_rate(struct clk_hw *hw, unsigned long rate, | ||||
| 				unsigned long parent_rate) | ||||
| { | ||||
| @ -816,6 +829,17 @@ const struct clk_ops clk_rcg_ops = { | ||||
| }; | ||||
| EXPORT_SYMBOL_GPL(clk_rcg_ops); | ||||
| 
 | ||||
| const struct clk_ops clk_rcg_floor_ops = { | ||||
| 	.enable = clk_enable_regmap, | ||||
| 	.disable = clk_disable_regmap, | ||||
| 	.get_parent = clk_rcg_get_parent, | ||||
| 	.set_parent = clk_rcg_set_parent, | ||||
| 	.recalc_rate = clk_rcg_recalc_rate, | ||||
| 	.determine_rate = clk_rcg_determine_rate, | ||||
| 	.set_rate = clk_rcg_set_floor_rate, | ||||
| }; | ||||
| EXPORT_SYMBOL_GPL(clk_rcg_floor_ops); | ||||
| 
 | ||||
| const struct clk_ops clk_rcg_bypass_ops = { | ||||
| 	.enable = clk_enable_regmap, | ||||
| 	.disable = clk_disable_regmap, | ||||
|  | ||||
| @ -86,6 +86,7 @@ struct clk_rcg { | ||||
| }; | ||||
| 
 | ||||
| extern const struct clk_ops clk_rcg_ops; | ||||
| extern const struct clk_ops clk_rcg_floor_ops; | ||||
| extern const struct clk_ops clk_rcg_bypass_ops; | ||||
| extern const struct clk_ops clk_rcg_bypass2_ops; | ||||
| extern const struct clk_ops clk_rcg_pixel_ops; | ||||
|  | ||||
| @ -264,7 +264,7 @@ static int clk_rcg2_determine_floor_rate(struct clk_hw *hw, | ||||
| 
 | ||||
| static int __clk_rcg2_configure(struct clk_rcg2 *rcg, const struct freq_tbl *f) | ||||
| { | ||||
| 	u32 cfg, mask; | ||||
| 	u32 cfg, mask, d_val, not2d_val, n_minus_m; | ||||
| 	struct clk_hw *hw = &rcg->clkr.hw; | ||||
| 	int ret, index = qcom_find_src_index(hw, rcg->parent_map, f->src); | ||||
| 
 | ||||
| @ -283,8 +283,17 @@ static int __clk_rcg2_configure(struct clk_rcg2 *rcg, const struct freq_tbl *f) | ||||
| 		if (ret) | ||||
| 			return ret; | ||||
| 
 | ||||
| 		/* Calculate 2d value */ | ||||
| 		d_val = f->n; | ||||
| 
 | ||||
| 		n_minus_m = f->n - f->m; | ||||
| 		n_minus_m *= 2; | ||||
| 
 | ||||
| 		d_val = clamp_t(u32, d_val, f->m, n_minus_m); | ||||
| 		not2d_val = ~d_val & mask; | ||||
| 
 | ||||
| 		ret = regmap_update_bits(rcg->clkr.regmap, | ||||
| 				RCG_D_OFFSET(rcg), mask, ~f->n); | ||||
| 				RCG_D_OFFSET(rcg), mask, not2d_val); | ||||
| 		if (ret) | ||||
| 			return ret; | ||||
| 	} | ||||
| @ -720,6 +729,7 @@ static const struct frac_entry frac_table_pixel[] = { | ||||
| 	{ 2, 9 }, | ||||
| 	{ 4, 9 }, | ||||
| 	{ 1, 1 }, | ||||
| 	{ 2, 3 }, | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
|  | ||||
| @ -512,6 +512,23 @@ static const struct clk_rpmh_desc clk_rpmh_sm8350 = { | ||||
| 	.num_clks = ARRAY_SIZE(sm8350_rpmh_clocks), | ||||
| }; | ||||
| 
 | ||||
| DEFINE_CLK_RPMH_VRM(sc8280xp, ln_bb_clk3, ln_bb_clk3_ao, "lnbclka3", 2); | ||||
| 
 | ||||
| static struct clk_hw *sc8280xp_rpmh_clocks[] = { | ||||
| 	[RPMH_CXO_CLK]		= &sdm845_bi_tcxo.hw, | ||||
| 	[RPMH_CXO_CLK_A]	= &sdm845_bi_tcxo_ao.hw, | ||||
| 	[RPMH_LN_BB_CLK3]       = &sc8280xp_ln_bb_clk3.hw, | ||||
| 	[RPMH_LN_BB_CLK3_A]     = &sc8280xp_ln_bb_clk3_ao.hw, | ||||
| 	[RPMH_IPA_CLK]          = &sdm845_ipa.hw, | ||||
| 	[RPMH_PKA_CLK]          = &sm8350_pka.hw, | ||||
| 	[RPMH_HWKM_CLK]         = &sm8350_hwkm.hw, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_rpmh_desc clk_rpmh_sc8280xp = { | ||||
| 	.clks = sc8280xp_rpmh_clocks, | ||||
| 	.num_clks = ARRAY_SIZE(sc8280xp_rpmh_clocks), | ||||
| }; | ||||
| 
 | ||||
| /* Resource name must match resource id present in cmd-db */ | ||||
| DEFINE_CLK_RPMH_ARC(sc7280, bi_tcxo, bi_tcxo_ao, "xo.lvl", 0x3, 4); | ||||
| 
 | ||||
| @ -691,6 +708,7 @@ static int clk_rpmh_probe(struct platform_device *pdev) | ||||
| static const struct of_device_id clk_rpmh_match_table[] = { | ||||
| 	{ .compatible = "qcom,sc7180-rpmh-clk", .data = &clk_rpmh_sc7180}, | ||||
| 	{ .compatible = "qcom,sc8180x-rpmh-clk", .data = &clk_rpmh_sc8180x}, | ||||
| 	{ .compatible = "qcom,sc8280xp-rpmh-clk", .data = &clk_rpmh_sc8280xp}, | ||||
| 	{ .compatible = "qcom,sdm845-rpmh-clk", .data = &clk_rpmh_sdm845}, | ||||
| 	{ .compatible = "qcom,sdx55-rpmh-clk",  .data = &clk_rpmh_sdx55}, | ||||
| 	{ .compatible = "qcom,sdx65-rpmh-clk",  .data = &clk_rpmh_sdx65}, | ||||
|  | ||||
| @ -413,6 +413,7 @@ static const struct clk_ops clk_smd_rpm_branch_ops = { | ||||
| 	.recalc_rate	= clk_smd_rpm_recalc_rate, | ||||
| }; | ||||
| 
 | ||||
| DEFINE_CLK_SMD_RPM_BRANCH(sdm660, bi_tcxo, bi_tcxo_a, QCOM_SMD_RPM_MISC_CLK, 0, 19200000); | ||||
| DEFINE_CLK_SMD_RPM(msm8916, pcnoc_clk, pcnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 0); | ||||
| DEFINE_CLK_SMD_RPM(msm8916, snoc_clk, snoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 1); | ||||
| DEFINE_CLK_SMD_RPM(msm8916, bimc_clk, bimc_a_clk, QCOM_SMD_RPM_MEM_CLK, 0); | ||||
| @ -604,7 +605,11 @@ DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8992, ln_bb_clk, ln_bb_a_clk, 8, 19200000); | ||||
| DEFINE_CLK_SMD_RPM(msm8992, ce1_clk, ce1_a_clk, QCOM_SMD_RPM_CE_CLK, 0); | ||||
| DEFINE_CLK_SMD_RPM(msm8992, ce2_clk, ce2_a_clk, QCOM_SMD_RPM_CE_CLK, 1); | ||||
| 
 | ||||
| DEFINE_CLK_SMD_RPM_BRANCH(msm8992, mss_cfg_ahb_clk, mss_cfg_ahb_a_clk, | ||||
| 			  QCOM_SMD_RPM_MCFG_CLK, 0, 19200000); | ||||
| static struct clk_smd_rpm *msm8992_clks[] = { | ||||
| 	[RPM_SMD_XO_CLK_SRC] = &sdm660_bi_tcxo, | ||||
| 	[RPM_SMD_XO_A_CLK_SRC] = &sdm660_bi_tcxo_a, | ||||
| 	[RPM_SMD_PNOC_CLK] = &msm8916_pcnoc_clk, | ||||
| 	[RPM_SMD_PNOC_A_CLK] = &msm8916_pcnoc_a_clk, | ||||
| 	[RPM_SMD_OCMEMGX_CLK] = &msm8974_ocmemgx_clk, | ||||
| @ -637,6 +642,8 @@ static struct clk_smd_rpm *msm8992_clks[] = { | ||||
| 	[RPM_SMD_LN_BB_A_CLK] = &msm8992_ln_bb_a_clk, | ||||
| 	[RPM_SMD_MMSSNOC_AHB_CLK] = &msm8974_mmssnoc_ahb_clk, | ||||
| 	[RPM_SMD_MMSSNOC_AHB_A_CLK] = &msm8974_mmssnoc_ahb_a_clk, | ||||
| 	[RPM_SMD_MSS_CFG_AHB_CLK] = &msm8992_mss_cfg_ahb_clk, | ||||
| 	[RPM_SMD_MSS_CFG_AHB_A_CLK] = &msm8992_mss_cfg_ahb_a_clk, | ||||
| 	[RPM_SMD_QDSS_CLK] = &msm8916_qdss_clk, | ||||
| 	[RPM_SMD_QDSS_A_CLK] = &msm8916_qdss_a_clk, | ||||
| 	[RPM_SMD_RF_CLK1] = &msm8916_rf_clk1, | ||||
| @ -661,6 +668,8 @@ static const struct rpm_smd_clk_desc rpm_clk_msm8992 = { | ||||
| DEFINE_CLK_SMD_RPM(msm8994, ce3_clk, ce3_a_clk, QCOM_SMD_RPM_CE_CLK, 2); | ||||
| 
 | ||||
| static struct clk_smd_rpm *msm8994_clks[] = { | ||||
| 	[RPM_SMD_XO_CLK_SRC] = &sdm660_bi_tcxo, | ||||
| 	[RPM_SMD_XO_A_CLK_SRC] = &sdm660_bi_tcxo_a, | ||||
| 	[RPM_SMD_PNOC_CLK] = &msm8916_pcnoc_clk, | ||||
| 	[RPM_SMD_PNOC_A_CLK] = &msm8916_pcnoc_a_clk, | ||||
| 	[RPM_SMD_OCMEMGX_CLK] = &msm8974_ocmemgx_clk, | ||||
| @ -693,6 +702,8 @@ static struct clk_smd_rpm *msm8994_clks[] = { | ||||
| 	[RPM_SMD_LN_BB_A_CLK] = &msm8992_ln_bb_a_clk, | ||||
| 	[RPM_SMD_MMSSNOC_AHB_CLK] = &msm8974_mmssnoc_ahb_clk, | ||||
| 	[RPM_SMD_MMSSNOC_AHB_A_CLK] = &msm8974_mmssnoc_ahb_a_clk, | ||||
| 	[RPM_SMD_MSS_CFG_AHB_CLK] = &msm8992_mss_cfg_ahb_clk, | ||||
| 	[RPM_SMD_MSS_CFG_AHB_A_CLK] = &msm8992_mss_cfg_ahb_a_clk, | ||||
| 	[RPM_SMD_QDSS_CLK] = &msm8916_qdss_clk, | ||||
| 	[RPM_SMD_QDSS_A_CLK] = &msm8916_qdss_a_clk, | ||||
| 	[RPM_SMD_RF_CLK1] = &msm8916_rf_clk1, | ||||
| @ -805,15 +816,18 @@ static const struct rpm_smd_clk_desc rpm_clk_qcs404 = { | ||||
| 	.num_clks = ARRAY_SIZE(qcs404_clks), | ||||
| }; | ||||
| 
 | ||||
| DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8998, ln_bb_clk3_pin, ln_bb_clk3_a_pin, | ||||
| 				     3, 19200000); | ||||
| DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8998, ln_bb_clk3, ln_bb_clk3_a, 3, 19200000); | ||||
| DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8998, ln_bb_clk3_pin, ln_bb_clk3_a_pin, 3, 19200000); | ||||
| DEFINE_CLK_SMD_RPM(msm8998, aggre1_noc_clk, aggre1_noc_a_clk, | ||||
| 		   QCOM_SMD_RPM_AGGR_CLK, 1); | ||||
| DEFINE_CLK_SMD_RPM(msm8998, aggre2_noc_clk, aggre2_noc_a_clk, | ||||
| 		   QCOM_SMD_RPM_AGGR_CLK, 2); | ||||
| DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8998, rf_clk3, rf_clk3_a, 6, 19200000); | ||||
| DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8998, rf_clk3_pin, rf_clk3_a_pin, 6, 19200000); | ||||
| 
 | ||||
| static struct clk_smd_rpm *msm8998_clks[] = { | ||||
| 	[RPM_SMD_XO_CLK_SRC] = &sdm660_bi_tcxo, | ||||
| 	[RPM_SMD_XO_A_CLK_SRC] = &sdm660_bi_tcxo_a, | ||||
| 	[RPM_SMD_BIMC_CLK] = &msm8916_bimc_clk, | ||||
| 	[RPM_SMD_BIMC_A_CLK] = &msm8916_bimc_a_clk, | ||||
| 	[RPM_SMD_PCNOC_CLK] = &msm8916_pcnoc_clk, | ||||
| @ -826,12 +840,22 @@ static struct clk_smd_rpm *msm8998_clks[] = { | ||||
| 	[RPM_SMD_CE1_A_CLK] = &msm8992_ce1_a_clk, | ||||
| 	[RPM_SMD_DIV_CLK1] = &msm8974_div_clk1, | ||||
| 	[RPM_SMD_DIV_A_CLK1] = &msm8974_div_a_clk1, | ||||
| 	[RPM_SMD_DIV_CLK2] = &msm8974_div_clk2, | ||||
| 	[RPM_SMD_DIV_A_CLK2] = &msm8974_div_a_clk2, | ||||
| 	[RPM_SMD_DIV_CLK3] = &msm8992_div_clk3, | ||||
| 	[RPM_SMD_DIV_A_CLK3] = &msm8992_div_clk3_a, | ||||
| 	[RPM_SMD_IPA_CLK] = &msm8976_ipa_clk, | ||||
| 	[RPM_SMD_IPA_A_CLK] = &msm8976_ipa_a_clk, | ||||
| 	[RPM_SMD_LN_BB_CLK1] = &msm8916_bb_clk1, | ||||
| 	[RPM_SMD_LN_BB_CLK1_A] = &msm8916_bb_clk1_a, | ||||
| 	[RPM_SMD_LN_BB_CLK2] = &msm8916_bb_clk2, | ||||
| 	[RPM_SMD_LN_BB_CLK2_A] = &msm8916_bb_clk2_a, | ||||
| 	[RPM_SMD_LN_BB_CLK3] = &msm8998_ln_bb_clk3, | ||||
| 	[RPM_SMD_LN_BB_CLK3_A] = &msm8998_ln_bb_clk3_a, | ||||
| 	[RPM_SMD_LN_BB_CLK1_PIN] = &msm8916_bb_clk1_pin, | ||||
| 	[RPM_SMD_LN_BB_CLK1_A_PIN] = &msm8916_bb_clk1_a_pin, | ||||
| 	[RPM_SMD_LN_BB_CLK2_PIN] = &msm8916_bb_clk2_pin, | ||||
| 	[RPM_SMD_LN_BB_CLK2_A_PIN] = &msm8916_bb_clk2_a_pin, | ||||
| 	[RPM_SMD_LN_BB_CLK3_PIN] = &msm8998_ln_bb_clk3_pin, | ||||
| 	[RPM_SMD_LN_BB_CLK3_A_PIN] = &msm8998_ln_bb_clk3_a_pin, | ||||
| 	[RPM_SMD_MMAXI_CLK] = &msm8996_mmssnoc_axi_rpm_clk, | ||||
| @ -844,10 +868,14 @@ static struct clk_smd_rpm *msm8998_clks[] = { | ||||
| 	[RPM_SMD_QDSS_A_CLK] = &msm8916_qdss_a_clk, | ||||
| 	[RPM_SMD_RF_CLK1] = &msm8916_rf_clk1, | ||||
| 	[RPM_SMD_RF_CLK1_A] = &msm8916_rf_clk1_a, | ||||
| 	[RPM_SMD_RF_CLK2_PIN] = &msm8916_rf_clk2_pin, | ||||
| 	[RPM_SMD_RF_CLK2_A_PIN] = &msm8916_rf_clk2_a_pin, | ||||
| 	[RPM_SMD_RF_CLK2] = &msm8916_rf_clk2, | ||||
| 	[RPM_SMD_RF_CLK2_A] = &msm8916_rf_clk2_a, | ||||
| 	[RPM_SMD_RF_CLK3] = &msm8998_rf_clk3, | ||||
| 	[RPM_SMD_RF_CLK3_A] = &msm8998_rf_clk3_a, | ||||
| 	[RPM_SMD_RF_CLK1_PIN] = &msm8916_rf_clk1_pin, | ||||
| 	[RPM_SMD_RF_CLK1_A_PIN] = &msm8916_rf_clk1_a_pin, | ||||
| 	[RPM_SMD_RF_CLK2_PIN] = &msm8916_rf_clk2_pin, | ||||
| 	[RPM_SMD_RF_CLK2_A_PIN] = &msm8916_rf_clk2_a_pin, | ||||
| 	[RPM_SMD_RF_CLK3_PIN] = &msm8998_rf_clk3_pin, | ||||
| 	[RPM_SMD_RF_CLK3_A_PIN] = &msm8998_rf_clk3_a_pin, | ||||
| }; | ||||
| @ -857,11 +885,6 @@ static const struct rpm_smd_clk_desc rpm_clk_msm8998 = { | ||||
| 	.num_clks = ARRAY_SIZE(msm8998_clks), | ||||
| }; | ||||
| 
 | ||||
| DEFINE_CLK_SMD_RPM_BRANCH(sdm660, bi_tcxo, bi_tcxo_a, QCOM_SMD_RPM_MISC_CLK, 0, | ||||
| 								19200000); | ||||
| DEFINE_CLK_SMD_RPM_XO_BUFFER(sdm660, ln_bb_clk3, ln_bb_clk3_a, 3, 19200000); | ||||
| DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(sdm660, ln_bb_clk3_pin, ln_bb_clk3_pin_a, 3, 19200000); | ||||
| 
 | ||||
| static struct clk_smd_rpm *sdm660_clks[] = { | ||||
| 	[RPM_SMD_XO_CLK_SRC] = &sdm660_bi_tcxo, | ||||
| 	[RPM_SMD_XO_A_CLK_SRC] = &sdm660_bi_tcxo_a, | ||||
| @ -891,16 +914,16 @@ static struct clk_smd_rpm *sdm660_clks[] = { | ||||
| 	[RPM_SMD_LN_BB_A_CLK] = &msm8916_bb_clk1_a, | ||||
| 	[RPM_SMD_LN_BB_CLK2] = &msm8916_bb_clk2, | ||||
| 	[RPM_SMD_LN_BB_CLK2_A] = &msm8916_bb_clk2_a, | ||||
| 	[RPM_SMD_LN_BB_CLK3] = &sdm660_ln_bb_clk3, | ||||
| 	[RPM_SMD_LN_BB_CLK3_A] = &sdm660_ln_bb_clk3_a, | ||||
| 	[RPM_SMD_LN_BB_CLK3] = &msm8998_ln_bb_clk3, | ||||
| 	[RPM_SMD_LN_BB_CLK3_A] = &msm8998_ln_bb_clk3_a, | ||||
| 	[RPM_SMD_RF_CLK1_PIN] = &msm8916_rf_clk1_pin, | ||||
| 	[RPM_SMD_RF_CLK1_A_PIN] = &msm8916_rf_clk1_a_pin, | ||||
| 	[RPM_SMD_LN_BB_CLK1_PIN] = &msm8916_bb_clk1_pin, | ||||
| 	[RPM_SMD_LN_BB_CLK1_A_PIN] = &msm8916_bb_clk1_a_pin, | ||||
| 	[RPM_SMD_LN_BB_CLK2_PIN] = &msm8916_bb_clk2_pin, | ||||
| 	[RPM_SMD_LN_BB_CLK2_A_PIN] = &msm8916_bb_clk2_a_pin, | ||||
| 	[RPM_SMD_LN_BB_CLK3_PIN] = &sdm660_ln_bb_clk3_pin, | ||||
| 	[RPM_SMD_LN_BB_CLK3_A_PIN] = &sdm660_ln_bb_clk3_pin_a, | ||||
| 	[RPM_SMD_LN_BB_CLK3_PIN] = &msm8998_ln_bb_clk3_pin, | ||||
| 	[RPM_SMD_LN_BB_CLK3_A_PIN] = &msm8998_ln_bb_clk3_a_pin, | ||||
| }; | ||||
| 
 | ||||
| static const struct rpm_smd_clk_desc rpm_clk_sdm660 = { | ||||
| @ -1002,8 +1025,8 @@ static struct clk_smd_rpm *sm6125_clks[] = { | ||||
| 	[RPM_SMD_LN_BB_CLK1_A] = &msm8916_bb_clk1_a, | ||||
| 	[RPM_SMD_LN_BB_CLK2] = &msm8916_bb_clk2, | ||||
| 	[RPM_SMD_LN_BB_CLK2_A] = &msm8916_bb_clk2_a, | ||||
| 	[RPM_SMD_LN_BB_CLK3] = &sdm660_ln_bb_clk3, | ||||
| 	[RPM_SMD_LN_BB_CLK3_A] = &sdm660_ln_bb_clk3_a, | ||||
| 	[RPM_SMD_LN_BB_CLK3] = &msm8998_ln_bb_clk3, | ||||
| 	[RPM_SMD_LN_BB_CLK3_A] = &msm8998_ln_bb_clk3_a, | ||||
| 	[RPM_SMD_QUP_CLK] = &sm6125_qup_clk, | ||||
| 	[RPM_SMD_QUP_A_CLK] = &sm6125_qup_a_clk, | ||||
| 	[RPM_SMD_MMRT_CLK] = &sm6125_mmrt_clk, | ||||
|  | ||||
							
								
								
									
										555
									
								
								drivers/clk/qcom/dispcc-qcm2290.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										555
									
								
								drivers/clk/qcom/dispcc-qcm2290.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,555 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0-only
 | ||||
| /*
 | ||||
|  * Copyright (c) 2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2021, Linaro Ltd. | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/err.h> | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/of_device.h> | ||||
| #include <linux/of.h> | ||||
| #include <linux/regmap.h> | ||||
| 
 | ||||
| #include <dt-bindings/clock/qcom,dispcc-qcm2290.h> | ||||
| 
 | ||||
| #include "clk-alpha-pll.h" | ||||
| #include "clk-branch.h" | ||||
| #include "clk-rcg.h" | ||||
| #include "clk-regmap.h" | ||||
| #include "clk-regmap-divider.h" | ||||
| #include "common.h" | ||||
| #include "gdsc.h" | ||||
| 
 | ||||
| enum { | ||||
| 	P_BI_TCXO, | ||||
| 	P_DISP_CC_PLL0_OUT_MAIN, | ||||
| 	P_DSI0_PHY_PLL_OUT_BYTECLK, | ||||
| 	P_DSI0_PHY_PLL_OUT_DSICLK, | ||||
| 	P_DSI1_PHY_PLL_OUT_DSICLK, | ||||
| 	P_GPLL0_OUT_MAIN, | ||||
| 	P_SLEEP_CLK, | ||||
| }; | ||||
| 
 | ||||
| static const struct pll_vco spark_vco[] = { | ||||
| 	{ 500000000, 1000000000, 2 }, | ||||
| }; | ||||
| 
 | ||||
| /* 768MHz configuration */ | ||||
| static const struct alpha_pll_config disp_cc_pll0_config = { | ||||
| 	.l = 0x28, | ||||
| 	.alpha = 0x0, | ||||
| 	.alpha_en_mask = BIT(24), | ||||
| 	.vco_val = 0x2 << 20, | ||||
| 	.vco_mask = GENMASK(21, 20), | ||||
| 	.main_output_mask = BIT(0), | ||||
| 	.config_ctl_val = 0x4001055B, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_alpha_pll disp_cc_pll0 = { | ||||
| 	.offset = 0x0, | ||||
| 	.vco_table = spark_vco, | ||||
| 	.num_vco = ARRAY_SIZE(spark_vco), | ||||
| 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], | ||||
| 	.clkr = { | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_pll0", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.fw_name = "bi_tcxo", | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.ops = &clk_alpha_pll_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map disp_cc_parent_map_0[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| 	{ P_DSI0_PHY_PLL_OUT_BYTECLK, 1 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data disp_cc_parent_data_0[] = { | ||||
| 	{ .fw_name = "bi_tcxo" }, | ||||
| 	{ .fw_name = "dsi0_phy_pll_out_byteclk" }, | ||||
| 	{ .fw_name = "core_bi_pll_test_se" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map disp_cc_parent_map_1[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data disp_cc_parent_data_1[] = { | ||||
| 	{ .fw_name = "bi_tcxo" }, | ||||
| 	{ .fw_name = "core_bi_pll_test_se" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map disp_cc_parent_map_2[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| 	{ P_GPLL0_OUT_MAIN, 4 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data disp_cc_parent_data_2[] = { | ||||
| 	{ .fw_name = "bi_tcxo_ao" }, | ||||
| 	{ .fw_name = "gcc_disp_gpll0_div_clk_src" }, | ||||
| 	{ .fw_name = "core_bi_pll_test_se" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map disp_cc_parent_map_3[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| 	{ P_DISP_CC_PLL0_OUT_MAIN, 1 }, | ||||
| 	{ P_GPLL0_OUT_MAIN, 4 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data disp_cc_parent_data_3[] = { | ||||
| 	{ .fw_name = "bi_tcxo" }, | ||||
| 	{ .hw = &disp_cc_pll0.clkr.hw }, | ||||
| 	{ .fw_name = "gcc_disp_gpll0_clk_src" }, | ||||
| 	{ .fw_name = "core_bi_pll_test_se" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map disp_cc_parent_map_4[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| 	{ P_DSI0_PHY_PLL_OUT_DSICLK, 1 }, | ||||
| 	{ P_DSI1_PHY_PLL_OUT_DSICLK, 2 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data disp_cc_parent_data_4[] = { | ||||
| 	{ .fw_name = "bi_tcxo" }, | ||||
| 	{ .fw_name = "dsi0_phy_pll_out_dsiclk" }, | ||||
| 	{ .fw_name = "dsi1_phy_pll_out_dsiclk" }, | ||||
| 	{ .fw_name = "core_bi_pll_test_se" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map disp_cc_parent_map_5[] = { | ||||
| 	{ P_SLEEP_CLK, 0 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data disp_cc_parent_data_5[] = { | ||||
| 	{ .fw_name = "sleep_clk" }, | ||||
| 	{ .fw_name = "core_bi_pll_test_se" }, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = { | ||||
| 	.cmd_rcgr = 0x20a4, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_0, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_byte0_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_0), | ||||
| 		/* For set_rate and set_parent to succeed, parent(s) must be enabled */ | ||||
| 		.flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE, | ||||
| 		.ops = &clk_byte2_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = { | ||||
| 	.reg = 0x20bc, | ||||
| 	.shift = 0, | ||||
| 	.width = 2, | ||||
| 	.clkr.hw.init = &(struct clk_init_data) { | ||||
| 		.name = "disp_cc_mdss_byte0_div_clk_src", | ||||
| 		.parent_hws = (const struct clk_hw*[]){ | ||||
| 			&disp_cc_mdss_byte0_clk_src.clkr.hw, | ||||
| 		}, | ||||
| 		.num_parents = 1, | ||||
| 		.ops = &clk_regmap_div_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = { | ||||
| 	F(19200000, P_BI_TCXO, 1, 0, 0), | ||||
| 	F(37500000, P_GPLL0_OUT_MAIN, 8, 0, 0), | ||||
| 	F(75000000, P_GPLL0_OUT_MAIN, 4, 0, 0), | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = { | ||||
| 	.cmd_rcgr = 0x2154, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_2, | ||||
| 	.freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_ahb_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_2, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_2), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static const struct freq_tbl ftbl_disp_cc_mdss_esc0_clk_src[] = { | ||||
| 	F(19200000, P_BI_TCXO, 1, 0, 0), | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = { | ||||
| 	.cmd_rcgr = 0x20c0, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_0, | ||||
| 	.freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_esc0_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_0), | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = { | ||||
| 	F(19200000, P_BI_TCXO, 1, 0, 0), | ||||
| 	F(192000000, P_DISP_CC_PLL0_OUT_MAIN, 4, 0, 0), | ||||
| 	F(256000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), | ||||
| 	F(307200000, P_DISP_CC_PLL0_OUT_MAIN, 2.5, 0, 0), | ||||
| 	F(384000000, P_DISP_CC_PLL0_OUT_MAIN, 2, 0, 0), | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = { | ||||
| 	.cmd_rcgr = 0x2074, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_3, | ||||
| 	.freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_mdp_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_3, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_3), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = { | ||||
| 	.cmd_rcgr = 0x205c, | ||||
| 	.mnd_width = 8, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_4, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_pclk0_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_4, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_4), | ||||
| 		/* For set_rate and set_parent to succeed, parent(s) must be enabled */ | ||||
| 		.flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE, | ||||
| 		.ops = &clk_pixel_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = { | ||||
| 	.cmd_rcgr = 0x208c, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_1, | ||||
| 	.freq_tbl = ftbl_disp_cc_mdss_esc0_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_vsync_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_1, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_1), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static const struct freq_tbl ftbl_disp_cc_sleep_clk_src[] = { | ||||
| 	F(32764, P_SLEEP_CLK, 1, 0, 0), | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_sleep_clk_src = { | ||||
| 	.cmd_rcgr = 0x6050, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_5, | ||||
| 	.freq_tbl = ftbl_disp_cc_sleep_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_sleep_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_5, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_5), | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_ahb_clk = { | ||||
| 	.halt_reg = 0x2044, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x2044, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_ahb_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_ahb_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_byte0_clk = { | ||||
| 	.halt_reg = 0x201c, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x201c, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_byte0_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_byte0_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_byte0_intf_clk = { | ||||
| 	.halt_reg = 0x2020, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x2020, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_byte0_intf_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_byte0_div_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_esc0_clk = { | ||||
| 	.halt_reg = 0x2024, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x2024, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_esc0_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_esc0_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_mdp_clk = { | ||||
| 	.halt_reg = 0x2008, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x2008, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_mdp_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_mdp_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_mdp_lut_clk = { | ||||
| 	.halt_reg = 0x2010, | ||||
| 	.halt_check = BRANCH_HALT_VOTED, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x2010, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_mdp_lut_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_mdp_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_non_gdsc_ahb_clk = { | ||||
| 	.halt_reg = 0x4004, | ||||
| 	.halt_check = BRANCH_HALT_VOTED, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x4004, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_non_gdsc_ahb_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_ahb_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_pclk0_clk = { | ||||
| 	.halt_reg = 0x2004, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x2004, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_pclk0_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_pclk0_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_vsync_clk = { | ||||
| 	.halt_reg = 0x2018, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x2018, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_vsync_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_vsync_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_sleep_clk = { | ||||
| 	.halt_reg = 0x6068, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x6068, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_sleep_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_sleep_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct gdsc mdss_gdsc = { | ||||
| 	.gdscr = 0x3000, | ||||
| 	.pd = { | ||||
| 		.name = "mdss_gdsc", | ||||
| 	}, | ||||
| 	.pwrsts = PWRSTS_OFF_ON, | ||||
| 	.flags = HW_CTRL, | ||||
| }; | ||||
| 
 | ||||
| static struct gdsc *disp_cc_qcm2290_gdscs[] = { | ||||
| 	[MDSS_GDSC] = &mdss_gdsc, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_regmap *disp_cc_qcm2290_clocks[] = { | ||||
| 	[DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr, | ||||
| 	[DISP_CC_MDSS_AHB_CLK_SRC] = &disp_cc_mdss_ahb_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr, | ||||
| 	[DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] = &disp_cc_mdss_byte0_div_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr, | ||||
| 	[DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr, | ||||
| 	[DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr, | ||||
| 	[DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr, | ||||
| 	[DISP_CC_MDSS_NON_GDSC_AHB_CLK] = &disp_cc_mdss_non_gdsc_ahb_clk.clkr, | ||||
| 	[DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr, | ||||
| 	[DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr, | ||||
| 	[DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr, | ||||
| 	[DISP_CC_PLL0] = &disp_cc_pll0.clkr, | ||||
| 	[DISP_CC_SLEEP_CLK] = &disp_cc_sleep_clk.clkr, | ||||
| 	[DISP_CC_SLEEP_CLK_SRC] = &disp_cc_sleep_clk_src.clkr, | ||||
| }; | ||||
| 
 | ||||
| static const struct regmap_config disp_cc_qcm2290_regmap_config = { | ||||
| 	.reg_bits = 32, | ||||
| 	.reg_stride = 4, | ||||
| 	.val_bits = 32, | ||||
| 	.max_register = 0x10000, | ||||
| 	.fast_io = true, | ||||
| }; | ||||
| 
 | ||||
| static const struct qcom_cc_desc disp_cc_qcm2290_desc = { | ||||
| 	.config = &disp_cc_qcm2290_regmap_config, | ||||
| 	.clks = disp_cc_qcm2290_clocks, | ||||
| 	.num_clks = ARRAY_SIZE(disp_cc_qcm2290_clocks), | ||||
| 	.gdscs = disp_cc_qcm2290_gdscs, | ||||
| 	.num_gdscs = ARRAY_SIZE(disp_cc_qcm2290_gdscs), | ||||
| }; | ||||
| 
 | ||||
| static const struct of_device_id disp_cc_qcm2290_match_table[] = { | ||||
| 	{ .compatible = "qcom,qcm2290-dispcc" }, | ||||
| 	{ } | ||||
| }; | ||||
| MODULE_DEVICE_TABLE(of, disp_cc_qcm2290_match_table); | ||||
| 
 | ||||
| static int disp_cc_qcm2290_probe(struct platform_device *pdev) | ||||
| { | ||||
| 	struct regmap *regmap; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	regmap = qcom_cc_map(pdev, &disp_cc_qcm2290_desc); | ||||
| 	if (IS_ERR(regmap)) | ||||
| 		return PTR_ERR(regmap); | ||||
| 
 | ||||
| 	clk_alpha_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config); | ||||
| 
 | ||||
| 	/* Keep DISP_CC_XO_CLK always-ON */ | ||||
| 	regmap_update_bits(regmap, 0x604c, BIT(0), BIT(0)); | ||||
| 
 | ||||
| 	ret = qcom_cc_really_probe(pdev, &disp_cc_qcm2290_desc, regmap); | ||||
| 	if (ret) { | ||||
| 		dev_err(&pdev->dev, "Failed to register DISP CC clocks\n"); | ||||
| 		return ret; | ||||
| 	} | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| static struct platform_driver disp_cc_qcm2290_driver = { | ||||
| 	.probe = disp_cc_qcm2290_probe, | ||||
| 	.driver = { | ||||
| 		.name = "dispcc-qcm2290", | ||||
| 		.of_match_table = disp_cc_qcm2290_match_table, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static int __init disp_cc_qcm2290_init(void) | ||||
| { | ||||
| 	return platform_driver_register(&disp_cc_qcm2290_driver); | ||||
| } | ||||
| subsys_initcall(disp_cc_qcm2290_init); | ||||
| 
 | ||||
| static void __exit disp_cc_qcm2290_exit(void) | ||||
| { | ||||
| 	platform_driver_unregister(&disp_cc_qcm2290_driver); | ||||
| } | ||||
| module_exit(disp_cc_qcm2290_exit); | ||||
| 
 | ||||
| MODULE_DESCRIPTION("QTI DISP_CC qcm2290 Driver"); | ||||
| MODULE_LICENSE("GPL v2"); | ||||
							
								
								
									
										709
									
								
								drivers/clk/qcom/dispcc-sm6125.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										709
									
								
								drivers/clk/qcom/dispcc-sm6125.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,709 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0-only
 | ||||
| /*
 | ||||
|  * Copyright (c) 2021, The Linux Foundation. All rights reserved. | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/clk-provider.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/regmap.h> | ||||
| 
 | ||||
| #include <dt-bindings/clock/qcom,dispcc-sm6125.h> | ||||
| 
 | ||||
| #include "clk-alpha-pll.h" | ||||
| #include "clk-branch.h" | ||||
| #include "clk-rcg.h" | ||||
| #include "clk-regmap.h" | ||||
| #include "common.h" | ||||
| #include "gdsc.h" | ||||
| 
 | ||||
| enum { | ||||
| 	P_BI_TCXO, | ||||
| 	P_DISP_CC_PLL0_OUT_MAIN, | ||||
| 	P_DP_PHY_PLL_LINK_CLK, | ||||
| 	P_DP_PHY_PLL_VCO_DIV_CLK, | ||||
| 	P_DSI0_PHY_PLL_OUT_BYTECLK, | ||||
| 	P_DSI0_PHY_PLL_OUT_DSICLK, | ||||
| 	P_DSI1_PHY_PLL_OUT_DSICLK, | ||||
| 	P_GPLL0_OUT_MAIN, | ||||
| }; | ||||
| 
 | ||||
| static struct pll_vco disp_cc_pll_vco[] = { | ||||
| 	{ 500000000, 1000000000, 2 }, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_alpha_pll disp_cc_pll0 = { | ||||
| 	.offset = 0x0, | ||||
| 	.vco_table = disp_cc_pll_vco, | ||||
| 	.num_vco = ARRAY_SIZE(disp_cc_pll_vco), | ||||
| 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], | ||||
| 	.flags = SUPPORTS_DYNAMIC_UPDATE, | ||||
| 	.clkr = { | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_pll0", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.fw_name = "bi_tcxo", | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.ops = &clk_alpha_pll_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| /* 768MHz configuration */ | ||||
| static const struct alpha_pll_config disp_cc_pll0_config = { | ||||
| 	.l = 0x28, | ||||
| 	.vco_val = 0x2 << 20, | ||||
| 	.vco_mask = 0x3 << 20, | ||||
| 	.main_output_mask = BIT(0), | ||||
| 	.config_ctl_val = 0x4001055b, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map disp_cc_parent_map_0[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data disp_cc_parent_data_0[] = { | ||||
| 	{ .fw_name = "bi_tcxo" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map disp_cc_parent_map_1[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| 	{ P_DP_PHY_PLL_LINK_CLK, 1 }, | ||||
| 	{ P_DP_PHY_PLL_VCO_DIV_CLK, 2 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data disp_cc_parent_data_1[] = { | ||||
| 	{ .fw_name = "bi_tcxo" }, | ||||
| 	{ .fw_name = "dp_phy_pll_link_clk" }, | ||||
| 	{ .fw_name = "dp_phy_pll_vco_div_clk" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map disp_cc_parent_map_2[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| 	{ P_DSI0_PHY_PLL_OUT_BYTECLK, 1 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data disp_cc_parent_data_2[] = { | ||||
| 	{ .fw_name = "bi_tcxo" }, | ||||
| 	{ .fw_name = "dsi0_phy_pll_out_byteclk" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map disp_cc_parent_map_3[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| 	{ P_DISP_CC_PLL0_OUT_MAIN, 1 }, | ||||
| 	{ P_GPLL0_OUT_MAIN, 4 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data disp_cc_parent_data_3[] = { | ||||
| 	{ .fw_name = "bi_tcxo" }, | ||||
| 	{ .hw = &disp_cc_pll0.clkr.hw }, | ||||
| 	{ .fw_name = "gcc_disp_gpll0_div_clk_src" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map disp_cc_parent_map_4[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| 	{ P_GPLL0_OUT_MAIN, 4 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data disp_cc_parent_data_4[] = { | ||||
| 	{ .fw_name = "bi_tcxo" }, | ||||
| 	{ .fw_name = "gcc_disp_gpll0_div_clk_src" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map disp_cc_parent_map_5[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| 	{ P_DSI0_PHY_PLL_OUT_DSICLK, 1 }, | ||||
| 	{ P_DSI1_PHY_PLL_OUT_DSICLK, 2 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data disp_cc_parent_data_5[] = { | ||||
| 	{ .fw_name = "bi_tcxo" }, | ||||
| 	{ .fw_name = "dsi0_phy_pll_out_dsiclk" }, | ||||
| 	{ .fw_name = "dsi1_phy_pll_out_dsiclk" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = { | ||||
| 	F(19200000, P_BI_TCXO, 1, 0, 0), | ||||
| 	F(37500000, P_GPLL0_OUT_MAIN, 16, 0, 0), | ||||
| 	F(75000000, P_GPLL0_OUT_MAIN, 8, 0, 0), | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = { | ||||
| 	.cmd_rcgr = 0x2154, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_4, | ||||
| 	.freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_ahb_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_4, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_4), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = { | ||||
| 	.cmd_rcgr = 0x20bc, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_2, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_byte0_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_2, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_2), | ||||
| 		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE, | ||||
| 		.ops = &clk_byte2_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static const struct freq_tbl ftbl_disp_cc_mdss_dp_aux1_clk_src[] = { | ||||
| 	F(19200000, P_BI_TCXO, 1, 0, 0), | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_dp_aux_clk_src = { | ||||
| 	.cmd_rcgr = 0x213c, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_0, | ||||
| 	.freq_tbl = ftbl_disp_cc_mdss_dp_aux1_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_dp_aux_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_0), | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static const struct freq_tbl ftbl_disp_cc_mdss_dp_crypto_clk_src[] = { | ||||
| 	F( 180000, P_DP_PHY_PLL_LINK_CLK,   1.5,   0,   0), | ||||
| 	F( 360000, P_DP_PHY_PLL_LINK_CLK,   1.5,   0,   0), | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_dp_crypto_clk_src = { | ||||
| 	.cmd_rcgr = 0x210c, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_1, | ||||
| 	.freq_tbl = ftbl_disp_cc_mdss_dp_crypto_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_dp_crypto_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_1, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_1), | ||||
| 		.flags = CLK_GET_RATE_NOCACHE, | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static const struct freq_tbl ftbl_disp_cc_mdss_dp_link_clk_src[] = { | ||||
| 	F( 162000, P_DP_PHY_PLL_LINK_CLK,   1,   0,   0), | ||||
| 	F( 270000, P_DP_PHY_PLL_LINK_CLK,   1,   0,   0), | ||||
| 	F( 540000, P_DP_PHY_PLL_LINK_CLK,   1,   0,   0), | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_dp_link_clk_src = { | ||||
| 	.cmd_rcgr = 0x20f0, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_1, | ||||
| 	.freq_tbl = ftbl_disp_cc_mdss_dp_link_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_dp_link_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_1, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_1), | ||||
| 		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE, | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_dp_pixel_clk_src = { | ||||
| 	.cmd_rcgr = 0x2124, | ||||
| 	.mnd_width = 16, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_1, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_dp_pixel_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_1, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_1), | ||||
| 		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE, | ||||
| 		.ops = &clk_dp_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = { | ||||
| 	.cmd_rcgr = 0x20d8, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_2, | ||||
| 	.freq_tbl = ftbl_disp_cc_mdss_dp_aux1_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_esc0_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_2, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_2), | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = { | ||||
| 	F(19200000, P_BI_TCXO, 1, 0, 0), | ||||
| 	F(192000000, P_DISP_CC_PLL0_OUT_MAIN, 4, 0, 0), | ||||
| 	F(256000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), | ||||
| 	F(307200000, P_DISP_CC_PLL0_OUT_MAIN, 2.5, 0, 0), | ||||
| 	F(384000000, P_DISP_CC_PLL0_OUT_MAIN, 2, 0, 0), | ||||
| 	F(400000000, P_GPLL0_OUT_MAIN, 1.5, 0, 0), | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = { | ||||
| 	.cmd_rcgr = 0x2074, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_3, | ||||
| 	.freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_mdp_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_3, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_3), | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = { | ||||
| 	.cmd_rcgr = 0x205c, | ||||
| 	.mnd_width = 8, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_5, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_pclk0_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_5, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_5), | ||||
| 		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE, | ||||
| 		.ops = &clk_pixel_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static const struct freq_tbl ftbl_disp_cc_mdss_rot_clk_src[] = { | ||||
| 	F(19200000, P_BI_TCXO, 1, 0, 0), | ||||
| 	F(192000000, P_DISP_CC_PLL0_OUT_MAIN, 4, 0, 0), | ||||
| 	F(256000000, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), | ||||
| 	F(307200000, P_DISP_CC_PLL0_OUT_MAIN, 2.5, 0, 0), | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_rot_clk_src = { | ||||
| 	.cmd_rcgr = 0x208c, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_3, | ||||
| 	.freq_tbl = ftbl_disp_cc_mdss_rot_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_rot_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_3, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_3), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_shared_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = { | ||||
| 	.cmd_rcgr = 0x20a4, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_0, | ||||
| 	.freq_tbl = ftbl_disp_cc_mdss_dp_aux1_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_vsync_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_0), | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_ahb_clk = { | ||||
| 	.halt_reg = 0x2044, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x2044, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_ahb_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_ahb_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_byte0_clk = { | ||||
| 	.halt_reg = 0x2024, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x2024, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_byte0_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_byte0_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_byte0_intf_clk = { | ||||
| 	.halt_reg = 0x2028, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x2028, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_byte0_intf_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_byte0_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_GET_RATE_NOCACHE, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_dp_aux_clk = { | ||||
| 	.halt_reg = 0x2040, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x2040, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_dp_aux_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_dp_aux_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_dp_crypto_clk = { | ||||
| 	.halt_reg = 0x2038, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x2038, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_dp_crypto_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_dp_crypto_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_dp_link_clk = { | ||||
| 	.halt_reg = 0x2030, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x2030, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_dp_link_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_dp_link_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_dp_link_intf_clk = { | ||||
| 	.halt_reg = 0x2034, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x2034, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_dp_link_intf_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_dp_link_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_GET_RATE_NOCACHE, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_dp_pixel_clk = { | ||||
| 	.halt_reg = 0x203c, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x203c, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_dp_pixel_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_dp_pixel_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_esc0_clk = { | ||||
| 	.halt_reg = 0x202c, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x202c, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_esc0_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_esc0_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_mdp_clk = { | ||||
| 	.halt_reg = 0x2008, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x2008, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_mdp_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_mdp_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_mdp_lut_clk = { | ||||
| 	.halt_reg = 0x2018, | ||||
| 	.halt_check = BRANCH_VOTED, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x2018, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_mdp_lut_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_mdp_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_non_gdsc_ahb_clk = { | ||||
| 	.halt_reg = 0x4004, | ||||
| 	.halt_check = BRANCH_VOTED, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x4004, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_non_gdsc_ahb_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_ahb_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_pclk0_clk = { | ||||
| 	.halt_reg = 0x2004, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x2004, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_pclk0_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_pclk0_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_rot_clk = { | ||||
| 	.halt_reg = 0x2010, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x2010, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_rot_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_rot_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_vsync_clk = { | ||||
| 	.halt_reg = 0x2020, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x2020, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_vsync_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_vsync_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_xo_clk = { | ||||
| 	.halt_reg = 0x604c, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x604c, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_xo_clk", | ||||
| 			.flags = CLK_IS_CRITICAL, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct gdsc mdss_gdsc = { | ||||
| 	.gdscr = 0x3000, | ||||
| 	.pd = { | ||||
| 		.name = "mdss_gdsc", | ||||
| 	}, | ||||
| 	.pwrsts = PWRSTS_OFF_ON, | ||||
| 	.flags = HW_CTRL, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_regmap *disp_cc_sm6125_clocks[] = { | ||||
| 	[DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr, | ||||
| 	[DISP_CC_MDSS_AHB_CLK_SRC] = &disp_cc_mdss_ahb_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr, | ||||
| 	[DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr, | ||||
| 	[DISP_CC_MDSS_DP_AUX_CLK] = &disp_cc_mdss_dp_aux_clk.clkr, | ||||
| 	[DISP_CC_MDSS_DP_AUX_CLK_SRC] = &disp_cc_mdss_dp_aux_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_DP_CRYPTO_CLK] = &disp_cc_mdss_dp_crypto_clk.clkr, | ||||
| 	[DISP_CC_MDSS_DP_CRYPTO_CLK_SRC] = &disp_cc_mdss_dp_crypto_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_DP_LINK_CLK] = &disp_cc_mdss_dp_link_clk.clkr, | ||||
| 	[DISP_CC_MDSS_DP_LINK_CLK_SRC] = &disp_cc_mdss_dp_link_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_DP_LINK_INTF_CLK] = &disp_cc_mdss_dp_link_intf_clk.clkr, | ||||
| 	[DISP_CC_MDSS_DP_PIXEL_CLK] = &disp_cc_mdss_dp_pixel_clk.clkr, | ||||
| 	[DISP_CC_MDSS_DP_PIXEL_CLK_SRC] = &disp_cc_mdss_dp_pixel_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr, | ||||
| 	[DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr, | ||||
| 	[DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr, | ||||
| 	[DISP_CC_MDSS_NON_GDSC_AHB_CLK] = &disp_cc_mdss_non_gdsc_ahb_clk.clkr, | ||||
| 	[DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr, | ||||
| 	[DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_ROT_CLK] = &disp_cc_mdss_rot_clk.clkr, | ||||
| 	[DISP_CC_MDSS_ROT_CLK_SRC] = &disp_cc_mdss_rot_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr, | ||||
| 	[DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr, | ||||
| 	[DISP_CC_PLL0] = &disp_cc_pll0.clkr, | ||||
| 	[DISP_CC_XO_CLK] = &disp_cc_xo_clk.clkr, | ||||
| }; | ||||
| 
 | ||||
| static struct gdsc *disp_cc_sm6125_gdscs[] = { | ||||
| 	[MDSS_GDSC] = &mdss_gdsc, | ||||
| }; | ||||
| 
 | ||||
| static const struct regmap_config disp_cc_sm6125_regmap_config = { | ||||
| 	.reg_bits = 32, | ||||
| 	.reg_stride = 4, | ||||
| 	.val_bits = 32, | ||||
| 	.max_register = 0x10000, | ||||
| 	.fast_io = true, | ||||
| }; | ||||
| 
 | ||||
| static const struct qcom_cc_desc disp_cc_sm6125_desc = { | ||||
| 	.config = &disp_cc_sm6125_regmap_config, | ||||
| 	.clks = disp_cc_sm6125_clocks, | ||||
| 	.num_clks = ARRAY_SIZE(disp_cc_sm6125_clocks), | ||||
| 	.gdscs = disp_cc_sm6125_gdscs, | ||||
| 	.num_gdscs = ARRAY_SIZE(disp_cc_sm6125_gdscs), | ||||
| }; | ||||
| 
 | ||||
| static const struct of_device_id disp_cc_sm6125_match_table[] = { | ||||
| 	{ .compatible = "qcom,dispcc-sm6125" }, | ||||
| 	{ } | ||||
| }; | ||||
| MODULE_DEVICE_TABLE(of, disp_cc_sm6125_match_table); | ||||
| 
 | ||||
| static int disp_cc_sm6125_probe(struct platform_device *pdev) | ||||
| { | ||||
| 	struct regmap *regmap; | ||||
| 
 | ||||
| 	regmap = qcom_cc_map(pdev, &disp_cc_sm6125_desc); | ||||
| 	if (IS_ERR(regmap)) | ||||
| 		return PTR_ERR(regmap); | ||||
| 
 | ||||
| 	clk_alpha_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config); | ||||
| 
 | ||||
| 	return qcom_cc_really_probe(pdev, &disp_cc_sm6125_desc, regmap); | ||||
| } | ||||
| 
 | ||||
| static struct platform_driver disp_cc_sm6125_driver = { | ||||
| 	.probe = disp_cc_sm6125_probe, | ||||
| 	.driver = { | ||||
| 		.name = "disp_cc-sm6125", | ||||
| 		.of_match_table = disp_cc_sm6125_match_table, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static int __init disp_cc_sm6125_init(void) | ||||
| { | ||||
| 	return platform_driver_register(&disp_cc_sm6125_driver); | ||||
| } | ||||
| subsys_initcall(disp_cc_sm6125_init); | ||||
| 
 | ||||
| static void __exit disp_cc_sm6125_exit(void) | ||||
| { | ||||
| 	platform_driver_unregister(&disp_cc_sm6125_driver); | ||||
| } | ||||
| module_exit(disp_cc_sm6125_exit); | ||||
| 
 | ||||
| MODULE_DESCRIPTION("QTI DISPCC SM6125 Driver"); | ||||
| MODULE_LICENSE("GPL v2"); | ||||
							
								
								
									
										797
									
								
								drivers/clk/qcom/dispcc-sm6350.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										797
									
								
								drivers/clk/qcom/dispcc-sm6350.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,797 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0-only
 | ||||
| /*
 | ||||
|  * Copyright (c) 2021, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2021, Konrad Dybcio <konrad.dybcio@somainline.org> | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/clk-provider.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/regmap.h> | ||||
| 
 | ||||
| #include <dt-bindings/clock/qcom,dispcc-sm6350.h> | ||||
| 
 | ||||
| #include "clk-alpha-pll.h" | ||||
| #include "clk-branch.h" | ||||
| #include "clk-rcg.h" | ||||
| #include "clk-regmap.h" | ||||
| #include "clk-regmap-divider.h" | ||||
| #include "common.h" | ||||
| #include "gdsc.h" | ||||
| #include "reset.h" | ||||
| 
 | ||||
| enum { | ||||
| 	P_BI_TCXO, | ||||
| 	P_DISP_CC_PLL0_OUT_EVEN, | ||||
| 	P_DISP_CC_PLL0_OUT_MAIN, | ||||
| 	P_DP_PHY_PLL_LINK_CLK, | ||||
| 	P_DP_PHY_PLL_VCO_DIV_CLK, | ||||
| 	P_DSI0_PHY_PLL_OUT_BYTECLK, | ||||
| 	P_DSI0_PHY_PLL_OUT_DSICLK, | ||||
| 	P_GCC_DISP_GPLL0_CLK, | ||||
| }; | ||||
| 
 | ||||
| static struct pll_vco fabia_vco[] = { | ||||
| 	{ 249600000, 2000000000, 0 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct alpha_pll_config disp_cc_pll0_config = { | ||||
| 	.l = 0x3a, | ||||
| 	.alpha = 0x5555, | ||||
| 	.config_ctl_val = 0x20485699, | ||||
| 	.config_ctl_hi_val = 0x00002067, | ||||
| 	.test_ctl_val = 0x40000000, | ||||
| 	.test_ctl_hi_val = 0x00000002, | ||||
| 	.user_ctl_val = 0x00000000, | ||||
| 	.user_ctl_hi_val = 0x00004805, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_alpha_pll disp_cc_pll0 = { | ||||
| 	.offset = 0x0, | ||||
| 	.vco_table = fabia_vco, | ||||
| 	.num_vco = ARRAY_SIZE(fabia_vco), | ||||
| 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], | ||||
| 	.clkr = { | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_pll0", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.fw_name = "bi_tcxo", | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.ops = &clk_alpha_pll_fabia_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map disp_cc_parent_map_0[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| 	{ P_DP_PHY_PLL_LINK_CLK, 1 }, | ||||
| 	{ P_DP_PHY_PLL_VCO_DIV_CLK, 2 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data disp_cc_parent_data_0[] = { | ||||
| 	{ .fw_name = "bi_tcxo" }, | ||||
| 	{ .fw_name = "dp_phy_pll_link_clk" }, | ||||
| 	{ .fw_name = "dp_phy_pll_vco_div_clk" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map disp_cc_parent_map_1[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| 	{ P_DSI0_PHY_PLL_OUT_BYTECLK, 1 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data disp_cc_parent_data_1[] = { | ||||
| 	{ .fw_name = "bi_tcxo" }, | ||||
| 	{ .fw_name = "dsi0_phy_pll_out_byteclk" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map disp_cc_parent_map_3[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| 	{ P_DISP_CC_PLL0_OUT_MAIN, 1 }, | ||||
| 	{ P_GCC_DISP_GPLL0_CLK, 4 }, | ||||
| 	{ P_DISP_CC_PLL0_OUT_EVEN, 5 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data disp_cc_parent_data_3[] = { | ||||
| 	{ .fw_name = "bi_tcxo" }, | ||||
| 	{ .hw = &disp_cc_pll0.clkr.hw }, | ||||
| 	{ .fw_name = "gcc_disp_gpll0_clk" }, | ||||
| 	{ .hw = &disp_cc_pll0.clkr.hw }, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map disp_cc_parent_map_4[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| 	{ P_GCC_DISP_GPLL0_CLK, 4 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data disp_cc_parent_data_4[] = { | ||||
| 	{ .fw_name = "bi_tcxo" }, | ||||
| 	{ .fw_name = "gcc_disp_gpll0_clk" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map disp_cc_parent_map_5[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| 	{ P_DSI0_PHY_PLL_OUT_DSICLK, 1 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data disp_cc_parent_data_5[] = { | ||||
| 	{ .fw_name = "bi_tcxo" }, | ||||
| 	{ .fw_name = "dsi0_phy_pll_out_dsiclk" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map disp_cc_parent_map_6[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data disp_cc_parent_data_6[] = { | ||||
| 	{ .fw_name = "bi_tcxo" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct freq_tbl ftbl_disp_cc_mdss_ahb_clk_src[] = { | ||||
| 	F(19200000, P_BI_TCXO, 1, 0, 0), | ||||
| 	F(37500000, P_GCC_DISP_GPLL0_CLK, 16, 0, 0), | ||||
| 	F(75000000, P_GCC_DISP_GPLL0_CLK, 8, 0, 0), | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_ahb_clk_src = { | ||||
| 	.cmd_rcgr = 0x115c, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_4, | ||||
| 	.freq_tbl = ftbl_disp_cc_mdss_ahb_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_ahb_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_4, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_4), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_byte0_clk_src = { | ||||
| 	.cmd_rcgr = 0x10c4, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_1, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_byte0_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_1, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_1), | ||||
| 		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE, | ||||
| 		.ops = &clk_byte2_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = { | ||||
| 	.reg = 0x10dc, | ||||
| 	.shift = 0, | ||||
| 	.width = 2, | ||||
| 	.clkr.hw.init = &(struct clk_init_data) { | ||||
| 		.name = "disp_cc_mdss_byte0_div_clk_src", | ||||
| 		.parent_hws = (const struct clk_hw*[]){ | ||||
| 			&disp_cc_mdss_byte0_clk_src.clkr.hw, | ||||
| 		}, | ||||
| 		.num_parents = 1, | ||||
| 		.flags = CLK_GET_RATE_NOCACHE, | ||||
| 		.ops = &clk_regmap_div_ro_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static const struct freq_tbl ftbl_disp_cc_mdss_dp_aux_clk_src[] = { | ||||
| 	F(19200000, P_BI_TCXO, 1, 0, 0), | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_dp_aux_clk_src = { | ||||
| 	.cmd_rcgr = 0x1144, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_dp_aux_clk_src", | ||||
| 		.parent_data = &(const struct clk_parent_data){ | ||||
| 			.fw_name = "bi_tcxo", | ||||
| 		}, | ||||
| 		.num_parents = 1, | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static const struct freq_tbl ftbl_disp_cc_mdss_dp_crypto_clk_src[] = { | ||||
| 	F(108000, P_DP_PHY_PLL_LINK_CLK, 3, 0, 0), | ||||
| 	F(180000, P_DP_PHY_PLL_LINK_CLK, 3, 0, 0), | ||||
| 	F(360000, P_DP_PHY_PLL_LINK_CLK, 1.5, 0, 0), | ||||
| 	F(540000, P_DP_PHY_PLL_LINK_CLK, 1.5, 0, 0), | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_dp_crypto_clk_src = { | ||||
| 	.cmd_rcgr = 0x1114, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_0, | ||||
| 	.freq_tbl = ftbl_disp_cc_mdss_dp_crypto_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_dp_crypto_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_0), | ||||
| 		.flags = CLK_GET_RATE_NOCACHE, | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static const struct freq_tbl ftbl_disp_cc_mdss_dp_link_clk_src[] = { | ||||
| 	F(162000, P_DP_PHY_PLL_LINK_CLK, 1, 0, 0), | ||||
| 	F(270000, P_DP_PHY_PLL_LINK_CLK, 1, 0, 0), | ||||
| 	F(540000, P_DP_PHY_PLL_LINK_CLK, 1, 0, 0), | ||||
| 	F(810000, P_DP_PHY_PLL_LINK_CLK, 1, 0, 0), | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_dp_link_clk_src = { | ||||
| 	.cmd_rcgr = 0x10f8, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_0, | ||||
| 	.freq_tbl = ftbl_disp_cc_mdss_dp_link_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_dp_link_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_0), | ||||
| 		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE, | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_dp_pixel_clk_src = { | ||||
| 	.cmd_rcgr = 0x112c, | ||||
| 	.mnd_width = 16, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_0, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_dp_pixel_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_0), | ||||
| 		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE, | ||||
| 		.ops = &clk_dp_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = { | ||||
| 	.cmd_rcgr = 0x10e0, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_1, | ||||
| 	.freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_esc0_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_1, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_1), | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static const struct freq_tbl ftbl_disp_cc_mdss_mdp_clk_src[] = { | ||||
| 	F(19200000, P_BI_TCXO, 1, 0, 0), | ||||
| 	F(200000000, P_GCC_DISP_GPLL0_CLK, 3, 0, 0), | ||||
| 	F(300000000, P_GCC_DISP_GPLL0_CLK, 2, 0, 0), | ||||
| 	F(373333333, P_DISP_CC_PLL0_OUT_MAIN, 3, 0, 0), | ||||
| 	F(448000000, P_DISP_CC_PLL0_OUT_MAIN, 2.5, 0, 0), | ||||
| 	F(560000000, P_DISP_CC_PLL0_OUT_MAIN, 2, 0, 0), | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_mdp_clk_src = { | ||||
| 	.cmd_rcgr = 0x107c, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_3, | ||||
| 	.freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_mdp_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_3, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_3), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = { | ||||
| 	.cmd_rcgr = 0x1064, | ||||
| 	.mnd_width = 8, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_5, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_pclk0_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_5, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_5), | ||||
| 		.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE, | ||||
| 		.ops = &clk_pixel_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_rot_clk_src = { | ||||
| 	.cmd_rcgr = 0x1094, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_3, | ||||
| 	.freq_tbl = ftbl_disp_cc_mdss_mdp_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_rot_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_3, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_3), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = { | ||||
| 	.cmd_rcgr = 0x10ac, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = disp_cc_parent_map_6, | ||||
| 	.freq_tbl = ftbl_disp_cc_mdss_dp_aux_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "disp_cc_mdss_vsync_clk_src", | ||||
| 		.parent_data = disp_cc_parent_data_6, | ||||
| 		.num_parents = ARRAY_SIZE(disp_cc_parent_data_6), | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_regmap_div disp_cc_mdss_dp_link_div_clk_src = { | ||||
| 	.reg = 0x1110, | ||||
| 	.shift = 0, | ||||
| 	.width = 2, | ||||
| 	.clkr.hw.init = &(struct clk_init_data) { | ||||
| 		.name = "disp_cc_mdss_dp_link_div_clk_src", | ||||
| 		.parent_hws = (const struct clk_hw*[]){ | ||||
| 			&disp_cc_mdss_dp_link_clk_src.clkr.hw, | ||||
| 		}, | ||||
| 		.num_parents = 1, | ||||
| 		.flags = CLK_GET_RATE_NOCACHE, | ||||
| 		.ops = &clk_regmap_div_ro_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_ahb_clk = { | ||||
| 	.halt_reg = 0x104c, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x104c, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_ahb_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_ahb_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_byte0_clk = { | ||||
| 	.halt_reg = 0x102c, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x102c, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_byte0_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_byte0_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_byte0_intf_clk = { | ||||
| 	.halt_reg = 0x1030, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x1030, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_byte0_intf_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_byte0_div_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_dp_aux_clk = { | ||||
| 	.halt_reg = 0x1048, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x1048, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_dp_aux_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_dp_aux_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_dp_crypto_clk = { | ||||
| 	.halt_reg = 0x1040, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x1040, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_dp_crypto_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_dp_crypto_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_dp_link_clk = { | ||||
| 	.halt_reg = 0x1038, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x1038, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_dp_link_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_dp_link_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_dp_link_intf_clk = { | ||||
| 	.halt_reg = 0x103c, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x103c, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_dp_link_intf_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_dp_link_div_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_dp_pixel_clk = { | ||||
| 	.halt_reg = 0x1044, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x1044, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_dp_pixel_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_dp_pixel_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_esc0_clk = { | ||||
| 	.halt_reg = 0x1034, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x1034, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_esc0_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_esc0_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_mdp_clk = { | ||||
| 	.halt_reg = 0x1010, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x1010, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_mdp_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_mdp_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_mdp_lut_clk = { | ||||
| 	.halt_reg = 0x1020, | ||||
| 	.halt_check = BRANCH_HALT_VOTED, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x1020, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_mdp_lut_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_mdp_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_non_gdsc_ahb_clk = { | ||||
| 	.halt_reg = 0x2004, | ||||
| 	.halt_check = BRANCH_HALT_VOTED, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x2004, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_non_gdsc_ahb_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_ahb_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_pclk0_clk = { | ||||
| 	.halt_reg = 0x100c, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x100c, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_pclk0_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_pclk0_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_rot_clk = { | ||||
| 	.halt_reg = 0x1018, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x1018, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_rot_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_rot_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_rscc_ahb_clk = { | ||||
| 	.halt_reg = 0x200c, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x200c, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_rscc_ahb_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_ahb_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_rscc_vsync_clk = { | ||||
| 	.halt_reg = 0x2008, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x2008, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_rscc_vsync_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_vsync_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_mdss_vsync_clk = { | ||||
| 	.halt_reg = 0x1028, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x1028, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_mdss_vsync_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&disp_cc_mdss_vsync_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_sleep_clk = { | ||||
| 	.halt_reg = 0x5004, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x5004, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_sleep_clk", | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch disp_cc_xo_clk = { | ||||
| 	.halt_reg = 0x5008, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x5008, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "disp_cc_xo_clk", | ||||
| 			.flags = CLK_IS_CRITICAL, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct gdsc mdss_gdsc = { | ||||
| 	.gdscr = 0x1004, | ||||
| 	.pd = { | ||||
| 		.name = "mdss_gdsc", | ||||
| 	}, | ||||
| 	.pwrsts = PWRSTS_OFF_ON, | ||||
| 	.flags = RETAIN_FF_ENABLE, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_regmap *disp_cc_sm6350_clocks[] = { | ||||
| 	[DISP_CC_MDSS_AHB_CLK] = &disp_cc_mdss_ahb_clk.clkr, | ||||
| 	[DISP_CC_MDSS_AHB_CLK_SRC] = &disp_cc_mdss_ahb_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_BYTE0_CLK] = &disp_cc_mdss_byte0_clk.clkr, | ||||
| 	[DISP_CC_MDSS_BYTE0_CLK_SRC] = &disp_cc_mdss_byte0_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_BYTE0_DIV_CLK_SRC] = &disp_cc_mdss_byte0_div_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_BYTE0_INTF_CLK] = &disp_cc_mdss_byte0_intf_clk.clkr, | ||||
| 	[DISP_CC_MDSS_DP_AUX_CLK] = &disp_cc_mdss_dp_aux_clk.clkr, | ||||
| 	[DISP_CC_MDSS_DP_AUX_CLK_SRC] = &disp_cc_mdss_dp_aux_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_DP_CRYPTO_CLK] = &disp_cc_mdss_dp_crypto_clk.clkr, | ||||
| 	[DISP_CC_MDSS_DP_CRYPTO_CLK_SRC] = &disp_cc_mdss_dp_crypto_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_DP_LINK_CLK] = &disp_cc_mdss_dp_link_clk.clkr, | ||||
| 	[DISP_CC_MDSS_DP_LINK_CLK_SRC] = &disp_cc_mdss_dp_link_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_DP_LINK_DIV_CLK_SRC] = | ||||
| 		&disp_cc_mdss_dp_link_div_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_DP_LINK_INTF_CLK] = &disp_cc_mdss_dp_link_intf_clk.clkr, | ||||
| 	[DISP_CC_MDSS_DP_PIXEL_CLK] = &disp_cc_mdss_dp_pixel_clk.clkr, | ||||
| 	[DISP_CC_MDSS_DP_PIXEL_CLK_SRC] = &disp_cc_mdss_dp_pixel_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_ESC0_CLK] = &disp_cc_mdss_esc0_clk.clkr, | ||||
| 	[DISP_CC_MDSS_ESC0_CLK_SRC] = &disp_cc_mdss_esc0_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_MDP_CLK] = &disp_cc_mdss_mdp_clk.clkr, | ||||
| 	[DISP_CC_MDSS_MDP_CLK_SRC] = &disp_cc_mdss_mdp_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_MDP_LUT_CLK] = &disp_cc_mdss_mdp_lut_clk.clkr, | ||||
| 	[DISP_CC_MDSS_NON_GDSC_AHB_CLK] = &disp_cc_mdss_non_gdsc_ahb_clk.clkr, | ||||
| 	[DISP_CC_MDSS_PCLK0_CLK] = &disp_cc_mdss_pclk0_clk.clkr, | ||||
| 	[DISP_CC_MDSS_PCLK0_CLK_SRC] = &disp_cc_mdss_pclk0_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_ROT_CLK] = &disp_cc_mdss_rot_clk.clkr, | ||||
| 	[DISP_CC_MDSS_ROT_CLK_SRC] = &disp_cc_mdss_rot_clk_src.clkr, | ||||
| 	[DISP_CC_MDSS_RSCC_AHB_CLK] = &disp_cc_mdss_rscc_ahb_clk.clkr, | ||||
| 	[DISP_CC_MDSS_RSCC_VSYNC_CLK] = &disp_cc_mdss_rscc_vsync_clk.clkr, | ||||
| 	[DISP_CC_MDSS_VSYNC_CLK] = &disp_cc_mdss_vsync_clk.clkr, | ||||
| 	[DISP_CC_MDSS_VSYNC_CLK_SRC] = &disp_cc_mdss_vsync_clk_src.clkr, | ||||
| 	[DISP_CC_PLL0] = &disp_cc_pll0.clkr, | ||||
| 	[DISP_CC_SLEEP_CLK] = &disp_cc_sleep_clk.clkr, | ||||
| 	[DISP_CC_XO_CLK] = &disp_cc_xo_clk.clkr, | ||||
| }; | ||||
| 
 | ||||
| static struct gdsc *disp_cc_sm6350_gdscs[] = { | ||||
| 	[MDSS_GDSC] = &mdss_gdsc, | ||||
| }; | ||||
| 
 | ||||
| static const struct regmap_config disp_cc_sm6350_regmap_config = { | ||||
| 	.reg_bits = 32, | ||||
| 	.reg_stride = 4, | ||||
| 	.val_bits = 32, | ||||
| 	.max_register = 0x10000, | ||||
| 	.fast_io = true, | ||||
| }; | ||||
| 
 | ||||
| static const struct qcom_cc_desc disp_cc_sm6350_desc = { | ||||
| 	.config = &disp_cc_sm6350_regmap_config, | ||||
| 	.clks = disp_cc_sm6350_clocks, | ||||
| 	.num_clks = ARRAY_SIZE(disp_cc_sm6350_clocks), | ||||
| 	.gdscs = disp_cc_sm6350_gdscs, | ||||
| 	.num_gdscs = ARRAY_SIZE(disp_cc_sm6350_gdscs), | ||||
| }; | ||||
| 
 | ||||
| static const struct of_device_id disp_cc_sm6350_match_table[] = { | ||||
| 	{ .compatible = "qcom,sm6350-dispcc" }, | ||||
| 	{ } | ||||
| }; | ||||
| MODULE_DEVICE_TABLE(of, disp_cc_sm6350_match_table); | ||||
| 
 | ||||
| static int disp_cc_sm6350_probe(struct platform_device *pdev) | ||||
| { | ||||
| 	struct regmap *regmap; | ||||
| 
 | ||||
| 	regmap = qcom_cc_map(pdev, &disp_cc_sm6350_desc); | ||||
| 	if (IS_ERR(regmap)) | ||||
| 		return PTR_ERR(regmap); | ||||
| 
 | ||||
| 	clk_fabia_pll_configure(&disp_cc_pll0, regmap, &disp_cc_pll0_config); | ||||
| 
 | ||||
| 	return qcom_cc_really_probe(pdev, &disp_cc_sm6350_desc, regmap); | ||||
| } | ||||
| 
 | ||||
| static struct platform_driver disp_cc_sm6350_driver = { | ||||
| 	.probe = disp_cc_sm6350_probe, | ||||
| 	.driver = { | ||||
| 		.name = "disp_cc-sm6350", | ||||
| 		.of_match_table = disp_cc_sm6350_match_table, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static int __init disp_cc_sm6350_init(void) | ||||
| { | ||||
| 	return platform_driver_register(&disp_cc_sm6350_driver); | ||||
| } | ||||
| subsys_initcall(disp_cc_sm6350_init); | ||||
| 
 | ||||
| static void __exit disp_cc_sm6350_exit(void) | ||||
| { | ||||
| 	platform_driver_unregister(&disp_cc_sm6350_driver); | ||||
| } | ||||
| module_exit(disp_cc_sm6350_exit); | ||||
| 
 | ||||
| MODULE_DESCRIPTION("QTI DISP_CC SM6350 Driver"); | ||||
| MODULE_LICENSE("GPL v2"); | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -60,11 +60,6 @@ static const struct parent_map gcc_xo_gpll0_gpll0_out_main_div2_map[] = { | ||||
| 	{ P_GPLL0_DIV2, 4 }, | ||||
| }; | ||||
| 
 | ||||
| static const char * const gcc_xo_gpll0[] = { | ||||
| 	"xo", | ||||
| 	"gpll0", | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map gcc_xo_gpll0_map[] = { | ||||
| 	{ P_XO, 0 }, | ||||
| 	{ P_GPLL0, 1 }, | ||||
| @ -956,6 +951,11 @@ static struct clk_rcg2 blsp1_uart6_apps_clk_src = { | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data gcc_xo_gpll0[] = { | ||||
| 	{ .fw_name = "xo" }, | ||||
| 	{ .hw = &gpll0.clkr.hw }, | ||||
| }; | ||||
| 
 | ||||
| static const struct freq_tbl ftbl_pcie_axi_clk_src[] = { | ||||
| 	F(19200000, P_XO, 1, 0, 0), | ||||
| 	F(200000000, P_GPLL0, 4, 0, 0), | ||||
| @ -969,7 +969,7 @@ static struct clk_rcg2 pcie0_axi_clk_src = { | ||||
| 	.parent_map = gcc_xo_gpll0_map, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "pcie0_axi_clk_src", | ||||
| 		.parent_names = gcc_xo_gpll0, | ||||
| 		.parent_data = gcc_xo_gpll0, | ||||
| 		.num_parents = 2, | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| @ -1016,7 +1016,7 @@ static struct clk_rcg2 pcie1_axi_clk_src = { | ||||
| 	.parent_map = gcc_xo_gpll0_map, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "pcie1_axi_clk_src", | ||||
| 		.parent_names = gcc_xo_gpll0, | ||||
| 		.parent_data = gcc_xo_gpll0, | ||||
| 		.num_parents = 2, | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| @ -1074,7 +1074,7 @@ static struct clk_rcg2 sdcc1_apps_clk_src = { | ||||
| 		.name = "sdcc1_apps_clk_src", | ||||
| 		.parent_names = gcc_xo_gpll0_gpll2_gpll0_out_main_div2, | ||||
| 		.num_parents = 4, | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 		.ops = &clk_rcg2_floor_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| @ -1330,7 +1330,7 @@ static struct clk_rcg2 nss_ce_clk_src = { | ||||
| 	.parent_map = gcc_xo_gpll0_map, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "nss_ce_clk_src", | ||||
| 		.parent_names = gcc_xo_gpll0, | ||||
| 		.parent_data = gcc_xo_gpll0, | ||||
| 		.num_parents = 2, | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| @ -4329,8 +4329,7 @@ static struct clk_rcg2 pcie0_rchng_clk_src = { | ||||
| 	.parent_map = gcc_xo_gpll0_map, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "pcie0_rchng_clk_src", | ||||
| 		.parent_hws = (const struct clk_hw *[]) { | ||||
| 				&gpll0.clkr.hw }, | ||||
| 		.parent_data = gcc_xo_gpll0, | ||||
| 		.num_parents = 2, | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
|  | ||||
| @ -77,6 +77,7 @@ static struct clk_alpha_pll gpll4_early = { | ||||
| 
 | ||||
| static struct clk_alpha_pll_postdiv gpll4 = { | ||||
| 	.offset = 0x1dc0, | ||||
| 	.width = 4, | ||||
| 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "gpll4", | ||||
|  | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -3448,22 +3448,67 @@ static struct clk_branch gcc_video_xo_clk = { | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct gdsc pcie_0_gdsc = { | ||||
| 	.gdscr = 0x6b004, | ||||
| 	.pd = { | ||||
| 		.name = "pcie_0_gdsc", | ||||
| 	}, | ||||
| 	.pwrsts = PWRSTS_OFF_ON, | ||||
| 	.flags = POLL_CFG_GDSCR, | ||||
| }; | ||||
| 
 | ||||
| static struct gdsc pcie_1_gdsc = { | ||||
| 	.gdscr = 0x8d004, | ||||
| 	.pd = { | ||||
| 		.name = "pcie_1_gdsc", | ||||
| 	}, | ||||
| 	.pwrsts = PWRSTS_OFF_ON, | ||||
| 	.flags = POLL_CFG_GDSCR, | ||||
| }; | ||||
| 
 | ||||
| static struct gdsc ufs_card_gdsc = { | ||||
| 	.gdscr = 0x75004, | ||||
| 	.pd = { | ||||
| 		.name = "ufs_card_gdsc", | ||||
| 	}, | ||||
| 	.pwrsts = PWRSTS_OFF_ON, | ||||
| 	.flags = POLL_CFG_GDSCR, | ||||
| }; | ||||
| 
 | ||||
| static struct gdsc ufs_phy_gdsc = { | ||||
| 	.gdscr = 0x77004, | ||||
| 	.pd = { | ||||
| 		.name = "ufs_phy_gdsc", | ||||
| 	}, | ||||
| 	.pwrsts = PWRSTS_OFF_ON, | ||||
| 	.flags = POLL_CFG_GDSCR, | ||||
| }; | ||||
| 
 | ||||
| static struct gdsc emac_gdsc = { | ||||
| 	.gdscr = 0x6004, | ||||
| 	.pd = { | ||||
| 		.name = "emac_gdsc", | ||||
| 	}, | ||||
| 	.pwrsts = PWRSTS_OFF_ON, | ||||
| 	.flags = POLL_CFG_GDSCR, | ||||
| }; | ||||
| 
 | ||||
| static struct gdsc usb30_prim_gdsc = { | ||||
| 		.gdscr = 0xf004, | ||||
| 		.pd = { | ||||
| 			.name = "usb30_prim_gdsc", | ||||
| 		}, | ||||
| 		.pwrsts = PWRSTS_OFF_ON, | ||||
| 		.flags = POLL_CFG_GDSCR, | ||||
| 	.gdscr = 0xf004, | ||||
| 	.pd = { | ||||
| 		.name = "usb30_prim_gdsc", | ||||
| 	}, | ||||
| 	.pwrsts = PWRSTS_OFF_ON, | ||||
| 	.flags = POLL_CFG_GDSCR, | ||||
| }; | ||||
| 
 | ||||
| static struct gdsc usb30_sec_gdsc = { | ||||
| 		.gdscr = 0x10004, | ||||
| 		.pd = { | ||||
| 			.name = "usb30_sec_gdsc", | ||||
| 		}, | ||||
| 		.pwrsts = PWRSTS_OFF_ON, | ||||
| 		.flags = POLL_CFG_GDSCR, | ||||
| 	.gdscr = 0x10004, | ||||
| 	.pd = { | ||||
| 		.name = "usb30_sec_gdsc", | ||||
| 	}, | ||||
| 	.pwrsts = PWRSTS_OFF_ON, | ||||
| 	.flags = POLL_CFG_GDSCR, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_regmap *gcc_sm8150_clocks[] = { | ||||
| @ -3714,6 +3759,11 @@ static const struct qcom_reset_map gcc_sm8150_resets[] = { | ||||
| }; | ||||
| 
 | ||||
| static struct gdsc *gcc_sm8150_gdscs[] = { | ||||
| 	[EMAC_GDSC] = &emac_gdsc, | ||||
| 	[PCIE_0_GDSC] = &pcie_0_gdsc, | ||||
| 	[PCIE_1_GDSC] = &pcie_1_gdsc, | ||||
| 	[UFS_CARD_GDSC] = &ufs_card_gdsc, | ||||
| 	[UFS_PHY_GDSC] = &ufs_phy_gdsc, | ||||
| 	[USB30_PRIM_GDSC] = &usb30_prim_gdsc, | ||||
| 	[USB30_SEC_GDSC] = &usb30_sec_gdsc, | ||||
| }; | ||||
|  | ||||
| @ -29,7 +29,6 @@ | ||||
| 
 | ||||
| enum { | ||||
| 	P_GPU_XO, | ||||
| 	P_CORE_BI_PLL_TEST_SE, | ||||
| 	P_GPLL0_OUT_MAIN, | ||||
| 	P_GPLL0_OUT_MAIN_DIV, | ||||
| 	P_GPU_PLL0_PLL_OUT_MAIN, | ||||
| @ -66,8 +65,8 @@ static struct clk_alpha_pll gpu_pll0_pll_out_main = { | ||||
| 	.num_vco = ARRAY_SIZE(gpu_vco), | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "gpu_pll0_pll_out_main", | ||||
| 		.parent_data =  &(const struct clk_parent_data){ | ||||
| 			.hw = &gpucc_cxo_clk.clkr.hw, | ||||
| 		.parent_hws = (const struct clk_hw*[]){ | ||||
| 			&gpucc_cxo_clk.clkr.hw, | ||||
| 		}, | ||||
| 		.num_parents = 1, | ||||
| 		.ops = &clk_alpha_pll_ops, | ||||
| @ -81,8 +80,8 @@ static struct clk_alpha_pll gpu_pll1_pll_out_main = { | ||||
| 	.num_vco = ARRAY_SIZE(gpu_vco), | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "gpu_pll1_pll_out_main", | ||||
| 		.parent_data = &(const struct clk_parent_data){ | ||||
| 			.hw = &gpucc_cxo_clk.clkr.hw, | ||||
| 		.parent_hws = (const struct clk_hw*[]){ | ||||
| 			&gpucc_cxo_clk.clkr.hw, | ||||
| 		}, | ||||
| 		.num_parents = 1, | ||||
| 		.ops = &clk_alpha_pll_ops, | ||||
| @ -135,8 +134,8 @@ static struct clk_branch gpucc_gfx3d_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "gpucc_gfx3d_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &gfx3d_clk_src.rcg.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&gfx3d_clk_src.rcg.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| @ -204,8 +203,8 @@ static struct clk_branch gpucc_rbbmtimer_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "gpucc_rbbmtimer_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"rbbmtimer_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&rbbmtimer_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -222,8 +221,8 @@ static struct clk_branch gpucc_rbcpr_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "gpucc_rbcpr_clk", | ||||
| 			.parent_names = (const char *[]){ | ||||
| 				"rbcpr_clk_src", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&rbcpr_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
|  | ||||
							
								
								
									
										521
									
								
								drivers/clk/qcom/gpucc-sm6350.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										521
									
								
								drivers/clk/qcom/gpucc-sm6350.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,521 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0-only
 | ||||
| /*
 | ||||
|  * Copyright (c) 2021, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2021, Konrad Dybcio <konrad.dybcio@somainline.org> | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/clk-provider.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/regmap.h> | ||||
| 
 | ||||
| #include <dt-bindings/clock/qcom,gpucc-sm6350.h> | ||||
| 
 | ||||
| #include "common.h" | ||||
| #include "clk-alpha-pll.h" | ||||
| #include "clk-branch.h" | ||||
| #include "clk-rcg.h" | ||||
| #include "clk-regmap.h" | ||||
| #include "reset.h" | ||||
| #include "gdsc.h" | ||||
| 
 | ||||
| #define CX_GMU_CBCR_SLEEP_MASK		0xF | ||||
| #define CX_GMU_CBCR_SLEEP_SHIFT		4 | ||||
| #define CX_GMU_CBCR_WAKE_MASK		0xF | ||||
| #define CX_GMU_CBCR_WAKE_SHIFT		8 | ||||
| 
 | ||||
| enum { | ||||
| 	P_BI_TCXO, | ||||
| 	P_GPLL0_OUT_MAIN, | ||||
| 	P_GPLL0_OUT_MAIN_DIV, | ||||
| 	P_GPU_CC_PLL0_OUT_MAIN, | ||||
| 	P_GPU_CC_PLL0_OUT_ODD, | ||||
| 	P_GPU_CC_PLL1_OUT_EVEN, | ||||
| 	P_GPU_CC_PLL1_OUT_MAIN, | ||||
| 	P_GPU_CC_PLL1_OUT_ODD, | ||||
| 	P_CRC_DIV, | ||||
| }; | ||||
| 
 | ||||
| static const struct pll_vco fabia_vco[] = { | ||||
| 	{ 249600000, 2000000000, 0 }, | ||||
| }; | ||||
| 
 | ||||
| /* 506MHz Configuration*/ | ||||
| static const struct alpha_pll_config gpu_cc_pll0_config = { | ||||
| 	.l = 0x1A, | ||||
| 	.alpha = 0x5AAA, | ||||
| 	.config_ctl_val = 0x20485699, | ||||
| 	.config_ctl_hi_val = 0x00002067, | ||||
| 	.test_ctl_val = 0x40000000, | ||||
| 	.test_ctl_hi_val = 0x00000002, | ||||
| 	.user_ctl_val = 0x00000001, | ||||
| 	.user_ctl_hi_val = 0x00004805, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_alpha_pll gpu_cc_pll0 = { | ||||
| 	.offset = 0x0, | ||||
| 	.vco_table = fabia_vco, | ||||
| 	.num_vco = ARRAY_SIZE(fabia_vco), | ||||
| 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], | ||||
| 	.clkr = { | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "gpu_cc_pll0", | ||||
| 			.parent_data =  &(const struct clk_parent_data){ | ||||
| 				.fw_name = "bi_tcxo", | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.ops = &clk_alpha_pll_fabia_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_fixed_factor crc_div = { | ||||
| 	.mult = 1, | ||||
| 	.div = 2, | ||||
| 	.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "crc_div", | ||||
| 		.parent_hws = (const struct clk_hw*[]){ | ||||
| 			&gpu_cc_pll0.clkr.hw, | ||||
| 		}, | ||||
| 		.num_parents = 1, | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_fixed_factor_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| /* 514MHz Configuration*/ | ||||
| static const struct alpha_pll_config gpu_cc_pll1_config = { | ||||
| 	.l = 0x1A, | ||||
| 	.alpha = 0xC555, | ||||
| 	.config_ctl_val = 0x20485699, | ||||
| 	.config_ctl_hi_val = 0x00002067, | ||||
| 	.test_ctl_val = 0x40000000, | ||||
| 	.test_ctl_hi_val = 0x00000002, | ||||
| 	.user_ctl_val = 0x00000001, | ||||
| 	.user_ctl_hi_val = 0x00004805, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_alpha_pll gpu_cc_pll1 = { | ||||
| 	.offset = 0x100, | ||||
| 	.vco_table = fabia_vco, | ||||
| 	.num_vco = ARRAY_SIZE(fabia_vco), | ||||
| 	.regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], | ||||
| 	.clkr = { | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "gpu_cc_pll1", | ||||
| 			.parent_data =  &(const struct clk_parent_data){ | ||||
| 				.fw_name = "bi_tcxo", | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.ops = &clk_alpha_pll_fabia_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map gpu_cc_parent_map_0[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| 	{ P_GPU_CC_PLL0_OUT_MAIN, 1 }, | ||||
| 	{ P_GPU_CC_PLL1_OUT_MAIN, 3 }, | ||||
| 	{ P_GPLL0_OUT_MAIN, 5 }, | ||||
| 	{ P_GPLL0_OUT_MAIN_DIV, 6 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data gpu_cc_parent_data_0[] = { | ||||
| 	{ .fw_name = "bi_tcxo" }, | ||||
| 	{ .hw = &gpu_cc_pll0.clkr.hw }, | ||||
| 	{ .hw = &gpu_cc_pll1.clkr.hw }, | ||||
| 	{ .fw_name = "gcc_gpu_gpll0_clk" }, | ||||
| 	{ .fw_name = "gcc_gpu_gpll0_div_clk" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct parent_map gpu_cc_parent_map_1[] = { | ||||
| 	{ P_BI_TCXO, 0 }, | ||||
| 	{ P_CRC_DIV, 1 }, | ||||
| 	{ P_GPU_CC_PLL0_OUT_ODD, 2 }, | ||||
| 	{ P_GPU_CC_PLL1_OUT_EVEN, 3 }, | ||||
| 	{ P_GPU_CC_PLL1_OUT_ODD, 4 }, | ||||
| 	{ P_GPLL0_OUT_MAIN, 5 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct clk_parent_data gpu_cc_parent_data_1[] = { | ||||
| 	{ .fw_name = "bi_tcxo" }, | ||||
| 	{ .hw = &crc_div.hw }, | ||||
| 	{ .hw = &gpu_cc_pll0.clkr.hw }, | ||||
| 	{ .hw = &gpu_cc_pll1.clkr.hw }, | ||||
| 	{ .hw = &gpu_cc_pll1.clkr.hw }, | ||||
| 	{ .fw_name = "gcc_gpu_gpll0_clk" }, | ||||
| }; | ||||
| 
 | ||||
| static const struct freq_tbl ftbl_gpu_cc_gmu_clk_src[] = { | ||||
| 	F(200000000, P_GPLL0_OUT_MAIN_DIV, 1.5, 0, 0), | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 gpu_cc_gmu_clk_src = { | ||||
| 	.cmd_rcgr = 0x1120, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = gpu_cc_parent_map_0, | ||||
| 	.freq_tbl = ftbl_gpu_cc_gmu_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "gpu_cc_gmu_clk_src", | ||||
| 		.parent_data = gpu_cc_parent_data_0, | ||||
| 		.num_parents = ARRAY_SIZE(gpu_cc_parent_data_0), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static const struct freq_tbl ftbl_gpu_cc_gx_gfx3d_clk_src[] = { | ||||
| 	F(253000000, P_CRC_DIV, 1, 0, 0), | ||||
| 	F(355000000, P_CRC_DIV, 1, 0, 0), | ||||
| 	F(430000000, P_CRC_DIV, 1, 0, 0), | ||||
| 	F(565000000, P_CRC_DIV, 1, 0, 0), | ||||
| 	F(650000000, P_CRC_DIV, 1, 0, 0), | ||||
| 	F(800000000, P_CRC_DIV, 1, 0, 0), | ||||
| 	F(825000000, P_CRC_DIV, 1, 0, 0), | ||||
| 	F(850000000, P_CRC_DIV, 1, 0, 0), | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static struct clk_rcg2 gpu_cc_gx_gfx3d_clk_src = { | ||||
| 	.cmd_rcgr = 0x101c, | ||||
| 	.mnd_width = 0, | ||||
| 	.hid_width = 5, | ||||
| 	.parent_map = gpu_cc_parent_map_1, | ||||
| 	.freq_tbl = ftbl_gpu_cc_gx_gfx3d_clk_src, | ||||
| 	.clkr.hw.init = &(struct clk_init_data){ | ||||
| 		.name = "gpu_cc_gx_gfx3d_clk_src", | ||||
| 		.parent_data = gpu_cc_parent_data_1, | ||||
| 		.num_parents = ARRAY_SIZE(gpu_cc_parent_data_1), | ||||
| 		.flags = CLK_SET_RATE_PARENT, | ||||
| 		.ops = &clk_rcg2_ops, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch gpu_cc_acd_ahb_clk = { | ||||
| 	.halt_reg = 0x1168, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x1168, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "gpu_cc_acd_ahb_clk", | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch gpu_cc_acd_cxo_clk = { | ||||
| 	.halt_reg = 0x1164, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x1164, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "gpu_cc_acd_cxo_clk", | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch gpu_cc_ahb_clk = { | ||||
| 	.halt_reg = 0x1078, | ||||
| 	.halt_check = BRANCH_HALT_DELAY, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x1078, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "gpu_cc_ahb_clk", | ||||
| 			.flags = CLK_IS_CRITICAL, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch gpu_cc_crc_ahb_clk = { | ||||
| 	.halt_reg = 0x107c, | ||||
| 	.halt_check = BRANCH_HALT_DELAY, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x107c, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "gpu_cc_crc_ahb_clk", | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch gpu_cc_cx_gfx3d_clk = { | ||||
| 	.halt_reg = 0x10a4, | ||||
| 	.halt_check = BRANCH_HALT_DELAY, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x10a4, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "gpu_cc_cx_gfx3d_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&gpu_cc_gx_gfx3d_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch gpu_cc_cx_gfx3d_slv_clk = { | ||||
| 	.halt_reg = 0x10a8, | ||||
| 	.halt_check = BRANCH_HALT_DELAY, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x10a8, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "gpu_cc_cx_gfx3d_slv_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&gpu_cc_gx_gfx3d_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch gpu_cc_cx_gmu_clk = { | ||||
| 	.halt_reg = 0x1098, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x1098, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "gpu_cc_cx_gmu_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&gpu_cc_gmu_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch gpu_cc_cx_snoc_dvm_clk = { | ||||
| 	.halt_reg = 0x108c, | ||||
| 	.halt_check = BRANCH_HALT_DELAY, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x108c, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "gpu_cc_cx_snoc_dvm_clk", | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch gpu_cc_cxo_aon_clk = { | ||||
| 	.halt_reg = 0x1004, | ||||
| 	.halt_check = BRANCH_HALT_DELAY, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x1004, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "gpu_cc_cxo_aon_clk", | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch gpu_cc_cxo_clk = { | ||||
| 	.halt_reg = 0x109c, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x109c, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "gpu_cc_cxo_clk", | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch gpu_cc_gx_cxo_clk = { | ||||
| 	.halt_reg = 0x1060, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x1060, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "gpu_cc_gx_cxo_clk", | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch gpu_cc_gx_gfx3d_clk = { | ||||
| 	.halt_reg = 0x1054, | ||||
| 	.halt_check = BRANCH_HALT_SKIP, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x1054, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "gpu_cc_gx_gfx3d_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&gpu_cc_gx_gfx3d_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch gpu_cc_gx_gmu_clk = { | ||||
| 	.halt_reg = 0x1064, | ||||
| 	.halt_check = BRANCH_HALT, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x1064, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "gpu_cc_gx_gmu_clk", | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&gpu_cc_gmu_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_branch gpu_cc_gx_vsense_clk = { | ||||
| 	.halt_reg = 0x1058, | ||||
| 	.halt_check = BRANCH_HALT_DELAY, | ||||
| 	.clkr = { | ||||
| 		.enable_reg = 0x1058, | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "gpu_cc_gx_vsense_clk", | ||||
| 			.ops = &clk_branch2_ops, | ||||
| 		}, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct gdsc gpu_cx_gdsc = { | ||||
| 	.gdscr = 0x106c, | ||||
| 	.gds_hw_ctrl = 0x1540, | ||||
| 	.pd = { | ||||
| 		.name = "gpu_cx_gdsc", | ||||
| 	}, | ||||
| 	.pwrsts = PWRSTS_OFF_ON, | ||||
| 	.flags = VOTABLE, | ||||
| }; | ||||
| 
 | ||||
| static struct gdsc gpu_gx_gdsc = { | ||||
| 	.gdscr = 0x100c, | ||||
| 	.clamp_io_ctrl = 0x1508, | ||||
| 	.pd = { | ||||
| 		.name = "gpu_gx_gdsc", | ||||
| 		.power_on = gdsc_gx_do_nothing_enable, | ||||
| 	}, | ||||
| 	.pwrsts = PWRSTS_OFF_ON, | ||||
| 	.flags = CLAMP_IO | POLL_CFG_GDSCR, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_hw *gpu_cc_sm6350_hws[] = { | ||||
| 	[GPU_CC_CRC_DIV] = &crc_div.hw, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_regmap *gpu_cc_sm6350_clocks[] = { | ||||
| 	[GPU_CC_ACD_AHB_CLK] = &gpu_cc_acd_ahb_clk.clkr, | ||||
| 	[GPU_CC_ACD_CXO_CLK] = &gpu_cc_acd_cxo_clk.clkr, | ||||
| 	[GPU_CC_AHB_CLK] = &gpu_cc_ahb_clk.clkr, | ||||
| 	[GPU_CC_CRC_AHB_CLK] = &gpu_cc_crc_ahb_clk.clkr, | ||||
| 	[GPU_CC_CX_GFX3D_CLK] = &gpu_cc_cx_gfx3d_clk.clkr, | ||||
| 	[GPU_CC_CX_GFX3D_SLV_CLK] = &gpu_cc_cx_gfx3d_slv_clk.clkr, | ||||
| 	[GPU_CC_CX_GMU_CLK] = &gpu_cc_cx_gmu_clk.clkr, | ||||
| 	[GPU_CC_CX_SNOC_DVM_CLK] = &gpu_cc_cx_snoc_dvm_clk.clkr, | ||||
| 	[GPU_CC_CXO_AON_CLK] = &gpu_cc_cxo_aon_clk.clkr, | ||||
| 	[GPU_CC_CXO_CLK] = &gpu_cc_cxo_clk.clkr, | ||||
| 	[GPU_CC_GMU_CLK_SRC] = &gpu_cc_gmu_clk_src.clkr, | ||||
| 	[GPU_CC_GX_CXO_CLK] = &gpu_cc_gx_cxo_clk.clkr, | ||||
| 	[GPU_CC_GX_GFX3D_CLK] = &gpu_cc_gx_gfx3d_clk.clkr, | ||||
| 	[GPU_CC_GX_GFX3D_CLK_SRC] = &gpu_cc_gx_gfx3d_clk_src.clkr, | ||||
| 	[GPU_CC_GX_GMU_CLK] = &gpu_cc_gx_gmu_clk.clkr, | ||||
| 	[GPU_CC_GX_VSENSE_CLK] = &gpu_cc_gx_vsense_clk.clkr, | ||||
| 	[GPU_CC_PLL0] = &gpu_cc_pll0.clkr, | ||||
| 	[GPU_CC_PLL1] = &gpu_cc_pll1.clkr, | ||||
| }; | ||||
| 
 | ||||
| static struct gdsc *gpu_cc_sm6350_gdscs[] = { | ||||
| 	[GPU_CX_GDSC] = &gpu_cx_gdsc, | ||||
| 	[GPU_GX_GDSC] = &gpu_gx_gdsc, | ||||
| }; | ||||
| 
 | ||||
| static const struct regmap_config gpu_cc_sm6350_regmap_config = { | ||||
| 	.reg_bits = 32, | ||||
| 	.reg_stride = 4, | ||||
| 	.val_bits = 32, | ||||
| 	.max_register = 0x8008, | ||||
| 	.fast_io = true, | ||||
| }; | ||||
| 
 | ||||
| static const struct qcom_cc_desc gpu_cc_sm6350_desc = { | ||||
| 	.config = &gpu_cc_sm6350_regmap_config, | ||||
| 	.clk_hws = gpu_cc_sm6350_hws, | ||||
| 	.num_clk_hws = ARRAY_SIZE(gpu_cc_sm6350_hws), | ||||
| 	.clks = gpu_cc_sm6350_clocks, | ||||
| 	.num_clks = ARRAY_SIZE(gpu_cc_sm6350_clocks), | ||||
| 	.gdscs = gpu_cc_sm6350_gdscs, | ||||
| 	.num_gdscs = ARRAY_SIZE(gpu_cc_sm6350_gdscs), | ||||
| }; | ||||
| 
 | ||||
| static const struct of_device_id gpu_cc_sm6350_match_table[] = { | ||||
| 	{ .compatible = "qcom,sm6350-gpucc" }, | ||||
| 	{ } | ||||
| }; | ||||
| MODULE_DEVICE_TABLE(of, gpu_cc_sm6350_match_table); | ||||
| 
 | ||||
| static int gpu_cc_sm6350_probe(struct platform_device *pdev) | ||||
| { | ||||
| 	struct regmap *regmap; | ||||
| 	unsigned int value, mask; | ||||
| 
 | ||||
| 	regmap = qcom_cc_map(pdev, &gpu_cc_sm6350_desc); | ||||
| 	if (IS_ERR(regmap)) | ||||
| 		return PTR_ERR(regmap); | ||||
| 
 | ||||
| 	clk_fabia_pll_configure(&gpu_cc_pll0, regmap, &gpu_cc_pll0_config); | ||||
| 	clk_fabia_pll_configure(&gpu_cc_pll1, regmap, &gpu_cc_pll1_config); | ||||
| 
 | ||||
| 	/* Configure gpu_cc_cx_gmu_clk with recommended wakeup/sleep settings */ | ||||
| 	mask = CX_GMU_CBCR_WAKE_MASK << CX_GMU_CBCR_WAKE_SHIFT; | ||||
| 	mask |= CX_GMU_CBCR_SLEEP_MASK << CX_GMU_CBCR_SLEEP_SHIFT; | ||||
| 	value = 0xF << CX_GMU_CBCR_WAKE_SHIFT | 0xF << CX_GMU_CBCR_SLEEP_SHIFT; | ||||
| 	regmap_update_bits(regmap, 0x1098, mask, value); | ||||
| 
 | ||||
| 	return qcom_cc_really_probe(pdev, &gpu_cc_sm6350_desc, regmap); | ||||
| } | ||||
| 
 | ||||
| static struct platform_driver gpu_cc_sm6350_driver = { | ||||
| 	.probe = gpu_cc_sm6350_probe, | ||||
| 	.driver = { | ||||
| 		.name = "sm6350-gpucc", | ||||
| 		.of_match_table = gpu_cc_sm6350_match_table, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static int __init gpu_cc_sm6350_init(void) | ||||
| { | ||||
| 	return platform_driver_register(&gpu_cc_sm6350_driver); | ||||
| } | ||||
| core_initcall(gpu_cc_sm6350_init); | ||||
| 
 | ||||
| static void __exit gpu_cc_sm6350_exit(void) | ||||
| { | ||||
| 	platform_driver_unregister(&gpu_cc_sm6350_driver); | ||||
| } | ||||
| module_exit(gpu_cc_sm6350_exit); | ||||
| 
 | ||||
| MODULE_DESCRIPTION("QTI GPU_CC LAGOON Driver"); | ||||
| MODULE_LICENSE("GPL v2"); | ||||
| @ -257,6 +257,18 @@ static struct clk_rcg2 mmss_ahb_clk_src = { | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct freq_tbl ftbl_mmss_axi_clk_msm8226[] = { | ||||
| 	F(19200000, P_XO, 1, 0, 0), | ||||
| 	F(37500000, P_GPLL0, 16, 0, 0), | ||||
| 	F(50000000, P_GPLL0, 12, 0, 0), | ||||
| 	F(75000000, P_GPLL0, 8, 0, 0), | ||||
| 	F(100000000, P_GPLL0, 6, 0, 0), | ||||
| 	F(150000000, P_GPLL0, 4, 0, 0), | ||||
| 	F(200000000, P_MMPLL0, 4, 0, 0), | ||||
| 	F(266666666, P_MMPLL0, 3, 0, 0), | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static struct freq_tbl ftbl_mmss_axi_clk[] = { | ||||
| 	F( 19200000, P_XO, 1, 0, 0), | ||||
| 	F( 37500000, P_GPLL0, 16, 0, 0), | ||||
| @ -364,6 +376,23 @@ static struct clk_rcg2 csi3_clk_src = { | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct freq_tbl ftbl_camss_vfe_vfe0_clk_msm8226[] = { | ||||
| 	F(37500000, P_GPLL0, 16, 0, 0), | ||||
| 	F(50000000, P_GPLL0, 12, 0, 0), | ||||
| 	F(60000000, P_GPLL0, 10, 0, 0), | ||||
| 	F(80000000, P_GPLL0, 7.5, 0, 0), | ||||
| 	F(100000000, P_GPLL0, 6, 0, 0), | ||||
| 	F(109090000, P_GPLL0, 5.5, 0, 0), | ||||
| 	F(133330000, P_GPLL0, 4.5, 0, 0), | ||||
| 	F(150000000, P_GPLL0, 4, 0, 0), | ||||
| 	F(200000000, P_GPLL0, 3, 0, 0), | ||||
| 	F(228570000, P_MMPLL0, 3.5, 0, 0), | ||||
| 	F(266670000, P_MMPLL0, 3, 0, 0), | ||||
| 	F(320000000, P_MMPLL0, 2.5, 0, 0), | ||||
| 	F(400000000, P_MMPLL0, 2, 0, 0), | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static struct freq_tbl ftbl_camss_vfe_vfe0_1_clk[] = { | ||||
| 	F(37500000, P_GPLL0, 16, 0, 0), | ||||
| 	F(50000000, P_GPLL0, 12, 0, 0), | ||||
| @ -407,6 +436,18 @@ static struct clk_rcg2 vfe1_clk_src = { | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct freq_tbl ftbl_mdss_mdp_clk_msm8226[] = { | ||||
| 	F(37500000, P_GPLL0, 16, 0, 0), | ||||
| 	F(60000000, P_GPLL0, 10, 0, 0), | ||||
| 	F(75000000, P_GPLL0, 8, 0, 0), | ||||
| 	F(92310000, P_GPLL0, 6.5, 0, 0), | ||||
| 	F(100000000, P_GPLL0, 6, 0, 0), | ||||
| 	F(133330000, P_MMPLL0, 6, 0, 0), | ||||
| 	F(177780000, P_MMPLL0, 4.5, 0, 0), | ||||
| 	F(200000000, P_MMPLL0, 4, 0, 0), | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static struct freq_tbl ftbl_mdss_mdp_clk[] = { | ||||
| 	F(37500000, P_GPLL0, 16, 0, 0), | ||||
| 	F(60000000, P_GPLL0, 10, 0, 0), | ||||
| @ -513,6 +554,14 @@ static struct clk_rcg2 pclk1_clk_src = { | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct freq_tbl ftbl_venus0_vcodec0_clk_msm8226[] = { | ||||
| 	F(66700000, P_GPLL0, 9, 0, 0), | ||||
| 	F(100000000, P_GPLL0, 6, 0, 0), | ||||
| 	F(133330000, P_MMPLL0, 6, 0, 0), | ||||
| 	F(160000000, P_MMPLL0, 5, 0, 0), | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static struct freq_tbl ftbl_venus0_vcodec0_clk[] = { | ||||
| 	F(50000000, P_GPLL0, 12, 0, 0), | ||||
| 	F(100000000, P_GPLL0, 6, 0, 0), | ||||
| @ -593,6 +642,13 @@ static struct clk_rcg2 camss_gp1_clk_src = { | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct freq_tbl ftbl_camss_mclk0_3_clk_msm8226[] = { | ||||
| 	F(19200000, P_XO, 1, 0, 0), | ||||
| 	F(24000000, P_GPLL0, 5, 1, 5), | ||||
| 	F(66670000, P_GPLL0, 9, 0, 0), | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static struct freq_tbl ftbl_camss_mclk0_3_clk[] = { | ||||
| 	F(4800000, P_XO, 4, 0, 0), | ||||
| 	F(6000000, P_GPLL0, 10, 1, 10), | ||||
| @ -705,6 +761,15 @@ static struct clk_rcg2 csi2phytimer_clk_src = { | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct freq_tbl ftbl_camss_vfe_cpp_clk_msm8226[] = { | ||||
| 	F(133330000, P_GPLL0, 4.5, 0, 0), | ||||
| 	F(150000000, P_GPLL0, 4, 0, 0), | ||||
| 	F(266670000, P_MMPLL0, 3, 0, 0), | ||||
| 	F(320000000, P_MMPLL0, 2.5, 0, 0), | ||||
| 	F(400000000, P_MMPLL0, 2, 0, 0), | ||||
| 	{ } | ||||
| }; | ||||
| 
 | ||||
| static struct freq_tbl ftbl_camss_vfe_cpp_clk[] = { | ||||
| 	F(133330000, P_GPLL0, 4.5, 0, 0), | ||||
| 	F(266670000, P_MMPLL0, 3, 0, 0), | ||||
| @ -2366,6 +2431,116 @@ static struct gdsc oxilicx_gdsc = { | ||||
| 	.pwrsts = PWRSTS_OFF_ON, | ||||
| }; | ||||
| 
 | ||||
| static struct clk_regmap *mmcc_msm8226_clocks[] = { | ||||
| 	[MMSS_AHB_CLK_SRC] = &mmss_ahb_clk_src.clkr, | ||||
| 	[MMSS_AXI_CLK_SRC] = &mmss_axi_clk_src.clkr, | ||||
| 	[MMPLL0] = &mmpll0.clkr, | ||||
| 	[MMPLL0_VOTE] = &mmpll0_vote, | ||||
| 	[MMPLL1] = &mmpll1.clkr, | ||||
| 	[MMPLL1_VOTE] = &mmpll1_vote, | ||||
| 	[CSI0_CLK_SRC] = &csi0_clk_src.clkr, | ||||
| 	[CSI1_CLK_SRC] = &csi1_clk_src.clkr, | ||||
| 	[VFE0_CLK_SRC] = &vfe0_clk_src.clkr, | ||||
| 	[MDP_CLK_SRC] = &mdp_clk_src.clkr, | ||||
| 	[JPEG0_CLK_SRC] = &jpeg0_clk_src.clkr, | ||||
| 	[PCLK0_CLK_SRC] = &pclk0_clk_src.clkr, | ||||
| 	[VCODEC0_CLK_SRC] = &vcodec0_clk_src.clkr, | ||||
| 	[CCI_CLK_SRC] = &cci_clk_src.clkr, | ||||
| 	[CAMSS_GP0_CLK_SRC] = &camss_gp0_clk_src.clkr, | ||||
| 	[CAMSS_GP1_CLK_SRC] = &camss_gp1_clk_src.clkr, | ||||
| 	[MCLK0_CLK_SRC] = &mclk0_clk_src.clkr, | ||||
| 	[MCLK1_CLK_SRC] = &mclk1_clk_src.clkr, | ||||
| 	[CSI0PHYTIMER_CLK_SRC] = &csi0phytimer_clk_src.clkr, | ||||
| 	[CSI1PHYTIMER_CLK_SRC] = &csi1phytimer_clk_src.clkr, | ||||
| 	[CPP_CLK_SRC] = &cpp_clk_src.clkr, | ||||
| 	[BYTE0_CLK_SRC] = &byte0_clk_src.clkr, | ||||
| 	[ESC0_CLK_SRC] = &esc0_clk_src.clkr, | ||||
| 	[VSYNC_CLK_SRC] = &vsync_clk_src.clkr, | ||||
| 	[CAMSS_CCI_CCI_AHB_CLK] = &camss_cci_cci_ahb_clk.clkr, | ||||
| 	[CAMSS_CCI_CCI_CLK] = &camss_cci_cci_clk.clkr, | ||||
| 	[CAMSS_CSI0_AHB_CLK] = &camss_csi0_ahb_clk.clkr, | ||||
| 	[CAMSS_CSI0_CLK] = &camss_csi0_clk.clkr, | ||||
| 	[CAMSS_CSI0PHY_CLK] = &camss_csi0phy_clk.clkr, | ||||
| 	[CAMSS_CSI0PIX_CLK] = &camss_csi0pix_clk.clkr, | ||||
| 	[CAMSS_CSI0RDI_CLK] = &camss_csi0rdi_clk.clkr, | ||||
| 	[CAMSS_CSI1_AHB_CLK] = &camss_csi1_ahb_clk.clkr, | ||||
| 	[CAMSS_CSI1_CLK] = &camss_csi1_clk.clkr, | ||||
| 	[CAMSS_CSI1PHY_CLK] = &camss_csi1phy_clk.clkr, | ||||
| 	[CAMSS_CSI1PIX_CLK] = &camss_csi1pix_clk.clkr, | ||||
| 	[CAMSS_CSI1RDI_CLK] = &camss_csi1rdi_clk.clkr, | ||||
| 	[CAMSS_CSI_VFE0_CLK] = &camss_csi_vfe0_clk.clkr, | ||||
| 	[CAMSS_GP0_CLK] = &camss_gp0_clk.clkr, | ||||
| 	[CAMSS_GP1_CLK] = &camss_gp1_clk.clkr, | ||||
| 	[CAMSS_ISPIF_AHB_CLK] = &camss_ispif_ahb_clk.clkr, | ||||
| 	[CAMSS_JPEG_JPEG0_CLK] = &camss_jpeg_jpeg0_clk.clkr, | ||||
| 	[CAMSS_JPEG_JPEG_AHB_CLK] = &camss_jpeg_jpeg_ahb_clk.clkr, | ||||
| 	[CAMSS_JPEG_JPEG_AXI_CLK] = &camss_jpeg_jpeg_axi_clk.clkr, | ||||
| 	[CAMSS_MCLK0_CLK] = &camss_mclk0_clk.clkr, | ||||
| 	[CAMSS_MCLK1_CLK] = &camss_mclk1_clk.clkr, | ||||
| 	[CAMSS_MICRO_AHB_CLK] = &camss_micro_ahb_clk.clkr, | ||||
| 	[CAMSS_PHY0_CSI0PHYTIMER_CLK] = &camss_phy0_csi0phytimer_clk.clkr, | ||||
| 	[CAMSS_PHY1_CSI1PHYTIMER_CLK] = &camss_phy1_csi1phytimer_clk.clkr, | ||||
| 	[CAMSS_TOP_AHB_CLK] = &camss_top_ahb_clk.clkr, | ||||
| 	[CAMSS_VFE_CPP_AHB_CLK] = &camss_vfe_cpp_ahb_clk.clkr, | ||||
| 	[CAMSS_VFE_CPP_CLK] = &camss_vfe_cpp_clk.clkr, | ||||
| 	[CAMSS_VFE_VFE0_CLK] = &camss_vfe_vfe0_clk.clkr, | ||||
| 	[CAMSS_VFE_VFE_AHB_CLK] = &camss_vfe_vfe_ahb_clk.clkr, | ||||
| 	[CAMSS_VFE_VFE_AXI_CLK] = &camss_vfe_vfe_axi_clk.clkr, | ||||
| 	[MDSS_AHB_CLK] = &mdss_ahb_clk.clkr, | ||||
| 	[MDSS_AXI_CLK] = &mdss_axi_clk.clkr, | ||||
| 	[MDSS_BYTE0_CLK] = &mdss_byte0_clk.clkr, | ||||
| 	[MDSS_ESC0_CLK] = &mdss_esc0_clk.clkr, | ||||
| 	[MDSS_MDP_CLK] = &mdss_mdp_clk.clkr, | ||||
| 	[MDSS_MDP_LUT_CLK] = &mdss_mdp_lut_clk.clkr, | ||||
| 	[MDSS_PCLK0_CLK] = &mdss_pclk0_clk.clkr, | ||||
| 	[MDSS_VSYNC_CLK] = &mdss_vsync_clk.clkr, | ||||
| 	[MMSS_MISC_AHB_CLK] = &mmss_misc_ahb_clk.clkr, | ||||
| 	[MMSS_MMSSNOC_AHB_CLK] = &mmss_mmssnoc_ahb_clk.clkr, | ||||
| 	[MMSS_MMSSNOC_BTO_AHB_CLK] = &mmss_mmssnoc_bto_ahb_clk.clkr, | ||||
| 	[MMSS_MMSSNOC_AXI_CLK] = &mmss_mmssnoc_axi_clk.clkr, | ||||
| 	[MMSS_S0_AXI_CLK] = &mmss_s0_axi_clk.clkr, | ||||
| 	[OCMEMCX_AHB_CLK] = &ocmemcx_ahb_clk.clkr, | ||||
| 	[OXILI_OCMEMGX_CLK] = &oxili_ocmemgx_clk.clkr, | ||||
| 	[OXILI_GFX3D_CLK] = &oxili_gfx3d_clk.clkr, | ||||
| 	[OXILICX_AHB_CLK] = &oxilicx_ahb_clk.clkr, | ||||
| 	[OXILICX_AXI_CLK] = &oxilicx_axi_clk.clkr, | ||||
| 	[VENUS0_AHB_CLK] = &venus0_ahb_clk.clkr, | ||||
| 	[VENUS0_AXI_CLK] = &venus0_axi_clk.clkr, | ||||
| 	[VENUS0_VCODEC0_CLK] = &venus0_vcodec0_clk.clkr, | ||||
| }; | ||||
| 
 | ||||
| static const struct qcom_reset_map mmcc_msm8226_resets[] = { | ||||
| 	[SPDM_RESET] = { 0x0200 }, | ||||
| 	[SPDM_RM_RESET] = { 0x0300 }, | ||||
| 	[VENUS0_RESET] = { 0x1020 }, | ||||
| 	[MDSS_RESET] = { 0x2300 }, | ||||
| }; | ||||
| 
 | ||||
| static struct gdsc *mmcc_msm8226_gdscs[] = { | ||||
| 	[VENUS0_GDSC] = &venus0_gdsc, | ||||
| 	[MDSS_GDSC] = &mdss_gdsc, | ||||
| 	[CAMSS_JPEG_GDSC] = &camss_jpeg_gdsc, | ||||
| 	[CAMSS_VFE_GDSC] = &camss_vfe_gdsc, | ||||
| }; | ||||
| 
 | ||||
| static const struct regmap_config mmcc_msm8226_regmap_config = { | ||||
| 	.reg_bits	= 32, | ||||
| 	.reg_stride	= 4, | ||||
| 	.val_bits	= 32, | ||||
| 	.max_register	= 0x5104, | ||||
| 	.fast_io	= true, | ||||
| }; | ||||
| 
 | ||||
| static const struct qcom_cc_desc mmcc_msm8226_desc = { | ||||
| 	.config = &mmcc_msm8226_regmap_config, | ||||
| 	.clks = mmcc_msm8226_clocks, | ||||
| 	.num_clks = ARRAY_SIZE(mmcc_msm8226_clocks), | ||||
| 	.resets = mmcc_msm8226_resets, | ||||
| 	.num_resets = ARRAY_SIZE(mmcc_msm8226_resets), | ||||
| 	.gdscs = mmcc_msm8226_gdscs, | ||||
| 	.num_gdscs = ARRAY_SIZE(mmcc_msm8226_gdscs), | ||||
| }; | ||||
| 
 | ||||
| static struct clk_regmap *mmcc_msm8974_clocks[] = { | ||||
| 	[MMSS_AHB_CLK_SRC] = &mmss_ahb_clk_src.clkr, | ||||
| 	[MMSS_AXI_CLK_SRC] = &mmss_axi_clk_src.clkr, | ||||
| @ -2569,23 +2744,44 @@ static const struct qcom_cc_desc mmcc_msm8974_desc = { | ||||
| }; | ||||
| 
 | ||||
| static const struct of_device_id mmcc_msm8974_match_table[] = { | ||||
| 	{ .compatible = "qcom,mmcc-msm8974" }, | ||||
| 	{ .compatible = "qcom,mmcc-msm8226", .data = &mmcc_msm8226_desc }, | ||||
| 	{ .compatible = "qcom,mmcc-msm8974", .data = &mmcc_msm8974_desc }, | ||||
| 	{ } | ||||
| }; | ||||
| MODULE_DEVICE_TABLE(of, mmcc_msm8974_match_table); | ||||
| 
 | ||||
| static void msm8226_clock_override(void) | ||||
| { | ||||
| 	mmss_axi_clk_src.freq_tbl = ftbl_mmss_axi_clk_msm8226; | ||||
| 	vfe0_clk_src.freq_tbl = ftbl_camss_vfe_vfe0_clk_msm8226; | ||||
| 	mdp_clk_src.freq_tbl = ftbl_mdss_mdp_clk_msm8226; | ||||
| 	vcodec0_clk_src.freq_tbl = ftbl_venus0_vcodec0_clk_msm8226; | ||||
| 	mclk0_clk_src.freq_tbl = ftbl_camss_mclk0_3_clk_msm8226; | ||||
| 	mclk1_clk_src.freq_tbl = ftbl_camss_mclk0_3_clk_msm8226; | ||||
| 	cpp_clk_src.freq_tbl = ftbl_camss_vfe_cpp_clk_msm8226; | ||||
| } | ||||
| 
 | ||||
| static int mmcc_msm8974_probe(struct platform_device *pdev) | ||||
| { | ||||
| 	struct regmap *regmap; | ||||
| 	const struct qcom_cc_desc *desc; | ||||
| 
 | ||||
| 	regmap = qcom_cc_map(pdev, &mmcc_msm8974_desc); | ||||
| 	desc = of_device_get_match_data(&pdev->dev); | ||||
| 	if (!desc) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	regmap = qcom_cc_map(pdev, desc); | ||||
| 	if (IS_ERR(regmap)) | ||||
| 		return PTR_ERR(regmap); | ||||
| 
 | ||||
| 	clk_pll_configure_sr_hpm_lp(&mmpll1, regmap, &mmpll1_config, true); | ||||
| 	clk_pll_configure_sr_hpm_lp(&mmpll3, regmap, &mmpll3_config, false); | ||||
| 	if (desc == &mmcc_msm8974_desc) { | ||||
| 		clk_pll_configure_sr_hpm_lp(&mmpll1, regmap, &mmpll1_config, true); | ||||
| 		clk_pll_configure_sr_hpm_lp(&mmpll3, regmap, &mmpll3_config, false); | ||||
| 	} else { | ||||
| 		msm8226_clock_override(); | ||||
| 	} | ||||
| 
 | ||||
| 	return qcom_cc_really_probe(pdev, &mmcc_msm8974_desc, regmap); | ||||
| 	return qcom_cc_really_probe(pdev, desc, regmap); | ||||
| } | ||||
| 
 | ||||
| static struct platform_driver mmcc_msm8974_driver = { | ||||
|  | ||||
| @ -99,8 +99,8 @@ static struct clk_branch video_cc_vcodec0_core_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "video_cc_vcodec0_core_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &video_cc_venus_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&video_cc_venus_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
| @ -143,8 +143,8 @@ static struct clk_branch video_cc_venus_ctl_core_clk = { | ||||
| 		.enable_mask = BIT(0), | ||||
| 		.hw.init = &(struct clk_init_data){ | ||||
| 			.name = "video_cc_venus_ctl_core_clk", | ||||
| 			.parent_data = &(const struct clk_parent_data){ | ||||
| 				.hw = &video_cc_venus_clk_src.clkr.hw, | ||||
| 			.parent_hws = (const struct clk_hw*[]){ | ||||
| 				&video_cc_venus_clk_src.clkr.hw, | ||||
| 			}, | ||||
| 			.num_parents = 1, | ||||
| 			.flags = CLK_SET_RATE_PARENT, | ||||
|  | ||||
| @ -24,6 +24,7 @@ struct clk_hw *uniphier_clk_register_fixed_rate(struct device *dev, | ||||
| 
 | ||||
| 	init.name = name; | ||||
| 	init.ops = &clk_fixed_rate_ops; | ||||
| 	init.flags = 0; | ||||
| 	init.parent_names = NULL; | ||||
| 	init.num_parents = 0; | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										34
									
								
								include/dt-bindings/clock/qcom,dispcc-qcm2290.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								include/dt-bindings/clock/qcom,dispcc-qcm2290.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | ||||
| /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ | ||||
| /*
 | ||||
|  * Copyright (c) 2019, The Linux Foundation. All rights reserved. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _DT_BINDINGS_CLK_QCOM_DISP_CC_QCM2290_H | ||||
| #define _DT_BINDINGS_CLK_QCOM_DISP_CC_QCM2290_H | ||||
| 
 | ||||
| /* DISP_CC clocks */ | ||||
| #define DISP_CC_PLL0				0 | ||||
| #define DISP_CC_MDSS_AHB_CLK			1 | ||||
| #define DISP_CC_MDSS_AHB_CLK_SRC		2 | ||||
| #define DISP_CC_MDSS_BYTE0_CLK			3 | ||||
| #define DISP_CC_MDSS_BYTE0_CLK_SRC		4 | ||||
| #define DISP_CC_MDSS_BYTE0_DIV_CLK_SRC		5 | ||||
| #define DISP_CC_MDSS_BYTE0_INTF_CLK		6 | ||||
| #define DISP_CC_MDSS_ESC0_CLK			7 | ||||
| #define DISP_CC_MDSS_ESC0_CLK_SRC		8 | ||||
| #define DISP_CC_MDSS_MDP_CLK			9 | ||||
| #define DISP_CC_MDSS_MDP_CLK_SRC		10 | ||||
| #define DISP_CC_MDSS_MDP_LUT_CLK		11 | ||||
| #define DISP_CC_MDSS_NON_GDSC_AHB_CLK		12 | ||||
| #define DISP_CC_MDSS_PCLK0_CLK			13 | ||||
| #define DISP_CC_MDSS_PCLK0_CLK_SRC		14 | ||||
| #define DISP_CC_MDSS_VSYNC_CLK			15 | ||||
| #define DISP_CC_MDSS_VSYNC_CLK_SRC		16 | ||||
| #define DISP_CC_SLEEP_CLK			17 | ||||
| #define DISP_CC_SLEEP_CLK_SRC			18 | ||||
| #define DISP_CC_XO_CLK				19 | ||||
| #define DISP_CC_XO_CLK_SRC			20 | ||||
| 
 | ||||
| #define MDSS_GDSC				0 | ||||
| 
 | ||||
| #endif | ||||
							
								
								
									
										41
									
								
								include/dt-bindings/clock/qcom,dispcc-sm6125.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								include/dt-bindings/clock/qcom,dispcc-sm6125.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,41 @@ | ||||
| /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ | ||||
| /*
 | ||||
|  * Copyright (c) 2021, The Linux Foundation. All rights reserved. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _DT_BINDINGS_CLK_QCOM_DISP_CC_SM6125_H | ||||
| #define _DT_BINDINGS_CLK_QCOM_DISP_CC_SM6125_H | ||||
| 
 | ||||
| #define DISP_CC_PLL0			0 | ||||
| #define DISP_CC_MDSS_AHB_CLK		1 | ||||
| #define DISP_CC_MDSS_AHB_CLK_SRC	2 | ||||
| #define DISP_CC_MDSS_BYTE0_CLK		3 | ||||
| #define DISP_CC_MDSS_BYTE0_CLK_SRC	4 | ||||
| #define DISP_CC_MDSS_BYTE0_INTF_CLK	5 | ||||
| #define DISP_CC_MDSS_DP_AUX_CLK		6 | ||||
| #define DISP_CC_MDSS_DP_AUX_CLK_SRC	7 | ||||
| #define DISP_CC_MDSS_DP_CRYPTO_CLK	8 | ||||
| #define DISP_CC_MDSS_DP_CRYPTO_CLK_SRC	9 | ||||
| #define DISP_CC_MDSS_DP_LINK_CLK	10 | ||||
| #define DISP_CC_MDSS_DP_LINK_CLK_SRC	11 | ||||
| #define DISP_CC_MDSS_DP_LINK_INTF_CLK	12 | ||||
| #define DISP_CC_MDSS_DP_PIXEL_CLK	13 | ||||
| #define DISP_CC_MDSS_DP_PIXEL_CLK_SRC	14 | ||||
| #define DISP_CC_MDSS_ESC0_CLK		15 | ||||
| #define DISP_CC_MDSS_ESC0_CLK_SRC	16 | ||||
| #define DISP_CC_MDSS_MDP_CLK		17 | ||||
| #define DISP_CC_MDSS_MDP_CLK_SRC	18 | ||||
| #define DISP_CC_MDSS_MDP_LUT_CLK	19 | ||||
| #define DISP_CC_MDSS_NON_GDSC_AHB_CLK	20 | ||||
| #define DISP_CC_MDSS_PCLK0_CLK		21 | ||||
| #define DISP_CC_MDSS_PCLK0_CLK_SRC	22 | ||||
| #define DISP_CC_MDSS_ROT_CLK		23 | ||||
| #define DISP_CC_MDSS_ROT_CLK_SRC	24 | ||||
| #define DISP_CC_MDSS_VSYNC_CLK		25 | ||||
| #define DISP_CC_MDSS_VSYNC_CLK_SRC	26 | ||||
| #define DISP_CC_XO_CLK			27 | ||||
| 
 | ||||
| /* DISP_CC GDSCR */ | ||||
| #define MDSS_GDSC			0 | ||||
| 
 | ||||
| #endif | ||||
							
								
								
									
										48
									
								
								include/dt-bindings/clock/qcom,dispcc-sm6350.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								include/dt-bindings/clock/qcom,dispcc-sm6350.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,48 @@ | ||||
| /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ | ||||
| /*
 | ||||
|  * Copyright (c) 2021, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2021, Konrad Dybcio <konrad.dybcio@somainline.org> | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _DT_BINDINGS_CLK_QCOM_DISP_CC_SM6350_H | ||||
| #define _DT_BINDINGS_CLK_QCOM_DISP_CC_SM6350_H | ||||
| 
 | ||||
| /* DISP_CC clocks */ | ||||
| #define DISP_CC_PLL0				0 | ||||
| #define DISP_CC_MDSS_AHB_CLK			1 | ||||
| #define DISP_CC_MDSS_AHB_CLK_SRC		2 | ||||
| #define DISP_CC_MDSS_BYTE0_CLK			3 | ||||
| #define DISP_CC_MDSS_BYTE0_CLK_SRC		4 | ||||
| #define DISP_CC_MDSS_BYTE0_DIV_CLK_SRC		5 | ||||
| #define DISP_CC_MDSS_BYTE0_INTF_CLK		6 | ||||
| #define DISP_CC_MDSS_DP_AUX_CLK			7 | ||||
| #define DISP_CC_MDSS_DP_AUX_CLK_SRC		8 | ||||
| #define DISP_CC_MDSS_DP_CRYPTO_CLK		9 | ||||
| #define DISP_CC_MDSS_DP_CRYPTO_CLK_SRC		10 | ||||
| #define DISP_CC_MDSS_DP_LINK_CLK		11 | ||||
| #define DISP_CC_MDSS_DP_LINK_CLK_SRC		12 | ||||
| #define DISP_CC_MDSS_DP_LINK_DIV_CLK_SRC	13 | ||||
| #define DISP_CC_MDSS_DP_LINK_INTF_CLK		14 | ||||
| #define DISP_CC_MDSS_DP_PIXEL_CLK		15 | ||||
| #define DISP_CC_MDSS_DP_PIXEL_CLK_SRC		16 | ||||
| #define DISP_CC_MDSS_ESC0_CLK			17 | ||||
| #define DISP_CC_MDSS_ESC0_CLK_SRC		18 | ||||
| #define DISP_CC_MDSS_MDP_CLK			19 | ||||
| #define DISP_CC_MDSS_MDP_CLK_SRC		20 | ||||
| #define DISP_CC_MDSS_MDP_LUT_CLK		21 | ||||
| #define DISP_CC_MDSS_NON_GDSC_AHB_CLK		22 | ||||
| #define DISP_CC_MDSS_PCLK0_CLK			23 | ||||
| #define DISP_CC_MDSS_PCLK0_CLK_SRC		24 | ||||
| #define DISP_CC_MDSS_ROT_CLK			25 | ||||
| #define DISP_CC_MDSS_ROT_CLK_SRC		26 | ||||
| #define DISP_CC_MDSS_RSCC_AHB_CLK		27 | ||||
| #define DISP_CC_MDSS_RSCC_VSYNC_CLK		28 | ||||
| #define DISP_CC_MDSS_VSYNC_CLK			29 | ||||
| #define DISP_CC_MDSS_VSYNC_CLK_SRC		30 | ||||
| #define DISP_CC_SLEEP_CLK			31 | ||||
| #define DISP_CC_XO_CLK				32 | ||||
| 
 | ||||
| /* GDSCs */ | ||||
| #define MDSS_GDSC				0 | ||||
| 
 | ||||
| #endif | ||||
| @ -240,7 +240,7 @@ | ||||
| #define PLL14					232 | ||||
| #define PLL14_VOTE				233 | ||||
| #define PLL18					234 | ||||
| #define CE5_SRC					235 | ||||
| #define CE5_A_CLK				235 | ||||
| #define CE5_H_CLK				236 | ||||
| #define CE5_CORE_CLK				237 | ||||
| #define CE3_SLEEP_CLK				238 | ||||
| @ -283,5 +283,8 @@ | ||||
| #define EBI2_AON_CLK				281 | ||||
| #define NSSTCM_CLK_SRC				282 | ||||
| #define NSSTCM_CLK				283 | ||||
| #define CE5_A_CLK_SRC				285 | ||||
| #define CE5_H_CLK_SRC				286 | ||||
| #define CE5_CORE_CLK_SRC			287 | ||||
| 
 | ||||
| #endif | ||||
|  | ||||
| @ -241,7 +241,12 @@ | ||||
| #define GCC_USB_PHY_CFG_AHB2PHY_BCR				28 | ||||
| 
 | ||||
| /* GCC GDSCRs */ | ||||
| #define PCIE_0_GDSC						0 | ||||
| #define PCIE_1_GDSC						1 | ||||
| #define UFS_CARD_GDSC						2 | ||||
| #define UFS_PHY_GDSC						3 | ||||
| #define USB30_PRIM_GDSC                     4 | ||||
| #define USB30_SEC_GDSC						5 | ||||
| #define EMAC_GDSC						6 | ||||
| 
 | ||||
| #endif | ||||
|  | ||||
							
								
								
									
										37
									
								
								include/dt-bindings/clock/qcom,gpucc-sm6350.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								include/dt-bindings/clock/qcom,gpucc-sm6350.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,37 @@ | ||||
| /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ | ||||
| /*
 | ||||
|  * Copyright (c) 2021, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2021, Konrad Dybcio <konrad.dybcio@somainline.org> | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _DT_BINDINGS_CLK_QCOM_GPU_CC_SM6350_H | ||||
| #define _DT_BINDINGS_CLK_QCOM_GPU_CC_SM6350_H | ||||
| 
 | ||||
| /* GPU_CC clocks */ | ||||
| #define GPU_CC_PLL0						0 | ||||
| #define GPU_CC_PLL1						1 | ||||
| #define GPU_CC_ACD_AHB_CLK					2 | ||||
| #define GPU_CC_ACD_CXO_CLK					3 | ||||
| #define GPU_CC_AHB_CLK						4 | ||||
| #define GPU_CC_CRC_AHB_CLK					5 | ||||
| #define GPU_CC_CX_GFX3D_CLK					6 | ||||
| #define GPU_CC_CX_GFX3D_SLV_CLK					7 | ||||
| #define GPU_CC_CX_GMU_CLK					8 | ||||
| #define GPU_CC_CX_SNOC_DVM_CLK					9 | ||||
| #define GPU_CC_CXO_AON_CLK					10 | ||||
| #define GPU_CC_CXO_CLK						11 | ||||
| #define GPU_CC_GMU_CLK_SRC					12 | ||||
| #define GPU_CC_GX_CXO_CLK					13 | ||||
| #define GPU_CC_GX_GFX3D_CLK					14 | ||||
| #define GPU_CC_GX_GFX3D_CLK_SRC					15 | ||||
| #define GPU_CC_GX_GMU_CLK					16 | ||||
| #define GPU_CC_GX_VSENSE_CLK					17 | ||||
| 
 | ||||
| /* CLK_HW */ | ||||
| #define GPU_CC_CRC_DIV						0 | ||||
| 
 | ||||
| /* GDSCs */ | ||||
| #define GPU_CX_GDSC						0 | ||||
| #define GPU_GX_GDSC						1 | ||||
| 
 | ||||
| #endif | ||||
| @ -165,5 +165,7 @@ | ||||
| #define RPM_SMD_PKA_A_CLK			119 | ||||
| #define RPM_SMD_CPUSS_GNOC_CLK			120 | ||||
| #define RPM_SMD_CPUSS_GNOC_A_CLK		121 | ||||
| #define RPM_SMD_MSS_CFG_AHB_CLK		122 | ||||
| #define RPM_SMD_MSS_CFG_AHB_A_CLK		123 | ||||
| 
 | ||||
| #endif | ||||
|  | ||||
| @ -163,5 +163,10 @@ | ||||
| #define NSS_CAL_PRBS_RST_N_RESET			154 | ||||
| #define NSS_LCKDT_RST_N_RESET				155 | ||||
| #define NSS_SRDS_N_RESET				156 | ||||
| #define CRYPTO_ENG1_RESET				157 | ||||
| #define CRYPTO_ENG2_RESET				158 | ||||
| #define CRYPTO_ENG3_RESET				159 | ||||
| #define CRYPTO_ENG4_RESET				160 | ||||
| #define CRYPTO_AHB_RESET				161 | ||||
| 
 | ||||
| #endif | ||||
|  | ||||
| @ -986,6 +986,17 @@ static inline void clk_bulk_disable_unprepare(int num_clks, | ||||
| 	clk_bulk_unprepare(num_clks, clks); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * clk_drop_range - Reset any range set on that clock | ||||
|  * @clk: clock source | ||||
|  * | ||||
|  * Returns success (0) or negative errno. | ||||
|  */ | ||||
| static inline int clk_drop_range(struct clk *clk) | ||||
| { | ||||
| 	return clk_set_rate_range(clk, 0, ULONG_MAX); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * clk_get_optional - lookup and obtain a reference to an optional clock | ||||
|  *		      producer. | ||||
|  | ||||
| @ -40,6 +40,7 @@ struct qcom_smd_rpm; | ||||
| #define QCOM_SMD_RPM_AGGR_CLK	0x72676761 | ||||
| #define QCOM_SMD_RPM_HWKM_CLK	0x6d6b7768 | ||||
| #define QCOM_SMD_RPM_PKA_CLK	0x616b70 | ||||
| #define QCOM_SMD_RPM_MCFG_CLK	0x6766636d | ||||
| 
 | ||||
| int qcom_rpm_smd_write(struct qcom_smd_rpm *rpm, | ||||
| 		       int state, | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user